git_spelunk 0.2.1 → 0.2.2
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 +15 -0
- data/lib/git_spelunk/file_context.rb +12 -3
- data/lib/git_spelunk/grit_patches.rb +9 -0
- data/lib/git_spelunk/offset.rb +29 -13
- data/lib/git_spelunk/ui/status.rb +13 -1
- data/lib/git_spelunk/ui.rb +17 -5
- data/lib/git_spelunk.rb +2 -0
- metadata +6 -10
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YzAyMWIwY2EzMjU2NWM1YTFmMDE3NDFkOTQzODg2ZmEwYzBiZDM5MQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
Zjg4Nzg3ZDhkN2QwODAzOTQxY2Y2YTYzMWE0NWQ3NjE2ZjFiYjg1OQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
M2M4MjljMTM1ODMwMjZlZGY1YTFjOGNiODYxNWRjMGNmOTM2ZmFjZTU0NDc1
|
10
|
+
MDNlYWQxMzJlOTc2Njg1Y2EyMDMxNzI1YjZlYTVhODNhMjY4Yjg4ZDQyOGIy
|
11
|
+
OWUwODI5YzI2Mjg5N2E4YWI2ZWQxZWE2ZmExMDIxYzkwNzZlZmY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NTUxYTYwZGZlNGM3MTIzMDIyY2EzMTI4ZTkwMzJjZWY2NjRlNTlhYzJmZGVm
|
14
|
+
OWQwMmVhYzZjYTAxNTRmMmJmZGFmMmNhYmE1NjY1YzYyMGY0M2NmOTU0YjFm
|
15
|
+
YWU5ZTc0M2YzYTlhYTk2ODIzMTI0NzU0NWYzOTNjMDUzMDA2MDg=
|
@@ -4,7 +4,7 @@ require 'fileutils'
|
|
4
4
|
module GitSpelunk
|
5
5
|
class FileContext
|
6
6
|
attr_accessor :line_number
|
7
|
-
attr_reader :repo
|
7
|
+
attr_reader :repo, :sha, :file
|
8
8
|
|
9
9
|
def initialize(file, options = {})
|
10
10
|
@sha = options[:sha] || 'HEAD'
|
@@ -27,8 +27,17 @@ module GitSpelunk
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_line_for_sha_parent(line_number)
|
30
|
-
o = GitSpelunk::Offset.new(@repo, @file, sha_for_line(line_number))
|
31
|
-
o.line_number_to_parent
|
30
|
+
o = GitSpelunk::Offset.new(@repo, @file, sha_for_line(line_number), @new_to_old[line_number])
|
31
|
+
line = o.line_number_to_parent
|
32
|
+
if line
|
33
|
+
line
|
34
|
+
else
|
35
|
+
if o.at_beginning_of_time?
|
36
|
+
:at_beginning_of_time
|
37
|
+
elsif o.unable_to_trace_lineage?
|
38
|
+
:unable_to_trace
|
39
|
+
end
|
40
|
+
end
|
32
41
|
end
|
33
42
|
|
34
43
|
def find_repo_from_file(file)
|
data/lib/git_spelunk/offset.rb
CHANGED
@@ -38,33 +38,49 @@ module GitSpelunk
|
|
38
38
|
class Offset
|
39
39
|
attr_reader :repo, :file_name, :sha, :chunks
|
40
40
|
|
41
|
-
def initialize(repo, file_name, sha)
|
41
|
+
def initialize(repo, file_name, sha, line_number)
|
42
42
|
@repo = repo
|
43
43
|
@file_name = file_name
|
44
44
|
@sha = sha
|
45
|
-
|
46
|
-
@
|
45
|
+
@line_number = line_number
|
46
|
+
@parent = @repo.commits(@sha)[0].parents[0]
|
47
|
+
true
|
47
48
|
end
|
48
49
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
def chunks
|
51
|
+
@chunks ||= diff_chunks(@repo.diff(@parent.id, @sha, @file_name))
|
52
|
+
end
|
53
|
+
|
54
|
+
def at_beginning_of_time?
|
55
|
+
@parent.nil?
|
56
|
+
end
|
57
|
+
|
58
|
+
def unable_to_trace_lineage?
|
59
|
+
@parent && (@chunks.nil? || target_chunk.nil?)
|
55
60
|
end
|
56
61
|
|
57
|
-
def line_number_to_parent
|
58
|
-
return nil unless @chunks
|
59
|
-
chunk = target_chunk(
|
62
|
+
def line_number_to_parent
|
63
|
+
return nil unless @parent && chunks
|
64
|
+
chunk = target_chunk(@line_number)
|
65
|
+
return nil unless chunk
|
66
|
+
|
60
67
|
chunk_starting_line, chunk_total_lines = src_start_and_total(stats_line(chunk))
|
61
68
|
parent_starting_line = parent_start_and_total(stats_line(chunk))[0]
|
62
|
-
parent_line_offset = find_parent_line_number(diff_lines(chunk),
|
69
|
+
parent_line_offset = find_parent_line_number(diff_lines(chunk), @line_number, chunk_starting_line, chunk_total_lines)
|
63
70
|
parent_starting_line + parent_line_offset
|
64
71
|
end
|
65
72
|
|
66
73
|
private
|
67
74
|
|
75
|
+
def diff_chunks(diffs)
|
76
|
+
return nil if diffs.empty?
|
77
|
+
# split it into chunks: [["@@ -10,13 +10,18 @@", diffs], ["@@ -20,13 +20,18 @@", diffs, diff]]
|
78
|
+
multiple_chunks = diffs[0].diff.split(/(@@ \-\d+,\d+ \+\d+,\d+ @@.*?\n)/)
|
79
|
+
# Discard file name line
|
80
|
+
multiple_chunks[1..multiple_chunks.length].each_slice(2).to_a
|
81
|
+
end
|
82
|
+
|
83
|
+
|
68
84
|
def target_chunk(line_number)
|
69
85
|
chunks.select {|chunk| has_line?(chunk, line_number)}[0]
|
70
86
|
end
|
@@ -5,9 +5,20 @@ module GitSpelunk
|
|
5
5
|
@window = Curses::Window.new(height, Curses.cols, offset, 0)
|
6
6
|
@offset = offset
|
7
7
|
@command_buffer = ""
|
8
|
+
@status_message = ""
|
9
|
+
@onetime_message = nil
|
8
10
|
end
|
9
11
|
|
10
|
-
attr_accessor :command_buffer
|
12
|
+
attr_accessor :command_buffer, :status_message
|
13
|
+
|
14
|
+
def clear_onetime_message!
|
15
|
+
@onetime_message = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_onetime_message(message)
|
19
|
+
@onetime_message = message
|
20
|
+
draw
|
21
|
+
end
|
11
22
|
|
12
23
|
def exit_command_mode!
|
13
24
|
self.command_buffer = ""
|
@@ -26,6 +37,7 @@ module GitSpelunk
|
|
26
37
|
else
|
27
38
|
Curses.curs_set(0)
|
28
39
|
with_highlighting do
|
40
|
+
@window.addstr(@onetime_message || @status_message)
|
29
41
|
@window.addstr(" " * line_remainder + "\n")
|
30
42
|
end
|
31
43
|
end
|
data/lib/git_spelunk/ui.rb
CHANGED
@@ -19,6 +19,7 @@ module GitSpelunk
|
|
19
19
|
@repo = RepoWindow.new(@repo_height, @pager_height)
|
20
20
|
|
21
21
|
@status = StatusWindow.new(1, Curses.lines - 1)
|
22
|
+
set_status_message
|
22
23
|
end
|
23
24
|
|
24
25
|
def init_curses
|
@@ -49,6 +50,10 @@ module GitSpelunk
|
|
49
50
|
end while true
|
50
51
|
end
|
51
52
|
|
53
|
+
def set_status_message
|
54
|
+
@status.status_message = "#{@file_context.file} @ #{@file_context.sha}"
|
55
|
+
end
|
56
|
+
|
52
57
|
def pause_thread
|
53
58
|
Thread.abort_on_exception = true
|
54
59
|
Thread.new do
|
@@ -59,7 +64,6 @@ module GitSpelunk
|
|
59
64
|
if heartbeat_expired? && @pager.cursor == current_line
|
60
65
|
@repo.content = content
|
61
66
|
@repo.draw
|
62
|
-
@status.draw
|
63
67
|
@last_line = current_line
|
64
68
|
else
|
65
69
|
@heartbeat = Time.now
|
@@ -77,6 +81,7 @@ module GitSpelunk
|
|
77
81
|
def after_navigation
|
78
82
|
@pager.highlight_sha = true
|
79
83
|
@status.exit_command_mode!
|
84
|
+
@status.clear_onetime_message!
|
80
85
|
end
|
81
86
|
|
82
87
|
def handle_key(key)
|
@@ -109,8 +114,9 @@ module GitSpelunk
|
|
109
114
|
end
|
110
115
|
after_navigation
|
111
116
|
when '['
|
117
|
+
@status.set_onetime_message("Rewinding...")
|
112
118
|
goto = @file_context.get_line_for_sha_parent(@pager.cursor)
|
113
|
-
if goto
|
119
|
+
if goto.is_a?(Fixnum)
|
114
120
|
@file_context.line_number = @pager.cursor
|
115
121
|
@history.push(@file_context)
|
116
122
|
|
@@ -119,15 +125,22 @@ module GitSpelunk
|
|
119
125
|
@pager.go_to(goto)
|
120
126
|
|
121
127
|
# force commit info update
|
128
|
+
@status.clear_onetime_message!
|
129
|
+
set_status_message
|
122
130
|
@last_line = nil
|
131
|
+
elsif goto == :at_beginning_of_time
|
132
|
+
@status.set_onetime_message("At beginning of repository history!")
|
133
|
+
elsif goto == :unable_to_trace
|
134
|
+
@status.set_onetime_message("Unable to trace lineage of file line")
|
123
135
|
end
|
124
136
|
when ']'
|
125
137
|
if @history.last
|
126
138
|
@file_context = @history.pop
|
127
139
|
@pager.data = @file_context.get_blame
|
128
140
|
@pager.go_to(@file_context.line_number)
|
129
|
-
|
130
|
-
@status.
|
141
|
+
|
142
|
+
@status.clear_onetime_message!
|
143
|
+
set_status_message
|
131
144
|
|
132
145
|
# force commit info update
|
133
146
|
@last_line = nil
|
@@ -138,7 +151,6 @@ module GitSpelunk
|
|
138
151
|
Curses.close_screen
|
139
152
|
system("git -p --git-dir='#{@file_context.repo.path}' show #{sha} | less")
|
140
153
|
Curses.stdscr.refresh
|
141
|
-
[@pager, @repo, @status].each(&:draw)
|
142
154
|
when '/', '?'
|
143
155
|
@heartbeat = nil
|
144
156
|
@status.command_buffer = key
|
data/lib/git_spelunk.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git_spelunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ben Osheroff
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-12-12 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: grit
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ! '>='
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ! '>='
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -40,6 +37,7 @@ extra_rdoc_files: []
|
|
40
37
|
files:
|
41
38
|
- lib/git_spelunk/file.rb
|
42
39
|
- lib/git_spelunk/file_context.rb
|
40
|
+
- lib/git_spelunk/grit_patches.rb
|
43
41
|
- lib/git_spelunk/offset.rb
|
44
42
|
- lib/git_spelunk/ui/pager.rb
|
45
43
|
- lib/git_spelunk/ui/repo.rb
|
@@ -50,27 +48,25 @@ files:
|
|
50
48
|
- bin/git-spelunk
|
51
49
|
homepage: https://github.com/osheroff/git-spelunk
|
52
50
|
licenses: []
|
51
|
+
metadata: {}
|
53
52
|
post_install_message:
|
54
53
|
rdoc_options: []
|
55
54
|
require_paths:
|
56
55
|
- lib
|
57
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
57
|
requirements:
|
60
58
|
- - ! '>='
|
61
59
|
- !ruby/object:Gem::Version
|
62
60
|
version: '0'
|
63
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
-
none: false
|
65
62
|
requirements:
|
66
63
|
- - ! '>='
|
67
64
|
- !ruby/object:Gem::Version
|
68
65
|
version: 1.3.6
|
69
66
|
requirements: []
|
70
67
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.
|
68
|
+
rubygems_version: 2.1.11
|
72
69
|
signing_key:
|
73
|
-
specification_version:
|
70
|
+
specification_version: 4
|
74
71
|
summary: A git tool for exploring history and blame
|
75
72
|
test_files: []
|
76
|
-
has_rdoc:
|