summaryrefslogtreecommitdiff
path: root/src/buildstream
Commit message (Collapse)AuthorAgeFilesLines
* WIPbschubert/no-sanitizeBenjamin Schubert2019-06-273-11/+21
|
* _cachekey: Don't use 'node_sanitize', but define __json__ in 'Node'Benjamin Schubert2019-06-272-2/+5
| | | | | This allows us to dump the data in an ordered way without depending on 'node_sanitize'.
* _yaml: Remove 'node_del' and support `del mapping[key]`Benjamin Schubert2019-06-277-27/+19
| | | | | - Also add a convenience method 'safe_del' catching the exception when we don't care if the value was there or not.
* _yaml: Remove 'node_copy' and add 'Node.copy()'bschubert/node-copyBenjamin Schubert2019-06-276-84/+50
| | | | Also adaprt every part of the code calling it
* _yaml: Add a 'get_node' on Mapping, when return type can be of multiple typesbschubert/node-api-nogetBenjamin Schubert2019-06-253-12/+27
| | | | | | | | | | | Sometimes, we might want to have a list or a string, in which case, we can now use 'get_node', which can return multiple types. This method doesn't contain a 'default' value, as building a 'Node' from it would be hard. We therefore just have a 'allow_none' flag that allows returning 'None' when the value is not found. - includes: use the new 'get_node' instead of trying multiple versions
* _yaml: Never create base 'Node' directlyBenjamin Schubert2019-06-252-5/+8
| | | | We shouldn't have to create normal nodes ever. Let's ensure we don't
* _yaml: Remove 'node_get' and migrate all remaining calls to new APIBenjamin Schubert2019-06-2513-126/+26
|
* element: Remove `node_get_member` and all references to itBenjamin Schubert2019-06-254-47/+3
| | | | This can now be done more easily with the Node api
* plugin: remove 'node_get_list_element'Benjamin Schubert2019-06-251-37/+1
| | | | | | | The new yaml API is able of getting these access with the same error messages handling. Having this helper is therefore not useful anymore.
* element: remove 'node_subst_list_element'Benjamin Schubert2019-06-252-43/+1
| | | | | This method is unused and can be easily reimplemented with the new Node API by looping over nodes.
* _yaml: Introduce 'get_sequence()' and 'sequence_at()'/'mapping_at()'Benjamin Schubert2019-06-2515-53/+106
| | | | | | | | | - Adding 'get_sequence' on MappingNode to access sequences in a mapping - Adding 'sequence_at' on SequenceNode to access sequences in a sequence - Adding 'mapping_at' on SequenceNode to access mappings in a sequence Using "*_at" in sequences allows us to quickly understand if we are dealing with a sequence or a mapping.
* _yaml: Remove use of expected_type=None in 'node_get()'Benjamin Schubert2019-06-251-9/+11
| | | | | | | In a strongly typed API with Node, having a 'None' as expected type is hard to make nice. Moreover, this is rarely used in the codebase. Thus, adapting the call sites to not use 'None' as an expected type.
* _yaml: Add 'as_int()' on ScalarNodeBenjamin Schubert2019-06-257-14/+32
| | | | | | - Add the 'as_int()' method on 'ScalarNode' to replace 'node_get(mapping, key, int)' - Adapt all call sites to use the new API
* _yaml: Add 'as_bool()' and 'is_none()' to ScalarNodeBenjamin Schubert2019-06-2514-29/+53
| | | | | | | | | | | - 'as_bool()' casts a ScalarNode into a boolean, understanding both 'True' and 'False' as truthy-falsy values, as per node_get(type=bool) behavior - 'is_none()' allwos checking whether the scalar node contains a 'None' value. Since 'None' cannot be used when working with booleans, we need to have a way of checking for 'None' when we actually need the information of whether the value is unset. - Adapt all call places to use the new API
* _yaml: Add 'as_str()' on ScalarNode and 'get_scalar()' on MappingNodeBenjamin Schubert2019-06-2525-79/+111
| | | | | | | | | | - 'get_scalar()' allows retrieving a scalar node from a mapping. - 'as_str()' casts a ScalarNode into a string (thus removing the node information). Both together, those replace 'node_get(mapping, key, type=str)' but also allow retrieving the 'Node' itself, which will allow in the future lazier provenance computation.
* _yaml: add 'get_mapping()' to MappingNodeBenjamin Schubert2019-06-2514-69/+93
| | | | | | | | This allows to get a mapping node from another 'MappingNode', replacing 'node_get(my_mapping, key, type=dict)' Also changes all places where 'node_get' was called like that by the new API.
* _yaml: Introduce a 'Sequence' NodeBenjamin Schubert2019-06-251-10/+20
| | | | | | | This allows us to represent sequences (lists) more efficiently. This is the third type that is needed in order to know what kind of datastructure we are handling in our graph.
* _yaml: Introduce a 'Mapping' Node classBenjamin Schubert2019-06-253-23/+38
| | | | | This allows us to specialize the base 'Node' class to store mappings (dicts) more efficiently.
* _yaml: Introduce a Scalar Node to encapsulate str/int/boolsBenjamin Schubert2019-06-251-12/+33
| | | | | | | | This node specializes the 'Node' class to represent a scalar value. This allows us to let users access leaf Nodes in the graph without having to find them with `node_find_target`, and also will allow us lazier computation of node provenance in some cases.
* _yaml: Remove useless calls to '_yaml.node_sanitize'Benjamin Schubert2019-06-252-2/+1
| | | | | | Calling '_yaml.dump' will itself call '_yaml.node_sanitize', therefore we can remove all calls to it in places where we directly after call dump.
* _stream.py: Use scheduler to fetch subprojectsJürg Billeter2019-06-251-2/+8
|
* Handle subproject fetching in the Stream classJürg Billeter2019-06-254-8/+23
|
* app.py: Create stream before loading projectJürg Billeter2019-06-252-26/+39
| | | | | | This is in preparation for moving subproject fetching to the Stream class. Project loading may require subproject fetching as part of processing include directives.
* Always fetch subprojects as neededJürg Billeter2019-06-256-71/+28
| | | | | | Treat junction element sources the same as sources of any other element and always fetch subprojects as needed. Do not ask the user to manually fetch subprojects.
* element.py: Notify reverse deps when ready for runtime and cachedjennis/notify_reverse_depsJames Ennis2019-06-242-23/+86
| | | | | | | | | | | | An Element becomes ready for runtime and cached when: 1. It has a strong cache key 2. It is cached 3. Its runtime dependencies are ready for runtime and cached (this ensures the runtimes of runtimes are also cached). This patch introduces the method attempt_to_notify_reverse_dependencies which will notify all direct reverse dependencies of an Element once said Element becomes ready for runtime and cached.
* element.py: cache key should be set in __update_cache_keysJames Ennis2019-06-241-1/+6
|
* element.py: Set can_query_cache_callback to None when calledJames Ennis2019-06-241-0/+1
| | | | | Each other callback callsite immediately sets the callback to None once invoked. We should be consistent.
* _stream/cli: Add pull option to shellRaoul Hidalgo Charman2019-06-242-15/+30
| | | | | | This will fetch artifacts if they're not local or are incomplete. Part of #1044
* cli.py/_stream.py: Add pull option to checkoutRaoul Hidalgo Charman2019-06-242-6/+24
| | | | | | | This will set up a pull queue and pull relevant artifacts if not present or incomplete. Part of #1044
* _artifactcache.py: fix find_missing_blobs methodRaoul Hidalgo Charman2019-06-212-5/+8
| | | | | | | This never will have worked because digests aren't hashable, and this method wasn't being covered in any tests. Also changed `remote_missing_blobs` to ensure the blobs list is an iterator and updated its docs.
* _frontend/cli.py: Tweak 'try' & 'always' bst shell buildtree handlingTom Pollard2019-06-192-9/+14
| | | | | | | | | | | If the cached Artifact wasn't originally generated with a buildtree, then there's no need to attempt to find it in remotes by entering Stream(). In interactive mode we only present the user the option to attempt the pull with the above assumption on buildtree_exists, so apply the same to applicable non interactive choices. This also includes some tweaks in integration/shellbuildtrees.py to reflect changes and cover cases that were missing.
* _sandboxremote.py: Guard against gRPC channels in the main processjuerg/grpcJürg Billeter2019-06-191-0/+3
|
* casremote.py: Guard against gRPC channels in the main processJürg Billeter2019-06-191-0/+3
|
* jobs/job: send ChildJob the context, not schedulerAngelos Evripiotis2019-06-191-6/+6
| | | | | | | Instead of passing the whole scheduler to the ChildJob, only pass the part that is used - the context. Reducing the amount of shared state makes it easier to follow what's going on, and will make it more economical to move to away from the 'fork' model later.
* _fuse/hardlinks: don't return result of os.unlinkAngelos Evripiotis2019-06-181-1/+1
| | | | | | Don't return, instead of returning 'the result' of os.unlink - it also doesn't return anything (and neither does the semantically identical os.remove).
* _options: match methods to base classAngelos Evripiotis2019-06-185-5/+19
| | | | | | | | | | | | | | | | | | | Update OptionEnum and OptionFlags to match the Option base-class. Introduce 'load_special' to allow explicit usage of extended functionality, which wouldn't necessarily be supported by different subclasses. By making the signatures of overridden methods deliberately match, we can use PyLint to ensure the signatures don't accidentally differ. Also replace `super(cls, self)` with the equivalent and less error-prone `super()`, wherever we've touched it. In separate work we may want to replace this across the project. We must introduce __init__() functions for OptionEnum and OptionFlags to get a clean pass from PyLint. It seems that it's unable to see that load_special() is also transitively called from __init__().
* testing/_utils: match git methods to base classAngelos Evripiotis2019-06-181-1/+4
| | | | | | | | | | | | Update 'source_config' of Git and _SimpleGit to match the Repo base class. This ensures that they are fully substitutable Repos. Introduce 'source_config_extra' to allow explicit usage of extended functionality, which wouldn't necessarily be supported by a different subclass. By making the signatures deliberately match, we can use PyLint to ensure the signatures don't accidentally differ.
* CliIntegration: match methods to base classAngelos Evripiotis2019-06-181-2/+12
| | | | | | | | | | | | | | | Update 'run' to match the base class. This ensures that it is a fully substitutable sub-class. Introduce 'run_project_config' to allow explicit usage of extended functionality, which wouldn't necessarily be supported by a different subclass. By making the signatures deliberately match, we can use PyLint to ensure the signatures don't accidentally differ. Since we're already relying on `kwargs['project']` succeeding, enforce that run_project_config() only takes keyword arguments.
* _filebaseddirectory: match methods to base classAngelos Evripiotis2019-06-181-10/+10
| | | | | | | | | Update import_single_file and export_to_tar to match the Directory base class. This ensures that FileBasedDirectory is a fully substitutable Directory. By making the signatures deliberately match, we can use PyLint to ensure the signatures don't accidentally differ.
* _casbaseddirectory: match methods to base classAngelos Evripiotis2019-06-181-13/+28
| | | | | | | | | Update import_single_file and list_relative_paths to match the Directory base class. This ensures that CasBasedDirectory is a fully substitutable Directory. By making the signatures deliberately match, we can use PyLint to ensure the signatures don't accidentally differ.
* _fuse: match SafeHardlinkOps to base classAngelos Evripiotis2019-06-181-7/+7
| | | | | | | Update signatures of SafeHardlinkOps methods to match the fuse.Operations base class. This helps ensure there's no confusion about what the arguments are for, and that SafeHardlinkOps can actually be substituted for any other Operations subclass.
* _fuse/fuse: make create() match SafeHardlinkOpsAngelos Evripiotis2019-06-181-17/+12
| | | | | | | | | | | | | | Make the base-class fuse.Operations class match the subclass SafeHardlinkOps. Remove the complication of worrying about raw_fi mode - we already rely on it being inactive. Remove ambiguity from FUSE.create() - we only support the non-raw_fi case. In separate work, we may want to remove raw_fi completely. Update Operations.create() to use a 'flags' param explicitly, rather than the more confusing dual-meaning of the 'fi' param.
* _fuse: converge args for link() and symlink()Angelos Evripiotis2019-06-181-4/+6
| | | | | | | | | | | | | | | Get consistency between the Operations base class and the SafeHardlinkOps subclass. Use the 'target, source' convention as it appears in Operations. This avoids the confusion of 'target' changing meaning in the 'name, target' convention introduced by SafeHardlinkOps. The naming is also consistent with 'man ln', and more consistent with Python's equivalent functions. Unfortunately FUSE.link() and Operations.link() swap the order of 'target' and 'source', but the meaning is the same.
* _gitsourcebase: ignore or fix arguments-differ errAngelos Evripiotis2019-06-181-6/+6
| | | | | | | | | | | | PyLint helpfully points out that _GitMirror.fetch() does not match SourceFetcher.fetch() - it is missing the *kwargs argument. The same for _GitSourceBase.track(). Move towards being able to enable the 'arguments-differ' error faster by side-stepping the class design debate and ignoring the error for now. Change _GitSourceBase.set_ref() argument names to match Source.set_ref().
* _frontend/widget: match LogFile.render to base clsAngelos Evripiotis2019-06-181-3/+5
| | | | | | | | | Make the signature of LogFile.render() match Widget.render() by making a new LogFile.render_abbrev() method with the extra functionality. Fix up the single call site to use that instead. This means that we won't get linter warnings that helpful inform us that Widgets are not really substitutable.
* _platform.get_cpu_count: use psutil instead of osaevri/psutil_affinityAngelos Evripiotis2019-06-181-1/+3
| | | | | | | | Be Windows-friendly by using the portable `psutil.Process().cpu_affinity()` instead of `os.sched_getaffinity`. Note that unfortunately this still doesn't work on Mac, so we keep that platform-specific override.
* _exceptions.py: Make ErrorDomain uniqueraoul/unique-error-domainsRaoul Hidalgo Charman2019-06-131-2/+3
| | | | | | | | For some reason PROG_NOT_FOUND and APP were both under 12 which could be confusing. Changed PROG_NOT_FOUND to 16 and added a unique decorator to prevent this from happening again. Updated shellbuildtrees test to check correct error domain.
* _scheduler/scheduler.py: Remove unused elapsed_time() callstpollard/elapsedtimeTom Pollard2019-06-133-7/+4
| | | | | | Both run() and the App callback _ticker_callback() call & return elapsed_time(), which is the unused by the respective callers and as such is unnecessary.
* cascache.py: Remove unused methods commit() and _commit_directory()Jürg Billeter2019-06-121-56/+0
|
* utils._get_volume_size: use shutil.disk_usageaevri/psutil_volumeAngelos Evripiotis2019-06-121-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | This is win32-friendly, less to read, and fixes a latent bug. Avoid dealing with low-level platform specifics by using the higher-level shutil.disk_usage() function to calc total and available bytes for us. shutil is also more correct - it uses f_frsize to convert from blocks to bytes, instead of f_bsize. I verified that the numbers match with the output from `df -k`, whereas the old implementation did not. Here are the meanings from `man statvfs`: f_frsize The size in bytes of the minimum unit of allocation on this file system. (This corresponds to the f_bsize member of struct statfs.) f_bsize The preferred length of I/O requests for files on this file system. (Corresponds to the f_iosize member of struct statfs.) Link to shutil.disk_usage() implementation: https://github.com/python/cpython/blob/3.5/Lib/shutil.py#L980