summary refs log tree commit
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-11-23 11:23:17 -0800
committerJunio C Hamano <gitster@pobox.com>2016-11-23 11:23:17 -0800
commitc34a7daad74b0f7b0dc72de131dbb9e919b0ab32 (patch)
tree1d2770d0c868cc2be228028e4865724cb860e48d
parent6a2b569c2fec49cc213e0218f1251749771044d6 (diff)
parenteb0224c617ba6b4299f2a9f85d6c4b3b5e10abc0 (diff)
"git archive" and "git mailinfo" stopped reading from local
configuration file with a recent update.

* jc/setup-cleanup-fix:
  archive: read local configuration
  mailinfo: read local configuration
-rw-r--r--archive.c8
-rw-r--r--archive.h2
-rw-r--r--builtin/archive.c6
-rw-r--r--builtin/mailinfo.c19
-rw-r--r--builtin/upload-archive.c2
-rw-r--r--git.c4
-rwxr-xr-xt/t5000-tar-tree.sh35
-rwxr-xr-xt/t5100-mailinfo.sh13
8 files changed, 69 insertions, 20 deletions
diff --git a/archive.c b/archive.c
index dde1ab4c79..01751e574b 100644
--- a/archive.c
+++ b/archive.c
@@ -504,15 +504,11 @@ static int parse_archive_args(int argc, const char **argv,
 }
 
 int write_archive(int argc, const char **argv, const char *prefix,
-                  int setup_prefix, const char *name_hint, int remote)
+                  const char *name_hint, int remote)
 {
-        int nongit = 0;
         const struct archiver *ar = NULL;
         struct archiver_args args;
 
-        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);
 
@@ -520,7 +516,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
         init_zip_archiver();
 
         argc = parse_archive_args(argc, argv, &ar, &args, name_hint, remote);
-        if (nongit) {
+        if (!startup_info->have_repository) {
                 /*
                  * We know this will die() with an error, so we could just
                  * die ourselves; but its error message will be more specific
diff --git a/archive.h b/archive.h
index 4a791e1fed..415e0152e2 100644
--- a/archive.h
+++ b/archive.h
@@ -36,7 +36,7 @@ typedef int (*write_archive_entry_fn_t)(struct archiver_args *args,
                                         unsigned int mode);
 
 extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry);
-extern int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix, const char *name_hint, int remote);
+extern int write_archive(int argc, const char **argv, const char *prefix, const char *name_hint, int remote);
 
 const char *archive_format_from_filename(const char *filename);
 extern void *sha1_file_to_archive(const struct archiver_args *args,
diff --git a/builtin/archive.c b/builtin/archive.c
index 49f491413a..f863465a0f 100644
--- a/builtin/archive.c
+++ b/builtin/archive.c
@@ -85,8 +85,8 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
         const char *output = NULL;
         const char *remote = NULL;
         struct option local_opts[] = {
-                OPT_STRING('o', "output", &output, N_("file"),
-                        N_("write the archive to this file")),
+                OPT_FILENAME('o', "output", &output,
+                             N_("write the archive to this file")),
                 OPT_STRING(0, "remote", &remote, N_("repo"),
                         N_("retrieve the archive from remote repository <repo>")),
                 OPT_STRING(0, "exec", &exec, N_("command"),
@@ -105,5 +105,5 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
 
         setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
 
-        return write_archive(argc, argv, prefix, 1, output, 0);
+        return write_archive(argc, argv, prefix, output, 0);
 }
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index f6df274111..e3b62f2fc7 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -11,15 +11,20 @@
 static const char mailinfo_usage[] =
         "git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info";
 
+static char *prefix_copy(const char *prefix, const char *filename)
+{
+        if (!prefix || is_absolute_path(filename))
+                return xstrdup(filename);
+        return xstrdup(prefix_filename(prefix, strlen(prefix), filename));
+}
+
 int cmd_mailinfo(int argc, const char **argv, const char *prefix)
 {
         const char *def_charset;
         struct mailinfo mi;
         int status;
+        char *msgfile, *patchfile;
 
-        /* NEEDSWORK: might want to do the optional .git/ directory
-         * discovery
-         */
         setup_mailinfo(&mi);
 
         def_charset = get_commit_output_encoding();
@@ -54,8 +59,14 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
 
         mi.input = stdin;
         mi.output = stdout;
-        status = !!mailinfo(&mi, argv[1], argv[2]);
+
+        msgfile = prefix_copy(prefix, argv[1]);
+        patchfile = prefix_copy(prefix, argv[2]);
+
+        status = !!mailinfo(&mi, msgfile, patchfile);
         clear_mailinfo(&mi);
 
+        free(msgfile);
+        free(patchfile);
         return status;
 }
diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c
index dc872f6a94..cde06977b7 100644
--- a/builtin/upload-archive.c
+++ b/builtin/upload-archive.c
@@ -43,7 +43,7 @@ int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix)
         }
 
         /* parse all options sent by the client */
