jolt 0.9.390__tar.gz → 0.9.395__tar.gz

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 (96) hide show
  1. {jolt-0.9.390 → jolt-0.9.395}/PKG-INFO +1 -1
  2. {jolt-0.9.390 → jolt-0.9.395}/jolt/cli.py +1 -1
  3. {jolt-0.9.390 → jolt-0.9.395}/jolt/influence.py +67 -2
  4. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/linux.py +49 -2
  5. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/podman.py +10 -1
  6. {jolt-0.9.390 → jolt-0.9.395}/jolt/tools.py +3 -0
  7. {jolt-0.9.390 → jolt-0.9.395}/jolt/utils.py +10 -1
  8. jolt-0.9.395/jolt/version.py +1 -0
  9. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/PKG-INFO +1 -1
  10. jolt-0.9.390/jolt/version.py +0 -1
  11. {jolt-0.9.390 → jolt-0.9.395}/README.rst +0 -0
  12. {jolt-0.9.390 → jolt-0.9.395}/jolt/__init__.py +0 -0
  13. {jolt-0.9.390 → jolt-0.9.395}/jolt/__main__.py +0 -0
  14. {jolt-0.9.390 → jolt-0.9.395}/jolt/bin/fstree-darwin-x86_64 +0 -0
  15. {jolt-0.9.390 → jolt-0.9.395}/jolt/bin/fstree-linux-x86_64 +0 -0
  16. {jolt-0.9.390 → jolt-0.9.395}/jolt/cache.py +0 -0
  17. {jolt-0.9.390 → jolt-0.9.395}/jolt/chroot.py +0 -0
  18. {jolt-0.9.390 → jolt-0.9.395}/jolt/colors.py +0 -0
  19. {jolt-0.9.390 → jolt-0.9.395}/jolt/common_pb2.py +0 -0
  20. {jolt-0.9.390 → jolt-0.9.395}/jolt/common_pb2_grpc.py +0 -0
  21. {jolt-0.9.390 → jolt-0.9.395}/jolt/config.py +0 -0
  22. {jolt-0.9.390 → jolt-0.9.395}/jolt/error.py +0 -0
  23. {jolt-0.9.390 → jolt-0.9.395}/jolt/expires.py +0 -0
  24. {jolt-0.9.390 → jolt-0.9.395}/jolt/filesystem.py +0 -0
  25. {jolt-0.9.390 → jolt-0.9.395}/jolt/graph.py +0 -0
  26. {jolt-0.9.390 → jolt-0.9.395}/jolt/hooks.py +0 -0
  27. {jolt-0.9.390 → jolt-0.9.395}/jolt/inspection.py +0 -0
  28. {jolt-0.9.390 → jolt-0.9.395}/jolt/loader.py +0 -0
  29. {jolt-0.9.390 → jolt-0.9.395}/jolt/log.py +0 -0
  30. {jolt-0.9.390 → jolt-0.9.395}/jolt/manifest.py +0 -0
  31. {jolt-0.9.390 → jolt-0.9.395}/jolt/options.py +0 -0
  32. {jolt-0.9.390 → jolt-0.9.395}/jolt/pkgs/__init__.py +0 -0
  33. {jolt-0.9.390 → jolt-0.9.395}/jolt/pkgs/golang.py +0 -0
  34. {jolt-0.9.390 → jolt-0.9.395}/jolt/pkgs/nodejs.py +0 -0
  35. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/__init__.py +0 -0
  36. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/alias.py +0 -0
  37. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/allure.py +0 -0
  38. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/autoweight.py +0 -0
  39. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/cache.py +0 -0
  40. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/cmake.py +0 -0
  41. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/conan.py +0 -0
  42. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/cxx.py +0 -0
  43. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/cxxinfo.py +0 -0
  44. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/dashboard.py +0 -0
  45. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/docker.py +0 -0
  46. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/email.py +0 -0
  47. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/email.xslt +0 -0
  48. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/environ.py +0 -0
  49. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/gdb.py +0 -0
  50. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/gerrit.py +0 -0
  51. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/git.py +0 -0
  52. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/golang.py +0 -0
  53. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/googletest.py +0 -0
  54. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/http.py +0 -0
  55. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/junit.py +0 -0
  56. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/logstash.py +0 -0
  57. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/ninja-compdb.py +0 -0
  58. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/ninja.py +0 -0
  59. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/nodejs.py +0 -0
  60. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/paths.py +0 -0
  61. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/python.py +0 -0
  62. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/__init__.py +0 -0
  63. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/administration_pb2.py +0 -0
  64. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/administration_pb2_grpc.py +0 -0
  65. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/log_pb2.py +0 -0
  66. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/log_pb2_grpc.py +0 -0
  67. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/scheduler_pb2.py +0 -0
  68. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/scheduler_pb2_grpc.py +0 -0
  69. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/worker_pb2.py +0 -0
  70. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/remote_execution/worker_pb2_grpc.py +0 -0
  71. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/report.py +0 -0
  72. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/scheduler.py +0 -0
  73. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/selfdeploy.py +0 -0
  74. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/strings.py +0 -0
  75. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/symlinks.py +0 -0
  76. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/telemetry.py +0 -0
  77. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/timeline.py +0 -0
  78. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/volume.py +0 -0
  79. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/yaml-ninja.py +0 -0
  80. {jolt-0.9.390 → jolt-0.9.395}/jolt/plugins/yamltask.py +0 -0
  81. {jolt-0.9.390 → jolt-0.9.395}/jolt/scheduler.py +0 -0
  82. {jolt-0.9.390 → jolt-0.9.395}/jolt/tasks.py +0 -0
  83. {jolt-0.9.390 → jolt-0.9.395}/jolt/templates/cxxexecutable.cmake.template +0 -0
  84. {jolt-0.9.390 → jolt-0.9.395}/jolt/templates/cxxlibrary.cmake.template +0 -0
  85. {jolt-0.9.390 → jolt-0.9.395}/jolt/templates/export.sh.template +0 -0
  86. {jolt-0.9.390 → jolt-0.9.395}/jolt/templates/timeline.html.template +0 -0
  87. {jolt-0.9.390 → jolt-0.9.395}/jolt/timer.py +0 -0
  88. {jolt-0.9.390 → jolt-0.9.395}/jolt/version_utils.py +0 -0
  89. {jolt-0.9.390 → jolt-0.9.395}/jolt/xmldom.py +0 -0
  90. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/SOURCES.txt +0 -0
  91. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/dependency_links.txt +0 -0
  92. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/entry_points.txt +0 -0
  93. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/requires.txt +0 -0
  94. {jolt-0.9.390 → jolt-0.9.395}/jolt.egg-info/top_level.txt +0 -0
  95. {jolt-0.9.390 → jolt-0.9.395}/setup.cfg +0 -0
  96. {jolt-0.9.390 → jolt-0.9.395}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jolt
