Merge branch 'sp/maint-push-sideband' into sp/push-sideband
authorJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2010 18:00:49 +0000 (10:00 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2010 18:00:49 +0000 (10:00 -0800)
* sp/maint-push-sideband:
receive-pack: Send internal errors over side-band #2
t5401: Use a bare repository for the remote peer

Conflicts:
builtin-receive-pack.c
t/t5401-update-hooks.sh

1  2 
builtin-receive-pack.c
diff --combined builtin-receive-pack.c
index b704fbd5b5a84d00d0fe28db145d869d77a4f320,a5543f9918c3150e1581108b770a4d4c281e812c..0559fcc871894548050e99c8c258561a0dcad5c9
@@@ -139,6 -139,42 +139,42 @@@ static struct command *commands
  static const char pre_receive_hook[] = "hooks/pre-receive";
  static const char post_receive_hook[] = "hooks/post-receive";
  
+ static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
+ static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
+ static void report_message(const char *prefix, const char *err, va_list params)
+ {
+       int sz = strlen(prefix);
+       char msg[4096];
+       strncpy(msg, prefix, sz);
+       sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
+       if (sz > (sizeof(msg) - 1))
+               sz = sizeof(msg) - 1;
+       msg[sz++] = '\n';
+       if (use_sideband)
+               send_sideband(1, 2, msg, sz, use_sideband);
+       else
+               xwrite(2, msg, sz);
+ }
+ static void rp_warning(const char *err, ...)
+ {
+       va_list params;
+       va_start(params, err);
+       report_message("warning: ", err, params);
+       va_end(params);
+ }
+ static void rp_error(const char *err, ...)
+ {
+       va_list params;
+       va_start(params, err);
+       report_message("error: ", err, params);
+       va_end(params);
+ }
  static int copy_to_sideband(int in, int out, void *arg)
  {
        char data[128];
@@@ -250,47 -286,59 +286,47 @@@ static int is_ref_checked_out(const cha
        return !strcmp(head_name, ref);
  }
  
 -static char *warn_unconfigured_deny_msg[] = {
 -      "Updating the currently checked out branch may cause confusion,",
 -      "as the index and work tree do not reflect changes that are in HEAD.",
 -      "As a result, you may see the changes you just pushed into it",
 -      "reverted when you run 'git diff' over there, and you may want",
 -      "to run 'git reset --hard' before starting to work to recover.",
 +static char *refuse_unconfigured_deny_msg[] = {
 +      "By default, updating the current branch in a non-bare repository",
 +      "is denied, because it will make the index and work tree inconsistent",
 +      "with what you pushed, and will require 'git reset --hard' to match",
 +      "the work tree to HEAD.",
        "",
        "You can set 'receive.denyCurrentBranch' configuration variable to",
 -      "'refuse' in the remote repository to forbid pushing into its",
 -      "current branch."
 +      "'ignore' or 'warn' in the remote repository to allow pushing into",
 +      "its current branch; however, this is not recommended unless you",
 +      "arranged to update its work tree to match what you pushed in some",
 +      "other way.",
        "",
 -      "To allow pushing into the current branch, you can set it to 'ignore';",
 -      "but this is not recommended unless you arranged to update its work",
 -      "tree to match what you pushed in some other way.",
 -      "",
 -      "To squelch this message, you can set it to 'warn'.",
 -      "",
 -      "Note that the default will change in a future version of git",
 -      "to refuse updating the current branch unless you have the",
 -      "configuration variable set to either 'ignore' or 'warn'."
 +      "To squelch this message and still keep the default behaviour, set",
 +      "'receive.denyCurrentBranch' configuration variable to 'refuse'."
  };
  
 -static void warn_unconfigured_deny(void)
 +static void refuse_unconfigured_deny(void)
  {
        int i;
 -      for (i = 0; i < ARRAY_SIZE(warn_unconfigured_deny_msg); i++)
 -              rp_warning("%s", warn_unconfigured_deny_msg[i]);
 +      for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
-               error("%s", refuse_unconfigured_deny_msg[i]);
++              rp_error("%s", refuse_unconfigured_deny_msg[i]);
  }
  
 -static char *warn_unconfigured_deny_delete_current_msg[] = {
 -      "Deleting the current branch can cause confusion by making the next",
 -      "'git clone' not check out any file.",
 +static char *refuse_unconfigured_deny_delete_current_msg[] = {
 +      "By default, deleting the current branch is denied, because the next",
 +      "'git clone' won't result in any file checked out, causing confusion.",
        "",
        "You can set 'receive.denyDeleteCurrent' configuration variable to",
 -      "'refuse' in the remote repository to disallow deleting the current",
 -      "branch.",
 -      "",
 -      "You can set it to 'ignore' to allow such a delete without a warning.",
 +      "'warn' or 'ignore' in the remote repository to allow deleting the",
 +      "current branch, with or without a warning message.",
        "",
 -      "To make this warning message less loud, you can set it to 'warn'.",
 -      "",
 -      "Note that the default will change in a future version of git",
 -      "to refuse deleting the current branch unless you have the",
 -      "configuration variable set to either 'ignore' or 'warn'."
 +      "To squelch this message, you can set it to 'refuse'."
  };
  
 -static void warn_unconfigured_deny_delete_current(void)
 +static void refuse_unconfigured_deny_delete_current(void)
  {
        int i;
        for (i = 0;
 -           i < ARRAY_SIZE(warn_unconfigured_deny_delete_current_msg);
 +           i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
             i++)
-               error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
 -              rp_warning("%s", warn_unconfigured_deny_delete_current_msg[i]);
++              rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
  }
  
  static const char *update(struct command *cmd)
  
        /* only refs/... are allowed */
        if (prefixcmp(name, "refs/") || check_ref_format(name + 5)) {
-               error("refusing to create funny ref '%s' remotely", name);
+               rp_error("refusing to create funny ref '%s' remotely", name);
                return "funny refname";
        }
  
                switch (deny_current_branch) {
                case DENY_IGNORE:
                        break;
 -              case DENY_UNCONFIGURED:
                case DENY_WARN:
-                       warning("updating the current branch");
+                       rp_warning("updating the current branch");
 -                      if (deny_current_branch == DENY_UNCONFIGURED)
 -                              warn_unconfigured_deny();
                        break;
                case DENY_REFUSE:
-                       error("refusing to update checked out branch: %s", name);
 +              case DENY_UNCONFIGURED:
+                       rp_error("refusing to update checked out branch: %s", name);
 +                      if (deny_current_branch == DENY_UNCONFIGURED)
 +                              refuse_unconfigured_deny();
                        return "branch is currently checked out";
                }
        }
  
        if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
                if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
-                       error("denying ref deletion for %s", name);
+                       rp_error("denying ref deletion for %s", name);
                        return "deletion prohibited";
                }
  
                        case DENY_IGNORE:
                                break;
                        case DENY_WARN:
-                               warning("deleting the current branch");
 -                      case DENY_UNCONFIGURED:
 -                              if (deny_delete_current == DENY_UNCONFIGURED)
 -                                      warn_unconfigured_deny_delete_current();
+                               rp_warning("deleting the current branch");
                                break;
                        case DENY_REFUSE:
-                               error("refusing to delete the current branch: %s", name);
 +                      case DENY_UNCONFIGURED:
 +                              if (deny_delete_current == DENY_UNCONFIGURED)
 +                                      refuse_unconfigured_deny_delete_current();
+                               rp_error("refusing to delete the current branch: %s", name);
                                return "deletion of the current branch prohibited";
                        }
                }
                                break;
                free_commit_list(bases);
                if (!ent) {
-                       error("denying non-fast-forward %s"
-                             " (you should pull first)", name);
+                       rp_error("denying non-fast-forward %s"
+                                " (you should pull first)", name);
                        return "non-fast-forward";
                }
        }
        if (run_update_hook(cmd)) {
-               error("hook declined to update %s", name);
+               rp_error("hook declined to update %s", name);
                return "hook declined";
        }
  
        if (is_null_sha1(new_sha1)) {
                if (!parse_object(old_sha1)) {
-                       warning ("Allowing deletion of corrupt ref.");
+                       rp_warning("Allowing deletion of corrupt ref.");
                        old_sha1 = NULL;
                }
                if (delete_ref(name, old_sha1, 0)) {
-                       error("failed to delete %s", name);
+                       rp_error("failed to delete %s", name);
                        return "failed to delete";
                }
                return NULL; /* good */
        else {
                lock = lock_any_ref_for_update(name, old_sha1, 0);
                if (!lock) {
-                       error("failed to lock %s", name);
+                       rp_error("failed to lock %s", name);
                        return "failed to lock";
                }
                if (write_ref_sha1(lock, new_sha1, "push")) {