diff options
author | Valentin David <valentin.david@codethink.co.uk> | 2019-01-15 14:01:53 +0100 |
---|---|---|
committer | Valentin David <valentin.david@codethink.co.uk> | 2019-01-16 11:04:57 +0100 |
commit | a405e08f7c3fb41a16dfd70fc1630069221aa453 (patch) | |
tree | 0b16dbd2584d57381be581ac6a72981dbfa5695a /tests/sources/git.py | |
parent | 0eac40085e5c8b8807002759f597f8e19a9745b2 (diff) | |
download | buildstream-a405e08f7c3fb41a16dfd70fc1630069221aa453.tar.gz |
buildstream/_gitsourcebase.py: Fix case where HEAD is tagged
`git rev-list --boundary HEAD..HEAD` does not return any boundary.
So in this case we need to manually tag the HEAD as a boundary.
Diffstat (limited to 'tests/sources/git.py')
-rw-r--r-- | tests/sources/git.py | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/sources/git.py b/tests/sources/git.py index dc089b5ce..e0560fe5d 100644 --- a/tests/sources/git.py +++ b/tests/sources/git.py @@ -885,6 +885,117 @@ 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')) +@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): project = str(datafiles) |