Enable gerrit/gitlab/github refspecs

By default git only fetches references under the refs/heads/ tree,
this patch adds support to kas to enable you to specify references
outside of the ref/heads tree.  This is useful as it allows you to
use uncommitted gerrit patchsets, Gitlab merge requests or github
pull requests that live under refs/changes/, refs/merge-requests
and refs/pull as the reference for a repo allowing the use of
in development changes.  When a refsepc is defined that starts
with refs/ an additional git fetch operation is preformed on the
repo to explicitly fetch the reference given so it can be checked
out for use.

Signed-off-by: Drew Reed <drew.reed@arm.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
Drew Reed
2021-07-06 15:12:51 +02:00
committed by Jan Kiszka
parent 635b1023a1
commit 6b65de3e2f
3 changed files with 58 additions and 7 deletions

View File

@@ -179,7 +179,8 @@ class RepoImpl(Repo):
cwd=get_context().kas_work_dir)
if retc == 0:
logging.info('Repository %s cloned', self.name)
return retc
if not self.refspec.startswith('refs/'):
return retc
# Make sure the remote origin is set to the value
# in the kas file to avoid surprises
@@ -336,6 +337,10 @@ class GitRepo(RepoImpl):
Provides the git functionality for a Repo.
"""
def remove_ref_prefix(self, refspec):
ref_prefix = 'refs/'
return refspec[refspec.startswith(ref_prefix) and len(ref_prefix):]
def add_cmd(self):
return ['git', 'add', '-A']
@@ -350,29 +355,38 @@ class GitRepo(RepoImpl):
'-m', 'msg']
def contains_refspec_cmd(self):
return ['git', 'cat-file', '-t', self.refspec]
return ['git', 'cat-file', '-t', self.remove_ref_prefix(self.refspec)]
def fetch_cmd(self):
return ['git', 'fetch']
cmd = ['git', 'fetch']
if self.refspec.startswith('refs/'):
cmd.extend(['--quiet', 'origin',
'+' + self.refspec
+ ':refs/remotes/origin/'
+ self.remove_ref_prefix(self.refspec)])
return cmd
def is_dirty_cmd(self):
return ['git', 'status', '-s']
def resolve_branch_cmd(self):
return ['git', 'rev-parse', '--verify', '-q',
'origin/{refspec}'.format(refspec=self.refspec)]
'origin/{refspec}'.
format(refspec=self.remove_ref_prefix(self.refspec))]
def checkout_cmd(self, desired_ref, branch):
cmd = ['git', 'checkout', '-q', desired_ref]
cmd = ['git', 'checkout', '-q', self.remove_ref_prefix(desired_ref)]
if branch:
cmd.extend(['-B', self.refspec])
cmd.extend(['-B', self.remove_ref_prefix(self.refspec)])
if get_context().force_checkout:
cmd.append('--force')
return cmd
def prepare_patches_cmd(self):
return ['git', 'checkout', '-q', '-B',
'patched-{refspec}'.format(refspec=self.refspec)]
'patched-{refspec}'.
format(refspec=self.remove_ref_prefix(self.refspec))]
def apply_patches_file_cmd(self, path):
return ['git', 'apply', path]