commit: make ignore_non_trailer() non static
[gitweb.git] / archive.c
index 99fadc88d04ea077e5e5d6e6c065f7c54a4eddaf..952a659bcb59ea8b476d6677f2a04d717c6c7dd2 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -17,6 +17,7 @@ static char const * const archive_usage[] = {
 static const struct archiver **archivers;
 static int nr_archivers;
 static int alloc_archivers;
+static int remote_allow_unreachable;
 
 void register_archiver(struct archiver *ar)
 {
@@ -257,10 +258,10 @@ static void parse_treeish_arg(const char **argv,
        unsigned char sha1[20];
 
        /* Remotes are only allowed to fetch actual refs */
-       if (remote) {
+       if (remote && !remote_allow_unreachable) {
                char *ref = NULL;
-               const char *colon = strchr(name, ':');
-               int refnamelen = colon ? colon - name : strlen(name);
+               const char *colon = strchrnul(name, ':');
+               int refnamelen = colon - name;
 
                if (!dwim_ref(name, refnamelen, sha1, &ref))
                        die("no such ref: %.*s", refnamelen, name);
@@ -411,7 +412,9 @@ int write_archive(int argc, const char **argv, const char *prefix,
        if (setup_prefix && prefix == NULL)
                prefix = setup_git_directory_gently(&nongit);
 
+       git_config_get_bool("uploadarchive.allowunreachable", &remote_allow_unreachable);
        git_config(git_default_config, NULL);
+
        init_tar_archiver();
        init_zip_archiver();
 
@@ -440,7 +443,7 @@ static int match_extension(const char *filename, const char *ext)
         * prefix is non-empty (k.e., we don't match .tar.gz with no actual
         * filename).
         */
-       if (prefixlen < 2 || filename[prefixlen-1] != '.')
+       if (prefixlen < 2 || filename[prefixlen - 1] != '.')
                return 0;
        return !strcmp(filename + prefixlen, ext);
 }