jolt 0.9.123__py3-none-any.whl → 0.9.435__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.
Files changed (196) hide show
  1. jolt/__init__.py +80 -7
  2. jolt/__main__.py +9 -1
  3. jolt/bin/fstree-darwin-x86_64 +0 -0
  4. jolt/bin/fstree-linux-x86_64 +0 -0
  5. jolt/cache.py +832 -362
  6. jolt/chroot.py +156 -0
  7. jolt/cli.py +281 -162
  8. jolt/common_pb2.py +63 -0
  9. jolt/common_pb2_grpc.py +4 -0
  10. jolt/config.py +98 -41
  11. jolt/error.py +19 -4
  12. jolt/filesystem.py +2 -6
  13. jolt/graph.py +705 -117
  14. jolt/hooks.py +43 -0
  15. jolt/influence.py +122 -3
  16. jolt/loader.py +369 -121
  17. jolt/log.py +225 -63
  18. jolt/manifest.py +28 -38
  19. jolt/options.py +35 -10
  20. jolt/pkgs/abseil.py +42 -0
  21. jolt/pkgs/asio.py +25 -0
  22. jolt/pkgs/autoconf.py +41 -0
  23. jolt/pkgs/automake.py +41 -0
  24. jolt/pkgs/b2.py +31 -0
  25. jolt/pkgs/boost.py +111 -0
  26. jolt/pkgs/boringssl.py +32 -0
  27. jolt/pkgs/busybox.py +39 -0
  28. jolt/pkgs/bzip2.py +43 -0
  29. jolt/pkgs/cares.py +29 -0
  30. jolt/pkgs/catch2.py +36 -0
  31. jolt/pkgs/cbindgen.py +17 -0
  32. jolt/pkgs/cista.py +19 -0
  33. jolt/pkgs/clang.py +44 -0
  34. jolt/pkgs/cli11.py +24 -0
  35. jolt/pkgs/cmake.py +48 -0
  36. jolt/pkgs/cpython.py +196 -0
  37. jolt/pkgs/crun.py +29 -0
  38. jolt/pkgs/curl.py +38 -0
  39. jolt/pkgs/dbus.py +18 -0
  40. jolt/pkgs/double_conversion.py +24 -0
  41. jolt/pkgs/fastfloat.py +21 -0
  42. jolt/pkgs/ffmpeg.py +28 -0
  43. jolt/pkgs/flatbuffers.py +29 -0
  44. jolt/pkgs/fmt.py +27 -0
  45. jolt/pkgs/fstree.py +20 -0
  46. jolt/pkgs/gflags.py +18 -0
  47. jolt/pkgs/glib.py +18 -0
  48. jolt/pkgs/glog.py +25 -0
  49. jolt/pkgs/glslang.py +21 -0
  50. jolt/pkgs/golang.py +16 -11
  51. jolt/pkgs/googlebenchmark.py +18 -0
  52. jolt/pkgs/googletest.py +46 -0
  53. jolt/pkgs/gperf.py +15 -0
  54. jolt/pkgs/grpc.py +73 -0
  55. jolt/pkgs/hdf5.py +19 -0
  56. jolt/pkgs/help2man.py +14 -0
  57. jolt/pkgs/inja.py +28 -0
  58. jolt/pkgs/jsoncpp.py +31 -0
  59. jolt/pkgs/libarchive.py +43 -0
  60. jolt/pkgs/libcap.py +44 -0
  61. jolt/pkgs/libdrm.py +44 -0
  62. jolt/pkgs/libedit.py +42 -0
  63. jolt/pkgs/libevent.py +31 -0
  64. jolt/pkgs/libexpat.py +27 -0
  65. jolt/pkgs/libfastjson.py +21 -0
  66. jolt/pkgs/libffi.py +16 -0
  67. jolt/pkgs/libglvnd.py +30 -0
  68. jolt/pkgs/libogg.py +28 -0
  69. jolt/pkgs/libpciaccess.py +18 -0
  70. jolt/pkgs/libseccomp.py +21 -0
  71. jolt/pkgs/libtirpc.py +24 -0
  72. jolt/pkgs/libtool.py +42 -0
  73. jolt/pkgs/libunwind.py +35 -0
  74. jolt/pkgs/libva.py +18 -0
  75. jolt/pkgs/libvorbis.py +33 -0
  76. jolt/pkgs/libxml2.py +35 -0
  77. jolt/pkgs/libxslt.py +17 -0
  78. jolt/pkgs/libyajl.py +16 -0
  79. jolt/pkgs/llvm.py +81 -0
  80. jolt/pkgs/lua.py +54 -0
  81. jolt/pkgs/lz4.py +26 -0
  82. jolt/pkgs/m4.py +14 -0
  83. jolt/pkgs/make.py +17 -0
  84. jolt/pkgs/mesa.py +81 -0
  85. jolt/pkgs/meson.py +17 -0
  86. jolt/pkgs/mstch.py +28 -0
  87. jolt/pkgs/mysql.py +60 -0
  88. jolt/pkgs/nasm.py +49 -0
  89. jolt/pkgs/ncurses.py +30 -0
  90. jolt/pkgs/ng_log.py +25 -0
  91. jolt/pkgs/ninja.py +45 -0
  92. jolt/pkgs/nlohmann_json.py +25 -0
  93. jolt/pkgs/nodejs.py +19 -11
  94. jolt/pkgs/opencv.py +24 -0
  95. jolt/pkgs/openjdk.py +26 -0
  96. jolt/pkgs/openssl.py +103 -0
  97. jolt/pkgs/paho.py +76 -0
  98. jolt/pkgs/patchelf.py +16 -0
  99. jolt/pkgs/perl.py +42 -0
  100. jolt/pkgs/pkgconfig.py +64 -0
  101. jolt/pkgs/poco.py +39 -0
  102. jolt/pkgs/protobuf.py +77 -0
  103. jolt/pkgs/pugixml.py +27 -0
  104. jolt/pkgs/python.py +19 -0
  105. jolt/pkgs/qt.py +35 -0
  106. jolt/pkgs/rapidjson.py +26 -0
  107. jolt/pkgs/rapidyaml.py +28 -0
  108. jolt/pkgs/re2.py +30 -0
  109. jolt/pkgs/re2c.py +17 -0
  110. jolt/pkgs/readline.py +15 -0
  111. jolt/pkgs/rust.py +41 -0
  112. jolt/pkgs/sdl.py +28 -0
  113. jolt/pkgs/simdjson.py +27 -0
  114. jolt/pkgs/soci.py +46 -0
  115. jolt/pkgs/spdlog.py +29 -0
  116. jolt/pkgs/spirv_llvm.py +21 -0
  117. jolt/pkgs/spirv_tools.py +24 -0
  118. jolt/pkgs/sqlite.py +83 -0
  119. jolt/pkgs/ssl.py +12 -0
  120. jolt/pkgs/texinfo.py +15 -0
  121. jolt/pkgs/tomlplusplus.py +22 -0
  122. jolt/pkgs/wayland.py +26 -0
  123. jolt/pkgs/x11.py +58 -0
  124. jolt/pkgs/xerces_c.py +20 -0
  125. jolt/pkgs/xorg.py +360 -0
  126. jolt/pkgs/xz.py +29 -0
  127. jolt/pkgs/yamlcpp.py +30 -0
  128. jolt/pkgs/zeromq.py +47 -0
  129. jolt/pkgs/zlib.py +87 -0
  130. jolt/pkgs/zstd.py +33 -0
  131. jolt/plugins/alias.py +3 -0
  132. jolt/plugins/allure.py +5 -2
  133. jolt/plugins/autotools.py +66 -0
  134. jolt/plugins/cache.py +133 -0
  135. jolt/plugins/cmake.py +74 -6
  136. jolt/plugins/conan.py +238 -0
  137. jolt/plugins/cxx.py +698 -0
  138. jolt/plugins/cxxinfo.py +7 -0
  139. jolt/plugins/dashboard.py +1 -1
  140. jolt/plugins/docker.py +80 -23
  141. jolt/plugins/email.py +2 -2
  142. jolt/plugins/email.xslt +144 -101
  143. jolt/plugins/environ.py +11 -0
  144. jolt/plugins/fetch.py +141 -0
  145. jolt/plugins/gdb.py +39 -19
  146. jolt/plugins/gerrit.py +1 -14
  147. jolt/plugins/git.py +283 -85
  148. jolt/plugins/googletest.py +2 -1
  149. jolt/plugins/http.py +36 -38
  150. jolt/plugins/libtool.py +63 -0
  151. jolt/plugins/linux.py +990 -0
  152. jolt/plugins/logstash.py +4 -4
  153. jolt/plugins/meson.py +61 -0
  154. jolt/plugins/ninja-compdb.py +99 -30
  155. jolt/plugins/ninja.py +468 -166
  156. jolt/plugins/paths.py +11 -1
  157. jolt/plugins/pkgconfig.py +219 -0
  158. jolt/plugins/podman.py +136 -92
  159. jolt/plugins/python.py +137 -0
  160. jolt/plugins/remote_execution/__init__.py +0 -0
  161. jolt/plugins/remote_execution/administration_pb2.py +46 -0
  162. jolt/plugins/remote_execution/administration_pb2_grpc.py +170 -0
  163. jolt/plugins/remote_execution/log_pb2.py +32 -0
  164. jolt/plugins/remote_execution/log_pb2_grpc.py +68 -0
  165. jolt/plugins/remote_execution/scheduler_pb2.py +41 -0
  166. jolt/plugins/remote_execution/scheduler_pb2_grpc.py +141 -0
  167. jolt/plugins/remote_execution/worker_pb2.py +38 -0
  168. jolt/plugins/remote_execution/worker_pb2_grpc.py +112 -0
  169. jolt/plugins/report.py +12 -2
  170. jolt/plugins/rust.py +25 -0
  171. jolt/plugins/scheduler.py +710 -0
  172. jolt/plugins/selfdeploy/setup.py +8 -4
  173. jolt/plugins/selfdeploy.py +138 -88
  174. jolt/plugins/strings.py +35 -22
  175. jolt/plugins/symlinks.py +26 -11
  176. jolt/plugins/telemetry.py +5 -2
  177. jolt/plugins/timeline.py +13 -3
  178. jolt/plugins/volume.py +46 -48
  179. jolt/scheduler.py +589 -192
  180. jolt/tasks.py +625 -121
  181. jolt/templates/timeline.html.template +44 -47
  182. jolt/timer.py +22 -0
  183. jolt/tools.py +638 -282
  184. jolt/utils.py +211 -7
  185. jolt/version.py +1 -1
  186. jolt/xmldom.py +12 -2
  187. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/METADATA +97 -38
  188. jolt-0.9.435.dist-info/RECORD +207 -0
  189. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/WHEEL +1 -1
  190. jolt/plugins/amqp.py +0 -834
  191. jolt/plugins/debian.py +0 -338
  192. jolt/plugins/ftp.py +0 -181
  193. jolt/plugins/repo.py +0 -253
  194. jolt-0.9.123.dist-info/RECORD +0 -77
  195. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/entry_points.txt +0 -0
  196. {jolt-0.9.123.dist-info → jolt-0.9.435.dist-info}/top_level.txt +0 -0
