Merge branch 'maint' into ph/checkout
authorJunio C Hamano <gitster@pobox.com>
Thu, 24 Jul 2008 01:42:24 +0000 (18:42 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 24 Jul 2008 01:42:24 +0000 (18:42 -0700)
* maint:
git-checkout: fix command line parsing.

1  2 
builtin-checkout.c
diff --combined builtin-checkout.c
index fbd5105a8302a6c00e191ef49f3dfef1fc979c53,aec2bc6f8d71a41e9d1cb718a498bfea08b767c3..9cadf9c299eb9875c74ac3beb629123ce2d9915c
@@@ -43,7 -43,7 +43,7 @@@ static int post_checkout_hook(struct co
  }
  
  static int update_some(const unsigned char *sha1, const char *base, int baselen,
 -                     const char *pathname, unsigned mode, int stage)
 +              const char *pathname, unsigned mode, int stage, void *context)
  {
        int len;
        struct cache_entry *ce;
@@@ -67,7 -67,7 +67,7 @@@
  
  static int read_tree_some(struct tree *tree, const char **pathspec)
  {
 -      read_tree_recursive(tree, "", 0, 0, pathspec, update_some);
 +      read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
  
        /* update the index with the given tree's info
         * for all args, expanding wildcards, and exit
@@@ -305,15 -305,97 +305,15 @@@ static int merge_working_tree(struct ch
        return 0;
  }
  
 -static void report_tracking(struct branch_info *new, struct checkout_opts *opts)
 +static void report_tracking(struct branch_info *new)
  {
 -      /*
 -       * We have switched to a new branch; is it building on
 -       * top of another branch, and if so does that other branch
 -       * have changes we do not have yet?
 -       */
 -      char *base;
 -      unsigned char sha1[20];
 -      struct commit *ours, *theirs;
 -      char symmetric[84];
 -      struct rev_info revs;
 -      const char *rev_argv[10];
 -      int rev_argc;
 -      int num_ours, num_theirs;
 -      const char *remote_msg;
 +      struct strbuf sb = STRBUF_INIT;
        struct branch *branch = branch_get(new->name);
  
 -      /*
 -       * Nothing to report unless we are marked to build on top of
 -       * somebody else.
 -       */
 -      if (!branch || !branch->merge || !branch->merge[0] || !branch->merge[0]->dst)
 -              return;
 -
 -      /*
 -       * If what we used to build on no longer exists, there is
 -       * nothing to report.
 -       */
 -      base = branch->merge[0]->dst;
 -      if (!resolve_ref(base, sha1, 1, NULL))
 +      if (!format_tracking_info(branch, &sb))
                return;
 -
 -      theirs = lookup_commit(sha1);
 -      ours = new->commit;
 -      if (!hashcmp(sha1, ours->object.sha1))
 -              return; /* we are the same */
 -
 -      /* Run "rev-list --left-right ours...theirs" internally... */
 -      rev_argc = 0;
 -      rev_argv[rev_argc++] = NULL;
 -      rev_argv[rev_argc++] = "--left-right";
 -      rev_argv[rev_argc++] = symmetric;
 -      rev_argv[rev_argc++] = "--";
 -      rev_argv[rev_argc] = NULL;
 -
 -      strcpy(symmetric, sha1_to_hex(ours->object.sha1));
 -      strcpy(symmetric + 40, "...");
 -      strcpy(symmetric + 43, sha1_to_hex(theirs->object.sha1));
 -
 -      init_revisions(&revs, NULL);
 -      setup_revisions(rev_argc, rev_argv, &revs, NULL);
 -      prepare_revision_walk(&revs);
 -
 -      /* ... and count the commits on each side. */
 -      num_ours = 0;
 -      num_theirs = 0;
 -      while (1) {
 -              struct commit *c = get_revision(&revs);
 -              if (!c)
 -                      break;
 -              if (c->object.flags & SYMMETRIC_LEFT)
 -                      num_ours++;
 -              else
 -                      num_theirs++;
 -      }
 -
 -      if (!prefixcmp(base, "refs/remotes/")) {
 -              remote_msg = " remote";
 -              base += strlen("refs/remotes/");
 -      } else {
 -              remote_msg = "";
 -      }
 -
 -      if (!num_theirs)
 -              printf("Your branch is ahead of the tracked%s branch '%s' "
 -                     "by %d commit%s.\n",
 -                     remote_msg, base,
 -                     num_ours, (num_ours == 1) ? "" : "s");
 -      else if (!num_ours)
 -              printf("Your branch is behind the tracked%s branch '%s' "
 -                     "by %d commit%s,\n"
 -                     "and can be fast-forwarded.\n",
 -                     remote_msg, base,
 -                     num_theirs, (num_theirs == 1) ? "" : "s");
 -      else
 -              printf("Your branch and the tracked%s branch '%s' "
 -                     "have diverged,\nand respectively "
 -                     "have %d and %d different commit(s) each.\n",
 -                     remote_msg, base,
 -                     num_ours, num_theirs);
 +      fputs(sb.buf, stdout);
 +      strbuf_release(&sb);
  }
  
  static void update_refs_for_switch(struct checkout_opts *opts,
        remove_branch_state();
        strbuf_release(&msg);
        if (!opts->quiet && (new->path || !strcmp(new->name, "HEAD")))
 -              report_tracking(new, opts);
 +              report_tracking(new);
  }
  
  static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
@@@ -438,7 -520,8 +438,8 @@@ int cmd_checkout(int argc, const char *
  
        opts.track = git_branch_track;
  
-       argc = parse_options(argc, argv, options, checkout_usage, 0);
+       argc = parse_options(argc, argv, options, checkout_usage,
+                            PARSE_OPT_KEEP_DASHDASH);
        if (argc) {
                arg = argv[0];
                if (get_sha1(arg, rev))