Clean up reporting differences on branch switch
[gitweb.git] / builtin-checkout.c
index 0d19835a6b9e8d52574531c0453eff91f47b8e8d..5291f72a370729d72bb990a3cd7db1c2672ca37d 100644 (file)
@@ -291,71 +291,6 @@ static int merge_working_tree(struct checkout_opts *opts,
        return 0;
 }
 
-/*
- * We really should allow cb_data... Yuck
- */
-static const char *branch_name;
-static int branch_name_len;
-static char *found_remote;
-static char *found_merge;
-static int read_branch_config(const char *var, const char *value)
-{
-       const char *name;
-       if (prefixcmp(var, "branch."))
-               return 0; /* not ours */
-       name = var + strlen("branch.");
-       if (strncmp(name, branch_name, branch_name_len) ||
-           name[branch_name_len] != '.')
-               return 0; /* not ours either */
-       if (!strcmp(name + branch_name_len, ".remote")) {
-               /*
-                * Yeah, I know Christian's clean-up should
-                * be used here, but the topic is based on an
-                * older fork point.
-                */
-               if (!value)
-                       return error("'%s' not string", var);
-               found_remote = xstrdup(value);
-               return 0;
-       }
-       if (!strcmp(name + branch_name_len, ".merge")) {
-               if (!value)
-                       return error("'%s' not string", var);
-               found_merge = xstrdup(value);
-               return 0;
-       }
-       return 0; /* not ours */
-}
-
-static int find_build_base(const char *ours, char **base)
-{
-       struct remote *remote;
-       struct refspec spec;
-
-       *base = NULL;
-
-       branch_name = ours + strlen("refs/heads/");
-       branch_name_len = strlen(branch_name);
-       found_remote = NULL;
-       found_merge = NULL;
-       git_config(read_branch_config);
-
-       if (!found_remote || !found_merge) {
-       cleanup:
-               free(found_remote);
-               free(found_merge);
-               return 0;
-       }
-
-       remote = remote_get(found_remote);
-       memset(&spec, 0, sizeof(spec));
-       spec.src = found_merge;
-       if (remote_find_tracking(remote, &spec))
-               goto cleanup;
-       *base = spec.dst;
-       return 1;
-}
-
 static void adjust_to_tracking(struct branch_info *new, struct checkout_opts *opts)
 {
        /*
@@ -369,15 +304,16 @@ static void adjust_to_tracking(struct branch_info *new, struct checkout_opts *op
        const char *msgfmt;
        char symmetric[84];
        int show_log;
+       struct branch *branch = branch_get(NULL);
 
-       if (!resolve_ref(new->path, sha1, 1, NULL))
+       if (!branch || !branch->merge)
                return;
-       ours = lookup_commit(sha1);
 
-       if (!find_build_base(new->path, &base))
-               return;
+       base = branch->merge[0]->dst;
+
+       ours = new->commit;
 
-       sprintf(symmetric, "%s", sha1_to_hex(sha1));
+       sprintf(symmetric, "%s", sha1_to_hex(ours->object.sha1));
 
        /*
         * Ok, it is tracking base; is it ahead of us?
@@ -466,7 +402,7 @@ static void update_refs_for_switch(struct checkout_opts *opts,
        }
        remove_branch_state();
        strbuf_release(&msg);
-       if (new->path)
+       if (new->path || !strcmp(new->name, "HEAD"))
                adjust_to_tracking(new, opts);
 }