Merge branch 'jk/diff-graph-submodule-summary'
[gitweb.git] / branch.c
index eccdaf93924334137833e5acf7541aa514588c2d..6ae6a4c321ab8866a3e21f15302b5549a95b4646 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -74,25 +74,33 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
                strbuf_addf(&key, "branch.%s.rebase", local);
                git_config_set(key.buf, "true");
        }
+       strbuf_release(&key);
 
        if (flag & BRANCH_CONFIG_VERBOSE) {
-               strbuf_reset(&key);
-
-               strbuf_addstr(&key, origin ? "remote" : "local");
-
-               /* Are we tracking a proper "branch"? */
-               if (remote_is_branch) {
-                       strbuf_addf(&key, " branch %s", shortname);
-                       if (origin)
-                               strbuf_addf(&key, " from %s", origin);
-               }
+               if (remote_is_branch && origin)
+                       printf(rebasing ?
+                              "Branch %s set up to track remote branch %s from %s by rebasing.\n" :
+                              "Branch %s set up to track remote branch %s from %s.\n",
+                              local, shortname, origin);
+               else if (remote_is_branch && !origin)
+                       printf(rebasing ?
+                              "Branch %s set up to track local branch %s by rebasing.\n" :
+                              "Branch %s set up to track local branch %s.\n",
+                              local, shortname);
+               else if (!remote_is_branch && origin)
+                       printf(rebasing ?
+                              "Branch %s set up to track remote ref %s by rebasing.\n" :
+                              "Branch %s set up to track remote ref %s.\n",
+                              local, remote);
+               else if (!remote_is_branch && !origin)
+                       printf(rebasing ?
+                              "Branch %s set up to track local ref %s by rebasing.\n" :
+                              "Branch %s set up to track local ref %s.\n",
+                              local, remote);
                else
-                       strbuf_addf(&key, " ref %s", remote);
-               printf("Branch %s set up to track %s%s.\n",
-                      local, key.buf,
-                      rebasing ? " by rebasing" : "");
+                       die("BUG: impossible combination of %d and %p",
+                           remote_is_branch, origin);
        }
-       strbuf_release(&key);
 }
 
 /*
@@ -189,6 +197,20 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
        return 1;
 }
 
+static const char upstream_not_branch[] =
+N_("Cannot setup tracking information; starting point '%s' is not a branch.");
+static const char upstream_missing[] =
+N_("the requested upstream branch '%s' does not exist");
+static const char upstream_advice[] =
+N_("\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push.");
+
 void create_branch(const char *head,
                   const char *name, const char *start_name,
                   int force, int reflog, int clobber_head,
@@ -216,21 +238,30 @@ void create_branch(const char *head,
        }
 
        real_ref = NULL;
-       if (get_sha1(start_name, sha1))
+       if (get_sha1(start_name, sha1)) {
+               if (explicit_tracking) {
+                       if (advice_set_upstream_failure) {
+                               error(_(upstream_missing), start_name);
+                               advise(_(upstream_advice));
+                               exit(1);
+                       }
+                       die(_(upstream_missing), start_name);
+               }
                die("Not a valid object name: '%s'.", start_name);
+       }
 
        switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
        case 0:
                /* Not branching from any existing branch */
                if (explicit_tracking)
-                       die("Cannot setup tracking information; starting point is not a branch.");
+                       die(_(upstream_not_branch), start_name);
                break;
        case 1:
                /* Unique completion -- good, only if it is a real branch */
                if (prefixcmp(real_ref, "refs/heads/") &&
                    prefixcmp(real_ref, "refs/remotes/")) {
                        if (explicit_tracking)
-                               die("Cannot setup tracking information; starting point is not a branch.");
+                               die(_(upstream_not_branch), start_name);
                        else
                                real_ref = NULL;
                }