git-svn: Send deltas during commits
[gitweb.git] / builtin-checkout.c
index e95eab9b1b1f068e432c4106d603becaa8f0d1f6..efdb1e02bf21fb3b901d375a547d7fbf44e0894b 100644 (file)
@@ -157,7 +157,7 @@ struct checkout_opts {
        int force;
        int writeout_error;
 
-       char *new_branch;
+       const char *new_branch;
        int new_branch_log;
        enum branch_track track;
 };
@@ -386,13 +386,11 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
        }
 
        /*
-        * If the new thing isn't a branch and isn't HEAD and we're
-        * not starting a new branch, and we want messages, and we
-        * weren't on a branch, and we're moving to a new commit,
-        * describe the old commit.
+        * If we were on a detached HEAD, but we are now moving to
+        * a new commit, we want to mention the old commit once more
+        * to remind the user that it might be lost.
         */
-       if (!new->path && strcmp(new->name, "HEAD") && !opts->new_branch &&
-           !opts->quiet && !old.path && new->commit != old.commit)
+       if (!opts->quiet && !old.path && new->commit != old.commit)
                describe_detached_head("Previous HEAD position was", old.commit);
 
        if (!old.commit) {
@@ -437,27 +435,27 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 
        git_config(git_default_config, NULL);
 
-       opts.track = -1;
+       opts.track = BRANCH_TRACK_UNSPECIFIED;
 
        argc = parse_options(argc, argv, options, checkout_usage,
                             PARSE_OPT_KEEP_DASHDASH);
 
        /* --track without -b should DWIM */
-       if (opts.track && opts.track != -1 && !opts.new_branch) {
-               char *slash;
-               if (!argc || !strcmp(argv[0], "--"))
+       if (0 < opts.track && !opts.new_branch) {
+               const char *argv0 = argv[0];
+               if (!argc || !strcmp(argv0, "--"))
                        die ("--track needs a branch name");
-               slash = strchr(argv[0], '/');
-               if (slash && !prefixcmp(argv[0], "refs/"))
-                       slash = strchr(slash + 1, '/');
-               if (slash && !prefixcmp(argv[0], "remotes/"))
-                       slash = strchr(slash + 1, '/');
-               if (!slash || !slash[1])
+               if (!prefixcmp(argv0, "refs/"))
+                       argv0 += 5;
+               if (!prefixcmp(argv0, "remotes/"))
+                       argv0 += 8;
+               argv0 = strchr(argv0, '/');
+               if (!argv0 || !argv0[1])
                        die ("Missing branch name; try -b");
-               opts.new_branch = slash + 1;
+               opts.new_branch = argv0 + 1;
        }
 
-       if (opts.track == -1)
+       if (opts.track == BRANCH_TRACK_UNSPECIFIED)
                opts.track = git_branch_track;
 
        if (opts.force && opts.merge)