rscm 0.4.5 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +12 -0
- data/README +14 -0
- data/Rakefile +4 -24
- data/lib/rscm.rb +1 -2
- data/lib/rscm/base.rb +289 -281
- data/lib/rscm/command_line.rb +135 -112
- data/lib/rscm/revision.rb +63 -166
- data/lib/rscm/revision_file.rb +8 -2
- data/lib/rscm/revision_poller.rb +78 -67
- data/lib/rscm/revisions.rb +79 -0
- data/lib/rscm/scm/clearcase.rb +11 -9
- data/lib/rscm/scm/cvs.rb +374 -352
- data/lib/rscm/scm/cvs_log_parser.rb +1 -0
- data/lib/rscm/scm/darcs.rb +9 -0
- data/lib/rscm/scm/perforce.rb +216 -149
- data/lib/rscm/scm/subversion.rb +44 -24
- data/lib/rscm/scm/subversion_log_parser.rb +37 -51
- data/lib/rscm/time_ext.rb +0 -1
- data/lib/rscm/version.rb +2 -2
- data/test/rscm/command_line_test.rb +7 -5
- data/test/rscm/compatibility/config.yml +4 -4
- data/test/rscm/compatibility/cvs_metaproject/diff.txt +52 -0
- data/test/rscm/compatibility/cvs_metaproject/file.txt +48 -0
- data/test/rscm/compatibility/cvs_metaproject/old.yml +13 -0
- data/test/rscm/compatibility/full.rb +2 -223
- data/test/rscm/compatibility/p4_gfx/files_0.yml +10 -0
- data/test/rscm/compatibility/p4_gfx/old.yml +26 -0
- data/test/rscm/compatibility/p4_gfx/revisions.yml +24 -0
- data/test/rscm/compatibility/p4_gfx/scm.yml +4 -0
- data/test/rscm/compatibility/rscm_engine.rb +197 -0
- data/test/rscm/compatibility/subversion_rscm/diff.txt +12 -0
- data/test/rscm/compatibility/subversion_rscm/file.txt +567 -0
- data/test/rscm/compatibility/subversion_rscm/old.yml +14 -0
- data/test/rscm/compatibility/subversion_rscm/revisions.yml +17 -0
- data/test/rscm/compatibility/subversion_rscm/scm.yml +1 -0
- data/test/rscm/revision_file_test.rb +10 -0
- data/test/rscm/revision_poller_test.rb +91 -0
- data/test/rscm/revision_test.rb +22 -117
- data/test/rscm/revisions_test.rb +80 -0
- data/test/rscm/scm/cvs_log_parser_test.rb +569 -567
- data/test/rscm/scm/cvs_test.rb +6 -3
- data/test/rscm/scm/darcs_test.rb +4 -7
- data/test/rscm/scm/perforce_test.rb +6 -2
- data/test/rscm/scm/star_team_test.rb +10 -0
- data/test/rscm/scm/subversion_log_parser_test.rb +38 -5
- data/test/rscm/scm/subversion_test.rb +2 -3
- data/test/rscm/test_helper.rb +41 -2
- data/testproject/damagecontrolled/build.xml +154 -154
- data/testproject/damagecontrolled/src/java/com/thoughtworks/damagecontrolled/Thingy.java +6 -6
- metadata +19 -7
- data/lib/rscm/historic_file.rb +0 -30
- data/test/rscm/compatibility/damage_control_minimal.rb +0 -104
- data/test/rscm/revision_fixture.rb +0 -20
- data/test/rscm/revisions.yaml +0 -42
- data/test/rscm/scm/star_team.rb +0 -36
@@ -1,13 +1,17 @@
|
|
1
1
|
require 'rscm/parser'
|
2
2
|
require 'rscm/revision'
|
3
|
+
require 'rscm/revisions'
|
4
|
+
require 'rscm/revision_file'
|
5
|
+
require 'time'
|
3
6
|
|
4
7
|
module RSCM
|
5
8
|
|
6
9
|
class SubversionLogParser
|
7
|
-
def initialize(io, url,
|
10
|
+
def initialize(io, url, exclude_below_and_including=nil, exclude_above_and_including=nil, path=nil)
|
8
11
|
@io = io
|
9
12
|
@revision_parser = SubversionLogEntryParser.new(url, path)
|
10
|
-
@
|
13
|
+
@exclude_below_and_including = exclude_below_and_including
|
14
|
+
@exclude_above_and_including = exclude_above_and_including
|
11
15
|
end
|
12
16
|
|
13
17
|
def parse_revisions(&line_proc)
|
@@ -16,16 +20,24 @@ module RSCM
|
|
16
20
|
revisions = Revisions.new
|
17
21
|
while(!@io.eof?)
|
18
22
|
revision = @revision_parser.parse(@io, &line_proc)
|
19
|
-
|
23
|
+
unless(revision.nil?)
|
20
24
|
# Filter out the lower bound to avoid inclusiveness of the lower bound (see contract)
|
21
25
|
# We're doing this instead of increasing the from_identifer with 1, since that causes an error.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
too_low = false
|
27
|
+
too_high = false
|
28
|
+
next if revision.time.nil?
|
29
|
+
if(@exclude_below_and_including.is_a? Time)
|
30
|
+
too_low = revision.time <= @exclude_below_and_including
|
31
|
+
elsif(@exclude_below_and_including.is_a? Numeric)
|
32
|
+
too_low = revision.identifier <= @exclude_below_and_including
|
27
33
|
end
|
28
|
-
|
34
|
+
|
35
|
+
if(@exclude_above_and_including.is_a? Time)
|
36
|
+
too_high = revision.time >= @exclude_above_and_including
|
37
|
+
elsif(@exclude_above_and_including.is_a? Numeric)
|
38
|
+
too_high = revision.identifier >= @exclude_above_and_including
|
39
|
+
end
|
40
|
+
revisions.add(revision) unless too_low || too_high
|
29
41
|
end
|
30
42
|
end
|
31
43
|
revisions
|
@@ -61,8 +73,13 @@ module RSCM
|
|
61
73
|
end
|
62
74
|
max_similar -= 1
|
63
75
|
end
|
76
|
+
|
64
77
|
if(max_similar == 0)
|
65
|
-
nil
|
78
|
+
if(@path.nil? || @path == "")
|
79
|
+
path_from_root
|
80
|
+
else
|
81
|
+
nil
|
82
|
+
end
|
66
83
|
else
|
67
84
|
path_from_root_tokens[max_similar..-1].join("/")
|
68
85
|
end
|
@@ -79,10 +96,10 @@ module RSCM
|
|
79
96
|
@parse_state = :parse_files
|
80
97
|
elsif(@parse_state == :parse_files)
|
81
98
|
file = parse_file(line)
|
82
|
-
if(file)
|
99
|
+
if(file && file.path)
|
83
100
|
previously_added_file = @revision[-1]
|
84
101
|
if(previously_added_file)
|
85
|
-
# remove previous revision_file
|
102
|
+
# remove previous revision_file if it's a dir
|
86
103
|
previous_tokens = previously_added_file.path.split("/")
|
87
104
|
current_tokens = file.path.split("/")
|
88
105
|
current_tokens.pop
|
@@ -90,7 +107,7 @@ module RSCM
|
|
90
107
|
@revision.pop
|
91
108
|
end
|
92
109
|
end
|
93
|
-
@revision
|
110
|
+
@revision.add file
|
94
111
|
end
|
95
112
|
elsif(@parse_state == :parse_message)
|
96
113
|
@revision.message << line.chomp << "\n"
|
@@ -112,8 +129,10 @@ module RSCM
|
|
112
129
|
@revision.message = ""
|
113
130
|
revision, developer, time, the_rest = line.split("|")
|
114
131
|
@revision.identifier = revision.strip[1..-1].to_i unless revision.nil?
|
115
|
-
|
116
|
-
@revision.
|
132
|
+
developer.strip!
|
133
|
+
@revision.developer = developer unless developer.nil? || developer == "(no author)"
|
134
|
+
time.strip!
|
135
|
+
@revision.time = Time.parse(time).utc unless time.nil? || time == "(no date)"
|
117
136
|
end
|
118
137
|
|
119
138
|
def parse_file(line)
|
@@ -133,47 +152,14 @@ module RSCM
|
|
133
152
|
path_from_root.gsub!(/\\/, "/")
|
134
153
|
path_from_root = path_from_root[1..-1]
|
135
154
|
rp = relative_path(@url, path_from_root)
|
136
|
-
if rp.nil?
|
137
|
-
|
138
|
-
|
139
|
-
else
|
140
|
-
return
|
141
|
-
end
|
142
|
-
else
|
143
|
-
file.path = rp
|
144
|
-
end
|
145
|
-
|
155
|
+
return if rp.nil?
|
156
|
+
|
157
|
+
file.path = rp
|
146
158
|
file.native_revision_identifier = @revision.identifier
|
147
159
|
# http://jira.codehaus.org/browse/DC-204
|
148
160
|
file.previous_native_revision_identifier = file.native_revision_identifier.to_i - 1;
|
149
161
|
file
|
150
162
|
end
|
151
|
-
|
152
|
-
def parse_time(svn_time)
|
153
|
-
if(svn_time =~ /(.*)-(.*)-(.*) (.*):(.*):(.*) (\+|\-)([0-9]*) (.*)/)
|
154
|
-
year = $1.to_i
|
155
|
-
month = $2.to_i
|
156
|
-
day = $3.to_i
|
157
|
-
hour = $4.to_i
|
158
|
-
min = $5.to_i
|
159
|
-
sec = $6.to_i
|
160
|
-
time = Time.utc(year, month, day, hour, min, sec)
|
161
|
-
|
162
|
-
time = adjust_offset(time, $7, $8)
|
163
|
-
else
|
164
|
-
raise "unexpected time format"
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
def adjust_offset(time, sign, offset)
|
169
|
-
hour_offset = offset[0..1].to_i
|
170
|
-
min_offset = offset[2..3].to_i
|
171
|
-
sec_offset = 3600*hour_offset + 60*min_offset
|
172
|
-
sec_offset = -sec_offset if(sign == "+")
|
173
|
-
time += sec_offset
|
174
|
-
time
|
175
|
-
end
|
176
|
-
|
177
163
|
end
|
178
164
|
|
179
165
|
end
|
data/lib/rscm/time_ext.rb
CHANGED
data/lib/rscm/version.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'rscm/tempdir'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
2
|
require 'rscm/command_line'
|
4
3
|
|
5
4
|
module RSCM
|
@@ -14,17 +13,20 @@ module RSCM
|
|
14
13
|
File.delete @stderr if File.exist? @stderr
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
16
|
+
def test_should_write_to_both_files_when_both_files_specified_and_no_block
|
18
17
|
setup_dir(method_name)
|
19
18
|
CommandLine.execute("echo \"<hello\" && echo world", {:dir => @dir, :stdout => @stdout, :stderr => @stderr})
|
20
19
|
assert_match(/.* echo \"<hello\"\s*\n.?\<hello.?\s*\n.* echo world\s*\nworld/n, File.open(@stdout).read)
|
21
20
|
assert_match(/.* echo \"<hello\"\s*\n.* echo world\s*/n, File.open(@stderr).read)
|
22
21
|
end
|
23
22
|
|
24
|
-
def
|
23
|
+
def test_should_not_write_to_stdout_file_when_no_stdout_specified
|
25
24
|
setup_dir(method_name)
|
25
|
+
orgout = STDOUT.dup
|
26
|
+
STDOUT.reopen(@stdout)
|
26
27
|
CommandLine.execute("echo hello", {:dir => @dir, :stderr => @stderr})
|
27
|
-
|
28
|
+
STDOUT.reopen(orgout)
|
29
|
+
assert_equal("#{@prompt} echo hello\nhello", File.open(@stdout).read.strip)
|
28
30
|
assert_equal("#{@prompt} echo hello", File.open(@stderr).read.strip)
|
29
31
|
end
|
30
32
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
---
|
2
|
-
RSCM::SubversionTest: subversion_rscm
|
3
|
-
RSCM::CvsTest: cvs_metaproject
|
4
|
-
RSCM::PerforceTest:
|
1
|
+
---
|
2
|
+
RSCM::SubversionTest: subversion_rscm
|
3
|
+
RSCM::CvsTest: cvs_metaproject
|
4
|
+
RSCM::PerforceTest: p4_gfx
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Index: CHANGES
|
2
|
+
===================================================================
|
3
|
+
RCS file: /var/cvs/xforge/xforge/CHANGES,v
|
4
|
+
retrieving revision 1.2
|
5
|
+
retrieving revision 1.3
|
6
|
+
diff -u -r1.2 -r1.3
|
7
|
+
--- CHANGES 18 Jul 2005 08:49:33 -0000 1.2
|
8
|
+
+++ CHANGES 12 Aug 2005 03:22:09 -0000 1.3
|
9
|
+
@@ -1,8 +1,43 @@
|
10
|
+
= XForge Changelog
|
11
|
+
|
12
|
+
+== Version 0.1.4
|
13
|
+
+
|
14
|
+
+This is the first functional release of XForge, a Ruby library and Rake task to automate release of
|
15
|
+
+files on RubyForge and other SourceForge clones.
|
16
|
+
+
|
17
|
+
+It's as simple as this:
|
18
|
+
+
|
19
|
+
+require 'xforge'
|
20
|
+
+
|
21
|
+
+desc "Create a new release on RubyForge"
|
22
|
+
+task :publish_files => [:gem] do
|
23
|
+
+ release_files = FileList[
|
24
|
+
+ "pkg/#{PKG_FILE_NAME}.gem"
|
25
|
+
+ ]
|
26
|
+
+
|
27
|
+
+ Rake::XForge::Release.new(PKG_NAME) do |release|
|
28
|
+
+ # Never hardcode user name and password in the Rakefile!
|
29
|
+
+ release.user_name = ENV['RUBYFORGE_USER']
|
30
|
+
+ release.password = ENV['RUBYFORGE_PASSWORD']
|
31
|
+
+ release.files = release_files.to_a
|
32
|
+
+ release.release_name = "XForge #{PKG_VERSION}"
|
33
|
+
+ # The rest of the options are defaults (among others, release_notes and release_changes, parsed from CHANGES)
|
34
|
+
+ end
|
35
|
+
+end
|
36
|
+
+
|
37
|
+
+* Added logic for parsing of CHANGES files and include it in the release notes when publishing.
|
38
|
+
+* Wrote some proper release notes for once.
|
39
|
+
+
|
40
|
+
+== Version 0.1.3
|
41
|
+
+
|
42
|
+
+* Added logic for parsing of CHANGES files and include it in the release notes when publishing.
|
43
|
+
+
|
44
|
+
== Version 0.1.2
|
45
|
+
|
46
|
+
+This release is a minor release with fixes in the Rake script.
|
47
|
+
+
|
48
|
+
* Fixed RDoc for gem
|
49
|
+
+* Cleaned up documentation
|
50
|
+
|
51
|
+
== Version 0.1.1
|
52
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
= XForge Changelog
|
2
|
+
|
3
|
+
== Version 0.1.4
|
4
|
+
|
5
|
+
This is the first functional release of XForge, a Ruby library and Rake task to automate release of
|
6
|
+
files on RubyForge and other SourceForge clones.
|
7
|
+
|
8
|
+
It's as simple as this:
|
9
|
+
|
10
|
+
require 'xforge'
|
11
|
+
|
12
|
+
desc "Create a new release on RubyForge"
|
13
|
+
task :publish_files => [:gem] do
|
14
|
+
release_files = FileList[
|
15
|
+
"pkg/#{PKG_FILE_NAME}.gem"
|
16
|
+
]
|
17
|
+
|
18
|
+
Rake::XForge::Release.new(PKG_NAME) do |release|
|
19
|
+
# Never hardcode user name and password in the Rakefile!
|
20
|
+
release.user_name = ENV['RUBYFORGE_USER']
|
21
|
+
release.password = ENV['RUBYFORGE_PASSWORD']
|
22
|
+
release.files = release_files.to_a
|
23
|
+
release.release_name = "XForge #{PKG_VERSION}"
|
24
|
+
# The rest of the options are defaults (among others, release_notes and release_changes, parsed from CHANGES)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
* Added logic for parsing of CHANGES files and include it in the release notes when publishing.
|
29
|
+
* Wrote some proper release notes for once.
|
30
|
+
|
31
|
+
== Version 0.1.3
|
32
|
+
|
33
|
+
* Added logic for parsing of CHANGES files and include it in the release notes when publishing.
|
34
|
+
|
35
|
+
== Version 0.1.2
|
36
|
+
|
37
|
+
This release is a minor release with fixes in the Rake script.
|
38
|
+
|
39
|
+
* Fixed RDoc for gem
|
40
|
+
* Cleaned up documentation
|
41
|
+
|
42
|
+
== Version 0.1.1
|
43
|
+
|
44
|
+
* Rakefile: Don't include old gems in release.
|
45
|
+
|
46
|
+
== Version 0.1
|
47
|
+
|
48
|
+
* Added support for file releases
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
start: 2005-08-14 00:00:00 Z
|
3
|
+
identifiers:
|
4
|
+
- 2005-07-18 07:53:39 Z
|
5
|
+
- 2005-07-18 08:49:33 Z
|
6
|
+
- 2005-07-18 09:01:23 Z
|
7
|
+
- 2005-08-12 03:22:09 Z
|
8
|
+
- 2005-08-13 01:23:50 Z
|
9
|
+
- 2005-08-13 01:26:31 Z
|
10
|
+
- 2005-08-13 08:48:42 Z
|
11
|
+
- 2005-08-13 08:53:03 Z
|
12
|
+
- 2005-08-13 08:54:44 Z
|
13
|
+
- 2005-08-13 08:56:51 Z
|
@@ -21,136 +21,12 @@ module Compatibility
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
# Acceptance test for scm implementations
|
25
|
-
#
|
26
|
-
# 1) Create a central repository
|
27
|
-
# 2) Import a test project to the central repository
|
28
|
-
# 3) Verify that WorkingCopy is not uptodate (not yet checked out)
|
29
|
-
# 4) Check out the contents of the central repo to WorkingCopy
|
30
|
-
# 5) Verify that the checked out files were those imported
|
31
|
-
# 6) Verify that the initial total revisions (from epoch to infinity) represents those from the import
|
32
|
-
# 7) Verify that WorkingCopy is uptodate
|
33
|
-
# 8) Change some files in WorkingCopy without committing them (yet)
|
34
|
-
# 9) Check out the contents of the central repo to OtherWorkingCopy
|
35
|
-
# 10) Verify that OtherWorkingCopy is uptodate
|
36
|
-
# 11) Verify that WorkingCopy is uptodate
|
37
|
-
# 12) Commit modifications in WorkingCopy
|
38
|
-
# 13) Verify that there is one revision since the previous one, and that it corresponds to the changed files in 8.
|
39
|
-
# 14) Verify that OtherWorkingCopy is *not* uptodate
|
40
|
-
# 15) Check out OtherWorkingCopy
|
41
|
-
# 16) Verify that OtherWorkingCopy is now uptodate
|
42
|
-
# 17) Add and commit a file in WorkingCopy
|
43
|
-
# 18) Verify that the revision (since last revision) for CheckoutHereToo contains only one file
|
44
|
-
# 19) Get directory listings
|
45
|
-
def test_basics
|
46
|
-
work_dir = RSCM.new_temp_dir("basics")
|
47
|
-
checkout_dir = "#{work_dir}/WorkingCopy"
|
48
|
-
other_checkout_dir = "#{work_dir}/OtherWorkingCopy"
|
49
|
-
repository_dir = "#{work_dir}/repository"
|
50
|
-
scm = create_scm(repository_dir, "damagecontrolled")
|
51
|
-
scm.default_options = DEFAULT_OPTIONS
|
52
|
-
scm.checkout_dir = checkout_dir
|
53
|
-
|
54
|
-
other_scm = create_scm(repository_dir, "damagecontrolled")
|
55
|
-
other_scm.default_options = DEFAULT_OPTIONS
|
56
|
-
other_scm.checkout_dir = other_checkout_dir
|
57
|
-
|
58
|
-
raise "This scm (#{scm.name}) can't create 'central' repositories." unless scm.can_create_central?
|
59
|
-
|
60
|
-
# 1
|
61
|
-
scm.create_central
|
62
|
-
@scm = scm
|
63
|
-
|
64
|
-
# 2
|
65
|
-
import_damagecontrolled(scm, "#{work_dir}/damagecontrolled")
|
66
|
-
|
67
|
-
# 3
|
68
|
-
assert(!scm.uptodate?(nil))
|
69
|
-
assert(!scm.uptodate?(nil))
|
70
|
-
|
71
|
-
# 4
|
72
|
-
files = scm.checkout nil
|
73
|
-
|
74
|
-
# 5
|
75
|
-
assert_equal(4, files.length, files.join("\n"))
|
76
|
-
files.sort!
|
77
|
-
assert_equal("build.xml", files[0])
|
78
|
-
assert_equal("project.xml", files[1])
|
79
|
-
assert_equal("src/java/com/thoughtworks/damagecontrolled/Thingy.java", files[2])
|
80
|
-
assert_equal("src/test/com/thoughtworks/damagecontrolled/ThingyTestCase.java", files[3])
|
81
|
-
|
82
|
-
# 6
|
83
|
-
initial_revisions = scm.revisions(nil)
|
84
|
-
assert_equal("imported sources", initial_revisions[0].message)
|
85
|
-
# Subversion seems to add a revision with message "Added directories"
|
86
|
-
#assert_equal(1, initial_revisions.length)
|
87
|
-
assert_equal(4, initial_revisions[0].length)
|
88
|
-
|
89
|
-
# 7
|
90
|
-
assert(scm.uptodate?(initial_revisions.latest.identifier))
|
91
|
-
|
92
|
-
# 8
|
93
|
-
change_file(scm, "#{checkout_dir}/build.xml")
|
94
|
-
change_file(scm, "#{checkout_dir}/src/java/com/thoughtworks/damagecontrolled/Thingy.java")
|
95
|
-
|
96
|
-
assert(!other_scm.uptodate?(initial_revisions.latest.identifier))
|
97
|
-
other_scm.checkout nil
|
98
|
-
assert(other_scm.uptodate?(initial_revisions.latest.identifier))
|
99
|
-
|
100
|
-
sleep(1)
|
101
|
-
scm.commit("changed something")
|
102
|
-
|
103
|
-
# 13
|
104
|
-
revisions = scm.revisions(initial_revisions.latest.identifier)
|
105
|
-
assert_equal(1, revisions.length, "Actual revisions:\n" + revisions.collect{|cs| cs.to_s}.join("\n"))
|
106
|
-
|
107
|
-
assert(revisions[0].identifier)
|
108
|
-
revision = revisions[0]
|
109
|
-
assert_equal(2, revision.length, "Actual files:\n" + revision.collect{|file| file.path}.join("\n"))
|
110
|
-
|
111
|
-
assert_equal("changed something", revision.message)
|
112
|
-
|
113
|
-
# why is this nil when running as the dcontrol user on codehaus? --jon
|
114
|
-
#assert_equal(username, revision.developer)
|
115
|
-
assert(revision.developer)
|
116
|
-
assert(revision.identifier)
|
117
|
-
|
118
|
-
assert_equal("build.xml", revision[0].path)
|
119
|
-
assert(revision[0].native_revision_identifier)
|
120
|
-
assert(revision[0].previous_native_revision_identifier)
|
121
|
-
assert_equal("src/java/com/thoughtworks/damagecontrolled/Thingy.java", revision[1].path)
|
122
|
-
assert(revision[1].native_revision_identifier)
|
123
|
-
assert(revision[1].previous_native_revision_identifier)
|
124
|
-
|
125
|
-
# 14
|
126
|
-
assert(!other_scm.uptodate?(revisions.latest.identifier))
|
127
|
-
assert(!other_scm.uptodate?(revisions.latest.identifier))
|
128
|
-
assert(scm.uptodate?(revisions.latest.identifier))
|
129
|
-
assert(scm.uptodate?(revisions.latest.identifier))
|
130
|
-
|
131
|
-
# 15
|
132
|
-
other_scm.checkout(nil).sort
|
133
|
-
|
134
|
-
# 16
|
135
|
-
assert(other_scm.uptodate?(nil))
|
136
|
-
|
137
|
-
# 17
|
138
|
-
add_or_edit_and_commit_file(scm, checkout_dir, "src/java/com/thoughtworks/damagecontrolled/Hello.txt", "Bla bla")
|
139
|
-
assert(!other_scm.uptodate?(nil))
|
140
|
-
revisions = other_scm.revisions(revisions.latest.identifier)
|
141
|
-
|
142
|
-
# 18
|
143
|
-
assert_equal(1, revisions.length)
|
144
|
-
assert_equal(1, revisions[0].length)
|
145
|
-
assert_equal("src/java/com/thoughtworks/damagecontrolled/Hello.txt", revisions[0][0].path)
|
146
|
-
end
|
147
24
|
|
148
25
|
def test_create_destroy
|
149
26
|
work_dir = RSCM.new_temp_dir("create_destroy")
|
150
27
|
checkout_dir = "#{work_dir}/checkout"
|
151
28
|
repository_dir = "#{work_dir}/repository"
|
152
29
|
scm = create_scm(repository_dir, "killme")
|
153
|
-
scm.default_options = DEFAULT_OPTIONS
|
154
30
|
scm.checkout_dir = checkout_dir
|
155
31
|
|
156
32
|
(1..3).each do
|
@@ -169,14 +45,13 @@ module Compatibility
|
|
169
45
|
repository_dir = "#{work_dir}/repository"
|
170
46
|
trigger_proof = "#{work_dir}/trigger_proof"
|
171
47
|
scm = create_scm(repository_dir, "damagecontrolled")
|
172
|
-
scm.default_options = DEFAULT_OPTIONS
|
173
48
|
scm.checkout_dir = checkout_dir
|
174
49
|
scm.create_central
|
175
50
|
@scm = scm
|
176
51
|
|
177
52
|
# Verify that install/uninstall works
|
178
53
|
touch = WINDOWS ? PathConverter.filepath_to_nativepath(File.dirname(__FILE__) + "/../../../bin/touch.exe", true) : `which touch`.strip
|
179
|
-
trigger_command =
|
54
|
+
trigger_command = touch + " " + PathConverter.filepath_to_nativepath(trigger_proof, true)
|
180
55
|
trigger_files_checkout_dir = File.expand_path("#{checkout_dir}/../trigger")
|
181
56
|
(1..3).each do |i|
|
182
57
|
assert(!scm.trigger_installed?(trigger_command, trigger_files_checkout_dir))
|
@@ -195,38 +70,11 @@ module Compatibility
|
|
195
70
|
assert(File.exist?(trigger_proof))
|
196
71
|
end
|
197
72
|
|
198
|
-
def test_checkout_revision_identifier
|
199
|
-
work_dir = RSCM.new_temp_dir("ids")
|
200
|
-
checkout_dir = "#{work_dir}/checkout"
|
201
|
-
repository_dir = "#{work_dir}/repository"
|
202
|
-
scm = create_scm(repository_dir, "damagecontrolled")
|
203
|
-
scm.default_options = DEFAULT_OPTIONS
|
204
|
-
scm.checkout_dir = checkout_dir
|
205
|
-
scm.create_central
|
206
|
-
@scm = scm
|
207
|
-
|
208
|
-
import_damagecontrolled(scm, "#{work_dir}/damagecontrolled")
|
209
|
-
scm.checkout nil
|
210
|
-
add_or_edit_and_commit_file(scm, checkout_dir, "before.txt", "Before label")
|
211
|
-
before_cs = scm.revisions(Time.epoch)
|
212
|
-
|
213
|
-
add_or_edit_and_commit_file(scm, checkout_dir, "after.txt", "After label")
|
214
|
-
after_cs = scm.revisions(before_cs.latest.identifier)
|
215
|
-
assert_equal(1, after_cs.length)
|
216
|
-
assert_equal("after.txt", after_cs[0][0].path)
|
217
|
-
|
218
|
-
scm.checkout(before_cs.latest.identifier)
|
219
|
-
|
220
|
-
assert(File.exist?("#{checkout_dir}/before.txt"))
|
221
|
-
assert(!File.exist?("#{checkout_dir}/after.txt"))
|
222
|
-
end
|
223
|
-
|
224
73
|
def test_should_move
|
225
74
|
work_dir = RSCM.new_temp_dir("move")
|
226
75
|
checkout_dir = "#{work_dir}/checkout"
|
227
76
|
repository_dir = "#{work_dir}/repository"
|
228
77
|
scm = create_scm(repository_dir, "damagecontrolled")
|
229
|
-
scm.default_options = DEFAULT_OPTIONS
|
230
78
|
scm.checkout_dir = checkout_dir
|
231
79
|
scm.create_central
|
232
80
|
@scm = scm
|
@@ -251,74 +99,6 @@ module Compatibility
|
|
251
99
|
assert_same(scm.class, scm2.class)
|
252
100
|
end
|
253
101
|
|
254
|
-
EXPECTED_DIFF = <<EOF
|
255
|
-
-one two three
|
256
|
-
-four five six
|
257
|
-
+one two three four
|
258
|
-
+five six
|
259
|
-
EOF
|
260
|
-
|
261
|
-
def test_diffs_and_historic_file
|
262
|
-
work_dir = RSCM.new_temp_dir("diff")
|
263
|
-
checkout_dir = "#{work_dir}/checkout"
|
264
|
-
repository_dir = "#{work_dir}/repository"
|
265
|
-
import_dir = "#{work_dir}/import/diffing"
|
266
|
-
scm = create_scm(repository_dir, "diffing")
|
267
|
-
scm.default_options = DEFAULT_OPTIONS
|
268
|
-
scm.checkout_dir = checkout_dir
|
269
|
-
scm.create_central
|
270
|
-
@scm = scm
|
271
|
-
|
272
|
-
mkdir_p(import_dir)
|
273
|
-
File.open("#{import_dir}/afile.txt", "w") do |io|
|
274
|
-
io.puts("just some")
|
275
|
-
io.puts("initial content")
|
276
|
-
end
|
277
|
-
scm.import_central :dir=>import_dir, :message=>"Importing"
|
278
|
-
scm.checkout nil
|
279
|
-
initial_revision = scm.revisions(nil).latest
|
280
|
-
sleep(1)
|
281
|
-
|
282
|
-
scm.edit("#{checkout_dir}/afile.txt")
|
283
|
-
File.open("#{checkout_dir}/afile.txt", "w") do |io|
|
284
|
-
io.puts("one two three")
|
285
|
-
io.puts("four five six")
|
286
|
-
end
|
287
|
-
scm.commit("Modified existing file")
|
288
|
-
sleep(1)
|
289
|
-
|
290
|
-
scm.edit("#{checkout_dir}/afile.txt")
|
291
|
-
File.open("#{checkout_dir}/afile.txt", "w") do |io|
|
292
|
-
io.puts("one two three four")
|
293
|
-
io.puts("five six")
|
294
|
-
end
|
295
|
-
scm.commit("Modified same file again")
|
296
|
-
|
297
|
-
revisions = scm.revisions(initial_revision.identifier)
|
298
|
-
assert_equal(2, revisions.length)
|
299
|
-
assert_equal("Modified existing file", revisions[0].message)
|
300
|
-
assert_equal("Modified same file again", revisions[1].message)
|
301
|
-
|
302
|
-
got_diff = false
|
303
|
-
scm.diff(revisions[1][0]) do |diff_io|
|
304
|
-
got_diff = true
|
305
|
-
diff_string = diff_io.read
|
306
|
-
assert_match(/^\-one two three/, diff_string)
|
307
|
-
assert_match(/^\-four five six/, diff_string)
|
308
|
-
assert_match(/^\+one two three four/, diff_string)
|
309
|
-
assert_match(/^\+five six/, diff_string)
|
310
|
-
end
|
311
|
-
assert(got_diff)
|
312
|
-
|
313
|
-
# TODO: make separate test. Make helper method for the cumbersome setup!
|
314
|
-
historic_afile = scm.file("afile.txt", false)
|
315
|
-
revision_files = historic_afile.revision_files
|
316
|
-
assert_equal(Array, revision_files.class)
|
317
|
-
assert(revision_files.length >= 2)
|
318
|
-
assert(revision_files.length <= 3)
|
319
|
-
assert_equal("one two three four\nfive six\n", revision_files[-1].open(scm){|io| io.read})
|
320
|
-
end
|
321
|
-
|
322
102
|
private
|
323
103
|
|
324
104
|
def import_damagecontrolled(scm, import_copy_dir)
|
@@ -329,7 +109,7 @@ EOF
|
|
329
109
|
cp_r(path, dirname)
|
330
110
|
todelete = Dir.glob("#{import_copy_dir}/**/.svn")
|
331
111
|
rm_rf(todelete)
|
332
|
-
scm.import_central
|
112
|
+
scm.import_central import_copy_dir, :message => "imported sources"
|
333
113
|
end
|
334
114
|
|
335
115
|
def change_file(scm, file)
|
@@ -363,7 +143,6 @@ EOF
|
|
363
143
|
checkout_dir = "#{work_dir}/LabelTest"
|
364
144
|
repository_dir = "#{work_dir}/repository"
|
365
145
|
scm = create_scm(repository_dir, "damagecontrolled")
|
366
|
-
scm.default_options = DEFAULT_OPTIONS
|
367
146
|
scm.checkout_dir = checkout_dir
|
368
147
|
scm.create_central
|
369
148
|
@scm = scm
|