Some time we need to get valid commit without a ref but with proper tree-ish, now we can't do that. This patch allow upload-archive's to use reachability checking rather than checking that is a ref. This means a remote client can fetch a tip of any valid sha1 or tree-ish. --- archive.c | 24 +++++++++++++----------- t/t5000-tar-tree.sh | 2 ++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/archive.c b/archive.c index 93e00bb..0a48985 100644 --- a/archive.c +++ b/archive.c @@ -5,6 +5,7 @@ #include "archive.h" #include "parse-options.h" #include "unpack-trees.h" +#include "refs.h" static char const * const archive_usage[] = { N_("git archive [options] <tree-ish> [<path>...]"), @@ -241,6 +242,13 @@ static void parse_pathspec_arg(const char **pathspec, } } +static int check_reachable(const char *refname, const unsigned char *sha1, + int flag, void *cb_data) +{ + + return in_merge_bases(cb_data, lookup_commit_reference_gently(sha1, 1)); +} + static void parse_treeish_arg(const char **argv, struct archiver_args *ar_args, const char *prefix, int remote) @@ -252,22 +260,16 @@ static void parse_treeish_arg(const char **argv, const struct commit *commit; unsigned char sha1[20]; - /* Remotes are only allowed to fetch actual refs */ - if (remote) { - char *ref = NULL; - const char *colon = strchr(name, ':'); - int refnamelen = colon ? colon - name : strlen(name); - - if (!dwim_ref(name, refnamelen, sha1, &ref)) - die("no such ref: %.*s", refnamelen, name); - free(ref); - } - if (get_sha1(name, sha1)) die("Not a valid object name"); commit = lookup_commit_reference_gently(sha1, 1); if (commit) { + + /* Remotes are only allowed to fetch actual objects */ + if (remote && !for_each_ref(check_reachable, (void *)commit)) + die("Not a valid object name"); + commit_sha1 = commit->object.sha1; archive_time = commit->date; } else { diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index e7c240f..fc35406 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -194,6 +194,8 @@ test_expect_success 'clients cannot access unreachable commits' ' sha1=`git rev-parse HEAD` && git reset --hard HEAD^ && git archive $sha1 >remote.tar && + git archive --remote=. $sha1 >remote.tar && + git tag -d unreachable && test_must_fail git archive --remote=. $sha1 >remote.tar ' -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html