Merge branch 'jk/bug-to-abort' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Jun 2017 20:26:59 +0000 (13:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Jun 2017 20:26:59 +0000 (13:26 -0700)
Introduce the BUG() macro to improve die("BUG: ...").

* jk/bug-to-abort:
usage: add NORETURN to BUG() function definitions
config: complain about --local outside of a git repo
setup_git_env: convert die("BUG") to BUG()
usage.c: add BUG() function

builtin/config.c
environment.c
git-compat-util.h
t/t1300-repo-config.sh
usage.c
index 3a554ad50ca60cd327ce94433022f8d42f024f52..7f6c25d4d95b37f7785e0b6872d059095548c87f 100644 (file)
@@ -496,6 +496,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                usage_with_options(builtin_config_usage, builtin_config_options);
        }
 
+       if (use_local_config && nongit)
+               die(_("--local can only be used inside a git repository"));
+
        if (given_config_source.file &&
                        !strcmp(given_config_source.file, "-")) {
                given_config_source.file = NULL;
index ff6e4f06e93d642aa53ba1812c3788b0ccad092e..1f0bda5afabe901bea250e7dabcc39c5325baf88 100644 (file)
@@ -169,7 +169,7 @@ static void setup_git_env(void)
        git_dir = getenv(GIT_DIR_ENVIRONMENT);
        if (!git_dir) {
                if (!startup_info->have_repository)
-                       die("BUG: setup_git_env called without repository");
+                       BUG("setup_git_env called without repository");
                git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
        }
        gitfile = read_gitfile(git_dir);
index bd04564a69a052ce856f2ba120855541c66fc650..4575b3890b22599d147211576d2f1ea6e7c6833e 100644 (file)
@@ -1064,6 +1064,15 @@ static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size,
 #define HAVE_VARIADIC_MACROS 1
 #endif
 
+#ifdef HAVE_VARIADIC_MACROS
+__attribute__((format (printf, 3, 4))) NORETURN
+void BUG_fl(const char *file, int line, const char *fmt, ...);
+#define BUG(...) BUG_fl(__FILE__, __LINE__, __VA_ARGS__)
+#else
+__attribute__((format (printf, 1, 2))) NORETURN
+void BUG(const char *fmt, ...);
+#endif
+
 /*
  * Preserves errno, prints a message, but gives no warning for ENOENT.
  * Returns 0 on success, which includes trying to unlink an object that does
index afcca0d52c377cfabd6463f060d1b183937ba9de..13b7851f7c2feb87f63449d917380452e85c1f84 100755 (executable)
@@ -1539,4 +1539,10 @@ test_expect_success !MINGW '--show-origin blob ref' '
        test_cmp expect output
 '
 
+test_expect_success '--local requires a repo' '
+       # we expect 128 to ensure that we do not simply
+       # fail to find anything and return code "1"
+       test_expect_code 128 nongit git config --local foo.bar
+'
+
 test_done
diff --git a/usage.c b/usage.c
index ad6d2910fb58e2f27a52646bd79a0442e689517f..1f63e033e99fe3325a96132bdc5b6514d951cecb 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -201,3 +201,35 @@ void warning(const char *warn, ...)
        warn_routine(warn, params);
        va_end(params);
 }
+
+static NORETURN void BUG_vfl(const char *file, int line, const char *fmt, va_list params)
+{
+       char prefix[256];
+
+       /* truncation via snprintf is OK here */
+       if (file)
+               snprintf(prefix, sizeof(prefix), "BUG: %s:%d: ", file, line);
+       else
+               snprintf(prefix, sizeof(prefix), "BUG: ");
+
+       vreportf(prefix, fmt, params);
+       abort();
+}
+
+#ifdef HAVE_VARIADIC_MACROS
+NORETURN void BUG_fl(const char *file, int line, const char *fmt, ...)
+{
+       va_list ap;
+       va_start(ap, fmt);
+       BUG_vfl(file, line, fmt, ap);
+       va_end(ap);
+}
+#else
+NORETURN void BUG(const char *fmt, ...)
+{
+       va_list ap;
+       va_start(ap, fmt);
+       BUG_vfl(NULL, 0, fmt, ap);
+       va_end(ap);
+}
+#endif