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.

Potentially problematic release.


This version of jolt might be problematic. Click here for more details.

Files changed (201) hide show
  1. jolt/__init__.py +88 -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 +839 -367
  6. jolt/chroot.py +156 -0
  7. jolt/cli.py +362 -143
  8. jolt/common_pb2.py +63 -0
  9. jolt/common_pb2_grpc.py +4 -0
  10. jolt/config.py +99 -42
  11. jolt/error.py +19 -4
  12. jolt/expires.py +2 -2
  13. jolt/filesystem.py +8 -6
  14. jolt/graph.py +705 -117
  15. jolt/hooks.py +63 -1
  16. jolt/influence.py +129 -6
  17. jolt/loader.py +369 -121
  18. jolt/log.py +225 -63
  19. jolt/manifest.py +28 -38
  20. jolt/options.py +35 -10
  21. jolt/pkgs/abseil.py +42 -0
  22. jolt/pkgs/asio.py +25 -0
  23. jolt/pkgs/autoconf.py +41 -0
  24. jolt/pkgs/automake.py +41 -0
  25. jolt/pkgs/b2.py +31 -0
  26. jolt/pkgs/boost.py +111 -0
  27. jolt/pkgs/boringssl.py +32 -0
  28. jolt/pkgs/busybox.py +39 -0
  29. jolt/pkgs/bzip2.py +43 -0
  30. jolt/pkgs/cares.py +29 -0
  31. jolt/pkgs/catch2.py +36 -0
  32. jolt/pkgs/cbindgen.py +17 -0
  33. jolt/pkgs/cista.py +19 -0
  34. jolt/pkgs/clang.py +44 -0
  35. jolt/pkgs/cli11.py +23 -0
  36. jolt/pkgs/cmake.py +48 -0
  37. jolt/pkgs/cpython.py +196 -0
  38. jolt/pkgs/crun.py +29 -0
  39. jolt/pkgs/curl.py +38 -0
  40. jolt/pkgs/dbus.py +18 -0
  41. jolt/pkgs/double_conversion.py +24 -0
  42. jolt/pkgs/fastfloat.py +21 -0
  43. jolt/pkgs/ffmpeg.py +28 -0
  44. jolt/pkgs/flatbuffers.py +29 -0
  45. jolt/pkgs/fmt.py +27 -0
  46. jolt/pkgs/fstree.py +20 -0
  47. jolt/pkgs/gflags.py +18 -0
  48. jolt/pkgs/glib.py +18 -0
  49. jolt/pkgs/glog.py +25 -0
  50. jolt/pkgs/glslang.py +21 -0
  51. jolt/pkgs/golang.py +16 -11
  52. jolt/pkgs/googlebenchmark.py +18 -0
  53. jolt/pkgs/googletest.py +46 -0
  54. jolt/pkgs/gperf.py +15 -0
  55. jolt/pkgs/grpc.py +73 -0
  56. jolt/pkgs/hdf5.py +19 -0
  57. jolt/pkgs/help2man.py +14 -0
  58. jolt/pkgs/inja.py +28 -0
  59. jolt/pkgs/jsoncpp.py +31 -0
  60. jolt/pkgs/libarchive.py +43 -0
  61. jolt/pkgs/libcap.py +44 -0
  62. jolt/pkgs/libdrm.py +44 -0
  63. jolt/pkgs/libedit.py +42 -0
  64. jolt/pkgs/libevent.py +31 -0
  65. jolt/pkgs/libexpat.py +27 -0
  66. jolt/pkgs/libfastjson.py +21 -0
  67. jolt/pkgs/libffi.py +16 -0
  68. jolt/pkgs/libglvnd.py +30 -0
  69. jolt/pkgs/libogg.py +28 -0
  70. jolt/pkgs/libpciaccess.py +18 -0
  71. jolt/pkgs/libseccomp.py +21 -0
  72. jolt/pkgs/libtirpc.py +24 -0
  73. jolt/pkgs/libtool.py +42 -0
  74. jolt/pkgs/libunwind.py +35 -0
  75. jolt/pkgs/libva.py +18 -0
  76. jolt/pkgs/libvorbis.py +33 -0
  77. jolt/pkgs/libxml2.py +35 -0
  78. jolt/pkgs/libxslt.py +17 -0
  79. jolt/pkgs/libyajl.py +16 -0
  80. jolt/pkgs/llvm.py +81 -0
  81. jolt/pkgs/lua.py +54 -0
  82. jolt/pkgs/lz4.py +26 -0
  83. jolt/pkgs/m4.py +14 -0
  84. jolt/pkgs/make.py +17 -0
  85. jolt/pkgs/mesa.py +81 -0
  86. jolt/pkgs/meson.py +17 -0
  87. jolt/pkgs/mstch.py +28 -0
  88. jolt/pkgs/mysql.py +60 -0
  89. jolt/pkgs/nasm.py +49 -0
  90. jolt/pkgs/ncurses.py +30 -0
  91. jolt/pkgs/ng_log.py +25 -0
  92. jolt/pkgs/ninja.py +45 -0
  93. jolt/pkgs/nlohmann_json.py +25 -0
  94. jolt/pkgs/nodejs.py +19 -11
  95. jolt/pkgs/opencv.py +24 -0
  96. jolt/pkgs/openjdk.py +26 -0
  97. jolt/pkgs/openssl.py +103 -0
  98. jolt/pkgs/paho.py +76 -0
  99. jolt/pkgs/patchelf.py +16 -0
  100. jolt/pkgs/perl.py +42 -0
  101. jolt/pkgs/pkgconfig.py +64 -0
  102. jolt/pkgs/poco.py +39 -0
  103. jolt/pkgs/protobuf.py +77 -0
  104. jolt/pkgs/pugixml.py +27 -0
  105. jolt/pkgs/python.py +19 -0
  106. jolt/pkgs/qt.py +35 -0
  107. jolt/pkgs/rapidjson.py +26 -0
  108. jolt/pkgs/rapidyaml.py +28 -0
  109. jolt/pkgs/re2.py +30 -0
  110. jolt/pkgs/re2c.py +17 -0
  111. jolt/pkgs/readline.py +15 -0
  112. jolt/pkgs/rust.py +41 -0
  113. jolt/pkgs/sdl.py +28 -0
  114. jolt/pkgs/simdjson.py +27 -0
  115. jolt/pkgs/soci.py +46 -0
  116. jolt/pkgs/spdlog.py +29 -0
  117. jolt/pkgs/spirv_llvm.py +21 -0
  118. jolt/pkgs/spirv_tools.py +24 -0
  119. jolt/pkgs/sqlite.py +83 -0
  120. jolt/pkgs/ssl.py +12 -0
  121. jolt/pkgs/texinfo.py +15 -0
  122. jolt/pkgs/tomlplusplus.py +22 -0
  123. jolt/pkgs/wayland.py +26 -0
  124. jolt/pkgs/x11.py +58 -0
  125. jolt/pkgs/xerces_c.py +20 -0
  126. jolt/pkgs/xorg.py +360 -0
  127. jolt/pkgs/xz.py +29 -0
  128. jolt/pkgs/yamlcpp.py +30 -0
  129. jolt/pkgs/zeromq.py +47 -0
  130. jolt/pkgs/zlib.py +69 -0
  131. jolt/pkgs/zstd.py +33 -0
  132. jolt/plugins/alias.py +3 -0
  133. jolt/plugins/allure.py +5 -2
  134. jolt/plugins/autotools.py +66 -0
  135. jolt/plugins/cache.py +133 -0
  136. jolt/plugins/cmake.py +74 -6
  137. jolt/plugins/conan.py +238 -0
  138. jolt/plugins/cxx.py +698 -0
  139. jolt/plugins/cxxinfo.py +7 -0
  140. jolt/plugins/dashboard.py +1 -1
  141. jolt/plugins/docker.py +91 -23
  142. jolt/plugins/email.py +5 -2
  143. jolt/plugins/email.xslt +144 -101
  144. jolt/plugins/environ.py +11 -0
  145. jolt/plugins/fetch.py +141 -0
  146. jolt/plugins/gdb.py +44 -21
  147. jolt/plugins/gerrit.py +1 -14
  148. jolt/plugins/git.py +316 -101
  149. jolt/plugins/googletest.py +522 -1
  150. jolt/plugins/http.py +36 -38
  151. jolt/plugins/libtool.py +63 -0
  152. jolt/plugins/linux.py +990 -0
  153. jolt/plugins/logstash.py +4 -4
  154. jolt/plugins/meson.py +61 -0
  155. jolt/plugins/ninja-compdb.py +107 -31
  156. jolt/plugins/ninja.py +929 -134
  157. jolt/plugins/paths.py +11 -1
  158. jolt/plugins/pkgconfig.py +219 -0
  159. jolt/plugins/podman.py +148 -91
  160. jolt/plugins/python.py +137 -0
  161. jolt/plugins/remote_execution/__init__.py +0 -0
  162. jolt/plugins/remote_execution/administration_pb2.py +46 -0
  163. jolt/plugins/remote_execution/administration_pb2_grpc.py +170 -0
  164. jolt/plugins/remote_execution/log_pb2.py +32 -0
  165. jolt/plugins/remote_execution/log_pb2_grpc.py +68 -0
  166. jolt/plugins/remote_execution/scheduler_pb2.py +41 -0
  167. jolt/plugins/remote_execution/scheduler_pb2_grpc.py +141 -0
  168. jolt/plugins/remote_execution/worker_pb2.py +38 -0
  169. jolt/plugins/remote_execution/worker_pb2_grpc.py +112 -0
  170. jolt/plugins/report.py +12 -2
  171. jolt/plugins/rust.py +25 -0
  172. jolt/plugins/scheduler.py +710 -0
  173. jolt/plugins/selfdeploy/setup.py +9 -4
  174. jolt/plugins/selfdeploy.py +138 -88
  175. jolt/plugins/strings.py +35 -22
  176. jolt/plugins/symlinks.py +26 -11
  177. jolt/plugins/telemetry.py +5 -2
  178. jolt/plugins/timeline.py +13 -3
  179. jolt/plugins/volume.py +46 -48
  180. jolt/scheduler.py +591 -191
  181. jolt/tasks.py +1783 -245
  182. jolt/templates/export.sh.template +12 -6
  183. jolt/templates/timeline.html.template +44 -47
  184. jolt/timer.py +22 -0
  185. jolt/tools.py +749 -302
  186. jolt/utils.py +245 -18
  187. jolt/version.py +1 -1
  188. jolt/version_utils.py +2 -2
  189. jolt/xmldom.py +12 -2
  190. {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/METADATA +98 -38
  191. jolt-0.9.429.dist-info/RECORD +207 -0
  192. {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/WHEEL +1 -1
  193. jolt/plugins/amqp.py +0 -834
  194. jolt/plugins/debian.py +0 -338
  195. jolt/plugins/ftp.py +0 -181
  196. jolt/plugins/ninja-cache.py +0 -64
  197. jolt/plugins/ninjacli.py +0 -271
  198. jolt/plugins/repo.py +0 -253
  199. jolt-0.9.76.dist-info/RECORD +0 -79
  200. {jolt-0.9.76.dist-info → jolt-0.9.429.dist-info}/entry_points.txt +0 -0
  201. {jolt-0.9.76.dist-info → jolt-0.9.429.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)