[Notes] [Git][BuildStream/buildstream][tristan/fix-spurious-errors] 5 commits: buildelement.py: Only display one activity message (#507)



Title: GitLab

Tristan Van Berkom pushed to branch tristan/fix-spurious-errors at BuildStream / buildstream

Commits:

4 changed files:

Changes:

  • NEWS
    1 1
     =================
    
    2
    -buildstream 1.3.1
    
    2
    +buildstream 1.1.5
    
    3 3
     =================
    
    4 4
     
    
    5 5
       o Add a `--tar` option to `bst checkout` which allows a tarball to be
    
    ... ... @@ -9,6 +9,8 @@ buildstream 1.3.1
    9 9
         and the preferred mirror to fetch from can be defined in the command
    
    10 10
         line or user config.
    
    11 11
     
    
    12
    +  o Added new `remote` source plugin for downloading file blobs
    
    13
    +
    
    12 14
     =================
    
    13 15
     buildstream 1.1.4
    
    14 16
     =================
    

  • buildstream/buildelement.py
    1 1
     #
    
    2 2
     #  Copyright (C) 2016 Codethink Limited
    
    3
    +#  Copyright (C) 2018 Bloomberg Finance LP
    
    3 4
     #
    
    4 5
     #  This program is free software; you can redistribute it and/or
    
    5 6
     #  modify it under the terms of the GNU Lesser General Public
    
    ... ... @@ -204,8 +205,9 @@ class BuildElement(Element):
    204 205
         def prepare(self, sandbox):
    
    205 206
             commands = self.__commands['configure-commands']
    
    206 207
             if commands:
    
    207
    -            for cmd in commands:
    
    208
    -                self.__run_command(sandbox, cmd, 'configure-commands')
    
    208
    +            with self.timed_activity("Running configure-commands"):
    
    209
    +                for cmd in commands:
    
    210
    +                    self.__run_command(sandbox, cmd, 'configure-commands')
    
    209 211
     
    
    210 212
         def generate_script(self):
    
    211 213
             script = ""
    
    ... ... @@ -231,13 +233,12 @@ class BuildElement(Element):
    231 233
             return commands
    
    232 234
     
    
    233 235
         def __run_command(self, sandbox, cmd, cmd_name):
    
    234
    -        with self.timed_activity("Running {}".format(cmd_name)):
    
    235
    -            self.status("Running {}".format(cmd_name), detail=cmd)
    
    236
    -
    
    237
    -            # Note the -e switch to 'sh' means to exit with an error
    
    238
    -            # if any untested command fails.
    
    239
    -            #
    
    240
    -            exitcode = sandbox.run(['sh', '-c', '-e', cmd + '\n'],
    
    241
    -                                   SandboxFlags.ROOT_READ_ONLY)
    
    242
    -            if exitcode != 0:
    
    243
    -                raise ElementError("Command '{}' failed with exitcode {}".format(cmd, exitcode))
    236
    +        self.status("Running {}".format(cmd_name), detail=cmd)
    
    237
    +
    
    238
    +        # Note the -e switch to 'sh' means to exit with an error
    
    239
    +        # if any untested command fails.
    
    240
    +        #
    
    241
    +        exitcode = sandbox.run(['sh', '-c', '-e', cmd + '\n'],
    
    242
    +                               SandboxFlags.ROOT_READ_ONLY)
    
    243
    +        if exitcode != 0:
    
    244
    +            raise ElementError("Command '{}' failed with exitcode {}".format(cmd, exitcode))

  • buildstream/plugins/sources/git.py
    ... ... @@ -71,6 +71,7 @@ git - stage files from a git repository
    71 71
     """
    
    72 72
     
    
    73 73
     import os
    
    74
    +import errno
    
    74 75
     import re
    
    75 76
     import shutil
    
    76 77
     from collections import Mapping
    
    ... ... @@ -119,11 +120,21 @@ class GitMirror(SourceFetcher):
    119 120
                                      fail="Failed to clone git repository {}".format(url),
    
    120 121
                                      fail_temporarily=True)
    
    121 122
     
    
    123
    +                # Attempt atomic rename into destination, this will fail if
    
    124
    +                # another process beat us to the punch
    
    122 125
                     try:
    
    123
    -                    shutil.move(tmpdir, self.mirror)
    
    124
    -                except (shutil.Error, OSError) as e:
    
    125
    -                    raise SourceError("{}: Failed to move cloned git repository {} from '{}' to '{}'"
    
    126
    -                                      .format(self.source, url, tmpdir, self.mirror)) from e
    
    126
    +                    os.rename(tmpdir, self.mirror)
    
    127
    +                except OSError as e:
    
    128
    +
    
    129
    +                    # When renaming and the destination repo already exists, os.rename()
    
    130
    +                    # will fail with ENOTEMPTY, since an empty directory will be silently
    
    131
    +                    # replaced
    
    132
    +                    if e.errno == errno.ENOTEMPTY:
    
    133
    +                        self.source.status("{}: Discarding duplicate clone of {}"
    
    134
    +                                           .format(self.source, url))
    
    135
    +                    else:
    
    136
    +                        raise SourceError("{}: Failed to move cloned git repository {} from '{}' to '{}': {}"
    
    137
    +                                          .format(self.source, url, tmpdir, self.mirror, e)) from e
    
    127 138
     
    
    128 139
         def _fetch(self, alias_override=None):
    
    129 140
             url = self.source.translate_url(self.url, alias_override=alias_override)
    

  • buildstream/source.py
    ... ... @@ -148,7 +148,7 @@ class SourceFetcher():
    148 148
         places (e.g. a git source with submodules) has a consistent interface for
    
    149 149
         fetching and substituting aliases.
    
    150 150
     
    
    151
    -    *Since: 1.4*
    
    151
    +    *Since: 1.2*
    
    152 152
         """
    
    153 153
         def __init__(self):
    
    154 154
             self.__alias = None
    
    ... ... @@ -382,7 +382,7 @@ class Source(Plugin):
    382 382
             Args:
    
    383 383
                url (str): The url used to download
    
    384 384
     
    
    385
    -        *Since: 1.4*
    
    385
    +        *Since: 1.2*
    
    386 386
             """
    
    387 387
             alias, _ = url.split(utils._ALIAS_SEPARATOR, 1)
    
    388 388
             self.__expected_alias = alias
    
    ... ... @@ -398,7 +398,7 @@ class Source(Plugin):
    398 398
                list: A list of SourceFetchers. If SourceFetchers are not supported,
    
    399 399
                      this will be an empty list.
    
    400 400
     
    
    401
    -        *Since: 1.4*
    
    401
    +        *Since: 1.2*
    
    402 402
             """
    
    403 403
     
    
    404 404
             return []
    
    ... ... @@ -425,7 +425,7 @@ class Source(Plugin):
    425 425
     
    
    426 426
             Args:
    
    427 427
                url (str): A url, which may be using an alias
    
    428
    -           alias_override (str): Optionally, an URI to override the alias with. (*Since: 1.4*)
    
    428
    +           alias_override (str): Optionally, an URI to override the alias with. (*Since: 1.2*)
    
    429 429
     
    
    430 430
             Returns:
    
    431 431
                str: The fully qualified url, with aliases resolved
    



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