James Ennis pushed to branch jennis/doc_fixes_in_context 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
- 
c0631d48
by Valentin David at 2019-01-16T10:33:52Z
- 
b608ac86
by James Ennis at 2019-01-16T11:05:44Z
- 
97a3beb6
by James Ennis at 2019-01-16T11:05:44Z
5 changed files:
- .gitlab-ci.yml
- buildstream/_context.py
- buildstream/_gitsourcebase.py
- conftest.py
- tests/sources/git.py
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:
 | 
| ... | ... | @@ -317,11 +317,18 @@ class Context(): | 
| 317 | 317 |      # invoked with as opposed to a junctioned subproject.
 | 
| 318 | 318 |      #
 | 
| 319 | 319 |      # Returns:
 | 
| 320 | -    #    (list): The list of projects
 | |
| 320 | +    #    (Project): The Project object
 | |
| 321 | 321 |      #
 | 
| 322 | 322 |      def get_toplevel_project(self):
 | 
| 323 | 323 |          return self._projects[0]
 | 
| 324 | 324 |  | 
| 325 | +    # get_workspaces():
 | |
| 326 | +    #
 | |
| 327 | +    # Return a Workspaces object containing a list of workspaces.
 | |
| 328 | +    #
 | |
| 329 | +    # Returns:
 | |
| 330 | +    #    (Workspaces): The Workspaces object
 | |
| 331 | +    #
 | |
| 325 | 332 |      def get_workspaces(self):
 | 
| 326 | 333 |          return self._workspaces
 | 
| 327 | 334 |  | 
| ... | ... | @@ -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):
 | 
