1
1
#include "cache.h"
2
2
#include "commit.h"
3
- #include "pack.h"
4
3
#include "tag.h"
5
4
#include "blob.h"
6
5
#include "http.h"
@@ -119,7 +118,6 @@ struct transfer_request
119
118
char filename [PATH_MAX ];
120
119
char tmpfile [PATH_MAX ];
121
120
int local_fileno ;
122
- FILE * local_stream ;
123
121
enum transfer_state state ;
124
122
CURLcode curl_result ;
125
123
char errorstr [CURL_ERROR_SIZE ];
@@ -452,16 +450,10 @@ static void start_mkcol(struct transfer_request *request)
452
450
453
451
static void start_fetch_packed (struct transfer_request * request )
454
452
{
455
- char * url ;
456
453
struct packed_git * target ;
457
- FILE * packfile ;
458
- char * filename ;
459
- long prev_posn = 0 ;
460
- char range [RANGE_HEADER_SIZE ];
461
- struct curl_slist * range_header = NULL ;
462
454
463
455
struct transfer_request * check_request = request_queue_head ;
464
- struct active_request_slot * slot ;
456
+ struct http_pack_request * preq ;
465
457
466
458
target = find_sha1_pack (request -> obj -> sha1 , repo -> packs );
467
459
if (!target ) {
@@ -474,68 +466,35 @@ static void start_fetch_packed(struct transfer_request *request)
474
466
fprintf (stderr , "Fetching pack %s\n" , sha1_to_hex (target -> sha1 ));
475
467
fprintf (stderr , " which contains %s\n" , sha1_to_hex (request -> obj -> sha1 ));
476
468
477
- filename = sha1_pack_name (target -> sha1 );
478
- snprintf (request -> filename , sizeof (request -> filename ), "%s" , filename );
479
- snprintf (request -> tmpfile , sizeof (request -> tmpfile ),
480
- "%s.temp" , filename );
481
-
482
- url = xmalloc (strlen (repo -> url ) + 64 );
483
- sprintf (url , "%sobjects/pack/pack-%s.pack" ,
484
- repo -> url , sha1_to_hex (target -> sha1 ));
469
+ preq = new_http_pack_request (target , repo -> url );
470
+ if (preq == NULL ) {
471
+ release_http_pack_request (preq );
472
+ repo -> can_update_info_refs = 0 ;
473
+ return ;
474
+ }
475
+ preq -> lst = & repo -> packs ;
485
476
486
477
/* Make sure there isn't another open request for this pack */
487
478
while (check_request ) {
488
479
if (check_request -> state == RUN_FETCH_PACKED &&
489
- !strcmp (check_request -> url , url )) {
490
- free ( url );
480
+ !strcmp (check_request -> url , preq -> url )) {
481
+ release_http_pack_request ( preq );
491
482
release_request (request );
492
483
return ;
493
484
}
494
485
check_request = check_request -> next ;
495
486
}
496
487
497
- packfile = fopen (request -> tmpfile , "a" );
498
- if (!packfile ) {
499
- fprintf (stderr , "Unable to open local file %s for pack" ,
500
- request -> tmpfile );
501
- repo -> can_update_info_refs = 0 ;
502
- free (url );
503
- return ;
504
- }
505
-
506
- slot = get_active_slot ();
507
- slot -> callback_func = process_response ;
508
- slot -> callback_data = request ;
509
- request -> slot = slot ;
510
- request -> local_stream = packfile ;
511
- request -> userData = target ;
512
-
513
- request -> url = url ;
514
- curl_easy_setopt (slot -> curl , CURLOPT_FILE , packfile );
515
- curl_easy_setopt (slot -> curl , CURLOPT_WRITEFUNCTION , fwrite );
516
- curl_easy_setopt (slot -> curl , CURLOPT_URL , url );
517
- curl_easy_setopt (slot -> curl , CURLOPT_HTTPHEADER , no_pragma_header );
518
- slot -> local = packfile ;
519
-
520
- /*
521
- * If there is data present from a previous transfer attempt,
522
- * resume where it left off
523
- */
524
- prev_posn = ftell (packfile );
525
- if (prev_posn > 0 ) {
526
- if (push_verbosely )
527
- fprintf (stderr ,
528
- "Resuming fetch of pack %s at byte %ld\n" ,
529
- sha1_to_hex (target -> sha1 ), prev_posn );
530
- sprintf (range , "Range: bytes=%ld-" , prev_posn );
531
- range_header = curl_slist_append (range_header , range );
532
- curl_easy_setopt (slot -> curl , CURLOPT_HTTPHEADER , range_header );
533
- }
488
+ preq -> slot -> callback_func = process_response ;
489
+ preq -> slot -> callback_data = request ;
490
+ request -> slot = preq -> slot ;
491
+ request -> userData = preq ;
534
492
535
493
/* Try to get the request started, abort the request on error */
536
494
request -> state = RUN_FETCH_PACKED ;
537
- if (!start_active_slot (slot )) {
495
+ if (!start_active_slot (preq -> slot )) {
538
496
fprintf (stderr , "Unable to start GET request\n" );
497
+ release_http_pack_request (preq );
539
498
repo -> can_update_info_refs = 0 ;
540
499
release_request (request );
541
500
}
@@ -718,22 +677,17 @@ static void release_request(struct transfer_request *request)
718
677
719
678
if (request -> local_fileno != -1 )
720
679
close (request -> local_fileno );
721
- if (request -> local_stream )
722
- fclose (request -> local_stream );
723
680
free (request -> url );
724
681
free (request );
725
682
}
726
683
727
684
static void finish_request (struct transfer_request * request )
728
685
{
729
686
struct stat st ;
730
- struct packed_git * target ;
731
- struct packed_git * * lst ;
732
- struct active_request_slot * slot ;
687
+ struct http_pack_request * preq ;
733
688
734
689
request -> curl_result = request -> slot -> curl_result ;
735
690
request -> http_code = request -> slot -> http_code ;
736
- slot = request -> slot ;
737
691
request -> slot = NULL ;
738
692
739
693
/* Keep locks active */
@@ -821,31 +775,21 @@ static void finish_request(struct transfer_request *request)
821
775
start_fetch_packed (request );
822
776
823
777
} else if (request -> state == RUN_FETCH_PACKED ) {
778
+ int fail = 1 ;
824
779
if (request -> curl_result != CURLE_OK ) {
825
780
fprintf (stderr , "Unable to get pack file %s\n%s" ,
826
781
request -> url , curl_errorstr );
827
- repo -> can_update_info_refs = 0 ;
828
782
} else {
829
- off_t pack_size = ftell (request -> local_stream );
830
-
831
- fclose (request -> local_stream );
832
- request -> local_stream = NULL ;
833
- slot -> local = NULL ;
834
- if (!move_temp_to_file (request -> tmpfile ,
835
- request -> filename )) {
836
- target = (struct packed_git * )request -> userData ;
837
- target -> pack_size = pack_size ;
838
- lst = & repo -> packs ;
839
- while (* lst != target )
840
- lst = & ((* lst )-> next );
841
- * lst = (* lst )-> next ;
842
-
843
- if (!verify_pack (target ))
844
- install_packed_git (target );
845
- else
846
- repo -> can_update_info_refs = 0 ;
783
+ preq = (struct http_pack_request * )request -> userData ;
784
+
785
+ if (preq ) {
786
+ if (finish_http_pack_request (preq ) > 0 )
787
+ fail = 0 ;
788
+ release_http_pack_request (preq );
847
789
}
848
790
}
791
+ if (fail )
792
+ repo -> can_update_info_refs = 0 ;
849
793
release_request (request );
850
794
}
851
795
}
@@ -900,7 +844,6 @@ static void add_fetch_request(struct object *obj)
900
844
request -> lock = NULL ;
901
845
request -> headers = NULL ;
902
846
request -> local_fileno = -1 ;
903
- request -> local_stream = NULL ;
904
847
request -> state = NEED_FETCH ;
905
848
request -> next = request_queue_head ;
906
849
request_queue_head = request ;
@@ -940,7 +883,6 @@ static int add_send_request(struct object *obj, struct remote_lock *lock)
940
883
request -> lock = lock ;
941
884
request -> headers = NULL ;
942
885
request -> local_fileno = -1 ;
943
- request -> local_stream = NULL ;
944
886
request -> state = NEED_PUSH ;
945
887
request -> next = request_queue_head ;
946
888
request_queue_head = request ;
0 commit comments