3
- Version: 0.9.390
3
+ Version: 0.9.395
4
4
  Summary: A task executor
5
5
  Home-page: https://github.com/srand/jolt
6
6
  Author: Robert Andersson
@@ -375,7 +375,7 @@ def build(ctx, task, network, keep_going, default, local,
375
375
  # If asked to force rebuild, taint all goal tasks
376
376
  if force:
377
377
  for goal in dag.goals:
378
- goal.taint()
378
+ goal.get_extended_task().taint()
379
379
 
380
380
  # Collect information about artifact presence before starting prune or build
381
381
  acache.precheck(dag.persistent_artifacts, remote=not local)
@@ -3,7 +3,7 @@ import hashlib
3
3
  import os
4
4
  from pathlib import Path, PurePath
5
5
 
6
- from jolt import config
6
+ from jolt import config as jolt_config
7
7
  from jolt import inspection
8
8
  from jolt import utils
9
9
  from jolt import filesystem as fs
@@ -202,6 +202,71 @@ def source(name, obj=None):
202
202
  return _decorate
203
203
 
204
204
 
205
+ class ConfigInfluence(HashInfluenceProvider):
206
+ name = "Config"
207
+
208
+ def __init__(self, section, key):
209
+ self.section = section
210
+ self.key = key
211
+
212
+ def get_influence(self, task):
213
+ value = jolt_config.get(self.section, self.key)
214
+ if value is None:
215
+ value = "<unset>"
216
+ return "{}.{}: {}".format(self.section, self.key, value)
217
+
218
+
219
+ def config(section, key):
220
+ """ Add configuration value as hash influence.
221
+
222
+ Note that the configuration value is read at the time
223
+ when the task is prepared, not when it is executed.
224
+ This means that if the configuration value changes after
225
+ influence has been calculated, the task will not be re-executed.
226
+ This is true also in distributed mode, where the task
227
+ is prepared locally and executed remotely on a worker
228
+ where the configuration value may be different.
229
+
230
+ Args:
231
+ section (str): Name of the configuration section.
232
+ key (str): Name of the configuration key.
233
+
234
+ Example:
235
+ .. code-block:: python
236
+
237
+ from jolt import influence
238
+
239
+ @influence.config("jolt", "task_timeout")
240
+ class Example(Task):
241
+
242
+ """
243
+ def _decorate(cls):
244
+ _old_influence = cls._influence
245
+
246
+ def _influence(self, *args, **kwargs):
247
+ influence = _old_influence(self, *args, **kwargs)
248
+ influence.append(ConfigInfluence(section, key))
249
+ return influence
250
+
251
+ cls._influence = _influence
252
+ return cls
253
+
254
+ return _decorate
255
+
256
+
257
+ def global_config(section, key):
258
+ """ Register a configuration influence globally.
259
+
260
+ See :py:func:`config` for more information.
261
+
262
+ Args:
263
+ section (str): Name of the configuration section.
264
+ key (str): Name of the configuration key.
265
+ """
266
+
267
+ HashInfluenceRegistry.get().register(ConfigInfluence(section, key))
268
+
269
+
205
270
  class TaskClassSourceInfluence(HashInfluenceProvider):
206
271
  name = "Source"
207
272
 
@@ -250,7 +315,7 @@ class CacheLocationInfluence(HashInfluenceProvider):
250
315
  name = "Cache"
251
316
 
252
317
  def get_influence(self, task):
253
- return config.get_cachedir()
318
+ return jolt_config.get_cachedir()
254
319
 
255
320
 
256
321
  @HashInfluenceRegistry.Register
@@ -21,6 +21,7 @@ def linux_arch_to_container_platform(arch):
21
21
  Returns:
22
22
  - linux/amd64
23
23
  - linux/arm
24
+ - linux/arm/v5
24
25
  - linux/arm64
25
26
  - linux/mips
26
27
  - linux/ppc64
@@ -30,6 +31,7 @@ def linux_arch_to_container_platform(arch):
30
31
  platforms = {
31
32
  "arm": "linux/arm",
32
33
  "arm64": "linux/arm64",
34
+ "armv5": "linux/arm/v5",
33
35
  "mips": "linux/mips64le",
34
36
  "powerpc": "linux/ppc64le",
35
37
  "riscv": "linux/riscv64",
@@ -63,6 +65,7 @@ def linux_arch_to_debian_arch(arch):
63
65
  "amd64": "amd64",
64
66
  "arm": "armhf",
65
67
  "arm64": "arm64",
68
+ "armv5": "armel",
66
69
  "mips": "mips",
67
70
  "powerpc": "ppc64el",
68
71
  "riscv": "riscv64",
@@ -81,6 +84,7 @@ class ArchParameter(Parameter):
81
84
  - amd64
82
85
  - arm
83
86
  - arm64
87
+ - armv5
84
88
  - mips
85
89
  - powerpc
86
90
  - riscv
@@ -94,6 +98,7 @@ class ArchParameter(Parameter):
94
98
  "amd64",
95
99
  "arm",
96
100
  "arm64",
101
+ "armv5",
97
102
  "mips",
98
103
  "powerpc",
99
104
  "riscv",
@@ -111,7 +116,7 @@ class _ContainerImageBase(podman.ContainerImage):
111
116
  """ Must be subclassed """
112
117
 
113
118
  arch = ArchParameter()
114
- """ Target architecture [amd64, arm, arm64, mips, powerpc, riscv, s390, x86] """
119
+ """ Target architecture [amd64, arm, arm64, armv5, mips, powerpc, riscv, s390, x86] """
115
120
 
116
121
  @property
117
122
  def target(self):
@@ -169,13 +174,14 @@ class DebianHostSdk(Task):
169
174
  """ Must be subclassed """
170
175
 
171
176
  arch = ArchParameter()
172
- """ Target architecture [amd64, arm, arm64, mips, powerpc, riscv, s390, x86] """
177
+ """ Target architecture [amd64, arm, arm64, armv5, mips, powerpc, riscv, s390, x86] """
173
178
 
174
179
  def publish(self, artifact, tools):
175
180
  arch_to_cross_compile = {
176
181
  "amd64": "x86_64-linux-gnu-",
177
182
  "arm": "arm-linux-gnueabihf-",
178
183
  "arm64": "aarch64-linux-gnu-",
184
+ "armv5": "arm-linux-gnueabi-",
179
185
  "mips": "mips-linux-gnu-",
180
186
  "powerpc": "powerpc64-linux-gnu-",
181
187
  "riscv": "riscv64-linux-gnu-",
@@ -264,6 +270,47 @@ class Squashfs(_ContainerImageBase):
264
270
  artifact.paths.squashfs = "squashfs/{_imagefile}.squashfs"
265
271
 
266
272
 
273
+ class Ext4(_ContainerImageBase):
274
+ """
275
+ Builds an ext4 image using Podman.
276
+
277
+ The task builds a container image using the given Dockerfile and converts
278
+ the resulting container filesystem to an ext4 image which is published.
279
+
280
+ When building images for an architecture other than the host, the
281
+ binfmt-support package must be installed and configured to support running
282
+ applications for the target architecture. The package is available in most
283
+ Linux distributions.
284
+
285
+ The location of the resulting squashfs image is stored in the
286
+ ``artifact.paths.squashfs`` artifact attribute.
287
+ """
288
+ abstract = True
289
+ """ Must be subclassed """
290
+
291
+ output = ["ext4"]
292
+
293
+ size = None
294
+ """
295
+ Size of the ext4 image.
296
+
297
+ Typically used to align the image size to a supported SD card size (power of two).
298
+
299
+ Supported units are 'K', 'M', 'G', 'T'.
300
+ """
301
+
302
+ def run(self, deps, tools):
303
+ super().run(deps, tools)
304
+ if self.size:
305
+ with tools.cwd(tools.builddir("ext4")):
306
+ tools.run("fallocate -l {size} image.ext4")
307
+
308
+ def publish(self, artifact, tools):
309
+ super().publish(artifact, tools)
310
+ artifact.strings.arch = str(self.arch)
311
+ artifact.paths.ext4 = "ext4/{_imagefile}.ext4"
312
+
313
+
267
314
  class _KernelBase(Task):
268
315
  abstract = True
269
316
  """ Must be subclassed """
@@ -483,6 +483,7 @@ class ContainerImage(Task):
483
483
  - custom
484
484
  - directory
485
485
  - docker-archive
486
+ - ext4
486
487
  - oci-archive
487
488
  - oci-directory
488
489
  - squashfs
@@ -516,6 +517,9 @@ class ContainerImage(Task):
516
517
  The ``podman/login`` Jolt resource can be used for that purpose.
517
518
  """
518
519
 
520
+ size = None
521
+ """ Size of the image, e.g. "64M" (for certain output formats). """
522
+
519
523
  squash = False
520
524
  """ Squash image layers """
521
525
 
@@ -594,7 +598,7 @@ class ContainerImage(Task):
594
598
  tools.run("podman image save --format={output} {} -o {}", self.tags[0], "image.tar")
595
599
  if output == "oci-directory":
596
600
  tools.run("podman image save --format=oci-dir {} -o {}", self.tags[0], "image.dir")
597
- if output in ["archive", "cpio", "custom", "directory", "squashfs"]:
601
+ if output in ["archive", "cpio", "custom", "directory", "ext4", "squashfs"]:
598
602
  ctr = tools.run("podman create {}", self.tags[0])
599
603
  try:
600
604
  with tools.runprefix("podman unshare "):
@@ -606,6 +610,9 @@ class ContainerImage(Task):
606
610
  elif output == "cpio":
607
611
  with tools.cwd(mount_path):
608
612
  tools.run("find | podman unshare cpio -o -F {}/image.cpio -H newc", outdir, output_on_error=True)
613
+ elif output == "ext4":
614
+ assert self.size, "Size must be set for ext4 output"
615
+ tools.run("mke2fs -t ext4 -F -L rootfs -d {} image.ext4 {size}", mount_path, output_on_error=True)
609
616
  elif output == "squashfs":
610
617
  tools.run("mksquashfs {} image.squashfs", mount_path, output_on_error=True)
611
618
  else:
@@ -660,6 +667,8 @@ class ContainerImage(Task):
660
667
  self.publish_custom(artifact, tools)
661
668
  if output in ["directory"]:
662
669
  artifact.paths.rootfs = output
670
+ if output in ["ext4"]:
671
+ artifact.collect("image.ext4", output + "/{_imagefile}.ext4")
663
672
  if output in ["squashfs"]:
664
673
  artifact.collect("image.squashfs", output + "/{_imagefile}.squashfs")
665
674
 
@@ -1546,6 +1546,9 @@ class Tools(object):
1546
1546
  refuses to terminate, it will be killed after an additional
1547
1547
  10 seconds have passed. Default: None.
1548
1548
 
1549
+ Returns:
1550
+ str: stdout from command unless output=False
1551
+
1549
1552
  Example:
1550
1553
 
1551
1554
  .. code-block:: python
@@ -415,7 +415,16 @@ def delayed_signal(signum):
415
415
 
416
416
  @contextlib.contextmanager
417
417
  def delayed_interrupt():
418
- with delayed_signal(signum=signal.SIGINT):
418
+ if hasattr(signal, 'pthread_sigmask'):
419
+ try:
420
+ # Temporarily block the SIGINT signal
421
+ signal.pthread_sigmask(signal.SIG_BLOCK, {signal.SIGINT})
422
+ yield
423
+ finally:
424
+ # Unblock the SIGINT signal after the code block
425
+ signal.pthread_sigmask(signal.SIG_UNBLOCK, {signal.SIGINT})
426
+ else:
427
+ # Fallback for systems without pthread_sigmask
419
428
  yield
420
429
 
421
430
 
@@ -0,0 +1 @@
1
+ __version__ = "0.9.395"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jolt
3
- Version: 0.9.390
3
+ Version: 0.9.395
4
4
  Summary: A task executor
5
5
  Home-page: https://github.com/srand/jolt
6
6
  Author: Robert Andersson
@@ -1 +0,0 @@
1
- __version__ = "0.9.390"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes