hubeye 0.2.5 → 0.2.7
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/README.md +58 -50
- data/VERSION.rb +2 -2
- data/bin/hubeye +7 -6
- data/lib/client/hubeye_client.rb +9 -6
- data/lib/log/logger.rb +28 -26
- data/lib/notification/{notification.rb → finder.rb} +6 -2
- data/lib/notification/gnomenotify.rb +8 -7
- data/lib/notification/growl.rb +8 -7
- data/lib/server/hubeye_server.rb +23 -8
- metadata +2 -2
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#Hubeye
|
2
2
|
<br />
|
3
3
|
Keep track of repositories on Github, get notified when they change and<br />
|
4
|
-
(optionally) run local system commands when new commits
|
4
|
+
(optionally) run local system commands when new commits get pushed to certain
|
5
|
+
repositories.<br />
|
5
6
|
<br />
|
6
7
|
|
7
8
|
Hubeye is composed of a client and server. Once the server is run,<br />
|
@@ -11,15 +12,22 @@ prompted by a '>'. Type the name of a Github repository.
|
|
11
12
|
Example: (what the user enters is preceded by the prompt)
|
12
13
|
|
13
14
|
>hubeye
|
14
|
-
|
15
|
-
|
16
|
-
parent ea63fe317fe58dff1c95
|
17
|
-
log tracking info for repos on client quit => luke-gru
|
15
|
+
log tracking info for repos on client quit
|
16
|
+
=> luke-gru
|
18
17
|
|
19
|
-
What you see is the latest commit
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
What you see is the latest commit msg and committer for that repository.<br />
|
19
|
+
Note that the user did not type a username. This is because she defined <br />
|
20
|
+
a username in her ~/.hubeye/hubeyerc file.
|
21
|
+
|
22
|
+
Once a repo is in the watch list, typing it again will go and see if it has
|
23
|
+
changed.
|
24
|
+
|
25
|
+
>hubeye
|
26
|
+
Repository luke-gru/hubeye has not changed.
|
27
|
+
|
28
|
+
If, however, luke-gru/hubeye was pushed to since she last typed it in, <br />
|
29
|
+
it will tell her that there have been changes, and what the new commit <br />
|
30
|
+
message is.
|
23
31
|
|
24
32
|
##Starting Hubeye
|
25
33
|
|
@@ -35,11 +43,11 @@ your terminal (on <b>t</b>op):
|
|
35
43
|
|
36
44
|
>hubeye -st
|
37
45
|
|
38
|
-
Hubeye runs on port
|
46
|
+
Hubeye runs on port 4545 by default. Change the port like this:
|
39
47
|
|
40
48
|
>hubeye -sp 9001
|
41
49
|
|
42
|
-
To connect
|
50
|
+
To connect using the client:
|
43
51
|
|
44
52
|
>hubeye -c
|
45
53
|
|
@@ -58,7 +66,7 @@ should be a valid Github username.
|
|
58
66
|
|
59
67
|
###Keeping track of repositories
|
60
68
|
|
61
|
-
Hubeye doesn't actually
|
69
|
+
Hubeye doesn't actually enter its tracking loop unless you disconnect<br />
|
62
70
|
from the server and leave the server running. This can be done by:
|
63
71
|
|
64
72
|
>quit
|
@@ -69,38 +77,44 @@ It can keep track of as many repos as you want; just keep typing<br />
|
|
69
77
|
them in. If Hubeye finds a change to a repo, it will notify you of the<br />
|
70
78
|
changes using your Desktop notification system (libnotify, growl). It will<br />
|
71
79
|
also log the changes to your $HOME/.hubeye/log file. If the server is run<br />
|
72
|
-
in a terminal (-t option), the changes will also be logged to the terminal.<br
|
73
|
-
/>
|
80
|
+
in a terminal (-t option), the changes will also be logged to the terminal.<br />
|
74
81
|
|
75
|
-
|
82
|
+
Note that since the server is still running, you can connect to it using the<br />
|
83
|
+
client any time to add more repos to track, or to check the current commits.
|
84
|
+
|
85
|
+
To track your own repository, start the <i>client</i> in the root directory<br />
|
76
86
|
of your local git repo:
|
77
87
|
|
78
88
|
>.
|
79
89
|
|
80
90
|
This only works if a <i>username</i> is added to the hubeyerc, and if the<br />
|
81
|
-
Github repository name is the same as the
|
82
|
-
ie: '.' put in '/home/luke/code/hubeye' would track https://www.github.com/
|
83
|
-
luke-gru
|
84
|
-
if <i>username</i> was set to luke-gru.<br />
|
91
|
+
Github repository name is the same as the basename of $PWD<br />
|
92
|
+
ie: '.' put in '/home/luke/code/hubeye' would track https://www.github.com/luke-gru/hubeye
|
93
|
+
if <i>username</i> were set to luke-gru.<br />
|
85
94
|
|
86
95
|
You can add another user's repo like this:
|
87
96
|
|
88
97
|
>rails/rails
|
89
98
|
|
90
|
-
This adds https://github.com/rails/rails to the watch list.<br />
|
99
|
+
This adds <b>https://github.com/rails/rails</b> to the watch list.<br />
|
91
100
|
Hubeye does not remove a repo from the watch list unless explicitly<br />
|
92
101
|
told to do so:
|
93
102
|
|
94
103
|
>rm luke-gru/hubeye
|
95
104
|
|
96
|
-
To see a list of all repos
|
105
|
+
To see a list of all repos that Hubeye is tracking:
|
97
106
|
|
98
107
|
>tracking
|
99
108
|
|
109
|
+
To see a more detailed list, including commit messages:
|
110
|
+
|
111
|
+
>tracking -d
|
112
|
+
|
100
113
|
###Desktop Notification
|
101
114
|
<i>On Linux: install libnotify-bin. On Mac: install growl (if not already installed).<br />
|
102
|
-
The autotest gem is needed for Desktop notification to work
|
103
|
-
|
115
|
+
The autotest gem is needed for Desktop notification to work with growl.<br />
|
116
|
+
Desktop notification is currently untested with growl, so please send error reports if<br />
|
117
|
+
you have any problems, or fork Hubeye and help out!</i>
|
104
118
|
|
105
119
|
###Shutting down and persistence between sessions
|
106
120
|
|
@@ -119,23 +133,22 @@ A way to interactively save all currently tracked repositories:
|
|
119
133
|
|
120
134
|
>save repos as my_work_repos
|
121
135
|
|
122
|
-
And then load any time (even after a shutdown
|
136
|
+
And then load them any time (even after a shutdown, next session, next week, etc...)
|
123
137
|
|
124
138
|
>load repos my_work_repos
|
125
139
|
|
140
|
+
This puts the repository names in the watch list with their most recent commits,
|
141
|
+
not the commits that were being tracked when you saved the repos.
|
142
|
+
|
126
143
|
###Working with hooks
|
127
144
|
|
128
145
|
>hook add rails/rails dir: /path/to/local/rails cmd: git pull origin master
|
129
146
|
|
130
|
-
When <b>https://www.github.com/rails/rails</b> changes, a process will start,
|
131
|
-
<br />
|
132
|
-
|
133
|
-
<br />
|
134
|
-
|
135
|
-
case,
|
136
|
-
<br />
|
137
|
-
the directory will be where the hubeye server was originally
|
138
|
-
started from.<br />
|
147
|
+
When <b>https://www.github.com/rails/rails</b> changes, a process will start, <br />
|
148
|
+
change to the selected directory and execute the command. The <i>(dir: /my/dir)</i><br />
|
149
|
+
part is optional, and when ignored won't change directories. In that case,<br />
|
150
|
+
the directory in which the command is executed will be where the Hubeye server<br />
|
151
|
+
was originally started.<br />
|
139
152
|
|
140
153
|
To see all currently loaded hooks:
|
141
154
|
|
@@ -149,8 +162,7 @@ Then, next weekend:
|
|
149
162
|
|
150
163
|
>load hooks weekend_projects_hooks
|
151
164
|
|
152
|
-
These hooks, of course, will only really do anything if the repositories they
|
153
|
-
<br />
|
165
|
+
These hooks, of course, will only really do anything if the repositories they <br />
|
154
166
|
are hooked to are currently being watched. This is not done automatically.
|
155
167
|
|
156
168
|
###All ~/.hubeyerc configurations
|
@@ -159,31 +171,27 @@ When the server is started, the options are set here.
|
|
159
171
|
|
160
172
|
username: luke-gru
|
161
173
|
track: username/reponame, username2/reponame2, myreponame
|
162
|
-
oncearound
|
174
|
+
oncearound: 90
|
163
175
|
load hooks: myhook1, myworkhooks
|
164
176
|
load repos: workprojects, funprojects
|
165
|
-
desktop notification: on
|
177
|
+
desktop notification: on
|
166
178
|
|
167
|
-
<i>username</i>: username used for Github URLS when the full path is not
|
168
|
-
given<br />
|
169
|
-
inside of the client.<br />
|
179
|
+
<i>username</i>: username used for Github URLS when the full path is not <br />
|
180
|
+
given inside of the client <br />
|
170
181
|
|
171
182
|
<i>track</i>: default repositories to watch for changes upon server start<br />
|
172
183
|
|
173
|
-
<i>oncearound</i>: number of seconds before completing a check of every repo in<br />
|
174
|
-
the watch list for changes<br />
|
184
|
+
<i>oncearound</i>: number of seconds before completing a check of every repo in <br />
|
185
|
+
the watch list for changes <br />
|
175
186
|
|
176
|
-
<i>load hooks</i>: load hooks on server start. To see how to save hooks in the
|
177
|
-
<br />
|
178
|
-
client, see the <i>Working with hooks</i> section<br />
|
187
|
+
<i>load hooks</i>: load hooks on server start. To see how to save hooks in the <br />
|
188
|
+
client, see the <i>Working with hooks</i> section <br />
|
179
189
|
|
180
|
-
<i>load repos</i>: load repos on server start. To see how to save repos in the
|
181
|
-
<br />
|
190
|
+
<i>load repos</i>: load repos on server start. To see how to save repos in the <br />
|
182
191
|
client, see the <i>Shutting down and persistence between sessions</i> section.
|
183
192
|
<br />
|
184
193
|
|
185
|
-
<i>desktop notification</i>: whether to notify of repo changes using libnotify
|
186
|
-
<br />
|
194
|
+
<i>desktop notification</i>: whether to notify of repo changes using libnotify <br />
|
187
195
|
or growl. This is set to <i>on</i> by default. However, if no notification<br />
|
188
|
-
system is found, it is ignored.
|
196
|
+
system is found, it is ignored. Set it to <i>off</i> if you don't want it.
|
189
197
|
|
data/VERSION.rb
CHANGED
data/bin/hubeye
CHANGED
@@ -12,7 +12,7 @@ require 'ostruct'
|
|
12
12
|
unless File.exists?(File.join(ENV['HOME'],'.hubeye'))
|
13
13
|
require 'rake'
|
14
14
|
|
15
|
-
require File.join(ROOTDIR, 'tasks
|
15
|
+
require File.join(ROOTDIR, 'tasks', 'install')
|
16
16
|
Rake.application['install'].invoke
|
17
17
|
end
|
18
18
|
|
@@ -83,7 +83,7 @@ class Hubeye
|
|
83
83
|
daemonized = options.server_daemonized
|
84
84
|
if options.server_wanted
|
85
85
|
unless port_open?(port)
|
86
|
-
puts "
|
86
|
+
puts "A service is already running on this port"
|
87
87
|
exit 1
|
88
88
|
end
|
89
89
|
require File.join(LIBDIR, 'server', 'hubeye_server')
|
@@ -91,15 +91,17 @@ class Hubeye
|
|
91
91
|
start_server(port, :daemon => true) :
|
92
92
|
start_server(port, :daemon => false)
|
93
93
|
else
|
94
|
+
['INT', 'KILL'].each do |sig|
|
95
|
+
trap(sig) { STDOUT.puts; exit 1 }
|
96
|
+
end
|
94
97
|
require File.join(LIBDIR, 'client', 'hubeye_client')
|
95
98
|
start_client(host, port)
|
96
99
|
end
|
97
100
|
end
|
98
101
|
|
99
|
-
|
100
102
|
def port_open?(port)
|
101
|
-
# this
|
102
|
-
#
|
103
|
+
# will change this to a more platform-agnostic method, like
|
104
|
+
# rescuing busy port exceptions.
|
103
105
|
listening_tcps = `netstat -l --tcp --numeric`
|
104
106
|
if /#{port}/ =~ listening_tcps
|
105
107
|
return false
|
@@ -107,7 +109,6 @@ class Hubeye
|
|
107
109
|
true
|
108
110
|
end
|
109
111
|
|
110
|
-
|
111
112
|
def start_server(port, options={})
|
112
113
|
server = HubeyeServer.new(true) # debug: true
|
113
114
|
if options[:daemon]
|
data/lib/client/hubeye_client.rb
CHANGED
@@ -62,11 +62,15 @@ class HubeyeClient
|
|
62
62
|
STDOUT.print '> '
|
63
63
|
STDOUT.flush
|
64
64
|
local = STDIN.gets
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
65
|
+
begin
|
66
|
+
if local.match(/^\.$/) # '.' = pwd
|
67
|
+
# Send the line to the server, daemons gem strips some special chars (/, :)
|
68
|
+
@s.puts(local.gsub(/\A\.\Z/, "pwd" + Dir.pwd.split('/').last))
|
69
|
+
else
|
70
|
+
@s.puts(local.gsub(/\//, 'diiv'))
|
71
|
+
end
|
72
|
+
rescue Errno::EPIPE
|
73
|
+
exit 1
|
70
74
|
end
|
71
75
|
@s.flush
|
72
76
|
if local =~ /load repo/
|
@@ -80,7 +84,6 @@ class HubeyeClient
|
|
80
84
|
rescue EOFError
|
81
85
|
response = "Bye!"
|
82
86
|
end
|
83
|
-
|
84
87
|
if response.chop.strip == "Bye!"
|
85
88
|
puts response.chop
|
86
89
|
@s.close
|
data/lib/log/logger.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Log
|
2
|
+
class Logger
|
3
|
+
LOG_DIR = File.join(ENV['HOME'], '.hubeye', 'log')
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
def self.log(msg)
|
6
|
+
File.open(LOG_DIR, "a") do |f|
|
7
|
+
f.puts(msg)
|
8
|
+
end
|
7
9
|
end
|
8
|
-
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def self.relog(msg)
|
12
|
+
#wipe the file and start anew
|
13
|
+
File.open(LOG_DIR, "w") do |f|
|
14
|
+
f.puts(msg)
|
15
|
+
end
|
14
16
|
end
|
15
|
-
end
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
# If {include_terminal: true}, log to the terminal too (make sure that the
|
19
|
+
# process is not daemonized). Always log to the logfile.
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
def self.log_change(repo_name, commit_msg, committer, options={})
|
22
|
+
opts = {:include_terminal => false}.merge options
|
23
|
+
change_msg = <<-MSG
|
24
|
+
===============================
|
25
|
+
Repository: #{repo_name.downcase.strip} has changed (#{Time.now.strftime("%m/%d/%Y at %I:%M%p")})
|
26
|
+
Commit msg: #{commit_msg}
|
27
|
+
Committer : #{committer}
|
28
|
+
===============================
|
29
|
+
MSG
|
30
|
+
if opts[:include_terminal]
|
31
|
+
STDOUT.puts change_msg
|
32
|
+
end
|
33
|
+
log(change_msg)
|
31
34
|
end
|
32
|
-
log(change_msg)
|
33
|
-
end
|
34
35
|
|
36
|
+
end
|
35
37
|
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
module Notification
|
2
2
|
|
3
|
+
dir = File.dirname(__FILE__)
|
4
|
+
CHANGE_ICON = "change_icon.jpg"
|
5
|
+
CHANGE_ICON_PATH = File.expand_path(File.join(dir, "..", "images", CHANGE_ICON))
|
6
|
+
|
3
7
|
class Finder
|
4
8
|
|
5
9
|
def self.find_notify
|
@@ -46,7 +50,7 @@ module Notification
|
|
46
50
|
end
|
47
51
|
end
|
48
52
|
if defined? Autotest
|
49
|
-
|
53
|
+
true
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
@@ -62,7 +66,7 @@ module Notification
|
|
62
66
|
end
|
63
67
|
end
|
64
68
|
if defined? Autotest
|
65
|
-
|
69
|
+
true
|
66
70
|
end
|
67
71
|
end
|
68
72
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
-
module
|
1
|
+
module Notification
|
2
|
+
module GnomeNotify
|
2
3
|
|
3
|
-
|
4
|
-
CHANGE_ICON = File.join(File.expand_path("images", ::Environment::ROOTDIR), "change_icon.jpg")
|
4
|
+
EXPIRATION_IN_SECONDS = 2
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def self.notify(title, msg, img=CHANGE_ICON_PATH)
|
7
|
+
options = "-t #{EXPIRATION_IN_SECONDS * 1000} -i #{img}"
|
8
|
+
system "notify-send #{options} '#{title}' '#{msg}'"
|
9
|
+
end
|
10
10
|
|
11
|
+
end
|
11
12
|
end
|
data/lib/notification/growl.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
module Autotest
|
1
|
+
module Autotest
|
2
|
+
module Growl
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
CHANGE_ICON = File.expand_path(dir + "/../images/change_icon.jpg")
|
4
|
+
EXPIRATION_IN_SECONDS = 2
|
5
|
+
IMG = ::Notification::CHANGE_ICON_PATH
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
def self.growl(title, msg, img=IMG, pri=0, stick="")
|
8
|
+
system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{stick}"
|
9
|
+
end
|
10
10
|
|
11
|
+
end
|
11
12
|
end
|
data/lib/server/hubeye_server.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "log/logger"
|
2
|
+
include Log
|
3
|
+
|
1
4
|
class Hubeye
|
2
5
|
|
3
6
|
# simple interface to Github's api v3 for commits
|
@@ -53,8 +56,7 @@ class Hubeye
|
|
53
56
|
require 'open-uri'
|
54
57
|
# hubeye
|
55
58
|
require "config/parser"
|
56
|
-
require "
|
57
|
-
require "notification/notification"
|
59
|
+
require "notification/finder"
|
58
60
|
require "hooks/git_hooks"
|
59
61
|
require "hooks/executer"
|
60
62
|
require "helpers/time"
|
@@ -110,6 +112,11 @@ class Hubeye
|
|
110
112
|
opts = {:internal_input => nil}.merge options
|
111
113
|
if !opts[:internal_input]
|
112
114
|
@input = server.socket.gets
|
115
|
+
# check if the client pressed ^C or ^D
|
116
|
+
if @input.nil?
|
117
|
+
@server.remote_connection = false
|
118
|
+
throw(:invalid_input)
|
119
|
+
end
|
113
120
|
@input.chop!
|
114
121
|
else
|
115
122
|
@input = opts[:internal_input]
|
@@ -174,7 +181,7 @@ class Hubeye
|
|
174
181
|
@sockets.delete(@socket)
|
175
182
|
@socket.close
|
176
183
|
unless @server.daemonized
|
177
|
-
STDOUT.puts "
|
184
|
+
STDOUT.puts "Shutting down gracefully."
|
178
185
|
end
|
179
186
|
exit 0
|
180
187
|
end
|
@@ -534,8 +541,10 @@ EOS
|
|
534
541
|
look_for_changes unless @remote_connection
|
535
542
|
end
|
536
543
|
client_connect(@sockets) if waiting
|
537
|
-
|
538
|
-
|
544
|
+
catch(:invalid_input) do
|
545
|
+
strategy = Strategy.new(self)
|
546
|
+
strategy.call
|
547
|
+
end
|
539
548
|
@session.cleanup
|
540
549
|
end
|
541
550
|
end
|
@@ -564,7 +573,7 @@ EOS
|
|
564
573
|
end
|
565
574
|
rescue
|
566
575
|
@socket.puts "Not a Github repository name"
|
567
|
-
|
576
|
+
throw(:invalid_input)
|
568
577
|
end
|
569
578
|
new_info =
|
570
579
|
{full_repo_name =>
|
@@ -602,6 +611,13 @@ EOS
|
|
602
611
|
def setup_env(options={})
|
603
612
|
@daemonized = options[:daemon]
|
604
613
|
@sockets = [@server] # An array of sockets we'll monitor
|
614
|
+
['INT', 'KILL'].each do |sig|
|
615
|
+
trap(sig) do
|
616
|
+
@sockets.each {|s| s.close}
|
617
|
+
STDOUT.puts
|
618
|
+
exit 1
|
619
|
+
end
|
620
|
+
end
|
605
621
|
@session = Session.new
|
606
622
|
unless CONFIG[:default_track].nil?
|
607
623
|
CONFIG[:default_track].each do |repo|
|
@@ -665,7 +681,7 @@ EOS
|
|
665
681
|
"#{commit_msg}\n=> #{committer}"
|
666
682
|
case CONFIG[:desktop_notification]
|
667
683
|
when "libnotify"
|
668
|
-
|
684
|
+
Notification::GnomeNotify.notify("Hubeye", change_msg)
|
669
685
|
Logger.log_change(full_repo_name, commit_msg, committer)
|
670
686
|
when "growl"
|
671
687
|
Autotest::Growl.growl("Hubeye", change_msg)
|
@@ -680,7 +696,6 @@ EOS
|
|
680
696
|
# execute any hooks for that repository
|
681
697
|
unless @session.hooks.nil? || @session.hooks.empty?
|
682
698
|
if hooks = @session.hooks[full_repo_name]
|
683
|
-
hooks = hooks.dup
|
684
699
|
hooks.each do |dir,cmds|
|
685
700
|
# execute() takes [commands], {options} where
|
686
701
|
# options = :directory and :repo
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hubeye
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -32,7 +32,7 @@ files:
|
|
32
32
|
- lib/client/hubeye_client.rb
|
33
33
|
- lib/notification/growl.rb
|
34
34
|
- lib/notification/gnomenotify.rb
|
35
|
-
- lib/notification/
|
35
|
+
- lib/notification/finder.rb
|
36
36
|
- lib/server/hubeye_server.rb
|
37
37
|
- lib/hooks/executer.rb
|
38
38
|
- lib/hooks/git_hooks.rb
|