Valentin David pushed to branch valentindavid/git-reduced-history at BuildStream / buildstream
Commits:
-
4b544555
by Chandan Singh at 2019-01-15T21:28:40Z
-
80fe0d9a
by Javier Jardón at 2019-01-15T22:48:22Z
-
c91784ab
by Chandan Singh at 2019-01-15T22:49:01Z
-
ecae4d73
by Javier Jardón at 2019-01-15T23:23:41Z
-
0eac4008
by Valentin David at 2019-01-16T10:04:57Z
-
a405e08f
by Valentin David at 2019-01-16T10:04:57Z
4 changed files:
Changes:
| ... | ... | @@ -60,6 +60,16 @@ tests-ubuntu-18.04: |
| 60 | 60 |
image: buildstream/testsuite-ubuntu:18.04-5da27168-32c47d1c
|
| 61 | 61 |
<<: *tests
|
| 62 | 62 |
|
| 63 |
+tests-python-3.7-stretch:
|
|
| 64 |
+ image: buildstream/testsuite-python:3.7-stretch-a60f0c39
|
|
| 65 |
+ <<: *tests
|
|
| 66 |
+ |
|
| 67 |
+ variables:
|
|
| 68 |
+ # Note that we explicitly specify TOXENV in this case because this
|
|
| 69 |
+ # image has both 3.6 and 3.7 versions. python3.6 cannot be removed because
|
|
| 70 |
+ # some of our base dependencies declare it as their runtime dependency.
|
|
| 71 |
+ TOXENV: py37
|
|
| 72 |
+ |
|
| 63 | 73 |
overnight-fedora-28-aarch64:
|
| 64 | 74 |
image: buildstream/testsuite-fedora:aarch64-28-5da27168-32c47d1c
|
| 65 | 75 |
tags:
|
| ... | ... | @@ -296,18 +296,24 @@ class GitMirror(SourceFetcher): |
| 296 | 296 |
shallow = set()
|
| 297 | 297 |
for _, commit_ref, _ in self.tags:
|
| 298 | 298 |
|
| 299 |
- _, out = self.source.check_output([self.source.host_git, 'rev-list',
|
|
| 300 |
- '--boundary', '{}..{}'.format(commit_ref, self.ref)],
|
|
| 301 |
- fail="Failed to get git history {}..{} in directory: {}"
|
|
| 302 |
- .format(commit_ref, self.ref, fullpath),
|
|
| 303 |
- fail_temporarily=True,
|
|
| 304 |
- cwd=self.mirror)
|
|
| 305 |
- for line in out.splitlines():
|
|
| 306 |
- rev = line.lstrip('-')
|
|
| 307 |
- if line[0] == '-':
|
|
| 308 |
- shallow.add(rev)
|
|
| 309 |
- else:
|
|
| 310 |
- included.add(rev)
|
|
| 299 |
+ if commit_ref == self.ref:
|
|
| 300 |
+ # rev-list does not work in case of same rev
|
|
| 301 |
+ shallow.add(self.ref)
|
|
| 302 |
+ else:
|
|
| 303 |
+ _, out = self.source.check_output([self.source.host_git, 'rev-list',
|
|
| 304 |
+ '--ancestry-path', '--boundary',
|
|
| 305 |
+ '{}..{}'.format(commit_ref, self.ref)],
|
|
| 306 |
+ fail="Failed to get git history {}..{} in directory: {}"
|
|
| 307 |
+ .format(commit_ref, self.ref, fullpath),
|
|
| 308 |
+ fail_temporarily=True,
|
|
| 309 |
+ cwd=self.mirror)
|
|
| 310 |
+ self.source.warn("refs {}..{}: {}".format(commit_ref, self.ref, out.splitlines()))
|
|
| 311 |
+ for line in out.splitlines():
|
|
| 312 |
+ rev = line.lstrip('-')
|
|
| 313 |
+ if line[0] == '-':
|
|
| 314 |
+ shallow.add(rev)
|
|
| 315 |
+ else:
|
|
| 316 |
+ included.add(rev)
|
|
| 311 | 317 |
|
| 312 | 318 |
shallow -= included
|
| 313 | 319 |
included |= shallow
|
| ... | ... | @@ -32,7 +32,7 @@ def pytest_addoption(parser): |
| 32 | 32 |
|
| 33 | 33 |
|
| 34 | 34 |
def pytest_runtest_setup(item):
|
| 35 |
- if item.get_marker('integration') and not item.config.getvalue('integration'):
|
|
| 35 |
+ if item.get_closest_marker('integration') and not item.config.getvalue('integration'):
|
|
| 36 | 36 |
pytest.skip('skipping integration test')
|
| 37 | 37 |
|
| 38 | 38 |
|
| ... | ... | @@ -883,6 +883,195 @@ def test_git_describe(cli, tmpdir, datafiles, ref_storage, tag_type): |
| 883 | 883 |
assert p.returncode != 0
|
| 884 | 884 |
|
| 885 | 885 |
|
| 886 |
+@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
|
|
| 887 |
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'template'))
|
|
| 888 |
+@pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')])
|
|
| 889 |
+@pytest.mark.parametrize("tag_type", [('annotated'), ('lightweight')])
|
|
| 890 |
+def test_git_describe_head_is_tagged(cli, tmpdir, datafiles, ref_storage, tag_type):
|
|
| 891 |
+ project = str(datafiles)
|
|
| 892 |
+ |
|
| 893 |
+ project_config = _yaml.load(os.path.join(project, 'project.conf'))
|
|
| 894 |
+ project_config['ref-storage'] = ref_storage
|
|
| 895 |
+ _yaml.dump(_yaml.node_sanitize(project_config), os.path.join(project, 'project.conf'))
|
|
| 896 |
+ |
|
| 897 |
+ repofiles = os.path.join(str(tmpdir), 'repofiles')
|
|
| 898 |
+ os.makedirs(repofiles, exist_ok=True)
|
|
| 899 |
+ file0 = os.path.join(repofiles, 'file0')
|
|
| 900 |
+ with open(file0, 'w') as f:
|
|
| 901 |
+ f.write('test\n')
|
|
| 902 |
+ |
|
| 903 |
+ repo = create_repo('git', str(tmpdir))
|
|
| 904 |
+ |
|
| 905 |
+ def tag(name):
|
|
| 906 |
+ if tag_type == 'annotated':
|
|
| 907 |
+ repo.add_annotated_tag(name, name)
|
|
| 908 |
+ else:
|
|
| 909 |
+ repo.add_tag(name)
|
|
| 910 |
+ |
|
| 911 |
+ ref = repo.create(repofiles)
|
|
| 912 |
+ tag('uselesstag')
|
|
| 913 |
+ |
|
| 914 |
+ file1 = os.path.join(str(tmpdir), 'file1')
|
|
| 915 |
+ with open(file1, 'w') as f:
|
|
| 916 |
+ f.write('test\n')
|
|
| 917 |
+ repo.add_file(file1)
|
|
| 918 |
+ |
|
| 919 |
+ file2 = os.path.join(str(tmpdir), 'file2')
|
|
| 920 |
+ with open(file2, 'w') as f:
|
|
| 921 |
+ f.write('test\n')
|
|
| 922 |
+ repo.branch('branch2')
|
|
| 923 |
+ repo.add_file(file2)
|
|
| 924 |
+ |
|
| 925 |
+ repo.checkout('master')
|
|
| 926 |
+ file3 = os.path.join(str(tmpdir), 'file3')
|
|
| 927 |
+ with open(file3, 'w') as f:
|
|
| 928 |
+ f.write('test\n')
|
|
| 929 |
+ repo.add_file(file3)
|
|
| 930 |
+ |
|
| 931 |
+ tagged_ref = repo.merge('branch2')
|
|
| 932 |
+ tag('tag')
|
|
| 933 |
+ |
|
| 934 |
+ config = repo.source_config()
|
|
| 935 |
+ config['track'] = repo.latest_commit()
|
|
| 936 |
+ config['track-tags'] = True
|
|
| 937 |
+ |
|
| 938 |
+ # Write out our test target
|
|
| 939 |
+ element = {
|
|
| 940 |
+ 'kind': 'import',
|
|
| 941 |
+ 'sources': [
|
|
| 942 |
+ config
|
|
| 943 |
+ ],
|
|
| 944 |
+ }
|
|
| 945 |
+ element_path = os.path.join(project, 'target.bst')
|
|
| 946 |
+ _yaml.dump(element, element_path)
|
|
| 947 |
+ |
|
| 948 |
+ if ref_storage == 'inline':
|
|
| 949 |
+ result = cli.run(project=project, args=['source', 'track', 'target.bst'])
|
|
| 950 |
+ result.assert_success()
|
|
| 951 |
+ else:
|
|
| 952 |
+ result = cli.run(project=project, args=['source', 'track', 'target.bst', '--deps', 'all'])
|
|
| 953 |
+ result.assert_success()
|
|
| 954 |
+ |
|
| 955 |
+ if ref_storage == 'inline':
|
|
| 956 |
+ element = _yaml.load(element_path)
|
|
| 957 |
+ tags = _yaml.node_sanitize(element['sources'][0]['tags'])
|
|
| 958 |
+ assert len(tags) == 1
|
|
| 959 |
+ for tag in tags:
|
|
| 960 |
+ assert 'tag' in tag
|
|
| 961 |
+ assert 'commit' in tag
|
|
| 962 |
+ assert 'annotated' in tag
|
|
| 963 |
+ assert tag['annotated'] == (tag_type == 'annotated')
|
|
| 964 |
+ |
|
| 965 |
+ assert set([(tag['tag'], tag['commit']) for tag in tags]) == set([('tag', repo.rev_parse('tag^{commit}'))])
|
|
| 966 |
+ |
|
| 967 |
+ checkout = os.path.join(str(tmpdir), 'checkout')
|
|
| 968 |
+ |
|
| 969 |
+ result = cli.run(project=project, args=['build', 'target.bst'])
|
|
| 970 |
+ result.assert_success()
|
|
| 971 |
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkout])
|
|
| 972 |
+ result.assert_success()
|
|
| 973 |
+ |
|
| 974 |
+ if tag_type == 'annotated':
|
|
| 975 |
+ options = []
|
|
| 976 |
+ else:
|
|
| 977 |
+ options = ['--tags']
|
|
| 978 |
+ describe = subprocess.check_output(['git', 'describe'] + options,
|
|
| 979 |
+ cwd=checkout).decode('ascii')
|
|
| 980 |
+ assert describe.startswith('tag')
|
|
| 981 |
+ |
|
| 982 |
+ tags = subprocess.check_output(['git', 'tag'],
|
|
| 983 |
+ cwd=checkout).decode('ascii')
|
|
| 984 |
+ tags = set(tags.splitlines())
|
|
| 985 |
+ assert tags == set(['tag'])
|
|
| 986 |
+ |
|
| 987 |
+ rev_list = subprocess.check_output(['git', 'rev-list', '--all'],
|
|
| 988 |
+ cwd=checkout).decode('ascii')
|
|
| 989 |
+ |
|
| 990 |
+ assert set(rev_list.splitlines()) == set([tagged_ref])
|
|
| 991 |
+ |
|
| 992 |
+ p = subprocess.run(['git', 'log', repo.rev_parse('uselesstag')],
|
|
| 993 |
+ cwd=checkout)
|
|
| 994 |
+ assert p.returncode != 0
|
|
| 995 |
+ |
|
| 996 |
+ |
|
| 997 |
+@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
|
|
| 998 |
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'template'))
|
|
| 999 |
+def test_git_describe_relevant_history(cli, tmpdir, datafiles):
|
|
| 1000 |
+ project = str(datafiles)
|
|
| 1001 |
+ |
|
| 1002 |
+ project_config = _yaml.load(os.path.join(project, 'project.conf'))
|
|
| 1003 |
+ project_config['ref-storage'] = 'project.refs'
|
|
| 1004 |
+ _yaml.dump(_yaml.node_sanitize(project_config), os.path.join(project, 'project.conf'))
|
|
| 1005 |
+ |
|
| 1006 |
+ repofiles = os.path.join(str(tmpdir), 'repofiles')
|
|
| 1007 |
+ os.makedirs(repofiles, exist_ok=True)
|
|
| 1008 |
+ file0 = os.path.join(repofiles, 'file0')
|
|
| 1009 |
+ with open(file0, 'w') as f:
|
|
| 1010 |
+ f.write('test\n')
|
|
| 1011 |
+ |
|
| 1012 |
+ repo = create_repo('git', str(tmpdir))
|
|
| 1013 |
+ repo.create(repofiles)
|
|
| 1014 |
+ |
|
| 1015 |
+ file1 = os.path.join(str(tmpdir), 'file1')
|
|
| 1016 |
+ with open(file1, 'w') as f:
|
|
| 1017 |
+ f.write('test\n')
|
|
| 1018 |
+ repo.add_file(file1)
|
|
| 1019 |
+ repo.branch('branch')
|
|
| 1020 |
+ repo.checkout('master')
|
|
| 1021 |
+ |
|
| 1022 |
+ file2 = os.path.join(str(tmpdir), 'file2')
|
|
| 1023 |
+ with open(file2, 'w') as f:
|
|
| 1024 |
+ f.write('test\n')
|
|
| 1025 |
+ repo.add_file(file2)
|
|
| 1026 |
+ |
|
| 1027 |
+ file3 = os.path.join(str(tmpdir), 'file3')
|
|
| 1028 |
+ with open(file3, 'w') as f:
|
|
| 1029 |
+ f.write('test\n')
|
|
| 1030 |
+ branch_boundary = repo.add_file(file3)
|
|
| 1031 |
+ |
|
| 1032 |
+ repo.checkout('branch')
|
|
| 1033 |
+ file4 = os.path.join(str(tmpdir), 'file4')
|
|
| 1034 |
+ with open(file4, 'w') as f:
|
|
| 1035 |
+ f.write('test\n')
|
|
| 1036 |
+ tagged_ref = repo.add_file(file4)
|
|
| 1037 |
+ repo.add_annotated_tag('tag1', 'tag1')
|
|
| 1038 |
+ |
|
| 1039 |
+ head = repo.merge('master')
|
|
| 1040 |
+ |
|
| 1041 |
+ config = repo.source_config()
|
|
| 1042 |
+ config['track'] = head
|
|
| 1043 |
+ config['track-tags'] = True
|
|
| 1044 |
+ |
|
| 1045 |
+ # Write out our test target
|
|
| 1046 |
+ element = {
|
|
| 1047 |
+ 'kind': 'import',
|
|
| 1048 |
+ 'sources': [
|
|
| 1049 |
+ config
|
|
| 1050 |
+ ],
|
|
| 1051 |
+ }
|
|
| 1052 |
+ element_path = os.path.join(project, 'target.bst')
|
|
| 1053 |
+ _yaml.dump(element, element_path)
|
|
| 1054 |
+ |
|
| 1055 |
+ result = cli.run(project=project, args=['source', 'track', 'target.bst', '--deps', 'all'])
|
|
| 1056 |
+ result.assert_success()
|
|
| 1057 |
+ |
|
| 1058 |
+ checkout = os.path.join(str(tmpdir), 'checkout')
|
|
| 1059 |
+ |
|
| 1060 |
+ result = cli.run(project=project, args=['build', 'target.bst'])
|
|
| 1061 |
+ result.assert_success()
|
|
| 1062 |
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkout])
|
|
| 1063 |
+ result.assert_success()
|
|
| 1064 |
+ |
|
| 1065 |
+ describe = subprocess.check_output(['git', 'describe'],
|
|
| 1066 |
+ cwd=checkout).decode('ascii')
|
|
| 1067 |
+ assert describe.startswith('tag1-2-')
|
|
| 1068 |
+ |
|
| 1069 |
+ rev_list = subprocess.check_output(['git', 'rev-list', '--all'],
|
|
| 1070 |
+ cwd=checkout).decode('ascii')
|
|
| 1071 |
+ |
|
| 1072 |
+ assert set(rev_list.splitlines()) == set([head, tagged_ref, branch_boundary])
|
|
| 1073 |
+ |
|
| 1074 |
+ |
|
| 886 | 1075 |
@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
|
| 887 | 1076 |
@pytest.mark.datafiles(os.path.join(DATA_DIR, 'template'))
|
| 888 | 1077 |
def test_default_do_not_track_tags(cli, tmpdir, datafiles):
|
