@@ -395,41 +395,35 @@ static int close_bundle(struct transport *transport)
395
395
}
396
396
397
397
struct git_transport_data {
398
- unsigned thin : 1 ;
399
- unsigned keep : 1 ;
400
- unsigned followtags : 1 ;
401
- int depth ;
398
+ struct git_transport_options options ;
402
399
struct child_process * conn ;
403
400
int fd [2 ];
404
- const char * uploadpack ;
405
- const char * receivepack ;
406
401
struct extra_have_objects extra_have ;
407
402
};
408
403
409
- static int set_git_option (struct transport * connection ,
404
+ static int set_git_option (struct git_transport_options * opts ,
410
405
const char * name , const char * value )
411
406
{
412
- struct git_transport_data * data = connection -> data ;
413
407
if (!strcmp (name , TRANS_OPT_UPLOADPACK )) {
414
- data -> uploadpack = value ;
408
+ opts -> uploadpack = value ;
415
409
return 0 ;
416
410
} else if (!strcmp (name , TRANS_OPT_RECEIVEPACK )) {
417
- data -> receivepack = value ;
411
+ opts -> receivepack = value ;
418
412
return 0 ;
419
413
} else if (!strcmp (name , TRANS_OPT_THIN )) {
420
- data -> thin = !!value ;
414
+ opts -> thin = !!value ;
421
415
return 0 ;
422
416
} else if (!strcmp (name , TRANS_OPT_FOLLOWTAGS )) {
423
- data -> followtags = !!value ;
417
+ opts -> followtags = !!value ;
424
418
return 0 ;
425
419
} else if (!strcmp (name , TRANS_OPT_KEEP )) {
426
- data -> keep = !!value ;
420
+ opts -> keep = !!value ;
427
421
return 0 ;
428
422
} else if (!strcmp (name , TRANS_OPT_DEPTH )) {
429
423
if (!value )
430
- data -> depth = 0 ;
424
+ opts -> depth = 0 ;
431
425
else
432
- data -> depth = atoi (value );
426
+ opts -> depth = atoi (value );
433
427
return 0 ;
434
428
}
435
429
return 1 ;
@@ -439,7 +433,8 @@ static int connect_setup(struct transport *transport, int for_push, int verbose)
439
433
{
440
434
struct git_transport_data * data = transport -> data ;
441
435
data -> conn = git_connect (data -> fd , transport -> url ,
442
- for_push ? data -> receivepack : data -> uploadpack ,
436
+ for_push ? data -> options .receivepack :
437
+ data -> options .uploadpack ,
443
438
verbose ? CONNECT_VERBOSE : 0 );
444
439
return 0 ;
445
440
}
@@ -469,15 +464,15 @@ static int fetch_refs_via_pack(struct transport *transport,
469
464
struct ref * refs_tmp = NULL ;
470
465
471
466
memset (& args , 0 , sizeof (args ));
472
- args .uploadpack = data -> uploadpack ;
473
- args .keep_pack = data -> keep ;
467
+ args .uploadpack = data -> options . uploadpack ;
468
+ args .keep_pack = data -> options . keep ;
474
469
args .lock_pack = 1 ;
475
- args .use_thin_pack = data -> thin ;
476
- args .include_tag = data -> followtags ;
470
+ args .use_thin_pack = data -> options . thin ;
471
+ args .include_tag = data -> options . followtags ;
477
472
args .verbose = (transport -> verbose > 0 );
478
473
args .quiet = (transport -> verbose < 0 );
479
474
args .no_progress = args .quiet || (!transport -> progress && !isatty (1 ));
480
- args .depth = data -> depth ;
475
+ args .depth = data -> options . depth ;
481
476
482
477
for (i = 0 ; i < nr_heads ; i ++ )
483
478
origh [i ] = heads [i ] = xstrdup (to_fetch [i ]-> name );
@@ -734,7 +729,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
734
729
memset (& args , 0 , sizeof (args ));
735
730
args .send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR );
736
731
args .force_update = !!(flags & TRANSPORT_PUSH_FORCE );
737
- args .use_thin_pack = data -> thin ;
732
+ args .use_thin_pack = data -> options . thin ;
738
733
args .verbose = !!(flags & TRANSPORT_PUSH_VERBOSE );
739
734
args .quiet = !!(flags & TRANSPORT_PUSH_QUIET );
740
735
args .dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN );
@@ -847,12 +842,14 @@ struct transport *transport_get(struct remote *remote, const char *url)
847
842
ret -> get_refs_list = get_refs_via_rsync ;
848
843
ret -> fetch = fetch_objs_via_rsync ;
849
844
ret -> push = rsync_transport_push ;
845
+ ret -> smart_options = NULL ;
850
846
} else if (is_local (url ) && is_file (url )) {
851
847
struct bundle_transport_data * data = xcalloc (1 , sizeof (* data ));
852
848
ret -> data = data ;
853
849
ret -> get_refs_list = get_refs_from_bundle ;
854
850
ret -> fetch = fetch_refs_from_bundle ;
855
851
ret -> disconnect = close_bundle ;
852
+ ret -> smart_options = NULL ;
856
853
} else if (!is_url (url )
857
854
|| !prefixcmp (url , "file://" )
858
855
|| !prefixcmp (url , "git://" )
@@ -862,20 +859,14 @@ struct transport *transport_get(struct remote *remote, const char *url)
862
859
/* These are builtin smart transports. */
863
860
struct git_transport_data * data = xcalloc (1 , sizeof (* data ));
864
861
ret -> data = data ;
865
- ret -> set_option = set_git_option ;
862
+ ret -> set_option = NULL ;
866
863
ret -> get_refs_list = get_refs_via_connect ;
867
864
ret -> fetch = fetch_refs_via_pack ;
868
865
ret -> push_refs = git_transport_push ;
869
866
ret -> disconnect = disconnect_git ;
867
+ ret -> smart_options = & (data -> options );
870
868
871
- data -> thin = 1 ;
872
869
data -> conn = NULL ;
873
- data -> uploadpack = "git-upload-pack" ;
874
- if (remote -> uploadpack )
875
- data -> uploadpack = remote -> uploadpack ;
876
- data -> receivepack = "git-receive-pack" ;
877
- if (remote -> receivepack )
878
- data -> receivepack = remote -> receivepack ;
879
870
} else if (!prefixcmp (url , "http://" )
880
871
|| !prefixcmp (url , "https://" )
881
872
|| !prefixcmp (url , "ftp://" )) {
@@ -893,14 +884,39 @@ struct transport *transport_get(struct remote *remote, const char *url)
893
884
transport_helper_init (ret , handler );
894
885
}
895
886
887
+ if (ret -> smart_options ) {
888
+ ret -> smart_options -> thin = 1 ;
889
+ ret -> smart_options -> uploadpack = "git-upload-pack" ;
890
+ if (remote -> uploadpack )
891
+ ret -> smart_options -> uploadpack = remote -> uploadpack ;
892
+ ret -> smart_options -> receivepack = "git-receive-pack" ;
893
+ if (remote -> receivepack )
894
+ ret -> smart_options -> receivepack = remote -> receivepack ;
895
+ }
896
+
896
897
return ret ;
897
898
}
898
899
899
900
int transport_set_option (struct transport * transport ,
900
901
const char * name , const char * value )
901
902
{
903
+ int git_reports = 1 , protocol_reports = 1 ;
904
+
905
+ if (transport -> smart_options )
906
+ git_reports = set_git_option (transport -> smart_options ,
907
+ name , value );
908
+
902
909
if (transport -> set_option )
903
- return transport -> set_option (transport , name , value );
910
+ protocol_reports = transport -> set_option (transport , name ,
911
+ value );
912
+
913
+ /* If either report is 0, report 0 (success). */
914
+ if (!git_reports || !protocol_reports )
915
+ return 0 ;
916
+ /* If either reports -1 (invalid value), report -1. */
917
+ if ((git_reports == -1 ) || (protocol_reports == -1 ))
918
+ return -1 ;
919
+ /* Otherwise if both report unknown, report unknown. */
904
920
return 1 ;
905
921
}
906
922
0 commit comments