Merge branch 'lf/receive-pack-auto-gc-to-client'
authorJunio C Hamano <gitster@pobox.com>
Mon, 27 Jun 2016 16:56:52 +0000 (09:56 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Jun 2016 16:56:52 +0000 (09:56 -0700)
Allow messages that are generated by auto gc during "git push" on
the receiving end to be explicitly passed back to the sending end
over sideband, so that they are shown with "remote: " prefix to
avoid confusing the users.

* lf/receive-pack-auto-gc-to-client:
receive-pack: send auto-gc output over sideband 2

1  2 
builtin/receive-pack.c
diff --combined builtin/receive-pack.c
index a744437b5876171250d4731d181f7b30e5444187,4abfa38a1263aeca0fb714b2d9598e4f208a563f..15c323a7cdc97bce04203d0edcc425e3d74fc7c7
  #include "sigchain.h"
  #include "fsck.h"
  
 -static const char receive_pack_usage[] = "git receive-pack <git-dir>";
 +static const char * const receive_pack_usage[] = {
 +      N_("git receive-pack <git-dir>"),
 +      NULL
 +};
  
  enum deny_action {
        DENY_UNCONFIGURED,
@@@ -52,7 -49,7 +52,7 @@@ static int quiet
  static int prefer_ofs_delta = 1;
  static int auto_update_server_info;
  static int auto_gc = 1;
 -static int fix_thin = 1;
 +static int reject_thin;
  static int stateless_rpc;
  static const char *service_dir;
  static const char *head_name;
@@@ -1084,13 -1081,13 +1084,13 @@@ static void check_aliased_update(struc
        if (!(flag & REF_ISSYMREF))
                return;
  
 -      dst_name = strip_namespace(dst_name);
        if (!dst_name) {
                rp_error("refusing update to broken symref '%s'", cmd->ref_name);
                cmd->skip_update = 1;
                cmd->error_string = "broken symref";
                return;
        }
 +      dst_name = strip_namespace(dst_name);
  
        if ((item = string_list_lookup(list, dst_name)) == NULL)
                return;
@@@ -1551,7 -1548,7 +1551,7 @@@ static const char *unpack(int err_fd, s
                if (fsck_objects)
                        argv_array_pushf(&child.args, "--strict%s",
                                fsck_msg_types.buf);
 -              if (fix_thin)
 +              if (!reject_thin)
                        argv_array_push(&child.args, "--fix-thin");
                child.out = -1;
                child.err = err_fd;
@@@ -1710,29 -1707,45 +1710,29 @@@ static int delete_only(struct command *
  int cmd_receive_pack(int argc, const char **argv, const char *prefix)
  {
        int advertise_refs = 0;
 -      int i;
        struct command *commands;
        struct sha1_array shallow = SHA1_ARRAY_INIT;
        struct sha1_array ref = SHA1_ARRAY_INIT;
        struct shallow_info si;
  
 -      packet_trace_identity("receive-pack");
 +      struct option options[] = {
 +              OPT__QUIET(&quiet, N_("quiet")),
 +              OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
 +              OPT_HIDDEN_BOOL(0, "advertise-refs", &advertise_refs, NULL),
 +              OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin, NULL),
 +              OPT_END()
 +      };
  
 -      argv++;
 -      for (i = 1; i < argc; i++) {
 -              const char *arg = *argv++;
 +      packet_trace_identity("receive-pack");
  
 -              if (*arg == '-') {
 -                      if (!strcmp(arg, "--quiet")) {
 -                              quiet = 1;
 -                              continue;
 -                      }
 +      argc = parse_options(argc, argv, prefix, options, receive_pack_usage, 0);
  
 -                      if (!strcmp(arg, "--advertise-refs")) {
 -                              advertise_refs = 1;
 -                              continue;
 -                      }
 -                      if (!strcmp(arg, "--stateless-rpc")) {
 -                              stateless_rpc = 1;
 -                              continue;
 -                      }
 -                      if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
 -                              fix_thin = 0;
 -                              continue;
 -                      }
 +      if (argc > 1)
 +              usage_msg_opt(_("Too many arguments."), receive_pack_usage, options);
 +      if (argc == 0)
 +              usage_msg_opt(_("You must specify a directory."), receive_pack_usage, options);
  
 -                      usage(receive_pack_usage);
 -              }
 -              if (service_dir)
 -                      usage(receive_pack_usage);
 -              service_dir = arg;
 -      }
 -      if (!service_dir)
 -              usage(receive_pack_usage);
 +      service_dir = argv[0];
  
        setup_path();
  
                        const char *argv_gc_auto[] = {
                                "gc", "--auto", "--quiet", NULL,
                        };
-                       int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
+                       struct child_process proc = CHILD_PROCESS_INIT;
+                       proc.no_stdin = 1;
+                       proc.stdout_to_stderr = 1;
+                       proc.err = use_sideband ? -1 : 0;
+                       proc.git_cmd = 1;
+                       proc.argv = argv_gc_auto;
                        close_all_packs();
-                       run_command_v_opt(argv_gc_auto, opt);
+                       if (!start_command(&proc)) {
+                               if (use_sideband)
+                                       copy_to_sideband(proc.err, -1, NULL);
+                               finish_command(&proc);
+                       }
                }
                if (auto_update_server_info)
                        update_server_info(0);