na 1.2.53 → 1.2.54

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: 8cecace1a262d294c8ef240dd6413f488b736fc04b7a5edaff413df8184ce2c8
4
- data.tar.gz: 2d34dedd3c0cedc257ad1e7761afab581522aed6d97aa48ad53f4e1b424b1c68
3
+ metadata.gz: 3d67defa193fd36e28d744d1b42a56ef6815db6b4994b07a5d7fa4af447ca14c
4
+ data.tar.gz: cf5e9a3e396ad102e0b15481873affcea80d1bb0a7571136992957d920de5db7
5
5
  SHA512:
6
- metadata.gz: a46c75398d031fa5a4d029ab99bf6df3cdc3958cbda22de87402480f5327afcfaed5b9353df6515a7610990b5d97e5553e37a94186402c0af0cb817bb7b59674
7
- data.tar.gz: 705c122dbd8714a18676b633f201707a515d69e3e24ddbce2c008cce498e3ccdf4f9b3829f3e28e474b5aaa1e41de93ed775da14bc414db16649bece9ab185cc
6
+ metadata.gz: 38fbd19efd1897a91c1a0c0440a390748a8e51ab481c9b2b41b0011644623f9b091be8b26ff23afdeb8f990b42e2ba924c6df4634eb6fec4aa17a9c60fd40b6e
7
+ data.tar.gz: 79b7d7b7f016d5307fc7604ddafebea525a3c4ce5f3fa7a923921b2502dec4ba697dc8f4c59cab4df9d2ed90b487a3566e230d9f2d6cb258881a1ff16fab7f31
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ### 1.2.54
2
+
3
+ 2023-09-11 10:11
4
+
5
+ #### IMPROVED
6
+
7
+ - Allow selection of action if no search text is provided for tag command
8
+ - If the terminal is less than 60 columns wide, don't indent or wrap (for display on mobile devices)
9
+
1
10
  ### 1.2.53
2
11
 
3
12
  2023-09-10 08:26
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- na (1.2.53)
4
+ na (1.2.54)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  gli (~> 2.21.0)
7
7
  mdless (~> 1.0, >= 1.0.32)
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is 1.2.53
12
+ The current version of `na` is 1.2.54
13
13
  .
14
14
 
15
15
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
@@ -77,7 +77,7 @@ SYNOPSIS
77
77
  na [global options] command [command options] [arguments...]
78
78
 
79
79
  VERSION
80
- 1.2.53
80
+ 1.2.54
81
81
 
82
82
  GLOBAL OPTIONS
83
83
  -a, --add - Add a next action (deprecated, for backwards compatibility)
@@ -660,11 +660,14 @@ NAME
660
660
 
661
661
  SYNOPSIS
662
662
 
663
- na [global options] undo [FILE]...
663
+ na [global options] undo [command options] [FILE]...
664
664
 
665
665
  DESCRIPTION
666
666
  Run without argument to undo most recent change
667
667
 
668
+ COMMAND OPTIONS
669
+ -s, --[no-]select, --[no-]choose - Select from available undo files
670
+
668
671
  EXAMPLES
669
672
 
670
673
  # Undo the last change
data/Test.todo.markdown CHANGED
@@ -3,19 +3,31 @@ comment: 2023-09-03
3
3
  keywords:
4
4
  ---
5
5
 
6
- 2023-09-08:
7
- Project2:
8
- - new_task @na
9
- - new_task @na
6
+ Project3:
10
7
  Project0:
11
- - other task @na
12
- - other task @na
13
- - There, that's better @na
8
+ - This is another task @na
9
+ - How about this one? @na
10
+ - what happens now? @na
14
11
  Subproject:
15
- - new_task 2 @na
12
+ - Bollocks @na
13
+ Subsub:
14
+ - Hey, I think it's all working @na
15
+ - Is this at the end? @na
16
+ - This better work @na
17
+ 2023-09-08:
18
+ Project2:
19
+ - new_task @na
16
20
  - new_task @na
17
- - new_task 2 @na
18
- Project1:
19
- - Test4
20
- - Test5
21
- - Test6
21
+ - test task @na
22
+ Project0:
23
+ - other task @na
24
+ - other task @na
25
+ - There, that's better @na
26
+ Subproject:
27
+ - new_task 2 @na
28
+ - new_task @na
29
+ - new_task 2 @na
30
+ Project1:
31
+ - Test4
32
+ - Test5
33
+ - Test6
data/bin/commands/tag.rb CHANGED
@@ -89,10 +89,6 @@ class App
89
89
  end
