jolt 0.9.76__py3-none-any.whl → 0.9.429__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jolt/__init__.py +88 -7
- jolt/__main__.py +9 -1
- jolt/bin/fstree-darwin-x86_64 +0 -0
- jolt/bin/fstree-linux-x86_64 +0 -0
- jolt/cache.py +839 -367
- jolt/chroot.py +156 -0
- jolt/cli.py +362 -143
- jolt/common_pb2.py +63 -0
- jolt/common_pb2_grpc.py +4 -0
- jolt/config.py +99 -42
- jolt/error.py +19 -4
- jolt/expires.py +2 -2
- jolt/filesystem.py +8 -6
- jolt/graph.py +705 -117
- jolt/hooks.py +63 -1
- jolt/influence.py +129 -6
- jolt/loader.py +369 -121
- jolt/log.py +225 -63
- jolt/manifest.py +28 -38
- jolt/options.py +35 -10
- jolt/pkgs/abseil.py +42 -0
- jolt/pkgs/asio.py +25 -0
- jolt/pkgs/autoconf.py +41 -0
- jolt/pkgs/automake.py +41 -0
- jolt/pkgs/b2.py +31 -0
- jolt/pkgs/boost.py +111 -0
- jolt/pkgs/boringssl.py +32 -0
- jolt/pkgs/busybox.py +39 -0
- jolt/pkgs/bzip2.py +43 -0
- jolt/pkgs/cares.py +29 -0
- jolt/pkgs/catch2.py +36 -0
- jolt/pkgs/cbindgen.py +17 -0
- jolt/pkgs/cista.py +19 -0
- jolt/pkgs/clang.py +44 -0
- jolt/pkgs/cli11.py +23 -0
- jolt/pkgs/cmake.py +48 -0
- jolt/pkgs/cpython.py +196 -0
- jolt/pkgs/crun.py +29 -0
- jolt/pkgs/curl.py +38 -0
- jolt/pkgs/dbus.py +18 -0
- jolt/pkgs/double_conversion.py +24 -0
- jolt/pkgs/fastfloat.py +21 -0
- jolt/pkgs/ffmpeg.py +28 -0
- jolt/pkgs/flatbuffers.py +29 -0
- jolt/pkgs/fmt.py +27 -0
- jolt/pkgs/fstree.py +20 -0
- jolt/pkgs/gflags.py +18 -0
- jolt/pkgs/glib.py +18 -0
- jolt/pkgs/glog.py +25 -0
- jolt/pkgs/glslang.py +21 -0
- jolt/pkgs/golang.py +16 -11
- jolt/pkgs/googlebenchmark.py +18 -0
- jolt/pkgs/googletest.py +46 -0
- jolt/pkgs/gperf.py +15 -0
- jolt/pkgs/grpc.py +73 -0
- jolt/pkgs/hdf5.py +19 -0
- jolt/pkgs/help2man.py +14 -0
- jolt/pkgs/inja.py +28 -0
- jolt/pkgs/jsoncpp.py +31 -0
- jolt/pkgs/libarchive.py +43 -0
- jolt/pkgs/libcap.py +44 -0
- jolt/pkgs/libdrm.py +44 -0
- jolt/pkgs/libedit.py +42 -0
- jolt/pkgs/libevent.py +31 -0
- jolt/pkgs/libexpat.py +27 -0
- jolt/pkgs/libfastjson.py +21 -0
- jolt/pkgs/libffi.py +16 -0
- jolt/pkgs/libglvnd.py +30 -0
- jolt/pkgs/libogg.py +28 -0
- jolt/pkgs/libpciaccess.py +18 -0
- jolt/pkgs/libseccomp.py +21 -0
- jolt/pkgs/libtirpc.py +24 -0
- jolt/pkgs/libtool.py +42 -0
- jolt/pkgs/libunwind.py +35 -0
- jolt/pkgs/libva.py +18 -0
- jolt/pkgs/libvorbis.py +33 -0
- jolt/pkgs/libxml2.py +35 -0
- jolt/pkgs/libxslt.py +17 -0
- jolt/pkgs/libyajl.py +16 -0
- jolt/pkgs/llvm.py +81 -0
- jolt/pkgs/lua.py +54 -0
- jolt/pkgs/lz4.py +26 -0
- jolt/pkgs/m4.py +14 -0
- jolt/pkgs/make.py +17 -0
- jolt/pkgs/mesa.py +81 -0
- jolt/pkgs/meson.py +17 -0
- jolt/pkgs/mstch.py +28 -0
- jolt/pkgs/mysql.py +60 -0
- jolt/pkgs/nasm.py +49 -0
- jolt/pkgs/ncurses.py +30 -0
- jolt/pkgs/ng_log.py +25 -0
- jolt/pkgs/ninja.py +45 -0
- jolt/pkgs/nlohmann_json.py +25 -0
- jolt/pkgs/nodejs.py +19 -11
- jolt/pkgs/opencv.py +24 -0
- jolt/pkgs/openjdk.py +26 -0
- jolt/pkgs/openssl.py +103 -0
- jolt/pkgs/paho.py +76 -0
- jolt/pkgs/patchelf.py +16 -0
- jolt/pkgs/perl.py +42 -0
- jolt/pkgs/pkgconfig.py +64 -0
- jolt/pkgs/poco.py +39 -0
- jolt/pkgs/protobuf.py +77 -0
- jolt/pkgs/pugixml.py +27 -0
- jolt/pkgs/python.py +19 -0
- jolt/pkgs/qt.py +35 -0
- jolt/pkgs/rapidjson.py +26 -0
- jolt/pkgs/rapidyaml.py +28 -0
- jolt/pkgs/re2.py +30 -0
- jolt/pkgs/re2c.py +17 -0
- jolt/pkgs/readline.py +15 -0
- jolt/pkgs/rust.py +41 -0
- jolt/pkgs/sdl.py +28 -0
- jolt/pkgs/simdjson.py +27 -0
- jolt/pkgs/soci.py +46 -0
- jolt/pkgs/spdlog.py +29 -0
- jolt/pkgs/spirv_llvm.py +21 -0
- jolt/pkgs/spirv_tools.py +24 -0
- jolt/pkgs/sqlite.py +83 -0
- jolt/pkgs/ssl.py +12 -0
- jolt/pkgs/texinfo.py +15 -0
- jolt/pkgs/tomlplusplus.py +22 -0
- jolt/pkgs/wayland.py +26 -0
- jolt/pkgs/x11.py +58 -0
- jolt/pkgs/xerces_c.py +20 -0
- jolt/pkgs/xorg.py +360 -0
- jolt/pkgs/xz.py +29 -0
- jolt/pkgs/yamlcpp.py +30 -0
- jolt/pkgs/zeromq.py +47 -0
- jolt/pkgs/zlib.py +69 -0
- jolt/pkgs/zstd.py +33 -0
- jolt/plugins/alias.py +3 -0
- jolt/plugins/allure.py +5 -2
- jolt/plugins/autotools.py +66 -0
- jolt/plugins/cache.py +133 -0
- jolt/plugins/cmake.py +74 -6
- jolt/plugins/conan.py +238 -0
- jolt/plugins/cxx.py +698 -0
- jolt/plugins/cxxinfo.py +7 -0
- jolt/plugins/dashboard.py +1 -1
- jolt/plugins/docker.py +91 -23
- jolt/plugins/email.py +5 -2
- jolt/plugins/email.xslt +144 -101
- jolt/plugins/environ.py +11 -0
- jolt/plugins/fetch.py +141 -0
- jolt/plugins/gdb.py +44 -21
- jolt/plugins/gerrit.py +1 -14
- jolt/plugins/git.py +316 -101
- jolt/plugins/googletest.py +522 -1
- jolt/plugins/http.py +36 -38
- jolt/plugins/libtool.py +63 -0
- jolt/plugins/linux.py +990 -0
- jolt/plugins/logstash.py +4 -4
- jolt/plugins/meson.py +61 -0
- jolt/plugins/ninja-compdb.py +107 -31
- jolt/plugins/ninja.py +929 -134
- jolt/plugins/paths.py +11 -1
- jolt/plugins/pkgconfig.py +219 -0
- jolt/plugins/podman.py +148 -91
- jolt/plugins/python.py +137 -0
- jolt/plugins/remote_execution/__init__.py +0 -0
- jolt/plugins/remote_execution/administration_pb2.py +46 -0
- jolt/plugins/remote_execution/administration_pb2_grpc.py +170 -0
- jolt/plugins/remote_execution/log_pb2.py +32 -0
- jolt/plugins/remote_execution/log_pb2_grpc.py +68 -0
- jolt/plugins/remote_execution/scheduler_pb2.py +41 -0
- jolt/plugins/remote_execution/scheduler_pb2_grpc.py +141 -0
- jolt/plugins/remote_execution/worker_pb2.py +38 -0
- jolt/plugins/remote_execution/worker_pb2_grpc.py +112 -0
- jolt/plugins/report.py +12 -2
- jolt/plugins/rust.py +25 -0
- jolt/plugins/scheduler.py +710 -0
- jolt/plugins/selfdeploy/setup.py +9 -4
- jolt/plugins/selfdeploy.py +138 -88
- jolt/plugins/strings.py +35 -22
- jolt/plugins/symlinks.py +26 -11
- jolt/plugins/telemetry.py +5 -2
- jolt/plugins/timeline.py +13 -3
- jolt/plugins/volume.py +46 -48
- jolt/scheduler.py +591 -191
- jolt/tasks.py +1783 -245
- jolt/templates/export.sh.template +12 -6
- jolt/templates/timeline.html.template +44 -47
- jolt/timer.py +22 -0
- jolt/tools.py +749 -302
- jolt/utils.py +245 -18
- jolt/version.py +1 -1
- jolt/version_utils.py +2 -2
- jolt/xmldom.py +12 -2
- {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/METADATA +98 -38
- jolt-0.9.429.dist-info/RECORD +207 -0
- {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/WHEEL +1 -1
- jolt/plugins/amqp.py +0 -834
- jolt/plugins/debian.py +0 -338
- jolt/plugins/ftp.py +0 -181
- jolt/plugins/ninja-cache.py +0 -64
- jolt/plugins/ninjacli.py +0 -271
- jolt/plugins/repo.py +0 -253
- jolt-0.9.76.dist-info/RECORD +0 -79
- {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/entry_points.txt +0 -0
- {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/top_level.txt +0 -0
jolt/common_pb2.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: jolt/common.proto
|
|
4
|
+
"""Generated protocol buffer code."""
|
|
5
|
+
from google.protobuf import descriptor as _descriptor
|
|
6
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
7
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
8
|
+
from google.protobuf.internal import builder as _builder
|
|
9
|
+
# @@protoc_insertion_point(imports)
|
|
10
|
+
|
|
11
|
+
_sym_db = _symbol_database.Default()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11jolt/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"-\n\x06\x44igest\x12\x16\n\talgorithm\x18\x01 \x01(\tR\x03\x61lg\x12\x0b\n\x03hex\x18\x02 \x01(\t\"o\n\x07LogLine\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12(\n\x04time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x63ontext\x18\x03 \x01(\t\x12\x0f\n\x07message\x18\x04 \x01(\t\"&\n\x08Property\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\")\n\x08Platform\x12\x1d\n\nproperties\x18\x01 \x03(\x0b\x32\t.Property\"\x83\x01\n\x04Task\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x10\n\x08instance\x18\x03 \x01(\t\x12\r\n\x05taint\x18\x04 \x01(\t\x12\x1d\n\nproperties\x18\x05 \x03(\x0b\x32\t.Property\x12\x1b\n\x08platform\x18\x06 \x01(\x0b\x32\t.Platform\"M\n\tTaskError\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x10\n\x08location\x18\x02 \x01(\t\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x0f\n\x07\x64\x65tails\x18\x04 \x01(\t\"5\n\x04\x46ile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06\x64igest\x18\x02 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\t\"\xf1\x01\n\x07Project\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x05paths\x18\x02 \x03(\x0b\x32\x13.Project.SystemPath\x12 \n\x07recipes\x18\x03 \x03(\x0b\x32\x0f.Project.Recipe\x12$\n\tresources\x18\x04 \x03(\x0b\x32\x11.Project.Resource\x1a\x1a\n\nSystemPath\x12\x0c\n\x04path\x18\x01 \x01(\t\x1a\'\n\x08Resource\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x1a\'\n\x06Recipe\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07workdir\x18\x03 \x01(\t\"\x8e\x01\n\tWorkspace\x12\x0f\n\x07rootdir\x18\x01 \x01(\t\x12\x10\n\x08\x63\x61\x63hedir\x18\x02 \x01(\t\x12\x14\n\x05\x66iles\x18\x03 \x03(\x0b\x32\x05.File\x12\x1a\n\x08projects\x18\x04 \x03(\x0b\x32\x08.Project\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04tree\x18\x06 \x01(\t\x12\x10\n\x08\x62uilddir\x18\x07 \x01(\t\"i\n\x06\x43lient\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0c\n\x04tree\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\x14\n\x0crequirements\x18\x05 \x03(\t\x12\x0b\n\x03nix\x18\x06 \x01(\x08\"\x99\x02\n\x10\x42uildEnvironment\x12\x17\n\x06\x63lient\x18\x01 \x01(\x0b\x32\x07.Client\x12\x1d\n\tworkspace\x18\x02 \x01(\x0b\x32\n.Workspace\x12\x1d\n\nparameters\x18\x03 \x03(\x0b\x32\t.Property\x12\x1f\n\x17task_default_parameters\x18\x04 \x03(\t\x12+\n\x05tasks\x18\x05 \x03(\x0b\x32\x1c.BuildEnvironment.TasksEntry\x12\x1b\n\x08loglevel\x18\x06 \x01(\x0e\x32\t.LogLevel\x12\x0e\n\x06\x63onfig\x18\x07 \x01(\t\x1a\x33\n\nTasksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x14\n\x05value\x18\x02 \x01(\x0b\x32\x05.Task:\x02\x38\x01*k\n\x08LogLevel\x12\r\n\tEXCEPTION\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x0b\n\x07VERBOSE\x10\x02\x12\n\n\x06STDOUT\x10\x03\x12\x08\n\x04INFO\x10\x04\x12\x0b\n\x07WARNING\x10\x05\x12\t\n\x05\x45RROR\x10\x06\x12\n\n\x06STDERR\x10\x07*_\n\x0b\x42uildStatus\x12\x12\n\x0e\x42UILD_ACCEPTED\x10\x00\x12\x12\n\x0e\x42UILD_REJECTED\x10\x01\x12\x13\n\x0f\x42UILD_COMPLETED\x10\x03\x12\x13\n\x0f\x42UILD_CANCELLED\x10\x04*\xd4\x01\n\nTaskStatus\x12\x0f\n\x0bTASK_QUEUED\x10\x00\x12\x10\n\x0cTASK_RUNNING\x10\x01\x12\x0f\n\x0bTASK_FAILED\x10\x02\x12\x0f\n\x0bTASK_PASSED\x10\x03\x12\x11\n\rTASK_UNSTABLE\x10\x04\x12\x13\n\x0fTASK_DOWNLOADED\x10\x05\x12\x11\n\rTASK_UPLOADED\x10\x06\x12\x10\n\x0cTASK_SKIPPED\x10\x07\x12\x12\n\x0eTASK_CANCELLED\x10\x08\x12\x0e\n\nTASK_ERROR\x10\t\x12\x10\n\x0cTASK_CREATED\x10\nB\x0eZ\x0cpkg/protocolb\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'jolt.common_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
_globals['DESCRIPTOR']._options = None
|
|
24
|
+
_globals['DESCRIPTOR']._serialized_options = b'Z\014pkg/protocol'
|
|
25
|
+
_globals['_BUILDENVIRONMENT_TASKSENTRY']._options = None
|
|
26
|
+
_globals['_BUILDENVIRONMENT_TASKSENTRY']._serialized_options = b'8\001'
|
|
27
|
+
_globals['_LOGLEVEL']._serialized_start=1345
|
|
28
|
+
_globals['_LOGLEVEL']._serialized_end=1452
|
|
29
|
+
_globals['_BUILDSTATUS']._serialized_start=1454
|
|
30
|
+
_globals['_BUILDSTATUS']._serialized_end=1549
|
|
31
|
+
_globals['_TASKSTATUS']._serialized_start=1552
|
|
32
|
+
_globals['_TASKSTATUS']._serialized_end=1764
|
|
33
|
+
_globals['_DIGEST']._serialized_start=54
|
|
34
|
+
_globals['_DIGEST']._serialized_end=99
|
|
35
|
+
_globals['_LOGLINE']._serialized_start=101
|
|
36
|
+
_globals['_LOGLINE']._serialized_end=212
|
|
37
|
+
_globals['_PROPERTY']._serialized_start=214
|
|
38
|
+
_globals['_PROPERTY']._serialized_end=252
|
|
39
|
+
_globals['_PLATFORM']._serialized_start=254
|
|
40
|
+
_globals['_PLATFORM']._serialized_end=295
|
|
41
|
+
_globals['_TASK']._serialized_start=298
|
|
42
|
+
_globals['_TASK']._serialized_end=429
|
|
43
|
+
_globals['_TASKERROR']._serialized_start=431
|
|
44
|
+
_globals['_TASKERROR']._serialized_end=508
|
|
45
|
+
_globals['_FILE']._serialized_start=510
|
|
46
|
+
_globals['_FILE']._serialized_end=563
|
|
47
|
+
_globals['_PROJECT']._serialized_start=566
|
|
48
|
+
_globals['_PROJECT']._serialized_end=807
|
|
49
|
+
_globals['_PROJECT_SYSTEMPATH']._serialized_start=699
|
|
50
|
+
_globals['_PROJECT_SYSTEMPATH']._serialized_end=725
|
|
51
|
+
_globals['_PROJECT_RESOURCE']._serialized_start=727
|
|
52
|
+
_globals['_PROJECT_RESOURCE']._serialized_end=766
|
|
53
|
+
_globals['_PROJECT_RECIPE']._serialized_start=768
|
|
54
|
+
_globals['_PROJECT_RECIPE']._serialized_end=807
|
|
55
|
+
_globals['_WORKSPACE']._serialized_start=810
|
|
56
|
+
_globals['_WORKSPACE']._serialized_end=952
|
|
57
|
+
_globals['_CLIENT']._serialized_start=954
|
|
58
|
+
_globals['_CLIENT']._serialized_end=1059
|
|
59
|
+
_globals['_BUILDENVIRONMENT']._serialized_start=1062
|
|
60
|
+
_globals['_BUILDENVIRONMENT']._serialized_end=1343
|
|
61
|
+
_globals['_BUILDENVIRONMENT_TASKSENTRY']._serialized_start=1292
|
|
62
|
+
_globals['_BUILDENVIRONMENT_TASKSENTRY']._serialized_end=1343
|
|
63
|
+
# @@protoc_insertion_point(module_scope)
|
jolt/common_pb2_grpc.py
ADDED
jolt/config.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
from configparser import ConfigParser, NoOptionError, NoSectionError
|
|
2
|
+
from urllib.parse import urlparse
|
|
2
3
|
import os
|
|
4
|
+
import re
|
|
3
5
|
|
|
6
|
+
from jolt import common_pb2 as common_pb
|
|
4
7
|
from jolt import filesystem as fs
|
|
5
8
|
from jolt import utils
|
|
6
9
|
from jolt.error import raise_error_if
|
|
7
|
-
from jolt.manifest import ManifestExtension, ManifestExtensionRegistry
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
_workdir = os.getcwd()
|
|
@@ -13,13 +15,18 @@ _workdir = os.getcwd()
|
|
|
13
15
|
if os.getenv("JOLT_CONFIG_PATH"):
|
|
14
16
|
location = fs.path.join(os.getenv("JOLT_CONFIG_PATH"), "config")
|
|
15
17
|
location_user = fs.path.join(os.getenv("JOLT_CONFIG_PATH"), "user")
|
|
18
|
+
location_overlay = os.getenv("JOLT_CONFIG_OVERLAY")
|
|
19
|
+
if location_overlay:
|
|
20
|
+
location_overlay = fs.path.join(os.getenv("JOLT_CONFIG_PATH"), location_overlay)
|
|
16
21
|
elif os.name == "nt":
|
|
17
22
|
appdata = os.getenv("APPDATA", fs.path.join(fs.userhome(), "AppData", "Roaming"))
|
|
18
23
|
location = fs.path.join(appdata, "Jolt", "config")
|
|
19
24
|
location_user = fs.path.join(appdata, "Jolt", "user")
|
|
25
|
+
location_overlay = os.getenv("JOLT_CONFIG_OVERLAY")
|
|
20
26
|
else:
|
|
21
27
|
location = fs.path.join(fs.userhome(), ".config", "jolt", "config")
|
|
22
28
|
location_user = fs.path.join(fs.userhome(), ".config", "jolt", "user")
|
|
29
|
+
location_overlay = os.getenv("JOLT_CONFIG_OVERLAY")
|
|
23
30
|
|
|
24
31
|
|
|
25
32
|
class ConfigFile(ConfigParser):
|
|
@@ -37,10 +44,10 @@ class ConfigFile(ConfigParser):
|
|
|
37
44
|
if not self.has_section("jolt"):
|
|
38
45
|
self.add_section("jolt")
|
|
39
46
|
|
|
40
|
-
def save(self):
|
|
41
|
-
if self._location is None:
|
|
47
|
+
def save(self, path=None):
|
|
48
|
+
if self._location is None and path is None:
|
|
42
49
|
return
|
|
43
|
-
with open(self._location, 'w') as configfile:
|
|
50
|
+
with open(path or self._location, 'w') as configfile:
|
|
44
51
|
super().write(configfile)
|
|
45
52
|
|
|
46
53
|
def delete(self, section, key):
|
|
@@ -122,14 +129,16 @@ class Config(object):
|
|
|
122
129
|
for config in self.configs():
|
|
123
130
|
config.load()
|
|
124
131
|
|
|
125
|
-
def save(self):
|
|
126
|
-
for config in self.
|
|
127
|
-
config.save()
|
|
132
|
+
def save(self, path=None):
|
|
133
|
+
for name, config in self._configs:
|
|
134
|
+
config.save(os.path.join(path, f"{name}.conf") if path else None)
|
|
128
135
|
|
|
129
136
|
|
|
130
137
|
_config = Config()
|
|
131
138
|
_config.add_file("global", location)
|
|
132
139
|
_config.add_file("user", location_user)
|
|
140
|
+
if location_overlay:
|
|
141
|
+
_config.add_file("overlay", location_overlay)
|
|
133
142
|
_manifest = _config.add_file("manifest", None)
|
|
134
143
|
# Note: cli configs are added next to last in the chain,
|
|
135
144
|
# before manifest, and can therefore not override the
|
|
@@ -144,30 +153,51 @@ def get(section, key, default=None, expand=True, alias=None):
|
|
|
144
153
|
|
|
145
154
|
|
|
146
155
|
def getint(section, key, default=None, alias=None):
|
|
147
|
-
|
|
156
|
+
value = get(section, key, default=default, alias=alias)
|
|
157
|
+
if value is not None:
|
|
158
|
+
try:
|
|
159
|
+
return int(value)
|
|
160
|
+
except ValueError:
|
|
161
|
+
raise_error_if(True, "Config: value '{0}' invalid for '{1}.{2}', expected integer", value, section, key)
|
|
162
|
+
return None
|
|
148
163
|
|
|
149
164
|
|
|
150
165
|
def getsize(section, key, default=None, alias=None):
|
|
151
|
-
units = {
|
|
166
|
+
units = {
|
|
167
|
+
None: 1,
|
|
168
|
+
"B": 1,
|
|
169
|
+
|
|
170
|
+
"K": 1000,
|
|
171
|
+
"M": 1000**2,
|
|
172
|
+
"G": 1000**3,
|
|
173
|
+
"T": 1000**4,
|
|
174
|
+
"P": 1000**5,
|
|
175
|
+
"E": 1000**6,
|
|
176
|
+
|
|
177
|
+
"Ki": 1024,
|
|
178
|
+
"Mi": 1024**2,
|
|
179
|
+
"Gi": 1024**3,
|
|
180
|
+
"Ti": 1024**4,
|
|
181
|
+
"Pi": 1024**5,
|
|
182
|
+
"Ei": 1024**6,
|
|
183
|
+
}
|
|
184
|
+
|
|
152
185
|
value = get(section, key, default=None, alias=alias)
|
|
153
186
|
if value is None:
|
|
154
|
-
if type(default)
|
|
187
|
+
if type(default) is int:
|
|
155
188
|
return default
|
|
156
189
|
else:
|
|
157
190
|
value = str(default)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
raise_error_if(
|
|
164
|
-
len(value) != 2,
|
|
165
|
-
"Config: size '{2}' invalid for '{0}.{1}', expected '<size> <unit>'", value, section, key)
|
|
166
|
-
size, unit = value[0], value[1]
|
|
191
|
+
|
|
192
|
+
m = re.search(r"^(0|[1-9][0-9]*) ?([KMGTPE]i?)?B?$", value)
|
|
193
|
+
raise_error_if(
|
|
194
|
+
not m,
|
|
195
|
+
"Config: size '{0}' invalid for '{1}.{2}', expected '<size> <unit>'", value, section, key)
|
|
167
196
|
raise_error_if(
|
|
168
|
-
|
|
169
|
-
"Config: unit invalid for '{0}.{1}', expected [B,K,M,G,T]", section, key)
|
|
170
|
-
|
|
197
|
+
m[2] not in units,
|
|
198
|
+
"Config: unit invalid for '{0}.{1}', expected [B,K,M,G,T,P,E,Mi,Gi,Ti,Pi,Ei]", section, key)
|
|
199
|
+
|
|
200
|
+
return int(m[1]) * units.get(m[2], 1)
|
|
171
201
|
|
|
172
202
|
|
|
173
203
|
def getfloat(section, key, default=None, alias=None):
|
|
@@ -179,6 +209,13 @@ def getboolean(section, key, default=None, alias=None):
|
|
|
179
209
|
return value is not None and str(value).lower() in ["true", "yes", "on", "1"]
|
|
180
210
|
|
|
181
211
|
|
|
212
|
+
def geturi(section, key, default=None, alias=None):
|
|
213
|
+
value = get(section, key, default=default, alias=alias)
|
|
214
|
+
if value is None:
|
|
215
|
+
return None
|
|
216
|
+
return urlparse(value)
|
|
217
|
+
|
|
218
|
+
|
|
182
219
|
def get_jolthome():
|
|
183
220
|
if os.name == "nt":
|
|
184
221
|
return fs.path.join(os.getenv("LOCALAPPDATA", fs.path.join(fs.userhome(), "AppData", "Local")), "Jolt")
|
|
@@ -187,7 +224,7 @@ def get_jolthome():
|
|
|
187
224
|
|
|
188
225
|
|
|
189
226
|
def get_logpath():
|
|
190
|
-
return get_jolthome()
|
|
227
|
+
return get("jolt", "logpath", get_jolthome())
|
|
191
228
|
|
|
192
229
|
|
|
193
230
|
def get_cachedir():
|
|
@@ -209,6 +246,23 @@ def get_shell():
|
|
|
209
246
|
return get("jolt", "shell", cmd)
|
|
210
247
|
|
|
211
248
|
|
|
249
|
+
def get_keep_going():
|
|
250
|
+
return getboolean("params", "keep_going", False)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def is_incremental_build():
|
|
254
|
+
"""
|
|
255
|
+
Whether to enable incremental builds.
|
|
256
|
+
|
|
257
|
+
If disabled, all build directories are deleted upon completion of tasks.
|
|
258
|
+
"""
|
|
259
|
+
return getboolean("jolt", "incremental_dirs", True)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def set_keep_going(value=False):
|
|
263
|
+
return set("params", "keep_going", str(value).lower())
|
|
264
|
+
|
|
265
|
+
|
|
212
266
|
def set(section, key, value, alias=None):
|
|
213
267
|
_config.set(section, key, value, alias or "user")
|
|
214
268
|
|
|
@@ -229,8 +283,8 @@ def load_or_set(file_or_str):
|
|
|
229
283
|
_config.set(section_key[0], section_key[1], key_value[1], alias="cli")
|
|
230
284
|
|
|
231
285
|
|
|
232
|
-
def save():
|
|
233
|
-
_config.save()
|
|
286
|
+
def save(path=None):
|
|
287
|
+
_config.save(path)
|
|
234
288
|
|
|
235
289
|
|
|
236
290
|
def delete(key, alias=None):
|
|
@@ -263,25 +317,28 @@ def split(string):
|
|
|
263
317
|
return section, key
|
|
264
318
|
|
|
265
319
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
320
|
+
def import_config(snippet: str):
|
|
321
|
+
""" Apply extra configuration for the worker, provided by the client. """
|
|
322
|
+
_manifest.read_string(snippet)
|
|
323
|
+
from jolt.loader import JoltLoader
|
|
324
|
+
JoltLoader.get().load_plugins()
|
|
325
|
+
|
|
269
326
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
p.value = value
|
|
327
|
+
def export_config():
|
|
328
|
+
""" Get extra configuration for the worker. """
|
|
329
|
+
return get("network", "config", "", expand=False)
|
|
274
330
|
|
|
275
|
-
def import_manifest(self, manifest):
|
|
276
|
-
if manifest.config:
|
|
277
|
-
_manifest.read_string(manifest.config)
|
|
278
|
-
from jolt.loader import JoltLoader
|
|
279
|
-
JoltLoader.get().load_plugins()
|
|
280
331
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
332
|
+
def import_params(params: dict):
|
|
333
|
+
""" Apply user-defined parameters (-c params.key=value). """
|
|
334
|
+
for key, value in params.items():
|
|
335
|
+
if key.startswith("config."):
|
|
336
|
+
set("params", key.split(".", 1)[1], value)
|
|
284
337
|
|
|
285
338
|
|
|
286
|
-
|
|
287
|
-
|
|
339
|
+
def export_params():
|
|
340
|
+
""" Get user-defined parameters (-c params.key=value). """
|
|
341
|
+
parameters = []
|
|
342
|
+
for key, value in options("params"):
|
|
343
|
+
parameters.append(common_pb.Property(key="config." + key, value=value))
|
|
344
|
+
return parameters
|
jolt/error.py
CHANGED
|
@@ -4,17 +4,30 @@ from jolt import utils
|
|
|
4
4
|
|
|
5
5
|
class JoltError(Exception):
|
|
6
6
|
def __init__(self, *args, **kwargs):
|
|
7
|
-
super(
|
|
7
|
+
super().__init__(*args, **kwargs)
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class JoltCommandError(JoltError):
|
|
11
11
|
def __init__(self, what, stdout=[], stderr=[], returncode=None, *args, **kwargs):
|
|
12
|
-
super(
|
|
12
|
+
super().__init__(what, *args, **kwargs)
|
|
13
13
|
self.stdout = stdout
|
|
14
14
|
self.stderr = stderr
|
|
15
15
|
self.returncode = returncode
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
class JoltTimeoutError(JoltError):
|
|
19
|
+
def __init__(self, *args, **kwargs):
|
|
20
|
+
super().__init__(*args, **kwargs)
|
|
21
|
+
|
|
22
|
+
def __str__(self):
|
|
23
|
+
return super().__str__() or "Timeout"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class LoggedJoltError(JoltError):
|
|
27
|
+
def __init__(self, exc):
|
|
28
|
+
self.exc = exc
|
|
29
|
+
|
|
30
|
+
|
|
18
31
|
def raise_error(msg, *args, **kwargs):
|
|
19
32
|
raise JoltError(msg.format(*args, **kwargs))
|
|
20
33
|
|
|
@@ -23,8 +36,10 @@ def raise_task_error(task, msg, *args, **kwargs):
|
|
|
23
36
|
if task:
|
|
24
37
|
with utils.ignore_exception():
|
|
25
38
|
with task.report() as report:
|
|
26
|
-
report.add_error(
|
|
27
|
-
|
|
39
|
+
report.add_error(
|
|
40
|
+
kwargs.pop("type", "Error"),
|
|
41
|
+
inspection.getfile(task.__class__),
|
|
42
|
+
msg.format(*args, **kwargs))
|
|
28
43
|
raise_error(msg + " (" + str(task) + ")", *args, **kwargs)
|
|
29
44
|
else:
|
|
30
45
|
raise_error(msg, *args, **kwargs)
|
jolt/expires.py
CHANGED
|
@@ -79,9 +79,9 @@ class ArtifactEvictionStrategyRegister(object):
|
|
|
79
79
|
self.strategies[strategy.name] = strategy
|
|
80
80
|
|
|
81
81
|
def find(self, expiration_data):
|
|
82
|
-
if type(expiration_data)
|
|
82
|
+
if type(expiration_data) is str:
|
|
83
83
|
return self.strategies.get(expiration_data, Immediately)()
|
|
84
|
-
if type(expiration_data)
|
|
84
|
+
if type(expiration_data) is dict:
|
|
85
85
|
for strategy, data in expiration_data.items():
|
|
86
86
|
strategy = self.strategies.get(strategy)
|
|
87
87
|
return strategy(**data) if strategy else Immediately()
|
jolt/filesystem.py
CHANGED
|
@@ -25,6 +25,12 @@ def as_dirpath(path):
|
|
|
25
25
|
return path if path[-1] == sep else path + sep
|
|
26
26
|
|
|
27
27
|
|
|
28
|
+
def as_canonpath(path):
|
|
29
|
+
if os.path.isabs(path):
|
|
30
|
+
path = os.path.join("root", os.path.relpath(path, "/"))
|
|
31
|
+
return path.replace("..", "__")
|
|
32
|
+
|
|
33
|
+
|
|
28
34
|
def is_relative_to(pathname, rootdir):
|
|
29
35
|
try:
|
|
30
36
|
pathlib.Path(pathname).relative_to(pathlib.Path(rootdir))
|
|
@@ -82,10 +88,10 @@ def move(src, dst):
|
|
|
82
88
|
|
|
83
89
|
def onerror_warning(func, path, exc_info):
|
|
84
90
|
from jolt import log
|
|
85
|
-
if
|
|
91
|
+
if hasattr(exc_info[1], "strerror"):
|
|
86
92
|
msg = exc_info[1].strerror
|
|
87
93
|
else:
|
|
88
|
-
msg = "Reason unknown"
|
|
94
|
+
msg = "Reason unknown: " + str(exc_info[1])
|
|
89
95
|
if os.path.exists(path):
|
|
90
96
|
log.warning("Could not remove file or directory: {} ({})", path, msg)
|
|
91
97
|
|
|
@@ -232,7 +238,3 @@ def scandir(scanpath, filterfn=lambda path: path[0] != ".", relative=False):
|
|
|
232
238
|
for path, dirs, files in os.walk(scanpath)
|
|
233
239
|
for f in files
|
|
234
240
|
if filterfn(f)]
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
def get_archive(path):
|
|
238
|
-
return path + ".tar.gz"
|