-        return write_archive(sent_argv.argc, sent_argv.argv, prefix, 0, NULL, 1);
+        return write_archive(sent_argv.argc, sent_argv.argv, prefix, NULL, 1);
 }
 
 __attribute__((format (printf, 1, 2)))
diff --git a/git.c b/git.c
index efa1059fe0..e8b2baf2d1 100644
--- a/git.c
+++ b/git.c
@@ -396,7 +396,7 @@ static struct cmd_struct commands[] = {
         { "am", cmd_am, RUN_SETUP | NEED_WORK_TREE },
         { "annotate", cmd_annotate, RUN_SETUP },
         { "apply", cmd_apply, RUN_SETUP_GENTLY },
-        { "archive", cmd_archive },
+        { "archive", cmd_archive, RUN_SETUP_GENTLY },
         { "bisect--helper", cmd_bisect__helper, RUN_SETUP },
         { "blame", cmd_blame, RUN_SETUP },
         { "branch", cmd_branch, RUN_SETUP },
@@ -445,7 +445,7 @@ static struct cmd_struct commands[] = {
         { "ls-files", cmd_ls_files, RUN_SETUP | SUPPORT_SUPER_PREFIX },
         { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },
         { "ls-tree", cmd_ls_tree, RUN_SETUP },
-        { "mailinfo", cmd_mailinfo },
+        { "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY },
         { "mailsplit", cmd_mailsplit },
         { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
         { "merge-base", cmd_merge_base, RUN_SETUP },
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 80b2387341..830bf2a2f6 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -94,6 +94,20 @@ check_tar() {
         '
 }
 
+# run "$@" inside a non-git directory
+nongit () {
+        test -d non-repo ||
+        mkdir non-repo ||
+        return 1
+
+        (
+                GIT_CEILING_DIRECTORIES=$(pwd) &&
+                export GIT_CEILING_DIRECTORIES &&
+                cd non-repo &&
+                "$@"
+        )
+}
+
 test_expect_success \
     'populate workdir' \
     'mkdir a &&
@@ -179,6 +193,15 @@ test_expect_success 'git archive --remote' \
     'git archive --remote=. HEAD >b5.tar &&
     test_cmp_bin b.tar b5.tar'
 
+test_expect_success 'git archive --remote with configured remote' '
+        git config remote.foo.url . &&
+        (
+                cd a &&
+                git archive --remote=foo --output=../b5-nick.tar HEAD
+        ) &&
+        test_cmp_bin b.tar b5-nick.tar
+'
+
 test_expect_success \
     'validate file modification time' \
     'mkdir extract &&
@@ -197,9 +220,15 @@ test_expect_success 'git archive with --output, override inferred format' '
         test_cmp_bin b.tar d4.zip
 '
 
-test_expect_success \
-    'git archive --list outside of a git repo' \
-    'GIT_DIR=some/non-existing/directory git archive --list'
+test_expect_success 'git archive --list outside of a git repo' '
+        nongit git archive --list
+'
+
+test_expect_success 'git archive --remote outside of a git repo' '
+        git archive HEAD >expect.tar &&
+        nongit git archive --remote="$PWD" HEAD >actual.tar &&
+        test_cmp_bin expect.tar actual.tar
+'
 
 test_expect_success 'clients cannot access unreachable commits' '
         test_commit unreachable &&
diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh
index e6b995161e..7171f67539 100755
--- a/t/t5100-mailinfo.sh
+++ b/t/t5100-mailinfo.sh
@@ -158,4 +158,17 @@ test_expect_success 'mailinfo handles rfc2822 comment' '
         test_cmp "$DATA/comment.expect" comment/info
 '
 
+test_expect_success 'mailinfo with mailinfo.scissors config' '
+        test_config mailinfo.scissors true &&
+        (
+                mkdir sub &&
+                cd sub &&
+                git mailinfo ../msg0014.sc ../patch0014.sc <../0014 >../info0014.sc
+        ) &&
+        test_cmp "$DATA/msg0014--scissors" msg0014.sc &&
+        test_cmp "$DATA/patch0014--scissors" patch0014.sc &&
+        test_cmp "$DATA/info0014--scissors" info0014.sc
+'
+
+
 test_done