]> granicus.if.org Git - git/commitdiff
Merge branch 'jk/common-main'
authorJunio C Hamano <gitster@pobox.com>
Tue, 19 Jul 2016 20:22:19 +0000 (13:22 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Jul 2016 20:22:19 +0000 (13:22 -0700)
There are certain house-keeping tasks that need to be performed at
the very beginning of any Git program, and programs that are not
built-in commands had to do them exactly the same way as "git"
potty does.  It was easy to make mistakes in one-off standalone
programs (like test helpers).  A common "main()" function that
calls cmd_main() of individual program has been introduced to
make it harder to make mistakes.

* jk/common-main:
  mingw: declare main()'s argv as const
  common-main: call git_setup_gettext()
  common-main: call restore_sigpipe_to_default()
  common-main: call sanitize_stdfds()
  common-main: call git_extract_argv0_path()
  add an extra level of indirection to main()

12 files changed:
1  2 
Makefile
compat/mingw.h
daemon.c
fast-import.c
git-compat-util.h
imap-send.c
t/helper/test-config.c
t/helper/test-date.c
t/helper/test-parse-options.c
t/helper/test-regex.c
t/helper/test-submodule-config.c
upload-pack.c

diff --cc Makefile
Simple merge
diff --cc compat/mingw.h
index 9a8803b876a1ed38aca34e83c3859e607bdd17e7,1ac9086a8275341a1a9a66338cc196d6782e7371..233933ee86b2d069c7fca5b0dc39ea6c6badb20b
@@@ -532,10 -532,10 +532,10 @@@ extern CRITICAL_SECTION pinfo_cs
   * A replacement of main() that adds win32 specific initialization.
   */
  
 -void mingw_startup();
 -#define main(c,v) dummy_decl_mingw_main(); \
 +void mingw_startup(void);
 +#define main(c,v) dummy_decl_mingw_main(void); \
  static int mingw_main(c,v); \
- int main(int argc, char **argv) \
+ int main(int argc, const char **argv) \
  { \
        mingw_startup(); \
        return mingw_main(__argc, (void *)__argv); \
diff --cc daemon.c
Simple merge
diff --cc fast-import.c
index 59630cee1488bda274bd4f4bd8bf2748d9ab081a,84a13756cc6387d7546ebda8d3c92a6c49a53cf8..bf53ac95da04327aa2b83ff2943d51e6d0c731db
@@@ -164,9 -164,7 +164,8 @@@ Format of STDIN stream
  #include "refs.h"
  #include "csum-file.h"
  #include "quote.h"
- #include "exec_cmd.h"
  #include "dir.h"
 +#include "run-command.h"
  
  #define PACK_ID_BITS 16
  #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
Simple merge
diff --cc imap-send.c
Simple merge
index 509aeef400e6495ce7ca428d7df5cd63f3aa1247,d143cd72223dec9c947fbf84d0f72945745a09c6..3c6d08cd095152cab9abeb038c1b4f82440c55cd
   *
   */
  
 +static const char *scope_name(enum config_scope scope)
 +{
 +      switch (scope) {
 +      case CONFIG_SCOPE_SYSTEM:
 +              return "system";
 +      case CONFIG_SCOPE_GLOBAL:
 +              return "global";
 +      case CONFIG_SCOPE_REPO:
 +              return "repo";
 +      case CONFIG_SCOPE_CMDLINE:
 +              return "cmdline";
 +      default:
 +              return "unknown";
 +      }
 +}
 +static int iterate_cb(const char *var, const char *value, void *data)
 +{
 +      static int nr;
 +
 +      if (nr++)
 +              putchar('\n');
 +
 +      printf("key=%s\n", var);
 +      printf("value=%s\n", value ? value : "(null)");
 +      printf("origin=%s\n", current_config_origin_type());
 +      printf("name=%s\n", current_config_name());
 +      printf("scope=%s\n", scope_name(current_config_scope()));
 +
 +      return 0;
 +}
  
- int main(int argc, char **argv)
+ int cmd_main(int argc, const char **argv)
  {
        int i, val;
        const char *v;
index d9ab3609094df80a1e3afc3d24d8fd158c96e496,0f3cfb1721b641b25267458edce93c9de2f923e2..506054bcd5dfbd76c8aec85382f35794514b9db9
@@@ -6,7 -5,7 +6,7 @@@ static const char *usage_msg = "\n
  "  test-date parse [date]...\n"
  "  test-date approxidate [date]...\n";
  
- static void show_relative_dates(char **argv, struct timeval *now)
 -static void show_dates(const char **argv, struct timeval *now)
++static void show_relative_dates(const char **argv, struct timeval *now)
  {
        struct strbuf buf = STRBUF_INIT;
  
        strbuf_release(&buf);
  }
  
- static void show_dates(char **argv, const char *format)
++static void show_dates(const char **argv, const char *format)
 +{
 +      struct date_mode mode;
 +
 +      parse_date_format(format, &mode);
 +      for (; *argv; argv++) {
-               char *arg = *argv;
++              char *arg;
 +              time_t t;
 +              int tz;
 +
 +              /*
 +               * Do not use our normal timestamp parsing here, as the point
 +               * is to test the formatting code in isolation.
 +               */
-               t = strtol(arg, &arg, 10);
++              t = strtol(*argv, &arg, 10);
 +              while (*arg == ' ')
 +                      arg++;
 +              tz = atoi(arg);
 +
 +              printf("%s -> %s\n", *argv, show_date(t, tz, &mode));
 +      }
 +}
 +
- static void parse_dates(char **argv, struct timeval *now)
+ static void parse_dates(const char **argv, struct timeval *now)
  {
        struct strbuf result = STRBUF_INIT;
  
Simple merge
index eff26f534fc21e3d77bc3d6cf76fce2b5a74e981,37b7f06e552ef51c852f54e70d66c434ca50b6b2..b5ea8a97c54e1737d91dec894c1cc02e1baf64e5
@@@ -33,43 -16,5 +33,43 @@@ static int test_regex_bug(void
        if (m[0].rm_so == 3) /* matches '\n' when it should not */
                die("regex bug confirmed: re-build git with NO_REGEX=1");
  
 -      exit(0);
 +      return 0;
 +}
 +
- int main(int argc, char **argv)
++int cmd_main(int argc, const char **argv)
 +{
 +      const char *pat;
 +      const char *str;
 +      int flags = 0;
 +      regex_t r;
 +      regmatch_t m[1];
 +
 +      if (argc == 2 && !strcmp(argv[1], "--bug"))
 +              return test_regex_bug();
 +      else if (argc < 3)
 +              usage("test-regex --bug\n"
 +                    "test-regex <pattern> <string> [<options>]");
 +
 +      argv++;
 +      pat = *argv++;
 +      str = *argv++;
 +      while (*argv) {
 +              struct reg_flag *rf;
 +              for (rf = reg_flags; rf->name; rf++)
 +                      if (!strcmp(*argv, rf->name)) {
 +                              flags |= rf->flag;
 +                              break;
 +                      }
 +              if (!rf->name)
 +                      die("do not recognize %s", *argv);
 +              argv++;
 +      }
 +      git_setup_gettext();
 +
 +      if (regcomp(&r, pat, flags))
 +              die("failed regcomp() for pattern '%s'", pat);
 +      if (regexec(&r, str, 1, m, 0))
 +              return 1;
 +
 +      return 0;
  }
Simple merge
diff --cc upload-pack.c
index f93787003a21b465c33ab8302347d80e46c10428,b97a7659d1f2ffeb8e63fa46a17ca1501db983ab..d4cc414bc218d193225d7b7891638b3798173254
@@@ -828,35 -816,45 +828,32 @@@ static int upload_pack_config(const cha
        return parse_hide_refs_config(var, value, "uploadpack");
  }
  
- int main(int argc, const char **argv)
+ int cmd_main(int argc, const char **argv)
  {
        const char *dir;
 -      int i;
        int strict = 0;
 +      struct option options[] = {
 +              OPT_BOOL(0, "stateless-rpc", &stateless_rpc,
 +                       N_("quit after a single request/response exchange")),
 +              OPT_BOOL(0, "advertise-refs", &advertise_refs,
 +                       N_("exit immediately after intial ref advertisement")),
 +              OPT_BOOL(0, "strict", &strict,
 +                       N_("do not try <directory>/.git/ if <directory> is no Git directory")),
 +              OPT_INTEGER(0, "timeout", &timeout,
 +                          N_("interrupt transfer after <n> seconds of inactivity")),
 +              OPT_END()
 +      };
  
-       git_setup_gettext();
        packet_trace_identity("upload-pack");
-       git_extract_argv0_path(argv[0]);
        check_replace_refs = 0;
  
 -      for (i = 1; i < argc; i++) {
 -              const char *arg = argv[i];
 +      argc = parse_options(argc, argv, NULL, options, upload_pack_usage, 0);
  
 -              if (arg[0] != '-')
 -                      break;
 -              if (!strcmp(arg, "--advertise-refs")) {
 -                      advertise_refs = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--stateless-rpc")) {
 -                      stateless_rpc = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--strict")) {
 -                      strict = 1;
 -                      continue;
 -              }
 -              if (starts_with(arg, "--timeout=")) {
 -                      timeout = atoi(arg+10);
 -                      daemon_mode = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--")) {
 -                      i++;
 -                      break;
 -              }
 -      }
 +      if (argc != 1)
 +              usage_with_options(upload_pack_usage, options);
  
 -      if (i != argc-1)
 -              usage(upload_pack_usage);
 +      if (timeout)
 +              daemon_mode = 1;
  
        setup_path();