cerberus 0.3.1 → 0.3.2

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/CHANGES CHANGED
@@ -1,5 +1,9 @@
1
1
  = Cerberus Changelog
2
2
 
3
+ == Version 0.3.2
4
+ Added Perforce SCM support
5
+
6
+ * Added support of Perforce
3
7
 
4
8
  == Version 0.3.1
5
9
  Added BJam builder support
data/Rakefile CHANGED
@@ -65,9 +65,7 @@ GEM_SPEC = Gem::Specification.new do |s|
65
65
 
66
66
  s.require_path = 'lib'
67
67
 
68
- s.has_rdoc = true
69
- s.extra_rdoc_files = [ "README" ]
70
- s.rdoc_options = [ "--main", "README" ]
68
+ s.has_rdoc = false
71
69
 
72
70
  s.test_suite_file = "test/integration_test.rb"
73
71
 
@@ -4,5 +4,5 @@ module Cerberus
4
4
 
5
5
  LOCK_WAIT = 30 * 60 #30 minutes
6
6
 
7
- VERSION = '0.3.1'
7
+ VERSION = '0.3.2'
8
8
  end
@@ -71,6 +71,7 @@ module Cerberus
71
71
 
72
72
  scm_type = @config[:scm, :type]
73
73
  @scm = SCM.get(scm_type).new(@config[:application_root], @config)
74
+ say "Client for SCM '#{scm_type}' does not installed" unless @scm.installed?
74
75
 
75
76
  builder_type = get_configuration_option(@config[:builder], :type, :rake)
76
77
  @builder = Builder.get(builder_type).new(@config)
@@ -180,7 +181,7 @@ module Cerberus
180
181
  if projects.empty?
181
182
  puts "There are no any active projects"
182
183
  else
183
- puts "List of active applications:"
184
+ puts "List of active projects:"
184
185
 
185
186
  projects.each do |fn|
