svn_hooks 0.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.
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
+