Merge branch 'mg/sequencer-commit-messages-always-verbatim'
authorJunio C Hamano <gitster@pobox.com>
Tue, 17 Mar 2015 23:01:31 +0000 (16:01 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 Mar 2015 23:01:32 +0000 (16:01 -0700)
"git cherry-pick" used to clean-up the log message even when it is
merely replaying an existing commit. It now replays the message
verbatim unless you are editing the message of resulting commits.

* mg/sequencer-commit-messages-always-verbatim:
sequencer: preserve commit messages

1  2 
sequencer.c
diff --combined sequencer.c
index 32aa05ed828dfa3bac79edb83dd8a222560206d3,8b735cdd04fceef13d85b3a5147616e18ca9307d..c4f4b7d571fa088f80a0dbba815491a35f0c153f
@@@ -1,5 -1,4 +1,5 @@@
  #include "cache.h"
 +#include "lockfile.h"
  #include "sequencer.h"
  #include "dir.h"
  #include "object.h"
@@@ -238,50 -237,19 +238,50 @@@ static int error_dirty_index(struct rep
  static int fast_forward_to(const unsigned char *to, const unsigned char *from,
                        int unborn, struct replay_opts *opts)
  {
 -      struct ref_lock *ref_lock;
 +      struct ref_transaction *transaction;
        struct strbuf sb = STRBUF_INIT;
 -      int ret;
 +      struct strbuf err = STRBUF_INIT;
  
        read_cache();
        if (checkout_fast_forward(from, to, 1))
 -              exit(1); /* the callee should have complained already */
 -      ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from,
 -                                         0, NULL);
 +              exit(128); /* the callee should have complained already */
 +
        strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
 -      ret = write_ref_sha1(ref_lock, to, sb.buf);
 +
 +      transaction = ref_transaction_begin(&err);
 +      if (!transaction ||
 +          ref_transaction_update(transaction, "HEAD",
 +                                 to, unborn ? null_sha1 : from,
 +                                 0, sb.buf, &err) ||
 +          ref_transaction_commit(transaction, &err)) {
 +              ref_transaction_free(transaction);
 +              error("%s", err.buf);
 +              strbuf_release(&sb);
 +              strbuf_release(&err);
 +              return -1;
 +      }
 +
        strbuf_release(&sb);
 -      return ret;
 +      strbuf_release(&err);
 +      ref_transaction_free(transaction);
 +      return 0;
 +}
 +
 +void append_conflicts_hint(struct strbuf *msgbuf)
 +{
 +      int i;
 +
 +      strbuf_addch(msgbuf, '\n');
 +      strbuf_commented_addf(msgbuf, "Conflicts:\n");
 +      for (i = 0; i < active_nr;) {
 +              const struct cache_entry *ce = active_cache[i++];
 +              if (ce_stage(ce)) {
 +                      strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
 +                      while (i < active_nr && !strcmp(ce->name,
 +                                                      active_cache[i]->name))
 +                              i++;
 +              }
 +      }
  }
  
  static int do_recursive_merge(struct commit *base, struct commit *next,
  {
        struct merge_options o;
        struct tree *result, *next_tree, *base_tree, *head_tree;
 -      int clean, index_fd;
 +      int clean;
        const char **xopt;
        static struct lock_file index_lock;
  
 -      index_fd = hold_locked_index(&index_lock, 1);
 +      hold_locked_index(&index_lock, 1);
  
        read_cache();
  
                            next_tree, base_tree, &result);
  
        if (active_cache_changed &&
 -          (write_cache(index_fd, active_cache, active_nr) ||
 -           commit_locked_index(&index_lock)))
 +          write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
                /* TRANSLATORS: %s will be "revert" or "cherry-pick" */
                die(_("%s: Unable to write new index file"), action_name(opts));
        rollback_lock_file(&index_lock);
        if (opts->signoff)
                append_signoff(msgbuf, 0, 0);
  
 -      if (!clean) {
 -              int i;
 -              strbuf_addstr(msgbuf, "\nConflicts:\n");
 -              for (i = 0; i < active_nr;) {
 -                      const struct cache_entry *ce = active_cache[i++];
 -                      if (ce_stage(ce)) {
 -                              strbuf_addch(msgbuf, '\t');
 -                              strbuf_addstr(msgbuf, ce->name);
 -                              strbuf_addch(msgbuf, '\n');
 -                              while (i < active_nr && !strcmp(ce->name,
 -                                              active_cache[i]->name))
 -                                      i++;
 -                      }
 -              }
 -      }
 +      if (!clean)
 +              append_conflicts_hint(msgbuf);
  
        return !clean;
  }
@@@ -335,7 -317,7 +335,7 @@@ static int is_index_unchanged(void
        unsigned char head_sha1[20];
        struct commit *head_commit;
  
 -      if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL))
 +      if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL))
                return error(_("Could not resolve HEAD commit\n"));
  
        head_commit = lookup_commit(head_sha1);
                active_cache_tree = cache_tree();
  
        if (!cache_tree_fully_valid(active_cache_tree))
 -              if (cache_tree_update(active_cache_tree,
 -                                    (const struct cache_entry * const *)active_cache,
 -                                    active_nr, 0))
 +              if (cache_tree_update(&the_index, 0))
                        return error(_("Unable to update cache tree\n"));
  
        return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.sha1);
@@@ -373,18 -357,28 +373,23 @@@ static int run_git_commit(const char *d
  {
        struct argv_array array;
        int rc;
 -      char *gpg_sign;
+       const char *value;
  
        argv_array_init(&array);
        argv_array_push(&array, "commit");
        argv_array_push(&array, "-n");
  
 -      if (opts->gpg_sign) {
 -              gpg_sign = xmalloc(3 + strlen(opts->gpg_sign));
 -              sprintf(gpg_sign, "-S%s", opts->gpg_sign);
 -              argv_array_push(&array, gpg_sign);
 -              free(gpg_sign);
 -      }
 +      if (opts->gpg_sign)
 +              argv_array_pushf(&array, "-S%s", opts->gpg_sign);
        if (opts->signoff)
                argv_array_push(&array, "-s");
        if (!opts->edit) {
                argv_array_push(&array, "-F");
                argv_array_push(&array, defmsg);
+               if (!opts->signoff &&
+                   !opts->record_origin &&
+                   git_config_get_value("commit.cleanup", &value))
+                       argv_array_push(&array, "--cleanup=verbatim");
        }
  
        if (allow_empty)
@@@ -655,8 -649,9 +660,8 @@@ static void read_and_refresh_cache(stru
        if (read_index_preload(&the_index, NULL) < 0)
                die(_("git %s: failed to read the index"), action_name(opts));
        refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
 -      if (the_index.cache_changed) {
 -              if (write_index(&the_index, index_fd) ||
 -                  commit_locked_index(&index_lock))
 +      if (the_index.cache_changed && index_fd >= 0) {
 +              if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
                        die(_("git %s: failed to refresh the index"), action_name(opts));
        }
        rollback_lock_file(&index_lock);
@@@ -875,7 -870,7 +880,7 @@@ static int rollback_single_pick(void
        if (!file_exists(git_path("CHERRY_PICK_HEAD")) &&
            !file_exists(git_path("REVERT_HEAD")))
                return error(_("no cherry-pick or revert in progress"));
 -      if (read_ref_full("HEAD", head_sha1, 0, NULL))
 +      if (read_ref_full("HEAD", 0, head_sha1, NULL))
                return error(_("cannot resolve HEAD"));
        if (is_null_sha1(head_sha1))
                return error(_("cannot abort from a branch yet to be born"));