hubeye 0.3.0 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.rb +2 -2
- data/bin/hubeye +69 -67
- data/lib/hubeye/client/client.rb +83 -0
- data/lib/hubeye/client/connection.rb +44 -0
- data/lib/hubeye/config/environment.rb +13 -0
- data/lib/{config → hubeye/config}/parser.rb +1 -1
- data/lib/hubeye/helpers/time.rb +8 -0
- data/lib/{hooks → hubeye/hooks}/executer.rb +6 -5
- data/lib/{hooks → hubeye/hooks}/git_hooks.rb +2 -3
- data/lib/hubeye/log/logger.rb +39 -0
- data/lib/hubeye/notification/finder.rb +64 -0
- data/lib/hubeye/notification/gnomenotify.rb +15 -0
- data/lib/{notification → hubeye/notification}/growl.rb +0 -0
- data/lib/hubeye/server/commit.rb +51 -0
- data/lib/hubeye/server/server.rb +686 -0
- data/lib/hubeye/server/session.rb +59 -0
- data/lib/hubeye/shared/hubeye_protocol.rb +36 -0
- data/test/config_parser.rb +2 -2
- data/test/environment.rb +1 -1
- data/test/integration.rb +24 -0
- data/test/notification.rb +3 -2
- data/test/runner.rb +3 -3
- metadata +18 -13
- data/lib/client/hubeye_client.rb +0 -103
- data/lib/environment.rb +0 -10
- data/lib/helpers/time.rb +0 -5
- data/lib/log/logger.rb +0 -38
- data/lib/notification/finder.rb +0 -62
- data/lib/notification/gnomenotify.rb +0 -13
- data/lib/server/hubeye_server.rb +0 -767
@@ -0,0 +1,59 @@
|
|
1
|
+
module Hubeye
|
2
|
+
module Server
|
3
|
+
class Session
|
4
|
+
attr_accessor :repo_name, :username, :continuous
|
5
|
+
attr_writer :tracker, :hooks
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
setup_singleton_methods
|
9
|
+
end
|
10
|
+
|
11
|
+
def tracker
|
12
|
+
@tracker ||= {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def hooks
|
16
|
+
@hooks ||= {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def cleanup
|
20
|
+
reset_username
|
21
|
+
reset_repo_name
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def reset_username
|
26
|
+
self.username = CONFIG[:username]
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset_repo_name
|
30
|
+
self.repo_name = ""
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup_singleton_methods
|
34
|
+
tracker.singleton_class.class_eval do
|
35
|
+
def add_or_replace! input, new_sha=nil
|
36
|
+
if Hash === input and new_sha.nil?
|
37
|
+
repo = input.keys.first
|
38
|
+
hash = true
|
39
|
+
else
|
40
|
+
repo = input
|
41
|
+
two_args = true
|
42
|
+
end
|
43
|
+
if keys.include? repo and self[repo] == new_sha
|
44
|
+
return
|
45
|
+
elsif keys.include? repo
|
46
|
+
ret = {:replace => true}
|
47
|
+
else
|
48
|
+
ret = {:add => true}
|
49
|
+
end
|
50
|
+
two_args ? merge!(repo => new_sha) : merge!(input)
|
51
|
+
ret
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end # end of Session class
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
module HubeyeProtocol
|
4
|
+
HEADER_BYTE_SIZE = 4
|
5
|
+
|
6
|
+
def deliver(body)
|
7
|
+
header = header(body)
|
8
|
+
mesg = header + body
|
9
|
+
self.print mesg
|
10
|
+
self.flush
|
11
|
+
end
|
12
|
+
|
13
|
+
def header(body)
|
14
|
+
body_size = body.bytesize
|
15
|
+
[body_size].pack("N")
|
16
|
+
end
|
17
|
+
|
18
|
+
def read_all
|
19
|
+
read_header
|
20
|
+
read(@body_size)
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_header
|
24
|
+
begin
|
25
|
+
@body_size = read(HEADER_BYTE_SIZE).unpack("N").first.to_i
|
26
|
+
rescue => e
|
27
|
+
STDOUT.puts e.message
|
28
|
+
STDOUT.puts e.backtrace
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class TCPSocket
|
35
|
+
include HubeyeProtocol
|
36
|
+
end
|
data/test/config_parser.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
# Hubeye::Config::Parser.new uses StringIO.open() when option
|
1
|
+
# Hubeye::Config::Parser.new uses StringIO.open() when option :test => true is set
|
2
2
|
require 'stringio'
|
3
3
|
|
4
4
|
class ConfigParserTests < Test::Unit::TestCase
|
5
5
|
|
6
|
-
# otherwise, Test::Unit busies the
|
6
|
+
# otherwise, Test::Unit busies the object.instance_variables
|
7
7
|
# array with things like @passed, and many others
|
8
8
|
def instance_vars
|
9
9
|
[:@username, :@default_track, :@hooks,
|
data/test/environment.rb
CHANGED
data/test/integration.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class HubeyeIntegrationTest < Test::Unit::TestCase
|
2
|
+
include Hubeye::Environment
|
3
|
+
|
4
|
+
EXECUTABLE = File.join(BINDIR, 'hubeye')
|
5
|
+
|
6
|
+
def interact
|
7
|
+
start_server
|
8
|
+
sleep 0.5
|
9
|
+
start_client
|
10
|
+
end
|
11
|
+
|
12
|
+
def start_server
|
13
|
+
system "#{EXECUTABLE} -s"
|
14
|
+
end
|
15
|
+
|
16
|
+
def start_client
|
17
|
+
IO.popen("#{EXECUTABLE} -c", "r+") do |p|
|
18
|
+
p.write 'fjdksfjlsdj'
|
19
|
+
p.close_write
|
20
|
+
p.read.chomp
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/test/notification.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
class NotifyTests < Test::Unit::TestCase
|
2
|
+
include Hubeye::Notification
|
2
3
|
|
3
4
|
def test_libnotify_on_linux
|
4
5
|
if RUBY_PLATFORM =~ /linux/i
|
5
|
-
assert_equal "libnotify",
|
6
|
+
assert_equal "libnotify", Finder.find_notify
|
6
7
|
end
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_growl_returns_on_darwin
|
10
11
|
if RUBY_PLATFORM =~ /darwin/i
|
11
|
-
assert_equal "growl",
|
12
|
+
assert_equal "growl", Finder.find_notify
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
data/test/runner.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
# environment file
|
4
|
-
require File.join(File.expand_path(File.dirname(__FILE__) + '/..'), "lib/environment")
|
4
|
+
require File.join(File.expand_path(File.dirname(__FILE__) + '/..'), "lib/hubeye/config/environment")
|
5
5
|
|
6
6
|
# test/unit
|
7
7
|
require 'test/unit'
|
8
8
|
|
9
9
|
# test files
|
10
10
|
require_relative 'environment'
|
11
|
-
require File.join(File.expand_path(File.dirname(__FILE__) + '/..'), "lib/notification/finder")
|
11
|
+
require File.join(File.expand_path(File.dirname(__FILE__) + '/..'), "lib/hubeye/notification/finder")
|
12
12
|
require_relative "notification"
|
13
|
-
require Environment::LIBDIR + '/config/parser'
|
13
|
+
require Hubeye::Environment::LIBDIR + '/hubeye/config/parser'
|
14
14
|
require_relative "config_parser"
|
15
15
|
|
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.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-28 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'Keep your eye on new commits being pushed to Github through an
|
15
15
|
|
@@ -28,17 +28,21 @@ executables:
|
|
28
28
|
extensions: []
|
29
29
|
extra_rdoc_files: []
|
30
30
|
files:
|
31
|
-
- lib/config/parser.rb
|
32
|
-
- lib/
|
33
|
-
- lib/
|
34
|
-
- lib/
|
35
|
-
- lib/notification/
|
36
|
-
- lib/
|
37
|
-
- lib/
|
38
|
-
- lib/
|
39
|
-
- lib/
|
40
|
-
- lib/
|
41
|
-
- lib/
|
31
|
+
- lib/hubeye/config/parser.rb
|
32
|
+
- lib/hubeye/config/environment.rb
|
33
|
+
- lib/hubeye/client/connection.rb
|
34
|
+
- lib/hubeye/client/client.rb
|
35
|
+
- lib/hubeye/notification/growl.rb
|
36
|
+
- lib/hubeye/notification/gnomenotify.rb
|
37
|
+
- lib/hubeye/notification/finder.rb
|
38
|
+
- lib/hubeye/server/server.rb
|
39
|
+
- lib/hubeye/server/session.rb
|
40
|
+
- lib/hubeye/server/commit.rb
|
41
|
+
- lib/hubeye/hooks/executer.rb
|
42
|
+
- lib/hubeye/hooks/git_hooks.rb
|
43
|
+
- lib/hubeye/log/logger.rb
|
44
|
+
- lib/hubeye/shared/hubeye_protocol.rb
|
45
|
+
- lib/hubeye/helpers/time.rb
|
42
46
|
- bin/hubeye
|
43
47
|
- Rakefile
|
44
48
|
- README.md
|
@@ -46,6 +50,7 @@ files:
|
|
46
50
|
- LICENSE
|
47
51
|
- test/config_parser.rb
|
48
52
|
- test/runner.rb
|
53
|
+
- test/integration.rb
|
49
54
|
- test/environment.rb
|
50
55
|
- test/notification.rb
|
51
56
|
- images/change_icon.jpg
|
data/lib/client/hubeye_client.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'socket'
|
3
|
-
|
4
|
-
class HubeyeClient
|
5
|
-
|
6
|
-
class Connection
|
7
|
-
attr_reader :s, :local, :peer, :peeraddr
|
8
|
-
def initialize(host, port)
|
9
|
-
_begin do
|
10
|
-
# Give the user some feedback while connecting.
|
11
|
-
STDOUT.print "Connecting..."
|
12
|
-
STDOUT.flush
|
13
|
-
@s = TCPSocket.open(host, port)
|
14
|
-
STDOUT.puts "Done" if @s
|
15
|
-
|
16
|
-
# Now display information about the connection.
|
17
|
-
@local, @peer = @s.addr, @s.peeraddr
|
18
|
-
|
19
|
-
STDOUT.print "Connected to #{peer[2]}:#{peer[1]}"
|
20
|
-
STDOUT.puts " using local port #{local[1]}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def receive_welcome
|
25
|
-
# Wait just a bit, to see if the server sends any initial message.
|
26
|
-
begin
|
27
|
-
sleep 1
|
28
|
-
msg = @s.readpartial(4096)
|
29
|
-
STDOUT.puts msg.chop
|
30
|
-
rescue SystemCallError, NoMethodError
|
31
|
-
STDOUT.puts "The server's not running!"
|
32
|
-
rescue EOFError
|
33
|
-
@retried ||= -1
|
34
|
-
@retried += 1
|
35
|
-
retry unless @retried >= 1
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def _begin
|
42
|
-
begin
|
43
|
-
yield
|
44
|
-
rescue
|
45
|
-
puts $! if @debug
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def start(host, port, debug=false)
|
51
|
-
@debug = debug
|
52
|
-
conn = Connection.new(host, port)
|
53
|
-
conn.receive_welcome
|
54
|
-
interact(conn.s)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Now begin a loop of client/server interaction.
|
58
|
-
def interact(socket)
|
59
|
-
@s = socket
|
60
|
-
while @s
|
61
|
-
loop do
|
62
|
-
STDOUT.print '> '
|
63
|
-
STDOUT.flush
|
64
|
-
local = STDIN.gets
|
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
|
74
|
-
end
|
75
|
-
@s.flush
|
76
|
-
if local =~ /load repo/
|
77
|
-
puts "Loading..."
|
78
|
-
sleep 1
|
79
|
-
else
|
80
|
-
sleep 0.5
|
81
|
-
end
|
82
|
-
begin
|
83
|
-
response = @s.readpartial(4096)
|
84
|
-
rescue EOFError
|
85
|
-
response = "Bye!"
|
86
|
-
end
|
87
|
-
if response.chop.strip == "Bye!"
|
88
|
-
puts response.chop
|
89
|
-
@s.close
|
90
|
-
exit 0
|
91
|
-
elsif response.chop.strip.match(/shutting/i)
|
92
|
-
@s.close
|
93
|
-
exit 0
|
94
|
-
else
|
95
|
-
puts response.chop
|
96
|
-
next
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
|
data/lib/environment.rb
DELETED
data/lib/helpers/time.rb
DELETED
data/lib/log/logger.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Log
|
2
|
-
class Logger
|
3
|
-
|
4
|
-
LOG_DIR = File.join(ENV['HOME'], '.hubeye', 'log')
|
5
|
-
|
6
|
-
def self.log(msg)
|
7
|
-
File.open(LOG_DIR, "a") do |f|
|
8
|
-
f.puts(msg)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.relog(msg)
|
13
|
-
#wipe the file and start anew
|
14
|
-
File.open(LOG_DIR, "w") do |f|
|
15
|
-
f.puts(msg)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# If {include_terminal: true}, log to the terminal too (make sure that the
|
20
|
-
# process is not daemonized). Always log to the logfile.
|
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)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
data/lib/notification/finder.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
module Notification
|
2
|
-
include Environment
|
3
|
-
|
4
|
-
CHANGE_ICON = "change_icon.jpg"
|
5
|
-
CHANGE_ICON_PATH = (File.join(ROOTDIR, "images", CHANGE_ICON))
|
6
|
-
|
7
|
-
class Finder
|
8
|
-
def self.find_notify
|
9
|
-
if RUBY_PLATFORM =~ /mswin/
|
10
|
-
return
|
11
|
-
elsif RUBY_PLATFORM =~ /linux/
|
12
|
-
libnotify = system('locate libnotify-bin > /dev/null')
|
13
|
-
if libnotify
|
14
|
-
require_relative "gnomenotify"
|
15
|
-
return "libnotify"
|
16
|
-
elsif LibCheck.autotest_notification
|
17
|
-
require_relative "growl"
|
18
|
-
return "growl"
|
19
|
-
end
|
20
|
-
elsif RUBY_PLATFORM =~ /darwin/i and LibCheck.autotest_notification
|
21
|
-
require_relative "growl"
|
22
|
-
return "growl"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class LibCheck
|
28
|
-
class << self
|
29
|
-
def autotest
|
30
|
-
begin
|
31
|
-
require 'autotest'
|
32
|
-
rescue LoadError
|
33
|
-
if require 'rubygems'
|
34
|
-
retry
|
35
|
-
else
|
36
|
-
return
|
37
|
-
end
|
38
|
-
end
|
39
|
-
if defined? Autotest
|
40
|
-
true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def autotest_notification
|
45
|
-
begin
|
46
|
-
require 'autotest_notification'
|
47
|
-
rescue LoadError
|
48
|
-
if require 'rubygems'
|
49
|
-
retry
|
50
|
-
else
|
51
|
-
return
|
52
|
-
end
|
53
|
-
end
|
54
|
-
if defined? Autotest
|
55
|
-
true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
end # end module
|
62
|
-
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Notification
|
2
|
-
module GnomeNotify
|
3
|
-
|
4
|
-
EXPIRATION_IN_SECONDS = 2
|
5
|
-
|
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
|
-
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|