kettle-dev 2.3.11 → 2.4.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +39 -1
- data/README.md +1 -1
- data/exe/kettle-bump +5 -1
- data/exe/kettle-changelog +5 -1
- data/exe/kettle-check-eof +12 -0
- data/exe/kettle-commit-msg +5 -2
- data/exe/kettle-dev-setup +9 -0
- data/exe/kettle-dvcs +5 -1
- data/exe/kettle-gh-release +5 -1
- data/exe/kettle-gha-sha-pins +9 -0
- data/exe/kettle-pre-release +5 -1
- data/exe/kettle-readme-backers +5 -1
- data/exe/kettle-release +5 -1
- data/lib/kettle/dev/cache_progress.rb +25 -12
- data/lib/kettle/dev/executable_version.rb +39 -0
- data/lib/kettle/dev/pre_release_cli.rb +20 -16
- data/lib/kettle/dev/release_cli.rb +191 -2
- data/lib/kettle/dev/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +23 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 77a7621fa0d906b716e933205ff585081b8746345530f540a8c83f6e67d3f347
|
|
4
|
+
data.tar.gz: ae54a1e1f33347caa8c6d07eae632db0b88c95583a838fece942bd9bb1d84bfb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 03b528fd8d85c047d18606f023a0f9f217ca88556ed26ddbc62504a282bceda6a42ea315c0cd0fdd0e2e4307fefeda357d34fcf4fab98d83dc5214c9d202bbb2
|
|
7
|
+
data.tar.gz: d630c32d5f8cfbb28b74cdc552a9d331aa73d25de2d80298736f759f2bfe3181649c845a1d812c5ead41f9792a3169091f07ae33a2afb1610028b191effb08e7
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,40 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [2.4.1] - 2026-07-24
|
|
34
|
+
|
|
35
|
+
- TAG: [v2.4.1][2.4.1t]
|
|
36
|
+
- COVERAGE: 92.29% -- 3928/4256 lines in 38 files
|
|
37
|
+
- BRANCH COVERAGE: 76.09% -- 1550/2037 branches in 38 files
|
|
38
|
+
- 58.66% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- `kettle-release` now normalizes and revalidates release lockfiles after
|
|
43
|
+
mutating setup/appraisal/doc steps, before committing or pushing, so local
|
|
44
|
+
path remotes and locally installed registry gems with empty lockfile
|
|
45
|
+
checksums cannot leak into CI.
|
|
46
|
+
|
|
47
|
+
## [2.4.0] - 2026-07-23
|
|
48
|
+
|
|
49
|
+
- TAG: [v2.4.0][2.4.0t]
|
|
50
|
+
- COVERAGE: 92.49% -- 3830/4141 lines in 38 files
|
|
51
|
+
- BRANCH COVERAGE: 76.22% -- 1516/1989 branches in 38 files
|
|
52
|
+
- 58.66% documented
|
|
53
|
+
|
|
54
|
+
### Added
|
|
55
|
+
|
|
56
|
+
- Packaged executables now answer `-v` and bare `--version` with the
|
|
57
|
+
`kettle-dev` gem version they shipped with.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- Raised the runtime dependency floor for `kettle-gha-pins` to `0.3.1`.
|
|
62
|
+
- Packaged executables now share a consistent startup header on normal
|
|
63
|
+
execution paths.
|
|
64
|
+
- Markdown image URL cache/live/skipped progress now uses the same multi-line
|
|
65
|
+
`tty-progressbar` output as GitHub Actions pin checks.
|
|
66
|
+
|
|
33
67
|
## [2.3.11] - 2026-07-23
|
|
34
68
|
|
|
35
69
|
- TAG: [v2.3.11][2.3.11t]
|
|
@@ -2626,7 +2660,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
2626
2660
|
- Selecting will run the selected workflow via `act`
|
|
2627
2661
|
- This may move to its own gem in the future.
|
|
2628
2662
|
|
|
2629
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.
|
|
2663
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.4.1...HEAD
|
|
2664
|
+
[2.4.1]: https://github.com/kettle-dev/kettle-dev/compare/v2.4.0...v2.4.1
|
|
2665
|
+
[2.4.1t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.4.1
|
|
2666
|
+
[2.4.0]: https://github.com/kettle-dev/kettle-dev/compare/v2.3.11...v2.4.0
|
|
2667
|
+
[2.4.0t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.4.0
|
|
2630
2668
|
[2.3.11]: https://github.com/kettle-dev/kettle-dev/compare/v2.3.10...v2.3.11
|
|
2631
2669
|
[2.3.11t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.3.11
|
|
2632
2670
|
[2.3.10]: https://github.com/kettle-dev/kettle-dev/compare/v2.3.9...v2.3.10
|
data/README.md
CHANGED
|
@@ -891,7 +891,7 @@ Thanks for RTFM. ☺️
|
|
|
891
891
|
[📌gitmoji]: https://gitmoji.dev
|
|
892
892
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
893
893
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
894
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-4.
|
|
894
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-4.256-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
895
895
|
[🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
|
|
896
896
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
897
897
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
data/exe/kettle-bump
CHANGED
|
@@ -15,10 +15,14 @@ rescue LoadError
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
script_basename = File.basename(__FILE__)
|
|
18
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
19
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
18
20
|
|
|
19
21
|
begin
|
|
20
22
|
require "kettle/dev"
|
|
21
|
-
|
|
23
|
+
require "kettle/dev/executable_version"
|
|
24
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
25
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
22
26
|
rescue LoadError => e
|
|
23
27
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
24
28
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-changelog
CHANGED
|
@@ -36,6 +36,8 @@ rescue LoadError
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
script_basename = File.basename(__FILE__)
|
|
39
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
40
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
39
41
|
|
|
40
42
|
begin
|
|
41
43
|
# Standard library
|
|
@@ -46,7 +48,9 @@ begin
|
|
|
46
48
|
|
|
47
49
|
# This library
|
|
48
50
|
require "kettle/dev"
|
|
49
|
-
|
|
51
|
+
require "kettle/dev/executable_version"
|
|
52
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV, value_option: true)
|
|
53
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename) unless ARGV.include?("--json")
|
|
50
54
|
rescue LoadError => e
|
|
51
55
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
52
56
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-check-eof
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
+
$stdout.sync = true
|
|
5
|
+
$stderr.sync = true
|
|
6
|
+
|
|
7
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
8
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
9
|
+
|
|
10
|
+
require "kettle/dev/executable_version"
|
|
11
|
+
|
|
12
|
+
script_basename = File.basename(__FILE__)
|
|
13
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
14
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
15
|
+
|
|
4
16
|
bin_dir = File.expand_path(__dir__)
|
|
5
17
|
bash_script = File.join(bin_dir, "kettle-check-eof.sh")
|
|
6
18
|
|
data/exe/kettle-commit-msg
CHANGED
|
@@ -16,6 +16,8 @@ rescue LoadError
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
script_basename = File.basename(__FILE__)
|
|
19
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
20
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
19
21
|
|
|
20
22
|
begin
|
|
21
23
|
# Standard library
|
|
@@ -25,11 +27,12 @@ begin
|
|
|
25
27
|
require "kettle/dev"
|
|
26
28
|
rescue LoadError
|
|
27
29
|
# Fallback: allow running from a checkout without bundler by adding ./lib to the load path
|
|
28
|
-
repo_lib = File.expand_path("../lib", __dir__)
|
|
29
30
|
$LOAD_PATH.unshift(repo_lib) unless $LOAD_PATH.include?(repo_lib)
|
|
30
31
|
require "kettle/dev"
|
|
31
32
|
end
|
|
32
|
-
|
|
33
|
+
require "kettle/dev/executable_version"
|
|
34
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
35
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
33
36
|
rescue LoadError => e
|
|
34
37
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
35
38
|
warn("Hint: Install the kettle-dev gem (`gem install kettle-dev`) or add it to your Gemfile. Bundler is not required for this script.")
|
data/exe/kettle-dev-setup
CHANGED
|
@@ -6,6 +6,15 @@
|
|
|
6
6
|
# kettle-dev-setup has been replaced by kettle-jem setup.
|
|
7
7
|
# All setup and templating functionality has moved to the kettle-jem gem.
|
|
8
8
|
|
|
9
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
10
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
11
|
+
|
|
12
|
+
require "kettle/dev/executable_version"
|
|
13
|
+
|
|
14
|
+
script_basename = File.basename(__FILE__)
|
|
15
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
16
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
17
|
+
|
|
9
18
|
warn <<~MSG
|
|
10
19
|
kettle-dev-setup has been removed.
|
|
11
20
|
Setup and templating functionality has moved to the kettle-jem gem.
|
data/exe/kettle-dvcs
CHANGED
|
@@ -20,10 +20,14 @@ rescue LoadError
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
script_basename = File.basename(__FILE__)
|
|
23
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
24
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
23
25
|
|
|
24
26
|
begin
|
|
25
27
|
require "kettle/dev"
|
|
26
|
-
|
|
28
|
+
require "kettle/dev/executable_version"
|
|
29
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
30
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
27
31
|
rescue LoadError => e
|
|
28
32
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
29
33
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-gh-release
CHANGED
|
@@ -21,10 +21,14 @@ rescue LoadError
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
script_basename = File.basename(__FILE__)
|
|
24
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
25
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
24
26
|
|
|
25
27
|
begin
|
|
26
28
|
require "kettle/dev"
|
|
27
|
-
|
|
29
|
+
require "kettle/dev/executable_version"
|
|
30
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
31
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
28
32
|
rescue LoadError => e
|
|
29
33
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
30
34
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-gha-sha-pins
CHANGED
|
@@ -3,9 +3,18 @@
|
|
|
3
3
|
|
|
4
4
|
# vim: set syntax=ruby
|
|
5
5
|
|
|
6
|
+
$stdout.sync = true
|
|
7
|
+
$stderr.sync = true
|
|
8
|
+
|
|
6
9
|
script_basename = File.basename(__FILE__)
|
|
10
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
11
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
7
12
|
|
|
8
13
|
begin
|
|
14
|
+
require "kettle/dev/executable_version"
|
|
15
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
16
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
17
|
+
|
|
9
18
|
Kernel.exec(Gem.ruby, Gem.bin_path("kettle-gha-pins", "kettle-gha-pins"), *ARGV)
|
|
10
19
|
rescue Gem::Exception, LoadError => e
|
|
11
20
|
warn("#{script_basename}: could not load kettle-gha-pins executable: #{e.class}: #{e.message}")
|
data/exe/kettle-pre-release
CHANGED
|
@@ -23,10 +23,14 @@ rescue LoadError
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
script_basename = File.basename(__FILE__)
|
|
26
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
27
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
26
28
|
|
|
27
29
|
begin
|
|
28
30
|
require "kettle/dev"
|
|
29
|
-
|
|
31
|
+
require "kettle/dev/executable_version"
|
|
32
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
33
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
30
34
|
rescue => e
|
|
31
35
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
32
36
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-readme-backers
CHANGED
|
@@ -14,10 +14,14 @@ rescue LoadError
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
script_basename = File.basename(__FILE__)
|
|
17
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
18
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
17
19
|
|
|
18
20
|
begin
|
|
19
21
|
require "kettle/dev"
|
|
20
|
-
|
|
22
|
+
require "kettle/dev/executable_version"
|
|
23
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV)
|
|
24
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
21
25
|
rescue LoadError => e
|
|
22
26
|
warn("kettle/dev: failed to load: #{e.message}")
|
|
23
27
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
data/exe/kettle-release
CHANGED
|
@@ -29,10 +29,14 @@ rescue LoadError
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
script_basename = File.basename(__FILE__)
|
|
32
|
+
repo_lib = File.expand_path("../lib", __dir__)
|
|
33
|
+
$LOAD_PATH.unshift(repo_lib) if File.directory?(repo_lib) && !$LOAD_PATH.include?(repo_lib)
|
|
32
34
|
|
|
33
35
|
begin
|
|
34
36
|
require "kettle/dev"
|
|
35
|
-
|
|
37
|
+
require "kettle/dev/executable_version"
|
|
38
|
+
Kettle::Dev::ExecutableVersion.print_and_exit!(script_basename, ARGV, value_option: true)
|
|
39
|
+
Kettle::Dev::ExecutableVersion.print_header(script_basename)
|
|
36
40
|
rescue LoadError => e
|
|
37
41
|
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
38
42
|
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
|
@@ -1,47 +1,60 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "
|
|
3
|
+
require "tty-progressbar"
|
|
4
4
|
|
|
5
5
|
module Kettle
|
|
6
6
|
module Dev
|
|
7
7
|
class CacheProgress
|
|
8
|
-
FORMAT = "
|
|
9
|
-
|
|
8
|
+
FORMAT = "%<title>s [:bar] :current/:total"
|
|
9
|
+
WIDTH = 30
|
|
10
10
|
|
|
11
11
|
def initialize(total:, cached_title:, live_title:, output:, enabled: true, skipped_title: nil)
|
|
12
12
|
@total = total.to_i
|
|
13
13
|
@cached_count = 0
|
|
14
14
|
@live_count = 0
|
|
15
15
|
@skipped_count = 0
|
|
16
|
-
@
|
|
17
|
-
@
|
|
18
|
-
@
|
|
16
|
+
@multibar = progress_enabled?(enabled, output) ? TTY::ProgressBar::Multi.new(output: output, width: WIDTH) : nil
|
|
17
|
+
@cached_bar = progress_bar(cached_title)
|
|
18
|
+
@live_bar = progress_bar(live_title)
|
|
19
|
+
@skipped_bar = skipped_title ? progress_bar(skipped_title) : nil
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
attr_reader :cached_count, :live_count, :skipped_count
|
|
22
23
|
|
|
23
24
|
def cached
|
|
24
25
|
@cached_count += 1
|
|
25
|
-
@cached_bar&.
|
|
26
|
+
@cached_bar&.advance
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
def live
|
|
29
30
|
@live_count += 1
|
|
30
|
-
@live_bar&.
|
|
31
|
+
@live_bar&.advance
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
def skipped
|
|
34
35
|
@skipped_count += 1
|
|
35
|
-
@skipped_bar&.
|
|
36
|
+
@skipped_bar&.advance
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def stop
|
|
40
|
+
@multibar&.stop
|
|
36
41
|
end
|
|
37
42
|
|
|
38
43
|
private
|
|
39
44
|
|
|
40
|
-
def
|
|
41
|
-
|
|
45
|
+
def progress_enabled?(enabled, output)
|
|
46
|
+
enabled && @total.positive? && output.respond_to?(:tty?) && output.tty?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def progress_bar(title)
|
|
50
|
+
return unless @multibar
|
|
42
51
|
return unless @total.positive?
|
|
43
52
|
|
|
44
|
-
|
|
53
|
+
@multibar.register(bar_format(title), total: @total)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def bar_format(title)
|
|
57
|
+
Kernel.format(FORMAT, title: title)
|
|
45
58
|
end
|
|
46
59
|
end
|
|
47
60
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "version"
|
|
4
|
+
|
|
5
|
+
module Kettle
|
|
6
|
+
module Dev
|
|
7
|
+
module ExecutableVersion
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def print_and_exit!(script_basename, argv, value_option: false)
|
|
11
|
+
return unless requested?(argv, value_option: value_option)
|
|
12
|
+
|
|
13
|
+
puts "#{script_basename} #{Kettle::Dev::Version::VERSION}"
|
|
14
|
+
exit(0)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def print_header(script_basename)
|
|
18
|
+
puts header(script_basename)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def header(script_basename)
|
|
22
|
+
"== #{script_basename} v#{Kettle::Dev::Version::VERSION} =="
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def requested?(argv, value_option: false)
|
|
26
|
+
argv.each_with_index.any? do |arg, index|
|
|
27
|
+
arg == "-v" || bare_long_version?(argv, arg, index, value_option: value_option)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def bare_long_version?(argv, arg, index, value_option:)
|
|
32
|
+
return false unless arg == "--version"
|
|
33
|
+
return true unless value_option
|
|
34
|
+
|
|
35
|
+
index == argv.length - 1 || argv[index + 1].to_s.start_with?("-")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -375,25 +375,29 @@ module Kettle
|
|
|
375
375
|
output: $stdout
|
|
376
376
|
)
|
|
377
377
|
failures = []
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
378
|
+
begin
|
|
379
|
+
urls.each do |url|
|
|
380
|
+
if image_url_skipped?(url)
|
|
381
|
+
skipped << url
|
|
382
|
+
progress.skipped
|
|
383
|
+
next
|
|
384
|
+
end
|
|
384
385
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
386
|
+
if cache && !@refresh_image_url_cache && cache.fresh_success?(url)
|
|
387
|
+
progress.cached
|
|
388
|
+
next
|
|
389
|
+
end
|
|
389
390
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
391
|
+
ok = HTTP.head_ok?(url)
|
|
392
|
+
progress.live
|
|
393
|
+
if ok
|
|
394
|
+
cache&.write_success(url)
|
|
395
|
+
else
|
|
396
|
+
failures << url
|
|
397
|
+
end
|
|
396
398
|
end
|
|
399
|
+
ensure
|
|
400
|
+
progress.stop
|
|
397
401
|
end
|
|
398
402
|
puts "[kettle-pre-release] Image URL checks: #{progress.cached_count} cached, #{progress.live_count} live."
|
|
399
403
|
puts "[kettle-pre-release] Skipped #{progress.skipped_count} image URL check(s)." if skipped.any?
|
|
@@ -10,6 +10,7 @@ require "net/http"
|
|
|
10
10
|
require "json"
|
|
11
11
|
require "uri"
|
|
12
12
|
require "yaml"
|
|
13
|
+
require "set"
|
|
13
14
|
|
|
14
15
|
# External gems
|
|
15
16
|
require "kettle/rb/compat_matrix"
|
|
@@ -256,6 +257,7 @@ module Kettle
|
|
|
256
257
|
|
|
257
258
|
# 6. git user + commit release prep
|
|
258
259
|
if run_step?(6)
|
|
260
|
+
prepare_release_lockfiles_for_commit!
|
|
259
261
|
ensure_git_user!
|
|
260
262
|
version ||= detect_version
|
|
261
263
|
committed = commit_release_prep!(version)
|
|
@@ -279,10 +281,16 @@ module Kettle
|
|
|
279
281
|
end
|
|
280
282
|
|
|
281
283
|
# 9. push branches
|
|
282
|
-
|
|
284
|
+
if run_step?(9) && !local_ci?
|
|
285
|
+
validate_release_lockfiles!(stage: "before push")
|
|
286
|
+
push!
|
|
287
|
+
end
|
|
283
288
|
|
|
284
289
|
# 10. monitor CI after push
|
|
285
|
-
|
|
290
|
+
if run_step?(10) && !local_ci?
|
|
291
|
+
validate_release_lockfiles!(stage: "before CI monitoring")
|
|
292
|
+
monitor_workflows_after_push!
|
|
293
|
+
end
|
|
286
294
|
|
|
287
295
|
# 11. merge feature into trunk and push
|
|
288
296
|
if run_step?(11) && !local_ci?
|
|
@@ -505,6 +513,187 @@ module Kettle
|
|
|
505
513
|
run_changelog!
|
|
506
514
|
end
|
|
507
515
|
|
|
516
|
+
def prepare_release_lockfiles_for_commit!
|
|
517
|
+
dirty_lockfiles = release_lockfile_paths.select { |path| release_lockfile_normalization_needed?(path) }
|
|
518
|
+
unless dirty_lockfiles.empty?
|
|
519
|
+
puts "Normalizing release lockfiles with local path dependencies disabled..."
|
|
520
|
+
dirty_lockfiles.each { |path| normalize_release_lockfile!(path) }
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
validate_release_lockfiles!(stage: "before release prep commit")
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def validate_release_lockfiles!(stage:)
|
|
527
|
+
diagnostics = release_lockfile_paths.flat_map { |path| release_lockfile_diagnostics(path) }
|
|
528
|
+
return if diagnostics.empty?
|
|
529
|
+
|
|
530
|
+
abort(<<~MSG)
|
|
531
|
+
Release lockfile validation failed #{stage}:
|
|
532
|
+
#{diagnostics.map { |diagnostic| " - #{diagnostic}" }.join("\n")}
|
|
533
|
+
Re-run bundle lock/update with local path development env disabled before releasing.
|
|
534
|
+
MSG
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
def release_lockfile_paths
|
|
538
|
+
candidates = [
|
|
539
|
+
File.join(@root, "Gemfile.lock"),
|
|
540
|
+
File.join(@root, "Appraisal.root.gemfile.lock")
|
|
541
|
+
]
|
|
542
|
+
candidates.select { |path| File.file?(path) }.sort
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
def release_lockfile_normalization_needed?(path)
|
|
546
|
+
release_lockfile_has_local_path_remote?(path) || !release_lockfile_empty_registry_checksums(path).empty?
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
def normalize_release_lockfile!(path)
|
|
550
|
+
gemfile = release_gemfile_for_lockfile(path)
|
|
551
|
+
unless gemfile && File.file?(gemfile)
|
|
552
|
+
warn("Cannot normalize #{Kettle::Dev.display_path(path)} because its Gemfile was not found.")
|
|
553
|
+
return
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
update_gems = release_lockfile_empty_registry_checksums(path).map(&:first).uniq.sort
|
|
557
|
+
env = release_lockfile_normalization_env.merge("BUNDLE_GEMFILE" => gemfile)
|
|
558
|
+
command = +"env"
|
|
559
|
+
env.each do |key, value|
|
|
560
|
+
command << " #{key}=#{Shellwords.escape(value)}"
|
|
561
|
+
end
|
|
562
|
+
command << " bundle lock"
|
|
563
|
+
command << " --update #{update_gems.map { |gem_name| Shellwords.escape(gem_name) }.join(" ")}" unless update_gems.empty?
|
|
564
|
+
run_cmd!(command)
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
def release_gemfile_for_lockfile(path)
|
|
568
|
+
basename = File.basename(path)
|
|
569
|
+
return File.join(@root, "Gemfile") if basename == "Gemfile.lock"
|
|
570
|
+
|
|
571
|
+
path.delete_suffix(".lock")
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
def release_lockfile_normalization_env
|
|
575
|
+
{
|
|
576
|
+
"KETTLE_DEV_DEV" => "false",
|
|
577
|
+
"K_JEM_TEMPLATING" => "false",
|
|
578
|
+
"STRUCTUREDMERGE_DEV" => "false",
|
|
579
|
+
"TREE_SITTER_LANGUAGE_PACK_DEV" => "false",
|
|
580
|
+
"RUBOCOP_LTS_LOCAL" => "false",
|
|
581
|
+
"GALTZO_FLOSS_DEV" => "false",
|
|
582
|
+
"UR_BRAIN_DEV" => "false"
|
|
583
|
+
}
|
|
584
|
+
end
|
|
585
|
+
|
|
586
|
+
def release_lockfile_diagnostics(path)
|
|
587
|
+
diagnostics = []
|
|
588
|
+
release_lockfile_local_path_remote_lines(path).each do |line_number|
|
|
589
|
+
diagnostics << "#{release_lockfile_label(path)} has local path remote at line #{line_number}"
|
|
590
|
+
end
|
|
591
|
+
release_lockfile_empty_registry_checksums(path).each do |name, version, line_number|
|
|
592
|
+
diagnostics << "#{release_lockfile_label(path)} CHECKSUMS has no sha256 for #{name} #{version} at line #{line_number}"
|
|
593
|
+
end
|
|
594
|
+
diagnostics
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
def release_lockfile_has_local_path_remote?(path)
|
|
598
|
+
!release_lockfile_local_path_remote_lines(path).empty?
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
def release_lockfile_local_path_remote_lines(path)
|
|
602
|
+
File.readlines(path).filter_map.with_index(1) do |line, index|
|
|
603
|
+
next unless line.start_with?(" remote: /", " remote: ./", " remote: ../")
|
|
604
|
+
|
|
605
|
+
index
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
def release_lockfile_empty_registry_checksums(path)
|
|
610
|
+
path_gems = release_lockfile_path_source_gems(path) | release_lockfile_path_dependency_gems(path)
|
|
611
|
+
in_checksums = false
|
|
612
|
+
entries = File.readlines(path).filter_map.with_index(1) do |line, index|
|
|
613
|
+
stripped = line.strip
|
|
614
|
+
if stripped == "CHECKSUMS"
|
|
615
|
+
in_checksums = true
|
|
616
|
+
next
|
|
617
|
+
end
|
|
618
|
+
next unless in_checksums
|
|
619
|
+
next if stripped.empty?
|
|
620
|
+
next if stripped == "BUNDLED WITH"
|
|
621
|
+
|
|
622
|
+
match = stripped.match(/\A([A-Za-z0-9_.-]+) \(([^)]+)\)(?:\s+(sha256=.*))?\z/)
|
|
623
|
+
next unless match
|
|
624
|
+
|
|
625
|
+
name = match[1]
|
|
626
|
+
checksum = match[3].to_s
|
|
627
|
+
next if !checksum.empty?
|
|
628
|
+
next if path_gems.include?(name)
|
|
629
|
+
|
|
630
|
+
[name, match[2], index]
|
|
631
|
+
end
|
|
632
|
+
return [] unless release_lockfile_has_any_sha_checksum?(path)
|
|
633
|
+
|
|
634
|
+
entries
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
def release_lockfile_has_any_sha_checksum?(path)
|
|
638
|
+
in_checksums = false
|
|
639
|
+
File.readlines(path).any? do |line|
|
|
640
|
+
stripped = line.strip
|
|
641
|
+
if stripped == "CHECKSUMS"
|
|
642
|
+
in_checksums = true
|
|
643
|
+
next false
|
|
644
|
+
end
|
|
645
|
+
next false unless in_checksums
|
|
646
|
+
|
|
647
|
+
stripped.include?("sha256=")
|
|
648
|
+
end
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
def release_lockfile_path_source_gems(path)
|
|
652
|
+
gems = Set.new
|
|
653
|
+
in_path = false
|
|
654
|
+
in_specs = false
|
|
655
|
+
File.readlines(path).each do |line|
|
|
656
|
+
header = line.strip
|
|
657
|
+
if header.match?(/\A[A-Z][A-Z ]*\z/)
|
|
658
|
+
in_path = header == "PATH"
|
|
659
|
+
in_specs = false
|
|
660
|
+
next
|
|
661
|
+
end
|
|
662
|
+
next unless in_path
|
|
663
|
+
|
|
664
|
+
if header == "specs:"
|
|
665
|
+
in_specs = true
|
|
666
|
+
next
|
|
667
|
+
end
|
|
668
|
+
next unless in_specs
|
|
669
|
+
|
|
670
|
+
match = line.match(/\A ([A-Za-z0-9_.-]+) \([^)]+\)/)
|
|
671
|
+
gems << match[1] if match
|
|
672
|
+
end
|
|
673
|
+
gems
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
def release_lockfile_path_dependency_gems(path)
|
|
677
|
+
gems = Set.new
|
|
678
|
+
in_dependencies = false
|
|
679
|
+
File.readlines(path).each do |line|
|
|
680
|
+
header = line.strip
|
|
681
|
+
if header.match?(/\A[A-Z][A-Z ]*\z/)
|
|
682
|
+
in_dependencies = header == "DEPENDENCIES"
|
|
683
|
+
next
|
|
684
|
+
end
|
|
685
|
+
next unless in_dependencies
|
|
686
|
+
|
|
687
|
+
match = line.match(/\A ([A-Za-z0-9_.-]+)!\z/)
|
|
688
|
+
gems << match[1] if match
|
|
689
|
+
end
|
|
690
|
+
gems
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
def release_lockfile_label(path)
|
|
694
|
+
Kettle::Dev.display_path(path)
|
|
695
|
+
end
|
|
696
|
+
|
|
508
697
|
def run_changelog!
|
|
509
698
|
cmd = "bundle exec kettle-changelog"
|
|
510
699
|
cmd = "#{cmd} --version #{Shellwords.escape(@version_override)}" if @version_override
|
data/lib/kettle/dev/version.rb
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kettle-dev
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -57,20 +57,20 @@ dependencies:
|
|
|
57
57
|
requirements:
|
|
58
58
|
- - "~>"
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '0.
|
|
60
|
+
version: '0.3'
|
|
61
61
|
- - ">="
|
|
62
62
|
- !ruby/object:Gem::Version
|
|
63
|
-
version: 0.
|
|
63
|
+
version: 0.3.1
|
|
64
64
|
type: :runtime
|
|
65
65
|
prerelease: false
|
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
|
67
67
|
requirements:
|
|
68
68
|
- - "~>"
|
|
69
69
|
- !ruby/object:Gem::Version
|
|
70
|
-
version: '0.
|
|
70
|
+
version: '0.3'
|
|
71
71
|
- - ">="
|
|
72
72
|
- !ruby/object:Gem::Version
|
|
73
|
-
version: 0.
|
|
73
|
+
version: 0.3.1
|
|
74
74
|
- !ruby/object:Gem::Dependency
|
|
75
75
|
name: kettle-rb
|
|
76
76
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -125,6 +125,20 @@ dependencies:
|
|
|
125
125
|
- - "~>"
|
|
126
126
|
- !ruby/object:Gem::Version
|
|
127
127
|
version: '1.13'
|
|
128
|
+
- !ruby/object:Gem::Dependency
|
|
129
|
+
name: tty-progressbar
|
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '0.18'
|
|
135
|
+
type: :runtime
|
|
136
|
+
prerelease: false
|
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - "~>"
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '0.18'
|
|
128
142
|
- !ruby/object:Gem::Dependency
|
|
129
143
|
name: bundler-audit
|
|
130
144
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -301,6 +315,7 @@ files:
|
|
|
301
315
|
- lib/kettle/dev/ci_monitor.rb
|
|
302
316
|
- lib/kettle/dev/commit_msg.rb
|
|
303
317
|
- lib/kettle/dev/dvcs_cli.rb
|
|
318
|
+
- lib/kettle/dev/executable_version.rb
|
|
304
319
|
- lib/kettle/dev/exit_adapter.rb
|
|
305
320
|
- lib/kettle/dev/gem_coop_versions.rb
|
|
306
321
|
- lib/kettle/dev/gem_spec_reader.rb
|
|
@@ -334,10 +349,10 @@ licenses:
|
|
|
334
349
|
- AGPL-3.0-only
|
|
335
350
|
metadata:
|
|
336
351
|
homepage_uri: https://kettle-dev.galtzo.com
|
|
337
|
-
source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.
|
|
338
|
-
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.
|
|
352
|
+
source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.4.1
|
|
353
|
+
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.4.1/CHANGELOG.md
|
|
339
354
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
|
|
340
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.
|
|
355
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.4.1
|
|
341
356
|
funding_uri: https://github.com/sponsors/pboling
|
|
342
357
|
wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
|
|
343
358
|
news_uri: https://www.railsbling.com/tags/kettle-dev
|
metadata.gz.sig
CHANGED
|
Binary file
|