3232 MAX_UPLOAD_MEDIA_SIZE ,
3333 ClientError ,
3434)
35- from .merginproject import MerginProject
35+ from .merginproject import MerginProject , pygeodiff
3636from .editor import filter_changes
37- from .utils import get_data_checksum
37+ from .utils import get_data_checksum , cleanup_tmp_dir
38+
3839
3940POST_JSON_HEADERS = {"Content-Type" : "application/json" }
4041
@@ -381,6 +382,7 @@ def push_project_finalize(job: UploadJob):
381382 f"Transferred size ({ job .transferred_size } ) and expected total size ({ job .total_size } ) do not match!"
382383 )
383384 job .mp .log .error ("--- push finish failed! " + error_msg )
385+ cleanup_tmp_dir (job .mp , job .tmp_dir ) # delete our temporary dir and all its content
384386 raise ClientError ("Upload error: " + error_msg )
385387
386388 if server_features .get ("v2_push_enabled" ):
@@ -410,12 +412,29 @@ def push_project_finalize(job: UploadJob):
410412 resp = job .mc .post ("/v1/project/push/finish/%s" % job .transaction_id )
411413 job .server_resp = json .load (resp )
412414 except ClientError as err :
413- # Log additional metadata on server error 502 or 504
414- if hasattr (err , "http_error" ) and err .http_error in (502 , 504 ):
415+ # Log additional metadata on server error 502 or 504 (extended logging only)
416+ http_code = getattr (err , "http_error" , None )
417+ if http_code in (502 , 504 ):
415418 job .mp .log .error (
416- f"Push failed with HTTP error { err . http_error } . "
419+ f"Push failed with HTTP error { http_code } . "
417420 f"Upload details: { len (job .upload_queue_items )} file chunks, total size { job .total_size } bytes."
418421 )
422+ job .mp .log .error ("Files:" )
423+ for f in job .changes .get ("added" , []) + job .changes .get ("updated" , []):
424+ path = f .get ("path" , "<unknown>" )
425+ size = f .get ("size" , "?" )
426+ if "diff" in f :
427+ diff_info = f .get ("diff" , {})
428+ diff_size = diff_info .get ("size" , "?" )
429+ # best-effort: number of geodiff changes (if available)
430+ changes_cnt = _geodiff_changes_count (job .mp , diff_info .get ("path" ))
431+ if changes_cnt is None :
432+ job .mp .log .error (f" - { path } , size={ size } , diff_size={ diff_size } , changes=n/a" )
433+ else :
434+ job .mp .log .error (f" - { path } , size={ size } , diff_size={ diff_size } , changes={ changes_cnt } " )
435+ else :
436+ job .mp .log .error (f" - { path } , size={ size } " )
437+
419438 # server returns various error messages with filename or something generic
420439 # it would be better if it returned list of failed files (and reasons) whenever possible
421440 job .mp .log .error ("--- push finish failed! " + str (err ))
@@ -428,6 +447,7 @@ def push_project_finalize(job: UploadJob):
428447 job .mp .log .info ("cancel response: " + resp_cancel .msg )
429448 except ClientError as err2 :
430449 job .mp .log .info ("cancel response: " + str (err2 ))
450+ cleanup_tmp_dir (job .mp , job .tmp_dir ) # delete our temporary dir and all its content
431451 raise err
432452
433453 job .mp .update_metadata (job .server_resp )
@@ -436,16 +456,35 @@ def push_project_finalize(job: UploadJob):
436456 except Exception as e :
437457 job .mp .log .error ("Failed to apply push changes: " + str (e ))
438458 job .mp .log .info ("--- push aborted" )
459+ cleanup_tmp_dir (job .mp , job .tmp_dir ) # delete our temporary dir and all its content
439460 raise ClientError ("Failed to apply push changes: " + str (e ))
440461
441- job .tmp_dir . cleanup ( ) # delete our temporary dir and all its content
462+ cleanup_tmp_dir ( job .mp , job . tmp_dir ) # delete our temporary dir and all its content
442463 job .mc .upload_chunks_cache .clear () # clear the upload chunks cache
443-
444464 remove_diff_files (job )
445465
446466 job .mp .log .info ("--- push finished - new project version " + job .server_resp ["version" ])
447467
448468
469+ def _geodiff_changes_count (mp : MerginProject , diff_rel_path : str ):
470+ """
471+ Best-effort: return number of changes in the .gpkg diff (int) or None.
472+ Never raises – diagnostics/logging must not fail.
473+ """
474+
475+ diff_abs = mp .fpath_meta (diff_rel_path )
476+ try :
477+ return pygeodiff .GeoDiff ().changes_count (diff_abs )
478+ except (
479+ pygeodiff .GeoDiffLibError ,
480+ pygeodiff .GeoDiffLibConflictError ,
481+ pygeodiff .GeoDiffLibUnsupportedChangeError ,
482+ pygeodiff .GeoDiffLibVersionError ,
483+ FileNotFoundError ,
484+ ):
485+ return None
486+
487+
449488def push_project_cancel (job : UploadJob ):
450489 """
451490 To be called (from main thread) to cancel a job that has uploads in progress.
@@ -466,7 +505,9 @@ def push_project_cancel(job: UploadJob):
466505 job .server_resp = resp_cancel .msg
467506 except ClientError as err :
468507 job .mp .log .error ("--- push cancelling failed! " + str (err ))
508+ cleanup_tmp_dir (job .mp , job .tmp_dir )
469509 raise err
510+ cleanup_tmp_dir (job .mp , job .tmp_dir ) # delete our temporary dir and all its content
470511 job .mp .log .info ("--- push cancel response: " + str (job .server_resp ))
471512
472513
0 commit comments