rscm 0.4.0 → 0.4.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 +14 -0
- data/README +1 -1
- data/lib/rscm/base.rb +2 -2
- data/lib/rscm/command_line.rb +64 -19
- data/lib/rscm/path_converter.rb +8 -14
- data/lib/rscm/platform.rb +2 -2
- data/lib/rscm/scm/clearcase.rb +19 -17
- data/lib/rscm/scm/subversion.rb +6 -6
- data/lib/rscm/scm/subversion_log_parser.rb +12 -3
- data/lib/rscm/scm/subversion_log_parser.rb.rej +39 -0
- data/lib/rscm/version.rb +1 -1
- data/test/rscm/command_line_test.rb +38 -0
- data/test/rscm/generic_scm_tests.rb +6 -6
- data/test/rscm/path_converter_test.rb +1 -1
- metadata +109 -101
data/CHANGES
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
= RSCM Changelog
|
2
2
|
|
3
|
+
== 0.4.2
|
4
|
+
|
5
|
+
This release fixes a number of subtle bugs related to command lines and logging
|
6
|
+
|
7
|
+
* Subversion no longer adds 1 to the from_identifier when getting revisions (avoid stderr and exitcode -1)
|
8
|
+
* Improved tests and documentation for CommandLine class
|
9
|
+
* stdout and stderr options are now optional
|
10
|
+
* Fixed incorrect path escaping on win32
|
11
|
+
* Fixed broken CVS trigger mechanism
|
12
|
+
|
13
|
+
== Version 0.4.1
|
14
|
+
|
15
|
+
* Minor subversion improvements. Fixes #1 [aslak]
|
16
|
+
|
3
17
|
== Version 0.4.0
|
4
18
|
|
5
19
|
This release of RSCM modifies mosts API methods to take an options Hash (or alternatively, setting
|
data/README
CHANGED
data/lib/rscm/base.rb
CHANGED
@@ -54,12 +54,12 @@ module RSCM
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# Destroys the working copy
|
57
|
-
def destroy_working_copy
|
57
|
+
def destroy_working_copy(options={})
|
58
58
|
FileUtils.rm_rf(checkout_dir) unless checkout_dir.nil?
|
59
59
|
end
|
60
60
|
|
61
61
|
# Whether or not the SCM represented by this instance exists.
|
62
|
-
def central_exists?
|
62
|
+
def central_exists?(options={})
|
63
63
|
# The default implementation assumes yes - override if it can be
|
64
64
|
# determined programmatically.
|
65
65
|
true
|
data/lib/rscm/command_line.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
+
require 'rscm/platform'
|
2
|
+
|
1
3
|
module RSCM
|
2
|
-
# Utility for running a +cmd+ in a +dir+ with a specified +env+.
|
3
|
-
# If a block is passed, the standard out stream is passed to that block (and returns)
|
4
|
-
# the result from the block. Otherwise, if a block is not passed, standard output
|
5
|
-
# is redirected to +stdout_file+. The standard error stream is always redirected
|
6
|
-
# to +stderr_file+. Note that both +stdout_file+ and +stderr_file+ must always
|
7
|
-
# be specified with non-nil values, as both of them will always have the command lines
|
8
|
-
# written to them.
|
9
4
|
module CommandLine
|
10
5
|
class OptionError < StandardError; end
|
11
6
|
class ExecutionError < StandardError
|
@@ -15,35 +10,74 @@ module RSCM
|
|
15
10
|
"\ndir : #{@dir}\n" +
|
16
11
|
"command : #{@cmd}\n" +
|
17
12
|
"exitstatus: #{@exitstatus}\n" +
|
18
|
-
"
|
13
|
+
"STDERR TAIL START\n#{@stderr}\nSTDERR TAIL END\n"
|
19
14
|
end
|
20
15
|
end
|
21
16
|
|
17
|
+
# Executes +cmd+.
|
18
|
+
# If the +:stdout+ and +:stderr+ options are specified, a line consisting
|
19
|
+
# of a prompt (including +cmd+) will be appended to the respective output streams will be appended
|
20
|
+
# to those files, followed by the output itself. Example:
|
21
|
+
#
|
22
|
+
# CommandLine.execute("echo hello world", {:stdout => "stdout.log", :stderr => "stderr.log"})
|
23
|
+
#
|
24
|
+
# will result in the following being written to stdout.log:
|
25
|
+
#
|
26
|
+
# /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
|
27
|
+
# hello world
|
28
|
+
#
|
29
|
+
# -and to stderr.log:
|
30
|
+
# /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
|
31
|
+
#
|
32
|
+
# If a block is passed, the stdout io will be yielded to it (as with IO.popen). In this case the output
|
33
|
+
# will not be written to the stdout file (even if it's specified):
|
34
|
+
#
|
35
|
+
# /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
|
36
|
+
# [output captured and therefore not logged]
|
37
|
+
#
|
38
|
+
# If the exitstatus of the command is different from the value specified by the +:exitstatus+ option
|
39
|
+
# (which defaults to 0) then an ExecutionError is raised, its message containing the last 400 bytes of stderr
|
40
|
+
# (provided +:stderr+ was specified)
|
41
|
+
#
|
42
|
+
# You can also specify the +:dir+ option, which will cause the command to be executed in that directory
|
43
|
+
# (default is current directory).
|
44
|
+
#
|
45
|
+
# You can also specify a hash of environment variables in +:env+, which will add additional environment variables
|
46
|
+
# to the default environment.
|
47
|
+
#
|
48
|
+
# Finally, you can specify several commands within one by separating them with '&&' (as you would in a shell).
|
49
|
+
# This will result in several lines to be appended to the log (as if you had executed the commands separately).
|
50
|
+
#
|
51
|
+
# See the unit test for more examples.
|
22
52
|
def execute(cmd, options={}, &proc)
|
53
|
+
raise "Can't have newline in cmd" if cmd =~ /\n/
|
23
54
|
options = {
|
24
55
|
:dir => Dir.pwd,
|
25
56
|
:env => {},
|
26
57
|
:exitstatus => 0
|
27
58
|
}.merge(options)
|
28
59
|
|
29
|
-
|
30
|
-
|
31
|
-
options[:stdout] = File.expand_path(options[:stdout])
|
32
|
-
options[:stderr] = File.expand_path(options[:stderr])
|
60
|
+
options[:stdout] = File.expand_path(options[:stdout]) if options[:stdout]
|
61
|
+
options[:stderr] = File.expand_path(options[:stderr]) if options[:stderr]
|
33
62
|
|
34
63
|
commands = cmd.split("&&").collect{|c| c.strip}
|
35
64
|
Dir.chdir(options[:dir]) do
|
36
|
-
|
37
|
-
|
65
|
+
stdout_opt = options[:stdout] ? ">> #{options[:stdout]}" : ""
|
66
|
+
stderr_opt = options[:stderr] ? "2>> #{options[:stderr]}" : ""
|
67
|
+
capture_info_command = block_given? ? "echo [output captured and therefore not logged] >> #{options[:stdout]} && " : ""
|
68
|
+
|
69
|
+
full_cmd = commands.collect do |c|
|
70
|
+
escaped_command = c.gsub(/"/, "\\\"").gsub(/</, "\\<")
|
71
|
+
stdout_prompt_command = options[:stdout] ? "echo #{RSCM::Platform.prompt} #{escaped_command} >> #{options[:stdout]} && " : ""
|
72
|
+
stderr_prompt_command = options[:stderr] ? "echo #{RSCM::Platform.prompt} #{escaped_command} >> #{options[:stderr]} && " : ""
|
73
|
+
redirected_command = block_given? ? "#{c} #{stderr_opt}" : "#{c} #{stdout_opt} #{stderr_opt}"
|
38
74
|
|
39
|
-
|
40
|
-
"echo #{RSCM::Platform.prompt} #{c} >> #{options[:stderr]} && " +
|
41
|
-
redirection
|
75
|
+
stdout_prompt_command + capture_info_command + stderr_prompt_command + redirected_command
|
42
76
|
end.join(" && ")
|
43
77
|
|
44
78
|
options[:env].each{|k,v| ENV[k]=v}
|
45
79
|
begin
|
46
|
-
IO.popen(
|
80
|
+
IO.popen(full_cmd) do |io|
|
47
81
|
if(block_given?)
|
48
82
|
return(proc.call(io))
|
49
83
|
else
|
@@ -52,9 +86,20 @@ module RSCM
|
|
52
86
|
end
|
53
87
|
rescue Errno::ENOENT => e
|
54
88
|
File.open(options[:stderr], "a") {|io| io.write(e.message)}
|
89
|
+
raise ExecutionError.new(cmd, options[:dir], nil, e.message)
|
55
90
|
ensure
|
56
91
|
if($?.exitstatus != options[:exitstatus])
|
57
|
-
error_message =
|
92
|
+
error_message = "#{options[:stderr]} doesn't exist"
|
93
|
+
if options[:stderr] && File.exist?(options[:stderr])
|
94
|
+
File.open(options[:stderr]) do |errio|
|
95
|
+
begin
|
96
|
+
errio.seek(-800, IO::SEEK_END)
|
97
|
+
rescue Errno::EINVAL
|
98
|
+
# ignore - it just means we didn't have 400 bytes.
|
99
|
+
end
|
100
|
+
error_message = errio.read
|
101
|
+
end
|
102
|
+
end
|
58
103
|
raise ExecutionError.new(cmd, options[:dir], $?.exitstatus, error_message)
|
59
104
|
end
|
60
105
|
end
|
data/lib/rscm/path_converter.rb
CHANGED
@@ -11,17 +11,15 @@ module RSCM
|
|
11
11
|
return nil if path.nil?
|
12
12
|
path = File.expand_path(path)
|
13
13
|
if(WIN32)
|
14
|
-
path.gsub(/\//, "\\")
|
14
|
+
escaped ? path.gsub(/\//, "\\\\\\\\") : path.gsub(/\//, "\\")
|
15
15
|
elsif(CYGWIN)
|
16
|
-
|
17
|
-
|
18
|
-
cygpath = io.read.chomp
|
19
|
-
escaped ? cygpath.gsub(/\\/, "\\\\\\\\") : cygpath
|
20
|
-
end
|
16
|
+
cygpath = `cygpath --windows #{path}`.chomp
|
17
|
+
escaped ? cygpath.gsub(/\\/, "\\\\\\\\") : cygpath
|
21
18
|
else
|
22
19
|
path
|
23
20
|
end
|
24
21
|
end
|
22
|
+
module_function :filepath_to_nativepath
|
25
23
|
|
26
24
|
def filepath_to_nativeurl(path)
|
27
25
|
return nil if path.nil?
|
@@ -32,6 +30,7 @@ module RSCM
|
|
32
30
|
"file://#{File.expand_path(path)}"
|
33
31
|
end
|
34
32
|
end
|
33
|
+
module_function :filepath_to_nativeurl
|
35
34
|
|
36
35
|
def nativepath_to_filepath(path)
|
37
36
|
return nil if path.nil?
|
@@ -40,14 +39,12 @@ module RSCM
|
|
40
39
|
path.gsub(/\//, "\\")
|
41
40
|
elsif(CYGWIN)
|
42
41
|
path = path.gsub(/\\/, "/")
|
43
|
-
|
44
|
-
Better.popen(cmd) do |io|
|
45
|
-
io.read.chomp
|
46
|
-
end
|
42
|
+
`cygpath --unix #{path}`.chomp
|
47
43
|
else
|
48
44
|
path
|
49
45
|
end
|
50
46
|
end
|
47
|
+
module_function :nativepath_to_filepath
|
51
48
|
|
52
49
|
def ensure_trailing_slash(url)
|
53
50
|
return nil if url.nil?
|
@@ -57,10 +54,7 @@ module RSCM
|
|
57
54
|
url
|
58
55
|
end
|
59
56
|
end
|
60
|
-
|
61
|
-
module_function :filepath_to_nativepath
|
62
|
-
module_function :filepath_to_nativeurl
|
63
|
-
module_function :nativepath_to_filepath
|
64
57
|
module_function :ensure_trailing_slash
|
58
|
+
|
65
59
|
end
|
66
60
|
end
|
data/lib/rscm/platform.rb
CHANGED
@@ -7,8 +7,8 @@ module RSCM
|
|
7
7
|
return "powerpc-darwin" if target_os.downcase =~ /darwin/
|
8
8
|
return "mswin32" if target_os.downcase =~ /32/
|
9
9
|
return "cygwin" if target_os.downcase =~ /cyg/
|
10
|
-
|
11
|
-
|
10
|
+
return "freebsd" if target_os.downcase =~ /freebsd/
|
11
|
+
raise "Unsupported OS: #{target_os}"
|
12
12
|
end
|
13
13
|
module_function :family
|
14
14
|
|
data/lib/rscm/scm/clearcase.rb
CHANGED
@@ -22,7 +22,13 @@ module RSCM
|
|
22
22
|
@stream, @stgloc, @tag, @config_spec = stream, stgloc, tag, config_spec
|
23
23
|
end
|
24
24
|
|
25
|
-
def revisions(from_identifier,
|
25
|
+
def revisions(from_identifier, options={})
|
26
|
+
options = {
|
27
|
+
:from_identifier => from_identifier,
|
28
|
+
:to_identifier => Time.infinity,
|
29
|
+
:relative_path => nil
|
30
|
+
}.merge(options)
|
31
|
+
|
26
32
|
checkout unless checked_out?
|
27
33
|
rules = load_rules
|
28
34
|
vob = vob(rules[0])
|
@@ -35,7 +41,7 @@ module RSCM
|
|
35
41
|
with_working_dir(checkout_dir) do
|
36
42
|
since = (from_identifier + 1).strftime(TIME_FORMAT)
|
37
43
|
cmd = "cleartool lshistory -recurse -nco -since #{since} -fmt \"#{LOG_FORMAT}\" -pname #{vob}"
|
38
|
-
|
44
|
+
execute(cmd, options) do |io|
|
39
45
|
# escape all quotes, except the one at the beginning and end. this is a bit ugly...
|
40
46
|
raw_yaml = io.read
|
41
47
|
fixed_yaml = raw_yaml.gsub(/^ message: \"/, " message: #{MAGIC_TOKEN}")
|
@@ -67,29 +73,29 @@ module RSCM
|
|
67
73
|
!Dir["#{checkout_dir}/*"].empty?
|
68
74
|
end
|
69
75
|
|
70
|
-
def destroy_working_copy
|
71
|
-
|
76
|
+
def destroy_working_copy(options={})
|
77
|
+
execute("cleartool rmview #{checkout_dir}", options) do |io|
|
72
78
|
io.read
|
73
79
|
end
|
74
80
|
end
|
75
81
|
|
76
|
-
def import_central(
|
77
|
-
|
82
|
+
def import_central(options={})
|
83
|
+
execute("clearfsimport -recurse -nsetevent #{options[:dir]} #{checkout_dir}", options) do |io|
|
78
84
|
io.read
|
79
85
|
end
|
80
86
|
end
|
81
87
|
|
82
88
|
## Non-RSCM API methods
|
83
89
|
|
84
|
-
def mkview!
|
90
|
+
def mkview!(options={})
|
85
91
|
# Create view (working copy)
|
86
92
|
mkview_cmd = "cleartool mkview -snapshot -stream #{@stream} -stgloc #{@stgloc} -tag #{@tag} #{@checkout_dir}"
|
87
|
-
|
93
|
+
execute(mkview_cmd, options) do |io|
|
88
94
|
puts io.read
|
89
95
|
end
|
90
96
|
end
|
91
97
|
|
92
|
-
def update_load_rules!
|
98
|
+
def update_load_rules!(options={})
|
93
99
|
Dir.chdir(checkout_dir) do
|
94
100
|
# tempfile is broken on windows (!!)
|
95
101
|
cfg_spec_file = "__rscm.cfgspec"
|
@@ -104,10 +110,10 @@ module RSCM
|
|
104
110
|
end
|
105
111
|
end
|
106
112
|
|
107
|
-
def catcs
|
113
|
+
def catcs(options={})
|
108
114
|
Dir.chdir(checkout_dir) do
|
109
115
|
catcs_cmd = "cleartool catcs"
|
110
|
-
|
116
|
+
execute(catcs_cmd, options) do |io|
|
111
117
|
yield io
|
112
118
|
end
|
113
119
|
end
|
@@ -136,13 +142,9 @@ module RSCM
|
|
136
142
|
|
137
143
|
protected
|
138
144
|
|
139
|
-
def checkout_silent(to_identifier=
|
145
|
+
def checkout_silent(to_identifier, options={}, &proc)
|
140
146
|
if(checked_out?)
|
141
|
-
|
142
|
-
Better.popen("cleartool update .") do |io|
|
143
|
-
io.read
|
144
|
-
end
|
145
|
-
end
|
147
|
+
execute("cleartool update .", options)
|
146
148
|
else
|
147
149
|
mkview!
|
148
150
|
|
data/lib/rscm/scm/subversion.rb
CHANGED
@@ -118,7 +118,7 @@ module RSCM
|
|
118
118
|
|
119
119
|
def create_central(options={})
|
120
120
|
options = options.dup.merge({:dir => svnrootdir})
|
121
|
-
native_path = PathConverter.filepath_to_nativepath(svnrootdir,
|
121
|
+
native_path = PathConverter.filepath_to_nativepath(svnrootdir, false)
|
122
122
|
mkdir_p(PathConverter.nativepath_to_filepath(native_path))
|
123
123
|
svnadmin("create #{native_path}", options)
|
124
124
|
if(@path && @path != "")
|
@@ -168,7 +168,7 @@ module RSCM
|
|
168
168
|
revisions = nil
|
169
169
|
command = "svn #{changes_command(options[:from_identifier], options[:to_identifier], options[:relative_path])}"
|
170
170
|
execute(command, options) do |stdout|
|
171
|
-
parser = SubversionLogParser.new(stdout, @url)
|
171
|
+
parser = SubversionLogParser.new(stdout, @url, options[:from_identifier])
|
172
172
|
revisions = parser.parse_revisions
|
173
173
|
end
|
174
174
|
revisions
|
@@ -305,7 +305,7 @@ module RSCM
|
|
305
305
|
def login_options
|
306
306
|
result = ""
|
307
307
|
u = @username ? @username.strip : ""
|
308
|
-
p = @password ? @password.strip : "
|
308
|
+
p = @password ? @password.strip : ""
|
309
309
|
result << "--username #{u} " unless u == ""
|
310
310
|
result << "--password #{p} " unless p == ""
|
311
311
|
result
|
@@ -315,9 +315,9 @@ module RSCM
|
|
315
315
|
# The inclusive start
|
316
316
|
from = nil
|
317
317
|
if(from_identifier.is_a?(Time))
|
318
|
-
from = svndate(from_identifier
|
318
|
+
from = svndate(from_identifier)
|
319
319
|
elsif(from_identifier.is_a?(Numeric))
|
320
|
-
from = from_identifier
|
320
|
+
from = from_identifier
|
321
321
|
elsif(!from_identifier.nil?)
|
322
322
|
raise "from_identifier must be Numeric, Time or nil. Was: #{from_identifier} (#{from_identifier.class.name})"
|
323
323
|
end
|
@@ -350,7 +350,7 @@ module RSCM
|
|
350
350
|
end
|
351
351
|
|
352
352
|
def commit_command(message)
|
353
|
-
"commit -m \"#{message}\""
|
353
|
+
"commit #{login_options} --force-log -m \"#{message}\""
|
354
354
|
end
|
355
355
|
|
356
356
|
def local?
|
@@ -4,9 +4,10 @@ require 'rscm/revision'
|
|
4
4
|
module RSCM
|
5
5
|
|
6
6
|
class SubversionLogParser
|
7
|
-
def initialize(io, url)
|
7
|
+
def initialize(io, url, exclude_below=nil)
|
8
8
|
@io = io
|
9
9
|
@revision_parser = SubversionLogEntryParser.new(url)
|
10
|
+
@exclude_below = exclude_below
|
10
11
|
end
|
11
12
|
|
12
13
|
def parse_revisions(&line_proc)
|
@@ -16,7 +17,15 @@ module RSCM
|
|
16
17
|
while(!@io.eof?)
|
17
18
|
revision = @revision_parser.parse(@io, &line_proc)
|
18
19
|
if(revision)
|
19
|
-
|
20
|
+
# Filter out the lower bound to avoid inclusiveness of the lower bound (see contract)
|
21
|
+
# We're doing this instead of increasing the from_identifer with 1, since that causes an error.
|
22
|
+
exclude = false
|
23
|
+
if(@exclude_below.is_a? Time)
|
24
|
+
exclude = revision.time <= @exclude_below
|
25
|
+
elsif(@exclude_below.is_a? Numeric)
|
26
|
+
exclude = revision.identifier <= @exclude_below
|
27
|
+
end
|
28
|
+
revisions.add(revision) unless exclude
|
20
29
|
end
|
21
30
|
end
|
22
31
|
revisions
|
@@ -38,6 +47,7 @@ module RSCM
|
|
38
47
|
end
|
39
48
|
|
40
49
|
def relative_path(url, repo_path)
|
50
|
+
repo_path = repo_path.chomp
|
41
51
|
url_tokens = url.split('/')
|
42
52
|
repo_path_tokens = repo_path.split('/')
|
43
53
|
|
@@ -125,7 +135,6 @@ module RSCM
|
|
125
135
|
return if rp.nil?
|
126
136
|
file.path = rp
|
127
137
|
|
128
|
-
|
129
138
|
# if(@path.length+1 == path_from_root.length)
|
130
139
|
# file.path = path_from_root[@path.length+1..-1]
|
131
140
|
# else
|
@@ -0,0 +1,39 @@
|
|
1
|
+
***************
|
2
|
+
*** 38,43 ****
|
3
|
+
end
|
4
|
+
|
5
|
+
def relative_path(url, repo_path)
|
6
|
+
url_tokens = url.split('/')
|
7
|
+
repo_path_tokens = repo_path.split('/')
|
8
|
+
|
9
|
+
--- 38,45 ----
|
10
|
+
end
|
11
|
+
|
12
|
+
def relative_path(url, repo_path)
|
13
|
+
+ repo_path.chomp!
|
14
|
+
+
|
15
|
+
url_tokens = url.split('/')
|
16
|
+
repo_path_tokens = repo_path.split('/')
|
17
|
+
|
18
|
+
***************
|
19
|
+
*** 50,60 ****
|
20
|
+
end
|
21
|
+
max_similar -= 1
|
22
|
+
end
|
23
|
+
- if(max_similar == 0)
|
24
|
+
- nil
|
25
|
+
- else
|
26
|
+
- repo_path_tokens[max_similar..-1].join("/")
|
27
|
+
- end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
--- 52,59 ----
|
32
|
+
end
|
33
|
+
max_similar -= 1
|
34
|
+
end
|
35
|
+
+
|
36
|
+
+ repo_path_tokens[max_similar..-1].join("/")
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
data/lib/rscm/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rscm/tempdir'
|
3
|
+
require 'rscm/command_line'
|
4
|
+
|
5
|
+
module RSCM
|
6
|
+
|
7
|
+
class DifftoolTest < Test::Unit::TestCase
|
8
|
+
def setup
|
9
|
+
@dir = RSCM.new_temp_dir("test_should_write_to_stdout")
|
10
|
+
@stdout = "#{@dir}/stdout"
|
11
|
+
@stderr = "#{@dir}/stderr"
|
12
|
+
@prompt = "#{File.expand_path(@dir)} #{Platform.user}$"
|
13
|
+
File.delete @stdout if File.exist? @stdout
|
14
|
+
File.delete @stderr if File.exist? @stderr
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_write_to_both_when_both_streams_specified_and_no_block
|
18
|
+
CommandLine.execute("echo \"<hello\" && echo world", {:dir => @dir, :stdout => @stdout, :stderr => @stderr})
|
19
|
+
assert_equal("#{@prompt} echo \"<hello\"\n<hello\n#{@prompt} echo world\nworld\n", File.open(@stdout).read)
|
20
|
+
assert_equal("#{@prompt} echo \"<hello\"\n#{@prompt} echo world\n", File.open(@stderr).read)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_not_write_to_stdout_when_no_stdout_specified
|
24
|
+
CommandLine.execute("echo hello", {:dir => @dir, :stderr => @stderr})
|
25
|
+
assert(!File.exist?(@stdout))
|
26
|
+
assert_equal("#{@prompt} echo hello\n", File.open(@stderr).read)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_only_write_command_to_stdout_when_block_specified
|
30
|
+
CommandLine.execute("echo hello", {:dir => @dir, :stdout => @stdout, :stderr => @stderr}) do |io|
|
31
|
+
assert_equal("hello\n", io.read)
|
32
|
+
end
|
33
|
+
assert_equal("#{@prompt} echo hello\n[output captured and therefore not logged]\n", File.open(@stdout).read)
|
34
|
+
assert_equal("#{@prompt} echo hello\n", File.open(@stderr).read)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -82,7 +82,7 @@ module RSCM
|
|
82
82
|
|
83
83
|
# 6
|
84
84
|
initial_revisions = scm.revisions(nil)
|
85
|
-
assert_equal("imported
|
85
|
+
assert_equal("imported sources", initial_revisions[0].message)
|
86
86
|
# Subversion seems to add a revision with message "Added directories"
|
87
87
|
#assert_equal(1, initial_revisions.length)
|
88
88
|
assert_equal(4, initial_revisions[0].length)
|
@@ -99,7 +99,7 @@ module RSCM
|
|
99
99
|
assert(other_scm.uptodate?(initial_revisions.latest.identifier))
|
100
100
|
|
101
101
|
sleep(1)
|
102
|
-
scm.commit("changed
|
102
|
+
scm.commit("changed something")
|
103
103
|
|
104
104
|
# 13
|
105
105
|
revisions = scm.revisions(initial_revisions.latest.identifier)
|
@@ -109,7 +109,7 @@ module RSCM
|
|
109
109
|
revision = revisions[0]
|
110
110
|
assert_equal(2, revision.length, "Actual files:\n" + revision.collect{|file| file.path}.join("\n"))
|
111
111
|
|
112
|
-
assert_equal("changed
|
112
|
+
assert_equal("changed something", revision.message)
|
113
113
|
|
114
114
|
# why is this nil when running as the dcontrol user on codehaus? --jon
|
115
115
|
#assert_equal(username, revision.developer)
|
@@ -179,8 +179,8 @@ module RSCM
|
|
179
179
|
@scm = scm
|
180
180
|
|
181
181
|
# Verify that install/uninstall works
|
182
|
-
touch = WINDOWS ? PathConverter.filepath_to_nativepath(File.dirname(__FILE__) + "../../../bin/touch.exe",
|
183
|
-
trigger_command = "#{touch} " + PathConverter.filepath_to_nativepath(trigger_proof,
|
182
|
+
touch = WINDOWS ? PathConverter.filepath_to_nativepath(File.dirname(__FILE__) + "../../../bin/touch.exe", true) : "touch"
|
183
|
+
trigger_command = "#{touch} " + PathConverter.filepath_to_nativepath(trigger_proof, true)
|
184
184
|
trigger_files_checkout_dir = File.expand_path("#{checkout_dir}/../trigger")
|
185
185
|
(1..3).each do |i|
|
186
186
|
assert(!scm.trigger_installed?(trigger_command, trigger_files_checkout_dir))
|
@@ -333,7 +333,7 @@ EOF
|
|
333
333
|
cp_r(path, dirname)
|
334
334
|
todelete = Dir.glob("#{import_copy_dir}/**/.svn")
|
335
335
|
rm_rf(todelete)
|
336
|
-
scm.import_central :dir => import_copy_dir, :message => "imported
|
336
|
+
scm.import_central :dir => import_copy_dir, :message => "imported sources"
|
337
337
|
end
|
338
338
|
|
339
339
|
def change_file(scm, file)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.
|
2
|
+
rubygems_version: 0.8.11
|
3
3
|
specification_version: 1
|
4
4
|
name: rscm
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.
|
7
|
-
date: 2006-
|
8
|
-
summary:
|
6
|
+
version: 0.4.2
|
7
|
+
date: 2006-02-27 00:00:00 -06:00
|
8
|
+
summary: RSCM - Ruby Source Control Management
|
9
9
|
require_paths:
|
10
|
-
|
10
|
+
- lib
|
11
11
|
email: dev@damagecontrol.codehaus.org
|
12
12
|
homepage: http://rscm.rubyforge.org
|
13
13
|
rubyforge_project: rscm
|
@@ -18,109 +18,117 @@ bindir: bin
|
|
18
18
|
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
version: 0.0.0
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
25
24
|
version:
|
26
25
|
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
27
28
|
authors:
|
28
|
-
|
29
|
+
- Aslak Hellesoy
|
29
30
|
files:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
31
|
+
- CHANGES
|
32
|
+
- Rakefile
|
33
|
+
- README
|
34
|
+
- lib/rscm
|
35
|
+
- lib/rscm.rb
|
36
|
+
- lib/rscm/abstract_log_parser.rb
|
37
|
+
- lib/rscm/base.rb
|
38
|
+
- lib/rscm/command_line.rb
|
39
|
+
- lib/rscm/difftool.rb
|
40
|
+
- lib/rscm/historic_file.rb
|
41
|
+
- lib/rscm/line_editor.rb
|
42
|
+
- lib/rscm/mockit.rb
|
43
|
+
- lib/rscm/parser.rb
|
44
|
+
- lib/rscm/path_converter.rb
|
45
|
+
- lib/rscm/platform.rb
|
46
|
+
- lib/rscm/revision.rb
|
47
|
+
- lib/rscm/revision_file.rb
|
48
|
+
- lib/rscm/revision_poller.rb
|
49
|
+
- lib/rscm/scm
|
50
|
+
- lib/rscm/tempdir.rb
|
51
|
+
- lib/rscm/time_ext.rb
|
52
|
+
- lib/rscm/version.rb
|
53
|
+
- lib/rscm/scm/clearcase.rb
|
54
|
+
- lib/rscm/scm/cvs.rb
|
55
|
+
- lib/rscm/scm/cvs_log_parser.rb
|
56
|
+
- lib/rscm/scm/darcs.rb
|
57
|
+
- lib/rscm/scm/darcs_log_parser.rb
|
58
|
+
- lib/rscm/scm/monotone.rb
|
59
|
+
- lib/rscm/scm/monotone_log_parser.rb
|
60
|
+
- lib/rscm/scm/mooky.rb
|
61
|
+
- lib/rscm/scm/perforce.rb
|
62
|
+
- lib/rscm/scm/star_team.rb
|
63
|
+
- lib/rscm/scm/subversion.rb
|
64
|
+
- lib/rscm/scm/subversion_log_parser.rb
|
65
|
+
- lib/rscm/scm/subversion_log_parser.rb.rej
|
66
|
+
- bin/diff.exe
|
67
|
+
- bin/Diff_StdDisclaimer.html
|
68
|
+
- bin/touch.exe
|
69
|
+
- test/rscm
|
70
|
+
- test/rscm/apply_label_scm_tests.rb
|
71
|
+
- test/rscm/command_line_test.rb
|
72
|
+
- test/rscm/difftool_test.rb
|
73
|
+
- test/rscm/file_after_edit
|
74
|
+
- test/rscm/file_ext.rb
|
75
|
+
- test/rscm/file_to_edit
|
76
|
+
- test/rscm/generic_scm_tests.rb
|
77
|
+
- test/rscm/line_editor_test.rb
|
78
|
+
- test/rscm/mockit_test.rb
|
79
|
+
- test/rscm/parser_test.rb
|
80
|
+
- test/rscm/path_converter_test.rb
|
81
|
+
- test/rscm/revision_fixture.rb
|
82
|
+
- test/rscm/revision_test.rb
|
83
|
+
- test/rscm/revisions.yaml
|
84
|
+
- test/rscm/scm
|
85
|
+
- test/rscm/scm/cvs-dataforge.log
|
86
|
+
- test/rscm/scm/cvs-test.log
|
87
|
+
- test/rscm/scm/cvs_log_parser_test.rb
|
88
|
+
- test/rscm/scm/cvs_test.rb
|
89
|
+
- test/rscm/scm/darcs_log_parser_test.rb
|
90
|
+
- test/rscm/scm/darcs_test.rb
|
91
|
+
- test/rscm/scm/keys
|
92
|
+
- test/rscm/scm/monotone_log_parser_test.rb
|
93
|
+
- test/rscm/scm/monotone_test.rb
|
94
|
+
- test/rscm/scm/mooky_test.rb
|
95
|
+
- test/rscm/scm/p4client_test.rb
|
96
|
+
- test/rscm/scm/perforce_test.rb
|
97
|
+
- test/rscm/scm/star_team.rb
|
98
|
+
- test/rscm/scm/subversion_log_parser_test.rb
|
99
|
+
- test/rscm/scm/subversion_test.rb
|
100
|
+
- test/rscm/scm/svn-cargo.log
|
101
|
+
- test/rscm/scm/svn-growl.log
|
102
|
+
- test/rscm/scm/svn-growl2.log
|
103
|
+
- test/rscm/scm/svn-proxytoys.log
|
104
|
+
- testproject/damagecontrolled
|
105
|
+
- testproject/damagecontrolled/build.xml
|
106
|
+
- testproject/damagecontrolled/project.xml
|
107
|
+
- testproject/damagecontrolled/src
|
108
|
+
- testproject/damagecontrolled/src/java
|
109
|
+
- testproject/damagecontrolled/src/test
|
110
|
+
- testproject/damagecontrolled/src/java/com
|
111
|
+
- testproject/damagecontrolled/src/java/com/thoughtworks
|
112
|
+
- testproject/damagecontrolled/src/java/com/thoughtworks/damagecontrolled
|
113
|
+
- testproject/damagecontrolled/src/java/com/thoughtworks/damagecontrolled/Thingy.java
|
114
|
+
- testproject/damagecontrolled/src/test/com
|
115
|
+
- testproject/damagecontrolled/src/test/com/thoughtworks
|
116
|
+
- testproject/damagecontrolled/src/test/com/thoughtworks/damagecontrolled
|
117
|
+
- testproject/damagecontrolled/src/test/com/thoughtworks/damagecontrolled/ThingyTestCase.java
|
118
|
+
- ext/rscm.jar
|
116
119
|
test_files: []
|
120
|
+
|
117
121
|
rdoc_options:
|
118
|
-
|
119
|
-
|
122
|
+
- --line-numbers
|
123
|
+
- --inline-source
|
120
124
|
extra_rdoc_files:
|
121
|
-
|
122
|
-
|
125
|
+
- README
|
126
|
+
- CHANGES
|
123
127
|
executables: []
|
128
|
+
|
124
129
|
extensions: []
|
130
|
+
|
125
131
|
requirements: []
|
126
|
-
|
132
|
+
|
133
|
+
dependencies: []
|
134
|
+
|