30
30
from charon .pkgs .pkg_utils import upload_post_process , rollback_post_process
31
31
from charon .utils .strings import remove_prefix
32
32
from charon .utils .files import write_manifest
33
+ from charon .utils .map import del_none
33
34
34
35
logger = logging .getLogger (__name__ )
35
36
@@ -65,7 +66,7 @@ def __init__(self, metadata, is_version):
65
66
def handle_npm_uploading (
66
67
tarball_path : str ,
67
68
product : str ,
68
- targets : List [Tuple [str , str , str ]] = None ,
69
+ targets : List [Tuple [str , str , str , str ]] = None ,
69
70
aws_profile = None ,
70
71
dir_ = None ,
71
72
do_index = True ,
@@ -86,48 +87,60 @@ def handle_npm_uploading(
86
87
87
88
Returns the directory used for archive processing and if uploading is successful
88
89
"""
89
- target_dir , valid_paths , package_metadata = _scan_metadata_paths_from_archive (
90
- tarball_path , prod = product , dir__ = dir_
91
- )
92
- if not os .path .isdir (target_dir ):
93
- logger .error ("Error: the extracted target_dir path %s does not exist." , target_dir )
94
- sys .exit (1 )
95
-
96
- valid_dirs = __get_path_tree (valid_paths , target_dir )
97
-
98
- # main_target = targets[0]
99
90
client = S3Client (aws_profile = aws_profile , dry_run = dry_run )
100
- targets_ = [(target [1 ], remove_prefix (target [2 ], "/" )) for target in targets ]
101
- logger .info (
102
- "Start uploading files to s3 buckets: %s" ,
103
- [target [1 ] for target in targets ]
104
- )
105
- failed_files = client .upload_files (
106
- file_paths = valid_paths ,
107
- targets = targets_ ,
108
- product = product ,
109
- root = target_dir
110
- )
111
- logger .info ("Files uploading done\n " )
112
-
113
- succeeded = True
114
91
for target in targets :
92
+ bucket_ = target [1 ]
93
+ prefix__ = remove_prefix (target [2 ], "/" )
94
+ registry__ = target [3 ]
95
+ target_dir , valid_paths , package_metadata = _scan_metadata_paths_from_archive (
96
+ tarball_path , registry__ , prod = product , dir__ = dir_
97
+ )
98
+ if not os .path .isdir (target_dir ):
99
+ logger .error ("Error: the extracted target_dir path %s does not exist." , target_dir )
100
+ sys .exit (1 )
101
+ valid_dirs = __get_path_tree (valid_paths , target_dir )
102
+
103
+ logger .info ("Start uploading files to s3 buckets: %s" , bucket_ )
104
+ failed_files = client .upload_files (
105
+ file_paths = [valid_paths [0 ]],
106
+ targets = [(bucket_ , prefix__ )],
107
+ product = product ,
108
+ root = target_dir
109
+ )
110
+ logger .info ("Files uploading done\n " )
111
+
112
+ succeeded = True
113
+
115
114
if not manifest_bucket_name :
116
115
logger .warning (
117
116
'Warning: No manifest bucket is provided, will ignore the process of manifest '
118
117
'uploading\n ' )
119
118
else :
120
119
logger .info ("Start uploading manifest to s3 bucket %s" , manifest_bucket_name )
121
- manifest_folder = target [ 1 ]
120
+ manifest_folder = bucket_
122
121
manifest_name , manifest_full_path = write_manifest (valid_paths , target_dir , product )
122
+
123
123
client .upload_manifest (
124
124
manifest_name , manifest_full_path ,
125
125
manifest_folder , manifest_bucket_name
126
126
)
127
127
logger .info ("Manifest uploading is done\n " )
128
128
129
- bucket_ = target [1 ]
130
- prefix__ = remove_prefix (target [2 ], "/" )
129
+ logger .info (
130
+ "Start generating version-level package.json for package: %s in s3 bucket %s" ,
131
+ package_metadata .name , bucket_
132
+ )
133
+ failed_metas = []
134
+ _version_metadata_path = valid_paths [1 ]
135
+ _failed_metas = client .upload_metadatas (
136
+ meta_file_paths = [_version_metadata_path ],
137
+ target = (bucket_ , prefix__ ),
138
+ product = product ,
139
+ root = target_dir
140
+ )
141
+ failed_metas .extend (_failed_metas )
142
+ logger .info ("version-level package.json uploading done" )
143
+
131
144
logger .info (
132
145
"Start generating package.json for package: %s in s3 bucket %s" ,
133
146
package_metadata .name , bucket_
@@ -137,7 +150,6 @@ def handle_npm_uploading(
137
150
)
138
151
logger .info ("package.json generation done\n " )
139
152
140
- failed_metas = []
141
153
if META_FILE_GEN_KEY in meta_files :
142
154
_failed_metas = client .upload_metadatas (
143
155
meta_file_paths = [meta_files [META_FILE_GEN_KEY ]],
@@ -178,7 +190,7 @@ def handle_npm_uploading(
178
190
def handle_npm_del (
179
191
tarball_path : str ,
180
192
product : str ,
181
- targets : List [Tuple [str , str , str ]] = None ,
193
+ targets : List [Tuple [str , str , str , str ]] = None ,
182
194
aws_profile = None ,
183
195
dir_ = None ,
184
196
do_index = True ,
@@ -381,11 +393,11 @@ def _gen_npm_package_metadata_for_del(
381
393
return meta_files
382
394
383
395
384
- def _scan_metadata_paths_from_archive (path : str , prod = "" , dir__ = None ) -> Tuple [ str , list ,
385
- NPMPackageMetadata ]:
396
+ def _scan_metadata_paths_from_archive (path : str , registry : str , prod = "" , dir__ = None ) -> \
397
+ Tuple [ str , list , NPMPackageMetadata ]:
386
398
tmp_root = mkdtemp (prefix = f"npm-charon-{ prod } -" , dir = dir__ )
387
399
try :
388
- _ , valid_paths = extract_npm_tarball (path , tmp_root , True )
400
+ _ , valid_paths = extract_npm_tarball (path , tmp_root , True , registry )
389
401
if len (valid_paths ) > 1 :
390
402
version = _scan_for_version (valid_paths [1 ])
391
403
package = NPMPackageMetadata (version , True )
@@ -502,23 +514,14 @@ def _write_package_metadata_to_file(package_metadata: NPMPackageMetadata, root='
502
514
final_package_metadata_path = os .path .join (root , package_metadata .name , PACKAGE_JSON )
503
515
try :
504
516
with open (final_package_metadata_path , mode = 'w' , encoding = 'utf-8' ) as f :
505
- dump (_del_none (package_metadata .__dict__ .copy ()), f )
517
+ dump (del_none (package_metadata .__dict__ .copy ()), f )
506
518
return final_package_metadata_path
507
519
except FileNotFoundError :
508
520
logger .error (
509
521
'Can not create file %s because of some missing folders' , final_package_metadata_path
510
522
)
511
523
512
524
513
- def _del_none (d ):
514
- for key , value in list (d .items ()):
515
- if value is None :
516
- del d [key ]
517
- elif isinstance (value , dict ):
518
- _del_none (value )
519
- return d
520
-
521
-
522
525
def __get_path_tree (paths : str , prefix : str ) -> Set [str ]:
523
526
valid_dirs = set ()
524
527
for f in paths :
0 commit comments