hiiro 0.1.276 → 0.1.277
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
- data/CHANGELOG.md +6 -1
- data/bin/h-pr +51 -49
- data/lib/hiiro/version.rb +1 -1
- data/lib/hiiro.rb +24 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3c0ebae864202a90016b7b7df7f65a32836cc11c144ea85638a9c75b22279b72
|
|
4
|
+
data.tar.gz: 9a5e414ec3dc428f932acdaf47f989c80d2ca50a1fd19fe4d2d7fa9e4c634a76
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4cbdc7c7029c4acfbf6720c47d63d330bb71c270ba1546d76e743a6c05fef40f98229458a39d981627fb49767fac3c63e745b681e12ddde30e180b251ac94087
|
|
7
|
+
data.tar.gz: 3a95e13a5ebc85325d8426d398812499924bc8605f7e5e0e785cbb16b3ffafa6161ec7d04d1ff72387286779f8142bcff3f338348c35791192b1d97c72e5f780
|
data/CHANGELOG.md
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
Done. CHANGELOG.md
|
|
1
|
+
Done. Updated CHANGELOG.md:
|
|
2
|
+
|
|
3
|
+
- Moved `Hiiro#add_resolver` and `Hiiro#resolve` from the Unreleased section to the new v0.1.277 release section (2026-03-24)
|
|
4
|
+
- Added them to the Added subsection of v0.1.277
|
|
5
|
+
- Added a Changed entry documenting the `h pr` refactoring that uses these new methods
|
|
6
|
+
- Updated the Unreleased section to remove these items and add a note in Changed about the `h pr` refactoring
|
data/bin/h-pr
CHANGED
|
@@ -589,46 +589,48 @@ FILTER_OPTS = Proc.new {
|
|
|
589
589
|
Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
590
590
|
pinned_manager = PinnedPRManager.new
|
|
591
591
|
|
|
592
|
-
|
|
593
|
-
|
|
592
|
+
add_resolver(:pr,
|
|
593
|
+
-> {
|
|
594
594
|
pinned = pinned_manager.load_pinned
|
|
595
595
|
if pinned.empty?
|
|
596
596
|
STDERR.puts "No tracked PRs. Use a PR number or 'h pr track' to track PRs."
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
597
|
+
nil
|
|
598
|
+
else
|
|
599
|
+
lines = pinned.each_with_index.each_with_object({}) do |(pr, idx), h|
|
|
600
|
+
h[pinned_manager.strip_ansi(pinned_manager.display_pinned(pr, idx, oneline: true))] = pr.number.to_s
|
|
601
|
+
end
|
|
602
|
+
fuzzyfind_from_map(lines)
|
|
601
603
|
end
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
604
|
+
}
|
|
605
|
+
) do |ref|
|
|
605
606
|
if (pin_value = pins.get(ref.to_s))
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
607
|
+
pin_value
|
|
608
|
+
else
|
|
609
|
+
pinned = pinned_manager.load_pinned
|
|
610
|
+
if pinned.any? { |pr| pr.number.to_s == ref.to_s }
|
|
611
|
+
ref.to_s
|
|
612
|
+
elsif ref.to_s =~ /^\d+$/ && ref.to_i > 0
|
|
613
|
+
slot = ref.to_i
|
|
614
|
+
by_slot = pinned.find { |p| p.slot.to_i == slot }
|
|
615
|
+
if by_slot
|
|
616
|
+
by_slot.number.to_s
|
|
617
|
+
elsif slot - 1 < pinned.length
|
|
618
|
+
# Fall back to 1-based index for unslotted data
|
|
619
|
+
pinned[slot - 1].number.to_s
|
|
620
|
+
else
|
|
621
|
+
ref.to_s
|
|
622
|
+
end
|
|
623
|
+
else
|
|
624
|
+
ref.to_s
|
|
625
|
+
end
|
|
622
626
|
end
|
|
623
|
-
|
|
624
|
-
ref.to_s
|
|
625
|
-
}
|
|
627
|
+
end
|
|
626
628
|
|
|
627
629
|
watch_block = ->(original_pr_number=nil, *watch_args) {
|
|
628
630
|
watch = get_value(:watch)
|
|
629
631
|
fail_fast = get_value(:fail_fast)
|
|
630
632
|
|
|
631
|
-
pr_number =
|
|
633
|
+
pr_number = resolve(:pr, original_pr_number)
|
|
632
634
|
return unless pr_number
|
|
633
635
|
|
|
634
636
|
base_cmd = %w[gh pr checks]
|
|
@@ -678,7 +680,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
678
680
|
}
|
|
679
681
|
|
|
680
682
|
add_subcmd(:link) { |ref=nil|
|
|
681
|
-
pr_number =
|
|
683
|
+
pr_number = resolve(:pr, ref)
|
|
682
684
|
next unless pr_number
|
|
683
685
|
|
|
684
686
|
pinned = pinned_manager.load_pinned
|
|
@@ -709,14 +711,14 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
709
711
|
next
|
|
710
712
|
end
|
|
711
713
|
end
|
|
712
|
-
pr_number =
|
|
714
|
+
pr_number = resolve(:pr, pr_number)
|
|
713
715
|
next unless pr_number
|
|
714
716
|
pinned = pinned_manager.load_pinned
|
|
715
717
|
pr = pinned.find { |p| p.number.to_s == pr_number.to_s }
|
|
716
718
|
pr&.url ? system('open', pr.url) : system('gh', 'pr', 'view', pr_number.to_s, '--web')
|
|
717
719
|
}
|
|
718
720
|
add_subcmd(:view) { |pr_number=nil|
|
|
719
|
-
pr_number =
|
|
721
|
+
pr_number = resolve(:pr, pr_number)
|
|
720
722
|
system('gh', 'pr', 'view', pr_number.to_s) if pr_number
|
|
721
723
|
}
|
|
722
724
|
|
|
@@ -1124,7 +1126,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1124
1126
|
end
|
|
1125
1127
|
|
|
1126
1128
|
add_subcmd(:attach) do |ref = nil|
|
|
1127
|
-
pr_number =
|
|
1129
|
+
pr_number = resolve(:pr, ref)
|
|
1128
1130
|
next unless pr_number
|
|
1129
1131
|
|
|
1130
1132
|
pinned = pinned_manager.load_pinned
|
|
@@ -1222,13 +1224,13 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1222
1224
|
# === PR State ===
|
|
1223
1225
|
|
|
1224
1226
|
add_subcmd(:ready) do |ref = nil|
|
|
1225
|
-
pr_number =
|
|
1227
|
+
pr_number = resolve(:pr, ref)
|
|
1226
1228
|
next unless pr_number
|
|
1227
1229
|
system('gh', 'pr', 'ready', pr_number.to_s)
|
|
1228
1230
|
end
|
|
1229
1231
|
|
|
1230
1232
|
add_subcmd(:'to-draft') do |ref = nil|
|
|
1231
|
-
pr_number =
|
|
1233
|
+
pr_number = resolve(:pr, ref)
|
|
1232
1234
|
next unless pr_number
|
|
1233
1235
|
system('gh', 'pr', 'ready', '--draft', pr_number.to_s)
|
|
1234
1236
|
end
|
|
@@ -1236,25 +1238,25 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1236
1238
|
# === PR Actions ===
|
|
1237
1239
|
|
|
1238
1240
|
add_subcmd(:diff) do |ref = nil|
|
|
1239
|
-
pr_number =
|
|
1241
|
+
pr_number = resolve(:pr, ref)
|
|
1240
1242
|
next unless pr_number
|
|
1241
1243
|
system('gh', 'pr', 'diff', pr_number.to_s)
|
|
1242
1244
|
end
|
|
1243
1245
|
|
|
1244
1246
|
add_subcmd(:checkout) do |ref = nil|
|
|
1245
|
-
pr_number =
|
|
1247
|
+
pr_number = resolve(:pr, ref)
|
|
1246
1248
|
next unless pr_number
|
|
1247
1249
|
system('gh', 'pr', 'checkout', pr_number.to_s)
|
|
1248
1250
|
end
|
|
1249
1251
|
|
|
1250
1252
|
add_subcmd(:merge) do |ref = nil, *merge_args|
|
|
1251
|
-
pr_number =
|
|
1253
|
+
pr_number = resolve(:pr, ref)
|
|
1252
1254
|
next unless pr_number
|
|
1253
1255
|
system('gh', 'pr', 'merge', pr_number.to_s, *merge_args)
|
|
1254
1256
|
end
|
|
1255
1257
|
|
|
1256
1258
|
add_subcmd(:sync) do |ref = nil|
|
|
1257
|
-
pr_number =
|
|
1259
|
+
pr_number = resolve(:pr, ref)
|
|
1258
1260
|
next unless pr_number
|
|
1259
1261
|
|
|
1260
1262
|
print "Syncing ##{pr_number} with base branch (rebase)... "
|
|
@@ -1299,7 +1301,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1299
1301
|
else
|
|
1300
1302
|
# Resolve each positional arg as a PR ref
|
|
1301
1303
|
opts.args.map { |ref|
|
|
1302
|
-
pr_num =
|
|
1304
|
+
pr_num = resolve(:pr, ref)
|
|
1303
1305
|
next nil unless pr_num
|
|
1304
1306
|
pinned.find { |p| p.number.to_s == pr_num.to_s }
|
|
1305
1307
|
}.compact
|
|
@@ -1343,7 +1345,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1343
1345
|
end
|
|
1344
1346
|
|
|
1345
1347
|
add_subcmd(:comment) do |ref = nil|
|
|
1346
|
-
pr_number =
|
|
1348
|
+
pr_number = resolve(:pr, ref)
|
|
1347
1349
|
next unless pr_number
|
|
1348
1350
|
|
|
1349
1351
|
tmpfile = Tempfile.new(['pr-comment-', '.md'])
|
|
@@ -1419,7 +1421,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1419
1421
|
template_path = fuzzyfind_from_map(template_map)
|
|
1420
1422
|
next unless template_path
|
|
1421
1423
|
|
|
1422
|
-
pr_number =
|
|
1424
|
+
pr_number = resolve(:pr, ref)
|
|
1423
1425
|
next unless pr_number
|
|
1424
1426
|
|
|
1425
1427
|
body = File.read(template_path).strip
|
|
@@ -1525,7 +1527,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1525
1527
|
next
|
|
1526
1528
|
end
|
|
1527
1529
|
|
|
1528
|
-
pr_number =
|
|
1530
|
+
pr_number = resolve(:pr, ref)
|
|
1529
1531
|
next unless pr_number
|
|
1530
1532
|
|
|
1531
1533
|
pinned = pinned_manager.load_pinned
|
|
@@ -1548,7 +1550,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1548
1550
|
next
|
|
1549
1551
|
end
|
|
1550
1552
|
|
|
1551
|
-
pr_number =
|
|
1553
|
+
pr_number = resolve(:pr, ref)
|
|
1552
1554
|
next unless pr_number
|
|
1553
1555
|
|
|
1554
1556
|
pinned = pinned_manager.load_pinned
|
|
@@ -1900,10 +1902,10 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1900
1902
|
next
|
|
1901
1903
|
end
|
|
1902
1904
|
|
|
1903
|
-
pr_number =
|
|
1905
|
+
pr_number = resolve(:pr, ref)
|
|
1904
1906
|
next unless pr_number
|
|
1905
1907
|
|
|
1906
|
-
dep_numbers = dep_refs.map { |r|
|
|
1908
|
+
dep_numbers = dep_refs.map { |r| resolve(:pr, r) }.compact
|
|
1907
1909
|
if dep_numbers.empty?
|
|
1908
1910
|
puts "No valid dependency PRs resolved"
|
|
1909
1911
|
next
|
|
@@ -1927,7 +1929,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1927
1929
|
next
|
|
1928
1930
|
end
|
|
1929
1931
|
|
|
1930
|
-
pr_number =
|
|
1932
|
+
pr_number = resolve(:pr, ref)
|
|
1931
1933
|
next unless pr_number
|
|
1932
1934
|
|
|
1933
1935
|
pinned = pinned_manager.load_pinned
|
|
@@ -1941,7 +1943,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1941
1943
|
pr.depends_on = nil
|
|
1942
1944
|
puts "Cleared all dependencies from ##{pr_number}"
|
|
1943
1945
|
else
|
|
1944
|
-
dep_numbers = dep_refs.map { |r|
|
|
1946
|
+
dep_numbers = dep_refs.map { |r| resolve(:pr, r) }.compact.map(&:to_i)
|
|
1945
1947
|
pr.depends_on = (Array(pr.depends_on) - dep_numbers).then { |d| d.empty? ? nil : d }
|
|
1946
1948
|
puts "Removed dep(s) #{dep_numbers.map { |n| "##{n}" }.join(', ')} from ##{pr_number}"
|
|
1947
1949
|
puts " Remaining: #{Array(pr.depends_on).map { |n| "##{n}" }.join(', ').then { |s| s.empty? ? '(none)' : s }}"
|
|
@@ -1954,7 +1956,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
1954
1956
|
pinned = pinned_manager.load_pinned
|
|
1955
1957
|
|
|
1956
1958
|
if ref
|
|
1957
|
-
pr_number =
|
|
1959
|
+
pr_number = resolve(:pr, ref)
|
|
1958
1960
|
next unless pr_number
|
|
1959
1961
|
pr = pinned.find { |p| p.number.to_s == pr_number.to_s }
|
|
1960
1962
|
unless pr
|
data/lib/hiiro/version.rb
CHANGED
data/lib/hiiro.rb
CHANGED
|
@@ -199,7 +199,14 @@ class Hiiro
|
|
|
199
199
|
|
|
200
200
|
child_bin_name = [bin, child_subcmd.to_s].join(?-)
|
|
201
201
|
|
|
202
|
-
|
|
202
|
+
parent_resolvers = @resolvers&.dup
|
|
203
|
+
|
|
204
|
+
wrapper = lambda do |h|
|
|
205
|
+
h.instance_variable_set(:@resolvers, parent_resolvers.dup) if parent_resolvers
|
|
206
|
+
block.arity == 1 ? block.call(h) : h.instance_eval(&block) if block
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
Hiiro.init(bin_name: child_bin_name, args: child_args, **kwargs, &wrapper)
|
|
203
210
|
end
|
|
204
211
|
|
|
205
212
|
def run_child(custom_subcmd=nil, custom_args=nil, **kwargs, &block)
|
|
@@ -286,6 +293,22 @@ class Hiiro
|
|
|
286
293
|
options.flag(name, **kwargs)
|
|
287
294
|
end
|
|
288
295
|
|
|
296
|
+
def add_resolver(name, current = nil, &lookup)
|
|
297
|
+
@resolvers ||= {}
|
|
298
|
+
@resolvers[name.to_sym] = { current:, lookup: }
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def resolve(name, ref = nil)
|
|
302
|
+
@resolvers ||= {}
|
|
303
|
+
r = @resolvers[name.to_sym] or raise "No resolver registered for :#{name}"
|
|
304
|
+
if ref.nil?
|
|
305
|
+
c = r[:current]
|
|
306
|
+
c.respond_to?(:call) ? c.call : c
|
|
307
|
+
else
|
|
308
|
+
r[:lookup]&.call(ref)
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
289
312
|
def add_cmd(*names, args: [], opts: [], &block)
|
|
290
313
|
cmd_opts = options.select(opts)
|
|
291
314
|
|