Loading buildstream/_gitsourcebase.py +18 −13 Original line number Diff line number Diff line Loading @@ -296,6 +296,10 @@ class GitMirror(SourceFetcher): shallow = set() for _, commit_ref, _ in self.tags: if commit_ref == self.ref: # rev-list does not work in case of same rev shallow.add(self.ref) else: _, out = self.source.check_output([self.source.host_git, 'rev-list', '--ancestry-path', '--boundary', '{}..{}'.format(commit_ref, self.ref)], Loading @@ -303,6 +307,7 @@ class GitMirror(SourceFetcher): .format(commit_ref, self.ref, fullpath), fail_temporarily=True, cwd=self.mirror) self.source.warn("refs {}..{}: {}".format(commit_ref, self.ref, out.splitlines())) for line in out.splitlines(): rev = line.lstrip('-') if line[0] == '-': Loading tests/sources/git.py +111 −0 Original line number Diff line number Diff line Loading @@ -883,6 +883,117 @@ def test_git_describe(cli, tmpdir, datafiles, ref_storage, tag_type): assert p.returncode != 0 @pytest.mark.skipif(HAVE_GIT is False, reason="git is not available") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'template')) @pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')]) @pytest.mark.parametrize("tag_type", [('annotated'), ('lightweight')]) def test_git_describe_head_is_tagged(cli, tmpdir, datafiles, ref_storage, tag_type): project = str(datafiles) project_config = _yaml.load(os.path.join(project, 'project.conf')) project_config['ref-storage'] = ref_storage _yaml.dump(_yaml.node_sanitize(project_config), os.path.join(project, 'project.conf')) repofiles = os.path.join(str(tmpdir), 'repofiles') os.makedirs(repofiles, exist_ok=True) file0 = os.path.join(repofiles, 'file0') with open(file0, 'w') as f: f.write('test\n') repo = create_repo('git', str(tmpdir)) def tag(name): if tag_type == 'annotated': repo.add_annotated_tag(name, name) else: repo.add_tag(name) ref = repo.create(repofiles) tag('uselesstag') file1 = os.path.join(str(tmpdir), 'file1') with open(file1, 'w') as f: f.write('test\n') repo.add_file(file1) file2 = os.path.join(str(tmpdir), 'file2') with open(file2, 'w') as f: f.write('test\n') repo.branch('branch2') repo.add_file(file2) repo.checkout('master') file3 = os.path.join(str(tmpdir), 'file3') with open(file3, 'w') as f: f.write('test\n') repo.add_file(file3) tagged_ref = repo.merge('branch2') tag('tag') config = repo.source_config() config['track'] = repo.latest_commit() config['track-tags'] = True # Write out our test target element = { 'kind': 'import', 'sources': [ config ], } element_path = os.path.join(project, 'target.bst') _yaml.dump(element, element_path) if ref_storage == 'inline': result = cli.run(project=project, args=['source', 'track', 'target.bst']) result.assert_success() else: result = cli.run(project=project, args=['source', 'track', 'target.bst', '--deps', 'all']) result.assert_success() if ref_storage == 'inline': element = _yaml.load(element_path) tags = _yaml.node_sanitize(element['sources'][0]['tags']) assert len(tags) == 1 for tag in tags: assert 'tag' in tag assert 'commit' in tag assert 'annotated' in tag assert tag['annotated'] == (tag_type == 'annotated') assert set([(tag['tag'], tag['commit']) for tag in tags]) == set([('tag', repo.rev_parse('tag^{commit}'))]) checkout = os.path.join(str(tmpdir), 'checkout') result = cli.run(project=project, args=['build', 'target.bst']) result.assert_success() result = cli.run(project=project, args=['checkout', 'target.bst', checkout]) result.assert_success() if tag_type == 'annotated': options = [] else: options = ['--tags'] describe = subprocess.check_output(['git', 'describe'] + options, cwd=checkout).decode('ascii') assert describe.startswith('tag') tags = subprocess.check_output(['git', 'tag'], cwd=checkout).decode('ascii') tags = set(tags.splitlines()) assert tags == set(['tag']) rev_list = subprocess.check_output(['git', 'rev-list', '--all'], cwd=checkout).decode('ascii') assert set(rev_list.splitlines()) == set([tagged_ref]) p = subprocess.run(['git', 'log', repo.rev_parse('uselesstag')], cwd=checkout) assert p.returncode != 0 @pytest.mark.skipif(HAVE_GIT is False, reason="git is not available") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'template')) def test_git_describe_relevant_history(cli, tmpdir, datafiles): Loading Loading
buildstream/_gitsourcebase.py +18 −13 Original line number Diff line number Diff line Loading @@ -296,6 +296,10 @@ class GitMirror(SourceFetcher): shallow = set() for _, commit_ref, _ in self.tags: if commit_ref == self.ref: # rev-list does not work in case of same rev shallow.add(self.ref) else: _, out = self.source.check_output([self.source.host_git, 'rev-list', '--ancestry-path', '--boundary', '{}..{}'.format(commit_ref, self.ref)], Loading @@ -303,6 +307,7 @@ class GitMirror(SourceFetcher): .format(commit_ref, self.ref, fullpath), fail_temporarily=True, cwd=self.mirror) self.source.warn("refs {}..{}: {}".format(commit_ref, self.ref, out.splitlines())) for line in out.splitlines(): rev = line.lstrip('-') if line[0] == '-': Loading
tests/sources/git.py +111 −0 Original line number Diff line number Diff line Loading @@ -883,6 +883,117 @@ def test_git_describe(cli, tmpdir, datafiles, ref_storage, tag_type): assert p.returncode != 0 @pytest.mark.skipif(HAVE_GIT is False, reason="git is not available") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'template')) @pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')]) @pytest.mark.parametrize("tag_type", [('annotated'), ('lightweight')]) def test_git_describe_head_is_tagged(cli, tmpdir, datafiles, ref_storage, tag_type): project = str(datafiles) project_config = _yaml.load(os.path.join(project, 'project.conf')) project_config['ref-storage'] = ref_storage _yaml.dump(_yaml.node_sanitize(project_config), os.path.join(project, 'project.conf')) repofiles = os.path.join(str(tmpdir), 'repofiles') os.makedirs(repofiles, exist_ok=True) file0 = os.path.join(repofiles, 'file0') with open(file0, 'w') as f: f.write('test\n') repo = create_repo('git', str(tmpdir)) def tag(name): if tag_type == 'annotated': repo.add_annotated_tag(name, name) else: repo.add_tag(name) ref = repo.create(repofiles) tag('uselesstag') file1 = os.path.join(str(tmpdir), 'file1') with open(file1, 'w') as f: f.write('test\n') repo.add_file(file1) file2 = os.path.join(str(tmpdir), 'file2') with open(file2, 'w') as f: f.write('test\n') repo.branch('branch2') repo.add_file(file2) repo.checkout('master') file3 = os.path.join(str(tmpdir), 'file3') with open(file3, 'w') as f: f.write('test\n') repo.add_file(file3) tagged_ref = repo.merge('branch2') tag('tag') config = repo.source_config() config['track'] = repo.latest_commit() config['track-tags'] = True # Write out our test target element = { 'kind': 'import', 'sources': [ config ], } element_path = os.path.join(project, 'target.bst') _yaml.dump(element, element_path) if ref_storage == 'inline': result = cli.run(project=project, args=['source', 'track', 'target.bst']) result.assert_success() else: result = cli.run(project=project, args=['source', 'track', 'target.bst', '--deps', 'all']) result.assert_success() if ref_storage == 'inline': element = _yaml.load(element_path) tags = _yaml.node_sanitize(element['sources'][0]['tags']) assert len(tags) == 1 for tag in tags: assert 'tag' in tag assert 'commit' in tag assert 'annotated' in tag assert tag['annotated'] == (tag_type == 'annotated') assert set([(tag['tag'], tag['commit']) for tag in tags]) == set([('tag', repo.rev_parse('tag^{commit}'))]) checkout = os.path.join(str(tmpdir), 'checkout') result = cli.run(project=project, args=['build', 'target.bst']) result.assert_success() result = cli.run(project=project, args=['checkout', 'target.bst', checkout]) result.assert_success() if tag_type == 'annotated': options = [] else: options = ['--tags'] describe = subprocess.check_output(['git', 'describe'] + options, cwd=checkout).decode('ascii') assert describe.startswith('tag') tags = subprocess.check_output(['git', 'tag'], cwd=checkout).decode('ascii') tags = set(tags.splitlines()) assert tags == set(['tag']) rev_list = subprocess.check_output(['git', 'rev-list', '--all'], cwd=checkout).decode('ascii') assert set(rev_list.splitlines()) == set([tagged_ref]) p = subprocess.run(['git', 'log', repo.rev_parse('uselesstag')], cwd=checkout) assert p.returncode != 0 @pytest.mark.skipif(HAVE_GIT is False, reason="git is not available") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'template')) def test_git_describe_relevant_history(cli, tmpdir, datafiles): Loading