2
2
import re
3
3
import subprocess
4
4
from abc import ABC , abstractmethod
5
+ import xtarfile as tarfile
5
6
6
7
7
8
class BaseArchive (ABC ):
@@ -22,10 +23,10 @@ def splitext(self):
22
23
return base , ext , subext
23
24
24
25
25
- class TarZstdArchive (BaseArchive ):
26
+ class TarArchive (BaseArchive ):
26
27
@staticmethod
27
28
def test (path ):
28
- return re .search (r"\.tar\.zstd?$ " , path )
29
+ return re .search (r"\.tar" , path )
29
30
30
31
def extract (self , dir , dry_run = False ):
31
32
self .updateStatus ("extract" , 0 )
@@ -36,25 +37,26 @@ def extract(self, dir, dry_run=False):
36
37
37
38
if not dry_run :
38
39
os .mkdir (dir )
39
- subprocess .run (
40
- [
41
- "tar" ,
42
- "--use-compress-program=unzstd" ,
43
- "-C" ,
44
- dir ,
45
- "-xvf" ,
46
- self .path ,
47
- ],
48
- check = True ,
49
- )
40
+
41
+ def track_progress (tar ):
42
+ i = 0
43
+ members = tar .getmembers ()
44
+ for member in members :
45
+ i += 1
46
+ self .updateStatus ("extract" , i / len (members ))
47
+ yield member
48
+
49
+ with tarfile .open (self .path , "r" ) as tar :
50
+ tar .extractall (path = dir , members = track_progress (tar ))
51
+ tar .close ()
50
52
subprocess .run (["ls" , "-l" ])
51
53
os .remove (self .path )
52
54
53
55
self .updateStatus ("extract" , 1 )
54
56
return dir # , base, ext, subext
55
57
56
58
57
- archiveClasses = [TarZstdArchive ]
59
+ archiveClasses = [TarArchive ]
58
60
59
61
60
62
def Archive (path , ** kwargs ):
0 commit comments