@@ -247,7 +247,8 @@ static void parse_pathspec_arg(const char **pathspec,
247
247
}
248
248
249
249
static void parse_treeish_arg (const char * * argv ,
250
- struct archiver_args * ar_args , const char * prefix )
250
+ struct archiver_args * ar_args , const char * prefix ,
251
+ int remote )
251
252
{
252
253
const char * name = argv [0 ];
253
254
const unsigned char * commit_sha1 ;
@@ -256,8 +257,17 @@ static void parse_treeish_arg(const char **argv,
256
257
const struct commit * commit ;
257
258
unsigned char sha1 [20 ];
258
259
259
- if (get_sha1 (name , sha1 ))
260
- die ("Not a valid object name" );
260
+ /* Remotes are only allowed to fetch actual refs */
261
+ if (remote ) {
262
+ char * ref = NULL ;
263
+ if (!dwim_ref (name , strlen (name ), sha1 , & ref ))
264
+ die ("no such ref: %s" , name );
265
+ free (ref );
266
+ }
267
+ else {
268
+ if (get_sha1 (name , sha1 ))
269
+ die ("Not a valid object name" );
270
+ }
261
271
262
272
commit = lookup_commit_reference_gently (sha1 , 1 );
263
273
if (commit ) {
@@ -414,7 +424,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
414
424
setup_git_directory ();
415
425
}
416
426
417
- parse_treeish_arg (argv , & args , prefix );
427
+ parse_treeish_arg (argv , & args , prefix , remote );
418
428
parse_pathspec_arg (argv + 1 , & args );
419
429
420
430
return ar -> write_archive (ar , & args );
0 commit comments