[Notes] [Git][BuildStream/buildstream][jonathan/workspace-fragment-guess-element] WIP: make buildstream guess at the element if not specified



Title: GitLab

Jonathan Maw pushed to branch jonathan/workspace-fragment-guess-element at BuildStream / buildstream

Commits:

3 changed files:

Changes:

  • buildstream/_context.py
    ... ... @@ -48,7 +48,7 @@ from .plugin import _plugin_lookup
    48 48
     #
    
    49 49
     class Context():
    
    50 50
     
    
    51
    -    def __init__(self):
    
    51
    +    def __init__(self, workspace_locals=None):
    
    52 52
     
    
    53 53
             # Filename indicating which configuration file was used, or None for the defaults
    
    54 54
             self.config_origin = None
    
    ... ... @@ -118,7 +118,7 @@ class Context():
    118 118
             self._projects = []
    
    119 119
             self._project_overrides = {}
    
    120 120
             self._workspaces = None
    
    121
    -        self._workspace_locals = WorkspaceLocals()
    
    121
    +        self._workspace_locals = workspace_locals or WorkspaceLocals()
    
    122 122
             self._log_handle = None
    
    123 123
             self._log_filename = None
    
    124 124
             self.config_cache_quota = 'infinity'
    

  • buildstream/_frontend/app.py
    ... ... @@ -39,6 +39,7 @@ from .._stream import Stream
    39 39
     from .._versions import BST_FORMAT_VERSION
    
    40 40
     from .. import _yaml
    
    41 41
     from .._scheduler import ElementJob
    
    42
    +from .._workspaces import WorkspaceLocals
    
    42 43
     
    
    43 44
     # Import frontend assets
    
    44 45
     from . import Profile, LogLine, Status
    
    ... ... @@ -79,6 +80,7 @@ class App():
    79 80
             self._fail_messages = {}           # Failure messages by unique plugin id
    
    80 81
             self._interactive_failures = None  # Whether to handle failures interactively
    
    81 82
             self._started = False              # Whether a session has started
    
    83
    +        self._workspace_locals = WorkspaceLocals()  # A collection of workspace local data
    
    82 84
     
    
    83 85
             # UI Colors Profiles
    
    84 86
             self._content_profile = Profile(fg='yellow')
    
    ... ... @@ -164,7 +166,7 @@ class App():
    164 166
             # Load the Context
    
    165 167
             #
    
    166 168
             try:
    
    167
    -            self.context = Context()
    
    169
    +            self.context = Context(self._workspace_locals)
    
    168 170
                 self.context.load(config)
    
    169 171
             except BstError as e:
    
    170 172
                 self._error_exit(e, "Error loading user configuration")
    
    ... ... @@ -400,6 +402,21 @@ class App():
    400 402
             if self.stream:
    
    401 403
                 self.stream.cleanup()
    
    402 404
     
    
    405
    +    # guess_element()
    
    406
    +    #
    
    407
    +    # Attempts to interpret which element the user intended to run commands on
    
    408
    +    #
    
    409
    +    # Returns:
    
    410
    +    #    (str) The name of the element, or an empty string
    
    411
    +    def guess_element(self):
    
    412
    +        directory = self._main_options['directory']
    
    413
    +        local = self._workspace_locals.get(directory)
    
    414
    +        if local.has_projects():
    
    415
    +            return local.get_default_element()
    
    416
    +        else:
    
    417
    +            return ""
    
    418
    +
    
    419
    +
    
    403 420
         ############################################################
    
    404 421
         #                   Abstract Class Methods                 #
    
    405 422
         ############################################################
    

  • buildstream/_frontend/cli.py
    ... ... @@ -310,6 +310,12 @@ def build(app, elements, all_, track_, track_save, track_all, track_except, trac
    310 310
         if track_save:
    
    311 311
             click.echo("WARNING: --track-save is deprecated, saving is now unconditional", err=True)
    
    312 312
     
    
    313
    +    if not all_ and not elements:
    
    314
    +        # Attempt to divine the element from the workspace you're in
    
    315
    +        guessed_target = app.guess_element()
    
    316
    +        if guessed_target:
    
    317
    +            elements = (guessed_target,)
    
    318
    +
    
    313 319
         if track_all:
    
    314 320
             track_ = elements
    
    315 321
     
    
    ... ... @@ -364,6 +370,12 @@ def fetch(app, elements, deps, track_, except_, track_cross_junctions):
    364 370
                        "Since tracking modifies the build plan, all elements will be tracked.", err=True)
    
    365 371
             deps = PipelineSelection.ALL
    
    366 372
     
    
    373
    +    if not elements:
    
    374
    +        # Attempt to divine the element from the workspace you're in
    
    375
    +        guessed_target = app.guess_element()
    
    376
    +        if guessed_target:
    
    377
    +            elements = (guessed_target,)
    
    378
    +
    
    367 379
         with app.initialized(session_name="Fetch"):
    
    368 380
             app.stream.fetch(elements,
    
    369 381
                              selection=deps,
    
    ... ... @@ -400,6 +412,12 @@ def track(app, elements, deps, except_, cross_junctions):
    400 412
             none:  No dependencies, just the specified elements
    
    401 413
             all:   All dependencies of all specified elements
    
    402 414
         """
    
    415
    +    if not elements:
    
    416
    +        # Attempt to divine the element from the workspace you're in
    
    417
    +        guessed_target = app.guess_element()
    
    418
    +        if guessed_target:
    
    419
    +            elements = (guessed_target,)
    
    420
    +
    
    403 421
         with app.initialized(session_name="Track"):
    
    404 422
             # Substitute 'none' for 'redirect' so that element redirections
    
    405 423
             # will be done
    
    ... ... @@ -436,6 +454,12 @@ def pull(app, elements, deps, remote):
    436 454
             none:  No dependencies, just the element itself
    
    437 455
             all:   All dependencies
    
    438 456
         """
    
    457
    +    if not elements:
    
    458
    +        # Attempt to divine the element from the workspace you're in
    
    459
    +        guessed_target = app.guess_element()
    
    460
    +        if guessed_target:
    
    461
    +            elements = (guessed_target,)
    
    462
    +
    
    439 463
         with app.initialized(session_name="Pull"):
    
    440 464
             app.stream.pull(elements, selection=deps, remote=remote)
    
    441 465
     
    
    ... ... @@ -464,6 +488,11 @@ def push(app, elements, deps, remote):
    464 488
             none:  No dependencies, just the element itself
    
    465 489
             all:   All dependencies
    
    466 490
         """
    
    491
    +    if not elements:
    
    492
    +        # Attempt to divine the element from the workspace you're in
    
    493
    +        guessed_target = app.guess_element()
    
    494
    +        if guessed_target:
    
    495
    +            elements = (guessed_target,)
    
    467 496
         with app.initialized(session_name="Push"):
    
    468 497
             app.stream.push(elements, selection=deps, remote=remote)
    
    469 498
     
    
    ... ... @@ -534,6 +563,12 @@ def show(app, elements, deps, except_, order, format_):
    534 563
             bst show target.bst --format \\
    
    535 564
                 $'---------- %{name} ----------\\n%{vars}'
    
    536 565
         """
    
    566
    +    if not elements:
    
    567
    +        # Attempt to divine the element from the workspace you're in
    
    568
    +        guessed_target = app.guess_element()
    
    569
    +        if guessed_target:
    
    570
    +            elements = (guessed_target,)
    
    571
    +
    
    537 572
         with app.initialized():
    
    538 573
             dependencies = app.stream.load_selection(elements,
    
    539 574
                                                      selection=deps,
    
    ... ... @@ -563,7 +598,7 @@ def show(app, elements, deps, except_, order, format_):
    563 598
                   help="Mount a file or directory into the sandbox")
    
    564 599
     @click.option('--isolate', is_flag=True, default=False,
    
    565 600
                   help='Create an isolated build sandbox')
    
    566
    -@click.argument('element',
    
    601
    +@click.argument('element', required=False,
    
    567 602
                     type=click.Path(readable=False))
    
    568 603
     @click.argument('command', type=click.STRING, nargs=-1)
    
    569 604
     @click.pass_obj
    
    ... ... @@ -594,6 +629,14 @@ def shell(app, element, sysroot, mount, isolate, build_, command):
    594 629
             scope = Scope.RUN
    
    595 630
     
    
    596 631
         with app.initialized():
    
    632
    +        if not element:
    
    633
    +            # Attempt to divine the element from the workspace you're in
    
    634
    +            guessed_target = app.guess_element()
    
    635
    +            if guessed_target:
    
    636
    +                element = guessed_target
    
    637
    +            else:
    
    638
    +                raise AppError('Error: Missing argument "ELEMENT".')
    
    639
    +
    
    597 640
             dependencies = app.stream.load_selection((element,), selection=PipelineSelection.NONE)
    
    598 641
             element = dependencies[0]
    
    599 642
             prompt = app.shell_prompt(element)
    



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