Chandan Singh pushed to branch master at BuildStream / buildstream
Commits:
-
d2743c52
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
95adf09e
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
9359c067
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
796bd8c9
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
5a3a537f
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
b279c730
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
527f3b32
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
6d0c697d
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
32323695
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
c5c0654d
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
4f84e2f6
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
b4645745
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
68ec9bcf
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
1bf0a031
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
e9c6db1e
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
5a187a1e
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
b368f57f
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
b45fea19
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
3e4a6507
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
447780b0
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
247b9fa8
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
522867c8
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
31a7bce5
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
eb805c6c
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
aca9a612
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
77b1506f
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
70000b0d
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
bab617d0
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
45a1d15f
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
e9154b4d
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
7b082bb7
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
f1cfc0b7
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
7c72d25b
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
4e7408ee
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
df495d16
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
63c6e6b1
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
3394741a
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
cd20e7a1
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
5087f5c5
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
d73d965b
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
fa740402
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
ad8271f0
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
1445a901
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
19df07ea
by Tristan Maat at 2018-10-25T14:43:52Z
-
64dbe9ae
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
f6bc25dd
by Daniel Silverstone at 2018-10-25T14:43:52Z
-
1c1d14e7
by Chandan Singh at 2018-10-25T15:04:00Z
30 changed files:
- .gitignore
- .gitlab-ci.yml
- MANIFEST.in
- buildstream/_artifactcache/artifactcache.py
- buildstream/_artifactcache/cascache.py
- buildstream/_context.py
- buildstream/_frontend/app.py
- buildstream/_frontend/status.py
- buildstream/_fuse/hardlinks.py
- buildstream/_fuse/mount.py
- buildstream/_options/optionbool.py
- buildstream/_platform/darwin.py
- buildstream/_platform/linux.py
- buildstream/_scheduler/jobs/job.py
- buildstream/_scheduler/queues/pullqueue.py
- buildstream/_scheduler/queues/trackqueue.py
- buildstream/_variables.py
- buildstream/_workspaces.py
- buildstream/_yaml.py
- buildstream/_yamlcache.py
- buildstream/buildelement.py
- buildstream/element.py
- buildstream/plugin.py
- buildstream/plugins/sources/git.py
- buildstream/sandbox/_mount.py
- buildstream/sandbox/_mounter.py
- buildstream/sandbox/_sandboxbwrap.py
- buildstream/sandbox/_sandboxchroot.py
- buildstream/source.py
- buildstream/utils.py
Changes:
... | ... | @@ -34,3 +34,4 @@ doc/source/modules.rst |
34 | 34 |
doc/source/buildstream.rst
|
35 | 35 |
doc/source/buildstream.*.rst
|
36 | 36 |
doc/build/
|
37 |
+versioneer.pyc
|
1 |
-image: buildstream/testsuite-debian:9-master-114-4cab18e3
|
|
1 |
+image: buildstream/testsuite-debian:9-master-119-552f5fc6
|
|
2 | 2 |
|
3 | 3 |
cache:
|
4 | 4 |
key: "$CI_JOB_NAME-"
|
... | ... | @@ -78,7 +78,7 @@ source_dist: |
78 | 78 |
# Go back to the toplevel and collect our reports
|
79 | 79 |
- cd ../..
|
80 | 80 |
- mkdir -p coverage-linux/
|
81 |
- - cp dist/buildstream/.coverage.* coverage-linux/coverage."${CI_JOB_NAME}"
|
|
81 |
+ - cp dist/buildstream/.coverage coverage-linux/coverage."${CI_JOB_NAME}"
|
|
82 | 82 |
except:
|
83 | 83 |
- schedules
|
84 | 84 |
artifacts:
|
... | ... | @@ -86,25 +86,25 @@ source_dist: |
86 | 86 |
- coverage-linux/
|
87 | 87 |
|
88 | 88 |
tests-debian-9:
|
89 |
- image: buildstream/testsuite-debian:9-master-117-aa3a33b3
|
|
89 |
+ image: buildstream/testsuite-debian:9-master-119-552f5fc6
|
|
90 | 90 |
<<: *linux-tests
|
91 | 91 |
|
92 | 92 |
tests-fedora-27:
|
93 |
- image: buildstream/testsuite-fedora:27-master-117-aa3a33b3
|
|
93 |
+ image: buildstream/testsuite-fedora:27-master-119-552f5fc6
|
|
94 | 94 |
<<: *linux-tests
|
95 | 95 |
|
96 | 96 |
tests-fedora-28:
|
97 |
- image: buildstream/testsuite-fedora:28-master-117-aa3a33b3
|
|
97 |
+ image: buildstream/testsuite-fedora:28-master-119-552f5fc6
|
|
98 | 98 |
<<: *linux-tests
|
99 | 99 |
|
100 | 100 |
tests-ubuntu-18.04:
|
101 |
- image: buildstream/testsuite-ubuntu:18.04-master-117-aa3a33b3
|
|
101 |
+ image: buildstream/testsuite-ubuntu:18.04-master-119-552f5fc6
|
|
102 | 102 |
<<: *linux-tests
|
103 | 103 |
|
104 | 104 |
tests-unix:
|
105 | 105 |
# Use fedora here, to a) run a test on fedora and b) ensure that we
|
106 | 106 |
# can get rid of ostree - this is not possible with debian-8
|
107 |
- image: buildstream/testsuite-fedora:27-master-117-aa3a33b3
|
|
107 |
+ image: buildstream/testsuite-fedora:27-master-119-552f5fc6
|
|
108 | 108 |
stage: test
|
109 | 109 |
variables:
|
110 | 110 |
BST_FORCE_BACKEND: "unix"
|
... | ... | @@ -128,7 +128,7 @@ tests-unix: |
128 | 128 |
# Go back to the toplevel and collect our reports
|
129 | 129 |
- cd ../..
|
130 | 130 |
- mkdir -p coverage-unix/
|
131 |
- - cp dist/buildstream/.coverage.* coverage-unix/coverage.unix
|
|
131 |
+ - cp dist/buildstream/.coverage coverage-unix/coverage.unix
|
|
132 | 132 |
except:
|
133 | 133 |
- schedules
|
134 | 134 |
artifacts:
|
... | ... | @@ -8,19 +8,27 @@ include README.rst |
8 | 8 |
|
9 | 9 |
# Documentation package includes
|
10 | 10 |
include doc/Makefile
|
11 |
+include doc/badges.py
|
|
12 |
+include doc/bst2html.py
|
|
11 | 13 |
include doc/source/conf.py
|
12 |
-include doc/source/index.rst
|
|
14 |
+include doc/source/plugin.rsttemplate
|
|
15 |
+recursive-include doc/source *.rst
|
|
16 |
+recursive-include doc/source *.py
|
|
17 |
+recursive-include doc/source *.in
|
|
18 |
+recursive-include doc/source *.html
|
|
19 |
+recursive-include doc/examples *
|
|
13 | 20 |
|
14 | 21 |
# Tests
|
15 |
-recursive-include tests *.py
|
|
16 |
-recursive-include tests *.yaml
|
|
17 |
-recursive-include tests *.bst
|
|
18 |
-recursive-include tests *.conf
|
|
19 |
-recursive-include tests *.sh
|
|
20 |
-recursive-include tests *.expected
|
|
22 |
+recursive-include tests *
|
|
23 |
+include conftest.py
|
|
24 |
+include .coveragerc
|
|
25 |
+include .pylintrc
|
|
21 | 26 |
|
22 | 27 |
# Protocol Buffers
|
23 | 28 |
recursive-include buildstream/_protos *.proto
|
24 | 29 |
|
25 | 30 |
# Requirements files
|
26 | 31 |
include dev-requirements.txt
|
32 |
+ |
|
33 |
+# Versioneer
|
|
34 |
+include versioneer.py
|
... | ... | @@ -156,7 +156,7 @@ class ArtifactCache(): |
156 | 156 |
def setup_remotes(self, *, use_config=False, remote_url=None):
|
157 | 157 |
|
158 | 158 |
# Ensure we do not double-initialise since this can be expensive
|
159 |
- assert(not self._remotes_setup)
|
|
159 |
+ assert not self._remotes_setup
|
|
160 | 160 |
self._remotes_setup = True
|
161 | 161 |
|
162 | 162 |
# Initialize remote artifact caches. We allow the commandline to override
|
... | ... | @@ -252,7 +252,7 @@ class ArtifactCache(): |
252 | 252 |
# (int): The size of the cache after having cleaned up
|
253 | 253 |
#
|
254 | 254 |
def clean(self):
|
255 |
- artifacts = self.list_artifacts()
|
|
255 |
+ artifacts = self.list_artifacts() # pylint: disable=assignment-from-no-return
|
|
256 | 256 |
|
257 | 257 |
# Build a set of the cache keys which are required
|
258 | 258 |
# based on the required elements at cleanup time
|
... | ... | @@ -294,7 +294,7 @@ class ArtifactCache(): |
294 | 294 |
if key not in required_artifacts:
|
295 | 295 |
|
296 | 296 |
# Remove the actual artifact, if it's not required.
|
297 |
- size = self.remove(to_remove)
|
|
297 |
+ size = self.remove(to_remove) # pylint: disable=assignment-from-no-return
|
|
298 | 298 |
|
299 | 299 |
# Remove the size from the removed size
|
300 | 300 |
self.set_cache_size(self._cache_size - size)
|
... | ... | @@ -311,7 +311,7 @@ class ArtifactCache(): |
311 | 311 |
# (int): The size of the artifact cache.
|
312 | 312 |
#
|
313 | 313 |
def compute_cache_size(self):
|
314 |
- self._cache_size = self.calculate_cache_size()
|
|
314 |
+ self._cache_size = self.calculate_cache_size() # pylint: disable=assignment-from-no-return
|
|
315 | 315 |
|
316 | 316 |
return self._cache_size
|
317 | 317 |
|
... | ... | @@ -33,11 +33,11 @@ import grpc |
33 | 33 |
|
34 | 34 |
from .. import _yaml
|
35 | 35 |
|
36 |
+from .._protos.google.rpc import code_pb2
|
|
36 | 37 |
from .._protos.google.bytestream import bytestream_pb2, bytestream_pb2_grpc
|
37 | 38 |
from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2, remote_execution_pb2_grpc
|
38 | 39 |
from .._protos.buildstream.v2 import buildstream_pb2, buildstream_pb2_grpc
|
39 | 40 |
|
40 |
-from .._message import MessageType, Message
|
|
41 | 41 |
from .. import _signals, utils
|
42 | 42 |
from .._exceptions import ArtifactError
|
43 | 43 |
|
... | ... | @@ -81,8 +81,9 @@ class CASCache(ArtifactCache): |
81 | 81 |
################################################
|
82 | 82 |
|
83 | 83 |
def preflight(self):
|
84 |
- if (not os.path.isdir(os.path.join(self.casdir, 'refs', 'heads')) or
|
|
85 |
- not os.path.isdir(os.path.join(self.casdir, 'objects'))):
|
|
84 |
+ headdir = os.path.join(self.casdir, 'refs', 'heads')
|
|
85 |
+ objdir = os.path.join(self.casdir, 'objects')
|
|
86 |
+ if not (os.path.isdir(headdir) and os.path.isdir(objdir)):
|
|
86 | 87 |
raise ArtifactError("CAS repository check failed for '{}'"
|
87 | 88 |
.format(self.casdir))
|
88 | 89 |
|
... | ... | @@ -918,7 +919,7 @@ class CASCache(ArtifactCache): |
918 | 919 |
# Skip download, already in local cache.
|
919 | 920 |
pass
|
920 | 921 |
elif (digest.size_bytes >= remote.max_batch_total_size_bytes or
|
921 |
- not remote.batch_read_supported):
|
|
922 |
+ not remote.batch_read_supported):
|
|
922 | 923 |
# Too large for batch request, download in independent request.
|
923 | 924 |
self._ensure_blob(remote, digest)
|
924 | 925 |
in_local_cache = True
|
... | ... | @@ -958,7 +959,7 @@ class CASCache(ArtifactCache): |
958 | 959 |
batch = _CASBatchRead(remote)
|
959 | 960 |
|
960 | 961 |
while len(fetch_queue) + len(fetch_next_queue) > 0:
|
961 |
- if len(fetch_queue) == 0:
|
|
962 |
+ if not fetch_queue:
|
|
962 | 963 |
batch = self._fetch_directory_batch(remote, batch, fetch_queue, fetch_next_queue)
|
963 | 964 |
|
964 | 965 |
dir_digest = fetch_queue.pop(0)
|
... | ... | @@ -1087,6 +1088,10 @@ class _CASRemote(): |
1087 | 1088 |
self.bytestream = None
|
1088 | 1089 |
self.cas = None
|
1089 | 1090 |
self.ref_storage = None
|
1091 |
+ self.batch_update_supported = None
|
|
1092 |
+ self.batch_read_supported = None
|
|
1093 |
+ self.capabilities = None
|
|
1094 |
+ self.max_batch_total_size_bytes = None
|
|
1090 | 1095 |
|
1091 | 1096 |
def init(self):
|
1092 | 1097 |
if not self._initialized:
|
... | ... | @@ -1191,13 +1196,13 @@ class _CASBatchRead(): |
1191 | 1196 |
assert not self._sent
|
1192 | 1197 |
self._sent = True
|
1193 | 1198 |
|
1194 |
- if len(self._request.digests) == 0:
|
|
1199 |
+ if not self._request.digests:
|
|
1195 | 1200 |
return
|
1196 | 1201 |
|
1197 | 1202 |
batch_response = self._remote.cas.BatchReadBlobs(self._request)
|
1198 | 1203 |
|
1199 | 1204 |
for response in batch_response.responses:
|
1200 |
- if response.status.code != grpc.StatusCode.OK.value[0]:
|
|
1205 |
+ if response.status.code != code_pb2.OK:
|
|
1201 | 1206 |
raise ArtifactError("Failed to download blob {}: {}".format(
|
1202 | 1207 |
response.digest.hash, response.status.code))
|
1203 | 1208 |
if response.digest.size_bytes != len(response.data):
|
... | ... | @@ -1236,13 +1241,13 @@ class _CASBatchUpdate(): |
1236 | 1241 |
assert not self._sent
|
1237 | 1242 |
self._sent = True
|
1238 | 1243 |
|
1239 |
- if len(self._request.requests) == 0:
|
|
1244 |
+ if not self._request.requests:
|
|
1240 | 1245 |
return
|
1241 | 1246 |
|
1242 | 1247 |
batch_response = self._remote.cas.BatchUpdateBlobs(self._request)
|
1243 | 1248 |
|
1244 | 1249 |
for response in batch_response.responses:
|
1245 |
- if response.status.code != grpc.StatusCode.OK.value[0]:
|
|
1250 |
+ if response.status.code != code_pb2.OK:
|
|
1246 | 1251 |
raise ArtifactError("Failed to upload blob {}: {}".format(
|
1247 | 1252 |
response.digest.hash, response.status.code))
|
1248 | 1253 |
|
... | ... | @@ -364,7 +364,6 @@ class Context(): |
364 | 364 |
assert self._message_handler
|
365 | 365 |
|
366 | 366 |
self._message_handler(message, context=self)
|
367 |
- return
|
|
368 | 367 |
|
369 | 368 |
# silence()
|
370 | 369 |
#
|
... | ... | @@ -20,7 +20,6 @@ |
20 | 20 |
from contextlib import contextmanager
|
21 | 21 |
import os
|
22 | 22 |
import sys
|
23 |
-import resource
|
|
24 | 23 |
import traceback
|
25 | 24 |
import datetime
|
26 | 25 |
from textwrap import TextWrapper
|
... | ... | @@ -18,8 +18,8 @@ |
18 | 18 |
# Tristan Van Berkom <tristan vanberkom codethink co uk>
|
19 | 19 |
import os
|
20 | 20 |
import sys
|
21 |
-import click
|
|
22 | 21 |
import curses
|
22 |
+import click
|
|
23 | 23 |
|
24 | 24 |
# Import a widget internal for formatting time codes
|
25 | 25 |
from .widget import TimeCode
|
... | ... | @@ -42,9 +42,11 @@ from .mount import Mount |
42 | 42 |
#
|
43 | 43 |
class SafeHardlinks(Mount):
|
44 | 44 |
|
45 |
- def __init__(self, directory, tempdir, fuse_mount_options={}):
|
|
45 |
+ def __init__(self, directory, tempdir, fuse_mount_options=None):
|
|
46 | 46 |
self.directory = directory
|
47 | 47 |
self.tempdir = tempdir
|
48 |
+ if fuse_mount_options is None:
|
|
49 |
+ fuse_mount_options = {}
|
|
48 | 50 |
super().__init__(fuse_mount_options=fuse_mount_options)
|
49 | 51 |
|
50 | 52 |
def create_operations(self):
|
... | ... | @@ -87,8 +87,8 @@ class Mount(): |
87 | 87 |
# User Facing API #
|
88 | 88 |
################################################
|
89 | 89 |
|
90 |
- def __init__(self, fuse_mount_options={}):
|
|
91 |
- self._fuse_mount_options = fuse_mount_options
|
|
90 |
+ def __init__(self, fuse_mount_options=None):
|
|
91 |
+ self._fuse_mount_options = {} if fuse_mount_options is None else fuse_mount_options
|
|
92 | 92 |
|
93 | 93 |
# mount():
|
94 | 94 |
#
|
... | ... | @@ -182,7 +182,7 @@ class Mount(): |
182 | 182 |
|
183 | 183 |
# Ask the subclass to give us an Operations object
|
184 | 184 |
#
|
185 |
- self.__operations = self.create_operations()
|
|
185 |
+ self.__operations = self.create_operations() # pylint: disable=assignment-from-no-return
|
|
186 | 186 |
|
187 | 187 |
# Run fuse in foreground in this child process, internally libfuse
|
188 | 188 |
# will handle SIGTERM and gracefully exit its own little main loop.
|
... | ... | @@ -43,9 +43,9 @@ class OptionBool(Option): |
43 | 43 |
self.value = _yaml.node_get(node, bool, self.name)
|
44 | 44 |
|
45 | 45 |
def set_value(self, value):
|
46 |
- if value == 'True' or value == 'true':
|
|
46 |
+ if value in ('True', 'true'):
|
|
47 | 47 |
self.value = True
|
48 |
- elif value == 'False' or value == 'false':
|
|
48 |
+ elif value in ('False', 'false'):
|
|
49 | 49 |
self.value = False
|
50 | 50 |
else:
|
51 | 51 |
raise LoadError(LoadErrorReason.INVALID_DATA,
|
... | ... | @@ -16,9 +16,7 @@ |
16 | 16 |
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
17 | 17 |
|
18 | 18 |
import os
|
19 |
-import resource
|
|
20 | 19 |
|
21 |
-from .._exceptions import PlatformError
|
|
22 | 20 |
from ..sandbox import SandboxDummy
|
23 | 21 |
|
24 | 22 |
from . import Platform
|
... | ... | @@ -29,10 +27,6 @@ class Darwin(Platform): |
29 | 27 |
# This value comes from OPEN_MAX in syslimits.h
|
30 | 28 |
OPEN_MAX = 10240
|
31 | 29 |
|
32 |
- def __init__(self):
|
|
33 |
- |
|
34 |
- super().__init__()
|
|
35 |
- |
|
36 | 30 |
def create_sandbox(self, *args, **kwargs):
|
37 | 31 |
kwargs['dummy_reason'] = \
|
38 | 32 |
"OSXFUSE is not supported and there are no supported sandbox" + \
|
... | ... | @@ -22,7 +22,6 @@ import subprocess |
22 | 22 |
|
23 | 23 |
from .. import _site
|
24 | 24 |
from .. import utils
|
25 |
-from .._message import Message, MessageType
|
|
26 | 25 |
from ..sandbox import SandboxDummy
|
27 | 26 |
|
28 | 27 |
from . import Platform
|
... | ... | @@ -112,8 +111,4 @@ class Linux(Platform): |
112 | 111 |
except subprocess.CalledProcessError:
|
113 | 112 |
output = ''
|
114 | 113 |
|
115 |
- if output == 'root':
|
|
116 |
- return True
|
|
117 |
- |
|
118 |
- else:
|
|
119 |
- return False
|
|
114 |
+ return output == 'root'
|
... | ... | @@ -414,7 +414,7 @@ class Job(): |
414 | 414 |
|
415 | 415 |
try:
|
416 | 416 |
# Try the task action
|
417 |
- result = self.child_process()
|
|
417 |
+ result = self.child_process() # pylint: disable=assignment-from-no-return
|
|
418 | 418 |
except SkipJob as e:
|
419 | 419 |
elapsed = datetime.datetime.now() - starttime
|
420 | 420 |
self.message(MessageType.SKIPPED, str(e),
|
... | ... | @@ -57,7 +57,7 @@ class PullQueue(Queue): |
57 | 57 |
def done(self, _, element, result, success):
|
58 | 58 |
|
59 | 59 |
if not success:
|
60 |
- return False
|
|
60 |
+ return
|
|
61 | 61 |
|
62 | 62 |
element._pull_done()
|
63 | 63 |
|
... | ... | @@ -20,7 +20,6 @@ |
20 | 20 |
|
21 | 21 |
# BuildStream toplevel imports
|
22 | 22 |
from ...plugin import _plugin_lookup
|
23 |
-from ... import SourceError
|
|
24 | 23 |
|
25 | 24 |
# Local imports
|
26 | 25 |
from . import Queue, QueueStatus
|
... | ... | @@ -191,8 +191,8 @@ def find_recursive_variable(variable, matched_variables, all_vars): |
191 | 191 |
for key, value in zip(matched_variables, matched_values):
|
192 | 192 |
if _wrap_variable(variable) in value:
|
193 | 193 |
return key
|
194 |
- else:
|
|
195 |
- return None
|
|
194 |
+ # We failed to find a recursive variable
|
|
195 |
+ return None
|
|
196 | 196 |
|
197 | 197 |
|
198 | 198 |
def _wrap_variable(var):
|
... | ... | @@ -367,7 +367,7 @@ class Workspaces(): |
367 | 367 |
for element, config in _yaml.node_items(workspaces)
|
368 | 368 |
}
|
369 | 369 |
|
370 |
- elif version >= 1 and version <= BST_WORKSPACE_FORMAT_VERSION:
|
|
370 |
+ elif 1 <= version <= BST_WORKSPACE_FORMAT_VERSION:
|
|
371 | 371 |
workspaces = _yaml.node_get(workspaces, dict, "workspaces", default_value={})
|
372 | 372 |
res = {element: self._load_workspace(node)
|
373 | 373 |
for element, node in _yaml.node_items(workspaces)}
|
... | ... | @@ -395,9 +395,9 @@ def node_get(node, expected_type, key, indices=None, default_value=_get_sentinel |
395 | 395 |
try:
|
396 | 396 |
if (expected_type == bool and isinstance(value, str)):
|
397 | 397 |
# Dont coerce booleans to string, this makes "False" strings evaluate to True
|
398 |
- if value == 'true' or value == 'True':
|
|
398 |
+ if value in ('True', 'true'):
|
|
399 | 399 |
value = True
|
400 |
- elif value == 'false' or value == 'False':
|
|
400 |
+ elif value in ('False', 'false'):
|
|
401 | 401 |
value = False
|
402 | 402 |
else:
|
403 | 403 |
raise ValueError()
|
... | ... | @@ -470,10 +470,11 @@ def node_get_project_path(node, key, project_dir, *, |
470 | 470 |
.format(provenance, path_str))
|
471 | 471 |
|
472 | 472 |
try:
|
473 |
+ full_path = (project_dir_path / path)
|
|
473 | 474 |
if sys.version_info[0] == 3 and sys.version_info[1] < 6:
|
474 |
- full_resolved_path = (project_dir_path / path).resolve()
|
|
475 |
+ full_resolved_path = full_path.resolve()
|
|
475 | 476 |
else:
|
476 |
- full_resolved_path = (project_dir_path / path).resolve(strict=True)
|
|
477 |
+ full_resolved_path = full_path.resolve(strict=True) # pylint: disable=unexpected-keyword-arg
|
|
477 | 478 |
except FileNotFoundError:
|
478 | 479 |
raise LoadError(LoadErrorReason.MISSING_FILE,
|
479 | 480 |
"{}: Specified path '{}' does not exist"
|
... | ... | @@ -27,9 +27,8 @@ import sys |
27 | 27 |
from contextlib import contextmanager
|
28 | 28 |
from collections import namedtuple
|
29 | 29 |
|
30 |
-from ._cachekey import generate_key
|
|
31 | 30 |
from ._context import Context
|
32 |
-from . import utils, _yaml
|
|
31 |
+from . import _yaml
|
|
33 | 32 |
|
34 | 33 |
|
35 | 34 |
YAML_CACHE_FILENAME = "yaml_cache.pickle"
|
... | ... | @@ -207,7 +206,7 @@ class YamlCache(): |
207 | 206 |
filepath = os.path.relpath(full_path, project.directory)
|
208 | 207 |
else:
|
209 | 208 |
filepath = full_path
|
210 |
- return full_path
|
|
209 |
+ return filepath
|
|
211 | 210 |
|
212 | 211 |
# _calculate_key():
|
213 | 212 |
#
|
... | ... | @@ -329,7 +328,7 @@ class BstUnpickler(pickle.Unpickler): |
329 | 328 |
if not project:
|
330 | 329 |
projects = [p.name for p in self._context.get_projects()]
|
331 | 330 |
raise pickle.UnpicklingError("No project with name {} found in {}"
|
332 |
- .format(key_id, projects))
|
|
331 |
+ .format(project_tag, projects))
|
|
333 | 332 |
else:
|
334 | 333 |
project = None
|
335 | 334 |
name = tagged_name
|
... | ... | @@ -152,7 +152,7 @@ class BuildElement(Element): |
152 | 152 |
#############################################################
|
153 | 153 |
def configure(self, node):
|
154 | 154 |
|
155 |
- self.__commands = {}
|
|
155 |
+ self.__commands = {} # pylint: disable=attribute-defined-outside-init
|
|
156 | 156 |
|
157 | 157 |
# FIXME: Currently this forcefully validates configurations
|
158 | 158 |
# for all BuildElement subclasses so they are unable to
|
... | ... | @@ -432,7 +432,7 @@ class Element(Plugin): |
432 | 432 |
visited=visited, recursed=True)
|
433 | 433 |
|
434 | 434 |
# Yeild self only at the end, after anything needed has been traversed
|
435 |
- if should_yield and (recurse or recursed) and (scope == Scope.ALL or scope == Scope.RUN):
|
|
435 |
+ if should_yield and (recurse or recursed) and (scope in (Scope.ALL, Scope.RUN)):
|
|
436 | 436 |
yield self
|
437 | 437 |
|
438 | 438 |
def search(self, scope, name):
|
... | ... | @@ -1563,7 +1563,7 @@ class Element(Plugin): |
1563 | 1563 |
# Step 3 - Prepare
|
1564 | 1564 |
self.__prepare(sandbox)
|
1565 | 1565 |
# Step 4 - Assemble
|
1566 |
- collect = self.assemble(sandbox)
|
|
1566 |
+ collect = self.assemble(sandbox) # pylint: disable=assignment-from-no-return
|
|
1567 | 1567 |
self.__set_build_result(success=True, description="succeeded")
|
1568 | 1568 |
except BstError as e:
|
1569 | 1569 |
# If an error occurred assembling an element in a sandbox,
|
... | ... | @@ -2521,7 +2521,7 @@ class Element(Plugin): |
2521 | 2521 |
strong_key = meta['strong']
|
2522 | 2522 |
weak_key = meta['weak']
|
2523 | 2523 |
|
2524 |
- assert key == strong_key or key == weak_key
|
|
2524 |
+ assert key in (strong_key, weak_key)
|
|
2525 | 2525 |
|
2526 | 2526 |
self.__metadata_keys[strong_key] = meta
|
2527 | 2527 |
self.__metadata_keys[weak_key] = meta
|
... | ... | @@ -751,9 +751,7 @@ class Plugin(): |
751 | 751 |
self.__context.message(message)
|
752 | 752 |
|
753 | 753 |
def __note_command(self, output, *popenargs, **kwargs):
|
754 |
- workdir = os.getcwd()
|
|
755 |
- if 'cwd' in kwargs:
|
|
756 |
- workdir = kwargs['cwd']
|
|
754 |
+ workdir = kwargs.get('cwd', os.getcwd())
|
|
757 | 755 |
command = " ".join(popenargs[0])
|
758 | 756 |
output.write('Running host command {}: {}\n'.format(workdir, command))
|
759 | 757 |
output.flush()
|
... | ... | @@ -343,13 +343,13 @@ class GitMirror(SourceFetcher): |
343 | 343 |
'--contains', self.ref],
|
344 | 344 |
cwd=fullpath,)
|
345 | 345 |
if branch:
|
346 |
- return True
|
|
346 |
+ return
|
|
347 | 347 |
else:
|
348 | 348 |
_, tag = self.source.check_output([self.source.host_git, 'tag', '--list', track,
|
349 | 349 |
'--contains', self.ref],
|
350 | 350 |
cwd=fullpath,)
|
351 | 351 |
if tag:
|
352 |
- return True
|
|
352 |
+ return
|
|
353 | 353 |
|
354 | 354 |
detail = "The ref provided for the element does not exist locally in the provided track branch / tag " + \
|
355 | 355 |
"'{}'.\nYou may wish to track the element to update the ref from '{}' ".format(track, track) + \
|
... | ... | @@ -30,7 +30,7 @@ from .._fuse import SafeHardlinks |
30 | 30 |
# Helper data object representing a single mount point in the mount map
|
31 | 31 |
#
|
32 | 32 |
class Mount():
|
33 |
- def __init__(self, sandbox, mount_point, safe_hardlinks, fuse_mount_options={}):
|
|
33 |
+ def __init__(self, sandbox, mount_point, safe_hardlinks, fuse_mount_options=None):
|
|
34 | 34 |
scratch_directory = sandbox._get_scratch_directory()
|
35 | 35 |
# Getting _get_underlying_directory() here is acceptable as
|
36 | 36 |
# we're part of the sandbox code. This will fail if our
|
... | ... | @@ -39,7 +39,7 @@ class Mount(): |
39 | 39 |
|
40 | 40 |
self.mount_point = mount_point
|
41 | 41 |
self.safe_hardlinks = safe_hardlinks
|
42 |
- self._fuse_mount_options = fuse_mount_options
|
|
42 |
+ self._fuse_mount_options = {} if fuse_mount_options is None else fuse_mount_options
|
|
43 | 43 |
|
44 | 44 |
# FIXME: When the criteria for mounting something and its parent
|
45 | 45 |
# mount is identical, then there is no need to mount an additional
|
... | ... | @@ -101,10 +101,13 @@ class Mount(): |
101 | 101 |
#
|
102 | 102 |
class MountMap():
|
103 | 103 |
|
104 |
- def __init__(self, sandbox, root_readonly, fuse_mount_options={}):
|
|
104 |
+ def __init__(self, sandbox, root_readonly, fuse_mount_options=None):
|
|
105 | 105 |
# We will be doing the mounts in the order in which they were declared.
|
106 | 106 |
self.mounts = OrderedDict()
|
107 | 107 |
|
108 |
+ if fuse_mount_options is None:
|
|
109 |
+ fuse_mount_options = {}
|
|
110 |
+ |
|
108 | 111 |
# We want safe hardlinks on rootfs whenever root is not readonly
|
109 | 112 |
self.mounts['/'] = Mount(sandbox, '/', not root_readonly, fuse_mount_options)
|
110 | 113 |
|
... | ... | @@ -25,7 +25,7 @@ from .. import utils, _signals |
25 | 25 |
|
26 | 26 |
|
27 | 27 |
# A class to wrap the `mount` and `umount` system commands
|
28 |
-class Mounter(object):
|
|
28 |
+class Mounter():
|
|
29 | 29 |
@classmethod
|
30 | 30 |
def _mount(cls, dest, src=None, mount_type=None,
|
31 | 31 |
stdout=sys.stdout, stderr=sys.stderr, options=None,
|
... | ... | @@ -130,7 +130,7 @@ class SandboxBwrap(Sandbox): |
130 | 130 |
mount_source_overrides = self._get_mount_sources()
|
131 | 131 |
for mark in marked_directories:
|
132 | 132 |
mount_point = mark['directory']
|
133 |
- if mount_point in mount_source_overrides:
|
|
133 |
+ if mount_point in mount_source_overrides: # pylint: disable=consider-using-get
|
|
134 | 134 |
mount_source = mount_source_overrides[mount_point]
|
135 | 135 |
else:
|
136 | 136 |
mount_source = mount_map.get_mount_source(mount_point)
|
... | ... | @@ -72,7 +72,6 @@ class SandboxChroot(Sandbox): |
72 | 72 |
# each mount point needs to be mounted from and to
|
73 | 73 |
self.mount_map = MountMap(self, flags & SandboxFlags.ROOT_READ_ONLY,
|
74 | 74 |
self._FUSE_MOUNT_OPTIONS)
|
75 |
- root_mount_source = self.mount_map.get_mount_source('/')
|
|
76 | 75 |
|
77 | 76 |
# Create a sysroot and run the command inside it
|
78 | 77 |
with ExitStack() as stack:
|
... | ... | @@ -147,7 +146,7 @@ class SandboxChroot(Sandbox): |
147 | 146 |
|
148 | 147 |
try:
|
149 | 148 |
with _signals.suspendable(suspend_proc, resume_proc), _signals.terminator(kill_proc):
|
150 |
- process = subprocess.Popen(
|
|
149 |
+ process = subprocess.Popen( # pylint: disable=subprocess-popen-preexec-fn
|
|
151 | 150 |
command,
|
152 | 151 |
close_fds=True,
|
153 | 152 |
cwd=os.path.join(rootfs, cwd.lstrip(os.sep)),
|
... | ... | @@ -264,7 +263,7 @@ class SandboxChroot(Sandbox): |
264 | 263 |
@contextmanager
|
265 | 264 |
def mount_point(point, **kwargs):
|
266 | 265 |
mount_source_overrides = self._get_mount_sources()
|
267 |
- if point in mount_source_overrides:
|
|
266 |
+ if point in mount_source_overrides: # pylint: disable=consider-using-get
|
|
268 | 267 |
mount_source = mount_source_overrides[point]
|
269 | 268 |
else:
|
270 | 269 |
mount_source = self.mount_map.get_mount_source(point)
|
... | ... | @@ -637,7 +637,7 @@ class Source(Plugin): |
637 | 637 |
# Source consistency interrogations are silent.
|
638 | 638 |
context = self._get_context()
|
639 | 639 |
with context.silence():
|
640 |
- self.__consistency = self.get_consistency()
|
|
640 |
+ self.__consistency = self.get_consistency() # pylint: disable=assignment-from-no-return
|
|
641 | 641 |
|
642 | 642 |
# Return cached consistency
|
643 | 643 |
#
|
... | ... | @@ -687,14 +687,14 @@ class Source(Plugin): |
687 | 687 |
|
688 | 688 |
key['directory'] = self.__directory
|
689 | 689 |
if include_source:
|
690 |
- key['unique'] = self.get_unique_key()
|
|
690 |
+ key['unique'] = self.get_unique_key() # pylint: disable=assignment-from-no-return
|
|
691 | 691 |
|
692 | 692 |
return key
|
693 | 693 |
|
694 | 694 |
# Wrapper for set_ref(), also returns whether it changed.
|
695 | 695 |
#
|
696 | 696 |
def _set_ref(self, ref, node):
|
697 |
- current_ref = self.get_ref()
|
|
697 |
+ current_ref = self.get_ref() # pylint: disable=assignment-from-no-return
|
|
698 | 698 |
changed = False
|
699 | 699 |
|
700 | 700 |
# This comparison should work even for tuples and lists,
|
... | ... | @@ -773,7 +773,7 @@ class Source(Plugin): |
773 | 773 |
elif project.ref_storage == ProjectRefStorage.PROJECT_REFS:
|
774 | 774 |
|
775 | 775 |
# First warn if there is a ref already loaded, and reset it
|
776 |
- redundant_ref = self.get_ref()
|
|
776 |
+ redundant_ref = self.get_ref() # pylint: disable=assignment-from-no-return
|
|
777 | 777 |
if redundant_ref is not None:
|
778 | 778 |
self.set_ref(None, {})
|
779 | 779 |
|
... | ... | @@ -883,7 +883,7 @@ class Source(Plugin): |
883 | 883 |
else:
|
884 | 884 |
new_ref = self.__do_track()
|
885 | 885 |
|
886 |
- current_ref = self.get_ref()
|
|
886 |
+ current_ref = self.get_ref() # pylint: disable=assignment-from-no-return
|
|
887 | 887 |
|
888 | 888 |
if new_ref is None:
|
889 | 889 |
# No tracking, keep current ref
|
... | ... | @@ -1038,15 +1038,12 @@ class Source(Plugin): |
1038 | 1038 |
if not mirrors or not alias:
|
1039 | 1039 |
return self.track(**kwargs)
|
1040 | 1040 |
|
1041 |
- context = self._get_context()
|
|
1042 |
- source_kind = type(self)
|
|
1043 |
- |
|
1044 | 1041 |
# NOTE: We are assuming here that tracking only requires substituting the
|
1045 | 1042 |
# first alias used
|
1046 | 1043 |
for uri in reversed(project.get_alias_uris(alias, first_pass=self.__first_pass)):
|
1047 | 1044 |
new_source = self.__clone_for_uri(uri)
|
1048 | 1045 |
try:
|
1049 |
- ref = new_source.track(**kwargs)
|
|
1046 |
+ ref = new_source.track(**kwargs) # pylint: disable=assignment-from-none
|
|
1050 | 1047 |
# FIXME: Need to consider temporary vs. permanent failures,
|
1051 | 1048 |
# and how this works with retries.
|
1052 | 1049 |
except BstError as e:
|
... | ... | @@ -29,13 +29,13 @@ import re |
29 | 29 |
import shutil
|
30 | 30 |
import signal
|
31 | 31 |
import stat
|
32 |
+from stat import S_ISDIR
|
|
32 | 33 |
import string
|
33 | 34 |
import subprocess
|
34 | 35 |
import tempfile
|
35 | 36 |
import itertools
|
36 | 37 |
import functools
|
37 | 38 |
from contextlib import contextmanager
|
38 |
-from stat import S_ISDIR
|
|
39 | 39 |
|
40 | 40 |
import psutil
|
41 | 41 |
|
... | ... | @@ -1088,7 +1088,8 @@ def _call(*popenargs, terminate=False, **kwargs): |
1088 | 1088 |
os.killpg(group_id, signal.SIGCONT)
|
1089 | 1089 |
|
1090 | 1090 |
with _signals.suspendable(suspend_proc, resume_proc), _signals.terminator(kill_proc):
|
1091 |
- process = subprocess.Popen(*popenargs, preexec_fn=preexec_fn, **kwargs)
|
|
1091 |
+ process = subprocess.Popen( # pylint: disable=subprocess-popen-preexec-fn
|
|
1092 |
+ *popenargs, preexec_fn=preexec_fn, **kwargs)
|
|
1092 | 1093 |
output, _ = process.communicate()
|
1093 | 1094 |
exit_code = process.poll()
|
1094 | 1095 |
|