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', + '+' + 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] 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