jolt/chroot.py ADDED
@@ -0,0 +1,156 @@
1
+ """
2
+ Helper module that sets up a mount and user namespace before executing
3
+ a command. The helper primarily bypasses the restriction on creating
4
+ namespaces from multithreaded applications (which Jolt is).
5
+ """
6
+ import argparse
7
+ from ctypes import CDLL, c_char_p
8
+ import multiprocessing
9
+ import os
10
+ import shutil
11
+ import sys
12
+
13
+ libc = CDLL("libc.so.6")
14
+
15
+ CLONE_NEWNS = 0x00020000
16
+ CLONE_NEWUSER = 0x10000000
17
+
18
+ MS_RDONLY = 1
19
+ MS_BIND = 4096
20
+ MS_REC = 16384
21
+
22
+
23
+ def prepare_bind(root, src):
24
+ src = os.path.normpath(src)
25
+ dst = os.path.normpath(os.path.join(root, src.lstrip("/")))
26
+
27
+ if os.path.isdir(src):
28
+ os.makedirs(dst, exist_ok=True)
29
+ else:
30
+ os.makedirs(os.path.dirname(dst), exist_ok=True)
31
+ with open(dst, "w"):
32
+ pass
33
+
34
+
35
+ def mount_bind(src, dst, ro=False):
36
+ src = os.path.normpath(src)
37
+ dst = os.path.normpath(dst)
38
+
39
+ assert libc.mount(
40
+ c_char_p(src.encode("utf-8")),
41
+ c_char_p(dst.encode("utf-8")),
42
+ None,
43
+ MS_BIND | MS_REC | (MS_RDONLY if ro else 0),
44
+ None) == 0, f"Failed to bind mount {src}"
45
+
46
+
47
+ def mount_overlay(src, binds, dst, temp):
48
+ src = os.path.normpath(src)
49
+ dst = os.path.normpath(dst)
50
+
51
+ upper = os.path.join(temp, "upper")
52
+ work = os.path.join(temp, "work")
53
+ os.makedirs(upper, exist_ok=True)
54
+ os.makedirs(work, exist_ok=True)
55
+
56
+ return libc.mount(
57
+ c_char_p("none".encode("utf-8")),
58
+ c_char_p(dst.encode("utf-8")),
59
+ c_char_p("overlay".encode("utf-8")),
60
+ 0,
61
+ f"lowerdir={src}:{binds},upperdir={upper},workdir={work}".encode("utf-8")) == 0
62
+
63
+
64
+ def mount_tmpfs(path):
65
+ assert libc.mount(
66
+ c_char_p("none".encode("utf-8")),
67
+ c_char_p(path.encode("utf-8")),
68
+ c_char_p("tmpfs".encode("utf-8")),
69
+ 0, None) == 0, f"Failed to mount tmpfs at '{path}'"
70
+
71
+
72
+ def main():
73
+ parser = argparse.ArgumentParser(
74
+ prog='chroot',
75
+ description='Runs a command in a chroot using linux namespaces')
76
+ parser.add_argument('command', nargs='+')
77
+ parser.add_argument('-b', '--bind', nargs="*")
78
+ parser.add_argument('-t', '--temp', required=True)
79
+ parser.add_argument('-c', '--chroot', required=True)
80
+ parser.add_argument('-d', '--chdir')
81
+ parser.add_argument('--shell', default="True")
82
+ args = parser.parse_args()
83
+
84
+ # Prepare bind mount targets outside userns
85
+ for path in args.bind or []:
86
+ prepare_bind(args.temp, path)
87
+
88
+ cwd = os.getcwd()
89
+ gid = os.getegid()
90
+ uid = os.geteuid()
91
+ gidmap = [gid, gid, 1]
92
+ uidmap = [uid, uid, 1]
93
+ gidmap = [str(i) for i in gidmap]
94
+ uidmap = [str(i) for i in uidmap]
95
+
96
+ newgidmap = shutil.which("newgidmap") or shutil.which("/usr/bin/newgidmap")
97
+ newuidmap = shutil.which("newuidmap") or shutil.which("/usr/bin/newuidmap")
98
+
99
+ sem = multiprocessing.Semaphore(0)
100
+ parent = os.getpid()
101
+ child = os.fork()
102
+ if child == 0:
103
+ sem.acquire()
104
+ pid = os.fork()
105
+ if pid == 0:
106
+ os.execve(newuidmap, [newuidmap, str(parent)] + uidmap, {})
107
+ os._exit(1)
108
+ _, status = os.waitpid(pid, 0)
109
+ assert status == 0, f"Failed to map UIDs: newuidmap exit status: {status}"
110
+ os.execve(newgidmap, [newgidmap, str(parent)] + gidmap, {})
111
+ os._exit(1)
112
+
113
+ assert libc.unshare(CLONE_NEWNS | CLONE_NEWUSER) == 0
114
+ sem.release()
115
+ _, status = os.waitpid(child, 0)
116
+ assert status == 0, f"Failed to map GIDs: newgidmap exit status: {status}"
117
+
118
+ mount_tmpfs("/mnt")
119
+ if not mount_overlay(args.chroot, args.temp, "/mnt", "/mnt"):
120
+ mount_bind(args.chroot, "/mnt", True)
121
+ mount_bind("/proc", "/mnt/proc", True)
122
+
123
+ for path in args.bind or []:
124
+ mount_bind(path, os.path.join("/mnt", os.path.relpath(path, "/")))
125
+
126
+ os.chroot("/mnt")
127
+ os.chdir(args.chdir or cwd)
128
+
129
+ # Adjust PATH to include standard paths, if missing
130
+ path = os.environ.get("PATH", None)
131
+ if path is None:
132
+ path = "/usr/local/bin:/usr/bin:/bin"
133
+ else:
134
+ path = path.split(os.pathsep)
135
+ if "/usr/local/bin" not in path:
136
+ path.append("/usr/local/bin")
137
+ if "/usr/bin" not in path:
138
+ path.append("/usr/bin")
139
+ if "/bin" not in path:
140
+ path.append("/bin")
141
+ path = os.pathsep.join(path)
142
+ os.environ["PATH"] = path
143
+
144
+ if args.shell in ["True", "true"]:
145
+ os.execve("/bin/sh", ["sh", "-c", " ".join(args.command)], os.environ)
146
+ else:
147
+ exe = shutil.which(args.command[0])
148
+ os.execve(exe, args.command, os.environ)
149
+
150
+
151
+ if __name__ == "__main__":
152
+ try:
153
+ main()
154
+ except Exception as e:
155
+ print(f"{type(e).__name__}: {e}", file=sys.stderr)
156
+ os._exit(1)