git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / Atom feed
From: Phillip Wood <phillip.wood@talktalk.net>
To: Johannes Schindelin <johannes.schindelin@gmx.de>, git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	Jacob Keller <jacob.keller@gmail.com>,
	Stefan Beller <sbeller@google.com>,
	Philip Oakley <philipoakley@iee.org>,
	Eric Sunshine <sunshine@sunshineco.com>,
	Phillip Wood <phillip.wood@dunelm.org.uk>,
	Igor Djordjevic <igor.d.djordjevic@gmail.com>,
	Johannes Sixt <j6t@kdbg.org>, Sergey Organov <sorganov@gmail.com>,
	Martin Ågren <martin.agren@gmail.com>
Subject: Re: [PATCH v8 06/16] sequencer: introduce the `merge` command
Date: Sun, 22 Apr 2018 18:17:21 +0100
Message-ID: <0b0555fb-9fec-cd9d-f2f2-cecb51412128@talktalk.net> (raw)
In-Reply-To: <b05915e6-2259-5dee-69d8-90a5a524662d@talktalk.net>

On 21/04/18 16:56, Phillip Wood wrote:
> On 21/04/18 11:33, Johannes Schindelin wrote:
>> This patch is part of the effort to reimplement `--preserve-merges` with
>> a substantially improved design, a design that has been developed in the
>> Git for Windows project to maintain the dozens of Windows-specific patch
>> series on top of upstream Git.
>>
>> The previous patch implemented the `label` and `reset` commands to label
>> commits and to reset to labeled commits. This patch adds the `merge`
>> command, with the following syntax:
> 
> The two patches seem to have been fused together in this series.
> 
> If the reset command fails because it would overwrite untracked files it
> says
> 
> error: Untracked working tree file 'b' would be overwritten by merge.
> 
> Followed by the hint to edit the todo file. Saying 'merge' rather
> 'reset' is possibly confusing to users. Perhaps it could call
> setup_unpack_trees_porcelain(), though that would need to be extended to
> handle 'reset'.


> Also it currently refuses to overwrite ignored files
> which is either annoying or safe depending on one's point of view.

Looking at the existing code this is consistent with (most) of the rest
of the sequencer. The code to fast-forward commits will overwrite
ignored files, and I think the initial checkout will as well but the
rest (picking commits and the new merge command) will not.

