git-story-workflow 0.9.12 → 0.11.3

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: d3acae027af5cd4f0b585174804a628ae5f07ab7f5ed81c9cf0f6ea324771317
4
- data.tar.gz: e6df688c535e7877baea001899bdc89f971f317d78c4ce25ab5d3fd64750f66f
3
+ metadata.gz: 594fee5ac595ddfe8ae4802bfc3bf4bef2c0f7c7b2e9f3ccbf76a9cbc7d8bd12
4
+ data.tar.gz: 2b2c6dace41b40c654dcfe7be680d22bf978696976d59de42abd27bdb68e071f
5
5
  SHA512:
6
- metadata.gz: 3840b6c21619092377f7c9e07dea084a486a1853fe9e872ac1eb0b3008b3a567a8aae706fb0c196c090103c30db8b46c8eb5412683c30c11938b47ad0b51c0f4
7
- data.tar.gz: 955b3fd2b94ffaaf06de061fdd745e98a230ba62464bd0208c41993af70d5646dfb1ff785e3f8a1e39d8fe993bff6601d751626373022fd4a8e75f7fdc2f3f84
6
+ metadata.gz: cf31372ba982c29af6e018ec82136bd2d254f0c728567d2ee0d1e4ccc38fe57442aafa38ad0634bc5bbc22910740113509074684dd83a024b99d509add46dc15
7
+ data.tar.gz: 600489c9074d8f73f57d8156ca440fe69332e25dc80470a736ad763bfe647b4845d580338791b59e116520d0207d2b3e976dae39ef338a726894834f25a1c2ad
data/Rakefile CHANGED
@@ -22,6 +22,7 @@ GemHadar do
22
22
  dependency 'mize'
23
23
  dependency 'term-ansicolor'
24
24
  dependency 'complex_config'
25
+ dependency 'search_ui'
25
26
 
26
27
  development_dependency 'rake'
27
28
  development_dependency 'simplecov'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.12
1
+ 0.11.3
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: git-story-workflow 0.9.12 ruby lib
2
+ # stub: git-story-workflow 0.11.3 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "git-story-workflow".freeze
6
- s.version = "0.9.12"
6
+ s.version = "0.11.3"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2020-01-15"
11
+ s.date = "2020-07-20"
12
12
  s.description = "Gem abstracting a git workflow\u2026".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.executables = ["git-story".freeze]
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  s.add_runtime_dependency(%q<mize>.freeze, [">= 0"])
36
36
  s.add_runtime_dependency(%q<term-ansicolor>.freeze, [">= 0"])
37
37
  s.add_runtime_dependency(%q<complex_config>.freeze, [">= 0"])
38
+ s.add_runtime_dependency(%q<search_ui>.freeze, [">= 0"])
38
39
  else
39
40
  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
40
41
  s.add_dependency(%q<rake>.freeze, [">= 0"])
@@ -45,5 +46,6 @@ Gem::Specification.new do |s|
45
46
  s.add_dependency(%q<mize>.freeze, [">= 0"])
46
47
  s.add_dependency(%q<term-ansicolor>.freeze, [">= 0"])
47
48
  s.add_dependency(%q<complex_config>.freeze, [">= 0"])
49
+ s.add_dependency(%q<search_ui>.freeze, [">= 0"])
48
50
  end
49
51
  end
@@ -3,6 +3,8 @@ require 'open-uri'
3
3
  require 'tins/go'
4
4
  require 'set'
5
5
  require 'infobar'
6
+ require 'search_ui'
7
+ require 'amatch'
6
8
 
7
9
  class Git::Story::App
8
10
  class ::String
@@ -13,6 +15,7 @@ class Git::Story::App
13
15
  extend Git::Story::Utils
14
16
  include ComplexConfig::Provider::Shortcuts
15
17
  include Tins::GO
18
+ include SearchUI
16
19
 
17
20
  annotate :command
18
21
 
@@ -33,9 +36,9 @@ class Git::Story::App
33
36
  def initialize(argv = ARGV.dup, debug: ENV['DEBUG'].to_i == 1)
34
37
  @rest_argv = (sep = argv.index('--')) ? argv.slice!(sep..-1).tap(&:shift) : []
35
38
  @argv = argv
36
- @opts = go 'n:', @argv
37
- @command = @argv.shift&.to_sym
38
- @debug = debug
39
+ @opts = go 'n:', @argv
40
+ @debug = debug
41
+ determine_command
39
42
  end
40
43
 
41
44
  def run
@@ -47,8 +50,11 @@ class Git::Story::App
47
50
  puts __send__(@command, *@argv)
48
51
  end
49
52
  else
50
- @command and @command = @command.inspect
51
- @command ||= 'n/a'
53
+ if @command
54
+ @command = @command.inspect
55
+ else
56
+ @command = 'n/a'
57
+ end
52
58
  STDERR.puts "Unknown command #{@command}\n\n#{help.join(?\n)}"
53
59
  exit 1
