1010
1111UPLOAD_URL_PREFIX = os .getenv ("UPLOAD_URL_PREFIX" , "https://www.python.org/ftp/" )
1212UPLOAD_PATH_PREFIX = os .getenv ("UPLOAD_PATH_PREFIX" , "/srv/www.python.org/ftp/" )
13- INDEX_URL = os .getenv ("INDEX_URL" , UPLOAD_URL_PREFIX + "python/index. windows.json" )
13+ INDEX_URL = os .getenv ("INDEX_URL" , UPLOAD_URL_PREFIX + "python/index- windows.json" )
1414INDEX_FILE = os .getenv ("INDEX_FILE" )
1515# A version will be inserted before the extension later on
1616MANIFEST_FILE = os .getenv ("MANIFEST_FILE" )
@@ -190,6 +190,22 @@ def calculate_uploads():
190190 )
191191
192192
193+ def remove_and_insert (index , new_installs ):
194+ new = {
195+ (i ["id" ].casefold (), i ["sort-version" ].casefold ()) for i in new_installs
196+ }
197+ to_remove = [x for x , i in enumerate (index )
198+ if (i ["id" ].casefold (), i ["sort-version" ].casefold ()) in new ]
199+ for i in reversed (to_remove ):
200+ del index [i ]
201+ index [:0 ] = new_installs
202+ print ("Added" , len (new_installs ), "entries:" )
203+ for i in new_installs :
204+ print ("-" , i ["id" ], i ["sort-version" ])
205+ print ("Replaced" , len (to_remove ), "existing entries" )
206+ print ()
207+
208+
193209def hash_packages (uploads ):
194210 for i , src , * _ in uploads :
195211 i ["hash" ] = get_hashes (src )
@@ -243,15 +259,13 @@ def install_sortkey(install):
243259new_installs = [trim_install (i ) for i , * _ in UPLOADS ]
244260validate_new_installs (new_installs )
245261new_installs = sorted (new_installs , key = install_sortkey )
246- index ["versions" ][: 0 ] = new_installs
262+ remove_and_insert ( index ["versions" ], new_installs )
247263
248264if INDEX_FILE :
249265 INDEX_FILE = Path (INDEX_FILE ).absolute ()
250266 INDEX_FILE .parent .mkdir (parents = True , exist_ok = True )
251267 with open (INDEX_FILE , "w" , encoding = "utf-8" ) as f :
252- # Include an indent for sanity while testing.
253- # We should probably remove it later for the size benefits.
254- json .dump (index , f , indent = 1 )
268+ json .dump (index , f )
255269
256270if MANIFEST_FILE :
257271 # Use the sort-version so that the manifest name includes prerelease marks
@@ -266,8 +280,6 @@ def install_sortkey(install):
266280 # far more likely to be read by humans than the index.
267281 json .dump ({"versions" : new_installs }, f , indent = 2 )
268282
269- print ("Merged" , len (UPLOADS ), "entries" )
270-
271283
272284# Upload last to ensure we've got a valid index first
273285for i , src , dest , sbom , sbom_dest in UPLOADS :
0 commit comments