> Best Wishes
> 
> Phillip
> 
>>
>>     merge [-C <commit>] <rev> # <oneline>
>>
>> The <commit> parameter in this instance is the *original* merge commit,
>> whose author and message will be used for the merge commit that is about
>> to be created.
>>
>> The <rev> parameter refers to the (possibly rewritten) revision to
>> merge. Let's see an example of a todo list:
>>
>>     label onto
>>
>>     # Branch abc
>>     reset onto
>>     pick deadbeef Hello, world!
>>     label abc
>>
>>     reset onto
>>     pick cafecafe And now for something completely different
>>     merge -C baaabaaa abc # Merge the branch 'abc' into master
>>
>> To edit the merge commit's message (a "reword" for merges, if you will),
>> use `-c` (lower-case) instead of `-C`; this convention was borrowed from
>> `git commit` that also supports `-c` and `-C` with similar meanings.
>>
>> To create *new* merges, i.e. without copying the commit message from an
>> existing commit, simply omit the `-C <commit>` parameter (which will
>> open an editor for the merge message):
>>
>>     merge abc
>>
>> This comes in handy when splitting a branch into two or more branches.
>>
>> Note: this patch only adds support for recursive merges, to keep things
>> simple. Support for octopus merges will be added later in a separate
>> patch series, support for merges using strategies other than the
>> recursive merge is left for the future.
>>
>> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
>> ---
>>   git-rebase--interactive.sh |   6 +
>>   sequencer.c                | 407 ++++++++++++++++++++++++++++++++++++-
>>   2 files changed, 406 insertions(+), 7 deletions(-)
>>
>> diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
>> index e1b865f43f2..ccd5254d1c9 100644
>> --- a/git-rebase--interactive.sh
>> +++ b/git-rebase--interactive.sh
>> @@ -162,6 +162,12 @@ s, squash <commit> = use commit, but meld into
>> previous commit
>>   f, fixup <commit> = like \"squash\", but discard this commit's log
>> message
>>   x, exec <commit> = run command (the rest of the line) using shell
>>   d, drop <commit> = remove commit
>> +l, label <label> = label current HEAD with a name
>> +t, reset <label> = reset HEAD to a label
>> +m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
>> +.       create a merge commit using the original merge commit's
>> +.       message (or the oneline, if no original merge commit was
>> +.       specified). Use -c <commit> to reword the commit message.
>>     These lines can be re-ordered; they are executed from top to bottom.
>>   " | git stripspace --comment-lines >>"$todo"
>> diff --git a/sequencer.c b/sequencer.c
>> index 01443e0f245..35fcacbdf0f 100644
>> --- a/sequencer.c
>> +++ b/sequencer.c
>> @@ -23,6 +23,8 @@
>>   #include "hashmap.h"
>>   #include "notes-utils.h"
>>   #include "sigchain.h"
>> +#include "unpack-trees.h"
>> +#include "worktree.h"
>>     #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
>>   @@ -120,6 +122,13 @@ static GIT_PATH_FUNC(rebase_path_stopped_sha,
>> "rebase-merge/stopped-sha")
>>   static GIT_PATH_FUNC(rebase_path_rewritten_list,
>> "rebase-merge/rewritten-list")
>>   static GIT_PATH_FUNC(rebase_path_rewritten_pending,
>>       "rebase-merge/rewritten-pending")
>> +
>> +/*
>> + * The path of the file listing refs that need to be deleted after
>> the rebase
>> + * finishes. This is used by the `label` command to record the need
>> for cleanup.
>> + */
>> +static GIT_PATH_FUNC(rebase_path_refs_to_delete,
>> "rebase-merge/refs-to-delete")
>> +
>>   /*
>>    * The following files are written by git-rebase just after parsing the
>>    * command-line (and are only consumed, not modified, by the
>> sequencer).
>> @@ -244,18 +253,34 @@ static const char *gpg_sign_opt_quoted(struct
>> replay_opts *opts)
>>     int sequencer_remove_state(struct replay_opts *opts)
>>   {
>> -    struct strbuf dir = STRBUF_INIT;
>> +    struct strbuf buf = STRBUF_INIT;
>>       int i;
>>   +    if (is_rebase_i(opts) &&
>> +        strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
>> +        char *p = buf.buf;
>> +        while (*p) {
>> +            char *eol = strchr(p, '\n');
>> +            if (eol)
>> +                *eol = '\0';
>> +            if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0)
>> +                warning(_("could not delete '%s'"), p);
>> +            if (!eol)
>> +                break;
>> +            p = eol + 1;
>> +        }
>> +    }
>> +
>>       free(opts->gpg_sign);
>>       free(opts->strategy);
>>       for (i = 0; i < opts->xopts_nr; i++)
>>           free(opts->xopts[i]);
>>       free(opts->xopts);
>>   -    strbuf_addstr(&dir, get_dir(opts));
>> -    remove_dir_recursively(&dir, 0);
>> -    strbuf_release(&dir);
>> +    strbuf_reset(&buf);
>> +    strbuf_addstr(&buf, get_dir(opts));
>> +    remove_dir_recursively(&buf, 0);
>> +    strbuf_release(&buf);
>>         return 0;
>>   }
>> @@ -1279,6 +1304,9 @@ enum todo_command {
>>       TODO_SQUASH,
>>       /* commands that do something else than handling a single commit */
>>       TODO_EXEC,
>> +    TODO_LABEL,
>> +    TODO_RESET,
>> +    TODO_MERGE,
>>       /* commands that do nothing but are counted for reporting
>> progress */
>>       TODO_NOOP,
>>       TODO_DROP,
>> @@ -1297,6 +1325,9 @@ static struct {
>>       { 'f', "fixup" },
>>       { 's', "squash" },
>>       { 'x', "exec" },
>> +    { 'l', "label" },
>> +    { 't', "reset" },
>> +    { 'm', "merge" },
>>       { 0,   "noop" },
>>       { 'd', "drop" },
>>       { 0,   NULL }
>> @@ -1724,9 +1755,14 @@ static int read_and_refresh_cache(struct
>> replay_opts *opts)
>>       return 0;
>>   }
>>   +enum todo_item_flags {
>> +    TODO_EDIT_MERGE_MSG = 1
>> +};
>> +
>>   struct todo_item {
>>       enum todo_command command;
>>       struct commit *commit;
>> +    unsigned int flags;
>>       const char *arg;
>>       int arg_len;
>>       size_t offset_in_buf;
>> @@ -1761,6 +1797,8 @@ static int parse_insn_line(struct todo_item
>> *item, const char *bol, char *eol)
>>       char *end_of_object_name;
>>       int i, saved, status, padding;
>>   +    item->flags = 0;
>> +
>>       /* left-trim */
>>       bol += strspn(bol, " \t");
>>   @@ -1802,13 +1840,29 @@ static int parse_insn_line(struct todo_item
>> *item, const char *bol, char *eol)
>>           return error(_("missing arguments for %s"),
>>                    command_to_string(item->command));
>>   -    if (item->command == TODO_EXEC) {
>> +    if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
>> +        item->command == TODO_RESET) {
>>           item->commit = NULL;
>>           item->arg = bol;
>>           item->arg_len = (int)(eol - bol);
>>           return 0;
>>       }
>>   +    if (item->command == TODO_MERGE) {
>> +        if (skip_prefix(bol, "-C", &bol))
>> +            bol += strspn(bol, " \t");
>> +        else if (skip_prefix(bol, "-c", &bol)) {
>> +            bol += strspn(bol, " \t");
>> +            item->flags |= TODO_EDIT_MERGE_MSG;
>> +        } else {
>> +            item->flags |= TODO_EDIT_MERGE_MSG;
>> +            item->commit = NULL;
>> +            item->arg = bol;
>> +            item->arg_len = (int)(eol - bol);
>> +            return 0;
>> +        }
>> +    }
>> +
>>       end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
>>       saved = *end_of_object_name;
>>       *end_of_object_name = '\0';
>> @@ -2465,6 +2519,305 @@ static int do_exec(const char *command_line)
>>       return status;
>>   }
>>   +static int safe_append(const char *filename, const char *fmt, ...)
>> +{
>> +    va_list ap;
>> +    struct lock_file lock = LOCK_INIT;
>> +    int fd = hold_lock_file_for_update(&lock, filename,
>> +                       LOCK_REPORT_ON_ERROR);
>> +    struct strbuf buf = STRBUF_INIT;
>> +
>> +    if (fd < 0)
>> +        return -1;
>> +
>> +    if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
>> +        error_errno(_("could not read '%s'"), filename);
>> +        rollback_lock_file(&lock);
>> +        return -1;
>> +    }
>> +    strbuf_complete(&buf, '\n');
>> +    va_start(ap, fmt);
>> +    strbuf_vaddf(&buf, fmt, ap);
>> +    va_end(ap);
>> +
>> +    if (write_in_full(fd, buf.buf, buf.len) < 0) {
>> +        error_errno(_("could not write to '%s'"), filename);
>> +        strbuf_release(&buf);
>> +        rollback_lock_file(&lock);
>> +        return -1;
>> +    }
>> +    if (commit_lock_file(&lock) < 0) {
>> +        strbuf_release(&buf);
>> +        rollback_lock_file(&lock);
>> +        return error(_("failed to finalize '%s'"), filename);
>> +    }
>> +
>> +    strbuf_release(&buf);
>> +    return 0;
>> +}
>> +
>> +static int do_label(const char *name, int len)
>> +{
>> +    struct ref_store *refs = get_main_ref_store();
>> +    struct ref_transaction *transaction;
>> +    struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
>> +    struct strbuf msg = STRBUF_INIT;
>> +    int ret = 0;
>> +    struct object_id head_oid;
>> +
>> +    if (len == 1 && *name == '#')
>> +        return error("Illegal label name: '%.*s'", len, name);
>> +
>> +    strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
>> +    strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
>> +
>> +    transaction = ref_store_transaction_begin(refs, &err);
>> +    if (!transaction) {
>> +        error("%s", err.buf);
>> +        ret = -1;
>> +    } else if (get_oid("HEAD", &head_oid)) {
>> +        error(_("could not read HEAD"));
>> +        ret = -1;
>> +    } else if (ref_transaction_update(transaction, ref_name.buf,
>> &head_oid,
>> +                      NULL, 0, msg.buf, &err) < 0 ||
>> +           ref_transaction_commit(transaction, &err)) {
>> +        error("%s", err.buf);
>> +        ret = -1;
>> +    }
>> +    ref_transaction_free(transaction);
>> +    strbuf_release(&err);
>> +    strbuf_release(&msg);
>> +
>> +    if (!ret)
>> +        ret = safe_append(rebase_path_refs_to_delete(),
>> +                  "%s\n", ref_name.buf);
>> +    strbuf_release(&ref_name);
>> +
>> +    return ret;
>> +}
>> +
>> +static const char *reflog_message(struct replay_opts *opts,
>> +    const char *sub_action, const char *fmt, ...);
>> +
>> +static int do_reset(const char *name, int len, struct replay_opts *opts)
>> +{
>> +    struct strbuf ref_name = STRBUF_INIT;
>> +    struct object_id oid;
>> +    struct lock_file lock = LOCK_INIT;
>> +    struct tree_desc desc;
>> +    struct tree *tree;
>> +    struct unpack_trees_options unpack_tree_opts;
>> +    int ret = 0, i;
>> +
>> +    if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0)
>> +        return -1;
>> +
>> +    /* Determine the length of the label */
>> +    for (i = 0; i < len; i++)
>> +        if (isspace(name[i]))
>> +            len = i;
>> +
>> +    strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
>> +    if (get_oid(ref_name.buf, &oid) &&
>> +        get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
>> +        error(_("could not read '%s'"), ref_name.buf);
>> +        rollback_lock_file(&lock);
>> +        strbuf_release(&ref_name);
>> +        return -1;
>> +    }
>> +
>> +    memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
>> +    unpack_tree_opts.head_idx = 1;
>> +    unpack_tree_opts.src_index = &the_index;
>> +    unpack_tree_opts.dst_index = &the_index;
>> +    unpack_tree_opts.fn = oneway_merge;
>> +    unpack_tree_opts.merge = 1;
>> +    unpack_tree_opts.update = 1;
>> +
>> +    if (read_cache_unmerged()) {
>> +        rollback_lock_file(&lock);
>> +        strbuf_release(&ref_name);
>> +        return error_resolve_conflict(_(action_name(opts)));
>> +    }
>> +
>> +    if (!fill_tree_descriptor(&desc, &oid)) {
>> +        error(_("failed to find tree of %s"), oid_to_hex(&oid));
>> +        rollback_lock_file(&lock);
>> +        free((void *)desc.buffer);
>> +        strbuf_release(&ref_name);
>> +        return -1;
>> +    }
>> +
>> +    if (unpack_trees(1, &desc, &unpack_tree_opts)) {
>> +        rollback_lock_file(&lock);
>> +        free((void *)desc.buffer);
>> +        strbuf_release(&ref_name);
>> +        return -1;
>> +    }
>> +
>> +    tree = parse_tree_indirect(&oid);
>> +    prime_cache_tree(&the_index, tree);
>> +
>> +    if (write_locked_index(&the_index, &lock, COMMIT_LOCK) < 0)
>> +        ret = error(_("could not write index"));
>> +    free((void *)desc.buffer);
>> +
>> +    if (!ret)
>> +        ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
>> +                        len, name), "HEAD", &oid,
>> +                 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
>> +
>> +    strbuf_release(&ref_name);
>> +    return ret;
>> +}
>> +
>> +static int do_merge(struct commit *commit, const char *arg, int arg_len,
>> +            int flags, struct replay_opts *opts)
>> +{
>> +    int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
>> +        EDIT_MSG | VERIFY_MSG : 0;
>> +    struct strbuf ref_name = STRBUF_INIT;
>> +    struct commit *head_commit, *merge_commit, *i;
>> +    struct commit_list *bases, *j, *reversed = NULL;
>> +    struct merge_options o;
>> +    int merge_arg_len, oneline_offset, ret;
>> +    static struct lock_file lock;
>> +    const char *p;
>> +
>> +    if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
>> +        ret = -1;
>> +        goto leave_merge;
>> +    }
>> +
>> +    head_commit = lookup_commit_reference_by_name("HEAD");
>> +    if (!head_commit) {
>> +        ret = error(_("cannot merge without a current revision"));
>> +        goto leave_merge;
>> +    }
>> +
>> +    oneline_offset = arg_len;
>> +    merge_arg_len = strcspn(arg, " \t\n");
>> +    p = arg + merge_arg_len;
>> +    p += strspn(p, " \t\n");
>> +    if (*p == '#' && (!p[1] || isspace(p[1]))) {
>> +        p += 1 + strspn(p + 1, " \t\n");
>> +        oneline_offset = p - arg;
>> +    } else if (p - arg < arg_len)
>> +        BUG("octopus merges are not supported yet: '%s'", p);
>> +
>> +    strbuf_addf(&ref_name, "refs/rewritten/%.*s", merge_arg_len, arg);
>> +    merge_commit = lookup_commit_reference_by_name(ref_name.buf);
>> +    if (!merge_commit) {
>> +        /* fall back to non-rewritten ref or commit */
>> +        strbuf_splice(&ref_name, 0, strlen("refs/rewritten/"), "", 0);
>> +        merge_commit = lookup_commit_reference_by_name(ref_name.buf);
>> +    }
>> +
>> +    if (!merge_commit) {
>> +        ret = error(_("could not resolve '%s'"), ref_name.buf);
>> +        goto leave_merge;
>> +    }
>> +
>> +    if (commit) {
>> +        const char *message = get_commit_buffer(commit, NULL);
>> +        const char *body;
>> +        int len;
>> +
>> +        if (!message) {
>> +            ret = error(_("could not get commit message of '%s'"),
>> +                    oid_to_hex(&commit->object.oid));
>> +            goto leave_merge;
>> +        }
>> +        write_author_script(message);
>> +        find_commit_subject(message, &body);
>> +        len = strlen(body);
>> +        ret = write_message(body, len, git_path_merge_msg(), 0);
>> +        unuse_commit_buffer(commit, message);
>> +        if (ret) {
>> +            error_errno(_("could not write '%s'"),
>> +                    git_path_merge_msg());
>> +            goto leave_merge;
>> +        }
>> +    } else {
>> +        struct strbuf buf = STRBUF_INIT;
>> +        int len;
>> +
>> +        strbuf_addf(&buf, "author %s", git_author_info(0));
>> +        write_author_script(buf.buf);
>> +        strbuf_reset(&buf);
>> +
>> +        if (oneline_offset < arg_len) {
>> +            p = arg + oneline_offset;
>> +            len = arg_len - oneline_offset;
>> +        } else {
>> +            strbuf_addf(&buf, "Merge branch '%.*s'",
>> +                    merge_arg_len, arg);
>> +            p = buf.buf;
>> +            len = buf.len;
>> +        }
>> +
>> +        ret = write_message(p, len, git_path_merge_msg(), 0);
>> +        strbuf_release(&buf);
>> +        if (ret) {
>> +            error_errno(_("could not write '%s'"),
>> +                    git_path_merge_msg());
>> +            goto leave_merge;
>> +        }
>> +    }
>> +
>> +    write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
>> +              git_path_merge_head(), 0);
>> +    write_message("no-ff", 5, git_path_merge_mode(), 0);
>> +
>> +    bases = get_merge_bases(head_commit, merge_commit);
>> +    for (j = bases; j; j = j->next)
>> +        commit_list_insert(j->item, &reversed);
>> +    free_commit_list(bases);
>> +
>> +    read_cache();
>> +    init_merge_options(&o);
>> +    o.branch1 = "HEAD";
>> +    o.branch2 = ref_name.buf;
>> +    o.buffer_output = 2;
>> +
>> +    ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
>> +    if (ret <= 0)
>> +        fputs(o.obuf.buf, stdout);
>> +    strbuf_release(&o.obuf);
>> +    if (ret < 0) {
>> +        error(_("could not even attempt to merge '%.*s'"),
>> +              merge_arg_len, arg);
>> +        goto leave_merge;
>> +    }
>> +    /*
>> +     * The return value of merge_recursive() is 1 on clean, and 0 on
>> +     * unclean merge.
>> +     *
>> +     * Let's reverse that, so that do_merge() returns 0 upon success and
>> +     * 1 upon failed merge (keeping the return value -1 for the cases
>> where
>> +     * we will want to reschedule the `merge` command).
>> +     */
>> +    ret = !ret;
>> +
>> +    if (active_cache_changed &&
>> +        write_locked_index(&the_index, &lock, COMMIT_LOCK)) {
>> +        ret = error(_("merge: Unable to write new index file"));
>> +        goto leave_merge;
>> +    }
>> +
>> +    rollback_lock_file(&lock);
>> +    if (ret)
>> +        rerere(opts->allow_rerere_auto);
>> +    else
>> +        ret = run_git_commit(git_path_merge_msg(), opts,
>> +                     run_commit_flags);
>> +
>> +leave_merge:
>> +    strbuf_release(&ref_name);
>> +    rollback_lock_file(&lock);
>> +    return ret;
>> +}
>> +
>>   static int is_final_fixup(struct todo_list *todo_list)
>>   {
>>       int i = todo_list->current;
>> @@ -2568,7 +2921,7 @@ N_("Could not execute the todo command\n"
>>     static int pick_commits(struct todo_list *todo_list, struct
>> replay_opts *opts)
>>   {
>> -    int res = 0;
>> +    int res = 0, reschedule = 0;
>>         setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
>>       if (opts->allow_ff)
>> @@ -2639,7 +2992,7 @@ static int pick_commits(struct todo_list
>> *todo_list, struct replay_opts *opts)
>>                       intend_to_amend();
>>                   return error_failed_squash(item->commit, opts,
>>                       item->arg_len, item->arg);
>> -            } else if (res && is_rebase_i(opts))
>> +            } else if (res && is_rebase_i(opts) && item->commit)
>>                   return res | error_with_patch(item->commit,
>>                       item->arg, item->arg_len, opts, res,
>>                       item->command == TODO_REWORD);
>> @@ -2665,9 +3018,41 @@ static int pick_commits(struct todo_list
>> *todo_list, struct replay_opts *opts)
>>                   /* `current` will be incremented below */
>>                   todo_list->current = -1;
>>               }
>> +        } else if (item->command == TODO_LABEL) {
>> +            if ((res = do_label(item->arg, item->arg_len)))
>> +                reschedule = 1;
>> +        } else if (item->command == TODO_RESET) {
>> +            if ((res = do_reset(item->arg, item->arg_len, opts)))
>> +                reschedule = 1;
>> +        } else if (item->command == TODO_MERGE) {
>> +            if ((res = do_merge(item->commit,
>> +                        item->arg, item->arg_len,
>> +                        item->flags, opts)) < 0)
>> +                reschedule = 1;
>> +            else if (res > 0)
>> +                /* failed with merge conflicts */
>> +                return error_with_patch(item->commit,
>> +                            item->arg,
>> +                            item->arg_len, opts,
>> +                            res, 0);
>>           } else if (!is_noop(item->command))
>>               return error(_("unknown command %d"), item->command);
>>   +        if (reschedule) {
>> +            advise(_(rescheduled_advice),
>> +                   get_item_line_length(todo_list,
>> +                            todo_list->current),
>> +                   get_item_line(todo_list, todo_list->current));
>> +            todo_list->current--;
>> +            if (save_todo(todo_list, opts))
>> +                return -1;
>> +            if (item->commit)
>> +                return error_with_patch(item->commit,
>> +                            item->arg,
>> +                            item->arg_len, opts,
>> +                            res, 0);
>> +        }
>> +
>>           todo_list->current++;
>>           if (res)
>>               return res;
>> @@ -3147,8 +3532,16 @@ int transform_todos(unsigned flags)
>>                         short_commit_name(item->commit) :
>>                         oid_to_hex(&item->commit->object.oid);
>>   +            if (item->command == TODO_MERGE) {
>> +                if (item->flags & TODO_EDIT_MERGE_MSG)
>> +                    strbuf_addstr(&buf, " -c");
>> +                else
>> +                    strbuf_addstr(&buf, " -C");
>> +            }
>> +
>>               strbuf_addf(&buf, " %s", oid);
>>           }
>> +
>>           /* add all the rest */
>>           if (!item->arg_len)
>>               strbuf_addch(&buf, '\n');
>>
> 


  reply index

