rscm-accurev 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/{test.rb → apitest.rb} +1 -0
- data/bumprelease.sh +10 -0
- data/lib/rscm/scm/accurev/#api.rb# +226 -0
- data/lib/rscm/scm/accurev/api.rb +7 -12
- data/lib/rscm/scm/accurev/command.rb +47 -7
- data/lib/rscm/scm/accurev/xml.rb +1 -1
- data/test/eg/ac-files.xml +172 -0
- data/{testing.log → test/eg/update-newwksp.xml} +0 -138
- data/test/eg/update-stale.xml +12 -0
- data/test/t_api.rb +38 -0
- data/test/t_command.rb +58 -9
- data/test/t_scrubio.rb +0 -6
- metadata +9 -5
- data/lib/rscm/scm/accurev/#command.rb# +0 -95
data/{test.rb → apitest.rb}
RENAMED
@@ -9,6 +9,7 @@ require 'rscm/scm/accurev'
|
|
9
9
|
#files; puts "#{f.location}\t\t#{f.status}"
|
10
10
|
#files; end
|
11
11
|
|
12
|
+
# yes, i cannot spell, the dir is "hirdcar":
|
12
13
|
ac = RSCM::Accurev.new( '/home/gfast/dev/orbitz-api-hirdcar-0-rc' )
|
13
14
|
ac.backing_stream = "orbitz-api-hiredcar-0-rc"
|
14
15
|
ac.workspace_stream = "orbitz-api-hiredcar-0-rc-testing_gfast"
|
data/bumprelease.sh
ADDED
@@ -0,0 +1,226 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rscm/base'
|
4
|
+
require 'rscm/path_converter'
|
5
|
+
require 'rexml/document'
|
6
|
+
require 'rscm/scm/accurev/xml'
|
7
|
+
require 'rscm/scm/accurev/filterio'
|
8
|
+
require 'rscm/scm/accurev/command'
|
9
|
+
|
10
|
+
module RSCM
|
11
|
+
module Accurev; end
|
12
|
+
end
|
13
|
+
|
14
|
+
module RSCM::Accurev
|
15
|
+
|
16
|
+
class AccurevException < Exception ; end
|
17
|
+
|
18
|
+
# Indicates a failure of the update command due to unkept local modifications
|
19
|
+
class StaleWorkspaceError < AccurevException; end
|
20
|
+
|
21
|
+
# RSCM implementation for Accurev (http://www.accurev.com/).
|
22
|
+
#
|
23
|
+
# Requires an accurev cli executable on the path, and the correct
|
24
|
+
# environment for ac server/principal/password.
|
25
|
+
#
|
26
|
+
class API < RSCM::Base
|
27
|
+
register self
|
28
|
+
|
29
|
+
ann :description => "Accurev Depot"
|
30
|
+
attr_accessor :depot
|
31
|
+
|
32
|
+
ann :description => "Backing Stream (autodetected)"
|
33
|
+
attr_accessor :backing_stream
|
34
|
+
|
35
|
+
ann :description => "Workspace Stream"
|
36
|
+
attr_accessor :workspace_stream
|
37
|
+
|
38
|
+
# defined in Base
|
39
|
+
# ann :description => "Filesystem Path to Workspace"
|
40
|
+
# attr_accessor :checkout_dir
|
41
|
+
|
42
|
+
STATUSES = {
|
43
|
+
'(backed)' => :backed,
|
44
|
+
'(external)' => :external,
|
45
|
+
'(modified)' => :modified,
|
46
|
+
'(kept)' => :kept,
|
47
|
+
'(defunct)' => :defunct,
|
48
|
+
'(missing)' => :missing,
|
49
|
+
'(stranded)' => :stranded,
|
50
|
+
'(overlap)' => :overlap
|
51
|
+
}
|
52
|
+
|
53
|
+
def initialize( checkout_dir=nil, depot=nil, workspace_stream=nil )
|
54
|
+
@depot = depot
|
55
|
+
@checkout_dir = checkout_dir
|
56
|
+
@workspace_stream = workspace_stream
|
57
|
+
@backing_stream = nil # will be pulled from files cmd output
|
58
|
+
end
|
59
|
+
|
60
|
+
def name()
|
61
|
+
return "Accurev"
|
62
|
+
end
|
63
|
+
|
64
|
+
# Accurev operations are atomic:
|
65
|
+
def transactional?
|
66
|
+
return true
|
67
|
+
end
|
68
|
+
|
69
|
+
# "Adds +relative_filename+ to the working copy."
|
70
|
+
def add( relative_filename )
|
71
|
+
raise "XXX implement me"
|
72
|
+
end
|
73
|
+
|
74
|
+
def edit( relative_filename )
|
75
|
+
# NOP - not required for ac
|
76
|
+
end
|
77
|
+
|
78
|
+
# "Returns a Revisions object for the period specified ... (inclusive)."
|
79
|
+
def revisions( from_identifier, to_identifier=Time.infinity )
|
80
|
+
raise "XXX implement me"
|
81
|
+
end
|
82
|
+
|
83
|
+
# default impl depends on a correct impl of revisions()
|
84
|
+
# def uptodate?( identifier=nil )
|
85
|
+
#
|
86
|
+
# end
|
87
|
+
|
88
|
+
# def checked_out? - base
|
89
|
+
|
90
|
+
# accurev actually does have triggers, but I haven't implemented that yet
|
91
|
+
def supports_trigger?
|
92
|
+
false
|
93
|
+
end
|
94
|
+
|
95
|
+
# def diff() XXX
|
96
|
+
|
97
|
+
|
98
|
+
# --- ac specific
|
99
|
+
|
100
|
+
def ac_files( relative_path )
|
101
|
+
cmd = Command.instance
|
102
|
+
# there must be a better way to do this yield->yield loopage
|
103
|
+
obj = []
|
104
|
+
cmd.accurev_elements( StatData, "files", relative_path ) do |fd|
|
105
|
+
yield fd if block_given?
|
106
|
+
obj << fd
|
107
|
+
end
|
108
|
+
return obj
|
109
|
+
end
|
110
|
+
|
111
|
+
def ac_keep( files=[], message="" )
|
112
|
+
raise "XXX implement me"
|
113
|
+
end
|
114
|
+
|
115
|
+
def ac_promote( files=[], message="" )
|
116
|
+
raise "XXX implement me"
|
117
|
+
end
|
118
|
+
|
119
|
+
def ac_update( relative_path="." )
|
120
|
+
d = accurev( "update", relative_path )
|
121
|
+
if xxx_error_stale
|
122
|
+
raise StaleWorkspaceError.new( "#{relative_path} is stale -- keep/anchor all changes and re-update" )
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def ac_purge( files=[] )
|
127
|
+
raise "XXX implement me"
|
128
|
+
end
|
129
|
+
|
130
|
+
def ac_revert( files=[] )
|
131
|
+
raise "XXX implement me"
|
132
|
+
end
|
133
|
+
|
134
|
+
def ac_move( current_file, new_file )
|
135
|
+
raise "XXX implement me"
|
136
|
+
end
|
137
|
+
|
138
|
+
# ac info: shows eg, backing stream
|
139
|
+
# but doesn't support -fx!
|
140
|
+
|
141
|
+
# ac mkws
|
142
|
+
# -b orbitz-host-gt3-0-impl
|
143
|
+
# -w orbitz-host-gt3-0-impl-test2_gfast
|
144
|
+
# -l `pwd`
|
145
|
+
# - does not support fx (argh!@)
|
146
|
+
# - does not pop
|
147
|
+
#
|
148
|
+
|
149
|
+
# diff: /usr/local/bin/acdiff (!) --fx
|
150
|
+
# (after an ac cat on the backed file)
|
151
|
+
# (eg, no in-process diffing ala cvs diff)
|
152
|
+
# lists modified lines in xml
|
153
|
+
|
154
|
+
# checkout():
|
155
|
+
# "Checks out or updates[!] contents from a central SCM
|
156
|
+
# to +checkout_dir+ - a local working copy."
|
157
|
+
#
|
158
|
+
# "The +to_identifier+ parameter may be optionally specified to
|
159
|
+
# obtain files up to a particular time or label."
|
160
|
+
#
|
161
|
+
# For accurev, this:
|
162
|
+
# * checks to see if @checkout_dir exists and appears checked out.
|
163
|
+
# If it's already checked out, this calls update().
|
164
|
+
# * otherwise, this creates a new workspace stream and populates it
|
165
|
+
# at @checkout_dir.
|
166
|
+
#
|
167
|
+
# Unknown: support for +to_identifier+ (esp for update)?
|
168
|
+
#
|
169
|
+
# This method yields files in the workspace and doesn't need to be
|
170
|
+
# overridden.
|
171
|
+
# The checkout_silent() method does the actual work.
|
172
|
+
#
|
173
|
+
# Only yields files, not directories
|
174
|
+
def checkout( to_identifier=Time.infinite )
|
175
|
+
co = PathConverter.nativepath_to_filepath( @checkout_dir )
|
176
|
+
unless File.exists?( co )
|
177
|
+
puts "> creating new workspace..."
|
178
|
+
if @backing_stream.nil?
|
179
|
+
raise "Backing stream must be set"
|
180
|
+
end
|
181
|
+
if @workspace_stream.nil?
|
182
|
+
raise "Workspace stream must be set"
|
183
|
+
end
|
184
|
+
mkws_out = self.accurev_nofx( "mkws",
|
185
|
+
"-b", @backing_stream,
|
186
|
+
"-w", @workspace_stream,
|
187
|
+
"-l", co )
|
188
|
+
# sucks:
|
189
|
+
if ( mkws_out =~ /already exists/ )
|
190
|
+
raise AccurevException.new( mkws_out )
|
191
|
+
end
|
192
|
+
end
|
193
|
+
puts "> Updating workspace.."
|
194
|
+
self.update( to_identifier )
|
195
|
+
end
|
196
|
+
|
197
|
+
def update( to_identifier=Time.infinite )
|
198
|
+
co = PathConverter.nativepath_to_filepath( @checkout_dir )
|
199
|
+
unless File.exists?( co )
|
200
|
+
raise AccurevException.new( "Workspace does not exist!" )
|
201
|
+
end
|
202
|
+
updated = []
|
203
|
+
with_working_dir( co ) do
|
204
|
+
# XXX Command...
|
205
|
+
accurev_elements( UpdateData, "update" ) do |up|
|
206
|
+
yield up.location
|
207
|
+
updated << up.location
|
208
|
+
end
|
209
|
+
end
|
210
|
+
return updated
|
211
|
+
end
|
212
|
+
|
213
|
+
|
214
|
+
# --- internals
|
215
|
+
|
216
|
+
private
|
217
|
+
|
218
|
+
# Takes a status flags line (eg, "(modified)(kept)")
|
219
|
+
# and returns a list of status flags.
|
220
|
+
def map_status( status_line )
|
221
|
+
l = status_line.split( " " ).map {|x| x.trim}
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
data/lib/rscm/scm/accurev/api.rb
CHANGED
@@ -98,19 +98,14 @@ module RSCM::Accurev
|
|
98
98
|
# --- ac specific
|
99
99
|
|
100
100
|
def ac_files( relative_path )
|
101
|
-
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
101
|
+
cmd = Command.instance
|
102
|
+
# there must be a better way to do this yield->yield loopage
|
103
|
+
obj = []
|
104
|
+
cmd.accurev_elements( StatData, "files", relative_path ) do |fd|
|
105
|
+
yield fd if block_given?
|
106
|
+
obj << fd
|
106
107
|
end
|
107
|
-
|
108
|
-
out.elements.each( "/AcResponse/element" ) do |e|
|
109
|
-
f = FileStatus.new( e )
|
110
|
-
yield f if block_given?
|
111
|
-
files << f
|
112
|
-
end
|
113
|
-
return files
|
108
|
+
return obj
|
114
109
|
end
|
115
110
|
|
116
111
|
def ac_keep( files=[], message="" )
|
@@ -1,20 +1,26 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
|
-
require 'singleton'
|
4
|
-
|
5
3
|
module RSCM
|
6
4
|
module Accurev
|
7
5
|
|
6
|
+
#
|
7
|
+
# Executes accurev commands and deals with the output.
|
8
|
+
# This class is a thread local singleton: each thread
|
9
|
+
# calling +Command.instance+ gets a different instance.
|
10
|
+
#
|
8
11
|
class Command
|
9
|
-
include Singleton
|
10
12
|
|
11
13
|
attr_accessor :debug, :debug_to, :accurev, :working_dir
|
12
14
|
|
13
|
-
|
15
|
+
# map of xml element types to classes
|
16
|
+
# used by accurev_element to return a list of objects
|
17
|
+
attr_accessor :classmap
|
18
|
+
|
19
|
+
def initialize()
|
14
20
|
@debug = false
|
15
21
|
@debug_to = STDOUT
|
16
22
|
@accurev = "accurev"
|
17
|
-
@working_dir =
|
23
|
+
@working_dir = "."
|
18
24
|
end
|
19
25
|
|
20
26
|
def accurev_cmdline( cmd, *opts )
|
@@ -81,13 +87,47 @@ module RSCM
|
|
81
87
|
if doc.elements.size==0
|
82
88
|
raise "Unexpected output from #{cmd}: #{doc}"
|
83
89
|
end
|
90
|
+
objs = []
|
84
91
|
doc.elements.each( "/AcResponse/element" ) do |e|
|
85
92
|
o = mapclass.new( e )
|
86
|
-
yield o
|
93
|
+
yield o if block_given?
|
94
|
+
objs << o
|
95
|
+
end
|
96
|
+
return objs
|
97
|
+
end
|
98
|
+
|
99
|
+
# Retrieve this thread's +Command+ instance.
|
100
|
+
#
|
101
|
+
# eg:
|
102
|
+
# cmd = Command.instance
|
103
|
+
# eg:
|
104
|
+
# Command.instance do |cmd|
|
105
|
+
# cmd.workspace_dir = "/var/tmp"
|
106
|
+
# end
|
107
|
+
#
|
108
|
+
def Command.instance()
|
109
|
+
if Thread.current[ :RSCM_ACCUREV_COMMAND ].nil?
|
110
|
+
Thread.current[ :RSCM_ACCUREV_COMMAND ] = Command.new
|
87
111
|
end
|
112
|
+
yield Thread.current[ :RSCM_ACCUREV_COMMAND ] if block_given?
|
113
|
+
return Thread.current[ :RSCM_ACCUREV_COMMAND ]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Discard the current thread's Command object.
|
117
|
+
# The next call to +Command.instance+ in this thread will
|
118
|
+
# return a new instance configured with the defaults.
|
119
|
+
def Command.discard()
|
120
|
+
Thread.current[ :RSCM_ACCUREV_COMMAND ] = nil
|
121
|
+
end
|
122
|
+
|
123
|
+
# new() is marked private, use Command.instance().
|
124
|
+
private
|
125
|
+
def new( *args )
|
126
|
+
super(args)
|
88
127
|
end
|
89
128
|
|
90
|
-
end
|
129
|
+
end # class Command
|
130
|
+
|
91
131
|
end
|
92
132
|
end
|
93
133
|
|
data/lib/rscm/scm/accurev/xml.rb
CHANGED
@@ -21,7 +21,7 @@ module RSCM::Accurev
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Data from "accurev file" command:
|
24
|
-
class
|
24
|
+
class StatData < ElementBackedClass
|
25
25
|
element_name 'element'
|
26
26
|
attr_accessor :location, :status, :dir, :id
|
27
27
|
attr_accessor :elemType, :namedVersion, :Virtual, :Real
|
@@ -0,0 +1,172 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<AcResponse
|
3
|
+
Command="stat"
|
4
|
+
Directory="/home/gfast/dev/orbitz-host-gt3-0-impl">
|
5
|
+
<element
|
6
|
+
location="./.acignore"
|
7
|
+
dir="no"
|
8
|
+
id="197"
|
9
|
+
elemType="text"
|
10
|
+
Virtual="7/2"
|
11
|
+
namedVersion="orbitz-host-gt3-0-impl/2"
|
12
|
+
Real="8/2"
|
13
|
+
status="(backed)"/>
|
14
|
+
<element
|
15
|
+
location="./apps"
|
16
|
+
dir="yes"
|
17
|
+
id="6"
|
18
|
+
elemType="dir"
|
19
|
+
Virtual="4/1"
|
20
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
21
|
+
Real="6/1"
|
22
|
+
status="(backed)"/>
|
23
|
+
<element
|
24
|
+
location="./bin"
|
25
|
+
dir="yes"
|
26
|
+
id="20"
|
27
|
+
elemType="dir"
|
28
|
+
Virtual="4/1"
|
29
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
30
|
+
Real="6/1"
|
31
|
+
status="(backed)"/>
|
32
|
+
<element
|
33
|
+
location="./build"
|
34
|
+
dir="yes"
|
35
|
+
id="34"
|
36
|
+
elemType="dir"
|
37
|
+
Virtual="4/1"
|
38
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
39
|
+
Real="6/1"
|
40
|
+
status="(backed)"/>
|
41
|
+
<element
|
42
|
+
location="./build-deps.xml"
|
43
|
+
dir="no"
|
44
|
+
id="2"
|
45
|
+
elemType="text"
|
46
|
+
Virtual="4/1"
|
47
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
48
|
+
Real="6/1"
|
49
|
+
status="(backed)"/>
|
50
|
+
<element
|
51
|
+
location="./build.properties"
|
52
|
+
dir="no"
|
53
|
+
id="3"
|
54
|
+
elemType="text"
|
55
|
+
Virtual="4/1"
|
56
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
57
|
+
Real="6/1"
|
58
|
+
status="(backed)"/>
|
59
|
+
<element
|
60
|
+
location="./build.xml"
|
61
|
+
dir="no"
|
62
|
+
id="4"
|
63
|
+
elemType="text"
|
64
|
+
Virtual="7/1"
|
65
|
+
namedVersion="orbitz-host-gt3-0-impl/1"
|
66
|
+
Real="8/1"
|
67
|
+
status="(backed)"/>
|
68
|
+
<element
|
69
|
+
location="./conf"
|
70
|
+
dir="yes"
|
71
|
+
id="65"
|
72
|
+
elemType="dir"
|
73
|
+
Virtual="4/1"
|
74
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
75
|
+
Real="6/1"
|
76
|
+
status="(backed)"/>
|
77
|
+
<element
|
78
|
+
location="./doc"
|
79
|
+
dir="yes"
|
80
|
+
id="117"
|
81
|
+
elemType="dir"
|
82
|
+
Virtual="4/1"
|
83
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
84
|
+
Real="6/1"
|
85
|
+
status="(backed)"/>
|
86
|
+
<element
|
87
|
+
location="./hosts.properties"
|
88
|
+
dir="no"
|
89
|
+
id="198"
|
90
|
+
elemType="text"
|
91
|
+
Virtual="7/2"
|
92
|
+
namedVersion="orbitz-host-gt3-0-impl/2"
|
93
|
+
Real="8/2"
|
94
|
+
status="(backed)"/>
|
95
|
+
<element
|
96
|
+
location="./logs"
|
97
|
+
dir="yes"
|
98
|
+
id="128"
|
99
|
+
elemType="dir"
|
100
|
+
Virtual="4/1"
|
101
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
102
|
+
Real="6/1"
|
103
|
+
status="(backed)"/>
|
104
|
+
<element
|
105
|
+
location="./scripts"
|
106
|
+
dir="yes"
|
107
|
+
id="130"
|
108
|
+
elemType="dir"
|
109
|
+
Virtual="4/1"
|
110
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
111
|
+
Real="6/1"
|
112
|
+
status="(backed)"/>
|
113
|
+
<element
|
114
|
+
location="./src"
|
115
|
+
dir="yes"
|
116
|
+
id="136"
|
117
|
+
elemType="dir"
|
118
|
+
Virtual="4/1"
|
119
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
120
|
+
Real="6/1"
|
121
|
+
status="(backed)"/>
|
122
|
+
<element
|
123
|
+
location="./test"
|
124
|
+
dir="yes"
|
125
|
+
id="194"
|
126
|
+
elemType="dir"
|
127
|
+
Virtual="4/1"
|
128
|
+
namedVersion="orbitz-host-gt3-0-rc/1"
|
129
|
+
Real="6/1"
|
130
|
+
status="(backed)"/>
|
131
|
+
<element
|
132
|
+
location="./version.properties"
|
133
|
+
dir="no"
|
134
|
+
id="5"
|
135
|
+
elemType="text"
|
136
|
+
Virtual="7/1"
|
137
|
+
namedVersion="orbitz-host-gt3-0-impl/1"
|
138
|
+
Real="8/1"
|
139
|
+
status="(backed)"/>
|
140
|
+
<element
|
141
|
+
location="./install"
|
142
|
+
dir="yes"
|
143
|
+
status="(external)"/>
|
144
|
+
<element
|
145
|
+
location="./target"
|
146
|
+
dir="yes"
|
147
|
+
status="(external)"/>
|
148
|
+
<element
|
149
|
+
location="./ground.iml"
|
150
|
+
dir="no"
|
151
|
+
status="(external)"/>
|
152
|
+
<element
|
153
|
+
location="./.project"
|
154
|
+
dir="no"
|
155
|
+
status="(external)"/>
|
156
|
+
<element
|
157
|
+
location="./.eclipsebuild"
|
158
|
+
dir="yes"
|
159
|
+
status="(external)"/>
|
160
|
+
<element
|
161
|
+
location="./.classpath"
|
162
|
+
dir="no"
|
163
|
+
status="(external)"/>
|
164
|
+
<element
|
165
|
+
location="./ac-files.xml"
|
166
|
+
dir="no"
|
167
|
+
status="(external)"/>
|
168
|
+
<element
|
169
|
+
location="./TODO"
|
170
|
+
dir="no"
|
171
|
+
status="(external)"/>
|
172
|
+
</AcResponse>
|
@@ -1,5 +1,3 @@
|
|
1
|
-
ac> ./test/acreplay.rb eg/update-newwksp.xml files -fx
|
2
|
-
raw>
|
3
1
|
<?xml version="1.0"?>
|
4
2
|
<!-- ac update -fx on a newly created workspace (eg, no files yet) -->
|
5
3
|
<acResponse
|
@@ -183,139 +181,3 @@ raw>
|
|
183
181
|
</acResponse>
|
184
182
|
|
185
183
|
|
186
|
-
<?xml version='1.0'?><!-- ac update -fx on a newly created workspace (eg, no files yet) --><AcResponse command='update'>
|
187
|
-
<message>Updating element /./ChangeLog
|
188
|
-
</message>
|
189
|
-
<element location='/ChangeLog'/>
|
190
|
-
<message>Updating (creating) dir /./build
|
191
|
-
</message>
|
192
|
-
<element location='/build'/>
|
193
|
-
<message>Updating (creating) dir /./build/filesets
|
194
|
-
</message>
|
195
|
-
<element location='/build/filesets'/>
|
196
|
-
<message>Updating element /./build/filesets/orbitz-api-robot.exclude
|
197
|
-
</message>
|
198
|
-
<element location='/build/filesets/orbitz-api-robot.exclude'/>
|
199
|
-
<message>Updating element /./build/filesets/orbitz-api-robot.include
|
200
|
-
</message>
|
201
|
-
<element location='/build/filesets/orbitz-api-robot.include'/>
|
202
|
-
<message>Updating element /./build/filesets/orbitz-api-robot.metainf
|
203
|
-
</message>
|
204
|
-
<element location='/build/filesets/orbitz-api-robot.metainf'/>
|
205
|
-
<message>Updating element /./build/filesets/orbitz-api-robot.src
|
206
|
-
</message>
|
207
|
-
<element location='/build/filesets/orbitz-api-robot.src'/>
|
208
|
-
<message>Updating element /./build.properties
|
209
|
-
</message>
|
210
|
-
<element location='/build.properties'/>
|
211
|
-
<message>Updating element /./build.sh
|
212
|
-
</message>
|
213
|
-
<element location='/build.sh'/>
|
214
|
-
<message>Updating element /./build.xml
|
215
|
-
</message>
|
216
|
-
<element location='/build.xml'/>
|
217
|
-
<message>Updating (creating) dir /./src
|
218
|
-
</message>
|
219
|
-
<element location='/src'/>
|
220
|
-
<message>Updating (creating) dir /./src/java
|
221
|
-
</message>
|
222
|
-
<element location='/src/java'/>
|
223
|
-
<message>Updating (creating) dir /./src/java/com
|
224
|
-
</message>
|
225
|
-
<element location='/src/java/com'/>
|
226
|
-
<message>Updating (creating) dir /./src/java/com/orbitz
|
227
|
-
</message>
|
228
|
-
<element location='/src/java/com/orbitz'/>
|
229
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc
|
230
|
-
</message>
|
231
|
-
<element location='/src/java/com/orbitz/dc'/>
|
232
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/client
|
233
|
-
</message>
|
234
|
-
<element location='/src/java/com/orbitz/dc/client'/>
|
235
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/client/robot
|
236
|
-
</message>
|
237
|
-
<element location='/src/java/com/orbitz/dc/client/robot'/>
|
238
|
-
<message>Updating element /./src/java/com/orbitz/dc/client/robot/RobotFactory.java
|
239
|
-
</message>
|
240
|
-
<element location='/src/java/com/orbitz/dc/client/robot/RobotFactory.java'/>
|
241
|
-
<message>Updating element /./src/java/com/orbitz/dc/client/robot/RobotImpl.java
|
242
|
-
</message>
|
243
|
-
<element location='/src/java/com/orbitz/dc/client/robot/RobotImpl.java'/>
|
244
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/core
|
245
|
-
</message>
|
246
|
-
<element location='/src/java/com/orbitz/dc/core'/>
|
247
|
-
<message>Updating element /./src/java/com/orbitz/dc/core/ROBOT_STATE.java
|
248
|
-
</message>
|
249
|
-
<element location='/src/java/com/orbitz/dc/core/ROBOT_STATE.java'/>
|
250
|
-
<message>Updating element /./src/java/com/orbitz/dc/core/THROTTLE_TYPE.java
|
251
|
-
</message>
|
252
|
-
<element location='/src/java/com/orbitz/dc/core/THROTTLE_TYPE.java'/>
|
253
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/service
|
254
|
-
</message>
|
255
|
-
<element location='/src/java/com/orbitz/dc/service'/>
|
256
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/service/robot
|
257
|
-
</message>
|
258
|
-
<element location='/src/java/com/orbitz/dc/service/robot'/>
|
259
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/Robot.java
|
260
|
-
</message>
|
261
|
-
<element location='/src/java/com/orbitz/dc/service/robot/Robot.java'/>
|
262
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/RobotAdminProperties.java
|
263
|
-
</message>
|
264
|
-
<element location='/src/java/com/orbitz/dc/service/robot/RobotAdminProperties.java'/>
|
265
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/RobotInfo.java
|
266
|
-
</message>
|
267
|
-
<element location='/src/java/com/orbitz/dc/service/robot/RobotInfo.java'/>
|
268
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/RobotProperties.java
|
269
|
-
</message>
|
270
|
-
<element location='/src/java/com/orbitz/dc/service/robot/RobotProperties.java'/>
|
271
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/RobotStatus.java
|
272
|
-
</message>
|
273
|
-
<element location='/src/java/com/orbitz/dc/service/robot/RobotStatus.java'/>
|
274
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/RobotUsageHistoryEntry.java
|
275
|
-
</message>
|
276
|
-
<element location='/src/java/com/orbitz/dc/service/robot/RobotUsageHistoryEntry.java'/>
|
277
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/service/robot/remote
|
278
|
-
</message>
|
279
|
-
<element location='/src/java/com/orbitz/dc/service/robot/remote'/>
|
280
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/robot/remote/RobotServiceRemote.java
|
281
|
-
</message>
|
282
|
-
<element location='/src/java/com/orbitz/dc/service/robot/remote/RobotServiceRemote.java'/>
|
283
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/service/util
|
284
|
-
</message>
|
285
|
-
<element location='/src/java/com/orbitz/dc/service/util'/>
|
286
|
-
<message>Updating element /./src/java/com/orbitz/dc/service/util/ThrottleProperties.java
|
287
|
-
</message>
|
288
|
-
<element location='/src/java/com/orbitz/dc/service/util/ThrottleProperties.java'/>
|
289
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/system
|
290
|
-
</message>
|
291
|
-
<element location='/src/java/com/orbitz/dc/system'/>
|
292
|
-
<message>Updating (creating) dir /./src/java/com/orbitz/dc/system/core
|
293
|
-
</message>
|
294
|
-
<element location='/src/java/com/orbitz/dc/system/core'/>
|
295
|
-
<message>Updating element /./src/java/com/orbitz/dc/system/core/ROBOT_TYPE.java
|
296
|
-
</message>
|
297
|
-
<element location='/src/java/com/orbitz/dc/system/core/ROBOT_TYPE.java'/>
|
298
|
-
<message>Updating (creating) dir /./test
|
299
|
-
</message>
|
300
|
-
<element location='/test'/>
|
301
|
-
<message>Updating (creating) dir /./test/src
|
302
|
-
</message>
|
303
|
-
<element location='/test/src'/>
|
304
|
-
<message>Updating (creating) dir /./test/src/java
|
305
|
-
</message>
|
306
|
-
<element location='/test/src/java'/>
|
307
|
-
<message>Updating (creating) dir /./test/src/java/com
|
308
|
-
</message>
|
309
|
-
<element location='/test/src/java/com'/>
|
310
|
-
<message>Updating (creating) dir /./test/src/java/com/orbitz
|
311
|
-
</message>
|
312
|
-
<element location='/test/src/java/com/orbitz'/>
|
313
|
-
<message>Updating element /./test/src/java/com/orbitz/package.html
|
314
|
-
</message>
|
315
|
-
<element location='/test/src/java/com/orbitz/package.html'/>
|
316
|
-
<message>Updating element /./version.properties
|
317
|
-
</message>
|
318
|
-
<element location='/version.properties'/>
|
319
|
-
</AcResponse>
|
320
|
-
|
321
|
-
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<acResponse
|
2
|
+
command="update"Scanning entire workspace for files touched since last scan - ok
|
3
|
+
ok
|
4
|
+
>
|
5
|
+
<message
|
6
|
+
error="true">
|
7
|
+
Some of the elements in your workspace have been modified
|
8
|
+
and are not in your default group. Use 'accurev stat -n' to
|
9
|
+
get a list of these files. Then resolve all modifications
|
10
|
+
with anchor, keep, or purge before trying update again.
|
11
|
+
</message>
|
12
|
+
</acResponse>
|
data/test/t_api.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rscm/accurev'
|
5
|
+
include RSCM::Accurev
|
6
|
+
|
7
|
+
class AccurevAPITest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_ac_files()
|
10
|
+
Command.instance do |cmd|
|
11
|
+
cmd.working_dir = "test"
|
12
|
+
cmd.accurev = "./acreplay.rb eg/ac-files.xml"
|
13
|
+
end
|
14
|
+
api = API.new( ".", "test-bogus-depot", "test-bogus-depot-0-impl" )
|
15
|
+
# test array returns
|
16
|
+
files = api.ac_files( "." )
|
17
|
+
assert( files.length > 0, "Should get some stat-ed files" )
|
18
|
+
assert_equal( files.length, 23 )
|
19
|
+
files.each do |fd|
|
20
|
+
assert( fd.respond_to?( :location ) )
|
21
|
+
end
|
22
|
+
# test block yield
|
23
|
+
count = 0
|
24
|
+
api.ac_files( "." ) do |fd|
|
25
|
+
assert( fd.respond_to?( :location ) )
|
26
|
+
count += 1
|
27
|
+
end
|
28
|
+
assert_equal( count, 23 )
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_update()
|
32
|
+
Command.instance do |cmd|
|
33
|
+
cmd.working_dir = "test"
|
34
|
+
cmd.accurev = "./acreplay.rb eg/update-stale.xml"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/test/t_command.rb
CHANGED
@@ -7,6 +7,7 @@ include RSCM::Accurev
|
|
7
7
|
class CommandTest < Test::Unit::TestCase
|
8
8
|
|
9
9
|
def test_command_line_subs
|
10
|
+
Command.discard
|
10
11
|
cmd = Command.instance
|
11
12
|
|
12
13
|
s = cmd.accurev_cmdline( "foo", "bar" )
|
@@ -16,22 +17,70 @@ class CommandTest < Test::Unit::TestCase
|
|
16
17
|
|
17
18
|
s = cmd.accurev_cmdline( "foo", "bar" )
|
18
19
|
assert_equal( "xyzzy foo bar", s )
|
19
|
-
|
20
|
+
|
21
|
+
Command.discard
|
20
22
|
end
|
21
23
|
|
22
24
|
def test_a_e
|
23
|
-
puts "XXX test skipped XXX"
|
24
|
-
return ## XXX
|
25
25
|
cmd = Command.instance
|
26
|
-
cmd.working_dir = "
|
27
|
-
cmd.debug = true
|
28
|
-
cmd.debug_to = File.open( "testing.log", "w" )
|
29
|
-
cmd.accurev = "./
|
30
|
-
|
26
|
+
cmd.working_dir = "test"
|
27
|
+
#cmd.debug = true
|
28
|
+
#cmd.debug_to = File.open( "testing.log", "w" )
|
29
|
+
cmd.accurev = "./acreplay.rb eg/update-newwksp.xml"
|
30
|
+
# test listy output
|
31
|
+
list = cmd.accurev_elements( RSCM::Accurev::StatData, "files" )
|
31
32
|
assert( list.size > 0 )
|
32
33
|
list.each do |fd|
|
33
|
-
assert( fd.respond_to?( location ) )
|
34
|
+
assert( fd.respond_to?( :location ) )
|
35
|
+
end
|
36
|
+
# test yieldy output
|
37
|
+
got_any = false
|
38
|
+
cmd.accurev_elements( RSCM::Accurev::StatData, "files" ) do |fd|
|
39
|
+
got_any = true
|
40
|
+
assert( fd.respond_to?( :location ) )
|
41
|
+
end
|
42
|
+
assert( got_any )
|
43
|
+
Command.discard
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_threadlocal_private_new
|
47
|
+
begin
|
48
|
+
cmd = Command.new
|
49
|
+
flunk( "Command.new() should be private" )
|
50
|
+
rescue
|
51
|
+
assert( true )
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_threadlocal
|
56
|
+
# instance returns this thread's Command object
|
57
|
+
begin
|
58
|
+
cmd = Command.instance
|
59
|
+
cmd.working_dir = "/one/two/three"
|
60
|
+
assert_equal( cmd.working_dir, "/one/two/three" )
|
61
|
+
end
|
62
|
+
# and calling it again returns the same object
|
63
|
+
begin
|
64
|
+
cmd = Command.instance
|
65
|
+
assert_equal( cmd.working_dir, "/one/two/three" )
|
34
66
|
end
|
67
|
+
# but instance in another thread should be different
|
68
|
+
Thread.new do
|
69
|
+
cmd = Command.instance
|
70
|
+
assert_not_equal( cmd.working_dir, "/one/two/three" )
|
71
|
+
end.join()
|
72
|
+
# ...and calling it *again* returns the same object
|
73
|
+
begin
|
74
|
+
cmd = Command.instance
|
75
|
+
assert_equal( cmd.working_dir, "/one/two/three" )
|
76
|
+
end
|
77
|
+
# but discard tosses this thread's object:
|
78
|
+
Command.discard
|
79
|
+
begin
|
80
|
+
cmd = Command.instance
|
81
|
+
assert_not_equal( cmd.working_dir, "/one/two/three" )
|
82
|
+
end
|
83
|
+
|
35
84
|
end
|
36
85
|
|
37
86
|
end
|
data/test/t_scrubio.rb
CHANGED
@@ -99,12 +99,6 @@ end
|
|
99
99
|
|
100
100
|
class BrokenGarbleTest3 < Test::Unit::TestCase
|
101
101
|
include TestBase
|
102
|
-
|
103
|
-
def test_parse
|
104
|
-
# commented out for build only
|
105
|
-
puts "XXX test skipped XXX"
|
106
|
-
end
|
107
|
-
|
108
102
|
def broken; true; end
|
109
103
|
def fixable; true; end
|
110
104
|
def input
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rscm-accurev
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
6
|
+
version: 0.0.2
|
7
7
|
date: 2005-08-10 00:00:00 -05:00
|
8
8
|
summary: "RSCM::Accurev - RSCM API for Accurev"
|
9
9
|
require_paths:
|
@@ -29,30 +29,34 @@ cert_chain:
|
|
29
29
|
authors:
|
30
30
|
- Greg Fast
|
31
31
|
files:
|
32
|
-
-
|
32
|
+
- apitest.rb
|
33
|
+
- bumprelease.sh
|
33
34
|
- lib
|
34
35
|
- LICENSE
|
35
36
|
- Rakefile
|
36
37
|
- README
|
37
38
|
- test
|
38
|
-
- test.rb
|
39
|
-
- testing.log
|
40
39
|
- tmp
|
41
40
|
- TODO
|
42
41
|
- lib/rscm
|
43
42
|
- lib/rscm/accurev.rb
|
44
43
|
- lib/rscm/scm
|
45
44
|
- lib/rscm/scm/accurev
|
46
|
-
- "lib/rscm/scm/accurev/#
|
45
|
+
- "lib/rscm/scm/accurev/#api.rb#"
|
47
46
|
- lib/rscm/scm/accurev/api.rb
|
48
47
|
- lib/rscm/scm/accurev/command.rb
|
49
48
|
- lib/rscm/scm/accurev/filterio.rb
|
50
49
|
- lib/rscm/scm/accurev/xml.rb
|
51
50
|
- test/acreplay.rb
|
51
|
+
- test/eg
|
52
|
+
- test/t_api.rb
|
52
53
|
- test/t_command.rb
|
53
54
|
- test/t_filterio.rb
|
54
55
|
- test/t_load.rb
|
55
56
|
- test/t_scrubio.rb
|
57
|
+
- test/eg/ac-files.xml
|
58
|
+
- test/eg/update-newwksp.xml
|
59
|
+
- test/eg/update-stale.xml
|
56
60
|
test_files: []
|
57
61
|
rdoc_options:
|
58
62
|
- "--line-numbers"
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'singleton'
|
4
|
-
|
5
|
-
module RSCM
|
6
|
-
module Accurev
|
7
|
-
|
8
|
-
class Command
|
9
|
-
include Singleton
|
10
|
-
#Thread.current[:foo]
|
11
|
-
|
12
|
-
attr_accessor :debug, :debug_to, :accurev, :working_dir
|
13
|
-
|
14
|
-
def initialize( working_dir="." )
|
15
|
-
@debug = false
|
16
|
-
@debug_to = STDOUT
|
17
|
-
@accurev = "accurev"
|
18
|
-
@working_dir = working_dir
|
19
|
-
end
|
20
|
-
|
21
|
-
def accurev_cmdline( cmd, *opts )
|
22
|
-
return "#{@accurev} #{cmd} #{opts.join(' ')}";
|
23
|
-
end
|
24
|
-
|
25
|
-
# Execute the given accurev subcommand, and return its
|
26
|
-
# output as a plain uninterpreted string.
|
27
|
-
# Not all accurev subcommands (eg, `accurev info`) support
|
28
|
-
# `-fx` for xml output.
|
29
|
-
def accurev_nofx( cmd, *opts )
|
30
|
-
# nativepath_to_filepath is actually generic to native
|
31
|
-
dir = PathConverter.nativepath_to_filepath( @working_dir )
|
32
|
-
dir = File.expand_path( dir )
|
33
|
-
with_working_dir( dir ) do
|
34
|
-
cmdline = self.accurev_cmdline( cmd, opts )
|
35
|
-
if @debug
|
36
|
-
@debug_to.puts("ac> #{cmdline}")
|
37
|
-
end
|
38
|
-
Better.popen( cmdline ) do |stdout|
|
39
|
-
return stdout.read()
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Execute the given accurev subcommand, and return its
|
45
|
-
# output as an REXML document. The options list to the command
|
46
|
-
# will automatically have `-fx` prepended, to specify xml output.
|
47
|
-
# Certain quirks in <AcResponse>-type documents will be
|
48
|
-
# corrected (see Accurev::AcXMLScrubIO).
|
49
|
-
def accurev( cmd, *opts )
|
50
|
-
# nativepath_to_filepath is actually generic to native
|
51
|
-
dir = PathConverter.nativepath_to_filepath( @working_dir )
|
52
|
-
dir = File.expand_path( dir )
|
53
|
-
opts << "-fx"
|
54
|
-
with_working_dir( dir ) do
|
55
|
-
cmdline = self.accurev_cmdline( cmd, opts )
|
56
|
-
if @debug
|
57
|
-
@debug_to.puts("ac> #{cmdline}")
|
58
|
-
end
|
59
|
-
Better.popen( cmdline ) do |stdout|
|
60
|
-
output = stdout.read()
|
61
|
-
if @debug
|
62
|
-
@debug_to.puts( "raw>\n#{output}" )
|
63
|
-
end
|
64
|
-
begin
|
65
|
-
return REXML::Document.new( AcXMLScrubIO.new( output ) )
|
66
|
-
rescue Exception => e
|
67
|
-
raise "Unexpected output from #{cmdline}: #{e}"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Execute the given accurev subcommand using +accurev+,
|
74
|
-
# and return the <element> REXML elements from the
|
75
|
-
# resulting document.
|
76
|
-
# For ac commands which emit the common <elements> format.
|
77
|
-
def accurev_elements( mapclass, cmd, *opts )
|
78
|
-
doc = self.accurev( cmd, opts )
|
79
|
-
if @debug
|
80
|
-
@debug_to.puts( doc )
|
81
|
-
end
|
82
|
-
if doc.elements.size==0
|
83
|
-
raise "Unexpected output from #{cmd}: #{doc}"
|
84
|
-
end
|
85
|
-
doc.elements.each( "/AcResponse/element" ) do |e|
|
86
|
-
o = mapclass.new( e )
|
87
|
-
yield o
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
|