90
90
  end
91
91
 
92
- if (tokens.nil? || tokens.empty?) && options[:tagged].empty?
93
- NA.notify("#{NA.theme[:error]}Empty input, cancelled", exit_code: 1)
94
- end
95
-
96
92
  all_req = options[:tagged].join(' ') !~ /[+!-]/ && !options[:or]
97
93
  tags = []
98
94
  options[:tagged].join(',').split(/ *, */).each do |arg|
data/bin/commands/undo.rb CHANGED
@@ -6,11 +6,20 @@ class App
6
6
  long_desc 'Run without argument to undo most recent change'
7
7
  arg_name 'FILE', optional: true, multiple: true
8
8
  command %i[undo] do |c|
9
+ c.desc 'Select from available undo files'
10
+ c.switch %i[s select choose]
11
+
9
12
  c.example 'na undo', desc: 'Undo the last change'
10
13
  c.example 'na undo myproject', desc: 'Undo the last change to a file matching "myproject"'
11
14
 
12
15
  c.action do |_global_options, options, args|
13
- if args.empty?
16
+ if options[:select]
17
+ options = IO.read(NA.database_path(file: 'last_modified.txt')).strip.split(/\n/)
18
+ res = NA.choose_from(options, sorted: false)
19
+ NA.notify("#{NA.theme[:error]}Cancelled", exit_code: 1) unless res
20
+
21
+ NA.restore_modified_file(res)
22
+ elsif args.empty?
14
23
  NA.restore_last_modified_file
15
24
  else
16
25
  args.each do |arg|
data/bin/na CHANGED
@@ -87,6 +87,7 @@ class App
87
87
  end
88
88
 
89
89
  pre do |global, _command, _options, _args|
90
+ NA.move_deprecated_backups
90
91
  NA.verbose = global[:debug]
91
92
  NA::Pager.paginate = global[:pager] && $stdout.isatty
92
93
  NA::Color.coloring = global[:color] && $stdout.isatty
data/lib/na/array.rb CHANGED
@@ -12,6 +12,8 @@ class ::Array
12
12
  end
13
13
 
14
14
  def wrap(width, indent, color)
15
+ return map { |l| "#{color} #{l.wrap(width, 2)}" } if width < 60
16
+
15
17
  map! do |l|
16
18
  "#{color}#{' ' * indent }• #{l.wrap(width, indent)}{x}"
17
19
  end
@@ -410,7 +410,6 @@ module NA
410
410
  parent = project.split(%r{[:/]})
411
411
 
412
412
  if NA.global_file
413
- puts NA.global_file
414
413
  if NA.cwd_is == :tag
415
414
  add_tag = [NA.cwd]
416
415
  else
@@ -622,10 +621,7 @@ module NA
622
621
  ## @param search The search
623
622
  ##
624
623
  def last_modified_file(search: nil)
625
- db = database_path(file: 'last_modified.txt')
626
- return nil unless File.exist?(db)
627
-
628
- files = IO.read(db).split(/\n/).map(&:strip)
624
+ files = backup_files
629
625
  files.delete_if { |f| f !~ Regexp.new(search.dir_to_rx(require_last: true)) } if search
630
626
  files.last
631
627
  end
@@ -644,19 +640,72 @@ module NA
644
640
  end
645
641
  end
646
642
 
