git-notifier 0.1

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.
Files changed (2) hide show
  1. data/bin/git-notifier +150 -0
  2. metadata +55 -0
data/bin/git-notifier ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env ruby
2
+ # TODO
3
+ # 1) Error handling with notifications
4
+ # 4) check dependencies at startup
5
+ # 5) complete help() above
6
+
7
+ require 'rubygems'
8
+ require 'daemons'
9
+ require 'ruby-growl'
10
+ require 'digest/sha1'
11
+
12
+ def usage
13
+ usage = <<END
14
+
15
+ Usage:
16
+ ------
17
+
18
+ git-notifier start|stop|add|clear|status
19
+
20
+
21
+ Examples:
22
+ ---------
23
+
24
+ Start the notifier:
25
+ git-notifier start
26
+
27
+ Stop the notifier:
28
+ git-notifier stop
29
+
30
+ Add a repository to the watch list:
31
+ git-notifier add <repo_uri> <branch>
32
+ Example: git-notifier add git@github.com:marcocampana/git-notifier.git master
33
+
34
+ Remove all watched repositories from the watch list
35
+ git-notifier clear
36
+
37
+ Show all the watched repositories
38
+ git-notifier status
39
+ END
40
+ end
41
+
42
+ def add_repo
43
+ (puts usage and return) if ARGV.size < 2
44
+ repo_uri = ARGV[1]
45
+ branch = ARGV[2] || 'master'
46
+ repo_name = repo_uri.split("/").last
47
+ repo_local_path = "/var/tmp/git-notifier_#{Digest::SHA1.hexdigest(repo_uri)}_#{repo_name}_#{branch}"
48
+ # TODO Truncate the SHA1 in the filename
49
+
50
+ if !File.exists?( repo_local_path )
51
+ puts "git-notifier: adding #{repo_uri} to watch list... (this might take a while)"
52
+ output = `mkdir #{repo_local_path}; cd #{repo_local_path}; git clone #{repo_uri} . 2>/dev/null`
53
+ # TODO Add error handling in case the repo does not exist
54
+ end
55
+ puts "git-notifier: repo '#{repo_uri}' added to watch list"
56
+ end
57
+
58
+ def start
59
+ demonize
60
+ end
61
+
62
+ def stop
63
+ demonize
64
+ puts "git-notifier is now stopped"
65
+ end
66
+
67
+ def status
68
+ watched_repos = []
69
+ available_repos.each do |repo_dirname|
70
+ prefix, repo_sha1, repo_name, repo_branch = repo_dirname.split('_')
71
+ watched_repos << [repo_name, repo_branch]
72
+ end
73
+ if watched_repos.any?
74
+ # TODO Show if the notifier is running or not
75
+ puts "git-notifier: the following repositories are in the watch list"
76
+ watched_repos.each do |repo|
77
+ puts " - #{repo[0]} (#{repo[1]})"
78
+ end
79
+ else
80
+ puts "git-notifier: no repositories are being watched at the moment\nUse: 'git-notifier add <repo_uri>' to add repos to watch"
81
+ end
82
+ end
83
+
84
+ def available_repos
85
+ repos = []
86
+ Dir.new('/var/tmp').each do |repo_dir|
87
+ repos << repo_dir if repo_dir =~ /^git-notifier_/
88
+ end
89
+ repos
90
+ end
91
+
92
+ def clear_all
93
+ repos = available_repos
94
+ repos.each do |repo|
95
+ puts "/var/tmp/#{repo} deleted"
96
+ `cd /var/tmp; rm -Rf #{repo}` if repo =~ /^git-notifier/
97
+ end
98
+ puts "git-notifier: no repositories are being watched at the moment\nUse: 'git-notifier add <repo_uri>' to add repos to watch" if repos.empty?
99
+ end
100
+
101
+ def demonize
102
+ Daemons.run_proc('git-notifier', :dir_mode => :normal, :dir => '/var/tmp/', :monitor => false) do
103
+ g = Growl.new "localhost", "ruby-growl", ["git-notifier"]
104
+ # g.notify "git-notifier", "GIT Notifier", "Start watching\nrepo: #{ARGV[0]}\nbranch: #{@@branch}"
105
+ g.notify "git-notifier", "GIT Notifier", "Start notifier"
106
+
107
+ loop do
108
+ # TODO store available_repoes in a variable if adding while running doesn't work
109
+ available_repos.each do |repo_dirname|
110
+ prefix, repo_sha1, repo_name, repo_branch = repo_dirname.split('_')
111
+
112
+ git_pull_output = `cd /var/tmp/#{repo_dirname}; git checkout -b #{repo_branch} >/dev/null 2>&1; git pull origin #{repo_branch} 2>/dev/null`
113
+
114
+ if git_pull_output =~ /Updating (.+)\.\.(.+)/
115
+ from_commit = $1
116
+ to_commit = $2
117
+
118
+ git_log_output = `cd /var/tmp/#{repo_dirname}; git log -1 $1`
119
+
120
+ notification_lines = git_log_output.split( "\n" )
121
+ sha1 = notification_lines[0]
122
+ author = notification_lines[1]
123
+ date = notification_lines[2]
124
+ body = notification_lines[3 .. notification_lines.size - 1].to_s.gsub( /\t/, '')
125
+ # TODO truncate commit sha1 and author name stripping off email
126
+
127
+ g.notify "git-notifier", sha1 + date, author + "\n" + body
128
+ end
129
+ # TODO increase sleep time
130
+ sleep( 60 )
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ case ARGV[0]
137
+ when 'start'
138
+ start
139
+ when 'add'
140
+ add_repo
141
+ when 'stop'
142
+ stop
143
+ when 'clear'
144
+ clear_all
145
+ when 'status'
146
+ status
147
+ else
148
+ puts usage
149
+ end
150
+
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-notifier
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.1"
5
+ platform: ruby
6
+ authors:
7
+ - Marco Campana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-13 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: " git-notifier is a gem that allows you to watch one or more git repositories and receive a growl notification when a change is committed"
17
+ email: m.campana@gmail.com
18
+ executables:
19
+ - git-notifier
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files: []
25
+
26
+ has_rdoc: true
27
+ homepage: http://github.com/marcocampana/git-notifier
28
+ licenses: []
29
+
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project: git-notifier
50
+ rubygems_version: 1.3.3
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: git-notifier is a gem that allows you to watch one or more git repositories and receive a growl notification when a change is committed
54
+ test_files: []
55
+