| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
| |
This allows us to dump the data in an ordered way without depending
on 'node_sanitize'.
|
|
|
|
|
| |
- Also add a convenience method 'safe_del' catching the exception
when we don't care if the value was there or not.
|
|
|
|
| |
Also adaprt every part of the code calling it
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
| |
We shouldn't have to create normal nodes ever. Let's ensure we don't
|
| |
|
|
|
|
| |
This can now be done more easily with the Node api
|
|
|
|
|
|
|
| |
The new yaml API is able of getting these access with the same error
messages handling.
Having this helper is therefore not useful anymore.
|
|
|
|
|
| |
This method is unused and can be easily reimplemented with the new
Node API by looping over nodes.
|
|
|
|
|
|
|
|
|
| |
- 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.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
- Add the 'as_int()' method on 'ScalarNode' to replace
'node_get(mapping, key, int)'
- Adapt all call sites to use the new API
|
|
|
|
|
|
|
|
|
|
|
| |
- '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
|
|
|
|
|
|
|
|
|
|
| |
- '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.
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
This allows us to specialize the base 'Node' class to store mappings
(dicts) more efficiently.
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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.
|
| |
|
| |
|
|
|
|
|
|
| |
This is in preparation for moving subproject fetching to the Stream
class. Project loading may require subproject fetching as part of
processing include directives.
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
Each other callback callsite immediately sets the callback to None
once invoked. We should be consistent.
|
|
|
|
|
|
| |
This will fetch artifacts if they're not local or are incomplete.
Part of #1044
|
|
|
|
|
|
|
| |
This will set up a pull queue and pull relevant artifacts if not present
or incomplete.
Part of #1044
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
| |
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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__().
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
| |
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().
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|