643
+ ##
644
+ ## Get list of backed up files
645
+ ##
646
+ ## @return [Array] list of file paths
647
+ ##
648
+ def backup_files
649
+ db = database_path(file: 'last_modified.txt')
650
+ NA.notify("#{NA.theme[:error]}Backup database not found", exit_code: 1) unless File.exist?(db)
651
+
652
+ IO.read(db).strip.split(/\n/).map(&:strip)
653
+ end
654
+
655
+ def move_deprecated_backups
656
+ backup_files.each do |file|
657
+ if File.exist?(old_backup_path(file))
658
+ NA.notify("Moving deprecated backup to new backup folder (#{file})", debug: true)
659
+ backup_path(file)
660
+ end
661
+ end
662
+ end
663
+
664
+ def old_backup_path(file)
665
+ File.join(File.dirname(file), ".#{File.basename(file)}.bak")
666
+ end
667
+
668
+ ##
669
+ ## Get the backup file path for a file
670
+ ##
671
+ ## @param file The file
672
+ ##
673
+ def backup_path(file)
674
+ backup_home = File.expand_path('~/.local/share/na/backup')
675
+ backup = old_backup_path(file)
676
+ backup_dir = File.join(backup_home, File.dirname(backup))
677
+ FileUtils.mkdir_p(backup_dir) unless File.directory?(backup_dir)
678
+
679
+ backup_target = File.join(backup_home, backup)
680
+ FileUtils.mv(backup, backup_target) if File.exist?(backup)
681
+ backup_target
682
+ end
683
+
684
+ def weed_modified_files(file = nil)
685
+ files = backup_files
686
+
687
+ files.delete_if { |f| f =~ /#{file}/ } if file
688
+
689
+ files.delete_if { |f| !File.exist?(backup_path(f)) }
690
+
691
+ File.open(database_path(file: 'last_modified.txt'), 'w') { |f| f.puts files.join("\n") }
692
+ end
693
+
647
694
  ##
648
695
  ## Restore a file from backup
649
696
  ##
650
697
  ## @param file The file
651
698
  ##
652
699
  def restore_modified_file(file)
653
- bak_file = File.join(File.dirname(file), ".#{File.basename(file)}.bak")
700
+ bak_file = backup_path(file)
654
701
  if File.exist?(bak_file)
655
702
  FileUtils.mv(bak_file, file)
656
703
  NA.notify("#{NA.theme[:success]}Backup restored for #{file.highlight_filename}")
657
704
  else
658
705
  NA.notify("#{NA.theme[:error]}Backup file for #{file.highlight_filename} not found")
659
706
  end
707
+
708
+ weed_modified_files(file)
660
709
  end
661
710
 
662
711
  ##
@@ -821,11 +870,9 @@ module NA
821
870
  ## @param target [String] The file to back up
822
871
  ##
823
872
  def backup_file(target)
824
- file = ".#{File.basename(target)}.bak"
825
- backup = File.join(File.dirname(target), file)
826
- FileUtils.cp(target, backup)
873
+ FileUtils.cp(target, backup_path(target))
827
874
  save_modified_file(target)
828
- NA.notify("#{NA.theme[:warning]}Backup file created at #{backup.highlight_filename}", debug: true)
875
+ NA.notify("#{NA.theme[:warning]}Backup file created for #{target.highlight_filename}", debug: true)
829
876
  end
830
877
 
831
878
  ##
data/lib/na/string.rb CHANGED
@@ -52,7 +52,7 @@ class ::String
52
52
  prefix = match(/(^[ \t]+)/)
53
53
  return 0 if prefix.nil?
54
54
 
55
- prefix[1].gsub(/ /, "\t").scan(/\t/).count
55
+ prefix[1].gsub(/ /, "\t").scan(/\t/).count
56
56
  end
57
57
 
58
58
  def action?
@@ -149,6 +149,8 @@ class ::String
149
149
  end
150
150
 
151
151
  def wrap(width, indent)
152
+ return "\n#{self}" if width < 60
153
+
152
154
  output = []
153
155
  line = []
154
156
  length = indent
data/lib/na/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Na
2
- VERSION = '1.2.53'
2
+ VERSION = '1.2.54'
3
3
  end
data/src/_README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is <!--VER-->1.2.52<!--END VER-->.
12
+ The current version of `na` is <!--VER-->1.2.53<!--END VER-->.
13
13
 
14
14
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
15
15
 
data/test2.txt ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ comment: 2023
3
+ keywords:
4
+ ---
5
+
6
+ Inbox:
7
+ - Test @na
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: na
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.53
4
+ version: 1.2.54
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-10 00:00:00.000000000 Z
11
+ date: 2023-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -247,6 +247,7 @@ files:
247
247
  - na.rdoc
248
248
  - scripts/fixreadme.rb
249
249
  - src/_README.md
250
+ - test2.txt
250
251
  homepage: https://brettterpstra.com/projects/na/
251
252
  licenses:
252
253
  - MIT