fun_ci 2.1.1-aarch64-linux → 2.3.0-aarch64-linux

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +95 -0
  3. data/README.md +36 -6
  4. data/lib/fun_ci/agent/cancel_command.rb +52 -0
  5. data/lib/fun_ci/agent/command_support.rb +7 -0
  6. data/lib/fun_ci/agent/commands.rb +4 -1
  7. data/lib/fun_ci/agent/due_in.rb +21 -0
  8. data/lib/fun_ci/agent/events_command.rb +14 -7
  9. data/lib/fun_ci/agent/job_events.rb +56 -0
  10. data/lib/fun_ci/agent/job_json.rb +25 -0
  11. data/lib/fun_ci/agent/job_report.rb +89 -0
  12. data/lib/fun_ci/agent/job_why.rb +59 -0
  13. data/lib/fun_ci/agent/job_why_json.rb +31 -0
  14. data/lib/fun_ci/agent/job_why_text.rb +59 -0
  15. data/lib/fun_ci/agent/jobs_command.rb +43 -0
  16. data/lib/fun_ci/agent/jobs_text.rb +55 -0
  17. data/lib/fun_ci/agent/live_pipeline.rb +14 -6
  18. data/lib/fun_ci/agent/options.rb +3 -3
  19. data/lib/fun_ci/agent/output.rb +14 -2
  20. data/lib/fun_ci/agent/snapshots.rb +20 -1
  21. data/lib/fun_ci/agent/span.rb +24 -0
  22. data/lib/fun_ci/agent/stage_summary.rb +10 -6
  23. data/lib/fun_ci/agent/starts_in.rb +14 -0
  24. data/lib/fun_ci/agent/status_command.rb +3 -2
  25. data/lib/fun_ci/agent/status_json.rb +1 -1
  26. data/lib/fun_ci/agent/status_text.rb +32 -6
  27. data/lib/fun_ci/agent/trunk_reading.rb +2 -1
  28. data/lib/fun_ci/agent/wait_command.rb +2 -1
  29. data/lib/fun_ci/agent/why_command.rb +6 -2
  30. data/lib/fun_ci/cli.rb +1 -1
  31. data/lib/fun_ci/cli_help.rb +4 -1
  32. data/lib/fun_ci/console/board_data.rb +26 -13
  33. data/lib/fun_ci/console/console_state.rb +12 -6
  34. data/lib/fun_ci/console/job_message.rb +39 -0
  35. data/lib/fun_ci/console/job_order.rb +23 -0
  36. data/lib/fun_ci/console/job_rows.rb +21 -0
  37. data/lib/fun_ci/console/key_handler.rb +35 -14
  38. data/lib/fun_ci/console/paging.rb +26 -0
  39. data/lib/fun_ci/console/view.rb +18 -9
  40. data/lib/fun_ci/evidence/settings.rb +15 -8
  41. data/lib/fun_ci/evidence/settings_check.rb +14 -3
  42. data/lib/fun_ci/jobs/due.rb +34 -0
  43. data/lib/fun_ci/jobs/due_jobs.rb +50 -0
  44. data/lib/fun_ci/jobs/folders.rb +50 -0
  45. data/lib/fun_ci/jobs/job.rb +31 -0
  46. data/lib/fun_ci/jobs/job_fork.rb +52 -0
  47. data/lib/fun_ci/jobs/job_run.rb +104 -0
  48. data/lib/fun_ci/jobs/locks.rb +30 -0
  49. data/lib/fun_ci/jobs/schedule.rb +25 -0
  50. data/lib/fun_ci/jobs/site.rb +17 -0
  51. data/lib/fun_ci/jobs/standings.rb +50 -0
  52. data/lib/fun_ci/jobs/state.rb +27 -0
  53. data/lib/fun_ci/jobs/wall_clock_wait.rb +29 -0
  54. data/lib/fun_ci/persistence/active_jobs.rb +60 -0
  55. data/lib/fun_ci/persistence/database.rb +14 -4
  56. data/lib/fun_ci/persistence/job_recorder.rb +47 -0
  57. data/lib/fun_ci/persistence/job_runs.rb +80 -0
  58. data/lib/fun_ci/persistence/pipeline_run.rb +2 -1
  59. data/lib/fun_ci/persistence/raw_outputs.rb +3 -0
  60. data/lib/fun_ci/pipeline/budgets.rb +9 -0
  61. data/lib/fun_ci/pipeline/pipeline_forker.rb +42 -10
  62. data/lib/fun_ci/pipeline/priorities.rb +23 -0
  63. data/lib/fun_ci/pipeline/process_runner.rb +18 -6
  64. data/lib/fun_ci/pipeline/progress_reporter.rb +4 -0
  65. data/lib/fun_ci/pipeline/run_canceller.rb +24 -0
  66. data/lib/fun_ci/pipeline/slot.rb +12 -1
  67. data/lib/fun_ci/pipeline/slot_run.rb +19 -4
  68. data/lib/fun_ci/pipeline/stage_execution.rb +9 -4
  69. data/lib/fun_ci/pipeline/trigger.rb +17 -6
  70. data/lib/fun_ci/pipeline/trigger_command.rb +12 -2
  71. data/lib/fun_ci/pipeline/trigger_params.rb +20 -9
  72. data/lib/fun_ci/pipeline/worktree_pool.rb +2 -2
  73. data/lib/fun_ci/pipeline/worktree_prune.rb +8 -6
  74. data/lib/fun_ci/pipeline/worktrees.rb +11 -5
  75. data/lib/fun_ci/setup/agent_instructions.rb +24 -5
  76. data/lib/fun_ci/setup/commands.rb +3 -1
  77. data/lib/fun_ci/setup/hook_script.rb +9 -4
  78. data/lib/fun_ci/setup/hook_writer.rb +13 -5
  79. data/lib/fun_ci/setup/installed_hooks.rb +45 -0
  80. data/lib/fun_ci/setup/installer.rb +3 -2
  81. data/lib/fun_ci/setup/lfs_hook.rb +50 -0
  82. data/lib/fun_ci/setup/project_config.rb +13 -1
  83. data/lib/fun_ci/setup/settings.rb +40 -11
  84. data/lib/fun_ci/setup/setup_checker.rb +20 -3
  85. data/lib/fun_ci/trunk/shown.rb +7 -4
  86. data/lib/fun_ci/version.rb +1 -1
  87. data/libexec/fun-ci-renderer +0 -0
  88. metadata +36 -1
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hook_script"
4
+
5
+ module FunCi
6
+ module Setup
7
+ # git-lfs's own post-commit and pre-push hooks, as `git lfs install`
8
+ # writes them, and the hook fun-ci writes in their place, which runs
9
+ # fun-ci's, then git-lfs's. A push reads its ref list from git once, so
10
+ # the pre-push hook keeps it in a file and gives it to both.
11
+ module LfsHook
12
+ GUARD = %r{\Acommand -v git-lfs >/dev/null 2>&1 \|\| \{.*; exit 2; \}\z}
13
+ MISSING = %(command -v git-lfs >/dev/null 2>&1 || { echo "This repository is configured for Git LFS ) +
14
+ %(but 'git-lfs' was not found on your path." >&2; exit 2; })
15
+
16
+ RUN = {
17
+ "post-commit" => "if #{HookScript::INSTALLED}; then fun_ci; else #{HookScript::NOT_INSTALLED}; fi\n",
18
+ "pre-push" => %(if #{HookScript::INSTALLED}; then fun_ci < "$refs" || exit 1; ) +
19
+ "else #{HookScript::NOT_INSTALLED}; fi\n"
20
+ }.freeze
21
+
22
+ KEEP_REFS = { "post-commit" => "", "pre-push" => <<~SH }.freeze
23
+ refs=$(mktemp) || exit 1
24
+ trap 'rm -f "$refs"' EXIT
25
+ cat > "$refs"
26
+ SH
27
+
28
+ FUN_CI = { "post-commit" => HookScript::POST_COMMIT, "pre-push" => "#{HookScript::PRE_PUSH_WAITS}return $status\n" }
29
+ .freeze
30
+ LFS_INPUT = { "post-commit" => "", "pre-push" => %( < "$refs") }.freeze
31
+
32
+ # Whether `script` is the hook `git lfs install` writes for `hook_type`
33
+ # and nothing more.
34
+ def self.stock?(script, hook_type)
35
+ lines = script.lines(chomp: true).reject { |line| line.strip.empty? }
36
+ lines.size == 3 && lines.first == "#!/bin/sh" && GUARD.match?(lines[1]) && lines.last == call(hook_type)
37
+ end
38
+
39
+ def self.runs_lfs?(script, hook_type) = script.include?(call(hook_type))
40
+
41
+ def self.script(hook_type)
42
+ "#!/bin/sh\n#{HookScript::MARKER}\n# fun-ci's #{hook_type} hook, then git-lfs's, which it replaced.\n" \
43
+ "#{KEEP_REFS.fetch(hook_type)}fun_ci() {\n#{FUN_CI.fetch(hook_type)}}\n" \
44
+ "#{RUN.fetch(hook_type)}#{MISSING}\n#{call(hook_type)}#{LFS_INPUT.fetch(hook_type)}\n"
45
+ end
46
+
47
+ def self.call(hook_type) = %(git lfs #{hook_type} "$@")
48
+ end
49
+ end
50
+ end
@@ -4,6 +4,7 @@ require "shellwords"
4
4
  require_relative "settings"
5
5
  require_relative "../evidence/settings"
6
6
  require_relative "../evidence/start"
7
+ require_relative "../jobs/folders"
7
8
 
8
9
  module FunCi
9
10
  module Setup
@@ -19,12 +20,17 @@ module FunCi
19
20
  Dir.exist?(@fun_ci_dir)
20
21
  end
21
22
 
23
+ # What stops a pipeline: no .fun-ci/, or a stage script it can't run.
22
24
  def validate
23
25
  return ["No .fun-ci/ folder found in #{@project_root}"] unless folder_exists?
24
26
 
25
- REQUIRED_SCRIPTS.flat_map { |script| script_errors(script) } + settings.errors
27
+ REQUIRED_SCRIPTS.flat_map { |script| script_errors(script) }
26
28
  end
27
29
 
30
+ # Mistakes in .fun-ci/config, which never stop a pipeline: the setting
31
+ # takes its default instead.
32
+ def settings_errors = settings.errors
33
+
28
34
  # Mistakes in the `evidence` key, which `fun-ci check` reports but which
29
35
  # never stop a pipeline: the entry with the mistake is left out instead.
30
36
  def evidence_errors = Evidence::Settings.load(File.join(@fun_ci_dir, "config")).errors(root: @project_root)
@@ -37,9 +43,15 @@ module FunCi
37
43
  # may hold, such as JSON logs.
38
44
  def any_project_presets = preset_candidates.reject(&:because).map { |found| found.preset.name }
39
45
 
46
+ # The daily and weekly jobs that can run, and why any other can't
47
+ # (design.md, Daily and weekly jobs); neither stops a pipeline.
48
+ def jobs = Jobs::Folders.new(@project_root).jobs
49
+ def job_errors = Jobs::Folders.new(@project_root).errors
50
+
40
51
  def worktree_slots = settings.worktree_slots
41
52
  def trunk = settings.trunk
42
53
  def trunk_fetch = settings.trunk_fetch
54
+ def job_spacing = settings.job_spacing
43
55
 
44
56
  def script_path(stage)
45
57
  File.join(@fun_ci_dir, "#{stage}.sh")
@@ -6,7 +6,8 @@ module FunCi
6
6
  module Setup
7
7
  # .fun-ci/config: settings for this machine's runs, as YAML. Each one left
8
8
  # out takes its default; one that is wrong is reported and the default used,
9
- # as are all of them when the file isn't YAML.
9
+ # as are all of them when the file can't be read as YAML. Anchors and
10
+ # aliases are YAML, so they are read.
10
11
  class Settings
11
12
  DEFAULTS = { "worktree_slots" => 2 }.freeze
12
13
  FETCH_EVERY = 300
@@ -20,7 +21,7 @@ module FunCi
20
21
  @text = text
21
22
  end
22
23
 
23
- def worktree_slots = errors.empty? ? values.fetch("worktree_slots") : DEFAULTS.fetch("worktree_slots")
24
+ def worktree_slots = slots || DEFAULTS.fetch("worktree_slots")
24
25
 
25
26
  # The trunk's name, or nil when none is given or it is no name. A mistake
26
27
  # in the trunk settings never stops a pipeline, so none is among `errors`.
@@ -37,22 +38,51 @@ module FunCi
37
38
  seconds(given) || FETCH_EVERY
38
39
  end
39
40
 
40
- def errors
41
- return [".fun-ci/config must be a mapping such as `worktree_slots: 2`"] unless raw.is_a?(Hash)
41
+ # Seconds between the starts of the jobs a commit starts, 0 for all at
42
+ # once (Jobs::Schedule); nil when none is given, or none it can read,
43
+ # and the jobs share the day evenly (Jobs::DueJobs).
44
+ def job_spacing = seconds(setting("job_spacing"))
42
45
 
43
- slots = values["worktree_slots"]
44
- return [] if slots.is_a?(Integer) && slots.positive?
45
-
46
- [".fun-ci/config: worktree_slots must be a whole number above 0, not #{slots.inspect}"]
46
+ def errors
47
+ setting_errors
47
48
  rescue Psych::SyntaxError => e
48
49
  [".fun-ci/config is not YAML: #{e.problem} (line #{e.line})"]
50
+ rescue Psych::DisallowedClass => e
51
+ [".fun-ci/config can't be read: #{e.message} (quote a value such as a date to read it as text)"]
52
+ rescue Psych::Exception => e
53
+ [".fun-ci/config can't be read: #{e.message}"]
49
54
  end
50
55
 
51
56
  private
52
57
 
58
+ def setting_errors
59
+ return [".fun-ci/config must be a mapping such as `worktree_slots: 2`"] unless raw.is_a?(Hash)
60
+
61
+ [slots_error, spacing_error].compact
62
+ end
63
+
64
+ # The slots the file asks for, when that is a whole number above 0.
65
+ def slots
66
+ given = setting("worktree_slots")
67
+ given if given.is_a?(Integer) && given.positive?
68
+ end
69
+
70
+ def slots_error
71
+ given = setting("worktree_slots")
72
+ ".fun-ci/config: worktree_slots must be a whole number above 0, not #{given.inspect}" unless given.nil? || slots
73
+ end
74
+
75
+ # Unlike the trunk's, since taking turns is the jobs' whole point (AT-13.28).
76
+ def spacing_error
77
+ given = setting("job_spacing")
78
+ return nil if given.nil? || seconds(given)
79
+
80
+ ".fun-ci/config: job_spacing must be seconds, or a number with s, m or h, not #{given.inspect}"
81
+ end
82
+
53
83
  def setting(key)
54
84
  raw.is_a?(Hash) ? raw[key] : nil
55
- rescue Psych::SyntaxError
85
+ rescue Psych::Exception
56
86
  nil
57
87
  end
58
88
 
@@ -61,8 +91,7 @@ module FunCi
61
91
  match && (match[1].to_i * UNITS.fetch(match[2]))
62
92
  end
63
93
 
64
- def raw = (@text && YAML.safe_load(@text)) || {}
65
- def values = DEFAULTS.merge(raw)
94
+ def raw = (@text && YAML.safe_load(@text, aliases: true)) || {}
66
95
  end
67
96
  end
68
97
  end
@@ -2,13 +2,22 @@
2
2
 
3
3
  require_relative "project_config"
4
4
  require_relative "legacy_hooks"
5
+ require_relative "installed_hooks"
5
6
  require_relative "trunk_report"
6
7
 
7
8
  module FunCi
8
9
  module Setup
9
10
  class SetupChecker
10
- def self.run(project_root:, stdout: $stdout)
11
- new(config: ProjectConfig.new(project_root), hooks: LegacyHooks.new(project_root), stdout: stdout,
11
+ # The hooks it warns of: fun-ci 1.x's, and any in `hooks_dir` that
12
+ # doesn't run fun-ci.
13
+ Hooks = Data.define(:sources) do
14
+ def warnings = sources.flat_map(&:warnings)
15
+ end
16
+
17
+ # hooks_dir: where git runs the project's hooks from; nil outside a git repository.
18
+ def self.run(project_root:, stdout: $stdout, hooks_dir: nil)
19
+ hooks = Hooks.new([LegacyHooks.new(project_root), InstalledHooks.new(hooks_dir)])
20
+ new(config: ProjectConfig.new(project_root), hooks: hooks, stdout: stdout,
12
21
  trunk: TrunkReport.new(project_root)).run
13
22
  end
14
23
 
@@ -22,20 +31,28 @@ module FunCi
22
31
 
23
32
  # Warnings are printed but don't fail the check.
24
33
  def run
25
- errors = @config.validate + @config.evidence_errors
34
+ errors = problems
26
35
  @stdout.puts(errors.empty? ? "All OK. The project is configured." : errors)
27
36
  @stdout.puts(@trunk.lines)
28
37
  list_presets
38
+ list_jobs
29
39
  @hooks.warnings.each { |warning| @stdout.puts "Warning: #{warning}" }
30
40
  errors.empty? ? 0 : 1
31
41
  end
32
42
 
33
43
  private
34
44
 
45
+ def problems = @config.validate + @config.settings_errors + @config.evidence_errors + @config.job_errors
46
+
35
47
  def list_presets
36
48
  lists = { "this project" => @config.presets, "any project's output" => @config.any_project_presets }
37
49
  lists.each { |what, names| @stdout.puts "Evidence presets for #{what}: #{names.join(", ")}" if names.any? }
38
50
  end
51
+
52
+ def list_jobs
53
+ jobs = @config.jobs
54
+ @stdout.puts "Jobs: #{jobs.map { |job| "#{job.name} (#{job.cadence})" }.join(", ")}" if jobs.any?
55
+ end
39
56
  end
40
57
  end
41
58
  end
@@ -8,8 +8,9 @@ module FunCi
8
8
  # rather than stored, how many seconds ago its trunk tip was seen (nil
9
9
  # when it had none), the project's last fetch (a LastFetch, nil if none), and
10
10
  # the SHA the trunk has moved to since, if it has.
11
- # A run whose check hasn't been recorded is checking until its fetch and
12
- # merge are past their time, and then unknown.
11
+ # A run whose check hasn't been recorded is checking while its foreground
12
+ # stages run and until its fetch and merge are past their time, and then
13
+ # unknown.
13
14
  Shown = Data.define(:state, :check, :age, :fetch, :moved_to)
14
15
 
15
16
  class Shown
@@ -21,8 +22,10 @@ module FunCi
21
22
  fetch: fetch, moved_to: moved_to)
22
23
  end
23
24
 
24
- def self.unchecked(started:, now:)
25
- if now - started <= FETCH_DEADLINE + CHECK_BUDGET
25
+ # stages_running: whether the run's foreground stages, which the check
26
+ # is recorded after, are still going.
27
+ def self.unchecked(started:, now:, stages_running: false)
28
+ if stages_running || now - started <= FETCH_DEADLINE + CHECK_BUDGET
26
29
  return new(state: "checking", check: nil, age: nil, fetch: nil, moved_to: nil)
27
30
  end
28
31
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Loaded on its own by the gemspec, so it must not require anything.
4
4
  module FunCi
5
- VERSION = "2.1.1"
5
+ VERSION = "2.3.0"
6
6
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fun_ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.3.0
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Erik Thyge Madsen
@@ -63,15 +63,25 @@ files:
63
63
  - exe/fun-ci
64
64
  - lib/fun_ci.rb
65
65
  - lib/fun_ci/agent/age.rb
66
+ - lib/fun_ci/agent/cancel_command.rb
66
67
  - lib/fun_ci/agent/command_support.rb
67
68
  - lib/fun_ci/agent/commands.rb
68
69
  - lib/fun_ci/agent/context.rb
69
70
  - lib/fun_ci/agent/digest.rb
71
+ - lib/fun_ci/agent/due_in.rb
70
72
  - lib/fun_ci/agent/events.rb
71
73
  - lib/fun_ci/agent/events_command.rb
72
74
  - lib/fun_ci/agent/evidence_text.rb
73
75
  - lib/fun_ci/agent/exit_code.rb
74
76
  - lib/fun_ci/agent/git.rb
77
+ - lib/fun_ci/agent/job_events.rb
78
+ - lib/fun_ci/agent/job_json.rb
79
+ - lib/fun_ci/agent/job_report.rb
80
+ - lib/fun_ci/agent/job_why.rb
81
+ - lib/fun_ci/agent/job_why_json.rb
82
+ - lib/fun_ci/agent/job_why_text.rb
83
+ - lib/fun_ci/agent/jobs_command.rb
84
+ - lib/fun_ci/agent/jobs_text.rb
75
85
  - lib/fun_ci/agent/live_pipeline.rb
76
86
  - lib/fun_ci/agent/next_step.rb
77
87
  - lib/fun_ci/agent/options.rb
@@ -83,7 +93,9 @@ files:
83
93
  - lib/fun_ci/agent/runs_command.rb
84
94
  - lib/fun_ci/agent/runs_text.rb
85
95
  - lib/fun_ci/agent/snapshots.rb
96
+ - lib/fun_ci/agent/span.rb
86
97
  - lib/fun_ci/agent/stage_summary.rb
98
+ - lib/fun_ci/agent/starts_in.rb
87
99
  - lib/fun_ci/agent/status_command.rb
88
100
  - lib/fun_ci/agent/status_json.rb
89
101
  - lib/fun_ci/agent/status_text.rb
@@ -110,10 +122,14 @@ files:
110
122
  - lib/fun_ci/console/console_loop.rb
111
123
  - lib/fun_ci/console/console_session.rb
112
124
  - lib/fun_ci/console/console_state.rb
125
+ - lib/fun_ci/console/job_message.rb
126
+ - lib/fun_ci/console/job_order.rb
127
+ - lib/fun_ci/console/job_rows.rb
113
128
  - lib/fun_ci/console/key_handler.rb
114
129
  - lib/fun_ci/console/launcher.rb
115
130
  - lib/fun_ci/console/milestone_events.rb
116
131
  - lib/fun_ci/console/milestones.rb
132
+ - lib/fun_ci/console/paging.rb
117
133
  - lib/fun_ci/console/renderer_lookup.rb
118
134
  - lib/fun_ci/console/renderer_process.rb
119
135
  - lib/fun_ci/console/row_order.rb
@@ -205,8 +221,23 @@ files:
205
221
  - lib/fun_ci/evidence/stamp.rb
206
222
  - lib/fun_ci/evidence/start.rb
207
223
  - lib/fun_ci/evidence/worktree.rb
224
+ - lib/fun_ci/jobs/due.rb
225
+ - lib/fun_ci/jobs/due_jobs.rb
226
+ - lib/fun_ci/jobs/folders.rb
227
+ - lib/fun_ci/jobs/job.rb
228
+ - lib/fun_ci/jobs/job_fork.rb
229
+ - lib/fun_ci/jobs/job_run.rb
230
+ - lib/fun_ci/jobs/locks.rb
231
+ - lib/fun_ci/jobs/schedule.rb
232
+ - lib/fun_ci/jobs/site.rb
233
+ - lib/fun_ci/jobs/standings.rb
234
+ - lib/fun_ci/jobs/state.rb
235
+ - lib/fun_ci/jobs/wall_clock_wait.rb
236
+ - lib/fun_ci/persistence/active_jobs.rb
208
237
  - lib/fun_ci/persistence/active_runs.rb
209
238
  - lib/fun_ci/persistence/database.rb
239
+ - lib/fun_ci/persistence/job_recorder.rb
240
+ - lib/fun_ci/persistence/job_runs.rb
210
241
  - lib/fun_ci/persistence/null_recorder.rb
211
242
  - lib/fun_ci/persistence/output_tail.rb
212
243
  - lib/fun_ci/persistence/pipeline_recorder.rb
@@ -222,6 +253,7 @@ files:
222
253
  - lib/fun_ci/persistence/trunk_recording.rb
223
254
  - lib/fun_ci/persistence/write_trouble.rb
224
255
  - lib/fun_ci/pipeline/background_fork.rb
256
+ - lib/fun_ci/pipeline/budgets.rb
225
257
  - lib/fun_ci/pipeline/command_executor.rb
226
258
  - lib/fun_ci/pipeline/gate.rb
227
259
  - lib/fun_ci/pipeline/git_environment.rb
@@ -229,6 +261,7 @@ files:
229
261
  - lib/fun_ci/pipeline/in_place.rb
230
262
  - lib/fun_ci/pipeline/output_window.rb
231
263
  - lib/fun_ci/pipeline/pipeline_forker.rb
264
+ - lib/fun_ci/pipeline/priorities.rb
232
265
  - lib/fun_ci/pipeline/process_runner.rb
233
266
  - lib/fun_ci/pipeline/progress_reporter.rb
234
267
  - lib/fun_ci/pipeline/run_canceller.rb
@@ -256,8 +289,10 @@ files:
256
289
  - lib/fun_ci/setup/gradle_linter_detector.rb
257
290
  - lib/fun_ci/setup/hook_script.rb
258
291
  - lib/fun_ci/setup/hook_writer.rb
292
+ - lib/fun_ci/setup/installed_hooks.rb
259
293
  - lib/fun_ci/setup/installer.rb
260
294
  - lib/fun_ci/setup/legacy_hooks.rb
295
+ - lib/fun_ci/setup/lfs_hook.rb
261
296
  - lib/fun_ci/setup/lint_detection.rb
262
297
  - lib/fun_ci/setup/maven_linter_detector.rb
263
298
  - lib/fun_ci/setup/project_config.rb