author | Merge Script |
Thu, 07 Apr 2016 07:08:20 +0200 | |
branch | jv |
changeset 1009 | e25edee0d1e7 |
parent 995 | 92bb466548a9 |
child 1121 | c5661215109c |
permissions | -rw-r--r-- |
133 | 1 |
"{ Package: 'stx:goodies/monticello' }" |
2 |
||
995
92bb466548a9
Removed test classes from stx:goodies/monticello - they're in tests sub package.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
602
diff
changeset
|
3 |
"{ NameSpace: Smalltalk }" |
92bb466548a9
Removed test classes from stx:goodies/monticello - they're in tests sub package.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
602
diff
changeset
|
4 |
|
133 | 5 |
MCTool subclass:#MCWorkingCopyBrowser |
6 |
instanceVariableNames:'workingCopy workingCopyWrapper repository defaults' |
|
7 |
classVariableNames:'' |
|
8 |
poolDictionaries:'' |
|
602 | 9 |
category:'SCM-Monticello-UI' |
133 | 10 |
! |
11 |
||
12 |
||
13 |
!MCWorkingCopyBrowser class methodsFor:'as yet unclassified'! |
|
14 |
||
15 |
initialize |
|
16 |
(TheWorldMenu respondsTo: #registerOpenCommand:) |
|
17 |
ifTrue: [TheWorldMenu registerOpenCommand: {'Monticello Browser'. {self. #open}}] |
|
18 |
! |
|
19 |
||
20 |
new |
|
21 |
^ self basicNew initialize |
|
22 |
! |
|
23 |
||
24 |
open |
|
25 |
self new show |
|
26 |
! ! |
|
27 |
||
28 |
!MCWorkingCopyBrowser methodsFor:'actions'! |
|
29 |
||
30 |
addRepository |
|
31 |
self newRepository ifNotNilDo: |
|
32 |
[:repos | self addRepository: repos ]. |
|
33 |
! |
|
34 |
||
35 |
addRepository: aRepository |
|
36 |
self repository: aRepository. |
|
37 |
self repositoryGroup addRepository: aRepository. |
|
38 |
self changed: #repositoryList; changed: #repositorySelection. |
|
39 |
self changedButtons. |
|
40 |
! |
|
41 |
||
42 |
addRepositoryToPackage |
|
43 |
self repository ifNotNilDo: |
|
44 |
[:repos | |
|
45 |
(self pickWorkingCopySatisfying: [ :p | (p repositoryGroup includes: repos) not ]) ifNotNilDo: |
|
46 |
[:wc | |
|
47 |
workingCopy _ wc. |
|
48 |
workingCopy repositoryGroup addRepository: repos. |
|
49 |
self repository: repos. |
|
50 |
self |
|
51 |
changed: #workingCopySelection; |
|
52 |
changed: #repositoryList; |
|
53 |
changed: #repositorySelection. |
|
54 |
self changedButtons]] |
|
55 |
! |
|
56 |
||
57 |
addRepositoryToWorkingCopy |
|
58 |
workingCopy ifNotNilDo: |
|
59 |
[:wc | |
|
60 |
workingCopy repositoryGroup addRepository: self repository. |
|
61 |
self |
|
62 |
changed: #workingCopySelection; |
|
63 |
changed: #repositoryList; |
|
64 |
changed: #repositorySelection. |
|
65 |
self changedButtons] |
|
66 |
! |
|
67 |
||
68 |
addRequiredPackage |
|
69 |
workingCopy ifNotNilDo: |
|
70 |
[:wc | |
|
71 |
self pickWorkingCopy ifNotNilDo: |
|
72 |
[:required | |
|
73 |
wc requirePackage: required package. |
|
74 |
self workingCopyListChanged]] |
|
75 |
! |
|
76 |
||
77 |
addWorkingCopy |
|
78 |
|name| |
|
79 |
name _ FillInTheBlankMorph request: 'Name of package:'. |
|
80 |
name isEmptyOrNil ifFalse: |
|
81 |
[PackageInfo registerPackageName: name. |
|
82 |
workingCopy _ MCWorkingCopy forPackage: (MCPackage new name: name). |
|
83 |
workingCopyWrapper _ nil. |
|
84 |
self repositorySelection: 0]. |
|
85 |
self workingCopyListChanged; changed: #workingCopySelection; changed: #repositoryList. |
|
86 |
self changedButtons. |
|
87 |
! |
|
88 |
||
89 |
backportChanges |
|
90 |
self canBackport ifFalse: [^self]. |
|
91 |
workingCopy ifNotNil: |
|
92 |
[workingCopy needsSaving ifTrue: [^ self inform: 'You must save the working copy before backporting.']. |
|
93 |
self pickAncestorVersionInfo ifNotNilDo: |
|
94 |
[:baseVersionInfo | |
|
95 |
workingCopy backportChangesTo: baseVersionInfo]] |
|
96 |
! |
|
97 |
||
98 |
browseWorkingCopy |
|
99 |
workingCopy ifNotNil: |
|
100 |
[(MCSnapshotBrowser forSnapshot: workingCopy package snapshot) |
|
101 |
label: 'Snapshot Browser: ', workingCopy packageName; |
|
102 |
show] |
|
103 |
! |
|
104 |
||
105 |
canBackport |
|
106 |
^ self hasWorkingCopy and: [workingCopy needsSaving not] |
|
107 |
! |
|
108 |
||
109 |
checkForNewerVersions |
|
110 |
| newer | |
|
111 |
newer _ workingCopy possiblyNewerVersionsIn: self repository. |
|
112 |
^ newer isEmpty or: [ |
|
113 |
self confirm: 'CAUTION!! These versions in the repository may be newer:', |
|
114 |
String cr, newer asString, String cr, |
|
115 |
'Do you really want to save this version?']. |
|
116 |
! |
|
117 |
||
118 |
clearRequiredPackages |
|
119 |
workingCopy ifNotNilDo: |
|
120 |
[:wc | |
|
121 |
wc clearRequiredPackages. |
|
122 |
self workingCopyListChanged] |
|
123 |
! |
|
124 |
||
125 |
deleteWorkingCopy |
|
126 |
workingCopy unregister. |
|
127 |
self workingCopySelection: 0. |
|
128 |
self workingCopyListChanged. |
|
129 |
! |
|
130 |
||
131 |
editRepository |
|
132 |
| newRepo | |
|
133 |
||
134 |
newRepo := self repository openAndEditTemplateCopy. |
|
135 |
newRepo ifNotNil: [ |
|
136 |
newRepo class = self repository class |
|
137 |
ifTrue: [self repository copyFrom: newRepo] |
|
138 |
ifFalse: [self inform: 'Must not change repository type!!']] |
|
139 |
! |
|
140 |
||
141 |
flushAllCaches |
|
142 |
| beforeBytes afterBytes beforeVersions afterVersions | |
|
143 |
Cursor wait showWhile: [ |
|
144 |
beforeBytes := Smalltalk garbageCollect. |
|
145 |
beforeVersions := MCVersion allSubInstances size. |
|
146 |
MCFileBasedRepository flushAllCaches. |
|
147 |
afterBytes := Smalltalk garbageCollect. |
|
148 |
afterVersions := MCVersion allSubInstances size. |
|
149 |
]. |
|
150 |
^self inform: (beforeVersions - afterVersions) asString, ' versions flushed', String cr, |
|
151 |
(afterBytes - beforeBytes) asStringWithCommas, ' bytes reclaimed' |
|
152 |
! |
|
153 |
||
154 |
inspectWorkingCopy |
|
155 |
workingCopy ifNotNil: [workingCopy inspect] |
|
156 |
! |
|
157 |
||
158 |
loadRepositories |
|
159 |
FileStream fileIn: 'MCRepositories.st'. |
|
160 |
self changed: #repositoryList. |
|
161 |
self changedButtons. |
|
162 |
! |
|
163 |
||
164 |
newRepository |
|
165 |
| types index | |
|
166 |
types _ MCRepository allConcreteSubclasses asArray. |
|
167 |
index _ (PopUpMenu labelArray: (types collect: [:ea | ea description])) |
|
168 |
startUpWithCaption: 'Repository type:'. |
|
169 |
^ index = 0 ifFalse: [(types at: index) morphicConfigure] |
|
170 |
! |
|
171 |
||
172 |
openRepository |
|
173 |
self repository ifNotNilDo: [:repos | repos morphicOpen: workingCopy ] |
|
174 |
! |
|
175 |
||
176 |
recompilePackage |
|
177 |
workingCopy package packageInfo methods |
|
178 |
do: [:ea | ea actualClass recompile: ea methodSymbol] |
|
179 |
displayingProgress: 'Recompiling...' |
|
180 |
! |
|
181 |
||
182 |
removeRepository |
|
183 |
self repository ifNotNilDo: |
|
184 |
[:repos | |
|
185 |
self repositoryGroup removeRepository: repos. |
|
186 |
self repositorySelection: (1 min: self repositories size)]. |
|
187 |
self changed: #repositoryList. |
|
188 |
self changedButtons. |
|
189 |
! |
|
190 |
||
191 |
repository |
|
192 |
workingCopy ifNotNil: [repository _ self defaults at: workingCopy ifAbsent: []]. |
|
193 |
^ repository |
|
194 |
! |
|
195 |
||
196 |
repository: aRepository |
|
197 |
repository _ aRepository. |
|
198 |
workingCopy ifNotNil: [self defaults at: workingCopy put: aRepository] |
|
199 |
! |
|
200 |
||
201 |
revertPackage |
|
202 |
self pickAncestorVersionInfo ifNotNilDo: [:info | |
|
203 |
(self repositoryGroup versionWithInfo: info |
|
204 |
ifNone: [^self inform: 'No repository found for ', info name] |
|
205 |
) load] |
|
206 |
! |
|
207 |
||
208 |
saveRepositories |
|
209 |
| f | |
|
210 |
f := FileStream forceNewFileNamed: 'MCRepositories.st'. |
|
211 |
MCRepositoryGroup default repositoriesDo: [:r | |
|
212 |
f nextPutAll: 'MCRepositoryGroup default addRepository: (', r asCreationTemplate, ')!!'; cr.] |
|
213 |
! |
|
214 |
||
215 |
saveVersion |
|
216 |
| repo | |
|
217 |
self canSave ifFalse: [^self]. |
|
218 |
self checkForNewerVersions ifFalse: [^self]. |
|
219 |
repo _ self repository. |
|
220 |
workingCopy newVersion ifNotNilDo: |
|
221 |
[:v | |
|
222 |
(MCVersionInspector new version: v) show. |
|
223 |
Cursor wait showWhile: [repo storeVersion: v]. |
|
224 |
MCCacheRepository default cacheAllFileNamesDuring: |
|
225 |
[repo cacheAllFileNamesDuring: |
|
226 |
[v allAvailableDependenciesDo: |
|
227 |
[:dep | |
|
228 |
(repo includesVersionNamed: dep info name) |
|
229 |
ifFalse: [repo storeVersion: dep]]]]] |
|
230 |
! |
|
231 |
||
232 |
trimAncestry |
|
233 |
self pickAncestorVersionInfo ifNotNilDo: |
|
234 |
[:ancestor | |
|
235 |
workingCopy ancestry trimAfterVersionInfo: ancestor] |
|
236 |
! |
|
237 |
||
238 |
unloadPackage |
|
239 |
workingCopy unload. |
|
240 |
self workingCopySelection: 0. |
|
241 |
self workingCopyListChanged. |
|
242 |
! |
|
243 |
||
244 |
viewChanges |
|
245 |
| patch | |
|
246 |
self canSave ifTrue: |
|
247 |
[patch _ workingCopy changesRelativeToRepository: self repository. |
|
248 |
patch isNil ifTrue: [^ self]. |
|
249 |
patch isEmpty |
|
250 |
ifTrue: [ workingCopy modified: false. |
|
251 |
self inform: 'No changes' ] |
|
252 |
ifFalse: |
|
253 |
[ workingCopy modified: true. |
|
254 |
(MCPatchBrowser forPatch: patch) |
|
255 |
label: 'Patch Browser: ', workingCopy description; |
|
256 |
show]] |
|
257 |
! |
|
258 |
||
259 |
viewHistory |
|
260 |
workingCopy ifNotNil: |
|
261 |
[(MCWorkingHistoryBrowser new |
|
262 |
ancestry: workingCopy ancestry; |
|
263 |
package: workingCopy package) |
|
264 |
label: 'Version History: ', workingCopy packageName; |
|
265 |
show] |
|
266 |
! ! |
|
267 |
||
268 |
!MCWorkingCopyBrowser methodsFor:'morphic ui'! |
|
269 |
||
270 |
buttonSpecs |
|
271 |
^ #( |
|
272 |
('+Package' addWorkingCopy 'Add a new package and make it the working copy') |
|
273 |
(Browse browseWorkingCopy 'Browse the working copy of the selected package' hasWorkingCopy) |
|
274 |
(Scripts editLoadScripts 'Edit the load/unload scripts of this package' hasWorkingCopy) |
|
275 |
(History viewHistory 'View the working copy''s history' hasWorkingCopy) |
|
276 |
(Changes viewChanges 'View the working copy''s changes relative to the installed version from the repository' canSave) |
|
277 |
(Backport backportChanges 'Backport the working copy''s changes to an ancestor' canBackport) |
|
278 |
(Save saveVersion 'Save the working copy as a new version to the selected repository' canSave) |
|
279 |
('+Repository' addRepository 'Add an existing repository to the list of those visible') |
|
280 |
(Open openRepository 'Open a browser on the selected repository' hasRepository) |
|
281 |
) |
|
282 |
! |
|
283 |
||
284 |
canSave |
|
285 |
^ self hasWorkingCopy and: [self hasRepository] |
|
286 |
! |
|
287 |
||
288 |
changedButtons |
|
289 |
self changed: #hasWorkingCopy. |
|
290 |
self changed: #canSave. |
|
291 |
self changed: #canBackport. |
|
292 |
self changed: #hasRepository. |
|
293 |
! |
|
294 |
||
295 |
defaultExtent |
|
296 |
^ 550@200 |
|
297 |
! |
|
298 |
||
299 |
defaultLabel |
|
300 |
^ 'Monticello Browser' |
|
301 |
! |
|
302 |
||
303 |
defaults |
|
304 |
^ defaults ifNil: [defaults _ Dictionary new] |
|
305 |
! |
|
306 |
||
307 |
editLoadScripts |
|
308 |
||
309 |
| menu | |
|
310 |
self hasWorkingCopy ifFalse: [^self]. |
|
311 |
menu _ MenuMorph new defaultTarget: self. |
|
312 |
menu add: 'edit preamble' selector: #editScript: argument: #preamble. |
|
313 |
menu add: 'edit postscript' selector: #editScript: argument: #postscript. |
|
314 |
menu add: 'edit preambleOfRemoval' selector: #editScript: argument: #preambleOfRemoval. |
|
315 |
menu add: 'edit postscriptOfRemoval' selector: #editScript: argument: #postscriptOfRemoval. |
|
316 |
menu popUpInWorld. |
|
317 |
! |
|
318 |
||
319 |
editScript: scriptSymbol |
|
320 |
||
321 |
| script | |
|
322 |
script _ workingCopy packageInfo perform: scriptSymbol. |
|
323 |
script openLabel: scriptSymbol asString, ' of the Package ', workingCopy package name. |
|
324 |
! |
|
325 |
||
326 |
hasRepository |
|
327 |
^ self repository notNil |
|
328 |
! |
|
329 |
||
330 |
hasWorkingCopy |
|
331 |
^ workingCopy notNil |
|
332 |
! |
|
333 |
||
334 |
initialize |
|
335 |
MCWorkingCopy addDependent: self. |
|
336 |
self workingCopies do: [:ea | ea addDependent: self]. |
|
337 |
! |
|
338 |
||
339 |
pickAncestorVersionInfo |
|
340 |
| ancestors index | |
|
341 |
ancestors _ workingCopy ancestry breadthFirstAncestors. |
|
342 |
index _ (PopUpMenu labelArray: (ancestors collect: [:ea | ea name])) |
|
343 |
startUpWithCaption: 'Ancestor:'. |
|
344 |
^ index = 0 ifFalse: [ ancestors at: index] |
|
345 |
! |
|
346 |
||
347 |
pickWorkingCopy |
|
348 |
^self pickWorkingCopySatisfying: [ :c | true ] |
|
349 |
! |
|
350 |
||
351 |
pickWorkingCopySatisfying: aBlock |
|
352 |
| copies index | |
|
353 |
copies _ self workingCopies select: aBlock. |
|
354 |
copies isEmpty ifTrue: [ ^nil ]. |
|
355 |
index _ (PopUpMenu labelArray: (copies collect: [:ea | ea packageName])) |
|
356 |
startUpWithCaption: 'Package:'. |
|
357 |
^ index = 0 ifFalse: [ copies at: index] |
|
358 |
! |
|
359 |
||
360 |
repositories |
|
361 |
^ self repositoryGroup repositories |
|
362 |
! |
|
363 |
||
364 |
repositoryGroup |
|
365 |
^ workingCopy |
|
366 |
ifNil: [MCRepositoryGroup default] |
|
367 |
ifNotNil: [workingCopy repositoryGroup] |
|
368 |
! |
|
369 |
||
370 |
repositoryList |
|
371 |
^ self repositories collect: [:ea | ea description] |
|
372 |
! |
|
373 |
||
374 |
repositoryListMenu: aMenu |
|
375 |
self repository ifNil: [^ aMenu]. |
|
376 |
self fillMenu: aMenu fromSpecs: |
|
377 |
#(('open repository' #openRepository) |
|
378 |
('edit repository info' #editRepository) |
|
379 |
('add to package...' #addRepositoryToPackage) |
|
380 |
('remove repository' #removeRepository) |
|
381 |
('load repositories' #loadRepositories) |
|
382 |
('save repositories' #saveRepositories) |
|
383 |
('flush cached versions' #flushAllCaches) |
|
384 |
). |
|
385 |
aMenu |
|
386 |
add: (self repository alwaysStoreDiffs |
|
387 |
ifTrue: ['store full versions'] |
|
388 |
ifFalse: ['store diffs']) |
|
389 |
target: self |
|
390 |
selector: #toggleDiffs. |
|
391 |
^ aMenu |
|
392 |
||
393 |
! |
|
394 |
||
395 |
repositorySelection |
|
396 |
^ self repositories indexOf: self repository |
|
397 |
! |
|
398 |
||
399 |
repositorySelection: aNumber |
|
400 |
aNumber = 0 |
|
401 |
ifTrue: [self repository: nil] |
|
402 |
ifFalse: [self repository: (self repositories at: aNumber)]. |
|
403 |
self changed: #repositorySelection. |
|
404 |
self changedButtons. |
|
405 |
! |
|
406 |
||
407 |
toggleDiffs |
|
408 |
self repository alwaysStoreDiffs |
|
409 |
ifTrue: [self repository doNotAlwaysStoreDiffs] |
|
410 |
ifFalse: [self repository doAlwaysStoreDiffs] |
|
411 |
! |
|
412 |
||
413 |
unsortedWorkingCopies |
|
414 |
^ MCWorkingCopy allManagers |
|
415 |
! |
|
416 |
||
417 |
update: aSymbol |
|
418 |
self unsortedWorkingCopies do: [:ea | ea addDependent: self]. |
|
419 |
self workingCopyListChanged. |
|
420 |
! |
|
421 |
||
422 |
widgetSpecs |
|
423 |
^ #( |
|
424 |
((buttonRow) (0 0 1 0) (0 0 0 30)) |
|
425 |
((treeOrListMorph: workingCopy) (0 0 0.5 1) (0 30 0 0)) |
|
426 |
((listMorph: repository) (0.5 0 1 1) (0 30 0 0)) |
|
427 |
) |
|
428 |
! |
|
429 |
||
430 |
workingCopies |
|
431 |
^ MCWorkingCopy allManagers asSortedCollection: |
|
432 |
[ :a :b | a package name <= b package name ] |
|
433 |
! |
|
434 |
||
435 |
workingCopy: wc |
|
436 |
workingCopy _ wc. |
|
437 |
self changed: #workingCopyList; changed: #workingCopySelection; changed: #repositoryList. |
|
438 |
self changedButtons. |
|
439 |
! |
|
440 |
||
441 |
workingCopyList |
|
442 |
^ self workingCopies collect: |
|
443 |
[:ea | |
|
444 |
(workingCopy notNil and: [workingCopy requiredPackages includes: ea package]) |
|
445 |
ifTrue: [Text string: ea description emphasis: (Array with: TextEmphasis bold)] |
|
446 |
ifFalse: [ea description]] |
|
447 |
! |
|
448 |
||
449 |
workingCopyListChanged |
|
450 |
self changed: #workingCopyList. |
|
451 |
self changed: #workingCopyTree. |
|
452 |
self changedButtons. |
|
453 |
! |
|
454 |
||
455 |
workingCopyListMenu: aMenu |
|
456 |
workingCopy ifNil: [^ aMenu]. |
|
457 |
self fillMenu: aMenu fromSpecs: |
|
458 |
#(('add required package' #addRequiredPackage) |
|
459 |
('clear required packages' #clearRequiredPackages) |
|
460 |
('browse package' #browseWorkingCopy) |
|
461 |
('view changes' #viewChanges) |
|
462 |
('view history' #viewHistory) |
|
463 |
('recompile package' #recompilePackage) |
|
464 |
('revert package...' #revertPackage) |
|
465 |
('trim ancestry' #trimAncestry) |
|
466 |
('unload package' #unloadPackage) |
|
467 |
('delete working copy' #deleteWorkingCopy)). |
|
468 |
(Smalltalk includesKey: #SARMCPackageDumper) ifTrue: [ |
|
469 |
aMenu add: 'make SAR' target: self selector: #fileOutAsSAR |
|
470 |
]. |
|
471 |
^aMenu |
|
472 |
! |
|
473 |
||
474 |
workingCopyListMorph |
|
475 |
^ PluggableMultiColumnListMorph |
|
476 |
on: self |
|
477 |
list: #workingCopyList |
|
478 |
selected: #workingCopySelection |
|
479 |
changeSelected: #workingCopySelection: |
|
480 |
menu: #workingCopyListMenu: |
|
481 |
! |
|
482 |
||
483 |
workingCopySelection |
|
484 |
^ self workingCopies indexOf: workingCopy |
|
485 |
! |
|
486 |
||
487 |
workingCopySelection: aNumber |
|
488 |
self workingCopy: |
|
489 |
(aNumber = 0 |
|
490 |
ifTrue:[nil] |
|
491 |
ifFalse:[self workingCopies at: aNumber]). |
|
492 |
! |
|
493 |
||
494 |
workingCopySelectionWrapper |
|
495 |
^workingCopyWrapper |
|
496 |
! |
|
497 |
||
498 |
workingCopySelectionWrapper: aWrapper |
|
499 |
workingCopyWrapper := aWrapper. |
|
500 |
self changed: #workingCopySelectionWrapper. |
|
501 |
self workingCopy: (aWrapper ifNotNil:[aWrapper item]) |
|
502 |
! |
|
503 |
||
504 |
workingCopyTree |
|
505 |
^ self workingCopies collect:[:each| MCDependentsWrapper with: each model: self]. |
|
506 |
! |
|
507 |
||
508 |
workingCopyTreeMenu: aMenu |
|
509 |
workingCopy ifNil: [^ aMenu]. |
|
510 |
self fillMenu: aMenu fromSpecs: |
|
511 |
#(('add required package' #addRequiredPackage) |
|
512 |
('clear required packages' #clearRequiredPackages) |
|
513 |
('browse package' #browseWorkingCopy) |
|
514 |
('view changes' #viewChanges) |
|
515 |
('view history' #viewHistory) |
|
516 |
('recompile package' #recompilePackage) |
|
517 |
('revert package...' #revertPackage) |
|
518 |
('unload package' #unloadPackage) |
|
519 |
('trim ancestry' #trimAncestry) |
|
520 |
('delete working copy' #deleteWorkingCopy) |
|
521 |
('inspect working copy' #inspectWorkingCopy)). |
|
522 |
(Smalltalk includesKey: #SARMCPackageDumper) ifTrue: [ |
|
523 |
aMenu add: 'make SAR' target: self selector: #fileOutAsSAR |
|
524 |
]. |
|
525 |
^aMenu |
|
526 |
! |
|
527 |
||
528 |
workingCopyTreeMorph |
|
529 |
^ SimpleHierarchicalListMorph |
|
530 |
on: self |
|
531 |
list: #workingCopyTree |
|
532 |
selected: #workingCopyWrapper |
|
533 |
changeSelected: #workingCopyWrapper: |
|
534 |
menu: #workingCopyListMenu: |
|
535 |
! ! |
|
536 |
||
537 |
!MCWorkingCopyBrowser class methodsFor:'documentation'! |
|
538 |
||
539 |
version |
|
602 | 540 |
^ '$Header: /cvs/stx/stx/goodies/monticello/MCWorkingCopyBrowser.st,v 1.2 2012-09-11 21:15:12 cg Exp $' |
133 | 541 |
! ! |
542 |
||
995
92bb466548a9
Removed test classes from stx:goodies/monticello - they're in tests sub package.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
602
diff
changeset
|
543 |
|
133 | 544 |
MCWorkingCopyBrowser initialize! |