svn_project 0.6.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/Manifest ADDED
@@ -0,0 +1,12 @@
1
+ Manifest
2
+ README
3
+ Rakefile
4
+ lib/svn/project.rb
5
+ lib/svn/rake/svntask.rb
6
+ lib/svn/release_tag.rb
7
+ lib/svn.rb
8
+ spec/svn_integration_spec.rb
9
+ spec/svn_project_spec.rb
10
+ spec/svn_release_tag_spec.rb
11
+ spec/svn_spec.rb
12
+ tasks/svn_project.rake
data/README ADDED
@@ -0,0 +1,79 @@
1
+ = SVN::Project
2
+
3
+ Class encapsulating methods for various svn:tags Rake tasks.
4
+
5
+ To use these methods, add the below directives to your rakefile. This library assumes
6
+ that you are working with a project that has already been checked into svn.
7
+
8
+
9
+ require 'svn/rake/svntask'
10
+ Rake::SVN::ProjectTasks.new() do |s|
11
+ s.method = "http"
12
+ s.username = "jeff"
13
+ s.project_url = "/one/two/three/go"
14
+ s.svn_cmd = "/path/to/svn" # optional
15
+ s.always_update_current = true # optional (maintains a tag 'current' pointing to your most numerically recent tag)
16
+ s.current_name = "some_name" # options (uses 'some_name' as the name of your 'current' tag)
17
+ end
18
+
19
+
20
+ You can now use the following tasks in your svn project:
21
+
22
+
23
+ - svn:project:current_version #=> Display most current version of the project
24
+ - svn:project:tags_url #=> Display URL for the project's TAGS dir
25
+ - svn:project:trunk_url #=> Display URL for the project's TRUNK dir
26
+ - svn:project:url #=> Displays URL for project
27
+ - svn:tags:create_fix #=> Create tag for a fix release
28
+ - svn:tags:create_major #=> Create tag for a major release
29
+ - svn:tags:create_minor #=> Create tag for a minor release
30
+ - svn:tags:current #=> Current release tag
31
+ - svn:tags:list #=> Display all release tags in the tags dir
32
+ - svn:tags:list_all #=> Display all tags in the tags dir
33
+ - svn:tags:list_releases #=> Display all release tags in the tags dir
34
+ - svn:tags:ls #=> Display all release tags in the tags dir
35
+ - svn:tags:next_fix #=> Display next fix release tag
36
+ - svn:tags:next_major #=> Display next major release tag
37
+ - svn:tags:next_minor #=> Display next minor release tag
38
+
39
+
40
+
41
+ == Example Usage
42
+ To get the current release tag:
43
+
44
+ rake svn:tags:current #=> rel-0.0.1
45
+
46
+ To get the current version
47
+
48
+ rake svn:project:current_version #=> 0.0.1
49
+
50
+ To create a new minor release:
51
+
52
+ rake svn:tags:create_minor
53
+ #=> Created rel-0.1.0 tag
54
+
55
+ To see all the tags:
56
+
57
+ rake svn:tags:ls
58
+ #=> rel-0.0.1
59
+ rel-0.1.0
60
+ rel-1.0.0
61
+
62
+
63
+ == Version Numbering
64
+
65
+ Versions are of the form major.minor.fix
66
+
67
+ * a fix version does not add functionality, but corrrects some defect
68
+ * a minor version adds a small amount of functionality
69
+ * a major version adds a relatively large amount of functionallity
70
+
71
+ The difference between major and minor is subjective and will usually be
72
+ determined by the customer.
73
+
74
+ When minor or major are incremented, all numbers to the right are set to "0"
75
+
76
+ The version after 1.0.9 is 1.0.10
77
+
78
+ The task svn:tags:ls sorts release tags correctly.
79
+
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('svn_project', '0.6.1') do |p|
6
+ p.description = "Adds rake tasks for viewing/creating svn tags"
7
+ p.url = "http://http://svnproj.rubyforge.org"
8
+ p.author = "Steven Hansen"
9
+ p.email = "runner@berkeley.edu"
10
+ p.ignore_pattern = ["svn_user.yml", "svn_project.rake"]
11
+ p.project = "svnproj"
12
+ end
13
+
14
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
@@ -0,0 +1,210 @@
1
+
2
+
3
+ module SVN
4
+ class Project
5
+
6
+ class MissingConnectionParamException < Exception; end
7
+ class MissingSVNClientException < Exception; end
8
+
9
+ REQUIRED_CONNECTION_PARAMS = [:project_url, :username, :method]
10
+ VERSION_FILE_NAME = "version.yml"
11
+
12
+ attr_accessor :project_url, :method, :username, :svn_cmd
13
+ attr_writer :always_update_current, :current_name
14
+
15
+
16
+ def initialize()
17
+ if block_given?
18
+ yield(self)
19
+ self.validate_connection_params!
20
+ else
21
+ self.try_auto_configure!
22
+ end
23
+
24
+ raise_if_svn_cmd_not_available!
25
+ end
26
+
27
+ def always_update_current?
28
+ @always_update_current ||= false
29
+ end
30
+
31
+ def current_name
32
+ @current_name ||= "current"
33
+ end
34
+
35
+ def svn_cmd
36
+ @svn_cmd ||= SVN.svn_cmd
37
+ end
38
+
39
+ def trunk_url
40
+ @trunk_url ||= "#{project_url}/trunk"
41
+ end
42
+
43
+ def tags_url
44
+ @tags_url ||= "#{project_url}/tags"
45
+ end
46
+
47
+ # displays a list of 'release' tags in the tags_url directory
48
+ def list_release_tags
49
+ release_tags
50
+ end
51
+ alias :list_tags :list_release_tags
52
+ alias :ls :list_release_tags
53
+
54
+ # returns an array of ReleaseTag objects from the tags_url directory
55
+ def release_tags
56
+ tags = retrieve_tags.select { |tag| SVN::ReleaseTag.release_tag?(tag) }
57
+ tags = tags.map { |tag| SVN::ReleaseTag.new(tag) }.sort
58
+ tags = [SVN::ReleaseTag.new("rel-0.0.0")] if tags.empty?
59
+ tags
60
+ end
61
+
62
+ # displays a list of 'all' the tags in the tags_url directory
63
+ def list_all_tags
64
+ retrieve_tags
65
+ end
66
+
67
+ # Display the current version of the project
68
+ def current_version
69
+ current_tag.name.delete("rel-")
70
+ end
71
+
72
+ # Display the current tag
73
+ def current_tag
74
+ release_tags.last
75
+ end
76
+
77
+ # Display the next major release tag
78
+ #
79
+ # rake svn:current_tag #=> rel-1.1.1
80
+ # rake svn:next_major_tag # => rel-2.0.0
81
+ def next_major_tag
82
+ current_tag.next_major
83
+ end
84
+
85
+ # Display the next minor release tag
86
+ #
87
+ # rake svn:current_tag #=> rel-1.1.1
88
+ # rake svn:next_minor_tag # => rel-1.2.0
89
+ def next_minor_tag
90
+ current_tag.next_minor
91
+ end
92
+
93
+ # Display the next fix release tag
94
+ #
95
+ # rake svn:current_tag #=> rel-1.1.1
96
+ # rake svn:next_fix_tag # => rel-1.1.2
97
+ def next_fix_tag
98
+ current_tag.next_fix
99
+ end
100
+
101
+ # Create the next major release tag
102
+ #
103
+ # rake svn:current_tag #=> rel-1.1.1
104
+ # rake svn:next_major_tag # => rel-2.0.0
105
+ # rake svn:create_major_tag
106
+ # rake svn:current_tag #=> rel-2.0.0
107
+ def create_major_tag
108
+ create_tag(current_tag.next_major)
109
+ end
110
+
111
+ # Create the next minor release tag
112
+ #
113
+ # rake svn:current_tag #=> rel-1.1.1
114
+ # rake svn:next_minor_tag # => rel-1.2.0
115
+ # rake svn:create_minor_tag
116
+ # rake svn:current_tag #=> rel-1.2.0
117
+ def create_minor_tag
118
+ create_tag(current_tag.next_minor)
119
+ end
120
+
121
+ # Create the next fix release tag
122
+ #
123
+ # rake svn:current_tag #=> rel-1.1.1
124
+ # rake svn:next_fix_tag # => rel-1.1.2
125
+ # rake svn:create_fix_tag
126
+ # rake svn:current_tag #=> rel-1.1.2
127
+ def create_fix_tag
128
+ create_tag(current_tag.next_fix)
129
+ end
130
+
131
+ def validate_connection_params!
132
+ REQUIRED_CONNECTION_PARAMS.each do |param|
133
+ raise MissingConnectionParamException, "Missing required config parameter: #{param}" if self.send(param).nil?
134
+ end
135
+ end
136
+
137
+ def try_auto_configure!
138
+ url = `#{SVN.svn_cmd} info`.split("\n")[1].split(" ")[1]
139
+ # extremely inefficient regular expression!
140
+ /(\S+):\/\/(\S+)@(\S+)\/trunk\S*/ =~ url
141
+
142
+ self.method = $1
143
+ self.username = $2
144
+ self.project_url = $3
145
+ self.validate_connection_params!
146
+ end
147
+
148
+ def svn_cmd_available?
149
+ if SVN.win32?
150
+ system("#{svn_cmd} --version") ? true : false
151
+ else
152
+ system("#{svn_cmd} --version > /dev/null 2>&1") ? true : false
153
+ end
154
+ end
155
+
156
+ def raise_if_svn_cmd_not_available!
157
+ raise MissingSVNClientException, "#{self.svn_cmd} command not found" unless self.svn_cmd_available?
158
+ end
159
+
160
+ private unless $TESTING
161
+ def write_version_file(tag_name)
162
+ File.open(VERSION_FILE_NAME, "w") { |f| f.puts "version: '#{tag_name}'" }
163
+ end
164
+
165
+ def init_version_file
166
+ unless File.exists?(VERSION_FILE_NAME)
167
+ FileUtils.touch(VERSION_FILE_NAME)
168
+ cmd = "#{svn_cmd} add #{VERSION_FILE_NAME}"
169
+ `#{cmd}`
170
+ end
171
+ end
172
+
173
+ def write_version_file_and_commit(tag_name)
174
+ init_version_file
175
+ write_version_file(tag_name)
176
+ cmd = "#{svn_cmd} ci -m 'updated #{VERSION_FILE_NAME} to #{tag_name}'"
177
+ `#{cmd}`
178
+ end
179
+
180
+ def update_current_tag(tag_name)
181
+ destroy_tag(current_name) if list_all_tags.include?(current_name)
182
+ cmd = "#{svn_cmd} -m 'updated #{tag_name} to current tag' cp #{connection_str(tags_url)}/#{tag_name} #{connection_str(tags_url)}/#{current_name}"
183
+ `#{cmd}`
184
+ end
185
+
186
+ def retrieve_tags
187
+ `#{svn_cmd} ls #{connection_str(tags_url)}`.split("\n").map do |tag|
188
+ tag.chomp('/')
189
+ end
190
+ end
191
+
192
+ def connection_str(url)
193
+ "#{method}://#{username}@#{url}"
194
+ end
195
+
196
+ def create_tag(tag_name)
197
+ write_version_file_and_commit(tag_name)
198
+ cmd = "#{svn_cmd} -m 'tagged #{tag_name} for testing' cp #{connection_str(trunk_url)} #{connection_str(tags_url)}/#{tag_name}"
199
+ `#{cmd}`
200
+ update_current_tag(current_tag.to_s) if always_update_current?
201
+ end
202
+
203
+ def destroy_tag(tag_name)
204
+ cmd = "#{svn_cmd} -m 'removed tag #{tag_name} for testing' rm #{connection_str(tags_url)}/#{tag_name}"
205
+ `#{cmd}`
206
+ end
207
+
208
+ end
209
+ end
210
+
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rake'
4
+ require 'rake/tasklib'
5
+ require 'svn'
6
+
7
+
8
+ module Rake
9
+ module SVN
10
+
11
+ class ProjectTask < TaskLib
12
+ # Name of the main, top level task. (default is :svn)
13
+ attr_accessor :name
14
+
15
+ attr_accessor :svn
16
+
17
+ # Create an SVN task named <em>svn</em>. Default task name is +svn+.
18
+ def initialize(name=:svn) # :yield: self
19
+ @name = name
20
+ if block_given?
21
+ @svn = ::SVN::Project.new { |s| yield(s) }
22
+ else
23
+ @svn = ::SVN::Project.new
24
+ end
25
+
26
+ define()
27
+ end
28
+
29
+ def svn_project
30
+ @svn
31
+ end
32
+
33
+ # Create the tasks defined by this task lib.
34
+ def define
35
+ namespace :svn do
36
+ namespace :project do
37
+
38
+ desc "Displays URL for project"
39
+ task :url do
40
+ puts svn.project_url
41
+ end
42
+
43
+ desc "Display URL for the project's TRUNK dir"
44
+ task :trunk_url do
45
+ puts svn.trunk_url
46
+ end
47
+
48
+ desc "Display URL for the project's TAGS dir"
49
+ task :tags_url do
50
+ puts svn.tags_url
51
+ end
52
+
53
+ desc "Display most current version of the project"
54
+ task :current_version do
55
+ puts svn.current_version
56
+ end
57
+ end
58
+
59
+ namespace :tags do
60
+ desc "Create tag for a fix release"
61
+ task :create_fix do
62
+ svn.create_fix_tag
63
+ puts "Created #{svn.current_tag.name} tag"
64
+ end
65
+
66
+ desc "Create tag for a minor release"
67
+ task :create_minor do
68
+ svn.create_minor_tag
69
+ puts "Created #{svn.current_tag.name} tag"
70
+ end
71
+
72
+ desc "Create tag for a major release"
73
+ task :create_major do
74
+ svn.create_major_tag
75
+ puts "Created #{svn.current_tag.name} tag"
76
+ end
77
+
78
+ desc "Current release tag"
79
+ task :current do
80
+ puts svn.current_tag
81
+ end
82
+
83
+ desc "Display next major release tag"
84
+ task :next_major do
85
+ puts svn.next_major_tag
86
+ end
87
+
88
+ desc "Display next minor release tag"
89
+ task :next_minor do
90
+ puts svn.next_minor_tag
91
+ end
92
+
93
+ desc "Display next fix release tag"
94
+ task :next_fix do
95
+ puts svn.next_fix_tag
96
+ end
97
+
98
+ desc "Display all tags in the tags dir"
99
+ task :list_all do
100
+ puts svn.list_all_tags
101
+ end
102
+
103
+ desc "Display all release tags in the tags dir"
104
+ task :ls do
105
+ puts svn.list_tags
106
+ end
107
+
108
+ desc "Display all release tags in the tags dir"
109
+ task :list_releases do
110
+ puts svn.list_release_tags
111
+ end
112
+
113
+ desc "Display all release tags in the tags dir"
114
+ task :list do
115
+ puts svn.list_tags
116
+ end
117
+ end
118
+ end
119
+
120
+ self
121
+ end
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,78 @@
1
+
2
+ module SVN
3
+ class ReleaseTag
4
+
5
+ include Comparable
6
+
7
+ attr_accessor :name, :major, :minor, :fix
8
+
9
+ def initialize(tag_name)
10
+ self.class.raise_if_not_recognized_release_tag!(tag_name)
11
+ @name = tag_name
12
+
13
+ components = self.name.delete("rel-").split(".")
14
+ @major = components[0].to_i
15
+ @minor = components[1].to_i
16
+ @fix = components[2].to_i
17
+ @components = [major, minor, fix]
18
+ end
19
+
20
+ def to_s
21
+ name
22
+ end
23
+
24
+ def next_major
25
+ "rel-#{next_major_component}.0.0"
26
+ end
27
+
28
+ def next_minor
29
+ "rel-#{major}.#{next_minor_component}.0"
30
+ end
31
+
32
+ def next_fix
33
+ "rel-#{major}.#{minor}.#{next_fix_component}"
34
+ end
35
+
36
+ def <=>(other_tag)
37
+ self.class.compare_components(self.components, other_tag.components)
38
+ end
39
+
40
+ def self.compare_components(current, other)
41
+ return 0 if current.empty?
42
+ return -1 if current.first < other.first
43
+ return 1 if current.first > other.first
44
+
45
+ current.shift
46
+ other.shift
47
+ self.compare_components(current, other)
48
+ end
49
+
50
+ def self.release_tag?(tag_name)
51
+ pattern = /^rel-\d+\.\d+\.\d+$/
52
+ pattern.match(tag_name).nil? ? false : true
53
+ end
54
+
55
+ def self.raise_if_not_recognized_release_tag!(tag_name)
56
+ raise Exception, "Tag name does not have valid release tag format" unless release_tag?(tag_name)
57
+ end
58
+
59
+
60
+ protected unless $TESTING
61
+ def components
62
+ @components.dup
63
+ end
64
+
65
+ def next_major_component
66
+ self.major + 1
67
+ end
68
+
69
+ def next_minor_component
70
+ self.minor + 1
71
+ end
72
+
73
+ def next_fix_component
74
+ self.fix + 1
75
+ end
76
+
77
+ end
78
+ end
data/lib/svn.rb ADDED
@@ -0,0 +1,14 @@
1
+
2
+ require 'svn/release_tag'
3
+ require 'svn/project'
4
+ require 'fileutils'
5
+
6
+ module SVN
7
+ def self.svn_cmd
8
+ self.win32? ? "svn.exe" : "svn"
9
+ end
10
+
11
+ def self.win32?
12
+ RUBY_PLATFORM =~ /win32/ ? true : false
13
+ end
14
+ end
@@ -0,0 +1,63 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ $TESTING = true
3
+
4
+ require 'svn'
5
+
6
+ describe "SVN::Project Integration Test" do
7
+
8
+ it "should list the ReleaseTags in asc order" do
9
+ svn = SVN::Project.new()
10
+ svn.stub!(:tags_url).and_return("#{svn.project_url}/test_tags")
11
+
12
+ svn.release_tags.last.to_s.should == 'rel-1.1.0'
13
+ end
14
+
15
+ it "should create the requested tag" do
16
+ svn = SVN::Project.new()
17
+ svn.stub!(:tags_url).and_return("#{svn.project_url}/test_tags")
18
+
19
+ next_fix_tag = 'rel-1.1.1'
20
+ next_fix_tag.should == svn.current_tag.next_fix
21
+ svn.release_tags.select { |tag| tag.to_s == next_fix_tag }.should be_empty
22
+ svn.create_tag(next_fix_tag)
23
+ svn.release_tags.select { |tag| tag.to_s == next_fix_tag }.should_not be_empty
24
+
25
+ next_minor_tag = 'rel-1.2.0'
26
+ next_minor_tag.should == svn.current_tag.next_minor
27
+ svn.release_tags.select { |tag| tag.to_s == next_minor_tag }.should be_empty
28
+ svn.create_tag(next_minor_tag)
29
+ svn.release_tags.select { |tag| tag.to_s == next_minor_tag }.should_not be_empty
30
+
31
+ svn.destroy_tag(next_fix_tag)
32
+ svn.release_tags.select { |tag| tag.to_s == next_fix_tag }.should be_empty
33
+ svn.destroy_tag(next_minor_tag)
34
+ svn.release_tags.select { |tag| tag.to_s == next_minor_tag }.should be_empty
35
+ end
36
+
37
+ it "should not create a 'current' tag by default" do
38
+ svn = SVN::Project.new()
39
+ svn.stub!(:tags_url).and_return("#{svn.project_url}/test_tags")
40
+ svn.always_update_current?.should be_false
41
+
42
+ next_major_tag = svn.current_tag.next_major
43
+ svn.create_tag(next_major_tag)
44
+ svn.list_all_tags.include?('current').should be_false
45
+
46
+ svn.destroy_tag(next_major_tag)
47
+ end
48
+
49
+ it "should create a 'current' tag if 'always_update_current' is true" do
50
+ svn = SVN::Project.new()
51
+ svn.stub!(:tags_url).and_return("#{svn.project_url}/test_tags")
52
+ svn.always_update_current = true
53
+ svn.always_update_current?.should be_true
54
+
55
+ next_major_tag = svn.current_tag.next_major
56
+
57
+ svn.create_tag(next_major_tag)
58
+ svn.list_all_tags.include?('current').should be_true
59
+
60
+ svn.destroy_tag(next_major_tag)
61
+ svn.destroy_tag('current')
62
+ end
63
+ end
@@ -0,0 +1,116 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ $TESTING = true
3
+
4
+ require 'svn'
5
+
6
+ describe "SVN::Project" do
7
+ before(:each) do
8
+ @bad_tag = "bad_tag-A.B.C"
9
+ @first_tag = "rel-0.0.1"
10
+ @second_tag = "rel-0.1.0"
11
+ @third_tag = "rel-1.0.0"
12
+ @svn_tags = [@first_tag, @second_tag, @bad_tag, @third_tag]
13
+ end
14
+
15
+ it "will accept a block for setting the connection parameters" do
16
+ username = "runner"
17
+ project_url = "svn.berkeley.edu/svn/ist-svn/berkeley/projects/commons/ruby/svn_tags"
18
+ method = "svn+ssh"
19
+
20
+ svn = SVN::Project.new() do |s|
21
+ s.username = username
22
+ s.project_url = project_url
23
+ s.method = method
24
+ end
25
+
26
+ svn.username.should == username
27
+ svn.method.should == method
28
+ svn.project_url.should == project_url
29
+ end
30
+
31
+ it "will raise an MissingConnectionParamException if a connection parameter is not specified in the block" do
32
+ username = "runner"
33
+ project_url = "svn.berkeley.edu/svn/ist-svn/berkeley/projects/commons/ruby/svn_tags"
34
+ method = "svn+ssh"
35
+
36
+ lambda {
37
+ SVN::Project.new() do |s|
38
+ s.username = username
39
+ s.project_url = project_url
40
+ end
41
+ }.should raise_error(SVN::Project::MissingConnectionParamException)
42
+
43
+ lambda {
44
+ SVN::Project.new() do |s|
45
+ s.username = username
46
+ s.method = method
47
+ end
48
+ }.should raise_error(SVN::Project::MissingConnectionParamException)
49
+
50
+ lambda {
51
+ SVN::Project.new() do |s|
52
+ s.method = method
53
+ s.project_url = project_url
54
+ end
55
+ }.should raise_error(SVN::Project::MissingConnectionParamException)
56
+ end
57
+
58
+ it "list_all_tags should list 'all' tags in the tags_url directory" do
59
+ svn = SVN::Project.new()
60
+ svn.stub!(:retrieve_tags).and_return(@svn_tags)
61
+ svn.list_all_tags().should == @svn_tags
62
+ end
63
+
64
+ it "list_release_tags should only show release_tags" do
65
+ svn = SVN::Project.new()
66
+ svn.stub!(:retrieve_tags).and_return(@svn_tags.dup)
67
+
68
+ svn.list_release_tags.map { |tag| tag.to_s }.should == [@first_tag, @second_tag, @third_tag]
69
+ end
70
+
71
+ it "should determine the next 'major' tag" do
72
+ svn = SVN::Project.new()
73
+ svn.stub!(:retrieve_tags).and_return(@svn_tags.dup)
74
+
75
+ svn.next_major_tag.should == 'rel-2.0.0'
76
+ end
77
+
78
+ it "should determine the next 'minor' tag" do
79
+ svn = SVN::Project.new()
80
+ svn.stub!(:retrieve_tags).and_return(@svn_tags.dup)
81
+
82
+ svn.next_minor_tag.should == 'rel-1.1.0'
83
+ end
84
+
85
+ it "should determine the next 'fix' tag" do
86
+ svn = SVN::Project.new()
87
+ svn.stub!(:retrieve_tags).and_return(@svn_tags.dup)
88
+
89
+ svn.next_fix_tag.should == 'rel-1.0.1'
90
+ end
91
+
92
+ it "should determin the 'current' tag" do
93
+ svn = SVN::Project.new()
94
+ svn.stub!(:retrieve_tags).and_return(@svn_tags.dup)
95
+
96
+ svn.current_tag.to_s.should == 'rel-1.0.0'
97
+ end
98
+
99
+
100
+ it "should allow the svn_cmd to be set from the block" do
101
+ lambda {
102
+ SVN::Project.new() do |s|
103
+ s.username = "runner"
104
+ s.project_url = "svn.berkeley.edu/svn/ist-svn/berkeley/projects/commons/ruby/svn_tags"
105
+ s.method = "svn+ssh"
106
+ s.svn_cmd = "tmp"
107
+ end
108
+ }.should raise_error(SVN::Project::MissingSVNClientException)
109
+ end
110
+
111
+ it "should return a dummy tag--rel-0.0.0--if no tags exist" do
112
+ svn = SVN::Project.new()
113
+ svn.stub!(:retrieve_tags).and_return([])
114
+ svn.current_tag.to_s.should == 'rel-0.0.0'
115
+ end
116
+ end
@@ -0,0 +1,85 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib/')
2
+ $TESTING = true
3
+
4
+ require 'svn'
5
+
6
+
7
+ describe "SVN::ReleaseTag" do
8
+
9
+ before(:all) do
10
+ @valid_tag_name = "rel-3.2.1"
11
+ @invalid_tag_name = "crap-A.B.C"
12
+ @release_tag = SVN::ReleaseTag.new(@valid_tag_name)
13
+ end
14
+
15
+ it "should recognize a valid ReleaseTag name" do
16
+ valid_tag_names = ["rel-0.1.3", "rel-1.2.60", "rel-22.22.99"]
17
+ valid_tag_names.each { |tag| SVN::ReleaseTag.release_tag?(tag).should be_true }
18
+
19
+ invalid_tag_names = ["crap-0.0.0", "rel-A.B.C", "rel-1_2_3"]
20
+ invalid_tag_names.each { |tag| SVN::ReleaseTag.release_tag?(tag).should be_false }
21
+ end
22
+
23
+ it "should raise and exception if the name of the ReleaseTag is invalid" do
24
+ lambda { SVN::ReleaseTag.new(@invalid_tag_name)}.should raise_error(Exception)
25
+ lambda { SVN::ReleaseTag.new(@valid_tag_name)}.should_not raise_error(Exception)
26
+ end
27
+
28
+ it "should set the 'major' component of the release_tag" do
29
+ tag = SVN::ReleaseTag.new(@valid_tag_name)
30
+ tag.major.should == 3
31
+ end
32
+
33
+ it "should set the 'minor' component of the release_tag" do
34
+ tag = SVN::ReleaseTag.new(@valid_tag_name)
35
+ tag.minor.should == 2
36
+ end
37
+
38
+ it "should set the 'fix' component of the release_tag" do
39
+ tag = SVN::ReleaseTag.new(@valid_tag_name)
40
+ tag.fix.should == 1
41
+ end
42
+
43
+ it "should determine if one release tag is 'greater than', 'less than' or 'equal' to anothe release tag" do
44
+ SVN::ReleaseTag.compare_components([1,1,1], [1,1,1]).should == 0
45
+ SVN::ReleaseTag.compare_components([4,1,12], [5,0,0]).should == -1
46
+ SVN::ReleaseTag.compare_components([5,4,199], [0,0,1]).should == 1
47
+ SVN::ReleaseTag.compare_components([0,1,0], [0,1,0]).should == 0
48
+ end
49
+
50
+ it "should sort an array of ReleaseTags" do
51
+ first = SVN::ReleaseTag.new("rel-0.0.1")
52
+ second = SVN::ReleaseTag.new("rel-0.1.1")
53
+ third = SVN::ReleaseTag.new("rel-1.0.0")
54
+ fourth = SVN::ReleaseTag.new("rel-5.0.0")
55
+ fifth = SVN::ReleaseTag.new("rel-7.7.1")
56
+ sixth = SVN::ReleaseTag.new("rel-9.0.0")
57
+
58
+ [second, third, first, sixth, fourth, fifth].sort.to_s.should == [first, second, third, fourth, fifth, sixth].to_s
59
+ end
60
+
61
+ it "should determine the next 'major' component" do
62
+ @release_tag.next_major_component.should == 4
63
+ end
64
+
65
+ it "should determine the next 'minor' component" do
66
+ @release_tag.next_minor_component.should == 3
67
+ end
68
+
69
+ it "should determine the next 'fix' componenet" do
70
+ @release_tag.next_fix_component.should == 2
71
+ end
72
+
73
+ it "should determine the next 'major' release tag" do
74
+ @release_tag.next_major.should == 'rel-4.0.0'
75
+ end
76
+
77
+ it "should determine the next 'minor' release tag" do
78
+ @release_tag.next_minor.should == 'rel-3.3.0'
79
+ end
80
+
81
+ it "should determine the next 'fix' release tag" do
82
+ @release_tag.next_fix.should == 'rel-3.2.2'
83
+ end
84
+
85
+ end
data/spec/svn_spec.rb ADDED
@@ -0,0 +1,16 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib/')
2
+ $TESTING = true
3
+
4
+ require 'svn'
5
+
6
+ describe "SVN" do
7
+
8
+ it "should determine if we are using a windows environment or a unix environment" do
9
+ if RUBY_PLATFORM =~ /win32/
10
+ SVN.win32?.should be_true
11
+ else
12
+ SVN.win32?.should be_false
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{svn_project}
5
+ s.version = "0.6.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Steven Hansen"]
9
+ s.date = %q{2008-12-10}
10
+ s.description = %q{Adds rake tasks for viewing/creating svn tags}
11
+ s.email = %q{runner@berkeley.edu}
12
+ s.extra_rdoc_files = ["README", "lib/svn/project.rb", "lib/svn/rake/svntask.rb", "lib/svn/release_tag.rb", "lib/svn.rb", "tasks/svn_project.rake"]
13
+ s.files = ["Manifest", "README", "Rakefile", "lib/svn/project.rb", "lib/svn/rake/svntask.rb", "lib/svn/release_tag.rb", "lib/svn.rb", "spec/svn_integration_spec.rb", "spec/svn_project_spec.rb", "spec/svn_release_tag_spec.rb", "spec/svn_spec.rb", "tasks/svn_project.rake", "svn_project.gemspec"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://http://svnproj.rubyforge.org}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Svn_project", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{svnproj}
19
+ s.rubygems_version = %q{1.3.0}
20
+ s.summary = %q{Adds rake tasks for viewing/creating svn tags}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_development_dependency(%q<echoe>, [">= 0"])
28
+ else
29
+ s.add_dependency(%q<echoe>, [">= 0"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<echoe>, [">= 0"])
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ require 'svn/rake/svntask'
2
+
3
+ svn = Rake::SVN::ProjectTask.new() do |s|
4
+ s.method = "svn+ssh"
5
+ s.project_url = "rubyforge.org/var/svn/svnproj"
6
+ s.username = YAML.load_file('svn_user.yml')['svn_username']
7
+ s.always_update_current = false
8
+ end
9
+
10
+
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: svn_project
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.1
5
+ platform: ruby
6
+ authors:
7
+ - Steven Hansen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-10 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: echoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Adds rake tasks for viewing/creating svn tags
26
+ email: runner@berkeley.edu
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README
33
+ - lib/svn/project.rb
34
+ - lib/svn/rake/svntask.rb
35
+ - lib/svn/release_tag.rb
36
+ - lib/svn.rb
37
+ - tasks/svn_project.rake
38
+ files:
39
+ - Manifest
40
+ - README
41
+ - Rakefile
42
+ - lib/svn/project.rb
43
+ - lib/svn/rake/svntask.rb
44
+ - lib/svn/release_tag.rb
45
+ - lib/svn.rb
46
+ - spec/svn_integration_spec.rb
47
+ - spec/svn_project_spec.rb
48
+ - spec/svn_release_tag_spec.rb
49
+ - spec/svn_spec.rb
50
+ - tasks/svn_project.rake
51
+ - svn_project.gemspec
52
+ has_rdoc: true
53
+ homepage: http://http://svnproj.rubyforge.org
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --line-numbers
57
+ - --inline-source
58
+ - --title
59
+ - Svn_project
60
+ - --main
61
+ - README
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "1.2"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project: svnproj
79
+ rubygems_version: 1.3.0
80
+ signing_key:
81
+ specification_version: 2
82
+ summary: Adds rake tasks for viewing/creating svn tags
83
+ test_files: []
84
+