X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=archive.c;h=164bbd014a82feac48886db6f27ba85d61a059ac;hb=bd193f46b70fd3f8a55e2a8dcbb1fb2b4eec13d6;hp=2ae740a71e6d43ee81afdeddcb53f983f10a8fff;hpb=68f80f549092bcbb2409ba9c0eace73c085ba7cc;p=git.git diff --git a/archive.c b/archive.c index 2ae740a71..164bbd014 100644 --- a/archive.c +++ b/archive.c @@ -247,7 +247,8 @@ static void parse_pathspec_arg(const char **pathspec, } static void parse_treeish_arg(const char **argv, - struct archiver_args *ar_args, const char *prefix) + struct archiver_args *ar_args, const char *prefix, + int remote) { const char *name = argv[0]; const unsigned char *commit_sha1; @@ -256,8 +257,17 @@ static void parse_treeish_arg(const char **argv, const struct commit *commit; unsigned char sha1[20]; - if (get_sha1(name, sha1)) - die("Not a valid object name"); + /* Remotes are only allowed to fetch actual refs */ + if (remote) { + char *ref = NULL; + if (!dwim_ref(name, strlen(name), sha1, &ref)) + die("no such ref: %s", name); + free(ref); + } + else { + if (get_sha1(name, sha1)) + die("Not a valid object name"); + } commit = lookup_commit_reference_gently(sha1, 1); if (commit) { @@ -414,7 +424,7 @@ int write_archive(int argc, const char **argv, const char *prefix, setup_git_directory(); } - parse_treeish_arg(argv, &args, prefix); + parse_treeish_arg(argv, &args, prefix, remote); parse_pathspec_arg(argv + 1, &args); return ar->write_archive(ar, &args);