Sync with v1.7.8.1
authorJunio C Hamano <gitster@pobox.com>
Wed, 21 Dec 2011 20:02:39 +0000 (12:02 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Dec 2011 20:02:44 +0000 (12:02 -0800)
1  2 
builtin/commit.c
builtin/log.c
diff --combined builtin/commit.c
index 626036a179e1476ee28a9f2ff32fedc5b97dc5d0,b02e2c4e89a55e04f7c5c3ee95617f947b9f5d99..be1ab2e2570fe0b600f8b1aa55c32573578af766
@@@ -81,8 -81,7 +81,8 @@@ static const char *template_file
  static const char *author_message, *author_message_buffer;
  static char *edit_message, *use_message;
  static char *fixup_message, *squash_message;
 -static int all, edit_flag, also, interactive, patch_interactive, only, amend, signoff;
 +static int all, also, interactive, patch_interactive, only, amend, signoff;
 +static int edit_flag = -1; /* unspecified */
  static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
  static int no_post_rewrite, allow_empty_message;
  static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
@@@ -139,10 -138,10 +139,10 @@@ static struct option builtin_commit_opt
        OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
        OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
        OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
-       OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
+       OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
        OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
        OPT_FILENAME('t', "template", &template_file, "use specified template file"),
 -      OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
 +      OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
        OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
        OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
        /* end commit message options */
@@@ -395,7 -394,6 +395,7 @@@ static char *prepare_index(int argc, co
                fd = hold_locked_index(&index_lock, 1);
                add_files_to_cache(also ? prefix : NULL, pathspec, 0);
                refresh_cache_or_die(refresh_flags);
 +              update_main_cache_tree(1);
                if (write_cache(fd, active_cache, active_nr) ||
                    close_lock_file(&index_lock))
                        die(_("unable to write new_index file"));
                fd = hold_locked_index(&index_lock, 1);
                refresh_cache_or_die(refresh_flags);
                if (active_cache_changed) {
 +                      update_main_cache_tree(1);
                        if (write_cache(fd, active_cache, active_nr) ||
                            commit_locked_index(&index_lock))
                                die(_("unable to write new_index file"));
@@@ -865,7 -862,10 +865,7 @@@ static int prepare_to_commit(const cha
         */
        discard_cache();
        read_cache_from(index_file);
 -      if (!active_cache_tree)
 -              active_cache_tree = cache_tree();
 -      if (cache_tree_update(active_cache_tree,
 -                            active_cache, active_nr, 0, 0) < 0) {
 +      if (update_main_cache_tree(0)) {
                error(_("Error building trees"));
                return 0;
        }
@@@ -1020,8 -1020,8 +1020,8 @@@ static int parse_and_validate_options(i
  
        if (logfile || message.len || use_message || fixup_message)
                use_editor = 0;
 -      if (edit_flag)
 -              use_editor = 1;
 +      if (0 <= edit_flag)
 +              use_editor = edit_flag;
        if (!use_editor)
                setenv("GIT_EDITOR", ":", 1);
  
@@@ -1259,7 -1259,7 +1259,7 @@@ static void print_summary(const char *p
        struct commit *commit;
        struct strbuf format = STRBUF_INIT;
        unsigned char junk_sha1[20];
 -      const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
 +      const char *head;
        struct pretty_print_context pctx = {0};
        struct strbuf author_ident = STRBUF_INIT;
        struct strbuf committer_ident = STRBUF_INIT;
        rev.diffopt.break_opt = 0;
        diff_setup_done(&rev.diffopt);
  
 +      head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
        printf("[%s%s ",
                !prefixcmp(head, "refs/heads/") ?
                        head + 11 :
@@@ -1383,7 -1382,6 +1383,7 @@@ int cmd_commit(int argc, const char **a
        int allow_fast_forward = 1;
        struct wt_status s;
        struct commit *current_head = NULL;
 +      struct commit_extra_header *extra = NULL;
  
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage_with_options(builtin_commit_usage, builtin_commit_options);
                        pptr = &commit_list_insert(c->item, pptr)->next;
        } else if (whence == FROM_MERGE) {
                struct strbuf m = STRBUF_INIT;
 -              struct commit *commit;
                FILE *fp;
  
                if (!reflog_msg)
                        die_errno(_("could not open '%s' for reading"),
                                  git_path("MERGE_HEAD"));
                while (strbuf_getline(&m, fp, '\n') != EOF) {
 -                      unsigned char sha1[20];
 -                      if (get_sha1_hex(m.buf, sha1) < 0)
 +                      struct commit *parent;
 +
 +                      parent = get_merge_parent(m.buf);
 +                      if (!parent)
                                die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
 -                      commit = lookup_commit_or_die(sha1, "MERGE_HEAD");
 -                      pptr = &commit_list_insert(commit, pptr)->next;
 +                      pptr = &commit_list_insert(parent, pptr)->next;
                }
                fclose(fp);
                strbuf_release(&m);
                exit(1);
        }
  
 -      if (commit_tree(sb.buf, active_cache_tree->sha1, parents, sha1,
 -                      author_ident.buf)) {
 +      if (amend) {
 +              extra = read_commit_extra_headers(current_head);
 +      } else {
 +              struct commit_extra_header **tail = &extra;
 +              append_merge_tag_headers(parents, &tail);
 +      }
 +
 +      if (commit_tree_extended(sb.buf, active_cache_tree->sha1, parents, sha1,
 +                               author_ident.buf, extra)) {
                rollback_index_files();
                die(_("failed to write commit object"));
        }
        strbuf_release(&author_ident);
 +      free_commit_extra_headers(extra);
  
        ref_lock = lock_any_ref_for_update("HEAD",
                                           !current_head
diff --combined builtin/log.c
index 89d0cc0132ca459d622827f5dd11a361fc6a138c,56bc555d11e25056eab45e92ac43ee885fb55bf7..7d1f6f88a0e0f76bc8ee35155a532b641c14a845
@@@ -19,7 -19,6 +19,7 @@@
  #include "remote.h"
  #include "string-list.h"
  #include "parse-options.h"
 +#include "branch.h"
  
  /* Set a default date-time format for git log ("log.date" config variable) */
  static const char *default_date_mode = NULL;
@@@ -73,8 -72,6 +73,6 @@@ static int decorate_callback(const stru
  
  static void cmd_log_init_defaults(struct rev_info *rev)
  {
-       rev->abbrev = DEFAULT_ABBREV;
-       rev->commit_format = CMIT_FMT_DEFAULT;
        if (fmt_pretty)
                get_commit_format(fmt_pretty, rev);
        rev->verbose_header = 1;
@@@ -747,24 -744,10 +745,24 @@@ static void print_signature(void
                printf("-- \n%s\n\n", signature);
  }
  
 +static void add_branch_description(struct strbuf *buf, const char *branch_name)
 +{
 +      struct strbuf desc = STRBUF_INIT;
 +      if (!branch_name || !*branch_name)
 +              return;
 +      read_branch_desc(&desc, branch_name);
 +      if (desc.len) {
 +              strbuf_addch(buf, '\n');
 +              strbuf_add(buf, desc.buf, desc.len);
 +              strbuf_addch(buf, '\n');
 +      }
 +}
 +
  static void make_cover_letter(struct rev_info *rev, int use_stdout,
                              int numbered, int numbered_files,
                              struct commit *origin,
                              int nr, struct commit **list, struct commit *head,
 +                            const char *branch_name,
                              int quiet)
  {
        const char *committer;
        pp_user_info(&pp, NULL, &sb, committer, encoding);
        pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
        pp_remainder(&pp, &msg, &sb, 0);
 +      add_branch_description(&sb, branch_name);
        printf("%s\n", sb.buf);
  
        strbuf_release(&sb);
@@@ -1022,35 -1004,6 +1020,35 @@@ static int cc_callback(const struct opt
        return 0;
  }
  
 +static char *find_branch_name(struct rev_info *rev)
 +{
 +      int i, positive = -1;
 +      unsigned char branch_sha1[20];
 +      struct strbuf buf = STRBUF_INIT;
 +      const char *branch;
 +
 +      for (i = 0; i < rev->cmdline.nr; i++) {
 +              if (rev->cmdline.rev[i].flags & UNINTERESTING)
 +                      continue;
 +              if (positive < 0)
 +                      positive = i;
 +              else
 +                      return NULL;
 +      }
 +      if (positive < 0)
 +              return NULL;
 +      strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name);
 +      branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL);
 +      if (!branch ||
 +          prefixcmp(branch, "refs/heads/") ||
 +          hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1))
 +              branch = NULL;
 +      strbuf_release(&buf);
 +      if (branch)
 +              return xstrdup(rev->cmdline.rev[positive].name);
 +      return NULL;
 +}
 +
  int cmd_format_patch(int argc, const char **argv, const char *prefix)
  {
        struct commit *commit;
        struct strbuf buf = STRBUF_INIT;
        int use_patch_format = 0;
        int quiet = 0;
 +      char *branch_name = NULL;
        const struct option builtin_format_patch_options[] = {
                { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
                            "use [PATCH n/m] even with a single patch",
                         * origin" that prepares what the origin side still
                         * does not have.
                         */
 +                      unsigned char sha1[20];
 +                      const char *ref;
 +
                        rev.pending.objects[0].item->flags |= UNINTERESTING;
                        add_head_to_pending(&rev);
 +                      ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
 +                      if (ref && !prefixcmp(ref, "refs/heads/"))
 +                              branch_name = xstrdup(ref + strlen("refs/heads/"));
 +                      else
 +                              branch_name = xstrdup(""); /* no branch */
                }
                /*
                 * Otherwise, it is "format-patch -22 HEAD", and/or
        rev.show_root_diff = 1;
  
        if (cover_letter) {
 -              /* remember the range */
 +              /*
 +               * NEEDSWORK:randomly pick one positive commit to show
 +               * diffstat; this is often the tip and the command
 +               * happens to do the right thing in most cases, but a
 +               * complex command like "--cover-letter a b c ^bottom"
 +               * picks "c" and shows diffstat between bottom..c
 +               * which may not match what the series represents at
 +               * all and totally broken.
 +               */
                int i;
                for (i = 0; i < rev.pending.nr; i++) {
                        struct object *o = rev.pending.objects[i].item;
                        if (!(o->flags & UNINTERESTING))
                                head = (struct commit *)o;
                }
 -              /* We can't generate a cover letter without any patches */
 +              /* There is nothing to show; it is not an error, though. */
                if (!head)
                        return 0;
 +              if (!branch_name)
 +                      branch_name = find_branch_name(&rev);
        }
  
        if (ignore_if_in_upstream) {
                if (thread)
                        gen_message_id(&rev, "cover");
                make_cover_letter(&rev, use_stdout, numbered, numbered_files,
 -                                origin, nr, list, head, quiet);
 +                                origin, nr, list, head, branch_name, quiet);
                total++;
                start_number--;
        }
                        fclose(stdout);
        }
        free(list);
 +      free(branch_name);
        string_list_clear(&extra_to, 0);
        string_list_clear(&extra_cc, 0);
        string_list_clear(&extra_hdr, 0);