[Notes] [Git][BuildStream/buildstream][chandan/junction-dependency-format] 10 commits: _frontend: Allow printing dependencies using `bst show`



Title: GitLab

Chandan Singh pushed to branch chandan/junction-dependency-format at BuildStream / buildstream

Commits:

30 changed files:

Changes:

  • .gitlab-ci.yml
    ... ... @@ -53,26 +53,20 @@ tests-fedora-28:
    53 53
       image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:28-master-46405991
    
    54 54
       <<: *tests
    
    55 55
     
    
    56
    -tests-ubuntu-18.04:
    
    57
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-ubuntu:18.04-master-46405991
    
    56
    +tests-fedora-29:
    
    57
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
    
    58 58
       <<: *tests
    
    59 59
     
    
    60
    -tests-python-3.7-stretch:
    
    61
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-python:3.7-stretch-master-46405991
    
    60
    +tests-ubuntu-18.04:
    
    61
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-ubuntu:18.04-master-46405991
    
    62 62
       <<: *tests
    
    63 63
     
    
    64
    -  variables:
    
    65
    -    # Note that we explicitly specify TOXENV in this case because this
    
    66
    -    # image has both 3.6 and 3.7 versions. python3.6 cannot be removed because
    
    67
    -    # some of our base dependencies declare it as their runtime dependency.
    
    68
    -    TOXENV: py37
    
    69
    -
    
    70 64
     tests-centos-7.6:
    
    71 65
       <<: *tests
    
    72 66
       image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-centos:7.6.1810-master-46405991
    
    73 67
     
    
    74
    -overnight-fedora-28-aarch64:
    
    75
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:aarch64-28-master-46405991
    
    68
    +overnight-fedora-29-aarch64:
    
    69
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:aarch64-29-master-47052095
    
    76 70
       tags:
    
    77 71
         - aarch64
    
    78 72
       <<: *tests
    
    ... ... @@ -91,7 +85,7 @@ overnight-fedora-28-aarch64:
    91 85
     tests-unix:
    
    92 86
       # Use fedora here, to a) run a test on fedora and b) ensure that we
    
    93 87
       # can get rid of ostree - this is not possible with debian-8
    
    94
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:28-master-46405991
    
    88
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
    
    95 89
       <<: *tests
    
    96 90
       variables:
    
    97 91
         BST_FORCE_BACKEND: "unix"
    
    ... ... @@ -109,7 +103,7 @@ tests-unix:
    109 103
     
    
    110 104
     tests-fedora-missing-deps:
    
    111 105
       # Ensure that tests behave nicely while missing bwrap and ostree
    
    112
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:28-master-46405991
    
    106
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
    
    113 107
       <<: *tests
    
    114 108
     
    
    115 109
       script:
    
    ... ... @@ -128,7 +122,7 @@ tests-fedora-update-deps:
    128 122
       # Check if the tests pass after updating requirements to their latest
    
    129 123
       # allowed version.
    
    130 124
       allow_failure: true
    
    131
    -  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:28-master-46405991
    
    125
    +  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
    
    132 126
       <<: *tests
    
    133 127
     
    
    134 128
       script:
    
    ... ... @@ -289,6 +283,7 @@ coverage:
    289 283
       dependencies:
    
    290 284
       - tests-debian-9
    
    291 285
       - tests-fedora-28
    
    286
    +  - tests-fedora-29
    
    292 287
       - tests-fedora-missing-deps
    
    293 288
       - tests-ubuntu-18.04
    
    294 289
       - tests-unix
    

  • NEWS
    ... ... @@ -70,6 +70,9 @@ buildstream 1.3.1
    70 70
         to avoid having to specify the dependency type for every entry in
    
    71 71
         'depends'.
    
    72 72
     
    
    73
    +  o Elements may now specify cross-junction dependencies as simple strings
    
    74
    +    using the format '{junction-name}:{element-name}'.
    
    75
    +
    
    73 76
       o Source plugins may now request access access to previous during track and
    
    74 77
         fetch by setting `BST_REQUIRES_PREVIOUS_SOURCES_TRACK` and/or
    
    75 78
         `BST_REQUIRES_PREVIOUS_SOURCES_FETCH` attributes.
    

  • buildstream/_frontend/cli.py
    ... ... @@ -440,6 +440,9 @@ def show(app, elements, deps, except_, order, format_):
    440 440
             %{public}         Public domain data
    
    441 441
             %{workspaced}     If the element is workspaced
    
    442 442
             %{workspace-dirs} A list of workspace directories
    
    443
    +        %{deps}           A list of all dependencies
    
    444
    +        %{build-deps}     A list of build dependencies
    
    445
    +        %{runtime-deps}   A list of runtime dependencies
    
    443 446
     
    
    444 447
         The value of the %{symbol} without the leading '%' character is understood
    
    445 448
         as a pythonic formatting string, so python formatting features apply,
    

  • buildstream/_frontend/widget.py
    ... ... @@ -27,7 +27,7 @@ from ruamel import yaml
    27 27
     import click
    
    28 28
     
    
    29 29
     from . import Profile
    
    30
    -from .. import Element, Consistency
    
    30
    +from .. import Element, Consistency, Scope
    
    31 31
     from .. import _yaml
    
    32 32
     from .. import __version__ as bst_version
    
    33 33
     from .._exceptions import ImplError
    
    ... ... @@ -435,6 +435,27 @@ class LogLine(Widget):
    435 435
                         line = p.fmt_subst(
    
    436 436
                             line, 'workspace-dirs', '')
    
    437 437
     
    
    438
    +            # Dependencies
    
    439
    +            if "%{deps" in format_:
    
    440
    +                deps = [e.name for e in element.dependencies(Scope.ALL, recurse=False)]
    
    441
    +                line = p.fmt_subst(
    
    442
    +                    line, 'deps',
    
    443
    +                    yaml.safe_dump(deps, default_style=None).rstrip('\n'))
    
    444
    +
    
    445
    +            # Build Dependencies
    
    446
    +            if "%{build-deps" in format_:
    
    447
    +                build_deps = [e.name for e in element.dependencies(Scope.BUILD, recurse=False)]
    
    448
    +                line = p.fmt_subst(
    
    449
    +                    line, 'build-deps',
    
    450
    +                    yaml.safe_dump(build_deps, default_style=False).rstrip('\n'))
    
    451
    +
    
    452
    +            # Runtime Dependencies
    
    453
    +            if "%{runtime-deps" in format_:
    
    454
    +                runtime_deps = [e.name for e in element.dependencies(Scope.RUN, recurse=False)]
    
    455
    +                line = p.fmt_subst(
    
    456
    +                    line, 'runtime-deps',
    
    457
    +                    yaml.safe_dump(runtime_deps, default_style=False).rstrip('\n'))
    
    458
    +
    
    438 459
                 report += line + '\n'
    
    439 460
     
    
    440 461
             return report.rstrip('\n')
    

  • buildstream/_loader/types.py
    ... ... @@ -17,6 +17,8 @@
    17 17
     #  Authors:
    
    18 18
     #        Tristan Van Berkom <tristan vanberkom codethink co uk>
    
    19 19
     
    
    20
    +from .._exceptions import LoadError, LoadErrorReason
    
    21
    +
    
    20 22
     
    
    21 23
     # Symbol():
    
    22 24
     #
    
    ... ... @@ -56,8 +58,22 @@ class Symbol():
    56 58
     #                             dependency was declared
    
    57 59
     #
    
    58 60
     class Dependency():
    
    59
    -    def __init__(self, name,
    
    61
    +    def __init__(self, filename,
    
    60 62
                      dep_type=None, junction=None, provenance=None):
    
    63
    +        # Attempt to split name if no junction was specified explicitly
    
    64
    +        if not junction:
    
    65
    +            junction_path = filename.rsplit(":", 1)
    
    66
    +            name = junction_path[-1]
    
    67
    +            junction = None if len(junction_path) == 1 else junction_path[-2]
    
    68
    +        else:
    
    69
    +            name = filename
    
    70
    +
    
    71
    +        # Name of the element should not contain any `:` characters at this stage
    
    72
    +        if ':' in name:
    
    73
    +            raise LoadError(LoadErrorReason.INVALID_DATA,
    
    74
    +                            "Element {} contains `:` in its name. "
    
    75
    +                            "Recursive lookups for cross-junction elements is not allowed.".format(filename))
    
    76
    +
    
    61 77
             self.name = name
    
    62 78
             self.dep_type = dep_type
    
    63 79
             self.junction = junction
    

  • buildstream/_versions.py
    ... ... @@ -23,7 +23,7 @@
    23 23
     # This version is bumped whenever enhancements are made
    
    24 24
     # to the `project.conf` format or the core element format.
    
    25 25
     #
    
    26
    -BST_FORMAT_VERSION = 21
    
    26
    +BST_FORMAT_VERSION = 22
    
    27 27
     
    
    28 28
     
    
    29 29
     # The base BuildStream artifact version
    

  • doc/source/format_declaring.rst
    ... ... @@ -401,6 +401,40 @@ Attributes:
    401 401
          The ``junction`` attribute is available since :ref:`format version 1 <project_format_version>`
    
    402 402
     
    
    403 403
     
    
    404
    +Cross-junction dependencies
    
    405
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    406
    +As mentioned above, cross-junction dependencies can be specified using the
    
    407
    +``junction`` attribute. They can also be expressed as simple strings as a
    
    408
    +convenience shorthand. You can refer to cross-junction elements using the
    
    409
    +syntax ``{junction-name}:{element-name}``.
    
    410
    +
    
    411
    +For example, the following is logically same as the example above:
    
    412
    +
    
    413
    +.. code:: yaml
    
    414
    +
    
    415
    +   build-depends:
    
    416
    +     - baseproject.bst:foo.bst
    
    417
    +
    
    418
    +Similarly, you can also refer to cross-junction elements via the ``filename``
    
    419
    +attribute, like so:
    
    420
    +
    
    421
    +.. code:: yaml
    
    422
    +
    
    423
    +   depends:
    
    424
    +     - filename: baseproject.bst:foo.bst
    
    425
    +       type: build
    
    426
    +
    
    427
    +.. note::
    
    428
    +
    
    429
    +   Recursive lookups are not allowed using this syntax. If a filename
    
    430
    +   contains more than one ``:`` (colon) character, BuildStream will raise
    
    431
    +   an error.
    
    432
    +
    
    433
    +.. note::
    
    434
    +
    
    435
    +   This shorthand is available since :ref:`format version 22 <project_format_version>`
    
    436
    +
    
    437
    +
    
    404 438
     .. _format_dependencies_types:
    
    405 439
     
    
    406 440
     Dependency types
    

  • man/bst-artifact-checkout.1
    1
    -.TH "BST ARTIFACT CHECKOUT" "1" "24-Jan-2019" "" "bst artifact checkout Manual"
    
    1
    +.TH "BST ARTIFACT CHECKOUT" "1" "12-Feb-2019" "" "bst artifact checkout Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-artifact\-checkout \- Checkout contents of an artifact
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-artifact-log.1
    1
    -.TH "BST ARTIFACT LOG" "1" "24-Jan-2019" "" "bst artifact log Manual"
    
    1
    +.TH "BST ARTIFACT LOG" "1" "12-Feb-2019" "" "bst artifact log Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-artifact\-log \- Show logs of an artifact
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-artifact-pull.1
    1
    -.TH "BST ARTIFACT PULL" "1" "24-Jan-2019" "" "bst artifact pull Manual"
    
    1
    +.TH "BST ARTIFACT PULL" "1" "12-Feb-2019" "" "bst artifact pull Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-artifact\-pull \- Pull a built artifact
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-artifact-push.1
    1
    -.TH "BST ARTIFACT PUSH" "1" "24-Jan-2019" "" "bst artifact push Manual"
    
    1
    +.TH "BST ARTIFACT PUSH" "1" "12-Feb-2019" "" "bst artifact push Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-artifact\-push \- Push a built artifact
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-artifact-server.1
    1
    -.TH "BST-ARTIFACT-SERVER" "1" "24-Jan-2019" "" "bst-artifact-server Manual"
    
    1
    +.TH "BST-ARTIFACT-SERVER" "1" "12-Feb-2019" "" "bst-artifact-server Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst-artifact-server \- CAS Artifact Server
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-artifact.1
    1
    -.TH "BST ARTIFACT" "1" "24-Jan-2019" "" "bst artifact Manual"
    
    1
    +.TH "BST ARTIFACT" "1" "12-Feb-2019" "" "bst artifact Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-artifact \- Manipulate cached artifacts
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-build.1
    1
    -.TH "BST BUILD" "1" "24-Jan-2019" "" "bst build Manual"
    
    1
    +.TH "BST BUILD" "1" "12-Feb-2019" "" "bst build Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-build \- Build elements in a pipeline
    
    4 4
     .SH SYNOPSIS
    
    ... ... @@ -32,3 +32,6 @@ Allow tracking to cross junction boundaries
    32 32
     .TP
    
    33 33
     \fB\-\-track\-save\fP
    
    34 34
     Deprecated: This is ignored
    
    35
    +.TP
    
    36
    +\fB\-r,\fP \-\-remote TEXT
    
    37
    +The URL of the remote cache (defaults to the first configured cache)

  • man/bst-help.1
    1
    -.TH "BST HELP" "1" "24-Jan-2019" "" "bst help Manual"
    
    1
    +.TH "BST HELP" "1" "12-Feb-2019" "" "bst help Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-help \- Print usage information
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-init.1
    1
    -.TH "BST INIT" "1" "24-Jan-2019" "" "bst init Manual"
    
    1
    +.TH "BST INIT" "1" "12-Feb-2019" "" "bst init Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-init \- Initialize a new BuildStream project
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-shell.1
    1
    -.TH "BST SHELL" "1" "24-Jan-2019" "" "bst shell Manual"
    
    1
    +.TH "BST SHELL" "1" "12-Feb-2019" "" "bst shell Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-shell \- Shell into an element's sandbox environment
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-show.1
    1
    -.TH "BST SHOW" "1" "24-Jan-2019" "" "bst show Manual"
    
    1
    +.TH "BST SHOW" "1" "12-Feb-2019" "" "bst show Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-show \- Show elements in the pipeline
    
    4 4
     .SH SYNOPSIS
    
    ... ... @@ -43,6 +43,9 @@ the following symbols can be used in the format string:
    43 43
         %{public}         Public domain data
    
    44 44
         %{workspaced}     If the element is workspaced
    
    45 45
         %{workspace-dirs} A list of workspace directories
    
    46
    +    %{deps}           A list of all dependencies
    
    47
    +    %{build-deps}     A list of build dependencies
    
    48
    +    %{runtime-deps}   A list of runtime dependencies
    
    46 49
     .PP
    
    47 50
     The value of the %{symbol} without the leading '%' character is understood
    
    48 51
     as a pythonic formatting string, so python formatting features apply,
    

  • man/bst-source-checkout.1
    1
    -.TH "BST SOURCE CHECKOUT" "1" "24-Jan-2019" "" "bst source checkout Manual"
    
    1
    +.TH "BST SOURCE CHECKOUT" "1" "12-Feb-2019" "" "bst source checkout Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-source\-checkout \- Checkout sources for an element
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-source-fetch.1
    1
    -.TH "BST SOURCE FETCH" "1" "24-Jan-2019" "" "bst source fetch Manual"
    
    1
    +.TH "BST SOURCE FETCH" "1" "12-Feb-2019" "" "bst source fetch Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-source\-fetch \- Fetch sources in a pipeline
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-source-track.1
    1
    -.TH "BST SOURCE TRACK" "1" "24-Jan-2019" "" "bst source track Manual"
    
    1
    +.TH "BST SOURCE TRACK" "1" "12-Feb-2019" "" "bst source track Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-source\-track \- Track new source references
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-source.1
    1
    -.TH "BST SOURCE" "1" "24-Jan-2019" "" "bst source Manual"
    
    1
    +.TH "BST SOURCE" "1" "12-Feb-2019" "" "bst source Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-source \- Manipulate sources for an element
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-workspace-close.1
    1
    -.TH "BST WORKSPACE CLOSE" "1" "24-Jan-2019" "" "bst workspace close Manual"
    
    1
    +.TH "BST WORKSPACE CLOSE" "1" "12-Feb-2019" "" "bst workspace close Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-workspace\-close \- Close workspaces
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-workspace-list.1
    1
    -.TH "BST WORKSPACE LIST" "1" "24-Jan-2019" "" "bst workspace list Manual"
    
    1
    +.TH "BST WORKSPACE LIST" "1" "12-Feb-2019" "" "bst workspace list Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-workspace\-list \- List open workspaces
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-workspace-open.1
    1
    -.TH "BST WORKSPACE OPEN" "1" "24-Jan-2019" "" "bst workspace open Manual"
    
    1
    +.TH "BST WORKSPACE OPEN" "1" "12-Feb-2019" "" "bst workspace open Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-workspace\-open \- Open a new workspace
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-workspace-reset.1
    1
    -.TH "BST WORKSPACE RESET" "1" "24-Jan-2019" "" "bst workspace reset Manual"
    
    1
    +.TH "BST WORKSPACE RESET" "1" "12-Feb-2019" "" "bst workspace reset Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-workspace\-reset \- Reset a workspace to its original state
    
    4 4
     .SH SYNOPSIS
    

  • man/bst-workspace.1
    1
    -.TH "BST WORKSPACE" "1" "24-Jan-2019" "" "bst workspace Manual"
    
    1
    +.TH "BST WORKSPACE" "1" "12-Feb-2019" "" "bst workspace Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst\-workspace \- Manipulate developer workspaces
    
    4 4
     .SH SYNOPSIS
    

  • man/bst.1
    1
    -.TH "BST" "1" "24-Jan-2019" "" "bst Manual"
    
    1
    +.TH "BST" "1" "12-Feb-2019" "" "bst Manual"
    
    2 2
     .SH NAME
    
    3 3
     bst \- Build and manipulate BuildStream projects...
    
    4 4
     .SH SYNOPSIS
    

  • tests/frontend/buildcheckout.py
    ... ... @@ -709,3 +709,114 @@ def test_build_checkout_cross_junction(datafiles, cli, tmpdir):
    709 709
     
    
    710 710
         filename = os.path.join(checkout, 'etc', 'animal.conf')
    
    711 711
         assert os.path.exists(filename)
    
    712
    +
    
    713
    +
    
    714
    +@pytest.mark.datafiles(DATA_DIR)
    
    715
    +def test_build_junction_short_notation(cli, tmpdir, datafiles):
    
    716
    +    project = os.path.join(datafiles.dirname, datafiles.basename)
    
    717
    +    subproject_path = os.path.join(project, 'files', 'sub-project')
    
    718
    +    junction_path = os.path.join(project, 'elements', 'junction.bst')
    
    719
    +    element_path = os.path.join(project, 'elements', 'junction-dep.bst')
    
    720
    +    workspace = os.path.join(cli.directory, 'workspace')
    
    721
    +    checkout = os.path.join(cli.directory, 'checkout')
    
    722
    +
    
    723
    +    # Create a repo to hold the subproject and generate a junction element for it
    
    724
    +    ref = generate_junction(tmpdir, subproject_path, junction_path)
    
    725
    +
    
    726
    +    # Create a stack element to depend on a cross junction element, using
    
    727
    +    # colon (:) as the separator
    
    728
    +    element = {
    
    729
    +        'kind': 'stack',
    
    730
    +        'depends': ['junction.bst:import-etc.bst']
    
    731
    +    }
    
    732
    +    _yaml.dump(element, element_path)
    
    733
    +
    
    734
    +    # Now try to build it, this should automatically result in fetching
    
    735
    +    # the junction itself at load time.
    
    736
    +    result = cli.run(project=project, args=['build', 'junction-dep.bst'])
    
    737
    +    result.assert_success()
    
    738
    +
    
    739
    +    # Assert that it's cached now
    
    740
    +    assert cli.get_element_state(project, 'junction-dep.bst') == 'cached'
    
    741
    +
    
    742
    +    # Now check it out
    
    743
    +    result = cli.run(project=project, args=[
    
    744
    +        'artifact', 'checkout', 'junction-dep.bst', '--directory', checkout
    
    745
    +    ])
    
    746
    +    result.assert_success()
    
    747
    +
    
    748
    +    # Assert the content of /etc/animal.conf
    
    749
    +    filename = os.path.join(checkout, 'etc', 'animal.conf')
    
    750
    +    assert os.path.exists(filename)
    
    751
    +    with open(filename, 'r') as f:
    
    752
    +        contents = f.read()
    
    753
    +    assert contents == 'animal=Pony\n'
    
    754
    +
    
    755
    +
    
    756
    +@pytest.mark.datafiles(DATA_DIR)
    
    757
    +def test_build_junction_short_notation_filename(cli, tmpdir, datafiles):
    
    758
    +    project = os.path.join(datafiles.dirname, datafiles.basename)
    
    759
    +    subproject_path = os.path.join(project, 'files', 'sub-project')
    
    760
    +    junction_path = os.path.join(project, 'elements', 'junction.bst')
    
    761
    +    element_path = os.path.join(project, 'elements', 'junction-dep.bst')
    
    762
    +    checkout = os.path.join(cli.directory, 'checkout')
    
    763
    +
    
    764
    +    # Create a repo to hold the subproject and generate a junction element for it
    
    765
    +    ref = generate_junction(tmpdir, subproject_path, junction_path)
    
    766
    +
    
    767
    +    # Create a stack element to depend on a cross junction element, using
    
    768
    +    # colon (:) as the separator
    
    769
    +    element = {
    
    770
    +        'kind': 'stack',
    
    771
    +        'depends': [{'filename': 'junction.bst:import-etc.bst'}]
    
    772
    +    }
    
    773
    +    _yaml.dump(element, element_path)
    
    774
    +
    
    775
    +    # Now try to build it, this should automatically result in fetching
    
    776
    +    # the junction itself at load time.
    
    777
    +    result = cli.run(project=project, args=['build', 'junction-dep.bst'])
    
    778
    +    result.assert_success()
    
    779
    +
    
    780
    +    # Assert that it's cached now
    
    781
    +    assert cli.get_element_state(project, 'junction-dep.bst') == 'cached'
    
    782
    +
    
    783
    +    # Now check it out
    
    784
    +    result = cli.run(project=project, args=[
    
    785
    +        'artifact', 'checkout', 'junction-dep.bst', '--directory', checkout
    
    786
    +    ])
    
    787
    +    result.assert_success()
    
    788
    +
    
    789
    +    # Assert the content of /etc/animal.conf
    
    790
    +    filename = os.path.join(checkout, 'etc', 'animal.conf')
    
    791
    +    assert os.path.exists(filename)
    
    792
    +    with open(filename, 'r') as f:
    
    793
    +        contents = f.read()
    
    794
    +    assert contents == 'animal=Pony\n'
    
    795
    +
    
    796
    +
    
    797
    +@pytest.mark.datafiles(DATA_DIR)
    
    798
    +def test_build_junction_short_notation_no_recurse(cli, tmpdir, datafiles):
    
    799
    +    project = os.path.join(datafiles.dirname, datafiles.basename)
    
    800
    +    subproject_path = os.path.join(project, 'files', 'sub-project')
    
    801
    +    junction_path = os.path.join(project, 'elements', 'junction.bst')
    
    802
    +    element_path = os.path.join(project, 'elements', 'junction-dep.bst')
    
    803
    +    checkout = os.path.join(cli.directory, 'checkout')
    
    804
    +
    
    805
    +    # Create a repo to hold the subproject and generate a junction element for it
    
    806
    +    ref = generate_junction(tmpdir, subproject_path, junction_path)
    
    807
    +
    
    808
    +    # Create a stack element to depend on a cross junction element, using
    
    809
    +    # colon (:) as the separator
    
    810
    +    element = {
    
    811
    +        'kind': 'stack',
    
    812
    +        'depends': [{
    
    813
    +            'filename': 'junction.bst:import-etc.bst',
    
    814
    +            'junction': 'junction.bst',
    
    815
    +        }]
    
    816
    +    }
    
    817
    +    _yaml.dump(element, element_path)
    
    818
    +
    
    819
    +    # Now try to build it, this should fail as recursive lookups for
    
    820
    +    # cross-junction elements is not allowed.
    
    821
    +    result = cli.run(project=project, args=['build', 'junction-dep.bst'])
    
    822
    +    result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA)

  • tests/frontend/show.py
    ... ... @@ -400,3 +400,28 @@ def test_exceed_max_recursion_depth(cli, tmpdir, dependency_depth):
    400 400
             assert result.exit_code == -1
    
    401 401
     
    
    402 402
         shutil.rmtree(project_path)
    
    403
    +
    
    404
    +
    
    405
    +###############################################################
    
    406
    +#                   Testing format symbols                    #
    
    407
    +###############################################################
    
    408
    +@pytest.mark.datafiles(os.path.join(DATA_DIR, 'project'))
    
    409
    +@pytest.mark.parametrize("dep_kind, expected_deps", [
    
    410
    +    ('%{deps}', '[import-dev.bst, import-bin.bst]'),
    
    411
    +    ('%{build-deps}', '[import-dev.bst]'),
    
    412
    +    ('%{runtime-deps}', '[import-bin.bst]')
    
    413
    +])
    
    414
    +def test_format_deps(cli, datafiles, dep_kind, expected_deps):
    
    415
    +    project = os.path.join(datafiles.dirname, datafiles.basename)
    
    416
    +    target = 'checkout-deps.bst'
    
    417
    +    result = cli.run(project=project, silent=True, args=[
    
    418
    +        'show',
    
    419
    +        '--deps', 'none',
    
    420
    +        '--format', '%{name}: ' + dep_kind,
    
    421
    +        target])
    
    422
    +    result.assert_success()
    
    423
    +
    
    424
    +    expected = '{name}: {deps}'.format(name=target, deps=expected_deps)
    
    425
    +    if result.output.strip() != expected:
    
    426
    +        raise AssertionError("Expected output:\n{}\nInstead received output:\n{}"
    
    427
    +                             .format(expected, result.output))



  • [Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]