git-crecord 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/git-crecord.gemspec +1 -0
- data/lib/git_crecord.rb +2 -2
- data/lib/git_crecord/diff.rb +51 -43
- data/lib/git_crecord/diff/difference.rb +8 -1
- data/lib/git_crecord/diff/file.rb +26 -1
- data/lib/git_crecord/diff/line.rb +2 -7
- data/lib/git_crecord/git.rb +39 -30
- data/lib/git_crecord/ui.rb +2 -0
- data/lib/git_crecord/ui/color.rb +5 -1
- data/lib/git_crecord/ui/hunks_window.rb +10 -4
- data/lib/git_crecord/ui/status_bar.rb +52 -0
- data/lib/git_crecord/version.rb +1 -1
- data/test/system-test.sh +23 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 301253d2b7495fed7ae9dc2c148b04bee0bb9241419b99d863c872e40e95eec9
|
4
|
+
data.tar.gz: 1b5aef42231723add9c71296d88bdc39a899133c7ec561bf6704a2edd2bd17c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0803b8dd1714df6b4b7e2382e2cd688bbd71739706eab5560b2683a7c4d2214dede1a265a24aee70e5667a605bc05c73224c47714b1c63967e9980fbcc7d43d
|
7
|
+
data.tar.gz: b563990aaaea1b8feff2e2e7d1403d230d5e048e3bb9c3584e8506b6a1b52ff031753e495e816e63f6b05d25ea861bb0cf86363733ae5a523b882b3e47848d6e
|
data/.rubocop.yml
CHANGED
data/git-crecord.gemspec
CHANGED
@@ -30,4 +30,5 @@ GemSpec = Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'minitest', '~> 5.8', '>= 5.8.4'
|
31
31
|
spec.add_development_dependency 'rake', '~> 10.1', '>= 10.1.1'
|
32
32
|
spec.add_development_dependency 'rubocop', '>= 0.56.0'
|
33
|
+
spec.add_development_dependency 'rubocop-performance'
|
33
34
|
end
|
data/lib/git_crecord.rb
CHANGED
@@ -34,10 +34,10 @@ module GitCrecord
|
|
34
34
|
return false if toplevel_dir.empty?
|
35
35
|
|
36
36
|
Dir.chdir(toplevel_dir) do
|
37
|
-
files = Diff.
|
38
|
-
files.concat(Diff.untracked_files(Git.status)) if with_untracked_files
|
37
|
+
files = Diff.create(reverse: reverse, untracked: with_untracked_files)
|
39
38
|
return false if files.empty?
|
40
39
|
|
40
|
+
UI::StatusBar.reverse = reverse
|
41
41
|
result = UI.run(files)
|
42
42
|
return result.call(reverse) == true if result.respond_to?(:call)
|
43
43
|
|
data/lib/git_crecord/diff.rb
CHANGED
@@ -1,73 +1,81 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'diff/file'
|
4
|
+
require_relative 'git'
|
4
5
|
|
5
6
|
module GitCrecord
|
6
7
|
module Diff
|
7
|
-
def self.
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
line.chomp!
|
13
|
-
next files << parse_file_head(line, enum, reverse) if file_start?(line)
|
14
|
-
next files[-1] << line if hunk_start?(line)
|
8
|
+
def self.create(reverse: false, untracked: false)
|
9
|
+
GitCrecord::Git.status.lines.map do |file_status|
|
10
|
+
status = file_status[reverse ? 0 : 1].downcase
|
11
|
+
filename = file_status.chomp[3..-1]
|
12
|
+
next if status == ' ' || status == '?' && !untracked
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.file_start?(line)
|
22
|
-
line.start_with?('diff')
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.hunk_start?(line)
|
26
|
-
line.start_with?('@@')
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.parse_file_head(line, enum, reverse)
|
30
|
-
index_line = enum.next # index ... or new ...
|
31
|
-
is_new_file = index_line.start_with?('new')
|
32
|
-
enum.next if is_new_file
|
33
|
-
enum.next # --- ...
|
34
|
-
enum.next # +++ ...
|
35
|
-
type = is_new_file ? :untracked : :modified
|
36
|
-
File.new(*parse_filenames(line), type: type, reverse: reverse)
|
14
|
+
method = "handle_status_#{status}"
|
15
|
+
send(method, filename, reverse: reverse) if respond_to?(method)
|
16
|
+
end.compact
|
37
17
|
end
|
38
18
|
|
39
|
-
def self.
|
40
|
-
|
19
|
+
def self.handle_status_m(filename, reverse: false)
|
20
|
+
file = File.new(filename, filename, type: :modified, reverse: reverse)
|
21
|
+
diff_lines = Git.diff(filename: filename, staged: reverse).lines[4..-1]
|
22
|
+
diff_lines.each do |line|
|
23
|
+
handle_line(file, line)
|
24
|
+
end
|
25
|
+
file
|
41
26
|
end
|
42
27
|
|
43
|
-
def self.
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
28
|
+
def self.handle_status_a(filename, reverse: false)
|
29
|
+
file = File.new(filename, filename, type: :new, reverse: reverse)
|
30
|
+
diff_lines = Git.diff(filename: filename, staged: reverse).lines[5..-1]
|
31
|
+
file.make_empty if diff_lines.nil?
|
32
|
+
(diff_lines || []).each do |line|
|
33
|
+
handle_line(file, line)
|
34
|
+
end
|
35
|
+
file
|
48
36
|
end
|
49
37
|
|
50
|
-
def self.
|
38
|
+
def self.handle_status_?(filename, **_)
|
51
39
|
File.new(filename, filename, type: :untracked).tap do |file|
|
52
40
|
lines, err = file_lines(filename)
|
53
|
-
|
54
|
-
|
55
|
-
|
41
|
+
if lines.empty?
|
42
|
+
file.make_empty(err)
|
43
|
+
else
|
44
|
+
file << "@@ -0,0 +1,#{lines.size} @@"
|
45
|
+
lines.each { |line| file.add_hunk_line("+#{line.chomp}") }
|
46
|
+
end
|
56
47
|
file.selected = false
|
57
48
|
end
|
58
49
|
end
|
59
50
|
|
60
|
-
|
61
|
-
|
62
|
-
|
51
|
+
# o ' ' = unmodified
|
52
|
+
# o M = modified
|
53
|
+
# o A = added
|
54
|
+
# o D = deleted
|
55
|
+
# o R = renamed
|
56
|
+
# o C = copied
|
57
|
+
# o U = updated but unmerged
|
58
|
+
|
59
|
+
def self.handle_line(file, line)
|
60
|
+
line.chomp!
|
61
|
+
if hunk_start?(line)
|
62
|
+
file << line
|
63
|
+
else
|
64
|
+
file.add_hunk_line(line)
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
68
|
+
def self.hunk_start?(line)
|
69
|
+
line.start_with?('@@')
|
70
|
+
end
|
71
|
+
|
66
72
|
def self.file_encoding(filename)
|
67
73
|
`file --mime-encoding #{filename}`.split(': ', 2)[1].chomp
|
68
74
|
end
|
69
75
|
|
70
76
|
def self.file_lines(filename)
|
77
|
+
return [[], 'empty'] if ::File.size(filename).zero?
|
78
|
+
|
71
79
|
encoding = file_encoding(filename)
|
72
80
|
return [[], 'binary'] if encoding == 'binary'
|
73
81
|
|
@@ -27,6 +27,7 @@ module GitCrecord
|
|
27
27
|
@reverse = reverse
|
28
28
|
@selection_marker_map = reverse ? REVERSE_SELECTED_MAP : SELECTED_MAP
|
29
29
|
@subs = []
|
30
|
+
@selected = true
|
30
31
|
end
|
31
32
|
|
32
33
|
def strings(width)
|
@@ -53,6 +54,8 @@ module GitCrecord
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def selected
|
57
|
+
return @selected if selectable_subs.empty?
|
58
|
+
|
56
59
|
s = selectable_subs.map(&:selected).uniq
|
57
60
|
return s[0] if s.size == 1
|
58
61
|
|
@@ -60,7 +63,11 @@ module GitCrecord
|
|
60
63
|
end
|
61
64
|
|
62
65
|
def selected=(value)
|
63
|
-
selectable_subs.
|
66
|
+
if selectable_subs.empty?
|
67
|
+
@selected = value
|
68
|
+
else
|
69
|
+
selectable_subs.each { |sub| sub.selected = value }
|
70
|
+
end
|
64
71
|
end
|
65
72
|
|
66
73
|
def style(is_highlighted)
|
@@ -19,7 +19,7 @@ module GitCrecord
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def to_s
|
22
|
-
prefix = { modified: 'M', untracked: '?' }.fetch(type)
|
22
|
+
prefix = { modified: 'M', new: 'A', untracked: '?' }.fetch(type)
|
23
23
|
return "#{prefix} #{@filename_a}" if @filename_a == @filename_b
|
24
24
|
|
25
25
|
"#{prefix} #{filename_a} -> #{filename_b}"
|
@@ -68,6 +68,31 @@ module GitCrecord
|
|
68
68
|
end
|
69
69
|
|
70
70
|
alias prefix_style style
|
71
|
+
|
72
|
+
def make_empty(type = 'empty')
|
73
|
+
subs << PseudoLine.new(type)
|
74
|
+
end
|
75
|
+
|
76
|
+
def empty?
|
77
|
+
selectable_subs.empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
def stage_steps
|
81
|
+
case type
|
82
|
+
when :modified then %i[stage]
|
83
|
+
when :new then empty? ? %i[add_file_full] : %i[stage]
|
84
|
+
when :untracked then empty? ? %i[add_file_full] : %i[add_file stage]
|
85
|
+
else raise "unknown file type - #{type.inspect}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def unstage_steps
|
90
|
+
case type
|
91
|
+
when :modified then %i[unstage]
|
92
|
+
when :new then %i[unstage]
|
93
|
+
else raise "unknown file type - #{type.inspect}"
|
94
|
+
end
|
95
|
+
end
|
71
96
|
end
|
72
97
|
end
|
73
98
|
end
|
@@ -6,12 +6,10 @@ require_relative '../ui/color'
|
|
6
6
|
module GitCrecord
|
7
7
|
module Diff
|
8
8
|
class PseudoLine < Difference
|
9
|
-
attr_accessor :selected
|
10
|
-
|
11
9
|
def initialize(line)
|
12
10
|
@line = line || 'file is empty'
|
13
|
-
@selected = false
|
14
11
|
super()
|
12
|
+
@selected = false
|
15
13
|
end
|
16
14
|
|
17
15
|
def to_s
|
@@ -23,7 +21,7 @@ module GitCrecord
|
|
23
21
|
end
|
24
22
|
|
25
23
|
def selectable?
|
26
|
-
|
24
|
+
false
|
27
25
|
end
|
28
26
|
|
29
27
|
def expanded
|
@@ -40,11 +38,8 @@ module GitCrecord
|
|
40
38
|
end
|
41
39
|
|
42
40
|
class Line < Difference
|
43
|
-
attr_reader :selected
|
44
|
-
|
45
41
|
def initialize(line, reverse: false)
|
46
42
|
@line = line
|
47
|
-
@selected = true
|
48
43
|
super(reverse: reverse)
|
49
44
|
end
|
50
45
|
|
data/lib/git_crecord/git.rb
CHANGED
@@ -5,16 +5,29 @@ require 'open3'
|
|
5
5
|
|
6
6
|
module GitCrecord
|
7
7
|
module Git
|
8
|
-
def self.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
def self.stage_files(files, reverse = false)
|
9
|
+
method_name = reverse ? :unstage_steps : :stage_steps
|
10
|
+
success = true
|
11
|
+
files.each do |file|
|
12
|
+
next unless file.selected
|
13
|
+
|
14
|
+
file.send(method_name).each do |step|
|
15
|
+
success &&= send(step, file)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
success
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.stage(file)
|
22
|
+
_stage(file.generate_diff, false)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.unstage(file)
|
26
|
+
success = _stage(file.generate_diff, true)
|
27
|
+
return false unless success
|
28
|
+
return true unless file.type == :new && file.selected == true
|
29
|
+
|
30
|
+
reset_file(file)
|
18
31
|
end
|
19
32
|
|
20
33
|
def self._stage(diff, reverse = false)
|
@@ -26,47 +39,43 @@ module GitCrecord
|
|
26
39
|
LOGGER.info('stdout/stderr:')
|
27
40
|
LOGGER.info(content)
|
28
41
|
LOGGER.info("return code: #{status}")
|
29
|
-
status
|
42
|
+
status.success?
|
30
43
|
end
|
31
44
|
|
32
|
-
def self.
|
33
|
-
|
34
|
-
success = add_file(file.filename_a)
|
35
|
-
raise "could not add file #{file.filename_a}" unless success
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.add_file(filename)
|
40
|
-
system("git add -N #{filename}")
|
45
|
+
def self.add_file(file)
|
46
|
+
system("git add -N #{file.filename_a}")
|
41
47
|
end
|
42
48
|
|
43
|
-
def self.
|
44
|
-
|
45
|
-
success = reset_file(file.filename_a)
|
46
|
-
raise "could not reset file #{file.filename_a}" unless success
|
47
|
-
end
|
49
|
+
def self.add_file_full(file)
|
50
|
+
system("git add #{file.filename_a}")
|
48
51
|
end
|
49
52
|
|
50
|
-
def self.reset_file(
|
51
|
-
system("git reset -q #{
|
53
|
+
def self.reset_file(file)
|
54
|
+
system("git reset -q #{file.filename_a}")
|
52
55
|
end
|
53
56
|
|
54
57
|
def self.status
|
55
|
-
`git status --porcelain`
|
58
|
+
`git status --porcelain --untracked-files=all`
|
56
59
|
end
|
57
60
|
|
58
61
|
def self.commit
|
59
62
|
exec('git commit')
|
60
63
|
end
|
61
64
|
|
62
|
-
def self.diff(staged: false)
|
63
|
-
|
65
|
+
def self.diff(filename: nil, staged: false)
|
66
|
+
filename = "'#{filename}'" if filename
|
67
|
+
staged_option = staged ? '--staged' : ''
|
68
|
+
`git diff --no-ext-diff --no-color -D #{staged_option} #{filename}`
|
64
69
|
end
|
65
70
|
|
66
71
|
def self.toplevel_dir
|
67
72
|
`git rev-parse --show-toplevel`.chomp
|
68
73
|
end
|
69
74
|
|
75
|
+
def self.branch
|
76
|
+
`git rev-parse --abbrev-ref HEAD`.chomp
|
77
|
+
end
|
78
|
+
|
70
79
|
def self.tab
|
71
80
|
@tab ||= ' ' * [2, `git config crecord.tabwidth`.to_i].max
|
72
81
|
end
|
data/lib/git_crecord/ui.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'curses'
|
4
4
|
require_relative 'ui/color'
|
5
5
|
require_relative 'ui/hunks_window'
|
6
|
+
require_relative 'ui/status_bar'
|
6
7
|
|
7
8
|
module GitCrecord
|
8
9
|
module UI
|
@@ -44,6 +45,7 @@ module GitCrecord
|
|
44
45
|
|
45
46
|
def self.run_loop(win)
|
46
47
|
loop do
|
48
|
+
StatusBar.refresh(win)
|
47
49
|
c = win.getch
|
48
50
|
next if ACTIONS[c].nil?
|
49
51
|
|
data/lib/git_crecord/ui/color.rb
CHANGED
@@ -9,7 +9,8 @@ module GitCrecord
|
|
9
9
|
normal: 1,
|
10
10
|
green: 2,
|
11
11
|
red: 3,
|
12
|
-
hl: 4
|
12
|
+
hl: 4,
|
13
|
+
status_bar: 5
|
13
14
|
}.freeze
|
14
15
|
|
15
16
|
def self.init
|
@@ -19,6 +20,9 @@ module GitCrecord
|
|
19
20
|
Curses.init_pair(MAP[:green], Curses::COLOR_GREEN, -1)
|
20
21
|
Curses.init_pair(MAP[:red], Curses::COLOR_RED, -1)
|
21
22
|
Curses.init_pair(MAP[:hl], Curses::COLOR_BLACK, Curses::COLOR_GREEN)
|
23
|
+
Curses.init_pair(
|
24
|
+
MAP[:status_bar], Curses::COLOR_BLACK, Curses::COLOR_BLUE
|
25
|
+
)
|
22
26
|
end
|
23
27
|
|
24
28
|
MAP.each_pair do |name, number|
|
@@ -25,8 +25,12 @@ module GitCrecord
|
|
25
25
|
delegate getch: :@win
|
26
26
|
def_delegator :@win, :maxx, :width
|
27
27
|
|
28
|
+
def highlight_position
|
29
|
+
"#{@visibles.index(@highlighted) + 1}/#{@visibles.size}"
|
30
|
+
end
|
31
|
+
|
28
32
|
def refresh
|
29
|
-
@win.refresh(scroll_position, 0,
|
33
|
+
@win.refresh(scroll_position, 0, 1, 0, Curses.lines - 1, width)
|
30
34
|
end
|
31
35
|
|
32
36
|
def redraw
|
@@ -37,7 +41,7 @@ module GitCrecord
|
|
37
41
|
|
38
42
|
def resize
|
39
43
|
new_width = Curses.cols
|
40
|
-
new_height = [Curses.lines, content_height(new_width)].max
|
44
|
+
new_height = [Curses.lines - 1, content_height(new_width)].max
|
41
45
|
return if width == new_width && @win.maxy == new_height
|
42
46
|
|
43
47
|
@win.resize(new_height, new_width)
|
@@ -106,11 +110,13 @@ module GitCrecord
|
|
106
110
|
end
|
107
111
|
|
108
112
|
def stage
|
109
|
-
QuitAction.new { |reverse| Git.
|
113
|
+
QuitAction.new { |reverse| Git.stage_files(@files, reverse) }
|
110
114
|
end
|
111
115
|
|
112
116
|
def commit
|
113
|
-
QuitAction.new
|
117
|
+
QuitAction.new do |reverse|
|
118
|
+
Git.stage_files(@files, reverse) && Git.commit
|
119
|
+
end
|
114
120
|
end
|
115
121
|
|
116
122
|
def highlight_next
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'curses'
|
4
|
+
require_relative 'color'
|
5
|
+
require_relative '../git'
|
6
|
+
|
7
|
+
module GitCrecord
|
8
|
+
module UI
|
9
|
+
module StatusBar
|
10
|
+
def self.refresh(main_win)
|
11
|
+
write_left(main_win)
|
12
|
+
fill_to_eol
|
13
|
+
write_right(main_win)
|
14
|
+
win.refresh
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.write_left(_main_win)
|
18
|
+
win.setpos(0, 0)
|
19
|
+
win.addstr(" #{branch}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.write_right(main_win)
|
23
|
+
str = " #{reverse ? '[reverse]' : ''} #{main_win.highlight_position} "
|
24
|
+
win.setpos(0, [0, win.maxx - str.size].max)
|
25
|
+
win.addstr(str)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.fill_to_eol
|
29
|
+
fill_width = win.maxx - win.curx
|
30
|
+
win.addstr(' ' * fill_width) if fill_width.positive?
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.win
|
34
|
+
@win ||= Curses::Window.new(1, Curses.cols, 0, 0).tap do |win|
|
35
|
+
win.attrset(Color.status_bar | Curses::A_BOLD)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.branch
|
40
|
+
@branch = Git.branch
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.reverse
|
44
|
+
@reverse
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.reverse=(reverse)
|
48
|
+
@reverse = reverse
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/git_crecord/version.rb
CHANGED
data/test/system-test.sh
CHANGED
@@ -196,6 +196,29 @@ assert-diff '-This is the second line.
|
|
196
196
|
+This is line 2.
|
197
197
|
+new line2'
|
198
198
|
|
199
|
+
echo "test add empty files ----------------------------------------------------"
|
200
|
+
git add .
|
201
|
+
touch empty.txt
|
202
|
+
touch empty-untrached.txt
|
203
|
+
git add -N empty.txt
|
204
|
+
run-git-crecord 'AAs'
|
205
|
+
assert-status 'M a_file.txt
|
206
|
+
M b_file.txt
|
207
|
+
A empty-untrached.txt
|
208
|
+
A empty.txt
|
209
|
+
A new.txt
|
210
|
+
A sub/sub2/sub-file.txt'
|
211
|
+
|
212
|
+
echo "unstage empty file ------------------------------------------------------"
|
213
|
+
run-git-crecord-reverse 'AG s'
|
214
|
+
assert-status 'M a_file.txt
|
215
|
+
M b_file.txt
|
216
|
+
A empty-untrached.txt
|
217
|
+
A empty.txt
|
218
|
+
A new.txt
|
219
|
+
?? sub/'
|
220
|
+
|
221
|
+
|
199
222
|
popd > /dev/null # $REPO_DIR
|
200
223
|
|
201
224
|
cat << 'EOF'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-crecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maik Brendler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -78,6 +78,20 @@ dependencies:
|
|
78
78
|
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: 0.56.0
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rubocop-performance
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
81
95
|
description: This gem adds the git-crecord command. It provides a curses UI to stage/commit
|
82
96
|
git-hunks.
|
83
97
|
email: maik.brendler@invision.de
|
@@ -107,6 +121,7 @@ files:
|
|
107
121
|
- lib/git_crecord/ui/color.rb
|
108
122
|
- lib/git_crecord/ui/help_window.rb
|
109
123
|
- lib/git_crecord/ui/hunks_window.rb
|
124
|
+
- lib/git_crecord/ui/status_bar.rb
|
110
125
|
- lib/git_crecord/version.rb
|
111
126
|
- screenshot.jpg
|
112
127
|
- test/git_crecord/diff/hunk_test.rb
|