|
3 | 3 | import argparse |
4 | 4 | import os |
5 | 5 | import pathlib |
6 | | -import shutil |
7 | 6 | import sys |
| 7 | +import tarfile |
8 | 8 | import time |
9 | 9 | import urllib.error |
10 | 10 | import urllib.request |
@@ -56,7 +56,8 @@ def fetch_release(tag, tarball_dir, *, org='python', verbose=False): |
56 | 56 |
|
57 | 57 | def extract_tarball(externals_dir, tarball_path, tag): |
58 | 58 | output_path = externals_dir / tag |
59 | | - shutil.unpack_archive(os.fspath(tarball_path), os.fspath(output_path)) |
| 59 | + with tarfile.open(tarball_path) as tf: |
| 60 | + tf.extractall(os.fspath(externals_dir)) |
60 | 61 | return output_path |
61 | 62 |
|
62 | 63 |
|
@@ -115,21 +116,23 @@ def main(): |
115 | 116 | verbose=args.verbose, |
116 | 117 | ) |
117 | 118 | extracted = extract_zip(args.externals_dir, zip_path) |
118 | | - for wait in [1, 2, 3, 5, 8, 0]: |
119 | | - try: |
120 | | - extracted.replace(final_name) |
121 | | - break |
122 | | - except PermissionError as ex: |
123 | | - retry = f" Retrying in {wait}s..." if wait else "" |
124 | | - print(f"Encountered permission error '{ex}'.{retry}", file=sys.stderr) |
125 | | - time.sleep(wait) |
126 | | - else: |
127 | | - print( |
128 | | - f"ERROR: Failed to extract {final_name}.", |
129 | | - "You may need to restart your build", |
130 | | - file=sys.stderr, |
131 | | - ) |
132 | | - sys.exit(1) |
| 119 | + |
| 120 | + if extracted != final_name: |
| 121 | + for wait in [1, 2, 3, 5, 8, 0]: |
| 122 | + try: |
| 123 | + extracted.replace(final_name) |
| 124 | + break |
| 125 | + except PermissionError as ex: |
| 126 | + retry = f" Retrying in {wait}s..." if wait else "" |
| 127 | + print(f"Encountered permission error '{ex}'.{retry}", file=sys.stderr) |
| 128 | + time.sleep(wait) |
| 129 | + else: |
| 130 | + print( |
| 131 | + f"ERROR: Failed to rename {extracted} to {final_name}.", |
| 132 | + "You may need to restart your build", |
| 133 | + file=sys.stderr, |
| 134 | + ) |
| 135 | + sys.exit(1) |
133 | 136 |
|
134 | 137 |
|
135 | 138 | if __name__ == '__main__': |
|
0 commit comments