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.
kas/repos.py | 28 +++++++++++++++++++++-------
tests/test_refspec.py | 24 ++++++++++++++++++++++++
tests/test_refspec/test3.yml | 13 +++++++++++++
3 files changed, 58 insertions(+), 7 deletions(-)
create mode 100644 tests/test_refspec/test3.yml
diff --git a/kas/repos.py b/kas/repos.py
index edd46ee..1eb2e5c 100644
--- a/kas/repos.py
+++ b/kas/repos.py
@@ -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',
diff --git a/tests/test_refspec.py b/tests/test_refspec.py
index e8495d9..edb798e 100644
--- a/tests/test_refspec.py
+++ b/tests/test_refspec.py
@@ -63,3 +63,27 @@ def test_refspec_switch(changedir, tmpdir):
fail=False, liveupdate=False)
assert rc == 0
assert output.strip() == '907816a5c4094b59a36aec12226e71c461c05b77'
+
+
+def test_refspec_absolute(changedir, tmpdir):
+ """
+ Test that the local git clone works when a absolute refspec
+ is givvn.
+ """
+ tdir = str(tmpdir.mkdir('test_refspec_absolute'))
+ shutil.rmtree(tdir, ignore_errors=True)
+ shutil.copytree('tests/test_refspec', tdir)
+ os.chdir(tdir)
+
+ kas.kas(['shell', 'test3.yml', '-c', 'true'])
+ (rc, output) = run_cmd(['git', 'symbolic-ref', '-q', 'HEAD'],
+ cwd='kas_abs', fail=False, liveupdate=False)
+ assert rc != 0
+ assert output.strip() == ''
+ (rc, output_kas_abs) = run_cmd(['git', 'rev-parse', 'HEAD'],
+ cwd='kas_abs', fail=False, liveupdate=False)
+ assert rc == 0
+ (rc, output_kas_rel) = run_cmd(['git', 'rev-parse', 'HEAD'],
+ cwd='kas_rel', fail=False, liveupdate=False)
+ assert rc == 0
+ assert output_kas_abs.strip() == output_kas_rel.strip()
diff --git a/tests/test_refspec/test3.yml b/tests/test_refspec/test3.yml
new file mode 100644
index 0000000..2557cfe
--- /dev/null
+++ b/tests/test_refspec/test3.yml
@@ -0,0 +1,13 @@
+header:
+ version: 8
+
+repos:
+ this:
+
+ kas_abs:
+ url:
https://github.com/siemens/kas.git
+ refspec: refs/heads/master
+
+ kas_rel:
+ url:
https://github.com/siemens/kas.git
+ refspec: master
--
2.24.3 (Apple Git-128)