Thread overview: 412+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-18 15:35 [PATCH 0/8] rebase -i: offer to recreate merge commits Johannes Schindelin
2018-01-18 15:35 ` [PATCH 1/8] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-01-18 16:25   ` Jacob Keller
2018-01-18 21:13     ` Johannes Schindelin
2018-01-18 21:21       ` Jacob Keller
2018-01-18 21:24     ` Philip Oakley
2018-01-18 21:28       ` Jacob Keller
2018-01-29 20:28       ` Johannes Schindelin
2018-01-22 21:25     ` Junio C Hamano
2018-01-29 22:00       ` Johannes Schindelin
2018-01-19  8:59   ` Eric Sunshine
2018-01-24 22:01     ` Junio C Hamano
2018-01-29 20:55       ` Johannes Schindelin
2018-01-29 20:50     ` Johannes Schindelin
2018-01-30  7:12       ` Eric Sunshine
2018-01-19 12:24   ` [PATCH 1/8] sequencer: introduce new commands to resettherevision Phillip Wood
2018-01-19 18:55     ` Phillip Wood
2018-01-19 18:59       ` Jacob Keller
2018-01-29 21:25         ` Johannes Schindelin
2018-01-29 21:29           ` Johannes Schindelin
2018-01-29 21:23     ` Johannes Schindelin
2018-01-18 15:35 ` [PATCH 2/8] sequencer: introduce the `merge` command Johannes Schindelin
2018-01-18 16:31   ` Jacob Keller
2018-01-18 21:22     ` Johannes Schindelin
2018-01-18 21:26       ` Jacob Keller
2018-01-19  9:54   ` Eric Sunshine
2018-01-19 14:45   ` Phillip Wood
2018-01-20  9:18     ` Jacob Keller
2018-01-29 21:41       ` Johannes Schindelin
2018-01-31 13:48         ` Johannes Schindelin
2018-01-31 17:58           ` Phillip Wood
2018-02-01  6:40           ` Jacob Keller
2018-01-22 22:12   ` Junio C Hamano
2018-01-29 22:15     ` Johannes Schindelin
2018-01-18 15:35 ` [PATCH 3/8] sequencer: fast-forward merge commits, if possible Johannes Schindelin
2018-01-19 14:53   ` Phillip Wood
2018-01-23 19:12     ` Junio C Hamano
2018-01-24 10:32       ` Phillip Wood
2018-01-24 18:51         ` Junio C Hamano
2018-01-29 21:47     ` Johannes Schindelin
2018-01-23 18:51   ` Junio C Hamano
2018-01-29 22:18     ` Johannes Schindelin
2018-01-18 15:35 ` [PATCH 4/8] rebase-helper --make-script: introduce a flag to recreate merges Johannes Schindelin
2018-01-18 21:39   ` Philip Oakley
2018-01-19 10:34   ` Eric Sunshine
2018-01-23 20:13     ` Junio C Hamano
2018-01-29 21:07       ` Johannes Schindelin
2018-01-29 21:05     ` Johannes Schindelin
2018-01-23 20:03   ` Junio C Hamano
2018-01-29 22:37     ` Johannes Schindelin
2018-01-18 15:35 ` [PATCH 5/8] rebase: introduce the --recreate-merges option Johannes Schindelin
2018-01-19 10:55   ` Eric Sunshine
2018-01-29 21:09     ` Johannes Schindelin
2018-01-23 20:22   ` Junio C Hamano
2018-02-10 19:31     ` Johannes Schindelin
2018-02-07  6:16   ` Sergey Organov
2018-02-07  7:26     ` Jacob Keller
2018-02-07  9:47       ` Sergey Organov
2018-02-07  7:27     ` Johannes Sixt
2018-02-07 17:36     ` Johannes Schindelin
2018-02-07 22:58       ` Øyvind Rønningstad
2018-02-07 23:31         ` Junio C Hamano
2018-02-08 12:34           ` Johannes Schindelin
2018-02-14  5:41             ` Sergey Organov
2018-02-09  6:11       ` Sergey Organov
2018-02-09  7:13         ` Johannes Sixt
2018-02-11 10:16           ` Jacob Keller
2018-02-12  7:38           ` Sergey Organov
2018-02-09  6:50   ` Sergey Organov
2018-02-10 23:06     ` Johannes Schindelin
2018-02-12  4:58       ` Sergey Organov
2018-02-12 20:21         ` Johannes Schindelin
2018-02-13  6:44           ` Sergey Organov
2018-02-15  1:08             ` Johannes Schindelin
2018-02-15  4:28               ` Sergey Organov
2018-02-15 16:51                 ` Johannes Schindelin
2018-02-12  5:22       ` Sergey Organov
2018-02-12 20:39         ` Johannes Schindelin
2018-02-13  4:39           ` Jacob Keller
2018-02-13  7:15             ` Sergey Organov
2018-02-14  1:35               ` Jacob Keller
2018-02-15  1:14                 ` Johannes Schindelin
2018-02-15  4:35                   ` Sergey Organov
2018-02-15 16:50                     ` Johannes Schindelin
2018-02-13  6:43           ` Sergey Organov
2018-02-15  1:40             ` Johannes Schindelin
2018-01-18 15:35 ` [PATCH 6/8] sequencer: handle autosquash and post-rewrite for merge commands Johannes Schindelin
2018-01-18 16:43   ` Jacob Keller
2018-01-18 21:27     ` Johannes Schindelin
2018-01-18 21:29       ` Jacob Keller
2018-01-23 20:27     ` Junio C Hamano
2018-01-18 15:36 ` [PATCH 7/8] pull: accept --rebase=recreate to recreate the branch topology Johannes Schindelin
2018-01-18 15:36 ` [PATCH 8/8] rebase -i: introduce --recreate-merges=no-rebase-cousins Johannes Schindelin
2018-01-18 22:00   ` Philip Oakley
2018-01-29 20:42     ` Johannes Schindelin
2018-01-20  1:09   ` Eric Sunshine
2018-01-18 16:49 ` [PATCH 0/8] rebase -i: offer to recreate merge commits Jacob Keller
2018-01-18 18:36 ` [PATCH 9, 10/8] interactive rebase feedback Stefan Beller
2018-01-18 18:36   ` [PATCH 9/8] [DO NOT APPLY, but squash?] git-rebase--interactive: clarify arguments Stefan Beller
2018-01-18 21:18     ` Jacob Keller
2018-01-18 21:36     ` Johannes Schindelin
2018-01-18 21:58       ` Stefan Beller
2018-01-19 20:30       ` Junio C Hamano
2018-01-20  9:14         ` Jacob Keller
2018-01-29 17:02           ` Johannes Schindelin
2018-01-18 18:36   ` [PATCH 10/8] [DO NOT APPLY, but improve?] rebase--interactive: introduce "stop" command Stefan Beller
2018-01-18 21:20     ` Jacob Keller
2018-01-18 22:08       ` Philip Oakley
2018-01-18 22:09         ` Jacob Keller
2018-01-18 22:00     ` Johannes Schindelin
2018-01-18 22:09       ` Stefan Beller
2018-01-19 20:25 ` [PATCH 0/8] rebase -i: offer to recreate merge commits Junio C Hamano
2018-01-29 21:53   ` Johannes Schindelin
2018-01-23 20:29 ` Junio C Hamano
2018-01-29 22:53   ` Johannes Schindelin
2018-01-29 22:54 ` [PATCH v2 00/10] " Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 01/10] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 02/10] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-01-30  8:06     ` Eric Sunshine
2018-02-10 20:58       ` Johannes Schindelin
2018-01-30 20:17     ` Stefan Beller
2018-01-31 13:21       ` Johannes Schindelin
2018-01-31 18:02         ` [PATCH v2 02/10] sequencer: introduce new commands to reset therevision Phillip Wood
2018-02-10 21:49           ` Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 03/10] sequencer: introduce the `merge` command Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 04/10] sequencer: fast-forward merge commits, if possible Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 05/10] rebase-helper --make-script: introduce a flag to recreate merges Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 06/10] rebase: introduce the --recreate-merges option Johannes Schindelin
2018-01-29 22:54   ` [PATCH v2 07/10] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-01-29 22:55   ` [PATCH v2 08/10] sequencer: handle autosquash and post-rewrite for merge commands Johannes Schindelin
2018-01-29 22:55   ` [PATCH v2 09/10] pull: accept --rebase=recreate to recreate the branch topology Johannes Schindelin
2018-01-29 22:55   ` [PATCH v2 10/10] rebase -i: introduce --recreate-merges=[no-]rebase-cousins Johannes Schindelin
2018-01-30 18:47   ` [PATCH v2 00/10] rebase -i: offer to recreate merge commits Stefan Beller
2018-01-31 13:08     ` Johannes Schindelin
2018-01-30 21:36   ` Junio C Hamano
2018-01-31 13:29     ` Johannes Schindelin
2018-02-01  6:37       ` Jacob Keller
2018-02-11  0:09   ` [PATCH v3 00/12] " Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 01/12] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 02/12] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 03/12] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 04/12] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-02-12 19:26       ` Eric Sunshine
2018-02-12 20:46         ` Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 05/12] sequencer: introduce the `merge` command Johannes Schindelin
2018-02-12  8:48       ` Eric Sunshine
2018-02-12 20:17         ` Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 06/12] sequencer: fast-forward merge commits, if possible Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 07/12] rebase-helper --make-script: introduce a flag to recreate merges Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 08/12] rebase: introduce the --recreate-merges option Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 09/12] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 10/12] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 11/12] pull: accept --rebase=recreate to recreate the branch topology Johannes Schindelin
2018-02-11  0:10     ` [PATCH v3 12/12] rebase -i: introduce --recreate-merges=[no-]rebase-cousins Johannes Schindelin
2018-02-23 12:35     ` [PATCH v4 00/12] rebase -i: offer to recreate merge commits Johannes Schindelin
2018-02-23 12:35       ` [PATCH v4 01/12] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-02-23 12:36       ` [PATCH v4 02/12] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-02-23 12:36       ` [PATCH v4 03/12] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-02-23 12:37       ` [PATCH v4 04/12] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-02-23 12:37       ` [PATCH v4 05/12] sequencer: introduce the `merge` command Johannes Schindelin
2018-02-23 12:37       ` [PATCH v4 06/12] sequencer: fast-forward merge commits, if possible Johannes Schindelin
2018-02-23 12:38       ` [PATCH v4 07/12] rebase-helper --make-script: introduce a flag to recreate merges Johannes Schindelin
2018-02-23 12:38       ` [PATCH v4 08/12] rebase: introduce the --recreate-merges option Johannes Schindelin
2018-02-23 12:38       ` [PATCH v4 09/12] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-02-23 12:39       ` [PATCH v4 10/12] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-02-23 12:39       ` [PATCH v4 11/12] pull: accept --rebase=recreate to recreate the branch topology Johannes Schindelin
2018-02-23 12:39       ` [PATCH v4 12/12] rebase -i: introduce --recreate-merges=[no-]rebase-cousins Johannes Schindelin
2018-02-25 10:54       ` [PATCH v4 00/12] rebase -i: offer to recreate merge commits Jacob Keller
2018-02-26 20:49         ` Johannes Schindelin
2018-02-26 21:29     ` [PATCH v5 " Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 01/12] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-02-27 21:33         ` Martin Ågren
2018-03-02 20:33           ` Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 02/12] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 03/12] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 04/12] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 05/12] sequencer: introduce the `merge` command Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 06/12] sequencer: fast-forward merge commits, if possible Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 07/12] rebase-helper --make-script: introduce a flag to recreate merges Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 08/12] rebase: introduce the --recreate-merges option Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 09/12] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 10/12] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 11/12] pull: accept --rebase=recreate to recreate the branch topology Johannes Schindelin
2018-02-26 21:29       ` [PATCH v5 12/12] rebase -i: introduce --recreate-merges=[no-]rebase-cousins Johannes Schindelin
2018-03-06  4:02       ` [PATCH v5 00/12] rebase -i: offer to recreate merge commits Igor Djordjevic
2018-03-07 13:50         ` Johannes Schindelin
2018-04-10 12:29       ` [PATCH v6 00/15] rebase -i: offer to recreate commit topology Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 01/15] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 02/15] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 03/15] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 04/15] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-04-11  6:17           ` Sergey Organov
2018-04-11 11:36             ` Johannes Schindelin
2018-04-11 16:07               ` Sergey Organov
2018-04-13 10:03           ` Phillip Wood
2018-04-15 17:17             ` Philip Oakley
2018-04-18 18:00               ` Phillip Wood
2018-04-10 12:29         ` [PATCH v6 05/15] sequencer: introduce the `merge` command Johannes Schindelin
2018-04-13 10:12           ` Phillip Wood
2018-04-13 17:57             ` Phillip Wood
2018-04-14  0:51               ` Johannes Schindelin
2018-04-18 18:04                 ` Phillip Wood
2018-04-19 12:03                 ` Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 06/15] sequencer: fast-forward `merge` commands, if possible Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 07/15] rebase-helper --make-script: introduce a flag to rebase merges Johannes Schindelin
2018-04-10 12:29         ` [PATCH v6 08/15] rebase: introduce the --rebase-merges option Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 09/15] rebase --rebase-merges: add test for --keep-empty Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 10/15] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 11/15] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 12/15] rebase --rebase-merges: avoid "empty merges" Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 13/15] pull: accept --rebase=merges to recreate the branch topology Johannes Schindelin
2018-04-10 12:30         ` [PATCH v6 14/15] rebase -i: introduce --rebase-merges=[no-]rebase-cousins Johannes Schindelin
2018-04-12 11:30           ` Sergey Organov
2018-04-10 12:30         ` [PATCH v6 15/15] rebase -i --rebase-merges: add a section to the man page Johannes Schindelin
2018-04-10 18:49           ` Martin Ågren
2018-04-10 21:56             ` Johannes Schindelin
2018-04-11 15:35           ` Phillip Wood
2018-04-11 19:10             ` Eric Sunshine
2018-04-12  9:00               ` Johannes Schindelin
2018-04-13 15:21               ` Phillip Wood
2018-04-12  9:30             ` Johannes Schindelin
2018-04-12 18:29               ` Jacob Keller
2018-04-13 15:27               ` Phillip Wood
2018-04-12 11:52           ` Sergey Organov
2018-04-10 14:52         ` [PATCH v6 00/15] rebase -i: offer to recreate commit topology Sergey Organov
2018-04-10 22:11           ` Johannes Schindelin
2018-04-11  4:54             ` Sergey Organov
2018-04-11 11:28               ` Johannes Schindelin
2018-04-11 13:13                 ` Sergey Organov
2018-04-11 20:40                   ` Johannes Schindelin
2018-04-12  8:34                     ` Sergey Organov
2018-04-12 12:31                       ` Johannes Schindelin
2018-04-11 23:52                   ` Jacob Keller
2018-04-12  5:42                     ` Sergey Organov
2018-04-12 17:03                       ` Jacob Keller
2018-04-12 22:02                         ` Johannes Schindelin
2018-04-12 22:14                           ` Jacob Keller
2018-04-13 12:08                             ` Johannes Schindelin
2018-04-13 15:43                           ` Phillip Wood
2018-04-13 23:48                             ` Johannes Schindelin
2018-04-19  4:24                               ` Sergey Organov
2018-04-19  8:23                                 ` Jacob Keller
2018-04-19 11:28                                   ` Sergey Organov
2018-04-20  8:26                                   ` Johannes Schindelin
2018-04-20 20:39                                     ` Jacob Keller
2018-04-18  5:23                         ` Sergey Organov
2018-04-19 12:12         ` [PATCH v7 00/17] " Johannes Schindelin
2018-04-19 12:15           ` [PATCH v7 01/17] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-04-19 12:18           ` [PATCH v7 02/17] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-04-19 12:19           ` [PATCH v7 03/17] sequencer: refactor how original todo list lines are accessed Johannes Schindelin
2018-04-19 12:19           ` [PATCH v7 04/17] sequencer: offer helpful advice when a command was rescheduled Johannes Schindelin
2018-04-19 12:20           ` [PATCH v7 05/17] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-04-19 12:20           ` [PATCH v7 06/17] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-04-20  9:39             ` Phillip Wood
2018-04-20 22:39               ` Johannes Schindelin
2018-04-19 12:20           ` [PATCH v7 07/17] # This is a combination of 2 commits. # This is the 1st commit message: Johannes Schindelin
2018-04-20  5:38             ` Eric Sunshine
2018-04-20  8:34               ` Johannes Schindelin
2018-04-20 21:06               ` [PATCH v2 0/4] rebase -i: avoid stale "# This is a combination of" in commit messages Johannes Schindelin
2018-04-20 21:07                 ` [PATCH v2 1/4] rebase -i: demonstrate bugs with fixup!/squash! " Johannes Schindelin
2018-04-20 21:07                 ` [PATCH v2 2/4] rebase -i: Handle "combination of <n> commits" with GETTEXT_POISON Johannes Schindelin
2018-04-20 21:16                   ` Stefan Beller
2018-04-21  7:20                     ` Johannes Schindelin
2018-04-20 21:07                 ` [PATCH v2 3/4] sequencer: leave a tell-tale when a fixup/squash failed Johannes Schindelin
2018-04-20 21:25                   ` Stefan Beller
2018-04-21  7:24                     ` Johannes Schindelin
2018-04-20 21:08                 ` [PATCH v2 4/4] rebase --skip: clean up commit message after a failed fixup/squash Johannes Schindelin
2018-04-21  7:34               ` [PATCH v3 0/4] rebase -i: avoid stale "# This is a combination of" in commit messages Johannes Schindelin
2018-04-21  7:35                 ` [PATCH v3 1/4] rebase -i: demonstrate bugs with fixup!/squash! " Johannes Schindelin
2018-04-21  7:35                 ` [PATCH v3 2/4] rebase -i: Handle "combination of <n> commits" with GETTEXT_POISON Johannes Schindelin
2018-04-21  7:35                 ` [PATCH v3 3/4] sequencer: leave a tell-tale when a fixup/squash failed Johannes Schindelin
2018-04-21  7:39                 ` [PATCH v3 4/4] rebase --skip: clean up commit message after a failed fixup/squash Johannes Schindelin
2018-04-23 18:11                 ` [PATCH v3 0/4] rebase -i: avoid stale "# This is a combination of" in commit messages Stefan Beller
2018-04-23 19:50                   ` [PATCH v3 0/4] rebase -i: avoid stale "# This is a combinationof" " Phillip Wood
2018-04-25 12:48                     ` Johannes Schindelin
2018-04-25 17:09                       ` Phillip Wood
2018-04-26  9:51                         ` Johannes Schindelin
2018-04-26 10:52                           ` Phillip Wood
2018-04-24  1:28                 ` [PATCH v3 0/4] rebase -i: avoid stale "# This is a combination of" " Junio C Hamano
2018-04-27 20:48               ` [PATCH v4 " Johannes Schindelin
2018-04-27 20:48                 ` [PATCH v4 1/4] rebase -i: demonstrate bugs with fixup!/squash! " Johannes Schindelin
2018-04-27 20:48                 ` [PATCH v4 2/4] rebase -i: Handle "combination of <n> commits" with GETTEXT_POISON Johannes Schindelin
2018-04-27 20:48                 ` [PATCH v4 3/4] sequencer: always commit without editing when asked for Johannes Schindelin
2018-04-27 20:48                 ` [PATCH v4 4/4] rebase --skip: clean up commit message after a failed fixup/squash Johannes Schindelin
2018-04-27 21:28                   ` Stefan Beller
2018-04-28 13:05                     ` Johannes Schindelin
2018-05-06 17:50                   ` Phillip Wood
2018-05-09 10:50                     ` Phillip Wood
2018-10-02 13:50                     ` Johannes Schindelin
2018-10-08 13:37                       ` Phillip Wood
2018-04-19 12:21           ` [PATCH v7 08/17] sequencer: fast-forward `merge` commands, if possible Johannes Schindelin
2018-04-19 12:21           ` [PATCH v7 09/17] rebase-helper --make-script: introduce a flag to rebase merges Johannes Schindelin
2018-04-19 12:21           ` [PATCH v7 10/17] rebase: introduce the --rebase-merges option Johannes Schindelin
2018-04-19 12:22           ` [PATCH v7 11/17] rebase --rebase-merges: add test for --keep-empty Johannes Schindelin
2018-04-19 12:22           ` [PATCH v7 12/17] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-04-19 12:23           ` [PATCH v7 13/17] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-04-19 12:23           ` [PATCH v7 14/17] rebase --rebase-merges: avoid "empty merges" Johannes Schindelin
2018-04-19 12:23           ` [PATCH v7 15/17] pull: accept --rebase=merges to recreate the branch topology Johannes Schindelin
2018-04-19 12:24           ` [PATCH v7 16/17] rebase -i: introduce --rebase-merges=[no-]rebase-cousins Johannes Schindelin
2018-04-19 12:24           ` [PATCH v7 17/17] rebase -i --rebase-merges: add a section to the man page Johannes Schindelin
2018-04-21 10:29           ` [PATCH v8 00/16] rebase -i: offer to recreate commit topology by rebasing merges Johannes Schindelin
2018-04-21 10:30             ` [PATCH v8 01/16] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-04-21 10:30             ` [PATCH v8 02/16] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-04-21 10:31             ` [PATCH v8 03/16] sequencer: refactor how original todo list lines are accessed Johannes Schindelin
2018-04-21 10:31             ` [PATCH v8 04/16] sequencer: offer helpful advice when a command was rescheduled Johannes Schindelin
2018-04-21 10:32             ` [PATCH v8 05/16] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-04-21 10:33             ` [PATCH v8 06/16] sequencer: introduce the `merge` command Johannes Schindelin
2018-04-21 15:56               ` Phillip Wood
2018-04-22 17:17                 ` Phillip Wood [this message]
2018-04-23 12:22                   ` Johannes Schindelin
2018-04-23 12:20                 ` Johannes Schindelin
2018-04-23 15:54                   ` Phillip Wood
2018-04-24  5:13                     ` Martin Ågren
2018-04-24  5:13                       ` [PATCH 1/2] merge: setup `opts` later in `checkout_fast_forward()` Martin Ågren
2018-04-24  6:20                         ` Jacob Keller
2018-04-24  9:36                           ` Martin Ågren
2018-04-24 11:30                             ` Johannes Schindelin
2018-04-24  5:13                       ` [PATCH 2/2] unpack_trees_options: free messages when done Martin Ågren
2018-04-24 16:29                         ` Elijah Newren
2018-04-28 11:32                           ` Martin Ågren
2018-04-28 12:30                             ` Johannes Schindelin
2018-04-28 20:56                             ` Elijah Newren
2018-05-16 14:32                             ` Elijah Newren
2018-05-16 16:30                               ` [PATCH v2 0/3] " Martin Ågren
2018-05-16 16:30                                 ` [PATCH v2 1/3] merge: setup `opts` later in `checkout_fast_forward()` Martin Ågren
2018-05-16 16:41                                   ` Stefan Beller
2018-05-16 19:29                                     ` Martin Ågren
2018-05-16 21:21                                       ` Jacob Keller
2018-05-16 21:20                                     ` Jacob Keller
2018-05-17 21:48                                   ` Junio C Hamano
2018-05-18  1:59                                     ` Jacob Keller
2018-05-16 16:30                                 ` [PATCH v2 2/3] merge-recursive: provide pair of `unpack_trees_{start,finish}()` Martin Ågren
2018-05-16 16:31                                 ` [PATCH v2 3/3] unpack_trees_options: free messages when done Martin Ågren
2018-05-17 22:10                                   ` Junio C Hamano
2018-05-18  5:08                                     ` Martin Ågren
2018-05-18 21:23                                       ` [PATCH v3 0/3] " Martin Ågren
2018-05-18 21:23                                         ` [PATCH v3 1/3] merge: setup `opts` later in `checkout_fast_forward()` Martin Ågren
2018-05-18 21:23                                         ` [PATCH v3 2/3] merge-recursive: provide pair of `unpack_trees_{start,finish}()` Martin Ågren
2018-05-18 21:23                                         ` [PATCH v3 3/3] unpack_trees_options: free messages when done Martin Ågren
2018-05-18 21:33                                           ` Jeff King
2018-05-18 22:30                                             ` Elijah Newren
2018-05-19  1:02                                               ` Jeff King
2018-05-19  6:13                                                 ` Martin Ågren
2018-05-20 10:17                                                   ` [PATCH v4 0/4] " Martin Ågren
2018-05-20 10:17                                                     ` [PATCH v4 1/4] merge: setup `opts` later in `checkout_fast_forward()` Martin Ågren
2018-05-20 10:17                                                     ` [PATCH v4 2/4] merge-recursive: provide pair of `unpack_trees_{start,finish}()` Martin Ågren
2018-05-20 10:17                                                     ` [PATCH v4 3/4] string-list: provide `string_list_appendf()` Martin Ågren
2018-05-20 19:12                                                       ` Jacob Keller
2018-05-21  0:01                                                         ` Re*: " Junio C Hamano
2018-05-21  0:25                                                           ` Junio C Hamano
2018-05-21  2:39                                                             ` Jeff King
2018-05-21 14:54                                                             ` [PATCH v5 0/4] unpack_trees_options: free messages when done Martin Ågren
2018-05-21 14:54                                                               ` [PATCH v5 1/4] merge: setup `opts` later in `checkout_fast_forward()` Martin Ågren
2018-05-21 14:54                                                               ` [PATCH v5 2/4] merge-recursive: provide pair of `unpack_trees_{start,finish}()` Martin Ågren
2018-05-21 14:54                                                               ` [PATCH v5 3/4] argv-array: return the pushed string from argv_push*() Martin Ågren
2018-05-21 14:54                                                               ` [PATCH v5 4/4] unpack_trees_options: free messages when done Martin Ågren
2018-05-21 21:38                                                               ` [PATCH v5 0/4] " Jeff King
2018-05-22  2:46                                                               ` Junio C Hamano
2018-05-22  2:54                                                                 ` Junio C Hamano
2018-05-22 11:11                                                                   ` Martin Ågren
2018-05-23  0:48                                                                     ` Junio C Hamano
2018-05-21  2:38                                                           ` Re*: [PATCH v4 3/4] string-list: provide `string_list_appendf()` Jeff King
2018-05-20 10:17                                                     ` [PATCH v4 4/4] unpack_trees_options: free messages when done Martin Ågren
2018-05-16 21:54                                 ` [PATCH v2 0/3] " Elijah Newren
2018-05-17 12:09                                   ` Ben Peart
2018-04-24  8:22                       ` [PATCH v8 06/16] sequencer: introduce the `merge` command Johannes Schindelin
2018-04-22 12:01               ` Philip Oakley
2018-04-23 12:03                 ` Johannes Schindelin
2018-04-23 20:34                   ` Philip Oakley
2018-04-24  8:11                     ` Johannes Schindelin
2018-04-24 19:41                       ` Philip Oakley
2018-04-22 13:55               ` Philip Oakley
2018-04-21 10:33             ` [PATCH v8 07/16] sequencer: fast-forward `merge` commands, if possible Johannes Schindelin
2018-04-21 10:34             ` [PATCH v8 08/16] rebase-helper --make-script: introduce a flag to rebase merges Johannes Schindelin
2018-04-22 13:42               ` Philip Oakley
2018-04-24  8:33                 ` Johannes Schindelin
2018-04-21 10:34             ` [PATCH v8 09/16] rebase: introduce the --rebase-merges option Johannes Schindelin
2018-04-22 14:15               ` Philip Oakley
2018-04-24  5:01                 ` Junio C Hamano
2018-04-24  9:03                   ` Johannes Schindelin
2018-04-24  8:40                 ` Johannes Schindelin
2018-04-22 14:37               ` Philip Oakley
2018-04-24 10:52                 ` Johannes Schindelin
2018-04-21 10:35             ` [PATCH v8 10/16] rebase --rebase-merges: add test for --keep-empty Johannes Schindelin
2018-04-21 10:43             ` [PATCH v8 11/16] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-04-21 10:46             ` [PATCH v8 12/16] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-04-21 10:47             ` [PATCH v8 13/16] rebase --rebase-merges: avoid "empty merges" Johannes Schindelin
2018-04-21 10:49             ` [PATCH v8 14/16] pull: accept --rebase=merges to recreate the branch topology Johannes Schindelin
2018-04-21 10:57             ` [PATCH v8 15/16] rebase -i: introduce --rebase-merges=[no-]rebase-cousins Johannes Schindelin
2018-04-21 11:09             ` [PATCH v8 16/16] rebase -i --rebase-merges: add a section to the man page Johannes Schindelin
2018-04-25 12:28             ` [PATCH v9 00/17] rebase -i: offer to recreate commit topology by rebasing merges Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 01/17] sequencer: avoid using errno clobbered by rollback_lock_file() Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 02/17] sequencer: make rearrange_squash() a bit more obvious Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 03/17] sequencer: refactor how original todo list lines are accessed Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 04/17] sequencer: offer helpful advice when a command was rescheduled Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 05/17] git-rebase--interactive: clarify arguments Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 06/17] sequencer: introduce new commands to reset the revision Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 07/17] sequencer: introduce the `merge` command Johannes Schindelin
2018-04-25 12:28               ` [PATCH v9 08/17] sequencer: fast-forward `merge` commands, if possible Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 09/17] rebase-helper --make-script: introduce a flag to rebase merges Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 10/17] rebase: introduce the --rebase-merges option Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 11/17] rebase --rebase-merges: add test for --keep-empty Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 12/17] sequencer: make refs generated by the `label` command worktree-local Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 13/17] sequencer: handle post-rewrite for merge commands Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 14/17] rebase --rebase-merges: avoid "empty merges" Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 15/17] pull: accept --rebase=merges to recreate the branch topology Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 16/17] rebase -i: introduce --rebase-merges=[no-]rebase-cousins Johannes Schindelin
2018-04-25 12:29               ` [PATCH v9 17/17] rebase -i --rebase-merges: add a section to the man page Johannes Schindelin
2018-04-26  3:51               ` [PATCH v9 00/17] rebase -i: offer to recreate commit topology by rebasing merges Junio C Hamano
2018-04-26  6:06                 ` Junio C Hamano
2018-05-25 14:19               ` Sergey Organov
2018-05-25 15:44                 ` Sergey Organov

Reply instructions:

You may reply publically to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0b0555fb-9fec-cd9d-f2f2-cecb51412128@talktalk.net \
    --to=phillip.wood@talktalk.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=igor.d.djordjevic@gmail.com \
    --cc=j6t@kdbg.org \
    --cc=jacob.keller@gmail.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=martin.agren@gmail.com \
    --cc=philipoakley@iee.org \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=sbeller@google.com \
    --cc=sorganov@gmail.com \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

git@vger.kernel.org list mirror (unofficial, one of many)

Archives are clonable:
	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git
	nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git
	nntp://news.gmane.org/gmane.comp.version-control.git

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox