@@ -352,7 +352,17 @@ def recent_enough(job):
352
352
353
353
354
354
def find_complete_job (jobs ):
355
- for job in sorted (filter (lambda job : job .completed , jobs ), key = lambda job : iso8601 .parse_date (job .completion_date ), reverse = True ):
355
+ complete_jobs = filter (lambda job : job .completed , jobs )
356
+
357
+ def most_recent_job (job ):
358
+ return iso8601 .parse_date (job .completion_date )
359
+
360
+ sorted_completed_jobs = sorted (
361
+ complete_jobs ,
362
+ key = most_recent_job , reverse = True
363
+ )
364
+
365
+ for job in sorted_completed_jobs :
356
366
return job
357
367
358
368
@@ -526,10 +536,15 @@ def multipart_archive_upload(self, args, encryptor=None):
526
536
@staticmethod
527
537
def _write_archive_retrieval_job (f , job , multipart_size ,
528
538
encryptor = None ):
539
+ if encryptor :
540
+ destfile = tempfile .NamedTemporaryFile ()
541
+ else :
542
+ destfile = f
543
+
529
544
if job .archive_size > multipart_size :
530
545
def fetch (start , end ):
531
546
byte_range = start , end - 1
532
- f .write (job .get_output (byte_range ).read ())
547
+ destfile .write (job .get_output (byte_range ).read ())
533
548
534
549
whole_parts = job .archive_size // multipart_size
535
550
for first_byte in xrange (0 , whole_parts * multipart_size ,
@@ -539,21 +554,23 @@ def fetch(start, end):
539
554
if remainder :
540
555
fetch (job .archive_size - remainder , job .archive_size )
541
556
else :
542
- data = job .get_output ().read ()
543
- if encryptor :
544
- data = encryptor .decrypt (data )
545
- f .write (data )
557
+ destfile .write (job .get_output ().read ())
546
558
547
559
# Make sure that the file now exactly matches the downloaded archive,
548
560
# even if the file existed before and was longer.
549
561
try :
550
- f .truncate (job .archive_size )
562
+ destfile .truncate (job .archive_size )
551
563
except IOError , e :
552
564
# Allow ESPIPE, since the "file" couldn't have existed before in
553
565
# this case.
554
566
if e .errno != errno .ESPIPE :
555
567
raise
556
568
569
+ # Decrypt file if encryptor is given
570
+ if encryptor :
571
+ encryptor .decrypt_file (destfile .name , f .name )
572
+ destfile .close ()
573
+
557
574
@classmethod
558
575
def _archive_retrieve_completed (cls , args , job , name , encryptor = None ):
559
576
if args .output_filename == '-' :
0 commit comments