hiiro 0.1.123 → 0.1.124
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/bin/h-link +7 -1
- data/bin/h-pr +162 -26
- data/bin/h-session +1 -3
- data/exe/h +29 -0
- data/lib/hiiro/queue.rb +10 -7
- data/lib/hiiro/tasks.rb +30 -18
- data/lib/hiiro/version.rb +1 -1
- data/scripts/compare +2 -2
- 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: 07e567369471f9f5c5aacb65fe7e7a29df6f7125cca138a2788567597abd1a2e
|
|
4
|
+
data.tar.gz: c6bc9ae5a1d181e15e255ce831ee13b52ef277cfc9e4dd06e35330c5b368207f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8ee763ca17e6f61efc9ca7e9e5eedb8ceec4609936c2a11c850c5efd63ba7297f1112d852e07f68ab52e6c79c89c6279eb677c385ff4427285af9e4f2d4e446d
|
|
7
|
+
data.tar.gz: 4f4c032a247b5fb4bdb81420cd92e98bea0cac9853270e05eaa57050b73e7f0ef68a379f3ac758133c4ca9de42d3021b3dce10f93042530bd268aa87b4563bbf
|
data/bin/h-link
CHANGED
|
@@ -7,6 +7,10 @@ require 'pry'
|
|
|
7
7
|
require 'tempfile'
|
|
8
8
|
require "hiiro"
|
|
9
9
|
|
|
10
|
+
opts = Hiiro::Options.setup {
|
|
11
|
+
option(:shorthand, short: :s)
|
|
12
|
+
}
|
|
13
|
+
|
|
10
14
|
class LinkManager
|
|
11
15
|
LINKS_FILE = File.join(Dir.home, '.config/hiiro/links.yml')
|
|
12
16
|
LINK_TEMPLATE = {
|
|
@@ -215,10 +219,12 @@ Hiiro.run(*ARGV, plugins: [Pins], links_file: lm.links_file) do
|
|
|
215
219
|
url = add_args.shift
|
|
216
220
|
description = add_args.join(' ')
|
|
217
221
|
|
|
222
|
+
vals = opts.parse!(add_args)
|
|
223
|
+
|
|
218
224
|
new_link = LinkManager::Link.new(
|
|
219
225
|
url: url,
|
|
220
226
|
description: description,
|
|
221
|
-
shorthand:
|
|
227
|
+
shorthand: vals.shorthand,
|
|
222
228
|
created_at: Time.now.iso8601
|
|
223
229
|
)
|
|
224
230
|
|
data/bin/h-pr
CHANGED
|
@@ -16,16 +16,6 @@ class PRManager
|
|
|
16
16
|
@hiiro = hiiro
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def help
|
|
20
|
-
puts "Usage: h pr <subcommand> [args]"
|
|
21
|
-
puts
|
|
22
|
-
puts "Subcommands:"
|
|
23
|
-
puts " save [PR_NUMBER] Record PR for this task (auto-detects if omitted)"
|
|
24
|
-
puts " current Show current branch's PR info"
|
|
25
|
-
puts " open [PR_NUMBER] Open PR in browser"
|
|
26
|
-
puts " view [PR_NUMBER] View PR details in terminal"
|
|
27
|
-
end
|
|
28
|
-
|
|
29
19
|
def save(pr_number = nil)
|
|
30
20
|
pr_info = fetch_pr_info(pr_number)
|
|
31
21
|
unless pr_info
|
|
@@ -266,7 +256,131 @@ class PinnedPRManager
|
|
|
266
256
|
(authored_prs + assigned_prs).uniq { |pr| pr['number'] }
|
|
267
257
|
end
|
|
268
258
|
|
|
269
|
-
def
|
|
259
|
+
def needs_refresh?(pr, force: false)
|
|
260
|
+
return true if force
|
|
261
|
+
return true unless pr['last_checked']
|
|
262
|
+
|
|
263
|
+
last_check_time = Time.parse(pr['last_checked']) rescue nil
|
|
264
|
+
return true unless last_check_time
|
|
265
|
+
|
|
266
|
+
# Refresh if last check was more than 2 minutes ago
|
|
267
|
+
(Time.now - last_check_time) > 120
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def batch_fetch_pr_info(pr_numbers)
|
|
272
|
+
return {} if pr_numbers.empty?
|
|
273
|
+
|
|
274
|
+
# Build GraphQL query to fetch multiple PRs at once
|
|
275
|
+
pr_queries = pr_numbers.map.with_index do |num, idx|
|
|
276
|
+
<<~GRAPHQL.strip
|
|
277
|
+
pr#{idx}: pullRequest(number: #{num}) {
|
|
278
|
+
number
|
|
279
|
+
title
|
|
280
|
+
url
|
|
281
|
+
headRefName
|
|
282
|
+
state
|
|
283
|
+
isDraft
|
|
284
|
+
mergeable
|
|
285
|
+
reviewDecision
|
|
286
|
+
statusCheckRollup {
|
|
287
|
+
contexts {
|
|
288
|
+
... on CheckRun {
|
|
289
|
+
conclusion
|
|
290
|
+
status
|
|
291
|
+
}
|
|
292
|
+
... on StatusContext {
|
|
293
|
+
state
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
reviews(last: 50) {
|
|
298
|
+
nodes {
|
|
299
|
+
author {
|
|
300
|
+
login
|
|
301
|
+
}
|
|
302
|
+
state
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
GRAPHQL
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
query = <<~GRAPHQL
|
|
310
|
+
query {
|
|
311
|
+
repository(owner: "instacart", name: "carrot") {
|
|
312
|
+
#{pr_queries.join("\n")}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
GRAPHQL
|
|
316
|
+
|
|
317
|
+
result = `gh api graphql -f query='#{query.gsub("'", "'\\''")}' 2>/dev/null`
|
|
318
|
+
return {} if result.empty?
|
|
319
|
+
|
|
320
|
+
data = JSON.parse(result)
|
|
321
|
+
repo_data = data.dig('data', 'repository')
|
|
322
|
+
return {} unless repo_data
|
|
323
|
+
|
|
324
|
+
# Convert GraphQL response to hash keyed by PR number
|
|
325
|
+
pr_info_by_number = {}
|
|
326
|
+
pr_numbers.each_with_index do |num, idx|
|
|
327
|
+
pr_data = repo_data["pr#{idx}"]
|
|
328
|
+
next unless pr_data
|
|
329
|
+
|
|
330
|
+
# Transform GraphQL response to match gh pr view format
|
|
331
|
+
pr_info_by_number[num] = {
|
|
332
|
+
'number' => pr_data['number'],
|
|
333
|
+
'title' => pr_data['title'],
|
|
334
|
+
'url' => pr_data['url'],
|
|
335
|
+
'headRefName' => pr_data['headRefName'],
|
|
336
|
+
'state' => pr_data['state'],
|
|
337
|
+
'isDraft' => pr_data['isDraft'],
|
|
338
|
+
'mergeable' => pr_data['mergeable'],
|
|
339
|
+
'reviewDecision' => pr_data['reviewDecision'],
|
|
340
|
+
'statusCheckRollup' => pr_data['statusCheckRollup'],
|
|
341
|
+
'reviews' => pr_data.dig('reviews', 'nodes') || []
|
|
342
|
+
}
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
pr_info_by_number
|
|
346
|
+
rescue JSON::ParserError, StandardError
|
|
347
|
+
{}
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def refresh_all_status(prs, force: false)
|
|
351
|
+
# Determine which PRs need refreshing
|
|
352
|
+
prs_to_refresh = prs.select { |pr| needs_refresh?(pr, force: force) }
|
|
353
|
+
|
|
354
|
+
if prs_to_refresh.empty?
|
|
355
|
+
puts "All PRs recently checked (within last 2 minutes). Use -U to force update." unless force
|
|
356
|
+
return prs
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Batch fetch all PR info at once
|
|
360
|
+
pr_numbers = prs_to_refresh.map { |pr| pr['number'] }
|
|
361
|
+
fetched_info = batch_fetch_pr_info(pr_numbers)
|
|
362
|
+
|
|
363
|
+
# Update each PR with fetched info
|
|
364
|
+
prs_to_refresh.each do |pr|
|
|
365
|
+
info = fetched_info[pr['number']]
|
|
366
|
+
next unless info
|
|
367
|
+
|
|
368
|
+
pr['state'] = info['state']
|
|
369
|
+
pr['title'] = info['title']
|
|
370
|
+
pr['checks'] = summarize_checks(info['statusCheckRollup'])
|
|
371
|
+
pr['reviews'] = summarize_reviews(info['reviews'])
|
|
372
|
+
pr['review_decision'] = info['reviewDecision']
|
|
373
|
+
pr['is_draft'] = info['isDraft']
|
|
374
|
+
pr['mergeable'] = info['mergeable']
|
|
375
|
+
pr['last_checked'] = Time.now.iso8601
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
prs
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def refresh_status(pr, force: false)
|
|
382
|
+
return pr unless needs_refresh?(pr, force: force)
|
|
383
|
+
|
|
270
384
|
info = fetch_pr_info(pr['number'])
|
|
271
385
|
return pr unless info
|
|
272
386
|
|
|
@@ -661,12 +775,14 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
661
775
|
end
|
|
662
776
|
|
|
663
777
|
compact = status_args.include?('-c') || status_args.include?('--compact')
|
|
778
|
+
force = status_args.include?('-U') || status_args.include?('--force-update')
|
|
664
779
|
|
|
665
780
|
puts "Refreshing status for #{pinned.length} pinned PR(s)..."
|
|
666
781
|
puts
|
|
667
782
|
|
|
783
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
784
|
+
|
|
668
785
|
pinned.each_with_index do |pr, idx|
|
|
669
|
-
pinned_manager.refresh_status(pr)
|
|
670
786
|
if compact
|
|
671
787
|
puts pinned_manager.display_pinned(pr, idx)
|
|
672
788
|
else
|
|
@@ -680,7 +796,7 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
680
796
|
puts "Status updated at #{Time.now.strftime('%H:%M:%S')}"
|
|
681
797
|
end
|
|
682
798
|
|
|
683
|
-
add_subcmd(:update) do
|
|
799
|
+
add_subcmd(:update) do |*update_args|
|
|
684
800
|
pinned = pinned_manager.load_pinned
|
|
685
801
|
|
|
686
802
|
if pinned.empty?
|
|
@@ -688,15 +804,19 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
688
804
|
next
|
|
689
805
|
end
|
|
690
806
|
|
|
807
|
+
force = update_args.include?('-U') || update_args.include?('--force-update')
|
|
808
|
+
|
|
691
809
|
puts "Updating status for #{pinned.length} PR(s)..."
|
|
692
|
-
pinned
|
|
810
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
693
811
|
pinned_manager.save_pinned(pinned)
|
|
694
812
|
puts "Done."
|
|
695
813
|
end
|
|
696
814
|
|
|
697
|
-
add_subcmd(:green) do
|
|
815
|
+
add_subcmd(:green) do |*green_args|
|
|
698
816
|
pinned = pinned_manager.load_pinned
|
|
699
|
-
|
|
817
|
+
force = green_args.include?('-U') || green_args.include?('--force-update')
|
|
818
|
+
|
|
819
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
700
820
|
pinned_manager.save_pinned(pinned)
|
|
701
821
|
|
|
702
822
|
filtered = pinned.select { |pr|
|
|
@@ -714,9 +834,11 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
714
834
|
filtered.each_with_index { |pr, i| puts pinned_manager.display_pinned(pr, i) }
|
|
715
835
|
end
|
|
716
836
|
|
|
717
|
-
add_subcmd(:red) do
|
|
837
|
+
add_subcmd(:red) do |*red_args|
|
|
718
838
|
pinned = pinned_manager.load_pinned
|
|
719
|
-
|
|
839
|
+
force = red_args.include?('-U') || red_args.include?('--force-update')
|
|
840
|
+
|
|
841
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
720
842
|
pinned_manager.save_pinned(pinned)
|
|
721
843
|
|
|
722
844
|
filtered = pinned.select { |pr|
|
|
@@ -734,9 +856,11 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
734
856
|
filtered.each_with_index { |pr, i| puts pinned_manager.display_pinned(pr, i) }
|
|
735
857
|
end
|
|
736
858
|
|
|
737
|
-
add_subcmd(:old) do
|
|
859
|
+
add_subcmd(:old) do |*old_args|
|
|
738
860
|
pinned = pinned_manager.load_pinned
|
|
739
|
-
|
|
861
|
+
force = old_args.include?('-U') || old_args.include?('--force-update')
|
|
862
|
+
|
|
863
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
740
864
|
pinned_manager.save_pinned(pinned)
|
|
741
865
|
|
|
742
866
|
filtered = pinned.select { |pr| pr['state'] == 'MERGED' }
|
|
@@ -760,7 +884,8 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
760
884
|
next
|
|
761
885
|
end
|
|
762
886
|
|
|
763
|
-
|
|
887
|
+
force = args.include?('-U') || args.include?('--force-update')
|
|
888
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
764
889
|
|
|
765
890
|
merged_or_closed = pinned.select { |pr| pr['state'] == 'MERGED' || pr['state'] == 'CLOSED' }
|
|
766
891
|
|
|
@@ -782,9 +907,11 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
782
907
|
puts "Done. #{pinned_manager.load_pinned.length} PR(s) still tracked."
|
|
783
908
|
end
|
|
784
909
|
|
|
785
|
-
add_subcmd(:draft) do
|
|
910
|
+
add_subcmd(:draft) do |*draft_args|
|
|
786
911
|
pinned = pinned_manager.load_pinned
|
|
787
|
-
|
|
912
|
+
force = draft_args.include?('-U') || draft_args.include?('--force-update')
|
|
913
|
+
|
|
914
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
788
915
|
pinned_manager.save_pinned(pinned)
|
|
789
916
|
|
|
790
917
|
filtered = pinned.select { |pr| pr['is_draft'] == true }
|
|
@@ -827,7 +954,14 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
827
954
|
missing_numbers = missing.map { |pr| pr['number'] }
|
|
828
955
|
|
|
829
956
|
tmpfile = Tempfile.new(['missing-prs-', '.yml'])
|
|
830
|
-
|
|
957
|
+
lines = ['---']
|
|
958
|
+
missing.each do |pr|
|
|
959
|
+
lines << ''
|
|
960
|
+
lines << "# [#{pr['headRefName']}] #{pr['title']}"
|
|
961
|
+
lines << "# url: #{pr['url']}"
|
|
962
|
+
lines << "- #{pr['number']}"
|
|
963
|
+
end
|
|
964
|
+
tmpfile.write(lines.join("\n"))
|
|
831
965
|
tmpfile.close
|
|
832
966
|
|
|
833
967
|
system(ENV['EDITOR'] || 'nvim', tmpfile.path)
|
|
@@ -944,7 +1078,8 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
944
1078
|
end
|
|
945
1079
|
|
|
946
1080
|
# Refresh all statuses first
|
|
947
|
-
|
|
1081
|
+
force = args.include?('-U') || args.include?('--force-update')
|
|
1082
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
948
1083
|
pinned_manager.save_pinned(pinned)
|
|
949
1084
|
|
|
950
1085
|
merged = pinned.select { |pr| pr['state'] == 'MERGED' }
|
|
@@ -975,7 +1110,8 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
975
1110
|
end
|
|
976
1111
|
|
|
977
1112
|
# Refresh all statuses first
|
|
978
|
-
|
|
1113
|
+
force = args.include?('-U') || args.include?('--force-update')
|
|
1114
|
+
pinned_manager.refresh_all_status(pinned, force: force)
|
|
979
1115
|
|
|
980
1116
|
merged_or_closed = pinned.select { |pr| pr['state'] == 'MERGED' || pr['state'] == 'CLOSED' }
|
|
981
1117
|
|
data/bin/h-session
CHANGED
|
@@ -4,7 +4,7 @@ require 'hiiro'
|
|
|
4
4
|
require 'tempfile'
|
|
5
5
|
require 'yaml'
|
|
6
6
|
|
|
7
|
-
Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
7
|
+
Hiiro.run(*ARGV, tasks: true, plugins: [Pins]) do
|
|
8
8
|
tmux = tmux_client
|
|
9
9
|
|
|
10
10
|
add_subcmd(:ls, :list) { |*args|
|
|
@@ -130,7 +130,6 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
add_subcmd(:orphans) do
|
|
133
|
-
env = Environment.current
|
|
134
133
|
task_session_names = env.all_tasks.map(&:session_name)
|
|
135
134
|
orphans = env.all_sessions.reject { |s| task_session_names.include?(s.name) }
|
|
136
135
|
|
|
@@ -144,7 +143,6 @@ Hiiro.run(*ARGV, plugins: [Pins]) do
|
|
|
144
143
|
end
|
|
145
144
|
|
|
146
145
|
add_subcmd(:okill) do
|
|
147
|
-
env = Environment.current
|
|
148
146
|
task_session_names = env.all_tasks.map(&:session_name)
|
|
149
147
|
orphans = env.all_sessions.reject { |s| task_session_names.include?(s.name) }
|
|
150
148
|
|
data/exe/h
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
require "hiiro"
|
|
4
4
|
require "fileutils"
|
|
5
5
|
|
|
6
|
+
def update_hiiro
|
|
7
|
+
if `gem list hiiro`.strip.empty?
|
|
8
|
+
system('gem', 'install', 'hiiro')
|
|
9
|
+
else
|
|
10
|
+
system('gem', 'update', 'hiiro')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
system('h', 'setup')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def rbenv_versions
|
|
17
|
+
versions = `rbenv versions --bare`.lines(chomp: true)
|
|
18
|
+
end
|
|
19
|
+
|
|
6
20
|
Hiiro.run(*ARGV, cwd: Dir.pwd, tasks: true) do
|
|
7
21
|
add_subcmd(:version) { |*args|
|
|
8
22
|
puts Hiiro::VERSION
|
|
@@ -12,6 +26,21 @@ Hiiro.run(*ARGV, cwd: Dir.pwd, tasks: true) do
|
|
|
12
26
|
puts "pong"
|
|
13
27
|
}
|
|
14
28
|
|
|
29
|
+
add_subcmd(:install) { |*args|
|
|
30
|
+
opts = Hiiro::Options.setup {
|
|
31
|
+
flag(:all, short: :a)
|
|
32
|
+
}.parse!(ARGV)
|
|
33
|
+
|
|
34
|
+
if opts.all
|
|
35
|
+
rbenv_versions.each do |ver|
|
|
36
|
+
ENV['RBENV_VERSION'] = ver
|
|
37
|
+
update_hiiro
|
|
38
|
+
end
|
|
39
|
+
else
|
|
40
|
+
update_hiiro
|
|
41
|
+
end
|
|
42
|
+
}
|
|
43
|
+
|
|
15
44
|
add_subcmd(:setup) do |*args|
|
|
16
45
|
# Detect how the command was invoked to determine prefix
|
|
17
46
|
invoked_as = File.basename($0)
|
data/lib/hiiro/queue.rb
CHANGED
|
@@ -3,6 +3,7 @@ require 'fileutils'
|
|
|
3
3
|
require 'shellwords'
|
|
4
4
|
require 'time'
|
|
5
5
|
require 'front_matter_parser'
|
|
6
|
+
require 'tempfile'
|
|
6
7
|
|
|
7
8
|
class Hiiro
|
|
8
9
|
class Queue
|
|
@@ -177,7 +178,7 @@ class Hiiro
|
|
|
177
178
|
return nil unless task
|
|
178
179
|
|
|
179
180
|
{
|
|
180
|
-
task_name: task.
|
|
181
|
+
task_name: task.name,
|
|
181
182
|
tree_name: task.tree_name,
|
|
182
183
|
session_name: task.session_name,
|
|
183
184
|
}
|
|
@@ -235,8 +236,11 @@ class Hiiro
|
|
|
235
236
|
end
|
|
236
237
|
end
|
|
237
238
|
|
|
238
|
-
name = slugify(content.lines.
|
|
239
|
-
|
|
239
|
+
name = slugify(content.lines.drop_while { |l| l.strip.empty? || l.start_with?('---') || l.match?(/^\w+:/) }.first.to_s.strip)
|
|
240
|
+
|
|
241
|
+
if name.empty?
|
|
242
|
+
name = Time.now.strftime("%Y%m%d%H%M%S") + '-' + task_info[:task_name]
|
|
243
|
+
end
|
|
240
244
|
|
|
241
245
|
base_name = name
|
|
242
246
|
counter = 1
|
|
@@ -394,14 +398,13 @@ class Hiiro
|
|
|
394
398
|
args, flag_task = q.extract_task_flag(args)
|
|
395
399
|
ti = flag_task ? q.task_info_for(flag_task) : task_info
|
|
396
400
|
|
|
401
|
+
tmpfile = Tempfile.new(['hq-', '.md'])
|
|
402
|
+
prompt_file = tmpfile.path
|
|
397
403
|
if args.empty? && !$stdin.tty?
|
|
398
404
|
content = $stdin.read.strip
|
|
399
405
|
elsif args.any?
|
|
400
406
|
content = args.join(' ')
|
|
401
407
|
else
|
|
402
|
-
require 'tempfile'
|
|
403
|
-
tmpfile = Tempfile.new(['hq-', '.md'])
|
|
404
|
-
|
|
405
408
|
# Pre-fill with frontmatter template if task_info is available
|
|
406
409
|
if ti
|
|
407
410
|
fm_lines = ["---"]
|
|
@@ -424,7 +427,7 @@ class Hiiro
|
|
|
424
427
|
end
|
|
425
428
|
end
|
|
426
429
|
|
|
427
|
-
result = q.add_with_frontmatter(content
|
|
430
|
+
result = q.add_with_frontmatter(content)
|
|
428
431
|
if result
|
|
429
432
|
puts "Created: #{result[:path]}"
|
|
430
433
|
else
|
data/lib/hiiro/tasks.rb
CHANGED
|
@@ -177,21 +177,15 @@ class Hiiro
|
|
|
177
177
|
|
|
178
178
|
items.each do |task|
|
|
179
179
|
marker = (current && current.name == task.name) ? "*" : " "
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
branch_str = branch ? " [#{branch}]" : ""
|
|
183
|
-
|
|
184
|
-
display_name = scope == :subtask ? task.short_name : task.name
|
|
185
|
-
puts format("%s %-25s tree: %-20s%s", marker, display_name, task.tree_name || '(none)', branch_str)
|
|
180
|
+
line = task.display_line(scope: scope, environment: environment)
|
|
181
|
+
puts "#{marker} #{line}"
|
|
186
182
|
|
|
187
183
|
if scope == :task
|
|
188
184
|
subs = subtasks(task)
|
|
189
185
|
subs.each do |st|
|
|
190
186
|
sub_marker = (current && current.name == st.name) ? "*" : " "
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
sub_branch_str = sub_branch ? " [#{sub_branch}]" : ""
|
|
194
|
-
puts format("%s - %-23s tree: %-20s%s", sub_marker, st.short_name, st.tree_name || '(none)', sub_branch_str)
|
|
187
|
+
sub_line = st.display_line(scope: :subtask, environment: environment)
|
|
188
|
+
puts "#{sub_marker} - #{sub_line}"
|
|
195
189
|
end
|
|
196
190
|
end
|
|
197
191
|
end
|
|
@@ -352,14 +346,20 @@ class Hiiro
|
|
|
352
346
|
# --- Interactive selection with sk ---
|
|
353
347
|
|
|
354
348
|
def select_task_interactive(prompt = nil)
|
|
355
|
-
|
|
356
|
-
tasks.
|
|
349
|
+
task_list = if scope == :subtask
|
|
350
|
+
tasks.sort_by(&:short_name)
|
|
357
351
|
else
|
|
358
|
-
environment.all_tasks.
|
|
352
|
+
environment.all_tasks.sort_by(&:name)
|
|
359
353
|
end
|
|
360
|
-
return nil if
|
|
354
|
+
return nil if task_list.empty?
|
|
361
355
|
|
|
362
|
-
|
|
356
|
+
mapping = task_list.each_with_object({}) do |task, h|
|
|
357
|
+
display_name = scope == :subtask ? task.short_name : task.name
|
|
358
|
+
line = task.display_line(scope: scope, environment: environment)
|
|
359
|
+
h[line] = display_name
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
hiiro.fuzzyfind_from_map(mapping)
|
|
363
363
|
end
|
|
364
364
|
|
|
365
365
|
def value_for_task(task_name = nil, &block)
|
|
@@ -645,8 +645,7 @@ class Hiiro
|
|
|
645
645
|
|
|
646
646
|
task_info = if task
|
|
647
647
|
{
|
|
648
|
-
task_name: task.
|
|
649
|
-
subtask_name: task.subtask? ? task.short_name : nil,
|
|
648
|
+
task_name: task.name,
|
|
650
649
|
tree: task.tree_name,
|
|
651
650
|
branch: task.branch,
|
|
652
651
|
session: task.session_name
|
|
@@ -761,7 +760,7 @@ class Hiiro
|
|
|
761
760
|
task = tm.current_task
|
|
762
761
|
task_info = if task
|
|
763
762
|
{
|
|
764
|
-
task_name: task.
|
|
763
|
+
task_name: task.name,
|
|
765
764
|
tree_name: task.tree_name,
|
|
766
765
|
session_name: task.session_name
|
|
767
766
|
}
|
|
@@ -894,6 +893,19 @@ class Hiiro
|
|
|
894
893
|
h[:session] = session_name if session_name != name
|
|
895
894
|
h
|
|
896
895
|
end
|
|
896
|
+
|
|
897
|
+
def display_line(scope: :task, environment:)
|
|
898
|
+
display_name = (scope == :subtask) ? short_name : name
|
|
899
|
+
tree = environment.find_tree(tree_name)
|
|
900
|
+
branch = tree&.branch || (tree&.detached? ? '(detached)' : '(none)')
|
|
901
|
+
session = session_name || '(none)'
|
|
902
|
+
|
|
903
|
+
format("%-25s tree: %-20s branch: %-20s session: %s",
|
|
904
|
+
display_name,
|
|
905
|
+
tree_name || '(none)',
|
|
906
|
+
branch,
|
|
907
|
+
session)
|
|
908
|
+
end
|
|
897
909
|
end
|
|
898
910
|
|
|
899
911
|
class App
|
data/lib/hiiro/version.rb
CHANGED
data/scripts/compare
CHANGED
|
@@ -8,7 +8,7 @@ diff_dirs() {
|
|
|
8
8
|
|
|
9
9
|
# s@Only in \(bin|plugins\): \(.*\)@cp -v \1/\2 $HOME/\1/@;
|
|
10
10
|
|
|
11
|
-
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@
|
|
11
|
+
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@safe_nvim -d \\1 \\2@" | egrep 'cp -'
|
|
12
12
|
|
|
13
|
-
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@
|
|
13
|
+
diff_dirs | sed -E "s@Only in @@;s@: @/@;s@^(/.*(bin|plugins).*)@cp -v \\1 \\2/@;s@^(bin.*)@cp -v \\1 $HOME/bin/@;s@^(plugins.*)@cp -v \\1 $HOME/.config/hiiro/plugins/@;s@Files (.*) and (.*) differ@safe_nvim -d \\1 \\2@" | egrep -v 'cp -'
|
|
14
14
|
|