author | Claus Gittinger <cg@exept.de> |
Thu, 13 Feb 2003 13:27:29 +0100 | |
changeset 1144 | 75008d5f9632 |
parent 1139 | aea281a4e983 |
child 1145 | 9a6688b7139a |
permissions | -rw-r--r-- |
1085 | 1 |
"{ Package: 'stx:libbasic2' }" |
2 |
||
3 |
Object subclass:#Archiver |
|
1089 | 4 |
instanceVariableNames:'process temporaryDirectory fileName outStream errorStream |
5 |
synchron' |
|
6 |
classVariableNames:'' |
|
7 |
poolDictionaries:'' |
|
8 |
category:'System-Support-FileFormats' |
|
1085 | 9 |
! |
10 |
||
11 |
Archiver subclass:#GZipArchive |
|
1089 | 12 |
instanceVariableNames:'' |
13 |
classVariableNames:'' |
|
14 |
poolDictionaries:'' |
|
15 |
privateIn:Archiver |
|
1085 | 16 |
! |
17 |
||
18 |
Archiver subclass:#TarArchive |
|
1089 | 19 |
instanceVariableNames:'' |
20 |
classVariableNames:'' |
|
21 |
poolDictionaries:'' |
|
22 |
privateIn:Archiver |
|
1085 | 23 |
! |
24 |
||
25 |
Archiver subclass:#TarGZipArchive |
|
1089 | 26 |
instanceVariableNames:'tarArchiver tarFile' |
27 |
classVariableNames:'' |
|
28 |
poolDictionaries:'' |
|
29 |
privateIn:Archiver |
|
1085 | 30 |
! |
31 |
||
1086 | 32 |
Archiver subclass:#ZipArchive |
1089 | 33 |
instanceVariableNames:'' |
34 |
classVariableNames:'' |
|
35 |
poolDictionaries:'' |
|
36 |
privateIn:Archiver |
|
1086 | 37 |
! |
38 |
||
1085 | 39 |
|
40 |
!Archiver class methodsFor:'instance creation'! |
|
41 |
||
42 |
with:aFilename |
|
43 |
||
44 |
| instance | |
|
45 |
||
46 |
instance := self new. |
|
47 |
instance fileName:aFilename. |
|
48 |
^ instance |
|
49 |
! ! |
|
50 |
||
51 |
!Archiver class methodsFor:'classAccess'! |
|
52 |
||
53 |
gzipArchive |
|
54 |
||
55 |
^ GZipArchive |
|
56 |
! |
|
57 |
||
58 |
tarArchive |
|
59 |
||
60 |
^ TarArchive |
|
61 |
! |
|
62 |
||
63 |
tarGZipArchive |
|
64 |
||
65 |
^ TarGZipArchive |
|
1086 | 66 |
! |
67 |
||
68 |
zipArchive |
|
69 |
||
70 |
^ ZipArchive |
|
1085 | 71 |
! ! |
72 |
||
1086 | 73 |
!Archiver class methodsFor:'queries'! |
74 |
||
75 |
canAddFiles |
|
76 |
||
77 |
^ false |
|
78 |
! |
|
79 |
||
1106 | 80 |
canDragnDrop |
81 |
||
82 |
^ true. |
|
83 |
! |
|
84 |
||
1098 | 85 |
canExtractFiles |
86 |
||
87 |
^ false |
|
88 |
! |
|
89 |
||
1086 | 90 |
canRemoveFiles |
91 |
||
92 |
^ false |
|
93 |
! |
|
94 |
||
1106 | 95 |
canViewFile |
96 |
||
97 |
^ false |
|
98 |
! |
|
99 |
||
1086 | 100 |
hasTitleLine |
101 |
||
102 |
^ false |
|
103 |
! ! |
|
104 |
||
1085 | 105 |
!Archiver methodsFor:'accessing'! |
106 |
||
107 |
errorStream |
|
108 |
"return the value of the instance variable 'errorStream' (automatically generated)" |
|
109 |
||
110 |
^ errorStream |
|
111 |
! |
|
112 |
||
113 |
errorStream:something |
|
114 |
"set the value of the instance variable 'errorStream' (automatically generated)" |
|
115 |
||
116 |
errorStream := something. |
|
117 |
! |
|
118 |
||
119 |
fileName |
|
120 |
"return the value of the instance variable 'fileName' (automatically generated)" |
|
121 |
||
122 |
^ fileName |
|
123 |
! |
|
124 |
||
125 |
fileName:something |
|
126 |
"set the value of the instance variable 'fileName' (automatically generated)" |
|
127 |
||
128 |
fileName := something. |
|
129 |
! |
|
130 |
||
131 |
outStream |
|
132 |
"return the value of the instance variable 'outStream' (automatically generated)" |
|
133 |
||
134 |
^ outStream |
|
135 |
! |
|
136 |
||
137 |
outStream:something |
|
138 |
"set the value of the instance variable 'outStream' (automatically generated)" |
|
139 |
||
140 |
outStream := something. |
|
141 |
! |
|
142 |
||
143 |
process |
|
144 |
"return the value of the instance variable 'process' (automatically generated)" |
|
145 |
||
146 |
^ process |
|
147 |
! |
|
148 |
||
149 |
process:something |
|
150 |
"set the value of the instance variable 'process' (automatically generated)" |
|
151 |
||
152 |
process := something. |
|
153 |
! |
|
154 |
||
155 |
synchron |
|
156 |
"return the value of the instance variable 'synchron' (automatically generated)" |
|
157 |
||
158 |
^ synchron |
|
159 |
! |
|
160 |
||
161 |
synchron:something |
|
162 |
"set the value of the instance variable 'synchron' (automatically generated)" |
|
163 |
||
164 |
synchron := something. |
|
165 |
! |
|
166 |
||
167 |
temporaryDirectory |
|
168 |
"return the value of the instance variable 'temporaryDirectory' (automatically generated)" |
|
169 |
||
170 |
temporaryDirectory isNil ifTrue:[ |
|
171 |
temporaryDirectory := Filename newTemporary. |
|
172 |
temporaryDirectory makeDirectory. |
|
173 |
]. |
|
174 |
^ temporaryDirectory |
|
175 |
! ! |
|
176 |
||
177 |
!Archiver methodsFor:'actions'! |
|
178 |
||
179 |
addFilesToArchiv:colOfFiles |
|
180 |
||
181 |
self subclassResponsibility. |
|
182 |
! |
|
183 |
||
184 |
extractTo:aColOfFiles |
|
185 |
||
186 |
self subclassResponsibility. |
|
187 |
! |
|
188 |
||
189 |
listFilesFromArchiv |
|
190 |
||
191 |
self subclassResponsibility. |
|
192 |
! |
|
193 |
||
194 |
removeFilesFromArchiv:aColOfFiles |
|
195 |
||
196 |
self subclassResponsibility. |
|
197 |
! ! |
|
198 |
||
199 |
!Archiver methodsFor:'actions private'! |
|
200 |
||
201 |
removeTemporaryDirectory |
|
202 |
||
203 |
| tmp | |
|
204 |
||
205 |
temporaryDirectory notNil ifTrue:[ |
|
206 |
tmp := self temporaryDirectory. |
|
207 |
(FileDirectory directoryNamed:(tmp directory)) removeDirectory:tmp baseName. |
|
208 |
temporaryDirectory := nil. |
|
209 |
]. |
|
210 |
! |
|
211 |
||
212 |
stopProcess |
|
213 |
||
214 |
process notNil ifTrue:[ |
|
215 |
process terminateWithAllSubprocesses. |
|
216 |
process waitUntilTerminated. |
|
217 |
]. |
|
218 |
! ! |
|
219 |
||
220 |
!Archiver methodsFor:'command execution'! |
|
221 |
||
222 |
executeCommand:cmd directory:aDirectory |
|
223 |
||
224 |
||
225 |
synchron isNil ifTrue:[synchron := true]. |
|
226 |
synchron ifTrue:[ |
|
227 |
OperatingSystem |
|
228 |
executeCommand:cmd |
|
229 |
inputFrom:nil |
|
230 |
outputTo:outStream |
|
231 |
errorTo:errorStream |
|
232 |
inDirectory:aDirectory |
|
233 |
lineWise:true |
|
234 |
onError:[:status| false]. |
|
235 |
] ifFalse:[ |
|
236 |
process := Process for:[ |
|
237 |
[ |
|
238 |
OperatingSystem |
|
239 |
executeCommand:cmd |
|
240 |
inputFrom:nil |
|
241 |
outputTo:outStream |
|
242 |
errorTo:errorStream |
|
243 |
inDirectory:aDirectory |
|
244 |
lineWise:true |
|
245 |
onError:[:status| false]. |
|
246 |
] |
|
247 |
valueNowOrOnUnwindDo:[ |
|
248 |
process := nil. |
|
249 |
]. |
|
250 |
||
251 |
] priority:(Processor systemBackgroundPriority). |
|
252 |
process name:('ArchivFileCommand command >', cmd). |
|
253 |
process resume. |
|
254 |
] |
|
255 |
! |
|
256 |
||
257 |
outStream:aOutStream errorStream:aErrorStream |
|
258 |
||
259 |
outStream := aOutStream. |
|
260 |
errorStream := aErrorStream. |
|
261 |
! |
|
262 |
||
263 |
outStream:aOutStream errorStream:aErrorStream synchron:aBoolean |
|
264 |
||
265 |
outStream := aOutStream. |
|
266 |
errorStream := aErrorStream. |
|
267 |
synchron := aBoolean |
|
268 |
! ! |
|
269 |
||
270 |
!Archiver methodsFor:'initialization & release'! |
|
271 |
||
272 |
release |
|
273 |
||
274 |
self stopProcess. |
|
275 |
self removeTemporaryDirectory. |
|
276 |
! ! |
|
277 |
||
1086 | 278 |
!Archiver::GZipArchive class methodsFor:'columns'! |
279 |
||
280 |
columns |
|
281 |
||
282 |
"/ columns in stream order |
|
283 |
"/ colums id words to read |
|
284 |
^ #( #(#method 1) |
|
285 |
#(#crc 1) |
|
286 |
#(#dateAndTime 3) |
|
287 |
#(#compressSize 1) |
|
288 |
#(#size 1) |
|
289 |
#(#ratio 1) |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
290 |
#(#fileName #rest) |
1086 | 291 |
) |
292 |
! ! |
|
293 |
||
294 |
!Archiver::GZipArchive class methodsFor:'queries'! |
|
295 |
||
1106 | 296 |
canViewFile |
297 |
||
298 |
^ true |
|
299 |
! |
|
300 |
||
1086 | 301 |
hasTitleLine |
302 |
||
303 |
^ true |
|
304 |
! ! |
|
305 |
||
1085 | 306 |
!Archiver::GZipArchive class methodsFor:'zip archiv command options'! |
307 |
||
308 |
GZipArchivFileOption |
|
309 |
^ 'f' |
|
310 |
! |
|
311 |
||
312 |
GZipArchivUnzipCommand |
|
313 |
^ 'gunzip' |
|
314 |
! |
|
315 |
||
316 |
GZipArchivWriteToStdioOption |
|
317 |
^ 'c' |
|
318 |
! |
|
319 |
||
320 |
GZipArchivZipCommand |
|
321 |
^ 'gzip' |
|
1086 | 322 |
! |
323 |
||
324 |
GZipArchivZipListOption |
|
325 |
^ $l |
|
326 |
! |
|
327 |
||
328 |
GZipArchivZipQuietOption |
|
329 |
^ $q |
|
330 |
! |
|
331 |
||
332 |
GZipArchivZipVerboseOption |
|
333 |
^ $v |
|
1085 | 334 |
! ! |
335 |
||
336 |
!Archiver::GZipArchive methodsFor:'actions'! |
|
337 |
||
1106 | 338 |
extractTo:aDirectory |
339 |
||
340 |
self unzipTo:aDirectory |
|
341 |
! |
|
342 |
||
343 |
extractTo:aDirectory with:extractFiles |
|
344 |
||
345 |
self unzipTo:aDirectory |
|
346 |
! |
|
347 |
||
1086 | 348 |
listFilesFromArchiv |
349 |
||
350 |
| cmd dir| |
|
351 |
||
352 |
self fileName isNil ifTrue:[ ^ self]. |
|
353 |
dir := self fileName directory. |
|
354 |
cmd := self getFileListFromArchivCommand. |
|
355 |
self executeCommand:cmd directory:dir |
|
356 |
! |
|
357 |
||
358 |
listFilesFromArchiv:aCol |
|
359 |
||
360 |
self listFilesFromArchiv |
|
361 |
! |
|
362 |
||
1085 | 363 |
unzipTo:aDirectory |
364 |
||
365 |
| cmd file newFile| |
|
366 |
||
367 |
(aDirectory exists not) ifTrue:[ |
|
368 |
DialogBox warn:'cant unzip to not existing directory ', aDirectory asString. |
|
369 |
]. |
|
370 |
(aDirectory isDirectory not) ifTrue:[ |
|
371 |
DialogBox warn:'cant unzip to file ', aDirectory asString. |
|
372 |
]. |
|
373 |
file := self fileName. |
|
374 |
(file directory asString = aDirectory asString) ifFalse:[ |
|
375 |
file copyTo:(aDirectory construct:(file baseName)). |
|
376 |
]. |
|
377 |
newFile := aDirectory construct:(file baseName). |
|
378 |
cmd := self getUnzipCommandForFile:newFile. |
|
379 |
self executeCommand:cmd directory:aDirectory. |
|
380 |
! |
|
381 |
||
382 |
zipFile:aFile to:newFile |
|
383 |
||
384 |
| cmd directory| |
|
385 |
||
386 |
directory := newFile directory. |
|
387 |
(directory exists not) ifTrue:[ |
|
388 |
DialogBox warn:'cant unzip to not existing directory ', directory asString. |
|
389 |
]. |
|
390 |
(directory isDirectory not) ifTrue:[ |
|
391 |
DialogBox warn:'cant unzip to file ', directory asString. |
|
392 |
]. |
|
393 |
cmd := self getZipCommandForFile:aFile to:newFile. |
|
394 |
self executeCommand:cmd directory:directory. |
|
395 |
newFile exists ifTrue:[ |
|
396 |
self fileName:newFile. |
|
397 |
]. |
|
398 |
! ! |
|
399 |
||
400 |
!Archiver::GZipArchive methodsFor:'command strings'! |
|
401 |
||
1086 | 402 |
getFileListFromArchivCommand |
403 |
||
404 |
| stream cmd| |
|
405 |
||
406 |
stream := WriteStream on:''. |
|
407 |
stream nextPutAll:self class GZipArchivZipCommand. |
|
408 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
409 |
stream nextPut:$-. |
1086 | 410 |
stream nextPut:self class GZipArchivZipListOption. |
411 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
412 |
stream nextPut:$-. |
1086 | 413 |
stream nextPut:self class GZipArchivZipVerboseOption. |
414 |
stream space. |
|
415 |
stream nextPutAll:self fileName baseName. |
|
416 |
cmd := stream contents. |
|
417 |
stream close. |
|
418 |
^ cmd |
|
419 |
! |
|
420 |
||
1085 | 421 |
getUnzipCommand |
422 |
||
423 |
| stream cmd| |
|
424 |
||
425 |
stream := WriteStream on:''. |
|
426 |
stream nextPutAll:self class GZipArchivUnzipCommand. |
|
427 |
stream space. |
|
428 |
stream nextPutAll:self fileName baseName. |
|
429 |
cmd := stream contents. |
|
430 |
stream close. |
|
431 |
^ cmd |
|
432 |
! |
|
433 |
||
434 |
getUnzipCommandForFile:aFileName |
|
435 |
||
436 |
| stream cmd| |
|
437 |
||
438 |
stream := WriteStream on:''. |
|
439 |
stream nextPutAll:self class GZipArchivUnzipCommand. |
|
440 |
stream space. |
|
441 |
stream nextPutAll:aFileName asString. |
|
442 |
cmd := stream contents. |
|
443 |
stream close. |
|
444 |
^ cmd |
|
445 |
! |
|
446 |
||
447 |
getZipCommandForFile:aFileName |
|
448 |
||
449 |
| stream cmd| |
|
450 |
||
451 |
stream := WriteStream on:''. |
|
452 |
stream nextPutAll:self class GZipArchivZipCommand. |
|
453 |
stream space. |
|
454 |
stream nextPutAll:aFileName asString. |
|
455 |
cmd := stream contents. |
|
456 |
stream close. |
|
457 |
^ cmd |
|
458 |
! |
|
459 |
||
460 |
getZipCommandForFile:aFile to:newFile |
|
461 |
| stream cmd| |
|
462 |
||
463 |
stream := WriteStream on:''. |
|
464 |
stream nextPutAll:self class GZipArchivZipCommand. |
|
465 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
466 |
stream nextPut:$-. |
1085 | 467 |
stream nextPutAll:self class GZipArchivWriteToStdioOption. |
468 |
stream space. |
|
469 |
stream nextPutAll:aFile asString. |
|
470 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
471 |
stream nextPut:$>. |
1085 | 472 |
stream space. |
473 |
stream nextPutAll:newFile asString. |
|
474 |
cmd := stream contents. |
|
475 |
stream close. |
|
476 |
^ cmd |
|
477 |
! ! |
|
478 |
||
1086 | 479 |
!Archiver::TarArchive class methodsFor:'columns'! |
480 |
||
481 |
columns |
|
482 |
||
483 |
"/ colums id words to read |
|
484 |
^ #( #(#permissions 1) |
|
485 |
#(#ownerGroup 1) |
|
486 |
#(#size 1) |
|
487 |
#(#dateAndTime 2) |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
488 |
#(#fileName #rest) |
1086 | 489 |
) |
490 |
! ! |
|
491 |
||
1085 | 492 |
!Archiver::TarArchive class methodsFor:'command strings'! |
493 |
||
494 |
TarArchivAddOption |
|
495 |
^ 'r' |
|
496 |
! |
|
497 |
||
498 |
TarArchivCommand |
|
499 |
^ 'tar' |
|
500 |
! |
|
501 |
||
502 |
TarArchivDeleteOption |
|
503 |
^ '--delete' |
|
504 |
! |
|
505 |
||
506 |
TarArchivFileOption |
|
507 |
^ 'f' |
|
508 |
! |
|
509 |
||
510 |
TarArchivListContentsOption |
|
511 |
^ 't' |
|
512 |
! |
|
513 |
||
514 |
TarArchivListOptions |
|
515 |
^ self TarArchivListContentsOption , self TarArchivVerboseOption |
|
516 |
, self TarArchivFileOption |
|
517 |
! |
|
518 |
||
519 |
TarArchivListZippedOptions |
|
520 |
^ self TarArchivListContentsOption , self TarArchivVerboseOption |
|
521 |
, self TarArchivFileOption , self TarArchivZipOption |
|
522 |
! |
|
523 |
||
524 |
TarArchivUnpackInDirectoryOption |
|
525 |
^ '-C ' |
|
526 |
! |
|
527 |
||
528 |
TarArchivUnpackOption |
|
529 |
^ 'x' |
|
530 |
! |
|
531 |
||
532 |
TarArchivVerboseOption |
|
533 |
^ 'v' |
|
534 |
! |
|
535 |
||
536 |
TarArchivZipOption |
|
537 |
^ 'z' |
|
538 |
! ! |
|
539 |
||
1086 | 540 |
!Archiver::TarArchive class methodsFor:'queries'! |
541 |
||
542 |
canAddFiles |
|
543 |
||
544 |
^ true |
|
545 |
! |
|
546 |
||
547 |
canRemoveFiles |
|
548 |
||
549 |
^ true |
|
1106 | 550 |
! |
551 |
||
552 |
canViewFile |
|
553 |
||
554 |
^ true |
|
1086 | 555 |
! ! |
556 |
||
1085 | 557 |
!Archiver::TarArchive methodsFor:'actions'! |
558 |
||
559 |
addFilesToArchiv:colOfFiles |
|
560 |
||
561 |
| cmd tempDir archivFile archivInTemp| |
|
562 |
||
563 |
tempDir := self temporaryDirectory. |
|
564 |
archivFile := self fileName. |
|
565 |
archivInTemp := tempDir construct:(archivFile baseName). |
|
566 |
"/ copy files to be added to tempDir |
|
567 |
colOfFiles do:[ :file | |
|
1088 | 568 |
file recursiveCopyTo:(tempDir construct:(file asFilename baseName)) |
1085 | 569 |
]. |
570 |
||
571 |
"/ copy tar archiv to tempDir |
|
572 |
archivFile copyTo:archivInTemp. |
|
573 |
||
574 |
"/ addFiles to the tar archive |
|
575 |
cmd := self getAddFilesToTarArchiveCommandForArchiv:archivInTemp with:colOfFiles. |
|
576 |
self executeCommand:cmd directory:tempDir. |
|
577 |
||
578 |
"/ copy tar archiv back |
|
579 |
archivInTemp copyTo:(self fileName). |
|
580 |
! |
|
581 |
||
582 |
extractTo:aDirectory |
|
583 |
||
584 |
^ self extractTo:aDirectory with:nil |
|
585 |
! |
|
586 |
||
587 |
extractTo:aDirectory with:files |
|
588 |
||
589 |
|execDir cmd| |
|
590 |
||
591 |
execDir := self fileName directory. |
|
592 |
cmd := self getExtractSelectedFilesCommandForDirectory:aDirectory withSelection:files. |
|
593 |
self executeCommand:cmd directory:execDir. |
|
594 |
! |
|
595 |
||
596 |
extractWithOutDirectoryTo:aDirectory with:files |
|
597 |
||
598 |
|execDir tempDir tempFile| |
|
599 |
||
600 |
execDir := self fileName directory. |
|
601 |
tempDir := self temporaryDirectory. |
|
602 |
self extractTo:tempDir with:files. |
|
603 |
files do:[ : aFileString | |
|
604 |
tempFile := self temporaryDirectory construct:aFileString. |
|
605 |
tempFile exists ifTrue:[ |
|
1131 | 606 |
tempFile recursiveCopyTo:(aDirectory construct:(aFileString asFilename baseName)). |
1085 | 607 |
]. |
608 |
]. |
|
609 |
! |
|
610 |
||
611 |
listFilesFromArchiv |
|
612 |
||
613 |
self listFilesFromArchiv:nil |
|
614 |
! |
|
615 |
||
616 |
listFilesFromArchiv:newColOfFiles |
|
617 |
||
618 |
| cmd dir| |
|
619 |
||
620 |
self fileName isNil ifTrue:[ ^ self]. |
|
621 |
dir := self fileName directory. |
|
622 |
cmd := self getFileListFromArchivCommand:newColOfFiles. |
|
623 |
self executeCommand:cmd directory:dir |
|
624 |
! |
|
625 |
||
626 |
removeFilesFromArchiv:aColOfFiles |
|
627 |
||
628 |
|cmd| |
|
629 |
||
630 |
cmd := self getRemoveFilesFromTarArchivFor:aColOfFiles. |
|
631 |
self executeCommand:cmd directory:(self fileName directory). |
|
632 |
! ! |
|
633 |
||
634 |
!Archiver::TarArchive methodsFor:'command strings'! |
|
635 |
||
636 |
getAddFilesToTarArchiveCommandForArchiv:archivFile with:aColOfFiles |
|
637 |
| cmd stream| |
|
638 |
||
639 |
archivFile exists ifTrue:[ |
|
640 |
stream := WriteStream on:''. |
|
641 |
stream nextPutAll:self class TarArchivCommand. |
|
642 |
stream space. |
|
643 |
stream nextPutAll:self class TarArchivAddOption. |
|
644 |
stream nextPutAll:self class TarArchivFileOption. |
|
645 |
stream space. |
|
646 |
stream nextPutAll:archivFile asString. |
|
647 |
aColOfFiles do:[:el | |
|
648 |
stream space. |
|
1088 | 649 |
stream nextPutAll:(el asFilename baseName) |
1085 | 650 |
]. |
651 |
cmd := stream contents |
|
652 |
]. |
|
653 |
^ cmd |
|
654 |
! |
|
655 |
||
656 |
getExtractSelectedFilesCommandForDirectory:dir withSelection:sel |
|
657 |
| stream cmd| |
|
658 |
||
659 |
stream := WriteStream on:''. |
|
660 |
stream nextPutAll:self class TarArchivCommand. |
|
661 |
stream space. |
|
662 |
stream nextPutAll:self class TarArchivUnpackOption. |
|
663 |
stream nextPutAll:self class TarArchivFileOption. |
|
664 |
stream space. |
|
665 |
stream nextPutAll:self fileName asString. |
|
666 |
stream space. |
|
667 |
stream nextPutAll:self class TarArchivUnpackInDirectoryOption. |
|
668 |
stream space. |
|
669 |
stream nextPutAll:dir asString. |
|
670 |
sel notNil ifTrue:[ |
|
671 |
sel do:[:el | |
|
672 |
stream space. |
|
1088 | 673 |
stream nextPutAll:(el asString) |
1085 | 674 |
]. |
675 |
]. |
|
676 |
cmd := stream contents. |
|
677 |
stream close. |
|
678 |
^ cmd |
|
679 |
! |
|
680 |
||
681 |
getFileListFromArchivCommand:aColOfFiles |
|
682 |
||
683 |
| stream cmd| |
|
684 |
||
685 |
stream := WriteStream on:''. |
|
686 |
stream nextPutAll:self class TarArchivCommand. |
|
687 |
stream space. |
|
688 |
stream nextPutAll:self class TarArchivListOptions. |
|
689 |
stream space. |
|
690 |
stream nextPutAll:self fileName baseName. |
|
691 |
aColOfFiles notNil ifTrue:[ |
|
692 |
aColOfFiles do:[:el | |
|
693 |
stream space. |
|
694 |
stream nextPutAll:(el baseName) |
|
695 |
] |
|
696 |
]. |
|
697 |
cmd := stream contents. |
|
698 |
stream close. |
|
699 |
^ cmd |
|
700 |
! |
|
701 |
||
702 |
getRemoveFilesFromTarArchivFor:sel |
|
703 |
| stream filename| |
|
704 |
||
705 |
filename := self fileName. |
|
706 |
filename exists ifTrue:[ |
|
707 |
stream := WriteStream on:''. |
|
708 |
stream nextPutAll:self class TarArchivCommand. |
|
709 |
stream space. |
|
710 |
stream nextPutAll:self class TarArchivDeleteOption. |
|
711 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
712 |
stream nextPut:$-. |
1085 | 713 |
stream nextPutAll:self class TarArchivFileOption. |
714 |
stream space. |
|
715 |
stream nextPutAll:filename asString. |
|
716 |
sel do:[:el | |
|
717 |
stream space. |
|
718 |
stream nextPutAll:el |
|
719 |
]. |
|
720 |
^ stream contents |
|
721 |
] |
|
722 |
! ! |
|
723 |
||
1086 | 724 |
!Archiver::TarGZipArchive class methodsFor:'columns'! |
725 |
||
726 |
columns |
|
727 |
||
728 |
^ Archiver tarArchive columns |
|
729 |
! ! |
|
730 |
||
731 |
!Archiver::TarGZipArchive class methodsFor:'queries'! |
|
732 |
||
733 |
canAddFiles |
|
734 |
||
735 |
^ Archiver tarArchive canAddFiles |
|
736 |
! |
|
737 |
||
738 |
canRemoveFiles |
|
739 |
||
740 |
^ Archiver tarArchive canRemoveFiles |
|
1106 | 741 |
! |
742 |
||
743 |
canViewFile |
|
744 |
||
745 |
^ Archiver tarArchive canViewFile |
|
1086 | 746 |
! ! |
747 |
||
1085 | 748 |
!Archiver::TarGZipArchive methodsFor:'accessing'! |
749 |
||
750 |
fileName:aFile |
|
751 |
||
752 |
| tempDir file gzipArchiver suffix| |
|
753 |
||
754 |
super fileName:aFile. |
|
755 |
" unzip file in tempDirectory and do all the things with tar file " |
|
756 |
tempDir := self temporaryDirectory. |
|
757 |
gzipArchiver := Archiver::GZipArchive with:(self fileName). |
|
758 |
gzipArchiver unzipTo:tempDir. |
|
759 |
suffix := self fileName suffix. |
|
760 |
file := self fileName withoutSuffix. |
|
761 |
file := file baseName. |
|
762 |
suffix = 'tgz' ifTrue:[ |
|
763 |
file := file , '.tar' |
|
764 |
]. |
|
765 |
tarFile := self temporaryDirectory construct:file. |
|
1088 | 766 |
tarArchiver := Archiver tarArchive with:tarFile. |
1085 | 767 |
! ! |
768 |
||
769 |
!Archiver::TarGZipArchive methodsFor:'actions'! |
|
770 |
||
771 |
addFilesToArchiv:colOfFiles |
|
772 |
||
773 |
self setCommandOptions. |
|
774 |
tarArchiver addFilesToArchiv:colOfFiles. |
|
1098 | 775 |
"/ synchronize the tar archive under temporary file with archiv file position |
1085 | 776 |
self synchronize. |
777 |
! |
|
778 |
||
779 |
extractTo:aDirectory |
|
780 |
||
781 |
self extractTo:aDirectory with:nil. |
|
782 |
! |
|
783 |
||
784 |
extractTo:aDirectory with:col |
|
785 |
||
786 |
self setCommandOptions. |
|
787 |
tarArchiver extractTo:aDirectory with:col. |
|
788 |
! |
|
789 |
||
790 |
extractWithOutDirectoryTo:aDirectory with:files |
|
791 |
||
792 |
self setCommandOptions. |
|
793 |
tarArchiver extractWithOutDirectoryTo:aDirectory with:files. |
|
794 |
! |
|
795 |
||
796 |
listFilesFromArchiv |
|
797 |
||
798 |
self listFilesFromArchiv:nil |
|
799 |
! |
|
800 |
||
801 |
listFilesFromArchiv:newColOfFiles |
|
802 |
||
803 |
self setCommandOptions. |
|
804 |
^ tarArchiver listFilesFromArchiv:newColOfFiles. |
|
805 |
! |
|
806 |
||
807 |
removeFilesFromArchiv:aColOfFiles |
|
808 |
||
809 |
self setCommandOptions. |
|
810 |
tarArchiver removeFilesFromArchiv:aColOfFiles. |
|
811 |
self synchronize. |
|
812 |
! ! |
|
813 |
||
814 |
!Archiver::TarGZipArchive methodsFor:'actions private'! |
|
815 |
||
816 |
setCommandOptions |
|
817 |
||
818 |
tarArchiver outStream:(self outStream). |
|
819 |
tarArchiver errorStream:(self errorStream). |
|
820 |
tarArchiver synchron:(self synchron). |
|
821 |
! |
|
822 |
||
823 |
synchronize |
|
824 |
||
825 |
|gzipArchiver| |
|
826 |
||
827 |
gzipArchiver := GZipArchive with:nil. |
|
828 |
gzipArchiver zipFile:(tarArchiver fileName) to:(self fileName). |
|
829 |
! ! |
|
830 |
||
831 |
!Archiver::TarGZipArchive methodsFor:'initialization & release'! |
|
832 |
||
833 |
release |
|
834 |
||
835 |
super release. |
|
836 |
tarArchiver release. |
|
837 |
! ! |
|
838 |
||
1086 | 839 |
!Archiver::ZipArchive class methodsFor:'columns'! |
840 |
||
841 |
columns |
|
842 |
||
843 |
"/ colums id words to read |
|
844 |
^ #( #(#permissions 1) |
|
845 |
#(#version 2) |
|
846 |
#(#size 1) |
|
847 |
#(#type 1) |
|
848 |
#(#ratio 1) |
|
849 |
#(#dateAndTime 2) |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
850 |
#(#fileName #rest) |
1086 | 851 |
) |
852 |
! ! |
|
853 |
||
854 |
!Archiver::ZipArchive class methodsFor:'command strings'! |
|
855 |
||
1088 | 856 |
UnzipExtDirectoryOption |
857 |
^ $d |
|
858 |
! |
|
859 |
||
860 |
UnzipOverwriteExistingFilesOption |
|
861 |
^ $o |
|
862 |
! |
|
863 |
||
1086 | 864 |
ZipArchivCommand |
865 |
^ 'zip' |
|
866 |
! |
|
867 |
||
1088 | 868 |
ZipDeleteOption |
869 |
^ $d |
|
870 |
! |
|
871 |
||
1086 | 872 |
ZipListCommand |
873 |
^ 'unzip' |
|
874 |
! |
|
875 |
||
1089 | 876 |
ZipOverwriteExistingFilesOption |
877 |
^ $o |
|
878 |
! |
|
879 |
||
1087 | 880 |
ZipRecursiveOption |
881 |
^ $r |
|
882 |
! |
|
883 |
||
1086 | 884 |
ZipUnzipCommand |
885 |
^ 'unzip' |
|
1087 | 886 |
! |
887 |
||
888 |
ZipUnzipExtDirectoryOption |
|
889 |
^ 'd' |
|
1086 | 890 |
! ! |
891 |
||
892 |
!Archiver::ZipArchive class methodsFor:'queries'! |
|
893 |
||
894 |
canAddFiles |
|
895 |
||
896 |
^ true |
|
897 |
! |
|
898 |
||
899 |
canRemoveFiles |
|
900 |
||
901 |
^ true |
|
1088 | 902 |
! |
903 |
||
1138
5232eb3c94e0
canView is true for ZipArchives
Claus Gittinger <cg@exept.de>
parents:
1131
diff
changeset
|
904 |
canViewFile |
5232eb3c94e0
canView is true for ZipArchives
Claus Gittinger <cg@exept.de>
parents:
1131
diff
changeset
|
905 |
|
5232eb3c94e0
canView is true for ZipArchives
Claus Gittinger <cg@exept.de>
parents:
1131
diff
changeset
|
906 |
^ true |
5232eb3c94e0
canView is true for ZipArchives
Claus Gittinger <cg@exept.de>
parents:
1131
diff
changeset
|
907 |
! |
5232eb3c94e0
canView is true for ZipArchives
Claus Gittinger <cg@exept.de>
parents:
1131
diff
changeset
|
908 |
|
1088 | 909 |
hasLastLine |
910 |
||
911 |
^ true |
|
912 |
! |
|
913 |
||
914 |
hasTitleLine |
|
915 |
||
916 |
^ true |
|
1086 | 917 |
! ! |
918 |
||
919 |
!Archiver::ZipArchive methodsFor:'actions'! |
|
920 |
||
921 |
addFilesToArchiv:colOfFiles |
|
1087 | 922 |
|
923 |
|cmd tempDir archivFile archivInTemp| |
|
924 |
||
925 |
tempDir := self temporaryDirectory. |
|
926 |
archivFile := self fileName. |
|
927 |
archivInTemp := tempDir construct:(archivFile baseName). |
|
928 |
"/ copy files to be added to tempDir |
|
929 |
colOfFiles do:[ :file | |
|
1088 | 930 |
file recursiveCopyTo:(tempDir construct:(file asFilename baseName)) |
1087 | 931 |
]. |
932 |
||
933 |
"/ copy archiv to tempDir |
|
934 |
archivFile copyTo:archivInTemp. |
|
935 |
||
936 |
"/ addFiles to the tar archive |
|
937 |
cmd := self getAddFilesToArchiveCommandForArchiv:archivInTemp with:colOfFiles. |
|
1088 | 938 |
self executeCommand:cmd directory:tempDir. |
1087 | 939 |
|
940 |
"/ copy tar archiv back |
|
941 |
archivInTemp copyTo:(self fileName). |
|
1086 | 942 |
! |
943 |
||
944 |
extractTo:aDirectory |
|
945 |
||
946 |
^ self extractTo:aDirectory with:nil |
|
947 |
! |
|
948 |
||
949 |
extractTo:aDirectory with:files |
|
1087 | 950 |
|
951 |
|execDir cmd| |
|
952 |
||
953 |
execDir := self fileName directory. |
|
954 |
cmd := self getExtractSelectedFilesCommandForDirectory:aDirectory withSelection:files. |
|
955 |
self executeCommand:cmd directory:execDir. |
|
1086 | 956 |
! |
957 |
||
958 |
extractWithOutDirectoryTo:aDirectory with:files |
|
1087 | 959 |
|
1088 | 960 |
|execDir tempDir tempFile targetFile| |
1087 | 961 |
|
962 |
execDir := self fileName directory. |
|
963 |
tempDir := self temporaryDirectory. |
|
964 |
self extractTo:tempDir with:files. |
|
1088 | 965 |
self halt. |
1087 | 966 |
files do:[ : aFileString | |
967 |
tempFile := self temporaryDirectory construct:aFileString. |
|
1088 | 968 |
targetFile := aDirectory construct:(aFileString asFilename baseName). |
969 |
targetFile exists ifTrue:[ |
|
970 |
targetFile recursiveRemove. |
|
971 |
]. |
|
1087 | 972 |
tempFile exists ifTrue:[ |
1088 | 973 |
tempFile recursiveCopyTo:targetFile. |
1087 | 974 |
]. |
975 |
]. |
|
1086 | 976 |
! |
977 |
||
978 |
listFilesFromArchiv |
|
979 |
||
980 |
self listFilesFromArchiv:nil |
|
981 |
! |
|
982 |
||
983 |
listFilesFromArchiv:newColOfFiles |
|
984 |
||
985 |
|dir cmd| |
|
986 |
||
987 |
self fileName isNil ifTrue:[ ^ self]. |
|
988 |
dir := self fileName directory. |
|
989 |
cmd := self getFileListFromArchivCommand:newColOfFiles. |
|
990 |
self executeCommand:cmd directory:dir |
|
991 |
! |
|
992 |
||
993 |
removeFilesFromArchiv:aColOfFiles |
|
1088 | 994 |
|
995 |
|cmd| |
|
996 |
||
997 |
cmd := self getRemoveFilesFromArchivFor:aColOfFiles. |
|
998 |
self executeCommand:cmd directory:(self fileName directory). |
|
1086 | 999 |
! ! |
1000 |
||
1001 |
!Archiver::ZipArchive methodsFor:'command strings'! |
|
1002 |
||
1087 | 1003 |
getAddFilesToArchiveCommandForArchiv:archivFile with:aColOfFiles |
1086 | 1004 |
| cmd stream| |
1005 |
||
1006 |
archivFile exists ifTrue:[ |
|
1007 |
stream := WriteStream on:''. |
|
1087 | 1008 |
stream nextPutAll:self class ZipArchivCommand. |
1086 | 1009 |
stream space. |
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1010 |
stream nextPut:$-. |
1087 | 1011 |
stream nextPut:self class ZipRecursiveOption. |
1086 | 1012 |
stream space. |
1013 |
stream nextPutAll:archivFile asString. |
|
1014 |
aColOfFiles do:[:el | |
|
1015 |
stream space. |
|
1088 | 1016 |
stream nextPutAll:(el asFilename baseName) |
1017 |
]. |
|
1018 |
cmd := stream contents |
|
1019 |
]. |
|
1020 |
^ cmd |
|
1021 |
! |
|
1022 |
||
1023 |
getAddFilesToTarArchiveCommand:aColOfFiles |
|
1024 |
|filename cmd stream| |
|
1025 |
||
1026 |
filename := self fileName. |
|
1027 |
filename exists ifTrue:[ |
|
1028 |
stream := WriteStream on:''. |
|
1029 |
stream nextPutAll:self class TarArchivCommand. |
|
1030 |
stream space. |
|
1031 |
stream nextPutAll:self class TarArchivAddOption. |
|
1032 |
stream nextPutAll:self class TarArchivFileOption. |
|
1033 |
stream space. |
|
1034 |
stream nextPutAll:filename asString. |
|
1035 |
aColOfFiles do:[:el | |
|
1036 |
stream space. |
|
1086 | 1037 |
stream nextPutAll:(el baseName) |
1038 |
]. |
|
1039 |
cmd := stream contents |
|
1040 |
]. |
|
1041 |
^ cmd |
|
1042 |
! |
|
1043 |
||
1087 | 1044 |
getAddFilesToTarArchiveCommandForArchivFor:aColOfFiles |
1045 |
| cmd stream| |
|
1046 |
||
1047 |
stream := WriteStream on:''. |
|
1048 |
stream nextPutAll:self class ZipArchivCommand. |
|
1049 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1050 |
stream nextPut:$-. |
1087 | 1051 |
stream nextPut:self class ZipRecursiveOption. |
1052 |
stream space. |
|
1053 |
stream nextPutAll:self fileName asString. |
|
1054 |
aColOfFiles do:[:el | |
|
1055 |
stream space. |
|
1056 |
stream nextPutAll:(el asString) |
|
1057 |
]. |
|
1058 |
cmd := stream contents. |
|
1059 |
stream close. |
|
1060 |
^ cmd |
|
1061 |
! |
|
1062 |
||
1086 | 1063 |
getExtractSelectedFilesCommandForDirectory:dir withSelection:sel |
1064 |
| stream cmd| |
|
1065 |
||
1066 |
stream := WriteStream on:''. |
|
1087 | 1067 |
stream nextPutAll:self class ZipUnzipCommand. |
1086 | 1068 |
stream space. |
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1069 |
stream nextPut:$-. |
1088 | 1070 |
stream nextPut:self class UnzipOverwriteExistingFilesOption. |
1071 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1072 |
stream nextPut:$-. |
1088 | 1073 |
stream nextPut:self class UnzipExtDirectoryOption. |
1087 | 1074 |
stream space. |
1075 |
stream nextPutAll:dir asString. |
|
1086 | 1076 |
stream space. |
1077 |
stream nextPutAll:self fileName asString. |
|
1078 |
sel notNil ifTrue:[ |
|
1079 |
sel do:[:el | |
|
1080 |
stream space. |
|
1088 | 1081 |
stream nextPutAll:(el asString) |
1086 | 1082 |
]. |
1083 |
]. |
|
1084 |
cmd := stream contents. |
|
1085 |
stream close. |
|
1086 |
^ cmd |
|
1087 |
! |
|
1088 |
||
1089 |
getFileListFromArchivCommand:aColOfFiles |
|
1144 | 1090 |
|stream| |
1086 | 1091 |
|
1092 |
stream := WriteStream on:''. |
|
1144 | 1093 |
|
1094 |
"/ -Z ZipListOption |
|
1095 |
"/ -h ZipHeaderOption |
|
1096 |
"/ -t ZipTotalOption |
|
1097 |
stream nextPutAll:('%1 -Z -h -t "%2"' |
|
1098 |
bindWith:self class ZipUnzipCommand |
|
1099 |
with:self fileName asString string). |
|
1139 | 1100 |
|
1086 | 1101 |
aColOfFiles notNil ifTrue:[ |
1102 |
aColOfFiles do:[:el | |
|
1144 | 1103 |
stream nextPutAll:' "'. |
1104 |
stream nextPutAll:(el baseName). |
|
1105 |
stream nextPutAll:'"' |
|
1086 | 1106 |
] |
1107 |
]. |
|
1144 | 1108 |
^ stream contents. |
1086 | 1109 |
! |
1110 |
||
1087 | 1111 |
getRemoveFilesFromArchivFor:sel |
1088 | 1112 |
|
1113 |
|stream cmd| |
|
1114 |
||
1115 |
stream := WriteStream on:''. |
|
1116 |
stream nextPutAll:self class ZipArchivCommand. |
|
1117 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1118 |
stream nextPut:$-. |
1088 | 1119 |
stream nextPut:self class ZipDeleteOption. |
1120 |
stream space. |
|
1121 |
stream nextPutAll:self fileName asString. |
|
1122 |
sel do:[:el | |
|
1123 |
stream space. |
|
1124 |
stream nextPutAll:(el asString) |
|
1125 |
]. |
|
1126 |
cmd := stream contents. |
|
1127 |
stream close. |
|
1128 |
^ cmd |
|
1129 |
! |
|
1130 |
||
1131 |
getRemoveFilesFromTarArchivFor:sel |
|
1132 |
| stream filename| |
|
1133 |
||
1134 |
filename := self fileName. |
|
1135 |
filename exists ifTrue:[ |
|
1136 |
stream := WriteStream on:''. |
|
1137 |
stream nextPutAll:self class TarArchivCommand. |
|
1138 |
stream space. |
|
1139 |
stream nextPutAll:self class TarArchivDeleteOption. |
|
1140 |
stream space. |
|
1125
d55d69b4b93a
fixed filename extraction (if name includes spaces)
Claus Gittinger <cg@exept.de>
parents:
1106
diff
changeset
|
1141 |
stream nextPut:$-. |
1088 | 1142 |
stream nextPutAll:self class TarArchivFileOption. |
1143 |
stream space. |
|
1144 |
stream nextPutAll:filename asString. |
|
1145 |
sel do:[:el | |
|
1146 |
stream space. |
|
1147 |
stream nextPutAll:el |
|
1148 |
]. |
|
1149 |
^ stream contents |
|
1150 |
] |
|
1086 | 1151 |
! ! |
1152 |
||
1085 | 1153 |
!Archiver class methodsFor:'documentation'! |
1154 |
||
1155 |
version |
|
1144 | 1156 |
^ '$Header: /cvs/stx/stx/libbasic2/Archiver.st,v 1.12 2003-02-13 12:27:29 cg Exp $' |
1085 | 1157 |
! ! |