svn_hooks 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,3 @@
1
+ README
2
+ ========================================================================
3
+ svn_hooks
data/bin/svn_rubyhooks ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'erb'
4
+ require 'ftools'
5
+
6
+ HOOK_TYPES = %w{post-commit post-lock post-revprop-change post-unlock pre-commit pre-lock pre-revprop-change pre-unlock start-commit}
7
+ HOOK_TEMPLATE = <<-END_TEMPLATE
8
+ #!#{`which ruby`.chomp}
9
+
10
+ Dir.chdir(File.dirname(__FILE__))
11
+ SVN_EVENT = File.basename(__FILE__)
12
+
13
+ require 'rubygems'
14
+ require 'svn_hooks'
15
+ END_TEMPLATE
16
+
17
+ base_path = ARGV[0] || '.'
18
+
19
+ if(File.directory? File.join(base_path, 'hooks'))
20
+ # create hook files using HOOK_TEMPLATE
21
+ path = File.join(base_path, 'hooks')
22
+ HOOK_TYPES.each do |type|
23
+ filename = File.join(path, type)
24
+
25
+ # move old files out of the way
26
+ File.rename(filename, filename+'.old') if File.exists?(filename)
27
+ open(filename, 'w'){|f| f.write(HOOK_TEMPLATE)}
28
+ File.chmod(0755, filename)
29
+ end
30
+
31
+ # create path for hook scripts
32
+ File.makedirs File.join(path, 'scripts')
33
+ else
34
+ puts 'Usage: ruby install.rb /path/to/svn/repostiory'
35
+ end
data/lib/svn_dsl.rb ADDED
@@ -0,0 +1,33 @@
1
+ module SVN
2
+ module DSL
3
+
4
+ def for_path (*searches, &proc)
5
+ # searches = [search] if !search.kind_of?(Array)
6
+ searches = searches.map{|search| Regexp.glob(search)}
7
+ file_paths = EVENT_STATS.files.map{|f| f.path}
8
+
9
+ searches.each do |search|
10
+ if(file_paths.grep(search).length > 0)
11
+ return yield(EVENT_STATS) if block_given?
12
+ end
13
+ end
14
+ end
15
+
16
+ alias for_paths for_path
17
+
18
+ def for_action(*searches, &proc)
19
+ if(searches.include? SVN_EVENT)
20
+ yield(EVENT_STATS) if block_given?
21
+ end
22
+ end
23
+
24
+ alias for_actions for_action
25
+
26
+ end
27
+ end
28
+
29
+ class Regexp
30
+ def self.glob(search)
31
+ Regexp.new('^' + Regexp.escape(search).gsub('\\*', '.*') + '$', true)
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ module SVN
2
+ FLAGS = {
3
+ 'A' => :added,
4
+ 'C' => :conflict,
5
+ 'D' => :deleted,
6
+ 'M' => :modified,
7
+ 'U' => :updated,
8
+ 'R' => :replaced,
9
+ 'G' => :merged
10
+ }
11
+
12
+ class FileStat
13
+
14
+ attr_reader :path, :file_flag, :meta_flag, :lock_flag, :history_flag
15
+
16
+ def self.parse line
17
+ @file_flag = SVN::FLAGS[line[0,1]]
18
+ @meta_flag = SVN::FLAGS[line[1,1]]
19
+ @lock_flag = SVN::FLAGS[line[2,1]] == 'L'
20
+ @history_flag = SVN::FLAGS[line[3,1]] == '+'
21
+ @path = line[5,-1]
22
+ end
23
+
24
+ def to_s
25
+ @path
26
+ end
27
+
28
+ def modified?
29
+ [:merged, :updated, :modified, :replaced].find{|a| a == @file_flag}
30
+ end
31
+ end
32
+ end
data/lib/svn_hooks.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'svn_stat'
2
+ require 'svn_dsl'
3
+
4
+ REPOSITORY_PATH, REVISION_NUMBER = ARGV
5
+ EVENT_STATS = SVN::Stat.new(REPOSITORY_PATH, REVISION_NUMBER)
6
+
7
+ include SVN::DSL
8
+
9
+ Dir['./scripts/*.rb'].each do |file|
10
+ load(file, true)
11
+ end
data/lib/svn_stat.rb ADDED
@@ -0,0 +1,46 @@
1
+ require 'svn_file_stat'
2
+
3
+ module SVN
4
+ class Stat
5
+ attr_reader :repository_path, :revision_number, :event
6
+
7
+ def initialize repository_path, revision_number = nil
8
+ @revision = revision_number
9
+ @repository_path = repository_path
10
+ @event = SVN_EVENT
11
+
12
+ @svnlook_path = `which svnlook`.chomp
13
+ end
14
+
15
+ def author
16
+ @author ||= svnlook "author"
17
+ end
18
+
19
+ def message
20
+ @message ||= svnlook "cat"
21
+ end
22
+
23
+ def date
24
+ @date ||= Date.parse(svnlook("date"))
25
+ end
26
+
27
+ def files
28
+ unless @files
29
+ @files = []
30
+ svnlook('changed').each_line{|l| @files << SVN::FileStat.parse(l)}
31
+ end
32
+
33
+ @files
34
+ end
35
+
36
+ private
37
+
38
+ def revision_string
39
+ @revision_number ? "--revision #{@revision_number}" : ''
40
+ end
41
+
42
+ def svnlook query
43
+ `#{@svnlook_path} #{query} #{@repository_path} #{revision_string}`.chomp
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class SvnHookTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def teardown
9
+ end
10
+
11
+ # replace this with tests of your own.
12
+ def test_truth
13
+ assert true
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ require "test/unit"
2
+
3
+ # place common methods, assertions, and other type things in this file so
4
+ # other tests will have access to them.
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: svn_hooks
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2007-11-25 00:00:00 -08:00
8
+ summary: svn_hooks
9
+ require_paths:
10
+ - lib
11
+ - lib
12
+ - lib
13
+ email: grijalva@gmail.com
14
+ homepage: http://rubyforge.org/projects/svn-hooks/
15
+ rubyforge_project:
16
+ description: A domain specific language for implementing svn repository hooks in Ruby.
17
+ autorequire:
18
+ - svn_stat
19
+ - svn_hooks
20
+ - svn_file_stat
21
+ - svn_dsl
22
+ default_executable:
23
+ bindir: bin
24
+ has_rdoc: false
25
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
26
+ requirements:
27
+ - - ">"
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.0
30
+ version:
31
+ platform: ruby
32
+ signing_key:
33
+ cert_chain:
34
+ post_install_message:
35
+ authors:
36
+ - Dave Grijalva
37
+ files:
38
+ - lib/svn_dsl.rb
39
+ - lib/svn_file_stat.rb
40
+ - lib/svn_hooks.rb
41
+ - lib/svn_stat.rb
42
+ - README
43
+ test_files:
44
+ - test/svn_hooks_test.rb
45
+ - test/test_helper.rb
46
+ rdoc_options: []
47
+
48
+ extra_rdoc_files: []
49
+
50
+ executables:
51
+ - svn_rubyhooks
52
+ extensions: []
53
+
54
+ requirements: []
55
+
56
+ dependencies: []
57
+