186
187
  fn =~ %r{#{HOME}/config/(.*).yml}
@@ -214,7 +215,8 @@ module Cerberus
214
215
  module SCM
215
216
  TYPES = {
216
217
  :svn => 'SVN', #Cerberus::SCM
217
- :darcs => 'Darcs'
218
+ :darcs => 'Darcs',
219
+ :perforce => 'Perforce'
218
220
  }
219
221
 
220
222
  def self.get(type)
@@ -257,4 +259,4 @@ module Cerberus
257
259
  const_get(class_name)
258
260
  end
259
261
  end
260
- end
262
+ end
@@ -1,4 +1,8 @@
1
+ require 'cerberus/utils'
2
+
1
3
  class Cerberus::SCM::CVS
4
+ include Cerberus::Utils
5
+
2
6
  def initialize(path, config = {})
3
7
  raise "Path can't be nil" unless path
4
8
 
@@ -6,6 +10,10 @@ class Cerberus::SCM::CVS
6
10
  @encoded_path = (@path.include?(' ') ? "\"#{@path}\"" : @path)
7
11
  end
8
12
 
13
+ def installed?
14
+ exec_successful? "#{@config[:bin_path]}cvs --version"
15
+ end
16
+
9
17
  def update!
10
18
  if test(?d, @path + '/CVS')
11
19
  @status = execute("update")
@@ -16,33 +24,27 @@ class Cerberus::SCM::CVS
16
24
  end
17
25
 
18
26
  def has_changes?
19
- @status =~ /[A-Z]\s+[\w\/]+/
27
+ @status =~ /^[U|P|C] (.*)/
20
28
  end
21
29
 
22
30
  def current_revision
23
- info['Revision'].to_i
31
+ raise NotImplementedError
24
32
  end
25
33
 
26
34
  def url
27
- info['URL']
35
+ raise NotImplementedError
28
36
  end
29
37
 
30
38
  def last_commit_message
31
- message = execute("log", "--limit 1 -v")
32
- #strip first line that contains command line itself (svn log --limit ...)
33
- if ((idx = message.index('-'*72)) != 0 )
34
- message[idx..-1]
35
- else
36
- message
37
- end
39
+ raise NotImplementedError
38
40
  end
39
41
 
40
42
  def last_author
41
- info['Last Changed Author']
43
+ raise NotImplementedError
42
44
  end
43
45
 
44
46
  private
45
47
  def execute(command, parameters = nil, pre_parameters = nil)
46
48
  `#{@config[:bin_path]}cvs #{command} #{pre_parameters} #{@encoded_path} #{parameters}`
47
49
  end
48
- end
50
+ end
@@ -1,4 +1,8 @@
1
+ require 'cerberus/utils'
2
+
1
3
  class Cerberus::SCM::Darcs
4
+ include Cerberus::Utils
5
+
2
6
  def initialize(path, config = {})
3
7
  raise "Path can't be nil" unless path
4
8
 
@@ -6,6 +10,10 @@ class Cerberus::SCM::Darcs
6
10
  @encoded_path = (@path.include?(' ') ? "\"#{@path}\"" : @path)
7
11
  end
8
12
 
13
+ def installed?
14
+ exec_successful? "#{@config[:bin_path]}darcs --version"
15
+ end
16
+
9
17
  def update!
10
18
  if test(?d, @path + '/_darcs')
11
19
  @status = execute('pull', '-v -a')
@@ -46,6 +54,7 @@ class Cerberus::SCM::Darcs
46
54
  def output
47
55
  @status
48
56
  end
57
+
49
58
  private
50
59
  def execute(command, parameters = nil, with_path = true)
51
60
  cmd = "#{@config[:bin_path]}darcs #{command} #{parameters} --repodir=#{@encoded_path}"
@@ -60,4 +69,4 @@ class Cerberus::SCM::Darcs
60
69
  @date = xml.elements["changelog/patch/@date"].value
61
70
  @message = xml.elements["changelog/patch/name"].get_text.value
62
71
  end
63
- end
72
+ end
@@ -0,0 +1,83 @@
1
+ require 'cerberus/utils'
2
+
3
+ class Cerberus::SCM::Perforce
4
+ include Cerberus::Utils
5
+ CHANGES_LOG_REGEXP = /^Change (\d+) on (.*) by (.*)\n\n(.*)/m
6
+
7
+ def initialize(path, config = {})
8
+ @config = config
9
+ @path = path.strip
10
+
11
+ @p4_view = @config[:scm, :view]
12
+ @client_name = Socket.gethostname + ":" + @path.gsub(' ', ':')
13
+ end
14
+
15
+ def installed?
16
+ exec_successful? "#{@config[:bin_path]}p4 info"
17
+ end
18
+
19
+ def update!
20
+ FileUtils.mkpath(@path) unless test(?d,@path)
21
+ create_client
22
+
23
+ @status = execute("sync")
24
+ end
25
+
26
+ def has_changes?
27
+ !@status.include?('file(s) up-to-date.')
28
+ end
29
+
30
+ def url
31
+ @view
32
+ end
33
+
34
+ attr_reader :current_revision
35
+ attr_reader :last_author
36
+ attr_reader :last_commit_message
37
+
38
+ private
39
+ def last_revision
40
+ unless @calculated
41
+ msg = execute("changes -m 1 -l")
42
+ msg =~ CHANGES_LOG_REGEXP
43
+
44
+ @current_revision = $1
45
+ #date = $2
46
+ @last_author = $3
47
+ @last_commit_message = $4.strip
48
+
49
+ @calculated = true
50
+ end
51
+ end
52
+
53
+ def execute(command)
54
+ `#{@config[:bin_path]}p4 #{p4_opts()} #{command} #{@p4_view} 2>&1`
55
+ end
56
+
57
+ def p4_opts
58
+ user_opt = @config[:scm, :user_name].to_s.empty? ? "" : "-u #{@config[:scm, :user_name]}"
59
+ password_opt = @config[:scm, :password].to_s.empty? ? "" : "-P #{@config[:scm, :password]}"
60
+ client_opt = "-c #{@client_name}"
61
+ "#{user_opt} #{password_opt} #{client_opt}"
62
+ end
63
+
64
+ def create_client
65
+ IO.popen("p4 #{p4_opts} client -i", "w+") do |io|
66
+ io.puts(client_spec)
67
+ io.close_write
68
+ end
69
+ end
70
+
71
+ def client_spec
72
+ <<-EOF
73
+ Client: #{@client_name}
74
+ Owner: #{@config[:scm, :user_name]}
75
+ Host: #{Socket.gethostname}
76
+ Description: Cerberus client
77
+ Root: #{@path}
78
+ Options: noallwrite noclobber nocompress unlocked nomodtime normdir
79
+ LineEnd: local
80
+ View: #{@p4_view} //#{@client_name}/...
81
+ EOF
82
+ end
83
+ end
@@ -10,6 +10,10 @@ class Cerberus::SCM::SVN
10
10
  @encoded_path = (@path.include?(' ') ? "\"#{@path}\"" : @path)
11
11
  end
12
12
 
13
+ def installed?
14
+ exec_successful? "#{@config[:bin_path]}svn --version"
15
+ end
16
+
13
17
  def update!
14
18
  if test(?d, @path + '/.svn') #check first that it was not locked
15
19
  execute("cleanup") if locked?
@@ -60,7 +64,7 @@ class Cerberus::SCM::SVN
60
64
  output = execute("info")
61
65
  @info = YAML.load(output)
62
66
 
63
- if not @info.is_a?(Hash) or @info['Repository Root'].nil? #.size > 8
67
+ if not @info.is_a?(Hash) or @info['Repository UUID'].nil? #.size > 8
64
68
  say "Could not parse svn output. Seems source directory #{@encoded_path} is corrupted.\n#{output}"
65
69
  end
66
70
  end
@@ -78,4 +82,4 @@ class Cerberus::SCM::SVN
78
82
 
79
83
  auth.join(' ')
80
84
  end
81
- end
85
+ end
@@ -35,6 +35,15 @@ module Cerberus
35
35
  ensure
36
36
  stream.reopen(old_stream)
37
37
  end
38
+
39
+ def exec_successful?(cmd)
40
+ begin
41
+ `#{cmd}`
42
+ return true
43
+ rescue
44
+ return false
45
+ end
46
+ end
38
47
  end
39
48
  end
40
49
 
@@ -129,4 +138,4 @@ class IO
129
138
  def self.write(filename, str)
130
139
  File.open(filename, 'w'){|f| f.write str}
131
140
  end
132
- end
141
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ require 'cerberus/cli'
4
+ require 'cerberus/scm/perforce'
5
+
6
+ class PerforceSCMTest < Test::Unit::TestCase
7
+ def test_log_parser
8
+ MSG =~ Cerberus::SCM::Perforce::CHANGES_LOG_REGEXP
9
+
10
+ assert_equal '264179', $1
11
+ assert_equal '2006/11/29', $2
12
+ assert_equal 'someuser@someuser_SOMEUSER', $3
13
+ assert_equal "dbcis-2356\njust test", $4.strip
14
+ end
15
+
16
+ MSG =<<END
17
+ Change 264179 on 2006/11/29 by someuser@someuser_SOMEUSER
18
+
19
+ dbcis-2356
20
+ just test
21
+ END
22
+ end
@@ -1,4 +1,4 @@
1
- $:.unshift File.dirname(__FILE__) + '/../lib'
1
+ $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
2
 
3
3
  require 'test/unit'
4
4
  require 'fileutils'
@@ -90,4 +90,4 @@ end"
90
90
  end
91
91
  end
92
92
 
93
- require 'cerberus/config'
93
+ require 'cerberus/config'
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0.4
3
3
  specification_version: 1
4
4
  name: cerberus
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.1
7
- date: 2006-11-24 00:00:00 +03:00
6
+ version: 0.3.2
7
+ date: 2006-12-04 00:00:00 +03:00
8
8
  summary: Cerberus is a Continuous Integration tool that could be easily run from Cron.
9
9
  require_paths:
10
10
  - lib
@@ -15,7 +15,7 @@ description: Cerberus is a Continuous Integration software for Ruby projects. CI
15
15
  autorequire:
16
16
  default_executable: cerberus
17
17
  bindir: bin
18
- has_rdoc: true
18
+ has_rdoc: false
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  - - ">="
@@ -59,6 +59,7 @@ files:
59
59
  - lib/cerberus/publisher/rss.rb
60
60
  - lib/cerberus/scm/cvs.rb
61
61
  - lib/cerberus/scm/darcs.rb
62
+ - lib/cerberus/scm/perforce.rb
62
63
  - lib/cerberus/scm/svn.rb
63
64
  - test/bjam_builder_test.rb
64
65
  - test/config_test.rb
@@ -70,6 +71,7 @@ files:
70
71
  - test/mail_publisher_test.rb
71
72
  - test/maven2_builer_test.rb
72
73
  - test/mock
74
+ - test/perforce_scm_test.rb
73
75
  - test/rss_publisher_test.rb
74
76
  - test/test_helper.rb
75
77
  - test/data/darcs.zip
@@ -85,11 +87,10 @@ files:
85
87
  - doc/site
86
88
  test_files:
87
89
  - test/integration_test.rb
88
- rdoc_options:
89
- - --main
90
- - README
91
- extra_rdoc_files:
92
- - README
90
+ rdoc_options: []
91
+
92
+ extra_rdoc_files: []
93
+
93
94
  executables:
94
95
  - cerberus
95
96
  extensions: []