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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09c953336eb16ea65b0e501937a1ce3ca9d478a4290f4e17b01fd357b61c2bcf'
4
- data.tar.gz: eba72473fabb36214727ef277e8fde1424d3af1660e6f9102fce2079385d07ab
3
+ metadata.gz: 07e567369471f9f5c5aacb65fe7e7a29df6f7125cca138a2788567597abd1a2e
4
+ data.tar.gz: c6bc9ae5a1d181e15e255ce831ee13b52ef277cfc9e4dd06e35330c5b368207f
5
5
  SHA512:
6
- metadata.gz: 14063fe4372147c627525a7837a1d825d10d5c7a9d2507497830f02b031bf38cc7c013f974135cf070fac2a6763d65729dfb078ef956d77be77f4744405bc000
7
- data.tar.gz: a4bcdf2b1d9d6de4ce1df9c86170cd96468a9d609cd09c5b242ea25adcf342e12fd97e159ca96de793a58fd929192cc8b21eb1be2434b6fc85e3318d29046af2
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: nil,
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 refresh_status(pr)
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.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- tmpfile.write(missing_numbers.to_yaml)
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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
- pinned.each { |pr| pinned_manager.refresh_status(pr) }
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.subtask? ? task.parent_name : task.name,
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.reject { |l| l.start_with?('---') || l.match?(/^\w+:/) }.first.to_s.strip)
239
- return nil if name.empty?
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, task_info: ti)
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
- tree = environment.find_tree(task.tree_name)
181
- branch = tree&.branch || (tree&.detached? ? '(detached)' : nil)
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
- sub_tree = environment.find_tree(st.tree_name)
192
- sub_branch = sub_tree&.branch || (sub_tree&.detached? ? '(detached)' : nil)
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
- names = if scope == :subtask
356
- tasks.map(&:short_name)
349
+ task_list = if scope == :subtask
350
+ tasks.sort_by(&:short_name)
357
351
  else
358
- environment.all_tasks.map(&:name)
352
+ environment.all_tasks.sort_by(&:name)
359
353
  end
360
- return nil if names.empty?
354
+ return nil if task_list.empty?
361
355
 
362
- hiiro.fuzzyfind(names.sort)
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.subtask? ? task.parent_name : task.name,
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.subtask? ? task.parent_name : task.name,
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
@@ -1,3 +1,3 @@
1
1
  class Hiiro
2
- VERSION = "0.1.123"
2
+ VERSION = "0.1.124"
3
3
  end
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@vim -d \\1 \\2@" | egrep 'cp -'
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@vim -d \\1 \\2@" | egrep -v 'cp -'
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
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiiro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.123
4
+ version: 0.1.124
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Toyota