romglog 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/omglog +22 -0
- data/bin/romglog +22 -0
- data/lib/linux.rb +18 -0
- data/lib/omglog.rb +72 -0
- data/lib/osx.rb +12 -0
- data/lib/romglog.rb +55 -0
- metadata +86 -0
data/bin/omglog
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Support UTF-8 in author names & commit messages, even when
|
4
|
+
# the system locale isn't set to UTF-8.
|
5
|
+
Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > '1.8.7'
|
6
|
+
|
7
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
8
|
+
|
9
|
+
require 'omglog'
|
10
|
+
|
11
|
+
abort("Run omglog at the root of the git repo you'd like to watch.") if (ARGV & %w[-h --help help]).any?
|
12
|
+
abort("The current directory doesn't look like the root of a git repo.") unless File.directory?('.git')
|
13
|
+
|
14
|
+
if RUBY_PLATFORM[/darwin/i]
|
15
|
+
require 'osx'
|
16
|
+
Omglog.run_on Omglog::OSX
|
17
|
+
elsif RUBY_PLATFORM[/linux/i]
|
18
|
+
require 'linux'
|
19
|
+
Omglog.run_on Omglog::Linux
|
20
|
+
else
|
21
|
+
abort("Sorry, your system isn't supported yet. It just needs notification support -- i.e. fsevents on OS X, or inotify on Linux.")
|
22
|
+
end
|
data/bin/romglog
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Support UTF-8 in author names & commit messages, even when
|
4
|
+
# the system locale isn't set to UTF-8.
|
5
|
+
Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > '1.8.7'
|
6
|
+
|
7
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
8
|
+
|
9
|
+
require 'romglog'
|
10
|
+
|
11
|
+
abort("Run omglog at the root of the git repo you'd like to watch.") if (ARGV & %w[-h --help help]).any?
|
12
|
+
abort("The current directory doesn't look like the root of a git repo.") unless File.directory?('.git')
|
13
|
+
|
14
|
+
if RUBY_PLATFORM[/darwin/i]
|
15
|
+
require 'osx'
|
16
|
+
Romglog.run_on Omglog::OSX
|
17
|
+
elsif RUBY_PLATFORM[/linux/i]
|
18
|
+
require 'linux'
|
19
|
+
Romglog.run_on Omglog::Linux
|
20
|
+
else
|
21
|
+
abort("Sorry, your system isn't supported yet. It just needs notification support -- i.e. fsevents on OS X, or inotify on Linux.")
|
22
|
+
end
|
data/lib/linux.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rb-inotify'
|
2
|
+
|
3
|
+
module Omglog
|
4
|
+
class Linux
|
5
|
+
def self.on_change &block
|
6
|
+
INotify::Notifier.new.tap do |notifier|
|
7
|
+
notifier.watch('.git', :modify, :recursive, &block)
|
8
|
+
['TERM', 'INT', 'QUIT'].each do |signal|
|
9
|
+
trap(signal) do
|
10
|
+
notifier.stop
|
11
|
+
exit(0)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
notifier.run
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/omglog.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Omglog
|
4
|
+
VERSION = '0.0.8'
|
5
|
+
|
6
|
+
def run_on system
|
7
|
+
Omglog::Base.run
|
8
|
+
on_terminal_resize { Omglog::Base.run }
|
9
|
+
system.on_change { Omglog::Base.run }
|
10
|
+
end
|
11
|
+
module_function :run_on
|
12
|
+
|
13
|
+
def on_terminal_resize &block
|
14
|
+
rendering = true
|
15
|
+
trap("WINCH") {
|
16
|
+
# A dragging resize fires lots of WINCH events; this throttles the redraw
|
17
|
+
# and should cause it to (usually) line up with the final dimensions.
|
18
|
+
if rendering
|
19
|
+
rendering = false
|
20
|
+
sleep 0.5
|
21
|
+
rendering = true
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
}
|
25
|
+
end
|
26
|
+
module_function :on_terminal_resize
|
27
|
+
|
28
|
+
class Base
|
29
|
+
CLEAR = "\n----\n"
|
30
|
+
GREEN, YELLOW, BLUE, GREY, HIGHLIGHT = '0;32', '0;33', '0;34', '0;90', '1;30;47'
|
31
|
+
SHORTEST_MESSAGE = 12
|
32
|
+
LOG_CMD = %{git log --all --date-order --graph --color --pretty="format: \2%h\3\2%d\3\2 %an, %ar\3\2 %s\3"}
|
33
|
+
LOG_REGEX = /(.*)\u0002(.*)\u0003\u0002(.*)\u0003\u0002(.*)\u0003\u0002(.*)\u0003/
|
34
|
+
|
35
|
+
def self.log_cmd
|
36
|
+
@log_cmd ||= [LOG_CMD].concat(ARGV).join(' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.run
|
40
|
+
rows, cols = `tput lines; tput cols`.scan(/\d+/).map(&:to_i)
|
41
|
+
`#{log_cmd} -#{rows}`.tap {|log|
|
42
|
+
log_lines = Array.new(rows, '')
|
43
|
+
log_lines.unshift *log.split("\n")
|
44
|
+
|
45
|
+
print CLEAR + log_lines[0...(rows - 1)].map {|l|
|
46
|
+
commit = l.scan(LOG_REGEX).flatten.map(&:to_s)
|
47
|
+
commit.any? ? render_commit(commit, cols) : l
|
48
|
+
}.join("\n") + "\n" + "\e[#{GREY}mupdated #{Time.now.strftime("%a %H:%M:%S")}\e[m ".rjust(cols + 8)
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.render_commit commit, cols
|
53
|
+
row_highlight = commit[2][/[^\/]HEAD\b/] ? HIGHLIGHT : YELLOW
|
54
|
+
[nil, row_highlight, GREEN, '', GREY].map {|c| "\e[#{c}m" if c }.zip(
|
55
|
+
arrange_commit(commit, cols)
|
56
|
+
).join + "\e[m"
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.arrange_commit commit, cols
|
60
|
+
commit[0].chomp!(' ')
|
61
|
+
commit[-2].sub!(/(\d+)\s(\w)[^\s]+ ago/, '\1\2 ago')
|
62
|
+
room = [cols - [commit[0].gsub(/\e\[[\d;]*m/, ''), commit[1..-2]].flatten.map(&:length).inject(&:+), SHORTEST_MESSAGE].max
|
63
|
+
commit.tap {|commit|
|
64
|
+
commit[-1, 0] = if commit[-1].length > room
|
65
|
+
commit.pop[0...(room - 1)] + '…'
|
66
|
+
else
|
67
|
+
commit.pop.ljust(room)
|
68
|
+
end
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/osx.rb
ADDED
data/lib/romglog.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Romglog
|
4
|
+
VERSION = '0.0.8'
|
5
|
+
|
6
|
+
def run_on system
|
7
|
+
Romglog::Base.run
|
8
|
+
on_terminal_resize { Romglog::Base.run }
|
9
|
+
system.on_change { Romglog::Base.run }
|
10
|
+
end
|
11
|
+
module_function :run_on
|
12
|
+
|
13
|
+
def on_terminal_resize &block
|
14
|
+
rendering = true
|
15
|
+
trap("WINCH") {
|
16
|
+
# A dragging resize fires lots of WINCH events; this throttles the redraw
|
17
|
+
# and should cause it to (usually) line up with the final dimensions.
|
18
|
+
if rendering
|
19
|
+
rendering = false
|
20
|
+
sleep 0.5
|
21
|
+
rendering = true
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
}
|
25
|
+
end
|
26
|
+
module_function :on_terminal_resize
|
27
|
+
|
28
|
+
class Base
|
29
|
+
CLEAR = "\n----\n"
|
30
|
+
YELLOW, BLUE, GREY, HIGHLIGHT = '0;33', '0;34', '0;90', '1;30;47'
|
31
|
+
CMD = %{git reflog}
|
32
|
+
|
33
|
+
def self.log_cmd
|
34
|
+
@log_cmd ||= [CMD].concat(ARGV).join(' ')
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.run
|
38
|
+
rows, cols = `tput lines; tput cols`.scan(/\d+/).map(&:to_i)
|
39
|
+
`#{log_cmd}`.tap {|log|
|
40
|
+
log_lines = Array.new(rows, '')
|
41
|
+
log_lines.unshift(*log.split("\n"))
|
42
|
+
|
43
|
+
print CLEAR + log_lines[0...(rows - 1)].map {|l|
|
44
|
+
render_line(l)
|
45
|
+
}.join("\n") + "\n" + "\e[#{GREY}mupdated #{Time.now.strftime("%a %H:%M:%S")}\e[m ".rjust(cols + 8)
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.render_line line
|
50
|
+
cols = line.split(' ')
|
51
|
+
(["\e[#{YELLOW}m#{cols.shift}\e[m"] + cols).join(' ')
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: romglog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Huiming Teo
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rb-fsevent
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.9.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rb-inotify
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.8.8
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.8.8
|
46
|
+
description: Realtime git log + reflog using fseventsd based on benhoskings's omglog.
|
47
|
+
omg! :)
|
48
|
+
email: teohuiming@gmail.com
|
49
|
+
executables:
|
50
|
+
- omglog
|
51
|
+
- romglog
|
52
|
+
extensions: []
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- bin/omglog
|
56
|
+
- bin/romglog
|
57
|
+
- lib/linux.rb
|
58
|
+
- lib/omglog.rb
|
59
|
+
- lib/osx.rb
|
60
|
+
- lib/romglog.rb
|
61
|
+
homepage: http://github.com/teohm/romglog
|
62
|
+
licenses: []
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.8.24
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Realtime git log + reflog using fseventsd based on benhoskings's omglog.
|
85
|
+
test_files: []
|
86
|
+
has_rdoc:
|