54
60
  end
@@ -61,7 +67,7 @@ class Git::Story::App
61
67
  longest = command_annotations.keys.map(&:size).max
62
68
  result.concat(
63
69
  command_annotations.map { |name, a|
64
- "#{name.to_s.ljust(longest)} #{a[:doc]}"
70
+ "#{name.to_s.gsub(?_, ' ').ljust(longest)} #{a[:doc]}"
65
71
  }
66
72
  )
67
73
  end
@@ -314,30 +320,23 @@ class Git::Story::App
314
320
  command doc: '[PATTERN] switch to story matching PATTERN'
315
321
  def switch(pattern = nil)
316
322
  fetch_commits
317
- ss = stories.map(&:story_base_name)
318
- if pattern.present?
319
- b = apply_pattern(pattern, ss)
320
- if b.size == 1
321
- b = b.first
322
- else
323
- b = nil
324
- end
323
+ if branch = pick_branch(prompt: 'Switch to story? %s')
324
+ sh "git checkout #{branch}"
325
+ return "Switched to story: #{branch}".green
325
326
  end
326
- loop do
327
- unless b
328
- b = complete prompt: 'Story <TAB>? '.bright_blue do |pattern|
329
- apply_pattern(pattern, ss)
330
- end&.strip
331
- b.empty? and return
332
- end
333
- if branch = ss.find { |f| f == b }
334
- sh "git checkout #{branch}"
335
- return "Switched to story: #{branch}".green
336
- else
337
- b = nil
327
+ end
328
+
329
+ command doc: '[PATTERN] delete story branch matching PATTERN'
330
+ def delete(pattern = nil)
331
+ fetch_commits
332
+ if branch = pick_branch(prompt: 'Delete story branch? %s', symbol: ?⌦)
333
+ sh "git pull origin #{branch}"
334
+ sh "git branch -d #{branch}"
335
+ if ask(prompt: 'Delete remote branch? (y/N) ') =~ /\Ay\z/i
336
+ sh "git push origin #{branch} --delete"
338
337
  end
338
+ return "Deleted story branch: #{branch}".green
339
339
  end
340
- rescue Interrupt
341
340
  end
342
341
 
343
342
  command doc: '[BRANCH] open branch on github'
@@ -359,6 +358,48 @@ class Git::Story::App
359
358
 
360
359
  private
361
360
 
361
+ def determine_command
362
+ c, command = [], nil
363
+ possible_commands = []
364
+ until @argv.empty?
365
+ c << @argv.shift
366
+ command = c.join(?_).to_sym
367
+ if command_of(command)
368
+ possible_commands << [ command, @argv.dup ]
369
+ end
370
+ end
371
+ unless possible_commands.empty?
372
+ @command, argv = possible_commands.last
373
+ @argv.replace(argv)
374
+ end
375
+ self
376
+ end
377
+
378
+ def pick_branch(prompt:, symbol: ?⏻)
379
+ ss = stories.map(&:story_base_name)
380
+ branch = Search.new(
381
+ match: -> answer {
382
+ answer = answer.strip.delete(?#).downcase
383
+
384
+ matcher = Amatch::PairDistance.new(answer)
385
+ matches = ss.map { |n| [ n, -matcher.similar(n.downcase) ] }.
386
+ select { |_, s| s < 0 }.sort_by(&:last).map(&:first)
387
+
388
+ matches.empty? and matches = ss
389
+ matches.first(Tins::Terminal.lines - 1)
390
+ },
391
+ query: -> _answer, matches, selector {
392
+ matches.each_with_index.
393
+ map { |m, i| i == selector ? "#{symbol} " + Search.on_blue(m) : '┊ ' + m } * ?\n
394
+ },
395
+ found: -> _answer, matches, selector {
396
+ matches[selector]
397
+ },
398
+ prompt: prompt.bold,
399
+ output: STDOUT
400
+ ).start
401
+ end
402
+
362
403
  def default_ref
363
404
  tags.last
364
405
  end
@@ -1,6 +1,6 @@
1
1
  module Git::Story
2
2
  # Git::Story version
3
- VERSION = '0.9.12'
3
+ VERSION = '0.11.3'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-story-workflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-15 00:00:00.000000000 Z
11
+ date: 2020-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: search_ui
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: Gem abstracting a git workflow…
140
154
  email: flori@ping.de
141
155
  executables:
@@ -172,7 +186,7 @@ homepage: http://flori.github.com/git-story-workflow
172
186
  licenses:
173
187
  - Apache-2.0
174
188
  metadata: {}
175
- post_install_message:
189
+ post_install_message:
176
190
  rdoc_options:
177
191
  - "--title"
178
192
  - Git-story-workflow
@@ -192,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
206
  version: '0'
193
207
  requirements: []
194
208
  rubygems_version: 3.1.2
195
- signing_key:
209
+ signing_key:
196
210
  specification_version: 4
197
211
  summary: Gem abstracting a git workflow
198
212
  test_files: