@@ -290,6 +290,7 @@ static void output_refs(struct ref *refs)
290
290
struct rpc_state {
291
291
const char * service_name ;
292
292
const char * * argv ;
293
+ struct strbuf * stdin_preamble ;
293
294
char * service_url ;
294
295
char * hdr_content_type ;
295
296
char * hdr_accept ;
@@ -535,6 +536,7 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads)
535
536
{
536
537
const char * svc = rpc -> service_name ;
537
538
struct strbuf buf = STRBUF_INIT ;
539
+ struct strbuf * preamble = rpc -> stdin_preamble ;
538
540
struct child_process client ;
539
541
int err = 0 ;
540
542
@@ -545,6 +547,8 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads)
545
547
client .argv = rpc -> argv ;
546
548
if (start_command (& client ))
547
549
exit (1 );
550
+ if (preamble )
551
+ write_or_die (client .in , preamble -> buf , preamble -> len );
548
552
if (heads )
549
553
write_or_die (client .in , heads -> buf , heads -> len );
550
554
@@ -626,13 +630,14 @@ static int fetch_git(struct discovery *heads,
626
630
int nr_heads , struct ref * * to_fetch )
627
631
{
628
632
struct rpc_state rpc ;
633
+ struct strbuf preamble = STRBUF_INIT ;
629
634
char * depth_arg = NULL ;
630
- const char * * argv ;
631
635
int argc = 0 , i , err ;
636
+ const char * argv [15 ];
632
637
633
- argv = xmalloc ((15 + nr_heads ) * sizeof (char * ));
634
638
argv [argc ++ ] = "fetch-pack" ;
635
639
argv [argc ++ ] = "--stateless-rpc" ;
640
+ argv [argc ++ ] = "--stdin" ;
636
641
argv [argc ++ ] = "--lock-pack" ;
637
642
if (options .followtags )
638
643
argv [argc ++ ] = "--include-tag" ;
@@ -651,24 +656,27 @@ static int fetch_git(struct discovery *heads,
651
656
argv [argc ++ ] = depth_arg ;
652
657
}
653
658
argv [argc ++ ] = url ;
659
+ argv [argc ++ ] = NULL ;
660
+
654
661
for (i = 0 ; i < nr_heads ; i ++ ) {
655
662
struct ref * ref = to_fetch [i ];
656
663
if (!ref -> name || !* ref -> name )
657
664
die ("cannot fetch by sha1 over smart http" );
658
- argv [ argc ++ ] = ref -> name ;
665
+ packet_buf_write ( & preamble , "%s\n" , ref -> name ) ;
659
666
}
660
- argv [ argc ++ ] = NULL ;
667
+ packet_buf_flush ( & preamble ) ;
661
668
662
669
memset (& rpc , 0 , sizeof (rpc ));
663
670
rpc .service_name = "git-upload-pack" ,
664
671
rpc .argv = argv ;
672
+ rpc .stdin_preamble = & preamble ;
665
673
rpc .gzip_request = 1 ;
666
674
667
675
err = rpc_service (& rpc , heads );
668
676
if (rpc .result .len )
669
677
safe_write (1 , rpc .result .buf , rpc .result .len );
670
678
strbuf_release (& rpc .result );
671
- free ( argv );
679
+ strbuf_release ( & preamble );
672
680
free (depth_arg );
673
681
return err ;
674
682
}
0 commit comments