git_spelunk 0.1.2 → 0.1.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.
- data/lib/git_spelunk/ui/repo.rb +0 -25
- data/lib/git_spelunk/ui/status.rb +37 -0
- data/lib/git_spelunk/ui.rb +62 -35
- metadata +2 -1
data/lib/git_spelunk/ui/repo.rb
CHANGED
@@ -5,31 +5,17 @@ module GitSpelunk
|
|
5
5
|
@window = Curses::Window.new(height, Curses.cols, offset, 0)
|
6
6
|
@offset = offset
|
7
7
|
@height = height
|
8
|
-
@command_mode = false
|
9
|
-
@command_buffer = ""
|
10
8
|
@content = ""
|
11
9
|
end
|
12
10
|
|
13
11
|
attr_accessor :content, :command_mode, :command_buffer
|
14
12
|
|
15
|
-
def exit_command_mode!
|
16
|
-
self.command_buffer = ""
|
17
|
-
self.command_mode = false
|
18
|
-
end
|
19
|
-
|
20
13
|
def draw
|
21
14
|
@window.setpos(0,0)
|
22
15
|
draw_status_line
|
23
16
|
@window.addstr(@content + "\n") if content
|
24
17
|
@window.addstr("\n" * (@height - @content.split("\n").size - 2))
|
25
|
-
|
26
|
-
draw_bottom_line
|
27
18
|
@window.refresh
|
28
|
-
set_cursor
|
29
|
-
end
|
30
|
-
|
31
|
-
def set_cursor
|
32
|
-
Curses::stdscr.setpos(@offset + @height - 1, command_buffer.size + 1)
|
33
19
|
end
|
34
20
|
|
35
21
|
def draw_status_line
|
@@ -40,17 +26,6 @@ module GitSpelunk
|
|
40
26
|
@window.addstr(" " * line_remainder + "\n")
|
41
27
|
end
|
42
28
|
end
|
43
|
-
|
44
|
-
def draw_bottom_line
|
45
|
-
if command_mode
|
46
|
-
@window.addstr(":" + command_buffer)
|
47
|
-
@window.addstr(" " * line_remainder)
|
48
|
-
else
|
49
|
-
with_highlighting do
|
50
|
-
@window.addstr(" " * line_remainder + "\n")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
29
|
end
|
55
30
|
end
|
56
31
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module GitSpelunk
|
2
|
+
class UI
|
3
|
+
class StatusWindow < Window
|
4
|
+
def initialize(height, offset)
|
5
|
+
@window = Curses::Window.new(height, Curses.cols, offset, 0)
|
6
|
+
@offset = offset
|
7
|
+
@command_buffer = ""
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :command_buffer
|
11
|
+
|
12
|
+
def exit_command_mode!
|
13
|
+
self.command_buffer = ""
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_cursor
|
17
|
+
Curses::stdscr.setpos(@offset, command_buffer.size + 1)
|
18
|
+
end
|
19
|
+
|
20
|
+
def draw
|
21
|
+
@window.setpos(0,0)
|
22
|
+
if !command_buffer.empty?
|
23
|
+
Curses.curs_set(1)
|
24
|
+
@window.addstr(":" + command_buffer)
|
25
|
+
@window.addstr(" " * line_remainder)
|
26
|
+
else
|
27
|
+
Curses.curs_set(0)
|
28
|
+
with_highlighting do
|
29
|
+
@window.addstr(" " * line_remainder + "\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
set_cursor
|
33
|
+
@window.refresh
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/git_spelunk/ui.rb
CHANGED
@@ -1,43 +1,50 @@
|
|
1
1
|
require 'git_spelunk/ui/window'
|
2
2
|
require 'git_spelunk/ui/pager'
|
3
3
|
require 'git_spelunk/ui/repo'
|
4
|
+
require 'git_spelunk/ui/status'
|
4
5
|
require 'curses'
|
5
6
|
|
6
7
|
module GitSpelunk
|
7
8
|
class UI
|
8
|
-
|
9
9
|
def initialize(file_context)
|
10
|
-
|
11
|
-
Curses.start_color
|
12
|
-
Curses.raw
|
13
|
-
Curses.nonl
|
14
|
-
Curses.curs_set(2)
|
15
|
-
screen = Curses.stdscr
|
16
|
-
screen.refresh
|
17
|
-
screen.keypad(1)
|
18
|
-
Curses.init_pair(ACTIVE_SHA_COLOR, Curses::COLOR_GREEN, Curses::COLOR_BLACK)
|
10
|
+
init_curses
|
19
11
|
|
20
12
|
calculate_heights!
|
21
13
|
@file_context = file_context
|
22
14
|
@history = [file_context]
|
15
|
+
|
23
16
|
@pager = PagerWindow.new(@pager_height)
|
24
17
|
@pager.data = @file_context.get_blame
|
25
18
|
|
26
19
|
@repo = RepoWindow.new(@repo_height, @pager_height)
|
20
|
+
|
21
|
+
@status = StatusWindow.new(1, Curses.lines - 1)
|
22
|
+
end
|
23
|
+
|
24
|
+
def init_curses
|
25
|
+
Curses.init_screen
|
26
|
+
Curses.start_color
|
27
|
+
Curses.raw
|
28
|
+
Curses.nonl
|
29
|
+
Curses.noecho
|
30
|
+
Curses.curs_set(0)
|
31
|
+
screen = Curses.stdscr
|
32
|
+
screen.refresh
|
33
|
+
screen.keypad(1)
|
34
|
+
Curses.init_pair(ACTIVE_SHA_COLOR, Curses::COLOR_GREEN, Curses::COLOR_BLACK)
|
27
35
|
end
|
28
36
|
|
29
37
|
def calculate_heights!
|
30
38
|
@repo_height = (Curses.lines.to_f * 0.20).to_i
|
31
|
-
@pager_height = Curses.lines - @repo_height
|
39
|
+
@pager_height = Curses.lines - @repo_height - 1
|
40
|
+
@status_height = 1
|
32
41
|
end
|
33
42
|
|
34
43
|
def run
|
35
44
|
@repo.content = @file_context.get_line_commit_info(@pager.cursor)
|
36
45
|
pause_thread
|
37
46
|
begin
|
38
|
-
@pager.draw
|
39
|
-
@repo.draw
|
40
|
-
@repo.set_cursor
|
47
|
+
[@pager, @repo, @status].each(&:draw)
|
41
48
|
handle_key(Curses.getch)
|
42
49
|
end while true
|
43
50
|
end
|
@@ -52,6 +59,7 @@ module GitSpelunk
|
|
52
59
|
if heartbeat_expired? && @pager.cursor == current_line
|
53
60
|
@repo.content = content
|
54
61
|
@repo.draw
|
62
|
+
@status.draw
|
55
63
|
@last_line = current_line
|
56
64
|
else
|
57
65
|
@heartbeat = Time.now
|
@@ -68,7 +76,7 @@ module GitSpelunk
|
|
68
76
|
|
69
77
|
def after_navigation
|
70
78
|
@pager.highlight_sha = true
|
71
|
-
@
|
79
|
+
@status.exit_command_mode!
|
72
80
|
end
|
73
81
|
|
74
82
|
def handle_key(key)
|
@@ -87,16 +95,15 @@ module GitSpelunk
|
|
87
95
|
@pager.pageup
|
88
96
|
after_navigation
|
89
97
|
when *(0..9).to_a.map(&:to_s)
|
90
|
-
@
|
91
|
-
@repo.command_buffer += key
|
98
|
+
@status.command_buffer += key
|
92
99
|
when Curses::KEY_CTRL_M
|
93
|
-
if @
|
94
|
-
@pager.go_to(@
|
100
|
+
if @status.command_buffer != ''
|
101
|
+
@pager.go_to(@status.command_buffer.to_i)
|
95
102
|
end
|
96
103
|
after_navigation
|
97
104
|
when 'G'
|
98
|
-
if @
|
99
|
-
@pager.go_to(@
|
105
|
+
if @status.command_buffer != ''
|
106
|
+
@pager.go_to(@status.command_buffer.to_i)
|
100
107
|
else
|
101
108
|
@pager.go_bottom
|
102
109
|
end
|
@@ -120,6 +127,7 @@ module GitSpelunk
|
|
120
127
|
@pager.data = @file_context.get_blame
|
121
128
|
@pager.go_to(@file_context.line_number)
|
122
129
|
@pager.draw
|
130
|
+
@status.draw
|
123
131
|
|
124
132
|
# force commit info update
|
125
133
|
@last_line = nil
|
@@ -130,22 +138,18 @@ module GitSpelunk
|
|
130
138
|
Curses.close_screen
|
131
139
|
system("git -p --git-dir='#{@file_context.repo.path}' show #{sha} | less")
|
132
140
|
Curses.stdscr.refresh
|
133
|
-
@pager.draw
|
134
|
-
@repo.draw
|
135
|
-
@pager.highlight_sha = true
|
141
|
+
[@pager, @repo, @status].each(&:draw)
|
136
142
|
when '/'
|
137
|
-
@
|
138
|
-
@
|
139
|
-
@
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
@
|
143
|
+
@heartbeat = nil
|
144
|
+
@status.command_buffer = '/'
|
145
|
+
@status.draw
|
146
|
+
|
147
|
+
line = getline
|
148
|
+
if line
|
149
|
+
@search_string = line
|
150
|
+
@pager.search(@search_string, false)
|
145
151
|
end
|
146
|
-
@
|
147
|
-
@pager.search(@search_string, false)
|
148
|
-
@repo.exit_command_mode!
|
152
|
+
@status.exit_command_mode!
|
149
153
|
when 'n'
|
150
154
|
@pager.search(@search_string, true)
|
151
155
|
after_navigation
|
@@ -153,6 +157,29 @@ module GitSpelunk
|
|
153
157
|
exit
|
154
158
|
end
|
155
159
|
end
|
160
|
+
|
161
|
+
# you'd really think there was a better way
|
162
|
+
def getline
|
163
|
+
while ch = Curses.getch
|
164
|
+
case ch
|
165
|
+
when Curses::KEY_CTRL_C
|
166
|
+
@status.command_buffer = ''
|
167
|
+
return
|
168
|
+
when Curses::KEY_CTRL_M
|
169
|
+
return @status.command_buffer[1..-1]
|
170
|
+
when Curses::KEY_BACKSPACE, Curses::KEY_CTRL_H, 127
|
171
|
+
if @status.command_buffer == "/"
|
172
|
+
return
|
173
|
+
end
|
174
|
+
@status.command_buffer.chop!
|
175
|
+
else
|
176
|
+
if ch.is_a?(String)
|
177
|
+
@status.command_buffer += ch
|
178
|
+
end
|
179
|
+
end
|
180
|
+
@status.draw
|
181
|
+
end
|
182
|
+
end
|
156
183
|
end
|
157
184
|
end
|
158
185
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_spelunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/git_spelunk/offset.rb
|
43
43
|
- lib/git_spelunk/ui/pager.rb
|
44
44
|
- lib/git_spelunk/ui/repo.rb
|
45
|
+
- lib/git_spelunk/ui/status.rb
|
45
46
|
- lib/git_spelunk/ui/window.rb
|
46
47
|
- lib/git_spelunk/ui.rb
|
47
48
|
- lib/git_spelunk.rb
|