summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin David <valentin.david@codethink.co.uk>2019-01-15 13:20:08 +0100
committerValentin David <valentin.david@codethink.co.uk>2019-01-16 11:04:57 +0100
commit0eac40085e5c8b8807002759f597f8e19a9745b2 (patch)
tree8f30eeff081b09bbe852dff1a432d4ccddd2aab3
parentecae4d73661d09b249d7ba374fc8722813a13682 (diff)
downloadbuildstream-0eac40085e5c8b8807002759f597f8e19a9745b2.tar.gz
buildstream/_gitsourcebase.py: Reduce git history for git describe.
Found during #833. `git rev-list --boundary tag..HEAD` unfortunately gives boundaries that are deeper than should when there is a merge commit between `tag` and `HEAD`. The common ancestory of the two parents of the merge is a boundary instead of the parent of the branch that is not traversed. `--ancestry-path` fixes this issue by restricting `git` traversing those branches.
-rw-r--r--buildstream/_gitsourcebase.py3
-rw-r--r--tests/sources/git.py78
2 files changed, 80 insertions, 1 deletions
diff --git a/buildstream/_gitsourcebase.py b/buildstream/_gitsourcebase.py
index 31a1cf66b..a71f70bdc 100644
--- a/buildstream/_gitsourcebase.py
+++ b/buildstream/_gitsourcebase.py
@@ -297,7 +297,8 @@ class GitMirror(SourceFetcher):
for _, commit_ref, _ in self.tags:
_, out = self.source.check_output([self.source.host_git, 'rev-list',
- '--boundary', '{}..{}'.format(commit_ref, self.ref)],
+ '--ancestry-path', '--boundary',
+ '{}..{}'.format(commit_ref, self.ref)],
fail="Failed to get git history {}..{} in directory: {}"
.format(commit_ref, self.ref, fullpath),
fail_temporarily=True,
diff --git a/tests/sources/git.py b/tests/sources/git.py
index f9aa62ba4..dc089b5ce 100644
--- a/tests/sources/git.py
+++ b/tests/sources/git.py
@@ -885,6 +885,84 @@ def test_git_describe(cli, tmpdir, datafiles, ref_storage, tag_type):
@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):
+ project = str(datafiles)
+
+ project_config = _yaml.load(os.path.join(project, 'project.conf'))
+ project_config['ref-storage'] = 'project.refs'
+ _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))
+ repo.create(repofiles)
+
+ file1 = os.path.join(str(tmpdir), 'file1')
+ with open(file1, 'w') as f:
+ f.write('test\n')
+ repo.add_file(file1)
+ repo.branch('branch')
+ repo.checkout('master')
+
+ file2 = os.path.join(str(tmpdir), 'file2')
+ with open(file2, 'w') as f:
+ f.write('test\n')
+ repo.add_file(file2)
+
+ file3 = os.path.join(str(tmpdir), 'file3')
+ with open(file3, 'w') as f:
+ f.write('test\n')
+ branch_boundary = repo.add_file(file3)
+
+ repo.checkout('branch')
+ file4 = os.path.join(str(tmpdir), 'file4')
+ with open(file4, 'w') as f:
+ f.write('test\n')
+ tagged_ref = repo.add_file(file4)
+ repo.add_annotated_tag('tag1', 'tag1')
+
+ head = repo.merge('master')
+
+ config = repo.source_config()
+ config['track'] = head
+ 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)
+
+ result = cli.run(project=project, args=['source', 'track', 'target.bst', '--deps', 'all'])
+ result.assert_success()
+
+ 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()
+
+ describe = subprocess.check_output(['git', 'describe'],
+ cwd=checkout).decode('ascii')
+ assert describe.startswith('tag1-2-')
+
+ rev_list = subprocess.check_output(['git', 'rev-list', '--all'],
+ cwd=checkout).decode('ascii')
+
+ assert set(rev_list.splitlines()) == set([head, tagged_ref, branch_boundary])
+
+
+@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'template'))
def test_default_do_not_track_tags(cli, tmpdir, datafiles):
project = str(datafiles)