Coverage Report

Created: 2026-10-01 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/git/sequencer.c
Line
Count
Source
1
#define USE_THE_REPOSITORY_VARIABLE
2
#define DISABLE_SIGN_COMPARE_WARNINGS
3
4
#include "git-compat-util.h"
5
#include "abspath.h"
6
#include "advice.h"
7
#include "config.h"
8
#include "copy.h"
9
#include "environment.h"
10
#include "gettext.h"
11
#include "hex.h"
12
#include "lockfile.h"
13
#include "dir.h"
14
#include "object-file.h"
15
#include "object-name.h"
16
#include "odb.h"
17
#include "object.h"
18
#include "pager.h"
19
#include "commit.h"
20
#include "sequencer.h"
21
#include "run-command.h"
22
#include "stash.h"
23
#include "hook.h"
24
#include "utf8.h"
25
#include "cache-tree.h"
26
#include "diff.h"
27
#include "path.h"
28
#include "revision.h"
29
#include "rerere.h"
30
#include "merge.h"
31
#include "merge-ort.h"
32
#include "merge-ort-wrappers.h"
33
#include "refs.h"
34
#include "sparse-index.h"
35
#include "strvec.h"
36
#include "quote.h"
37
#include "trailer.h"
38
#include "log-tree.h"
39
#include "wt-status.h"
40
#include "hashmap.h"
41
#include "notes-utils.h"
42
#include "sigchain.h"
43
#include "unpack-trees.h"
44
#include "oidmap.h"
45
#include "oidset.h"
46
#include "commit-slab.h"
47
#include "alias.h"
48
#include "commit-reach.h"
49
#include "rebase-interactive.h"
50
#include "reset.h"
51
#include "branch.h"
52
53
0
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
54
55
/*
56
 * To accommodate common filesystem limitations, where the loose refs' file
57
 * names must not exceed `NAME_MAX`, the labels generated by `git rebase
58
 * --rebase-merges` need to be truncated if the corresponding commit subjects
59
 * are too long.
60
 * Add some margin to stay clear from reaching `NAME_MAX`.
61
 */
62
0
#define GIT_MAX_LABEL_LENGTH ((NAME_MAX) - (LOCK_SUFFIX_LEN) - 16)
63
64
static const char sign_off_header[] = "Signed-off-by: ";
65
static const char cherry_picked_prefix[] = "(cherry picked from commit ";
66
67
GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
68
69
static GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
70
71
static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
72
static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
73
static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
74
static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
75
76
static GIT_PATH_FUNC(rebase_path, "rebase-merge")
77
/*
78
 * The file containing rebase commands, comments, and empty lines.
79
 * This file is created by "git rebase -i" then edited by the user. As
80
 * the lines are processed, they are removed from the front of this
81
 * file and written to the tail of 'done'.
82
 */
83
GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
84
GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
85
86
GIT_PATH_FUNC(rebase_path_dropped, "rebase-merge/dropped")
87
88
/*
89
 * The rebase command lines that have already been processed. A line
90
 * is moved here when it is first handled, before any associated user
91
 * actions.
92
 */
93
static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
94
/*
95
 * The file to keep track of how many commands were already processed (e.g.
96
 * for the prompt).
97
 */
98
static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
99
/*
100
 * The file to keep track of how many commands are to be processed in total
101
 * (e.g. for the prompt).
102
 */
103
static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
104
/*
105
 * The commit message that is planned to be used for any changes that
106
 * need to be committed following a user interaction.
107
 */
108
static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
109
/*
110
 * The file into which is accumulated the suggested commit message for
111
 * squash/fixup commands. When the first of a series of squash/fixups
112
 * is seen, the file is created and the commit message from the
113
 * previous commit and from the first squash/fixup commit are written
114
 * to it. The commit message for each subsequent squash/fixup commit
115
 * is appended to the file as it is processed.
116
 */
117
static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
118
/*
119
 * If the current series of squash/fixups has not yet included a squash
120
 * command, then this file exists and holds the commit message of the
121
 * original "pick" commit.  (If the series ends without a "squash"
122
 * command, then this can be used as the commit message of the combined
123
 * commit without opening the editor.)
124
 */
125
static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
126
/*
127
 * This file contains the list fixup/squash commands that have been
128
 * accumulated into message-fixup or message-squash so far.
129
 */
130
static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
131
/*
132
 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
133
 * GIT_AUTHOR_DATE that will be used for the commit that is currently
134
 * being rebased.
135
 */
136
static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
137
/*
138
 * When an "edit" rebase command is being processed, the SHA1 of the
139
 * commit to be edited is recorded in this file.  When "git rebase
140
 * --continue" is executed, if there are any staged changes then they
141
 * will be amended to the HEAD commit, but only provided the HEAD
142
 * commit is still the commit to be edited.  When any other rebase
143
 * command is processed, this file is deleted.
144
 */
145
static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
146
/*
147
 * When we stop at a given patch via the "edit" command, this file contains
148
 * the commit object name of the corresponding patch.
149
 */
150
static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
151
/*
152
 * When we stop for the user to resolve conflicts this file contains
153
 * the patch of the commit that is being picked.
154
 */
155
static GIT_PATH_FUNC(rebase_path_patch, "rebase-merge/patch")
156
/*
157
 * For the post-rewrite hook, we make a list of rewritten commits and
158
 * their new sha1s.  The rewritten-pending list keeps the sha1s of
159
 * commits that have been processed, but not committed yet,
160
 * e.g. because they are waiting for a 'squash' command.
161
 */
162
static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
163
static GIT_PATH_FUNC(rebase_path_rewritten_pending,
164
  "rebase-merge/rewritten-pending")
165
166
/*
167
 * The path of the file containing the OID of the "squash onto" commit, i.e.
168
 * the dummy commit used for `reset [new root]`.
169
 */
170
static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
171
172
/*
173
 * The path of the file listing refs that need to be deleted after the rebase
174
 * finishes. This is used by the `label` command to record the need for cleanup.
175
 */
176
static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
177
178
/*
179
 * The update-refs file stores a list of refs that will be updated at the end
180
 * of the rebase sequence. The 'update-ref <ref>' commands in the todo file
181
 * update the OIDs for the refs in this file, but the refs are not updated
182
 * until the end of the rebase sequence.
183
 *
184
 * rebase_path_update_refs() returns the path to this file for a given
185
 * worktree directory. For the current worktree, pass the_repository->gitdir.
186
 */
187
static char *rebase_path_update_refs(const char *wt_git_dir)
188
0
{
189
0
  return xstrfmt("%s/rebase-merge/update-refs", wt_git_dir);
190
0
}
191
192
/*
193
 * The following files are written by git-rebase just after parsing the
194
 * command-line.
195
 */
196
static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
197
static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
198
static GIT_PATH_FUNC(rebase_path_ignore_date, "rebase-merge/ignore_date")
199
static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
200
static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
201
static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
202
static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
203
static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
204
static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
205
static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
206
static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
207
static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
208
static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
209
static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
210
static GIT_PATH_FUNC(rebase_path_no_reschedule_failed_exec, "rebase-merge/no-reschedule-failed-exec")
211
static GIT_PATH_FUNC(rebase_path_drop_redundant_commits, "rebase-merge/drop_redundant_commits")
212
static GIT_PATH_FUNC(rebase_path_keep_redundant_commits, "rebase-merge/keep_redundant_commits")
213
static GIT_PATH_FUNC(rebase_path_trailer, "rebase-merge/trailer")
214
215
/*
216
 * A 'struct replay_ctx' represents the private state of the sequencer.
217
 */
218
struct replay_ctx {
219
  /*
220
   * The commit message that will be used except at the end of a
221
   * chain of fixup and squash commands.
222
   */
223
  struct strbuf message;
224
  /*
225
   * The list of completed fixup and squash commands in the
226
   * current chain.
227
   */
228
  struct strbuf current_fixups;
229
  /*
230
   * The number of completed fixup and squash commands in the
231
   * current chain.
232
   */
233
  int current_fixup_count;
234
  /*
235
   * Whether message contains a commit message.
236
   */
237
  unsigned have_message :1;
238
};
239
240
struct replay_ctx* replay_ctx_new(void)
241
0
{
242
0
  struct replay_ctx *ctx = xcalloc(1, sizeof(*ctx));
243
244
0
  strbuf_init(&ctx->current_fixups, 0);
245
0
  strbuf_init(&ctx->message, 0);
246
247
0
  return ctx;
248
0
}
249
250
/**
251
 * A 'struct update_refs_record' represents a value in the update-refs
252
 * list. We use a string_list to map refs to these (before, after) pairs.
253
 */
254
struct update_ref_record {
255
  struct object_id before;
256
  struct object_id after;
257
};
258
259
static struct update_ref_record *init_update_ref_record(const char *ref)
260
0
{
261
0
  struct update_ref_record *rec;
262
263
0
  CALLOC_ARRAY(rec, 1);
264
265
0
  oidcpy(&rec->before, null_oid(the_hash_algo));
266
0
  oidcpy(&rec->after, null_oid(the_hash_algo));
267
268
  /* This may fail, but that's fine, we will keep the null OID. */
269
0
  refs_read_ref(get_main_ref_store(the_repository), ref, &rec->before);
270
271
0
  return rec;
272
0
}
273
274
static int git_sequencer_config(const char *k, const char *v,
275
        const struct config_context *ctx, void *cb)
276
0
{
277
0
  struct replay_opts *opts = cb;
278
279
0
  if (!strcmp(k, "commit.cleanup")) {
280
0
    if (!v)
281
0
      return config_error_nonbool(k);
282
283
0
    if (!strcmp(v, "verbatim")) {
284
0
      opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
285
0
      opts->explicit_cleanup = 1;
286
0
    } else if (!strcmp(v, "whitespace")) {
287
0
      opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
288
0
      opts->explicit_cleanup = 1;
289
0
    } else if (!strcmp(v, "strip")) {
290
0
      opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
291
0
      opts->explicit_cleanup = 1;
292
0
    } else if (!strcmp(v, "scissors")) {
293
0
      opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
294
0
      opts->explicit_cleanup = 1;
295
0
    } else {
296
0
      warning(_("invalid commit message cleanup mode '%s'"),
297
0
          v);
298
0
    }
299
300
0
    return 0;
301
0
  }
302
303
0
  if (!strcmp(k, "commit.gpgsign")) {
304
0
    free(opts->gpg_sign);
305
0
    opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
306
0
    return 0;
307
0
  }
308
309
0
  if (!opts->default_strategy && !strcmp(k, "pull.twohead")) {
310
0
    int ret = git_config_string(&opts->default_strategy, k, v);
311
0
    if (ret == 0) {
312
      /*
313
       * pull.twohead is allowed to be multi-valued; we only
314
       * care about the first value.
315
       */
316
0
      char *tmp = strchr(opts->default_strategy, ' ');
317
0
      if (tmp)
318
0
        *tmp = '\0';
319
0
    }
320
0
    return ret;
321
0
  }
322
323
0
  if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
324
0
    opts->commit_use_reference = git_config_bool(k, v);
325
326
0
  return git_diff_basic_config(k, v, ctx, NULL);
327
0
}
328
329
void sequencer_init_config(struct replay_opts *opts)
330
0
{
331
0
  opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
332
0
  repo_config(the_repository, git_sequencer_config, opts);
333
0
}
334
335
static inline int is_rebase_i(const struct replay_opts *opts)
336
0
{
337
0
  return opts->action == REPLAY_INTERACTIVE_REBASE;
338
0
}
339
340
static const char *get_dir(const struct replay_opts *opts)
341
0
{
342
0
  if (is_rebase_i(opts))
343
0
    return rebase_path();
344
0
  return git_path_seq_dir();
345
0
}
346
347
static const char *get_todo_path(const struct replay_opts *opts)
348
0
{
349
0
  if (is_rebase_i(opts))
350
0
    return rebase_path_todo();
351
0
  return git_path_todo_file();
352
0
}
353
354
/*
355
 * Returns 0 for non-conforming footer
356
 * Returns 1 for conforming footer
357
 * Returns 2 when sob exists within conforming footer
358
 * Returns 3 when sob exists within conforming footer as last entry
359
 */
360
static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
361
  size_t ignore_footer)
362
0
{
363
0
  struct trailer_iterator iter;
364
0
  size_t i = 0;
365
0
  int found_sob = 0, found_sob_last = 0;
366
0
  char saved_char;
367
368
0
  if (ignore_footer) {
369
0
    saved_char = sb->buf[sb->len - ignore_footer];
370
0
    sb->buf[sb->len - ignore_footer] = '\0';
371
0
  }
372
373
0
  trailer_iterator_init(&iter, sb->buf);
374
375
0
  if (ignore_footer)
376
0
    sb->buf[sb->len - ignore_footer] = saved_char;
377
378
0
  while (trailer_iterator_advance(&iter)) {
379
0
    i++;
380
0
    if (sob && !strncmp(iter.raw, sob->buf, sob->len))
381
0
      found_sob = i;
382
0
  }
383
0
  trailer_iterator_release(&iter);
384
385
0
  if (!i)
386
0
    return 0;
387
388
0
  found_sob_last = (int)i == found_sob;
389
390
0
  if (found_sob_last)
391
0
    return 3;
392
0
  if (found_sob)
393
0
    return 2;
394
0
  return 1;
395
0
}
396
397
static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
398
0
{
399
0
  static struct strbuf buf = STRBUF_INIT;
400
401
0
  strbuf_reset(&buf);
402
0
  if (opts->gpg_sign)
403
0
    sq_quotef(&buf, "-S%s", opts->gpg_sign);
404
0
  return buf.buf;
405
0
}
406
407
static void replay_ctx_release(struct replay_ctx *ctx)
408
0
{
409
0
  strbuf_release(&ctx->current_fixups);
410
0
  strbuf_release(&ctx->message);
411
0
}
412
413
void replay_opts_release(struct replay_opts *opts)
414
0
{
415
0
  struct replay_ctx *ctx = opts->ctx;
416
417
0
  free(opts->gpg_sign);
418
0
  free(opts->reflog_action);
419
0
  free(opts->default_strategy);
420
0
  free(opts->strategy);
421
0
  strvec_clear (&opts->xopts);
422
0
  if (opts->revs)
423
0
    release_revisions(opts->revs);
424
0
  free(opts->revs);
425
0
  strvec_clear(&opts->trailer_args);
426
0
  replay_ctx_release(ctx);
427
0
  free(opts->ctx);
428
0
}
429
430
int sequencer_remove_state(struct replay_opts *opts)
431
0
{
432
0
  struct strbuf buf = STRBUF_INIT;
433
0
  int ret = 0;
434
435
0
  if (is_rebase_i(opts) &&
436
0
      strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
437
0
    char *p = buf.buf;
438
0
    while (*p) {
439
0
      char *eol = strchr(p, '\n');
440
0
      if (eol)
441
0
        *eol = '\0';
442
0
      if (refs_delete_ref(get_main_ref_store(the_repository), "(rebase) cleanup", p, NULL, 0) < 0) {
443
0
        warning(_("could not delete '%s'"), p);
444
0
        ret = -1;
445
0
      }
446
0
      if (!eol)
447
0
        break;
448
0
      p = eol + 1;
449
0
    }
450
0
  }
451
452
0
  strbuf_reset(&buf);
453
0
  strbuf_addstr(&buf, get_dir(opts));
454
0
  if (remove_dir_recursively(&buf, 0))
455
0
    ret = error(_("could not remove '%s'"), buf.buf);
456
0
  strbuf_release(&buf);
457
458
0
  return ret;
459
0
}
460
461
static const char *action_name(const struct replay_opts *opts)
462
0
{
463
0
  switch (opts->action) {
464
0
  case REPLAY_REVERT:
465
0
    return N_("revert");
466
0
  case REPLAY_PICK:
467
0
    return N_("cherry-pick");
468
0
  case REPLAY_INTERACTIVE_REBASE:
469
0
    return N_("rebase");
470
0
  }
471
0
  die(_("unknown action: %d"), opts->action);
472
0
}
473
474
struct commit_message {
475
  char *parent_label;
476
  char *label;
477
  char *subject;
478
  const char *message;
479
};
480
481
static const char *short_commit_name(struct repository *r, struct commit *commit)
482
0
{
483
0
  return repo_find_unique_abbrev(r, &commit->object.oid, DEFAULT_ABBREV);
484
0
}
485
486
static int get_message(struct commit *commit, struct commit_message *out)
487
0
{
488
0
  const char *abbrev, *subject;
489
0
  int subject_len;
490
491
0
  out->message = repo_logmsg_reencode(the_repository, commit, NULL,
492
0
              get_commit_output_encoding());
493
0
  abbrev = short_commit_name(the_repository, commit);
494
495
0
  subject_len = find_commit_subject(out->message, &subject);
496
497
0
  out->subject = xmemdupz(subject, subject_len);
498
0
  out->label = xstrfmt("%s (%s)", abbrev, out->subject);
499
0
  out->parent_label = xstrfmt("parent of %s", out->label);
500
501
0
  return 0;
502
0
}
503
504
static void free_message(struct commit *commit, struct commit_message *msg)
505
0
{
506
0
  free(msg->parent_label);
507
0
  free(msg->label);
508
0
  free(msg->subject);
509
0
  repo_unuse_commit_buffer(the_repository, commit, msg->message);
510
0
}
511
512
const char *rebase_resolvemsg =
513
N_("Resolve all conflicts manually, mark them as resolved with\n"
514
"\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
515
"You can instead skip this commit: run \"git rebase --skip\".\n"
516
"To abort and get back to the state before \"git rebase\", run "
517
"\"git rebase --abort\".");
518
519
static void print_advice(struct repository *r, int show_hint,
520
       struct replay_opts *opts)
521
0
{
522
0
  const char *msg;
523
524
0
  if (is_rebase_i(opts))
525
0
    msg = rebase_resolvemsg;
526
0
  else
527
0
    msg = getenv("GIT_CHERRY_PICK_HELP");
528
529
0
  if (msg) {
530
0
    advise_if_enabled(ADVICE_MERGE_CONFLICT, "%s", msg);
531
    /*
532
     * A conflict has occurred but the porcelain
533
     * (typically rebase --interactive) wants to take care
534
     * of the commit itself so remove CHERRY_PICK_HEAD
535
     */
536
0
    refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
537
0
        NULL, REF_NO_DEREF);
538
0
    return;
539
0
  }
540
541
0
  if (show_hint) {
542
0
    if (opts->no_commit)
543
0
      advise_if_enabled(ADVICE_MERGE_CONFLICT,
544
0
            _("after resolving the conflicts, mark the corrected paths\n"
545
0
              "with 'git add <paths>' or 'git rm <paths>'"));
546
0
    else if (opts->action == REPLAY_PICK)
547
0
      advise_if_enabled(ADVICE_MERGE_CONFLICT,
548
0
            _("After resolving the conflicts, mark them with\n"
549
0
              "\"git add/rm <pathspec>\", then run\n"
550
0
              "\"git cherry-pick --continue\".\n"
551
0
              "You can instead skip this commit with \"git cherry-pick --skip\".\n"
552
0
              "To abort and get back to the state before \"git cherry-pick\",\n"
553
0
              "run \"git cherry-pick --abort\"."));
554
0
    else if (opts->action == REPLAY_REVERT)
555
0
      advise_if_enabled(ADVICE_MERGE_CONFLICT,
556
0
            _("After resolving the conflicts, mark them with\n"
557
0
              "\"git add/rm <pathspec>\", then run\n"
558
0
              "\"git revert --continue\".\n"
559
0
              "You can instead skip this commit with \"git revert --skip\".\n"
560
0
              "To abort and get back to the state before \"git revert\",\n"
561
0
              "run \"git revert --abort\"."));
562
0
    else
563
0
      BUG("unexpected pick action in print_advice()");
564
0
  }
565
0
}
566
567
static int write_message(const void *buf, size_t len, const char *filename,
568
       int append_eol)
569
0
{
570
0
  struct lock_file msg_file = LOCK_INIT;
571
572
0
  int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
573
0
  if (msg_fd < 0)
574
0
    return error_errno(_("could not lock '%s'"), filename);
575
0
  if (write_in_full(msg_fd, buf, len) < 0) {
576
0
    error_errno(_("could not write to '%s'"), filename);
577
0
    rollback_lock_file(&msg_file);
578
0
    return -1;
579
0
  }
580
0
  if (append_eol && write(msg_fd, "\n", 1) < 0) {
581
0
    error_errno(_("could not write eol to '%s'"), filename);
582
0
    rollback_lock_file(&msg_file);
583
0
    return -1;
584
0
  }
585
0
  if (commit_lock_file(&msg_file) < 0)
586
0
    return error(_("failed to finalize '%s'"), filename);
587
588
0
  return 0;
589
0
}
590
591
int read_oneliner(struct strbuf *buf,
592
  const char *path, unsigned flags)
593
0
{
594
0
  int orig_len = buf->len;
595
596
0
  if (strbuf_read_file(buf, path, 0) < 0) {
597
0
    if ((flags & READ_ONELINER_WARN_MISSING) ||
598
0
        (errno != ENOENT && errno != ENOTDIR))
599
0
      warning_errno(_("could not read '%s'"), path);
600
0
    return 0;
601
0
  }
602
603
0
  if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
604
0
    if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
605
0
      --buf->len;
606
0
    buf->buf[buf->len] = '\0';
607
0
  }
608
609
0
  if ((flags & READ_ONELINER_SKIP_IF_EMPTY) && buf->len == orig_len)
610
0
    return 0;
611
612
0
  return 1;
613
0
}
614
615
static struct tree *empty_tree(struct repository *r)
616
0
{
617
0
  return lookup_tree(r, the_hash_algo->empty_tree);
618
0
}
619
620
static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
621
0
{
622
0
  if (repo_read_index_unmerged(repo))
623
0
    return error_resolve_conflict(action_name(opts));
624
625
0
  error(_("your local changes would be overwritten by %s."),
626
0
    _(action_name(opts)));
627
628
0
  if (advice_enabled(ADVICE_COMMIT_BEFORE_MERGE))
629
0
    advise(_("commit your changes or stash them to proceed."));
630
0
  return -1;
631
0
}
632
633
static void update_abort_safety_file(void)
634
0
{
635
0
  struct object_id head;
636
637
  /* Do nothing on a single-pick */
638
0
  if (!file_exists(git_path_seq_dir()))
639
0
    return;
640
641
0
  if (!repo_get_oid(the_repository, "HEAD", &head))
642
0
    write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
643
0
  else
644
0
    write_file(git_path_abort_safety_file(), "%s", "");
645
0
}
646
647
static int fast_forward_to(struct repository *r,
648
         const struct object_id *to,
649
         const struct object_id *from,
650
         int unborn,
651
         struct replay_opts *opts)
652
0
{
653
0
  struct ref_transaction *transaction;
654
0
  struct strbuf sb = STRBUF_INIT;
655
0
  struct strbuf err = STRBUF_INIT;
656
657
0
  repo_read_index(r);
658
0
  if (checkout_fast_forward(r, from, to, 1))
659
0
    return -1; /* the callee should have complained already */
660
661
0
  strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
662
663
0
  transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
664
0
              0, &err);
665
0
  if (!transaction ||
666
0
      ref_transaction_update(transaction, "HEAD",
667
0
           to, unborn && !is_rebase_i(opts) ?
668
0
           null_oid(the_hash_algo) : from, NULL, NULL,
669
0
           0, sb.buf, &err) ||
670
0
      ref_transaction_commit(transaction, &err)) {
671
0
    ref_transaction_free(transaction);
672
0
    error("%s", err.buf);
673
0
    strbuf_release(&sb);
674
0
    strbuf_release(&err);
675
0
    return -1;
676
0
  }
677
678
0
  strbuf_release(&sb);
679
0
  strbuf_release(&err);
680
0
  ref_transaction_free(transaction);
681
0
  update_abort_safety_file();
682
0
  return 0;
683
0
}
684
685
enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
686
  int use_editor)
687
0
{
688
0
  if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
689
0
    return use_editor ? COMMIT_MSG_CLEANUP_ALL :
690
0
            COMMIT_MSG_CLEANUP_SPACE;
691
0
  else if (!strcmp(cleanup_arg, "verbatim"))
692
0
    return COMMIT_MSG_CLEANUP_NONE;
693
0
  else if (!strcmp(cleanup_arg, "whitespace"))
694
0
    return COMMIT_MSG_CLEANUP_SPACE;
695
0
  else if (!strcmp(cleanup_arg, "strip"))
696
0
    return COMMIT_MSG_CLEANUP_ALL;
697
0
  else if (!strcmp(cleanup_arg, "scissors"))
698
0
    return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
699
0
            COMMIT_MSG_CLEANUP_SPACE;
700
0
  else
701
0
    die(_("Invalid cleanup mode %s"), cleanup_arg);
702
0
}
703
704
/*
705
 * NB using int rather than enum cleanup_mode to stop clang's
706
 * -Wtautological-constant-out-of-range-compare complaining that the comparison
707
 * is always true.
708
 */
709
static const char *describe_cleanup_mode(int cleanup_mode)
710
0
{
711
0
  static const char *modes[] = { "whitespace",
712
0
               "verbatim",
713
0
               "scissors",
714
0
               "strip" };
715
716
0
  if (cleanup_mode < ARRAY_SIZE(modes))
717
0
    return modes[cleanup_mode];
718
719
0
  BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
720
0
}
721
722
void append_conflicts_hint(struct index_state *istate,
723
  struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
724
0
{
725
0
  int i;
726
727
0
  if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
728
0
    strbuf_addch(msgbuf, '\n');
729
0
    wt_status_append_cut_line(msgbuf);
730
0
    strbuf_addstr(msgbuf, comment_line_str);
731
0
  }
732
733
0
  strbuf_addch(msgbuf, '\n');
734
0
  strbuf_commented_addf(msgbuf, comment_line_str, "Conflicts:\n");
735
0
  for (i = 0; i < istate->cache_nr;) {
736
0
    const struct cache_entry *ce = istate->cache[i++];
737
0
    if (ce_stage(ce)) {
738
0
      strbuf_commented_addf(msgbuf, comment_line_str,
739
0
                "\t%s\n", ce->name);
740
0
      while (i < istate->cache_nr &&
741
0
             !strcmp(ce->name, istate->cache[i]->name))
742
0
        i++;
743
0
    }
744
0
  }
745
0
}
746
747
static int do_recursive_merge(struct repository *r,
748
            struct commit *base, struct commit *next,
749
            const char *base_label, const char *next_label,
750
            struct object_id *head, struct strbuf *msgbuf,
751
            struct replay_opts *opts)
752
0
{
753
0
  struct merge_options o;
754
0
  struct merge_result result;
755
0
  struct tree *next_tree, *base_tree, *head_tree;
756
0
  int clean, show_output;
757
0
  int i;
758
0
  struct lock_file index_lock = LOCK_INIT;
759
760
0
  if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
761
0
    return -1;
762
763
0
  repo_read_index(r);
764
765
0
  init_ui_merge_options(&o, r);
766
0
  o.ancestor = base ? base_label : "(empty tree)";
767
0
  o.branch1 = "HEAD";
768
0
  o.branch2 = next ? next_label : "(empty tree)";
769
0
  if (is_rebase_i(opts))
770
0
    o.buffer_output = 2;
771
0
  o.show_rename_progress = 1;
772
773
0
  head_tree = repo_parse_tree_indirect(the_repository, head);
774
0
  if (!head_tree)
775
0
    return error(_("unable to read tree (%s)"), oid_to_hex(head));
776
0
  next_tree = next ? repo_get_commit_tree(r, next) : empty_tree(r);
777
0
  base_tree = base ? repo_get_commit_tree(r, base) : empty_tree(r);
778
779
0
  for (i = 0; i < opts->xopts.nr; i++)
780
0
    parse_merge_opt(&o, opts->xopts.v[i]);
781
782
0
  memset(&result, 0, sizeof(result));
783
0
  merge_incore_nonrecursive(&o, base_tree, head_tree, next_tree, &result);
784
0
  show_output = !is_rebase_i(opts) || !result.clean;
785
  /*
786
   * TODO: merge_switch_to_result will update index/working tree;
787
   * we only really want to do that if !result.clean || this is
788
   * the final patch to be picked.  But determining this is the
789
   * final patch would take some work, and "head_tree" would need
790
   * to be replace with the tree the index matched before we
791
   * started doing any picks.
792
   */
793
0
  merge_switch_to_result(&o, head_tree, &result, 1, show_output);
794
0
  clean = result.clean;
795
0
  if (clean < 0) {
796
0
    rollback_lock_file(&index_lock);
797
0
    return clean;
798
0
  }
799
800
0
  if (write_locked_index(r->index, &index_lock,
801
0
             COMMIT_LOCK | SKIP_IF_UNCHANGED))
802
    /*
803
     * TRANSLATORS: %s will be "revert", "cherry-pick" or
804
     * "rebase".
805
     */
806
0
    return error(_("%s: Unable to write new index file"),
807
0
      _(action_name(opts)));
808
809
0
  if (!clean)
810
0
    append_conflicts_hint(r->index, msgbuf,
811
0
              opts->default_msg_cleanup);
812
813
0
  return !clean;
814
0
}
815
816
static struct object_id *get_cache_tree_oid(struct index_state *istate)
817
0
{
818
0
  if (!cache_tree_fully_valid(istate))
819
0
    if (cache_tree_update(istate, 0)) {
820
0
      error(_("unable to update cache tree"));
821
0
      return NULL;
822
0
    }
823
824
0
  return &istate->cache_tree->oid;
825
0
}
826
827
static int is_index_unchanged(struct repository *r)
828
0
{
829
0
  struct object_id head_oid, *cache_tree_oid;
830
0
  const struct object_id *head_tree_oid;
831
0
  struct commit *head_commit;
832
0
  struct index_state *istate = r->index;
833
0
  const char *head_name;
834
835
0
  if (!refs_resolve_ref_unsafe(get_main_ref_store(the_repository), "HEAD", RESOLVE_REF_READING, &head_oid, NULL)) {
836
    /* Check to see if this is an unborn branch */
837
0
    head_name = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
838
0
                "HEAD",
839
0
                RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
840
0
                &head_oid, NULL);
841
0
    if (!head_name ||
842
0
      !starts_with(head_name, "refs/heads/") ||
843
0
      !is_null_oid(&head_oid))
844
0
      return error(_("could not resolve HEAD commit"));
845
0
    head_tree_oid = the_hash_algo->empty_tree;
846
0
  } else {
847
0
    head_commit = lookup_commit(r, &head_oid);
848
849
    /*
850
     * If head_commit is NULL, check_commit, called from
851
     * lookup_commit, would have indicated that head_commit is not
852
     * a commit object already.  repo_parse_commit() will return failure
853
     * without further complaints in such a case.  Otherwise, if
854
     * the commit is invalid, repo_parse_commit() will complain.  So
855
     * there is nothing for us to say here.  Just return failure.
856
     */
857
0
    if (repo_parse_commit(r, head_commit))
858
0
      return -1;
859
860
0
    head_tree_oid = get_commit_tree_oid(head_commit);
861
0
  }
862
863
0
  if (!(cache_tree_oid = get_cache_tree_oid(istate)))
864
0
    return -1;
865
866
0
  return oideq(cache_tree_oid, head_tree_oid);
867
0
}
868
869
static int write_author_script(const char *message)
870
0
{
871
0
  struct strbuf buf = STRBUF_INIT;
872
0
  const char *eol;
873
0
  int res;
874
875
0
  for (;;)
876
0
    if (!*message || starts_with(message, "\n")) {
877
0
missing_author:
878
      /* Missing 'author' line? */
879
0
      unlink(rebase_path_author_script());
880
0
      return 0;
881
0
    } else if (skip_prefix(message, "author ", &message))
882
0
      break;
883
0
    else if ((eol = strchr(message, '\n')))
884
0
      message = eol + 1;
885
0
    else
886
0
      goto missing_author;
887
888
0
  strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
889
0
  while (*message && *message != '\n' && *message != '\r')
890
0
    if (skip_prefix(message, " <", &message))
891
0
      break;
892
0
    else if (*message != '\'')
893
0
      strbuf_addch(&buf, *(message++));
894
0
    else
895
0
      strbuf_addf(&buf, "'\\%c'", *(message++));
896
0
  strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
897
0
  while (*message && *message != '\n' && *message != '\r')
898
0
    if (skip_prefix(message, "> ", &message))
899
0
      break;
900
0
    else if (*message != '\'')
901
0
      strbuf_addch(&buf, *(message++));
902
0
    else
903
0
      strbuf_addf(&buf, "'\\%c'", *(message++));
904
0
  strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
905
0
  while (*message && *message != '\n' && *message != '\r')
906
0
    if (*message != '\'')
907
0
      strbuf_addch(&buf, *(message++));
908
0
    else
909
0
      strbuf_addf(&buf, "'\\%c'", *(message++));
910
0
  strbuf_addch(&buf, '\'');
911
0
  res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
912
0
  strbuf_release(&buf);
913
0
  return res;
914
0
}
915
916
/**
917
 * Take a series of KEY='VALUE' lines where VALUE part is
918
 * sq-quoted, and append <KEY, VALUE> at the end of the string list
919
 */
920
static int parse_key_value_squoted(char *buf, struct string_list *list)
921
0
{
922
0
  while (*buf) {
923
0
    struct string_list_item *item;
924
0
    char *np;
925
0
    char *cp = strchr(buf, '=');
926
0
    if (!cp) {
927
0
      np = strchrnul(buf, '\n');
928
0
      return error(_("no key present in '%.*s'"),
929
0
             (int) (np - buf), buf);
930
0
    }
931
0
    np = strchrnul(cp, '\n');
932
0
    *cp++ = '\0';
933
0
    item = string_list_append(list, buf);
934
935
0
    buf = np + (*np == '\n');
936
0
    *np = '\0';
937
0
    cp = sq_dequote(cp);
938
0
    if (!cp)
939
0
      return error(_("unable to dequote value of '%s'"),
940
0
             item->string);
941
0
    item->util = xstrdup(cp);
942
0
  }
943
0
  return 0;
944
0
}
945
946
/**
947
 * Reads and parses the state directory's "author-script" file, and sets name,
948
 * email and date accordingly.
949
 * Returns 0 on success, -1 if the file could not be parsed.
950
 *
951
 * The author script is of the format:
952
 *
953
 *  GIT_AUTHOR_NAME='$author_name'
954
 *  GIT_AUTHOR_EMAIL='$author_email'
955
 *  GIT_AUTHOR_DATE='$author_date'
956
 *
957
 * where $author_name, $author_email and $author_date are quoted. We are strict
958
 * with our parsing, as the file was meant to be eval'd in the now-removed
959
 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
960
 * from what this function expects, it is better to bail out than to do
961
 * something that the user does not expect.
962
 */
963
int read_author_script(const char *path, char **name, char **email, char **date,
964
           int allow_missing)
965
0
{
966
0
  struct strbuf buf = STRBUF_INIT;
967
0
  struct string_list kv = STRING_LIST_INIT_DUP;
968
0
  int retval = -1; /* assume failure */
969
0
  int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
970
971
0
  if (strbuf_read_file(&buf, path, 256) <= 0) {
972
0
    strbuf_release(&buf);
973
0
    if (errno == ENOENT && allow_missing)
974
0
      return 0;
975
0
    else
976
0
      return error_errno(_("could not open '%s' for reading"),
977
0
             path);
978
0
  }
979
980
0
  if (parse_key_value_squoted(buf.buf, &kv))
981
0
    goto finish;
982
983
0
  for (i = 0; i < kv.nr; i++) {
984
0
    if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
985
0
      if (name_i != -2)
986
0
        name_i = error(_("'GIT_AUTHOR_NAME' already given"));
987
0
      else
988
0
        name_i = i;
989
0
    } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
990
0
      if (email_i != -2)
991
0
        email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
992
0
      else
993
0
        email_i = i;
994
0
    } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
995
0
      if (date_i != -2)
996
0
        date_i = error(_("'GIT_AUTHOR_DATE' already given"));
997
0
      else
998
0
        date_i = i;
999
0
    } else {
1000
0
      err = error(_("unknown variable '%s'"),
1001
0
            kv.items[i].string);
1002
0
    }
1003
0
  }
1004
0
  if (name_i == -2)
1005
0
    error(_("missing 'GIT_AUTHOR_NAME'"));
1006
0
  if (email_i == -2)
1007
0
    error(_("missing 'GIT_AUTHOR_EMAIL'"));
1008
0
  if (date_i == -2)
1009
0
    error(_("missing 'GIT_AUTHOR_DATE'"));
1010
0
  if (name_i < 0 || email_i < 0 || date_i < 0 || err)
1011
0
    goto finish;
1012
0
  *name = kv.items[name_i].util;
1013
0
  *email = kv.items[email_i].util;
1014
0
  *date = kv.items[date_i].util;
1015
0
  retval = 0;
1016
0
finish:
1017
0
  string_list_clear(&kv, !!retval);
1018
0
  strbuf_release(&buf);
1019
0
  return retval;
1020
0
}
1021
1022
/*
1023
 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
1024
 * file with shell quoting into struct strvec. Returns -1 on
1025
 * error, 0 otherwise.
1026
 */
1027
static int read_env_script(struct strvec *env)
1028
0
{
1029
0
  char *name, *email, *date;
1030
1031
0
  if (read_author_script(rebase_path_author_script(),
1032
0
             &name, &email, &date, 0))
1033
0
    return -1;
1034
1035
0
  strvec_pushf(env, "GIT_AUTHOR_NAME=%s", name);
1036
0
  strvec_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
1037
0
  strvec_pushf(env, "GIT_AUTHOR_DATE=%s", date);
1038
0
  free(name);
1039
0
  free(email);
1040
0
  free(date);
1041
1042
0
  return 0;
1043
0
}
1044
1045
static char *get_author(const char *message)
1046
0
{
1047
0
  size_t len;
1048
0
  const char *a;
1049
1050
0
  a = find_commit_header(message, "author", &len);
1051
0
  if (a)
1052
0
    return xmemdupz(a, len);
1053
1054
0
  return NULL;
1055
0
}
1056
1057
static const char *author_date_from_env(const struct strvec *env)
1058
0
{
1059
0
  int i;
1060
0
  const char *date;
1061
1062
0
  for (i = 0; i < env->nr; i++)
1063
0
    if (skip_prefix(env->v[i],
1064
0
        "GIT_AUTHOR_DATE=", &date))
1065
0
      return date;
1066
  /*
1067
   * If GIT_AUTHOR_DATE is missing we should have already errored out when
1068
   * reading the script
1069
   */
1070
0
  BUG("GIT_AUTHOR_DATE missing from author script");
1071
0
}
1072
1073
static const char staged_changes_advice[] =
1074
N_("you have staged changes in your working tree\n"
1075
"If these changes are meant to be squashed into the previous commit, run:\n"
1076
"\n"
1077
"  git commit --amend %s\n"
1078
"\n"
1079
"If they are meant to go into a new commit, run:\n"
1080
"\n"
1081
"  git commit %s\n"
1082
"\n"
1083
"In both cases, once you're done, continue with:\n"
1084
"\n"
1085
"  git rebase --continue\n");
1086
1087
0
#define ALLOW_EMPTY (1<<0)
1088
0
#define EDIT_MSG    (1<<1)
1089
0
#define AMEND_MSG   (1<<2)
1090
0
#define CLEANUP_MSG (1<<3)
1091
0
#define VERIFY_MSG  (1<<4)
1092
0
#define CREATE_ROOT_COMMIT (1<<5)
1093
1094
static int run_command_silent_on_success(struct child_process *cmd)
1095
0
{
1096
0
  struct strbuf buf = STRBUF_INIT;
1097
0
  int rc;
1098
1099
0
  cmd->stdout_to_stderr = 1;
1100
0
  rc = pipe_command(cmd,
1101
0
        NULL, 0,
1102
0
        NULL, 0,
1103
0
        &buf, 0);
1104
1105
0
  if (rc)
1106
0
    fputs(buf.buf, stderr);
1107
0
  strbuf_release(&buf);
1108
0
  return rc;
1109
0
}
1110
1111
/*
1112
 * If we are cherry-pick, and if the merge did not result in
1113
 * hand-editing, we will hit this commit and inherit the original
1114
 * author date and name.
1115
 *
1116
 * If we are revert, or if our cherry-pick results in a hand merge,
1117
 * we had better say that the current user is responsible for that.
1118
 *
1119
 * An exception is when run_git_commit() is called during an
1120
 * interactive rebase: in that case, we will want to retain the
1121
 * author metadata.
1122
 */
1123
static int run_git_commit(const char *defmsg,
1124
        const char *reflog_action,
1125
        struct replay_opts *opts,
1126
        unsigned int flags)
1127
0
{
1128
0
  struct child_process cmd = CHILD_PROCESS_INIT;
1129
1130
0
  cmd.git_cmd = 1;
1131
0
  cmd.odb_to_close = the_repository->objects;
1132
1133
0
  if (is_rebase_i(opts) &&
1134
0
      ((opts->committer_date_is_author_date && !opts->ignore_date) ||
1135
0
       !(!defmsg && (flags & AMEND_MSG))) &&
1136
0
      read_env_script(&cmd.env)) {
1137
0
    const char *gpg_opt = gpg_sign_opt_quoted(opts);
1138
1139
0
    return error(_(staged_changes_advice),
1140
0
           gpg_opt, gpg_opt);
1141
0
  }
1142
1143
0
  strvec_pushf(&cmd.env, GIT_REFLOG_ACTION "=%s", reflog_action);
1144
1145
0
  if (opts->committer_date_is_author_date)
1146
0
    strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
1147
0
           opts->ignore_date ?
1148
0
           "" :
1149
0
           author_date_from_env(&cmd.env));
1150
0
  if (opts->ignore_date)
1151
0
    strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
1152
1153
0
  strvec_push(&cmd.args, "commit");
1154
1155
0
  if (!(flags & VERIFY_MSG))
1156
0
    strvec_push(&cmd.args, "-n");
1157
0
  if ((flags & AMEND_MSG))
1158
0
    strvec_push(&cmd.args, "--amend");
1159
0
  if (opts->gpg_sign)
1160
0
    strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
1161
0
  else
1162
0
    strvec_push(&cmd.args, "--no-gpg-sign");
1163
0
  if (defmsg)
1164
0
    strvec_pushl(&cmd.args, "-F", defmsg, NULL);
1165
0
  else if (!(flags & EDIT_MSG))
1166
0
    strvec_pushl(&cmd.args, "-C", "HEAD", NULL);
1167
0
  if ((flags & CLEANUP_MSG))
1168
0
    strvec_push(&cmd.args, "--cleanup=strip");
1169
0
  if ((flags & EDIT_MSG))
1170
0
    strvec_push(&cmd.args, "-e");
1171
0
  else if (!(flags & CLEANUP_MSG) &&
1172
0
     !opts->signoff && !opts->record_origin &&
1173
0
     !opts->explicit_cleanup)
1174
0
    strvec_push(&cmd.args, "--cleanup=verbatim");
1175
1176
0
  if ((flags & ALLOW_EMPTY))
1177
0
    strvec_push(&cmd.args, "--allow-empty");
1178
1179
0
  if (!(flags & EDIT_MSG))
1180
0
    strvec_push(&cmd.args, "--allow-empty-message");
1181
1182
0
  if (is_rebase_i(opts) && !(flags & EDIT_MSG))
1183
0
    return run_command_silent_on_success(&cmd);
1184
0
  else
1185
0
    return run_command(&cmd);
1186
0
}
1187
1188
static int rest_is_empty(const struct strbuf *sb, int start)
1189
0
{
1190
0
  int i, eol;
1191
0
  const char *nl;
1192
1193
  /* Check if the rest is just whitespace and Signed-off-by's. */
1194
0
  for (i = start; i < sb->len; i++) {
1195
0
    nl = memchr(sb->buf + i, '\n', sb->len - i);
1196
0
    if (nl)
1197
0
      eol = nl - sb->buf;
1198
0
    else
1199
0
      eol = sb->len;
1200
1201
0
    if (strlen(sign_off_header) <= eol - i &&
1202
0
        starts_with(sb->buf + i, sign_off_header)) {
1203
0
      i = eol;
1204
0
      continue;
1205
0
    }
1206
0
    while (i < eol)
1207
0
      if (!isspace(sb->buf[i++]))
1208
0
        return 0;
1209
0
  }
1210
1211
0
  return 1;
1212
0
}
1213
1214
void cleanup_message(struct strbuf *msgbuf,
1215
  enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1216
0
{
1217
0
  if (verbose || /* Truncate the message just before the diff, if any. */
1218
0
      cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1219
0
    strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1220
0
  if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1221
0
    strbuf_stripspace(msgbuf,
1222
0
      cleanup_mode == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1223
0
}
1224
1225
/*
1226
 * Find out if the message in the strbuf contains only whitespace and
1227
 * Signed-off-by lines.
1228
 */
1229
int message_is_empty(const struct strbuf *sb,
1230
         enum commit_msg_cleanup_mode cleanup_mode)
1231
0
{
1232
0
  if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1233
0
    return 0;
1234
0
  return rest_is_empty(sb, 0);
1235
0
}
1236
1237
/*
1238
 * See if the user edited the message in the editor or left what
1239
 * was in the template intact
1240
 */
1241
int template_untouched(const struct strbuf *sb, const char *template_file,
1242
           enum commit_msg_cleanup_mode cleanup_mode)
1243
0
{
1244
0
  struct strbuf tmpl = STRBUF_INIT;
1245
0
  const char *start;
1246
1247
0
  if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1248
0
    return 0;
1249
1250
0
  if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1251
0
    return 0;
1252
1253
0
  strbuf_stripspace(&tmpl,
1254
0
    cleanup_mode == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1255
0
  if (!skip_prefix(sb->buf, tmpl.buf, &start))
1256
0
    start = sb->buf;
1257
0
  strbuf_release(&tmpl);
1258
0
  return rest_is_empty(sb, start - sb->buf);
1259
0
}
1260
1261
int update_head_with_reflog(const struct commit *old_head,
1262
          const struct object_id *new_head,
1263
          const char *action, const struct strbuf *msg,
1264
          struct strbuf *err)
1265
0
{
1266
0
  struct ref_transaction *transaction;
1267
0
  struct strbuf sb = STRBUF_INIT;
1268
0
  const char *nl;
1269
0
  int ret = 0;
1270
1271
0
  if (action) {
1272
0
    strbuf_addstr(&sb, action);
1273
0
    strbuf_addstr(&sb, ": ");
1274
0
  }
1275
1276
0
  nl = strchr(msg->buf, '\n');
1277
0
  if (nl) {
1278
0
    strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1279
0
  } else {
1280
0
    strbuf_addbuf(&sb, msg);
1281
0
    strbuf_addch(&sb, '\n');
1282
0
  }
1283
1284
0
  transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
1285
0
              0, err);
1286
0
  if (!transaction ||
1287
0
      ref_transaction_update(transaction, "HEAD", new_head,
1288
0
           old_head ? &old_head->object.oid : null_oid(the_hash_algo),
1289
0
           NULL, NULL, 0, sb.buf, err) ||
1290
0
      ref_transaction_commit(transaction, err)) {
1291
0
    ret = -1;
1292
0
  }
1293
0
  ref_transaction_free(transaction);
1294
0
  strbuf_release(&sb);
1295
1296
0
  return ret;
1297
0
}
1298
1299
static int pipe_from_strbuf(int hook_stdin_fd, void *pp_cb, void *pp_task_cb UNUSED)
1300
0
{
1301
0
  struct hook_cb_data *hook_cb = pp_cb;
1302
0
  struct strbuf *to_pipe = hook_cb->options->feed_pipe_ctx;
1303
0
  int ret;
1304
1305
0
  if (!to_pipe)
1306
0
    BUG("pipe_from_strbuf called without feed_pipe_ctx");
1307
1308
0
  ret = write_in_full(hook_stdin_fd, to_pipe->buf, to_pipe->len);
1309
0
  if (ret < 0 && errno != EPIPE)
1310
0
    return ret;
1311
1312
0
  return 1; /* done writing */
1313
0
}
1314
1315
static int run_rewrite_hook(const struct object_id *oldoid,
1316
          const struct object_id *newoid)
1317
0
{
1318
0
  struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
1319
0
  int code;
1320
0
  struct strbuf sb = STRBUF_INIT;
1321
1322
0
  strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1323
1324
0
  opt.feed_pipe_ctx = &sb;
1325
0
  opt.feed_pipe = pipe_from_strbuf;
1326
1327
0
  strvec_push(&opt.args, "amend");
1328
1329
0
  code = run_hooks_opt(the_repository, "post-rewrite", &opt);
1330
1331
0
  strbuf_release(&sb);
1332
0
  return code;
1333
0
}
1334
1335
void commit_post_rewrite(struct repository *r,
1336
       const struct commit *old_head,
1337
       const struct object_id *new_head)
1338
0
{
1339
0
  struct notes_rewrite_cfg *cfg;
1340
1341
0
  cfg = init_copy_notes_for_rewrite("amend");
1342
0
  if (cfg) {
1343
    /* we are amending, so old_head is not NULL */
1344
0
    copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1345
0
    finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1346
0
  }
1347
0
  run_rewrite_hook(&old_head->object.oid, new_head);
1348
0
}
1349
1350
static int run_prepare_commit_msg_hook(struct repository *r,
1351
               struct strbuf *msg,
1352
               const char *commit)
1353
0
{
1354
0
  int ret = 0;
1355
0
  const char *name, *arg1 = NULL, *arg2 = NULL;
1356
1357
0
  name = git_path_commit_editmsg();
1358
0
  if (write_message(msg->buf, msg->len, name, 0))
1359
0
    return -1;
1360
1361
0
  if (commit) {
1362
0
    arg1 = "commit";
1363
0
    arg2 = commit;
1364
0
  } else {
1365
0
    arg1 = "message";
1366
0
  }
1367
0
  if (run_commit_hook(0, r->index_file, NULL, "prepare-commit-msg", name,
1368
0
          arg1, arg2, NULL))
1369
0
    ret = error(_("'prepare-commit-msg' hook failed"));
1370
1371
0
  return ret;
1372
0
}
1373
1374
static const char implicit_ident_advice_noconfig[] =
1375
N_("Your name and email address were configured automatically based\n"
1376
"on your username and hostname. Please check that they are accurate.\n"
1377
"You can suppress this message by setting them explicitly. Run the\n"
1378
"following command and follow the instructions in your editor to edit\n"
1379
"your configuration file:\n"
1380
"\n"
1381
"    git config --global --edit\n"
1382
"\n"
1383
"After doing this, you may fix the identity used for this commit with:\n"
1384
"\n"
1385
"    git commit --amend --reset-author\n");
1386
1387
static const char implicit_ident_advice_config[] =
1388
N_("Your name and email address were configured automatically based\n"
1389
"on your username and hostname. Please check that they are accurate.\n"
1390
"You can suppress this message by setting them explicitly:\n"
1391
"\n"
1392
"    git config --global user.name \"Your Name\"\n"
1393
"    git config --global user.email you@example.com\n"
1394
"\n"
1395
"After doing this, you may fix the identity used for this commit with:\n"
1396
"\n"
1397
"    git commit --amend --reset-author\n");
1398
1399
static const char *implicit_ident_advice(void)
1400
0
{
1401
0
  char *user_config = interpolate_path("~/.gitconfig", 0);
1402
0
  char *xdg_config = xdg_config_home("config");
1403
0
  int config_exists = file_exists(user_config) || file_exists(xdg_config);
1404
1405
0
  free(user_config);
1406
0
  free(xdg_config);
1407
1408
0
  if (config_exists)
1409
0
    return _(implicit_ident_advice_config);
1410
0
  else
1411
0
    return _(implicit_ident_advice_noconfig);
1412
1413
0
}
1414
1415
void print_commit_summary(struct repository *r,
1416
        const char *prefix,
1417
        const struct object_id *oid,
1418
        unsigned int flags)
1419
0
{
1420
0
  struct rev_info rev;
1421
0
  struct commit *commit;
1422
0
  struct strbuf format = STRBUF_INIT;
1423
0
  const char *head;
1424
0
  struct pretty_print_context pctx = {0};
1425
0
  struct strbuf author_ident = STRBUF_INIT;
1426
0
  struct strbuf committer_ident = STRBUF_INIT;
1427
0
  struct ref_store *refs;
1428
1429
0
  commit = lookup_commit(r, oid);
1430
0
  if (!commit)
1431
0
    die(_("couldn't look up newly created commit"));
1432
0
  if (repo_parse_commit(r, commit))
1433
0
    die(_("could not parse newly created commit"));
1434
1435
0
  strbuf_addstr(&format, "format:%h] %s");
1436
1437
0
  repo_format_commit_message(r, commit, "%an <%ae>", &author_ident,
1438
0
           &pctx);
1439
0
  repo_format_commit_message(r, commit, "%cn <%ce>", &committer_ident,
1440
0
           &pctx);
1441
0
  if (strbuf_cmp(&author_ident, &committer_ident)) {
1442
0
    strbuf_addstr(&format, "\n Author: ");
1443
0
    strbuf_addbuf_percentquote(&format, &author_ident);
1444
0
  }
1445
0
  if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1446
0
    struct strbuf date = STRBUF_INIT;
1447
1448
0
    repo_format_commit_message(r, commit, "%ad", &date, &pctx);
1449
0
    strbuf_addstr(&format, "\n Date: ");
1450
0
    strbuf_addbuf_percentquote(&format, &date);
1451
0
    strbuf_release(&date);
1452
0
  }
1453
0
  if (!committer_ident_sufficiently_given()) {
1454
0
    strbuf_addstr(&format, "\n Committer: ");
1455
0
    strbuf_addbuf_percentquote(&format, &committer_ident);
1456
0
    if (advice_enabled(ADVICE_IMPLICIT_IDENTITY)) {
1457
0
      strbuf_addch(&format, '\n');
1458
0
      strbuf_addstr(&format, implicit_ident_advice());
1459
0
    }
1460
0
  }
1461
0
  strbuf_release(&author_ident);
1462
0
  strbuf_release(&committer_ident);
1463
1464
0
  repo_init_revisions(r, &rev, prefix);
1465
0
  setup_revisions(0, NULL, &rev, NULL);
1466
1467
0
  rev.diff = 1;
1468
0
  rev.diffopt.output_format =
1469
0
    DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1470
1471
0
  rev.verbose_header = 1;
1472
0
  rev.show_root_diff = 1;
1473
0
  get_commit_format(format.buf, &rev);
1474
0
  rev.always_show_header = 0;
1475
0
  rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1476
0
  diff_setup_done(&rev.diffopt);
1477
1478
0
  refs = get_main_ref_store(r);
1479
0
  head = refs_resolve_ref_unsafe(refs, "HEAD", 0, NULL, NULL);
1480
0
  if (!head)
1481
0
    die(_("unable to resolve HEAD after creating commit"));
1482
0
  if (!strcmp(head, "HEAD"))
1483
0
    head = _("detached HEAD");
1484
0
  else
1485
0
    skip_prefix(head, "refs/heads/", &head);
1486
0
  printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1487
0
            _(" (root-commit)") : "");
1488
1489
0
  if (!log_tree_commit(&rev, commit)) {
1490
0
    rev.always_show_header = 1;
1491
0
    rev.use_terminator = 1;
1492
0
    log_tree_commit(&rev, commit);
1493
0
  }
1494
1495
0
  release_revisions(&rev);
1496
0
  strbuf_release(&format);
1497
0
}
1498
1499
static int parse_head(struct repository *r, struct commit **head)
1500
0
{
1501
0
  struct commit *current_head;
1502
0
  struct object_id oid;
1503
1504
0
  if (repo_get_oid(r, "HEAD", &oid)) {
1505
0
    current_head = NULL;
1506
0
  } else {
1507
0
    current_head = lookup_commit_reference(r, &oid);
1508
0
    if (!current_head)
1509
0
      return error(_("could not parse HEAD"));
1510
0
    if (!oideq(&oid, &current_head->object.oid)) {
1511
0
      warning(_("HEAD %s is not a commit!"),
1512
0
        oid_to_hex(&oid));
1513
0
    }
1514
0
    if (repo_parse_commit(r, current_head))
1515
0
      return error(_("could not parse HEAD commit"));
1516
0
  }
1517
0
  *head = current_head;
1518
1519
0
  return 0;
1520
0
}
1521
1522
/*
1523
 * Try to commit without forking 'git commit'. In some cases we need
1524
 * to run 'git commit' to display an error message
1525
 *
1526
 * Returns:
1527
 *  -1 - error unable to commit
1528
 *   0 - success
1529
 *   1 - run 'git commit'
1530
 */
1531
static int try_to_commit(struct repository *r,
1532
       struct strbuf *msg, const char *author,
1533
       const char *reflog_action,
1534
       struct replay_opts *opts, unsigned int flags,
1535
       struct object_id *oid)
1536
0
{
1537
0
  struct object_id tree;
1538
0
  struct commit *current_head = NULL;
1539
0
  struct commit_list *parents = NULL;
1540
0
  struct commit_extra_header *extra = NULL;
1541
0
  struct strbuf err = STRBUF_INIT;
1542
0
  struct strbuf commit_msg = STRBUF_INIT;
1543
0
  char *amend_author = NULL;
1544
0
  const char *committer = NULL;
1545
0
  const char *hook_commit = NULL;
1546
0
  enum commit_msg_cleanup_mode cleanup;
1547
0
  int res = 0;
1548
1549
0
  if (parse_head(r, &current_head))
1550
0
    return -1;
1551
1552
0
  if (flags & AMEND_MSG) {
1553
0
    const char *exclude_gpgsig[] = { "gpgsig", "gpgsig-sha256", NULL };
1554
0
    const char *out_enc = get_commit_output_encoding();
1555
0
    const char *message = repo_logmsg_reencode(r, current_head,
1556
0
                 NULL, out_enc);
1557
1558
0
    if (!msg) {
1559
0
      const char *orig_message = NULL;
1560
1561
0
      find_commit_subject(message, &orig_message);
1562
0
      msg = &commit_msg;
1563
0
      strbuf_addstr(msg, orig_message);
1564
0
      hook_commit = "HEAD";
1565
0
    }
1566
0
    author = amend_author = get_author(message);
1567
0
    repo_unuse_commit_buffer(r, current_head,
1568
0
           message);
1569
0
    if (!author) {
1570
0
      res = error(_("unable to parse commit author"));
1571
0
      goto out;
1572
0
    }
1573
0
    parents = commit_list_copy(current_head->parents);
1574
0
    extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1575
0
  } else if (current_head &&
1576
0
       (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1577
0
    commit_list_insert(current_head, &parents);
1578
0
  }
1579
1580
0
  if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1581
0
    res = error(_("git write-tree failed to write a tree"));
1582
0
    goto out;
1583
0
  }
1584
1585
0
  if (!(flags & ALLOW_EMPTY)) {
1586
0
    struct commit *first_parent = current_head;
1587
1588
0
    if (flags & AMEND_MSG) {
1589
0
      if (current_head->parents) {
1590
0
        first_parent = current_head->parents->item;
1591
0
        if (repo_parse_commit(r, first_parent)) {
1592
0
          res = error(_("could not parse HEAD commit"));
1593
0
          goto out;
1594
0
        }
1595
0
      } else {
1596
0
        first_parent = NULL;
1597
0
      }
1598
0
    }
1599
0
    if (oideq(first_parent
1600
0
        ? get_commit_tree_oid(first_parent)
1601
0
        : the_hash_algo->empty_tree,
1602
0
        &tree)) {
1603
0
      res = 1; /* run 'git commit' to display error message */
1604
0
      goto out;
1605
0
    }
1606
0
  }
1607
1608
0
  if (hook_exists(r, "prepare-commit-msg")) {
1609
0
    res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1610
0
    if (res)
1611
0
      goto out;
1612
0
    if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1613
0
             2048) < 0) {
1614
0
      res = error_errno(_("unable to read commit message "
1615
0
                "from '%s'"),
1616
0
              git_path_commit_editmsg());
1617
0
      goto out;
1618
0
    }
1619
0
    msg = &commit_msg;
1620
0
  }
1621
1622
0
  if (flags & CLEANUP_MSG)
1623
0
    cleanup = COMMIT_MSG_CLEANUP_ALL;
1624
0
  else if ((opts->signoff || opts->record_origin) &&
1625
0
     !opts->explicit_cleanup)
1626
0
    cleanup = COMMIT_MSG_CLEANUP_SPACE;
1627
0
  else
1628
0
    cleanup = opts->default_msg_cleanup;
1629
1630
0
  if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1631
0
    strbuf_stripspace(msg,
1632
0
      cleanup == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1633
0
  if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1634
0
    res = 1; /* run 'git commit' to display error message */
1635
0
    goto out;
1636
0
  }
1637
1638
0
  if (opts->committer_date_is_author_date) {
1639
0
    struct ident_split id;
1640
0
    struct strbuf date = STRBUF_INIT;
1641
1642
0
    if (!opts->ignore_date) {
1643
0
      if (split_ident_line(&id, author, (int)strlen(author)) < 0) {
1644
0
        res = error(_("invalid author identity '%s'"),
1645
0
              author);
1646
0
        goto out;
1647
0
      }
1648
0
      if (!id.date_begin) {
1649
0
        res = error(_(
1650
0
          "corrupt author: missing date information"));
1651
0
        goto out;
1652
0
      }
1653
0
      strbuf_addf(&date, "@%.*s %.*s",
1654
0
            (int)(id.date_end - id.date_begin),
1655
0
            id.date_begin,
1656
0
            (int)(id.tz_end - id.tz_begin),
1657
0
            id.tz_begin);
1658
0
    } else {
1659
0
      reset_ident_date();
1660
0
    }
1661
0
    committer = fmt_ident(getenv("GIT_COMMITTER_NAME"),
1662
0
              getenv("GIT_COMMITTER_EMAIL"),
1663
0
              WANT_COMMITTER_IDENT,
1664
0
              opts->ignore_date ? NULL : date.buf,
1665
0
              IDENT_STRICT);
1666
0
    strbuf_release(&date);
1667
0
  } else {
1668
0
    reset_ident_date();
1669
0
  }
1670
1671
0
  if (opts->ignore_date) {
1672
0
    struct ident_split id;
1673
0
    char *name, *email;
1674
1675
0
    if (split_ident_line(&id, author, strlen(author)) < 0) {
1676
0
      error(_("invalid author identity '%s'"), author);
1677
0
      goto out;
1678
0
    }
1679
0
    name = xmemdupz(id.name_begin, id.name_end - id.name_begin);
1680
0
    email = xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
1681
0
    author = fmt_ident(name, email, WANT_AUTHOR_IDENT, NULL,
1682
0
           IDENT_STRICT);
1683
0
    free(name);
1684
0
    free(email);
1685
0
  }
1686
1687
0
  if (commit_tree_extended(msg->buf, msg->len, &tree, parents, oid,
1688
0
         author, committer, opts->gpg_sign, extra)) {
1689
0
    res = error(_("failed to write commit object"));
1690
0
    goto out;
1691
0
  }
1692
1693
0
  if (update_head_with_reflog(current_head, oid, reflog_action,
1694
0
            msg, &err)) {
1695
0
    res = error("%s", err.buf);
1696
0
    goto out;
1697
0
  }
1698
1699
0
  run_commit_hook(0, r->index_file, NULL, "post-commit", NULL);
1700
0
  if (flags & AMEND_MSG)
1701
0
    commit_post_rewrite(r, current_head, oid);
1702
1703
0
out:
1704
0
  free_commit_extra_headers(extra);
1705
0
  commit_list_free(parents);
1706
0
  strbuf_release(&err);
1707
0
  strbuf_release(&commit_msg);
1708
0
  free(amend_author);
1709
1710
0
  return res;
1711
0
}
1712
1713
static int write_rebase_head(struct object_id *oid)
1714
0
{
1715
0
  if (refs_update_ref(get_main_ref_store(the_repository), "rebase", "REBASE_HEAD", oid,
1716
0
          NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1717
0
    return error(_("could not update %s"), "REBASE_HEAD");
1718
1719
0
  return 0;
1720
0
}
1721
1722
static int do_commit(struct repository *r,
1723
         const char *msg_file, const char *author,
1724
         const char *reflog_action,
1725
         struct replay_opts *opts, unsigned int flags,
1726
         struct object_id *oid)
1727
0
{
1728
0
  int res = 1;
1729
1730
0
  if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1731
0
    struct object_id oid;
1732
0
    struct strbuf sb = STRBUF_INIT;
1733
1734
0
    if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1735
0
      return error_errno(_("unable to read commit message "
1736
0
               "from '%s'"),
1737
0
             msg_file);
1738
1739
0
    res = try_to_commit(r, msg_file ? &sb : NULL,
1740
0
            author, reflog_action, opts, flags, &oid);
1741
0
    strbuf_release(&sb);
1742
0
    if (!res) {
1743
0
      refs_delete_ref(get_main_ref_store(r), "",
1744
0
          "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF);
1745
0
      unlink(git_path_merge_msg(r));
1746
0
      if (!is_rebase_i(opts))
1747
0
        print_commit_summary(r, NULL, &oid,
1748
0
            SUMMARY_SHOW_AUTHOR_DATE);
1749
0
      return res;
1750
0
    }
1751
0
  }
1752
0
  if (res == 1) {
1753
0
    if (is_rebase_i(opts) && oid)
1754
0
      if (write_rebase_head(oid))
1755
0
          return -1;
1756
0
    return run_git_commit(msg_file, reflog_action, opts, flags);
1757
0
  }
1758
1759
0
  return res;
1760
0
}
1761
1762
static int is_original_commit_empty(struct commit *commit)
1763
0
{
1764
0
  const struct object_id *ptree_oid;
1765
1766
0
  if (repo_parse_commit(the_repository, commit))
1767
0
    return error(_("could not parse commit %s"),
1768
0
           oid_to_hex(&commit->object.oid));
1769
0
  if (commit->parents) {
1770
0
    struct commit *parent = commit->parents->item;
1771
0
    if (repo_parse_commit(the_repository, parent))
1772
0
      return error(_("could not parse parent commit %s"),
1773
0
        oid_to_hex(&parent->object.oid));
1774
0
    ptree_oid = get_commit_tree_oid(parent);
1775
0
  } else {
1776
0
    ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1777
0
  }
1778
1779
0
  return oideq(ptree_oid, get_commit_tree_oid(commit));
1780
0
}
1781
1782
/*
1783
 * Should empty commits be allowed?  Return status:
1784
 *    <0: Error in is_index_unchanged(r) or is_original_commit_empty(commit)
1785
 *     0: Halt on empty commit
1786
 *     1: Allow empty commit
1787
 *     2: Drop empty commit
1788
 */
1789
static int allow_empty(struct repository *r,
1790
           struct replay_opts *opts,
1791
           struct commit *commit)
1792
0
{
1793
0
  int index_unchanged, originally_empty;
1794
1795
  /*
1796
   * For a commit that is initially empty, allow_empty determines if it
1797
   * should be kept or not
1798
   *
1799
   * For a commit that becomes empty, keep_redundant_commits and
1800
   * drop_redundant_commits determine whether the commit should be kept or
1801
   * dropped. If neither is specified, halt.
1802
   */
1803
0
  index_unchanged = is_index_unchanged(r);
1804
0
  if (index_unchanged < 0)
1805
0
    return index_unchanged;
1806
0
  if (!index_unchanged)
1807
0
    return 0; /* we do not have to say --allow-empty */
1808
1809
0
  originally_empty = is_original_commit_empty(commit);
1810
0
  if (originally_empty < 0)
1811
0
    return originally_empty;
1812
0
  if (originally_empty)
1813
0
    return opts->allow_empty;
1814
0
  else if (opts->keep_redundant_commits)
1815
0
    return 1;
1816
0
  else if (opts->drop_redundant_commits)
1817
0
    return 2;
1818
0
  else
1819
0
    return 0;
1820
0
}
1821
1822
static struct {
1823
  char c;
1824
  const char *str;
1825
} todo_command_info[] = {
1826
  [TODO_PICK] = { 'p', "pick" },
1827
  [TODO_REVERT] = { 0,   "revert" },
1828
  [TODO_EDIT] = { 'e', "edit" },
1829
  [TODO_REWORD] = { 'r', "reword" },
1830
  [TODO_FIXUP] = { 'f', "fixup" },
1831
  [TODO_SQUASH] = { 's', "squash" },
1832
  [TODO_EXEC] = { 'x', "exec" },
1833
  [TODO_BREAK] = { 'b', "break" },
1834
  [TODO_LABEL] = { 'l', "label" },
1835
  [TODO_RESET] = { 't', "reset" },
1836
  [TODO_MERGE] = { 'm', "merge" },
1837
  [TODO_UPDATE_REF] = { 'u', "update-ref" },
1838
  [TODO_NOOP] = { 0,   "noop" },
1839
  [TODO_DROP] = { 'd', "drop" },
1840
  [TODO_COMMENT] = { 0,   NULL },
1841
};
1842
1843
static const char *command_to_string(const enum todo_command command)
1844
0
{
1845
0
  if (command < TODO_COMMENT)
1846
0
    return todo_command_info[command].str;
1847
0
  if (command == TODO_COMMENT)
1848
0
    return comment_line_str;
1849
0
  die(_("unknown command: %d"), command);
1850
0
}
1851
1852
static char command_to_char(const enum todo_command command)
1853
0
{
1854
0
  if (command < TODO_COMMENT)
1855
0
    return todo_command_info[command].c;
1856
0
  return 0;
1857
0
}
1858
1859
static int is_noop(const enum todo_command command)
1860
0
{
1861
0
  return TODO_NOOP <= command;
1862
0
}
1863
1864
static int is_fixup(enum todo_command command)
1865
0
{
1866
0
  return command == TODO_FIXUP || command == TODO_SQUASH;
1867
0
}
1868
1869
/* Does this command create a (non-merge) commit? */
1870
static int is_pick_or_similar(enum todo_command command)
1871
0
{
1872
0
  switch (command) {
1873
0
  case TODO_PICK:
1874
0
  case TODO_REVERT:
1875
0
  case TODO_EDIT:
1876
0
  case TODO_REWORD:
1877
0
  case TODO_FIXUP:
1878
0
  case TODO_SQUASH:
1879
0
    return 1;
1880
0
  default:
1881
0
    return 0;
1882
0
  }
1883
0
}
1884
1885
enum todo_item_flags {
1886
  TODO_EDIT_MERGE_MSG    = (1 << 0),
1887
  TODO_REPLACE_FIXUP_MSG = (1 << 1),
1888
  TODO_EDIT_FIXUP_MSG    = (1 << 2),
1889
};
1890
1891
static const char first_commit_msg_str[] = N_("This is the 1st commit message:");
1892
static const char nth_commit_msg_fmt[] = N_("This is the commit message #%d:");
1893
static const char skip_first_commit_msg_str[] = N_("The 1st commit message will be skipped:");
1894
static const char skip_nth_commit_msg_fmt[] = N_("The commit message #%d will be skipped:");
1895
static const char combined_commit_msg_fmt[] = N_("This is a combination of %d commits.");
1896
1897
static int is_fixup_flag(enum todo_command command, unsigned flag)
1898
0
{
1899
0
  return command == TODO_FIXUP && ((flag & TODO_REPLACE_FIXUP_MSG) ||
1900
0
           (flag & TODO_EDIT_FIXUP_MSG));
1901
0
}
1902
1903
/*
1904
 * Wrapper around strbuf_add_commented_lines() which avoids double
1905
 * commenting commit subjects.
1906
 */
1907
static void add_commented_lines(struct strbuf *buf, const void *str, size_t len)
1908
0
{
1909
0
  const char *s = str;
1910
0
  while (starts_with_mem(s, len, comment_line_str)) {
1911
0
    size_t count;
1912
0
    const char *n = memchr(s, '\n', len);
1913
0
    if (!n)
1914
0
      count = len;
1915
0
    else
1916
0
      count = n - s + 1;
1917
0
    strbuf_add(buf, s, count);
1918
0
    s += count;
1919
0
    len -= count;
1920
0
  }
1921
0
  strbuf_add_commented_lines(buf, s, len, comment_line_str);
1922
0
}
1923
1924
/* Does the current fixup chain contain a squash command? */
1925
static int seen_squash(struct replay_ctx *ctx)
1926
0
{
1927
0
  return starts_with(ctx->current_fixups.buf, "squash") ||
1928
0
    strstr(ctx->current_fixups.buf, "\nsquash");
1929
0
}
1930
1931
/* Does the current fixup chain contain a "fixup -c" command? */
1932
static int seen_fixup_edit_msg(struct replay_ctx *ctx)
1933
0
{
1934
0
  return starts_with(ctx->current_fixups.buf, "fixup -c") ||
1935
0
    strstr(ctx->current_fixups.buf, "\nfixup -c");
1936
0
}
1937
1938
static void update_comment_bufs(struct strbuf *buf1, struct strbuf *buf2, int n)
1939
0
{
1940
0
  strbuf_setlen(buf1, strlen(comment_line_str) + 1);
1941
0
  strbuf_addf(buf1, _(nth_commit_msg_fmt), n);
1942
0
  strbuf_addch(buf1, '\n');
1943
0
  strbuf_setlen(buf2, strlen(comment_line_str) + 1);
1944
0
  strbuf_addf(buf2, _(skip_nth_commit_msg_fmt), n);
1945
0
  strbuf_addch(buf2, '\n');
1946
0
}
1947
1948
/*
1949
 * Comment out any un-commented commit messages, updating the message comments
1950
 * to say they will be skipped but do not comment out the empty lines that
1951
 * surround commit messages and their comments.
1952
 */
1953
static void update_squash_message_for_fixup(struct strbuf *msg)
1954
0
{
1955
0
  void (*copy_lines)(struct strbuf *, const void *, size_t) = strbuf_add;
1956
0
  struct strbuf buf1 = STRBUF_INIT, buf2 = STRBUF_INIT;
1957
0
  const char *s, *start;
1958
0
  char *orig_msg;
1959
0
  size_t orig_msg_len;
1960
0
  int i = 1;
1961
1962
0
  strbuf_add_commented_lines(&buf1, _(first_commit_msg_str),
1963
0
           strlen(_(first_commit_msg_str)),
1964
0
           comment_line_str);
1965
0
  strbuf_add_commented_lines(&buf2, _(skip_first_commit_msg_str),
1966
0
           strlen(_(skip_first_commit_msg_str)),
1967
0
           comment_line_str);
1968
0
  s = start = orig_msg = strbuf_detach(msg, &orig_msg_len);
1969
0
  while (s) {
1970
0
    const char *next;
1971
0
    size_t off;
1972
0
    if (skip_prefix(s, buf1.buf, &next)) {
1973
      /*
1974
       * Copy the last message, preserving the blank line
1975
       * preceding the current line
1976
       */
1977
0
      off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1978
0
      copy_lines(msg, start, s - start - off);
1979
0
      if (off)
1980
0
        strbuf_addch(msg, '\n');
1981
      /*
1982
       * The next message needs to be commented out but the
1983
       * message header is already commented out so just copy
1984
       * it and the blank line that follows it.
1985
       */
1986
0
      strbuf_addbuf(msg, &buf2);
1987
0
      if (*next == '\n')
1988
0
        strbuf_addch(msg, *next++);
1989
0
      start = s = next;
1990
0
      copy_lines = add_commented_lines;
1991
0
      update_comment_bufs(&buf1, &buf2, ++i);
1992
0
    } else if (skip_prefix(s, buf2.buf, &next)) {
1993
0
      off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1994
0
      copy_lines(msg, start, s - start - off);
1995
0
      start = s - off;
1996
0
      s = next;
1997
0
      copy_lines = strbuf_add;
1998
0
      update_comment_bufs(&buf1, &buf2, ++i);
1999
0
    } else {
2000
0
      s = strchr(s, '\n');
2001
0
      if (s)
2002
0
        s++;
2003
0
    }
2004
0
  }
2005
0
  copy_lines(msg, start, orig_msg_len - (start - orig_msg));
2006
0
  free(orig_msg);
2007
0
  strbuf_release(&buf1);
2008
0
  strbuf_release(&buf2);
2009
0
}
2010
2011
static int append_squash_message(struct strbuf *buf, const char *body,
2012
       enum todo_command command, struct replay_opts *opts,
2013
       unsigned flag)
2014
0
{
2015
0
  struct replay_ctx *ctx = opts->ctx;
2016
0
  const char *fixup_msg;
2017
0
  size_t commented_len = 0, fixup_off;
2018
  /*
2019
   * amend is non-interactive and not normally used with fixup!
2020
   * or squash! commits, so only comment out those subjects when
2021
   * squashing commit messages.
2022
   */
2023
0
  if (starts_with(body, "amend!") ||
2024
0
      ((command == TODO_SQUASH || seen_squash(ctx)) &&
2025
0
       (starts_with(body, "squash!") || starts_with(body, "fixup!"))))
2026
0
    commented_len = commit_subject_length(body);
2027
2028
0
  strbuf_addf(buf, "\n%s ", comment_line_str);
2029
0
  strbuf_addf(buf, _(nth_commit_msg_fmt),
2030
0
        ++ctx->current_fixup_count + 1);
2031
0
  strbuf_addstr(buf, "\n\n");
2032
0
  strbuf_add_commented_lines(buf, body, commented_len, comment_line_str);
2033
  /* buf->buf may be reallocated so store an offset into the buffer */
2034
0
  fixup_off = buf->len;
2035
0
  strbuf_addstr(buf, body + commented_len);
2036
2037
  /* fixup -C after squash behaves like squash */
2038
0
  if (is_fixup_flag(command, flag) && !seen_squash(ctx)) {
2039
    /*
2040
     * We're replacing the commit message so we need to
2041
     * append any trailers if the user requested
2042
     * '--signoff' or '--trailer'.
2043
     */
2044
0
    if (opts->signoff)
2045
0
      append_signoff(buf, 0, 0);
2046
2047
0
    if (opts->trailer_args.nr)
2048
0
      amend_strbuf_with_trailers(buf, &opts->trailer_args);
2049
2050
0
    if ((command == TODO_FIXUP) &&
2051
0
        (flag & TODO_REPLACE_FIXUP_MSG) &&
2052
0
        (file_exists(rebase_path_fixup_msg()) ||
2053
0
         !file_exists(rebase_path_squash_msg()))) {
2054
0
      fixup_msg = skip_blank_lines(buf->buf + fixup_off);
2055
0
      if (write_message(fixup_msg, strlen(fixup_msg),
2056
0
          rebase_path_fixup_msg(), 0) < 0)
2057
0
        return error(_("cannot write '%s'"),
2058
0
          rebase_path_fixup_msg());
2059
0
    } else {
2060
0
      unlink(rebase_path_fixup_msg());
2061
0
    }
2062
0
  } else  {
2063
0
    unlink(rebase_path_fixup_msg());
2064
0
  }
2065
2066
0
  return 0;
2067
0
}
2068
2069
static int update_squash_messages(struct repository *r,
2070
          enum todo_command command,
2071
          struct commit *commit,
2072
          struct replay_opts *opts,
2073
          unsigned flag)
2074
0
{
2075
0
  struct replay_ctx *ctx = opts->ctx;
2076
0
  struct strbuf buf = STRBUF_INIT;
2077
0
  int res = 0;
2078
0
  const char *message, *body;
2079
0
  const char *encoding = get_commit_output_encoding();
2080
2081
0
  if (!is_fixup(command))
2082
0
    BUG("not a FIXUP or SQUASH %d", command);
2083
2084
0
  if (ctx->current_fixup_count > 0) {
2085
0
    struct strbuf header = STRBUF_INIT;
2086
0
    char *eol;
2087
2088
0
    if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
2089
0
      return error(_("could not read '%s'"),
2090
0
        rebase_path_squash_msg());
2091
2092
0
    eol = !starts_with(buf.buf, comment_line_str) ?
2093
0
      buf.buf : strchrnul(buf.buf, '\n');
2094
2095
0
    strbuf_addf(&header, "%s ", comment_line_str);
2096
0
    strbuf_addf(&header, _(combined_commit_msg_fmt),
2097
0
          ctx->current_fixup_count + 2);
2098
0
    strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
2099
0
    strbuf_release(&header);
2100
0
    if (is_fixup_flag(command, flag) && !seen_squash(ctx))
2101
0
      update_squash_message_for_fixup(&buf);
2102
0
  } else {
2103
0
    struct object_id head;
2104
0
    struct commit *head_commit;
2105
0
    const char *head_message, *body;
2106
2107
0
    if (repo_get_oid(r, "HEAD", &head))
2108
0
      return error(_("need a HEAD to fixup"));
2109
0
    if (!(head_commit = lookup_commit_reference(r, &head)))
2110
0
      return error(_("could not read HEAD"));
2111
0
    if (!(head_message = repo_logmsg_reencode(r, head_commit, NULL,
2112
0
                encoding)))
2113
0
      return error(_("could not read HEAD's commit message"));
2114
2115
0
    find_commit_subject(head_message, &body);
2116
0
    if (command == TODO_FIXUP && !flag && write_message(body, strlen(body),
2117
0
              rebase_path_fixup_msg(), 0) < 0) {
2118
0
      repo_unuse_commit_buffer(r, head_commit, head_message);
2119
0
      return error(_("cannot write '%s'"), rebase_path_fixup_msg());
2120
0
    }
2121
0
    strbuf_addf(&buf, "%s ", comment_line_str);
2122
0
    strbuf_addf(&buf, _(combined_commit_msg_fmt), 2);
2123
0
    strbuf_addf(&buf, "\n%s ", comment_line_str);
2124
0
    strbuf_addstr(&buf, is_fixup_flag(command, flag) ?
2125
0
            _(skip_first_commit_msg_str) :
2126
0
            _(first_commit_msg_str));
2127
0
    strbuf_addstr(&buf, "\n\n");
2128
0
    if (is_fixup_flag(command, flag))
2129
0
      strbuf_add_commented_lines(&buf, body, strlen(body),
2130
0
               comment_line_str);
2131
0
    else
2132
0
      strbuf_addstr(&buf, body);
2133
2134
0
    repo_unuse_commit_buffer(r, head_commit, head_message);
2135
0
  }
2136
2137
0
  if (!(message = repo_logmsg_reencode(r, commit, NULL, encoding)))
2138
0
    return error(_("could not read commit message of %s"),
2139
0
           oid_to_hex(&commit->object.oid));
2140
0
  find_commit_subject(message, &body);
2141
2142
0
  if (command == TODO_SQUASH || is_fixup_flag(command, flag)) {
2143
0
    res = append_squash_message(&buf, body, command, opts, flag);
2144
0
  } else if (command == TODO_FIXUP) {
2145
0
    strbuf_addf(&buf, "\n%s ", comment_line_str);
2146
0
    strbuf_addf(&buf, _(skip_nth_commit_msg_fmt),
2147
0
          ++ctx->current_fixup_count + 1);
2148
0
    strbuf_addstr(&buf, "\n\n");
2149
0
    strbuf_add_commented_lines(&buf, body, strlen(body),
2150
0
             comment_line_str);
2151
0
  }
2152
0
  repo_unuse_commit_buffer(r, commit, message);
2153
2154
0
  if (!res)
2155
0
    res = write_message(buf.buf, buf.len, rebase_path_squash_msg(),
2156
0
            0);
2157
0
  strbuf_release(&buf);
2158
2159
0
  if (!res) {
2160
0
    const char *fixup_flag = "";
2161
2162
0
    if (is_fixup_flag(command, flag) && (flag & TODO_EDIT_FIXUP_MSG))
2163
0
      fixup_flag = " -c";
2164
2165
0
    strbuf_addf(&ctx->current_fixups, "%s%s%s %s",
2166
0
          ctx->current_fixups.len ? "\n" : "",
2167
0
          command_to_string(command), fixup_flag,
2168
0
          oid_to_hex(&commit->object.oid));
2169
0
    res = write_message(ctx->current_fixups.buf,
2170
0
            ctx->current_fixups.len,
2171
0
            rebase_path_current_fixups(), 0);
2172
0
  }
2173
2174
0
  return res;
2175
0
}
2176
2177
static void flush_rewritten_pending(void)
2178
0
{
2179
0
  struct strbuf buf = STRBUF_INIT;
2180
0
  struct object_id newoid;
2181
0
  FILE *out;
2182
2183
0
  if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
2184
0
      !repo_get_oid(the_repository, "HEAD", &newoid) &&
2185
0
      (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
2186
0
    char *bol = buf.buf, *eol;
2187
2188
0
    while (*bol) {
2189
0
      eol = strchrnul(bol, '\n');
2190
0
      fprintf(out, "%.*s %s\n", (int)(eol - bol),
2191
0
          bol, oid_to_hex(&newoid));
2192
0
      if (!*eol)
2193
0
        break;
2194
0
      bol = eol + 1;
2195
0
    }
2196
0
    fclose(out);
2197
0
    unlink(rebase_path_rewritten_pending());
2198
0
  }
2199
0
  strbuf_release(&buf);
2200
0
}
2201
2202
static void record_in_rewritten(struct object_id *oid,
2203
    enum todo_command next_command)
2204
0
{
2205
0
  FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
2206
2207
0
  if (!out)
2208
0
    return;
2209
2210
0
  fprintf(out, "%s\n", oid_to_hex(oid));
2211
0
  fclose(out);
2212
2213
0
  if (!is_fixup(next_command))
2214
0
    flush_rewritten_pending();
2215
0
}
2216
2217
0
static int should_edit(struct replay_opts *opts) {
2218
0
  if (opts->edit < 0)
2219
    /*
2220
     * Note that we only handle the case of non-conflicted
2221
     * commits; continue_single_pick() handles the conflicted
2222
     * commits itself instead of calling this function.
2223
     */
2224
0
    return (opts->action == REPLAY_REVERT && isatty(0)) ? 1 : 0;
2225
0
  return opts->edit;
2226
0
}
2227
2228
static void refer_to_commit(struct repository *r, struct strbuf *msgbuf,
2229
          const struct commit *commit,
2230
          bool use_commit_reference)
2231
0
{
2232
0
  if (use_commit_reference) {
2233
0
    struct pretty_print_context ctx = {
2234
0
      .abbrev = DEFAULT_ABBREV,
2235
0
      .date_mode.type = DATE_SHORT,
2236
0
    };
2237
0
    repo_format_commit_message(r, commit,
2238
0
             "%h (%s, %ad)", msgbuf, &ctx);
2239
0
  } else {
2240
0
    strbuf_add_oid_hex(msgbuf, &commit->object.oid);
2241
0
  }
2242
0
}
2243
2244
static const char *sequencer_reflog_action(struct replay_opts *opts)
2245
0
{
2246
0
  if (!opts->reflog_action) {
2247
0
    opts->reflog_action = getenv(GIT_REFLOG_ACTION);
2248
0
    opts->reflog_action =
2249
0
      xstrdup(opts->reflog_action ? opts->reflog_action
2250
0
                : action_name(opts));
2251
0
  }
2252
2253
0
  return opts->reflog_action;
2254
0
}
2255
2256
__attribute__((format (printf, 3, 4)))
2257
static const char *reflog_message(struct replay_opts *opts,
2258
  const char *sub_action, const char *fmt, ...)
2259
0
{
2260
0
  va_list ap;
2261
0
  static struct strbuf buf = STRBUF_INIT;
2262
2263
0
  va_start(ap, fmt);
2264
0
  strbuf_reset(&buf);
2265
0
  strbuf_addstr(&buf, sequencer_reflog_action(opts));
2266
0
  if (sub_action)
2267
0
    strbuf_addf(&buf, " (%s)", sub_action);
2268
0
  if (fmt) {
2269
0
    strbuf_addstr(&buf, ": ");
2270
0
    strbuf_vaddf(&buf, fmt, ap);
2271
0
  }
2272
0
  va_end(ap);
2273
2274
0
  return buf.buf;
2275
0
}
2276
2277
enum pick_result {
2278
  PICK_RESULT_ERROR = -1,
2279
  PICK_RESULT_OK,
2280
  PICK_RESULT_CONFLICTS,
2281
  PICK_RESULT_DROPPED,
2282
};
2283
2284
static enum pick_result do_pick_commit(struct repository *r,
2285
               struct todo_item *item,
2286
               struct replay_opts *opts,
2287
               int final_fixup, int *check_todo)
2288
0
{
2289
0
  struct replay_ctx *ctx = opts->ctx;
2290
0
  unsigned int flags = should_edit(opts) ? EDIT_MSG : 0;
2291
0
  const char *msg_file = should_edit(opts) ? NULL : git_path_merge_msg(r);
2292
0
  struct object_id head;
2293
0
  struct commit *base, *next, *parent;
2294
0
  const char *base_label, *next_label, *reflog_action;
2295
0
  char *author = NULL;
2296
0
  struct commit_message msg = { NULL, NULL, NULL, NULL };
2297
0
  int res, unborn = 0, reword = 0, allow, drop_commit = 0;
2298
0
  enum todo_command command = item->command;
2299
0
  struct commit *commit = item->commit;
2300
2301
0
  if (is_rebase_i(opts))
2302
0
    reflog_action = reflog_message(
2303
0
      opts, command_to_string(item->command), NULL);
2304
0
  else
2305
0
    reflog_action = sequencer_reflog_action(opts);
2306
2307
0
  if (opts->no_commit) {
2308
    /*
2309
     * We do not intend to commit immediately.  We just want to
2310
     * merge the differences in, so let's compute the tree
2311
     * that represents the "current" state for the merge machinery
2312
     * to work on.
2313
     */
2314
0
    if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
2315
0
      return error(_("your index file is unmerged."));
2316
0
  } else {
2317
0
    unborn = repo_get_oid(r, "HEAD", &head);
2318
    /* Do we want to generate a root commit? */
2319
0
    if (is_pick_or_similar(command) && opts->have_squash_onto &&
2320
0
        oideq(&head, &opts->squash_onto)) {
2321
0
      if (is_fixup(command))
2322
0
        return error(_("cannot fixup root commit"));
2323
0
      flags |= CREATE_ROOT_COMMIT;
2324
0
      unborn = 1;
2325
0
    } else if (unborn)
2326
0
      oidcpy(&head, the_hash_algo->empty_tree);
2327
0
    if (index_differs_from(r, unborn ? empty_tree_oid_hex(the_repository->hash_algo) : "HEAD",
2328
0
               NULL, 0))
2329
0
      return error_dirty_index(r, opts);
2330
0
  }
2331
0
  discard_index(r->index);
2332
2333
0
  if (!commit->parents)
2334
0
    parent = NULL;
2335
0
  else if (commit->parents->next) {
2336
    /* Reverting or cherry-picking a merge commit */
2337
0
    int cnt;
2338
0
    struct commit_list *p;
2339
2340
0
    if (!opts->mainline)
2341
0
      return error(_("commit %s is a merge but no -m option was given."),
2342
0
        oid_to_hex(&commit->object.oid));
2343
2344
0
    for (cnt = 1, p = commit->parents;
2345
0
         cnt != opts->mainline && p;
2346
0
         cnt++)
2347
0
      p = p->next;
2348
0
    if (cnt != opts->mainline || !p)
2349
0
      return error(_("commit %s does not have parent %d"),
2350
0
        oid_to_hex(&commit->object.oid), opts->mainline);
2351
0
    parent = p->item;
2352
0
  } else if (1 < opts->mainline)
2353
    /*
2354
     *  Non-first parent explicitly specified as mainline for
2355
     *  non-merge commit
2356
     */
2357
0
    return error(_("commit %s does not have parent %d"),
2358
0
           oid_to_hex(&commit->object.oid), opts->mainline);
2359
0
  else
2360
0
    parent = commit->parents->item;
2361
2362
0
  if (get_message(commit, &msg) != 0)
2363
0
    return error(_("cannot get commit message for %s"),
2364
0
      oid_to_hex(&commit->object.oid));
2365
2366
0
  if (opts->allow_ff && !is_fixup(command) &&
2367
0
      ((parent && oideq(&parent->object.oid, &head)) ||
2368
0
       (!parent && unborn))) {
2369
0
    if (is_rebase_i(opts))
2370
0
      write_author_script(msg.message);
2371
0
    res = fast_forward_to(r, &commit->object.oid, &head, unborn,
2372
0
      opts);
2373
0
    if (res || command != TODO_REWORD)
2374
0
      goto leave;
2375
0
    reword = 1;
2376
0
    msg_file = NULL;
2377
0
    goto fast_forward_edit;
2378
0
  }
2379
0
  if (parent && repo_parse_commit(r, parent) < 0)
2380
    /* TRANSLATORS: The first %s will be a "todo" command like
2381
       "revert" or "pick", the second %s a SHA1. */
2382
0
    return error(_("%s: cannot parse parent commit %s"),
2383
0
      command_to_string(command),
2384
0
      oid_to_hex(&parent->object.oid));
2385
2386
  /*
2387
   * "commit" is an existing commit.  We would want to apply
2388
   * the difference it introduces since its first parent "prev"
2389
   * on top of the current HEAD if we are cherry-pick.  Or the
2390
   * reverse of it if we are revert.
2391
   */
2392
2393
0
  if (command == TODO_REVERT) {
2394
0
    base = commit;
2395
0
    base_label = msg.label;
2396
0
    next = parent;
2397
0
    next_label = msg.parent_label;
2398
0
    sequencer_format_revert_message(r, msg.subject, commit,
2399
0
            parent,
2400
0
            opts->commit_use_reference,
2401
0
            &ctx->message);
2402
0
  } else {
2403
0
    const char *p;
2404
2405
0
    base = parent;
2406
0
    base_label = msg.parent_label;
2407
0
    next = commit;
2408
0
    next_label = msg.label;
2409
2410
    /* Append the commit log message to ctx->message. */
2411
0
    if (find_commit_subject(msg.message, &p))
2412
0
      strbuf_addstr(&ctx->message, p);
2413
2414
0
    if (opts->record_origin) {
2415
0
      strbuf_complete_line(&ctx->message);
2416
0
      if (!has_conforming_footer(&ctx->message, NULL, 0))
2417
0
        strbuf_addch(&ctx->message, '\n');
2418
0
      strbuf_addstr(&ctx->message, cherry_picked_prefix);
2419
0
      strbuf_add_oid_hex(&ctx->message, &commit->object.oid);
2420
0
      strbuf_addstr(&ctx->message, ")\n");
2421
0
    }
2422
0
    if (!is_fixup(command))
2423
0
      author = get_author(msg.message);
2424
0
  }
2425
0
  ctx->have_message = 1;
2426
2427
0
  if (command == TODO_REWORD)
2428
0
    reword = 1;
2429
0
  else if (is_fixup(command)) {
2430
0
    if (update_squash_messages(r, command, commit,
2431
0
             opts, item->flags)) {
2432
0
      res = -1;
2433
0
      goto leave;
2434
0
    }
2435
0
    flags |= AMEND_MSG;
2436
0
    if (!final_fixup)
2437
0
      msg_file = rebase_path_squash_msg();
2438
0
    else if (file_exists(rebase_path_fixup_msg())) {
2439
0
      msg_file = rebase_path_fixup_msg();
2440
0
    } else {
2441
0
      const char *dest = git_path_squash_msg(r);
2442
0
      unlink(dest);
2443
0
      if (copy_file(r, dest, rebase_path_squash_msg(), 0666)) {
2444
0
        res = error(_("could not copy '%s' to '%s'"),
2445
0
              rebase_path_squash_msg(), dest);
2446
0
        goto leave;
2447
0
      }
2448
0
      unlink(git_path_merge_msg(r));
2449
0
      msg_file = dest;
2450
0
      flags |= EDIT_MSG;
2451
0
    }
2452
0
  }
2453
2454
0
  if (opts->signoff && !is_fixup(command))
2455
0
    append_signoff(&ctx->message, 0, 0);
2456
2457
0
  if (opts->trailer_args.nr && !is_fixup(command))
2458
0
    amend_strbuf_with_trailers(&ctx->message, &opts->trailer_args);
2459
2460
0
  if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
2461
0
    res = -1;
2462
0
  else if (!opts->strategy ||
2463
0
     !strcmp(opts->strategy, "recursive") ||
2464
0
     !strcmp(opts->strategy, "ort") ||
2465
0
     command == TODO_REVERT) {
2466
0
    res = do_recursive_merge(r, base, next, base_label, next_label,
2467
0
           &head, &ctx->message, opts);
2468
0
    if (res < 0)
2469
0
      goto leave;
2470
2471
0
    res |= write_message(ctx->message.buf, ctx->message.len,
2472
0
             git_path_merge_msg(r), 0);
2473
0
  } else {
2474
0
    struct commit_list *common = NULL;
2475
0
    struct commit_list *remotes = NULL;
2476
2477
0
    if (write_message(ctx->message.buf, ctx->message.len,
2478
0
          git_path_merge_msg(r), 0)) {
2479
0
      res = -1;
2480
0
      goto leave;
2481
0
    }
2482
2483
0
    commit_list_insert(base, &common);
2484
0
    commit_list_insert(next, &remotes);
2485
0
    res = try_merge_command(r, opts->strategy,
2486
0
          opts->xopts.nr, opts->xopts.v,
2487
0
          common, oid_to_hex(&head), remotes);
2488
    /*
2489
     * If there were conflicts, try_merge_command() returns 1,
2490
     * any other no-zero return code means that either the merge
2491
     * command could not be run, or it failed to merge.
2492
     */
2493
0
    if (res && res != 1)
2494
0
      res = -1;
2495
2496
0
    commit_list_free(common);
2497
0
    commit_list_free(remotes);
2498
0
  }
2499
2500
  /*
2501
   * If the merge was clean or if it failed due to conflict, we write
2502
   * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2503
   * However, if the merge did not even start, then we don't want to
2504
   * write it at all.
2505
   */
2506
0
  if ((command == TODO_PICK || command == TODO_REWORD ||
2507
0
       command == TODO_EDIT) && !opts->no_commit &&
2508
0
      (res == 0 || res == 1) &&
2509
0
      refs_update_ref(get_main_ref_store(the_repository), NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
2510
0
          REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2511
0
    res = -1;
2512
0
  if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
2513
0
      refs_update_ref(get_main_ref_store(the_repository), NULL, "REVERT_HEAD", &commit->object.oid, NULL,
2514
0
          REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2515
0
    res = -1;
2516
2517
0
  if (res) {
2518
0
    error(command == TODO_REVERT
2519
0
          ? _("could not revert %s... %s")
2520
0
          : _("could not apply %s... %s"),
2521
0
          short_commit_name(r, commit), msg.subject);
2522
0
    print_advice(r, res == 1, opts);
2523
0
    repo_rerere(r, opts->allow_rerere_auto);
2524
0
    goto leave;
2525
0
  }
2526
2527
0
  allow = allow_empty(r, opts, commit);
2528
0
  if (allow < 0) {
2529
0
    res = allow;
2530
0
    goto leave;
2531
0
  } else if (allow == 1) {
2532
0
    flags |= ALLOW_EMPTY;
2533
0
  } else if (allow == 2) {
2534
0
    drop_commit = 1;
2535
0
    refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
2536
0
        NULL, REF_NO_DEREF);
2537
0
    unlink(git_path_merge_msg(r));
2538
0
    refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
2539
0
        NULL, REF_NO_DEREF);
2540
0
    fprintf(stderr,
2541
0
      _("dropping %s %s -- patch contents already upstream\n"),
2542
0
      oid_to_hex(&commit->object.oid), msg.subject);
2543
0
  } /* else allow == 0 and there's nothing special to do */
2544
0
  if (!opts->no_commit && !drop_commit) {
2545
0
    if (author || command == TODO_REVERT || (flags & AMEND_MSG))
2546
0
      res = do_commit(r, msg_file, author, reflog_action,
2547
0
          opts, flags,
2548
0
          commit? &commit->object.oid : NULL);
2549
0
    else
2550
0
      res = error(_("unable to parse commit author"));
2551
0
    *check_todo = !!(flags & EDIT_MSG);
2552
0
    if (!res && reword) {
2553
0
fast_forward_edit:
2554
      /*
2555
       * To reword we amend the commit we just
2556
       * picked or fast-forwarded. As the commit has
2557
       * already been picked we want to use the same
2558
       * set of commit flags regardless of how we
2559
       * got here.
2560
       */
2561
0
      flags = EDIT_MSG | VERIFY_MSG | AMEND_MSG | ALLOW_EMPTY;
2562
0
      res = run_git_commit(NULL, reflog_action, opts, flags);
2563
0
      *check_todo = 1;
2564
0
    }
2565
    /*
2566
     * If "git commit" failed to run then res == -1, but we don't
2567
     * want reschedule the last command because the picking the
2568
     * commit was successful.
2569
     */
2570
0
    res = !!res;
2571
0
  }
2572
2573
2574
0
  if (!res && final_fixup) {
2575
0
    unlink(rebase_path_fixup_msg());
2576
0
    unlink(rebase_path_squash_msg());
2577
0
    unlink(rebase_path_current_fixups());
2578
0
    strbuf_reset(&ctx->current_fixups);
2579
0
    ctx->current_fixup_count = 0;
2580
0
  }
2581
2582
0
leave:
2583
0
  free_message(commit, &msg);
2584
0
  free(author);
2585
0
  update_abort_safety_file();
2586
2587
0
  if (res < 0)
2588
0
    return PICK_RESULT_ERROR;
2589
0
  else if (res > 0)
2590
0
    return PICK_RESULT_CONFLICTS;
2591
0
  else if (drop_commit)
2592
0
    return PICK_RESULT_DROPPED;
2593
0
  else
2594
0
    return PICK_RESULT_OK;
2595
0
}
2596
2597
static int prepare_revs(struct replay_opts *opts)
2598
0
{
2599
  /*
2600
   * picking (but not reverting) ranges (but not individual revisions)
2601
   * should be done in reverse
2602
   */
2603
0
  if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
2604
0
    opts->revs->reverse ^= 1;
2605
2606
0
  if (prepare_revision_walk(opts->revs))
2607
0
    return error(_("revision walk setup failed"));
2608
2609
0
  return 0;
2610
0
}
2611
2612
static int read_and_refresh_cache(struct repository *r,
2613
          struct replay_opts *opts)
2614
0
{
2615
0
  struct lock_file index_lock = LOCK_INIT;
2616
0
  int index_fd = repo_hold_locked_index(r, &index_lock, 0);
2617
0
  if (repo_read_index(r) < 0) {
2618
0
    rollback_lock_file(&index_lock);
2619
0
    return error(_("git %s: failed to read the index"),
2620
0
      action_name(opts));
2621
0
  }
2622
0
  refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
2623
2624
0
  if (index_fd >= 0) {
2625
0
    if (write_locked_index(r->index, &index_lock,
2626
0
               COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
2627
0
      return error(_("git %s: failed to refresh the index"),
2628
0
        action_name(opts));
2629
0
    }
2630
0
  }
2631
2632
  /*
2633
   * If we are resolving merges in any way other than "ort", then
2634
   * expand the sparse index.
2635
   */
2636
0
  if (opts->strategy && strcmp(opts->strategy, "ort"))
2637
0
    ensure_full_index(r->index);
2638
0
  return 0;
2639
0
}
2640
2641
void todo_list_release(struct todo_list *todo_list)
2642
0
{
2643
0
  strbuf_release(&todo_list->buf);
2644
0
  FREE_AND_NULL(todo_list->items);
2645
0
  todo_list->nr = todo_list->alloc = 0;
2646
0
}
2647
2648
static struct todo_item *append_new_todo(struct todo_list *todo_list)
2649
0
{
2650
0
  ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2651
0
  return todo_list->items + todo_list->nr++;
2652
0
}
2653
2654
const char *todo_item_get_arg(struct todo_list *todo_list,
2655
            struct todo_item *item)
2656
0
{
2657
0
  return todo_list->buf.buf + item->arg_offset;
2658
0
}
2659
2660
static int is_command(enum todo_command command, const char **bol)
2661
0
{
2662
0
  const char *str = todo_command_info[command].str;
2663
0
  const char nick = todo_command_info[command].c;
2664
0
  const char *p = *bol;
2665
2666
0
  if ((skip_prefix(p, str, &p) || (nick && *p++ == nick)) &&
2667
0
      (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || !*p)) {
2668
0
    *bol = p;
2669
0
    return 1;
2670
0
  }
2671
0
  return 0;
2672
0
}
2673
2674
bool sequencer_parse_todo_command(const char **p, enum todo_command *cmd)
2675
0
{
2676
0
  const char *s = *p;
2677
2678
0
  for (int i = 0; i < TODO_COMMENT; i++)
2679
0
    if (is_command(i, p)) {
2680
0
      *cmd = i;
2681
0
      return true;
2682
0
    }
2683
2684
0
  if (starts_with(s, comment_line_str)) {
2685
0
    *cmd = TODO_COMMENT;
2686
0
    return true;
2687
0
  } else if (s[0] == '\n' || (s[0] == '\r' && s[1] == '\n') || !s[0]) {
2688
0
    *cmd = TODO_COMMENT;
2689
0
    return true;
2690
0
  }
2691
2692
0
  return false;
2693
0
}
2694
2695
static int check_label_or_ref_arg(enum todo_command command, const char *arg)
2696
0
{
2697
0
  switch (command) {
2698
0
  case TODO_LABEL:
2699
    /*
2700
     * '#' is not a valid label as the merge command uses it to
2701
     * separate merge parents from the commit subject.
2702
     */
2703
0
    if (!strcmp(arg, "#") ||
2704
0
        check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2705
0
      return error(_("'%s' is not a valid label"), arg);
2706
0
    break;
2707
2708
0
  case TODO_UPDATE_REF:
2709
0
    if (check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2710
0
      return error(_("'%s' is not a valid refname"), arg);
2711
0
    if (check_refname_format(arg, 0))
2712
0
      return error(_("update-ref requires a fully qualified "
2713
0
               "refname e.g. refs/heads/%s"), arg);
2714
0
    break;
2715
2716
0
  default:
2717
0
    BUG("unexpected todo_command");
2718
0
  }
2719
2720
0
  return 0;
2721
0
}
2722
2723
static int check_merge_commit_insn(enum todo_command command)
2724
0
{
2725
0
  switch(command) {
2726
0
  case TODO_PICK:
2727
0
    error(_("'%s' does not accept merge commits"),
2728
0
          todo_command_info[command].str);
2729
0
    advise_if_enabled(ADVICE_REBASE_TODO_ERROR, _(
2730
      /*
2731
       * TRANSLATORS: 'pick' and 'merge -C' should not be
2732
       * translated.
2733
       */
2734
0
      "'pick' does not take a merge commit. If you wanted to\n"
2735
0
      "replay the merge, use 'merge -C' on the commit."));
2736
0
    return -1;
2737
2738
0
  case TODO_REWORD:
2739
0
    error(_("'%s' does not accept merge commits"),
2740
0
          todo_command_info[command].str);
2741
0
    advise_if_enabled(ADVICE_REBASE_TODO_ERROR, _(
2742
      /*
2743
       * TRANSLATORS: 'reword' and 'merge -c' should not be
2744
       * translated.
2745
       */
2746
0
      "'reword' does not take a merge commit. If you wanted to\n"
2747
0
      "replay the merge and reword the commit message, use\n"
2748
0
      "'merge -c' on the commit"));
2749
0
    return -1;
2750
2751
0
  case TODO_EDIT:
2752
0
    error(_("'%s' does not accept merge commits"),
2753
0
          todo_command_info[command].str);
2754
0
    advise_if_enabled(ADVICE_REBASE_TODO_ERROR, _(
2755
      /*
2756
       * TRANSLATORS: 'edit', 'merge -C' and 'break' should
2757
       * not be translated.
2758
       */
2759
0
      "'edit' does not take a merge commit. If you wanted to\n"
2760
0
      "replay the merge, use 'merge -C' on the commit, and then\n"
2761
0
      "'break' to give the control back to you so that you can\n"
2762
0
      "do 'git commit --amend && git rebase --continue'."));
2763
0
    return -1;
2764
2765
0
  case TODO_FIXUP:
2766
0
  case TODO_SQUASH:
2767
0
    return error(_("cannot squash merge commit into another commit"));
2768
2769
0
  case TODO_MERGE:
2770
0
  case TODO_DROP:
2771
0
    return 0;
2772
2773
0
  default:
2774
0
    BUG("unexpected todo_command");
2775
0
  }
2776
0
}
2777
2778
static int parse_insn_line(struct repository *r, struct replay_opts *opts,
2779
         struct todo_item *item, const char *buf,
2780
         const char *bol, char *eol)
2781
0
{
2782
0
  struct object_id commit_oid;
2783
0
  char *end_of_object_name;
2784
0
  int saved, status, padding;
2785
2786
0
  item->flags = 0;
2787
2788
  /* left-trim */
2789
0
  bol += strspn(bol, " \t");
2790
2791
0
  if (!sequencer_parse_todo_command(&bol, &item->command))
2792
0
    return error(_("invalid command '%.*s'"),
2793
0
           (int)strcspn(bol, " \t\r\n"), bol);
2794
2795
0
  if (item->command == TODO_COMMENT) {
2796
0
    item->commit = NULL;
2797
0
    item->arg_offset = bol - buf;
2798
0
    item->arg_len = eol - bol;
2799
0
    return 0;
2800
0
  }
2801
2802
  /* Eat up extra spaces/ tabs before object name */
2803
0
  padding = strspn(bol, " \t");
2804
0
  bol += padding;
2805
2806
0
  if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2807
0
    if (bol != eol)
2808
0
      return error(_("%s does not accept arguments: '%s'"),
2809
0
             command_to_string(item->command), bol);
2810
0
    item->commit = NULL;
2811
0
    item->arg_offset = bol - buf;
2812
0
    item->arg_len = eol - bol;
2813
0
    return 0;
2814
0
  }
2815
2816
0
  if (!padding)
2817
0
    return error(_("missing arguments for %s"),
2818
0
           command_to_string(item->command));
2819
2820
0
  if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2821
0
      item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
2822
0
    int ret = 0;
2823
2824
0
    item->commit = NULL;
2825
0
    item->arg_offset = bol - buf;
2826
0
    item->arg_len = (int)(eol - bol);
2827
0
    if (item->command == TODO_LABEL ||
2828
0
        item->command == TODO_UPDATE_REF) {
2829
0
      saved = *eol;
2830
0
      *eol = '\0';
2831
0
      ret = check_label_or_ref_arg(item->command, bol);
2832
0
      *eol = saved;
2833
0
    }
2834
0
    return ret;
2835
0
  }
2836
2837
0
  if (item->command == TODO_FIXUP) {
2838
0
    if (skip_prefix(bol, "-C", &bol)) {
2839
0
      bol += strspn(bol, " \t");
2840
0
      item->flags |= TODO_REPLACE_FIXUP_MSG;
2841
0
    } else if (skip_prefix(bol, "-c", &bol)) {
2842
0
      bol += strspn(bol, " \t");
2843
0
      item->flags |= TODO_EDIT_FIXUP_MSG;
2844
0
    }
2845
0
  }
2846
2847
0
  if (item->command == TODO_MERGE) {
2848
0
    if (skip_prefix(bol, "-C", &bol))
2849
0
      bol += strspn(bol, " \t");
2850
0
    else if (skip_prefix(bol, "-c", &bol)) {
2851
0
      bol += strspn(bol, " \t");
2852
0
      item->flags |= TODO_EDIT_MERGE_MSG;
2853
0
    } else {
2854
0
      item->flags |= TODO_EDIT_MERGE_MSG;
2855
0
      item->commit = NULL;
2856
0
      item->arg_offset = bol - buf;
2857
0
      item->arg_len = (int)(eol - bol);
2858
0
      return 0;
2859
0
    }
2860
0
  }
2861
2862
0
  end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2863
0
  saved = *end_of_object_name;
2864
0
  *end_of_object_name = '\0';
2865
0
  status = repo_get_oid(r, bol, &commit_oid);
2866
0
  if (status < 0)
2867
0
    error(_("could not parse '%s'"), bol); /* return later */
2868
0
  *end_of_object_name = saved;
2869
2870
0
  bol = end_of_object_name + strspn(end_of_object_name, " \t");
2871
0
  item->arg_offset = bol - buf;
2872
0
  item->arg_len = (int)(eol - bol);
2873
2874
0
  if (status < 0)
2875
0
    return status;
2876
2877
0
  item->commit = lookup_commit_reference(r, &commit_oid);
2878
0
  if (!item->commit)
2879
0
    return -1;
2880
0
  if (is_rebase_i(opts) &&
2881
0
      item->commit->parents && item->commit->parents->next)
2882
0
    return check_merge_commit_insn(item->command);
2883
0
  return 0;
2884
0
}
2885
2886
int sequencer_get_last_command(struct repository *r UNUSED, enum replay_action *action)
2887
0
{
2888
0
  const char *todo_file, *bol;
2889
0
  struct strbuf buf = STRBUF_INIT;
2890
0
  int ret = 0;
2891
2892
0
  todo_file = git_path_todo_file();
2893
0
  if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2894
0
    if (errno == ENOENT || errno == ENOTDIR)
2895
0
      return -1;
2896
0
    else
2897
0
      return error_errno("unable to open '%s'", todo_file);
2898
0
  }
2899
0
  bol = buf.buf + strspn(buf.buf, " \t\r\n");
2900
0
  if (is_command(TODO_PICK, &bol) && (*bol == ' ' || *bol == '\t'))
2901
0
    *action = REPLAY_PICK;
2902
0
  else if (is_command(TODO_REVERT, &bol) &&
2903
0
     (*bol == ' ' || *bol == '\t'))
2904
0
    *action = REPLAY_REVERT;
2905
0
  else
2906
0
    ret = -1;
2907
2908
0
  strbuf_release(&buf);
2909
2910
0
  return ret;
2911
0
}
2912
2913
int todo_list_parse_insn_buffer(struct repository *r, struct replay_opts *opts,
2914
        char *buf, struct todo_list *todo_list)
2915
0
{
2916
0
  struct todo_item *item;
2917
0
  char *p = buf, *next_p;
2918
0
  int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2919
2920
0
  todo_list->current = todo_list->nr = todo_list->total_nr = 0;
2921
2922
0
  for (i = 1; *p; i++, p = next_p) {
2923
0
    char *eol = strchrnul(p, '\n');
2924
2925
0
    next_p = *eol ? eol + 1 /* skip LF */ : eol;
2926
2927
0
    if (p != eol && eol[-1] == '\r')
2928
0
      eol--; /* strip Carriage Return */
2929
2930
0
    item = append_new_todo(todo_list);
2931
0
    item->offset_in_buf = p - todo_list->buf.buf;
2932
0
    if (parse_insn_line(r, opts, item, buf, p, eol)) {
2933
0
      res = error(_("invalid line %d: %.*s"),
2934
0
        i, (int)(eol - p), p);
2935
0
      item->command = TODO_COMMENT + 1;
2936
0
      item->arg_offset = p - buf;
2937
0
      item->arg_len = (int)(eol - p);
2938
0
      item->commit = NULL;
2939
0
    }
2940
2941
0
    if (item->command != TODO_COMMENT)
2942
0
      todo_list->total_nr++;
2943
2944
0
    if (fixup_okay)
2945
0
      ; /* do nothing */
2946
0
    else if (is_fixup(item->command))
2947
0
      res = error(_("cannot '%s' without a previous commit"),
2948
0
        command_to_string(item->command));
2949
0
    else if (!is_noop(item->command))
2950
0
      fixup_okay = 1;
2951
0
  }
2952
2953
0
  return res;
2954
0
}
2955
2956
static int count_commands(struct todo_list *todo_list)
2957
0
{
2958
0
  int count = 0, i;
2959
2960
0
  for (i = 0; i < todo_list->nr; i++)
2961
0
    if (todo_list->items[i].command != TODO_COMMENT)
2962
0
      count++;
2963
2964
0
  return count;
2965
0
}
2966
2967
static int get_item_line_offset(struct todo_list *todo_list, int index)
2968
0
{
2969
0
  return index < todo_list->nr ?
2970
0
    todo_list->items[index].offset_in_buf : todo_list->buf.len;
2971
0
}
2972
2973
static const char *get_item_line(struct todo_list *todo_list, int index)
2974
0
{
2975
0
  return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2976
0
}
2977
2978
static int get_item_line_length(struct todo_list *todo_list, int index)
2979
0
{
2980
0
  return get_item_line_offset(todo_list, index + 1)
2981
0
    -  get_item_line_offset(todo_list, index);
2982
0
}
2983
2984
static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2985
0
{
2986
0
  int fd;
2987
0
  ssize_t len;
2988
2989
0
  fd = open(path, O_RDONLY);
2990
0
  if (fd < 0)
2991
0
    return error_errno(_("could not open '%s'"), path);
2992
0
  len = strbuf_read(sb, fd, 0);
2993
0
  close(fd);
2994
0
  if (len < 0)
2995
0
    return error(_("could not read '%s'."), path);
2996
0
  return len;
2997
0
}
2998
2999
static int have_finished_the_last_pick(void)
3000
0
{
3001
0
  struct strbuf buf = STRBUF_INIT;
3002
0
  const char *eol;
3003
0
  const char *todo_path = git_path_todo_file();
3004
0
  int ret = 0;
3005
3006
0
  if (strbuf_read_file(&buf, todo_path, 0) < 0) {
3007
0
    if (errno == ENOENT) {
3008
0
      return 0;
3009
0
    } else {
3010
0
      error_errno("unable to open '%s'", todo_path);
3011
0
      return 0;
3012
0
    }
3013
0
  }
3014
  /* If there is only one line then we are done */
3015
0
  eol = strchr(buf.buf, '\n');
3016
0
  if (!eol || !eol[1])
3017
0
    ret = 1;
3018
3019
0
  strbuf_release(&buf);
3020
3021
0
  return ret;
3022
0
}
3023
3024
void sequencer_post_commit_cleanup(struct repository *r, int verbose)
3025
0
{
3026
0
  struct replay_opts opts = REPLAY_OPTS_INIT;
3027
0
  int need_cleanup = 0;
3028
3029
0
  if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
3030
0
    if (!refs_delete_ref(get_main_ref_store(r), "",
3031
0
             "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF) &&
3032
0
        verbose)
3033
0
      warning(_("cancelling a cherry picking in progress"));
3034
0
    opts.action = REPLAY_PICK;
3035
0
    need_cleanup = 1;
3036
0
  }
3037
3038
0
  if (refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
3039
0
    if (!refs_delete_ref(get_main_ref_store(r), "", "REVERT_HEAD",
3040
0
             NULL, REF_NO_DEREF) &&
3041
0
        verbose)
3042
0
      warning(_("cancelling a revert in progress"));
3043
0
    opts.action = REPLAY_REVERT;
3044
0
    need_cleanup = 1;
3045
0
  }
3046
3047
0
  refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
3048
0
      NULL, REF_NO_DEREF);
3049
3050
0
  if (!need_cleanup)
3051
0
    goto out;
3052
3053
0
  if (!have_finished_the_last_pick())
3054
0
    goto out;
3055
3056
0
  sequencer_remove_state(&opts);
3057
0
out:
3058
0
  replay_opts_release(&opts);
3059
0
}
3060
3061
static void todo_list_write_total_nr(struct todo_list *todo_list)
3062
0
{
3063
0
  FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
3064
3065
0
  if (f) {
3066
0
    fprintf(f, "%d\n", todo_list->total_nr);
3067
0
    fclose(f);
3068
0
  }
3069
0
}
3070
3071
static int read_populate_todo(struct repository *r,
3072
            struct todo_list *todo_list,
3073
            struct replay_opts *opts)
3074
0
{
3075
0
  const char *todo_file = get_todo_path(opts);
3076
0
  int res;
3077
3078
0
  strbuf_reset(&todo_list->buf);
3079
0
  if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
3080
0
    return -1;
3081
3082
0
  res = todo_list_parse_insn_buffer(r, opts, todo_list->buf.buf, todo_list);
3083
0
  if (res) {
3084
0
    if (is_rebase_i(opts))
3085
0
      return error(_("please fix this using "
3086
0
               "'git rebase --edit-todo'."));
3087
0
    return error(_("unusable instruction sheet: '%s'"), todo_file);
3088
0
  }
3089
3090
0
  if (!todo_list->nr &&
3091
0
      (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
3092
0
    return error(_("no commits parsed."));
3093
3094
0
  if (!is_rebase_i(opts)) {
3095
0
    enum todo_command valid =
3096
0
      opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
3097
0
    int i;
3098
3099
0
    for (i = 0; i < todo_list->nr; i++)
3100
0
      if (valid == todo_list->items[i].command)
3101
0
        continue;
3102
0
      else if (valid == TODO_PICK)
3103
0
        return error(_("cannot cherry-pick during a revert."));
3104
0
      else
3105
0
        return error(_("cannot revert during a cherry-pick."));
3106
0
  }
3107
3108
0
  if (is_rebase_i(opts)) {
3109
0
    struct todo_list done = TODO_LIST_INIT;
3110
3111
0
    if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
3112
0
        !todo_list_parse_insn_buffer(r, opts, done.buf.buf, &done))
3113
0
      todo_list->done_nr = count_commands(&done);
3114
0
    else
3115
0
      todo_list->done_nr = 0;
3116
3117
0
    todo_list->total_nr = todo_list->done_nr
3118
0
      + count_commands(todo_list);
3119
0
    todo_list_release(&done);
3120
3121
0
    todo_list_write_total_nr(todo_list);
3122
0
  }
3123
3124
0
  return 0;
3125
0
}
3126
3127
static int git_config_string_dup(char **dest,
3128
         const char *var, const char *value)
3129
0
{
3130
0
  if (!value)
3131
0
    return config_error_nonbool(var);
3132
0
  free(*dest);
3133
0
  *dest = xstrdup(value);
3134
0
  return 0;
3135
0
}
3136
3137
static int populate_opts_cb(const char *key, const char *value,
3138
          const struct config_context *ctx,
3139
          void *data)
3140
0
{
3141
0
  struct replay_opts *opts = data;
3142
0
  int error_flag = 1;
3143
3144
0
  if (!value)
3145
0
    error_flag = 0;
3146
0
  else if (!strcmp(key, "options.no-commit"))
3147
0
    opts->no_commit = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3148
0
  else if (!strcmp(key, "options.edit"))
3149
0
    opts->edit = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3150
0
  else if (!strcmp(key, "options.allow-empty"))
3151
0
    opts->allow_empty =
3152
0
      git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3153
0
  else if (!strcmp(key, "options.allow-empty-message"))
3154
0
    opts->allow_empty_message =
3155
0
      git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3156
0
  else if (!strcmp(key, "options.drop-redundant-commits"))
3157
0
    opts->drop_redundant_commits =
3158
0
      git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3159
0
  else if (!strcmp(key, "options.keep-redundant-commits"))
3160
0
    opts->keep_redundant_commits =
3161
0
      git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3162
0
  else if (!strcmp(key, "options.signoff"))
3163
0
    opts->signoff = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3164
0
  else if (!strcmp(key, "options.record-origin"))
3165
0
    opts->record_origin = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3166
0
  else if (!strcmp(key, "options.allow-ff"))
3167
0
    opts->allow_ff = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3168
0
  else if (!strcmp(key, "options.mainline"))
3169
0
    opts->mainline = git_config_int(key, value, ctx->kvi);
3170
0
  else if (!strcmp(key, "options.strategy"))
3171
0
    git_config_string_dup(&opts->strategy, key, value);
3172
0
  else if (!strcmp(key, "options.gpg-sign"))
3173
0
    git_config_string_dup(&opts->gpg_sign, key, value);
3174
0
  else if (!strcmp(key, "options.strategy-option")) {
3175
0
    strvec_push(&opts->xopts, value);
3176
0
  } else if (!strcmp(key, "options.allow-rerere-auto"))
3177
0
    opts->allow_rerere_auto =
3178
0
      git_config_bool_or_int(key, value, ctx->kvi, &error_flag) ?
3179
0
        RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
3180
0
  else if (!strcmp(key, "options.default-msg-cleanup")) {
3181
0
    opts->explicit_cleanup = 1;
3182
0
    opts->default_msg_cleanup = get_cleanup_mode(value, 1);
3183
0
  } else
3184
0
    return error(_("invalid key: %s"), key);
3185
3186
0
  if (!error_flag)
3187
0
    return error(_("invalid value for '%s': '%s'"), key, value);
3188
3189
0
  return 0;
3190
0
}
3191
3192
static void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
3193
0
{
3194
0
  int i;
3195
0
  int count;
3196
0
  const char **argv;
3197
0
  char *strategy_opts_string = raw_opts;
3198
3199
0
  if (*strategy_opts_string == ' ')
3200
0
    strategy_opts_string++;
3201
3202
0
  count = split_cmdline(strategy_opts_string, &argv);
3203
0
  if (count < 0)
3204
0
    BUG("could not split '%s': %s", strategy_opts_string,
3205
0
          split_cmdline_strerror(count));
3206
0
  for (i = 0; i < count; i++) {
3207
0
    const char *arg = argv[i];
3208
3209
0
    skip_prefix(arg, "--", &arg);
3210
0
    strvec_push(&opts->xopts, arg);
3211
0
  }
3212
0
  free(argv);
3213
0
}
3214
3215
static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
3216
0
{
3217
0
  strbuf_reset(buf);
3218
0
  if (!read_oneliner(buf, rebase_path_strategy(), 0))
3219
0
    return;
3220
0
  opts->strategy = strbuf_detach(buf, NULL);
3221
0
  if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
3222
0
    return;
3223
3224
0
  parse_strategy_opts(opts, buf->buf);
3225
0
}
3226
3227
static int read_trailers(struct replay_opts *opts, struct strbuf *buf)
3228
0
{
3229
0
  ssize_t len;
3230
3231
0
  strbuf_reset(buf);
3232
0
  len = strbuf_read_file(buf, rebase_path_trailer(), 0);
3233
0
  if (len > 0) {
3234
0
    char *p = buf->buf, *nl;
3235
3236
0
    trailer_config_init();
3237
3238
0
    while ((nl = strchr(p, '\n'))) {
3239
0
      *nl = '\0';
3240
0
      if (!*p)
3241
0
        return error(_("trailers file contains empty line"));
3242
0
      strvec_push(&opts->trailer_args, p);
3243
0
      p = nl + 1;
3244
0
    }
3245
0
  } else if (!len) {
3246
0
    return error(_("trailers file is empty"));
3247
0
  } else if (errno != ENOENT) {
3248
0
    return error(_("cannot read trailers files"));
3249
0
  }
3250
3251
0
  return 0;
3252
0
}
3253
3254
static int read_populate_opts(struct replay_opts *opts)
3255
0
{
3256
0
  struct replay_ctx *ctx = opts->ctx;
3257
3258
0
  if (is_rebase_i(opts)) {
3259
0
    struct strbuf buf = STRBUF_INIT;
3260
0
    int ret = 0;
3261
3262
0
    if (read_oneliner(&buf, rebase_path_gpg_sign_opt(),
3263
0
          READ_ONELINER_SKIP_IF_EMPTY)) {
3264
0
      if (!starts_with(buf.buf, "-S"))
3265
0
        strbuf_reset(&buf);
3266
0
      else {
3267
0
        free(opts->gpg_sign);
3268
0
        opts->gpg_sign = xstrdup(buf.buf + 2);
3269
0
      }
3270
0
      strbuf_reset(&buf);
3271
0
    }
3272
3273
0
    if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(),
3274
0
          READ_ONELINER_SKIP_IF_EMPTY)) {
3275
0
      if (!strcmp(buf.buf, "--rerere-autoupdate"))
3276
0
        opts->allow_rerere_auto = RERERE_AUTOUPDATE;
3277
0
      else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
3278
0
        opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
3279
0
      strbuf_reset(&buf);
3280
0
    }
3281
3282
0
    if (file_exists(rebase_path_verbose()))
3283
0
      opts->verbose = 1;
3284
3285
0
    if (file_exists(rebase_path_quiet()))
3286
0
      opts->quiet = 1;
3287
3288
0
    if (file_exists(rebase_path_signoff())) {
3289
0
      opts->allow_ff = 0;
3290
0
      opts->signoff = 1;
3291
0
    }
3292
3293
0
    if (file_exists(rebase_path_cdate_is_adate())) {
3294
0
      opts->allow_ff = 0;
3295
0
      opts->committer_date_is_author_date = 1;
3296
0
    }
3297
3298
0
    if (file_exists(rebase_path_ignore_date())) {
3299
0
      opts->allow_ff = 0;
3300
0
      opts->ignore_date = 1;
3301
0
    }
3302
3303
0
    if (file_exists(rebase_path_reschedule_failed_exec()))
3304
0
      opts->reschedule_failed_exec = 1;
3305
0
    else if (file_exists(rebase_path_no_reschedule_failed_exec()))
3306
0
      opts->reschedule_failed_exec = 0;
3307
3308
0
    if (file_exists(rebase_path_drop_redundant_commits()))
3309
0
      opts->drop_redundant_commits = 1;
3310
3311
0
    if (file_exists(rebase_path_keep_redundant_commits()))
3312
0
      opts->keep_redundant_commits = 1;
3313
3314
0
    read_strategy_opts(opts, &buf);
3315
3316
0
    if (read_trailers(opts, &buf)) {
3317
0
      ret = -1;
3318
0
      goto done_rebase_i;
3319
0
    }
3320
0
    strbuf_reset(&buf);
3321
3322
0
    if (read_oneliner(&ctx->current_fixups,
3323
0
          rebase_path_current_fixups(),
3324
0
          READ_ONELINER_SKIP_IF_EMPTY)) {
3325
0
      const char *p = ctx->current_fixups.buf;
3326
0
      ctx->current_fixup_count = 1;
3327
0
      while ((p = strchr(p, '\n'))) {
3328
        /*
3329
         * Older versions of git accidentally
3330
         * inserted blank lines when a fixup
3331
         * was skipped.
3332
         */
3333
0
        if (p[1] && p[1] != '\n')
3334
0
          ctx->current_fixup_count++;
3335
0
        p++;
3336
0
      }
3337
0
    }
3338
3339
0
    if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
3340
0
      if (repo_get_oid_committish(the_repository, buf.buf, &opts->squash_onto) < 0) {
3341
0
        ret = error(_("unusable squash-onto"));
3342
0
        goto done_rebase_i;
3343
0
      }
3344
0
      opts->have_squash_onto = 1;
3345
0
    }
3346
3347
0
done_rebase_i:
3348
0
    strbuf_release(&buf);
3349
0
    return ret;
3350
0
  }
3351
3352
0
  if (!file_exists(git_path_opts_file()))
3353
0
    return 0;
3354
  /*
3355
   * The function git_parse_source(), called from git_config_from_file(),
3356
   * may die() in case of a syntactically incorrect file. We do not care
3357
   * about this case, though, because we wrote that file ourselves, so we
3358
   * are pretty certain that it is syntactically correct.
3359
   */
3360
0
  if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
3361
0
    return error(_("malformed options sheet: '%s'"),
3362
0
      git_path_opts_file());
3363
0
  return 0;
3364
0
}
3365
3366
static void write_strategy_opts(struct replay_opts *opts)
3367
0
{
3368
0
  struct strbuf buf = STRBUF_INIT;
3369
3370
  /*
3371
   * Quote strategy options so that they can be read correctly
3372
   * by split_cmdline().
3373
   */
3374
0
  quote_cmdline(&buf, opts->xopts.v);
3375
0
  write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
3376
0
  strbuf_release(&buf);
3377
0
}
3378
3379
int write_basic_state(struct replay_opts *opts, const char *head_name,
3380
          struct commit *onto, const struct object_id *orig_head)
3381
0
{
3382
0
  if (head_name)
3383
0
    write_file(rebase_path_head_name(), "%s\n", head_name);
3384
0
  if (onto)
3385
0
    write_file(rebase_path_onto(), "%s\n",
3386
0
         oid_to_hex(&onto->object.oid));
3387
0
  if (orig_head)
3388
0
    write_file(rebase_path_orig_head(), "%s\n",
3389
0
         oid_to_hex(orig_head));
3390
3391
0
  if (opts->quiet)
3392
0
    write_file(rebase_path_quiet(), "%s", "");
3393
0
  if (opts->verbose)
3394
0
    write_file(rebase_path_verbose(), "%s", "");
3395
0
  if (opts->strategy)
3396
0
    write_file(rebase_path_strategy(), "%s\n", opts->strategy);
3397
0
  if (opts->xopts.nr > 0)
3398
0
    write_strategy_opts(opts);
3399
3400
0
  if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
3401
0
    write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
3402
0
  else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
3403
0
    write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
3404
3405
0
  if (opts->gpg_sign)
3406
0
    write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
3407
0
  if (opts->signoff)
3408
0
    write_file(rebase_path_signoff(), "--signoff\n");
3409
0
  if (opts->drop_redundant_commits)
3410
0
    write_file(rebase_path_drop_redundant_commits(), "%s", "");
3411
0
  if (opts->keep_redundant_commits)
3412
0
    write_file(rebase_path_keep_redundant_commits(), "%s", "");
3413
0
  if (opts->committer_date_is_author_date)
3414
0
    write_file(rebase_path_cdate_is_adate(), "%s", "");
3415
0
  if (opts->ignore_date)
3416
0
    write_file(rebase_path_ignore_date(), "%s", "");
3417
0
  if (opts->reschedule_failed_exec)
3418
0
    write_file(rebase_path_reschedule_failed_exec(), "%s", "");
3419
0
  else
3420
0
    write_file(rebase_path_no_reschedule_failed_exec(), "%s", "");
3421
0
  if (opts->trailer_args.nr) {
3422
0
    struct strbuf buf = STRBUF_INIT;
3423
3424
0
    for (size_t i = 0; i < opts->trailer_args.nr; i++)
3425
0
      strbuf_addf(&buf, "%s\n", opts->trailer_args.v[i]);
3426
0
    write_file(rebase_path_trailer(), "%s", buf.buf);
3427
0
    strbuf_release(&buf);
3428
0
  }
3429
3430
0
  return 0;
3431
0
}
3432
3433
static int walk_revs_populate_todo(struct todo_list *todo_list,
3434
        struct replay_opts *opts)
3435
0
{
3436
0
  enum todo_command command = opts->action == REPLAY_PICK ?
3437
0
    TODO_PICK : TODO_REVERT;
3438
0
  const char *command_string = todo_command_info[command].str;
3439
0
  const char *encoding;
3440
0
  struct commit *commit;
3441
3442
0
  if (prepare_revs(opts))
3443
0
    return -1;
3444
3445
0
  encoding = get_log_output_encoding();
3446
3447
0
  while ((commit = get_revision(opts->revs))) {
3448
0
    struct todo_item *item = append_new_todo(todo_list);
3449
0
    const char *commit_buffer = repo_logmsg_reencode(the_repository,
3450
0
                 commit, NULL,
3451
0
                 encoding);
3452
0
    const char *subject;
3453
0
    int subject_len;
3454
3455
0
    item->command = command;
3456
0
    item->commit = commit;
3457
0
    item->arg_offset = 0;
3458
0
    item->arg_len = 0;
3459
0
    item->offset_in_buf = todo_list->buf.len;
3460
0
    subject_len = find_commit_subject(commit_buffer, &subject);
3461
0
    strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
3462
0
      short_commit_name(the_repository, commit),
3463
0
      subject_len, subject);
3464
0
    repo_unuse_commit_buffer(the_repository, commit,
3465
0
           commit_buffer);
3466
0
  }
3467
3468
0
  if (!todo_list->nr)
3469
0
    return error(_("empty commit set passed"));
3470
3471
0
  return 0;
3472
0
}
3473
3474
static int create_seq_dir(struct repository *r)
3475
0
{
3476
0
  enum replay_action action;
3477
0
  const char *in_progress_error = NULL;
3478
0
  const char *in_progress_advice = NULL;
3479
0
  unsigned int advise_skip =
3480
0
    refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD") ||
3481
0
    refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD");
3482
3483
0
  if (!sequencer_get_last_command(r, &action)) {
3484
0
    switch (action) {
3485
0
    case REPLAY_REVERT:
3486
0
      in_progress_error = _("revert is already in progress");
3487
0
      in_progress_advice =
3488
0
      _("try \"git revert (--continue | %s--abort | --quit)\"");
3489
0
      break;
3490
0
    case REPLAY_PICK:
3491
0
      in_progress_error = _("cherry-pick is already in progress");
3492
0
      in_progress_advice =
3493
0
      _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
3494
0
      break;
3495
0
    default:
3496
0
      BUG("unexpected action in create_seq_dir");
3497
0
    }
3498
0
  }
3499
0
  if (in_progress_error) {
3500
0
    error("%s", in_progress_error);
3501
0
    if (advice_enabled(ADVICE_SEQUENCER_IN_USE))
3502
0
      advise(in_progress_advice,
3503
0
        advise_skip ? "--skip | " : "");
3504
0
    return -1;
3505
0
  }
3506
0
  if (mkdir(git_path_seq_dir(), 0777) < 0)
3507
0
    return error_errno(_("could not create sequencer directory '%s'"),
3508
0
           git_path_seq_dir());
3509
3510
0
  return 0;
3511
0
}
3512
3513
static int save_head(const char *head)
3514
0
{
3515
0
  return write_message(head, strlen(head), git_path_head_file(), 1);
3516
0
}
3517
3518
static int rollback_is_safe(void)
3519
0
{
3520
0
  struct strbuf sb = STRBUF_INIT;
3521
0
  struct object_id expected_head, actual_head;
3522
3523
0
  if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
3524
0
    strbuf_trim(&sb);
3525
0
    if (get_oid_hex(sb.buf, &expected_head)) {
3526
0
      strbuf_release(&sb);
3527
0
      die(_("could not parse %s"), git_path_abort_safety_file());
3528
0
    }
3529
0
    strbuf_release(&sb);
3530
0
  }
3531
0
  else if (errno == ENOENT)
3532
0
    oidclr(&expected_head, the_repository->hash_algo);
3533
0
  else
3534
0
    die_errno(_("could not read '%s'"), git_path_abort_safety_file());
3535
3536
0
  if (repo_get_oid(the_repository, "HEAD", &actual_head))
3537
0
    oidclr(&actual_head, the_repository->hash_algo);
3538
3539
0
  return oideq(&actual_head, &expected_head);
3540
0
}
3541
3542
static int reset_merge(const struct object_id *oid)
3543
0
{
3544
0
  struct child_process cmd = CHILD_PROCESS_INIT;
3545
3546
0
  cmd.git_cmd = 1;
3547
0
  strvec_pushl(&cmd.args, "reset", "--merge", NULL);
3548
3549
0
  if (!is_null_oid(oid))
3550
0
    strvec_push(&cmd.args, oid_to_hex(oid));
3551
3552
0
  return run_command(&cmd);
3553
0
}
3554
3555
static int rollback_single_pick(struct repository *r)
3556
0
{
3557
0
  struct object_id head_oid;
3558
3559
0
  if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
3560
0
      !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
3561
0
    return error(_("no cherry-pick or revert in progress"));
3562
0
  if (refs_read_ref_full(get_main_ref_store(the_repository), "HEAD", 0, &head_oid, NULL))
3563
0
    return error(_("cannot resolve HEAD"));
3564
0
  if (is_null_oid(&head_oid))
3565
0
    return error(_("cannot abort from a branch yet to be born"));
3566
0
  return reset_merge(&head_oid);
3567
0
}
3568
3569
static int skip_single_pick(void)
3570
0
{
3571
0
  struct object_id head;
3572
3573
0
  if (refs_read_ref_full(get_main_ref_store(the_repository), "HEAD", 0, &head, NULL))
3574
0
    return error(_("cannot resolve HEAD"));
3575
0
  return reset_merge(&head);
3576
0
}
3577
3578
int sequencer_rollback(struct repository *r, struct replay_opts *opts)
3579
0
{
3580
0
  FILE *f;
3581
0
  struct object_id oid;
3582
0
  struct strbuf buf = STRBUF_INIT;
3583
0
  const char *p;
3584
3585
0
  f = fopen(git_path_head_file(), "r");
3586
0
  if (!f && errno == ENOENT) {
3587
    /*
3588
     * There is no multiple-cherry-pick in progress.
3589
     * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
3590
     * a single-cherry-pick in progress, abort that.
3591
     */
3592
0
    return rollback_single_pick(r);
3593
0
  }
3594
0
  if (!f)
3595
0
    return error_errno(_("cannot open '%s'"), git_path_head_file());
3596
0
  if (strbuf_getline_lf(&buf, f)) {
3597
0
    error(_("cannot read '%s': %s"), git_path_head_file(),
3598
0
          ferror(f) ?  strerror(errno) : _("unexpected end of file"));
3599
0
    fclose(f);
3600
0
    goto fail;
3601
0
  }
3602
0
  fclose(f);
3603
0
  if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
3604
0
    error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
3605
0
      git_path_head_file());
3606
0
    goto fail;
3607
0
  }
3608
0
  if (is_null_oid(&oid)) {
3609
0
    error(_("cannot abort from a branch yet to be born"));
3610
0
    goto fail;
3611
0
  }
3612
3613
0
  if (!rollback_is_safe()) {
3614
    /* Do not error, just do not rollback */
3615
0
    warning(_("You seem to have moved HEAD. "
3616
0
        "Not rewinding, check your HEAD!"));
3617
0
  } else
3618
0
  if (reset_merge(&oid))
3619
0
    goto fail;
3620
0
  strbuf_release(&buf);
3621
0
  return sequencer_remove_state(opts);
3622
0
fail:
3623
0
  strbuf_release(&buf);
3624
0
  return -1;
3625
0
}
3626
3627
int sequencer_skip(struct repository *r, struct replay_opts *opts)
3628
0
{
3629
0
  enum replay_action action = -1;
3630
0
  sequencer_get_last_command(r, &action);
3631
3632
  /*
3633
   * Check whether the subcommand requested to skip the commit is actually
3634
   * in progress and that it's safe to skip the commit.
3635
   *
3636
   * opts->action tells us which subcommand requested to skip the commit.
3637
   * If the corresponding .git/<ACTION>_HEAD exists, we know that the
3638
   * action is in progress and we can skip the commit.
3639
   *
3640
   * Otherwise we check that the last instruction was related to the
3641
   * particular subcommand we're trying to execute and barf if that's not
3642
   * the case.
3643
   *
3644
   * Finally we check that the rollback is "safe", i.e., has the HEAD
3645
   * moved? In this case, it doesn't make sense to "reset the merge" and
3646
   * "skip the commit" as the user already handled this by committing. But
3647
   * we'd not want to barf here, instead give advice on how to proceed. We
3648
   * only need to check that when .git/<ACTION>_HEAD doesn't exist because
3649
   * it gets removed when the user commits, so if it still exists we're
3650
   * sure the user can't have committed before.
3651
   */
3652
0
  switch (opts->action) {
3653
0
  case REPLAY_REVERT:
3654
0
    if (!refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
3655
0
      if (action != REPLAY_REVERT)
3656
0
        return error(_("no revert in progress"));
3657
0
      if (!rollback_is_safe())
3658
0
        goto give_advice;
3659
0
    }
3660
0
    break;
3661
0
  case REPLAY_PICK:
3662
0
    if (!refs_ref_exists(get_main_ref_store(r),
3663
0
             "CHERRY_PICK_HEAD")) {
3664
0
      if (action != REPLAY_PICK)
3665
0
        return error(_("no cherry-pick in progress"));
3666
0
      if (!rollback_is_safe())
3667
0
        goto give_advice;
3668
0
    }
3669
0
    break;
3670
0
  default:
3671
0
    BUG("unexpected action in sequencer_skip");
3672
0
  }
3673
3674
0
  if (skip_single_pick())
3675
0
    return error(_("failed to skip the commit"));
3676
0
  if (!is_directory(git_path_seq_dir()))
3677
0
    return 0;
3678
3679
0
  return sequencer_continue(r, opts);
3680
3681
0
give_advice:
3682
0
  error(_("there is nothing to skip"));
3683
3684
0
  if (advice_enabled(ADVICE_RESOLVE_CONFLICT)) {
3685
0
    advise(_("have you committed already?\n"
3686
0
       "try \"git %s --continue\""),
3687
0
       action == REPLAY_REVERT ? "revert" : "cherry-pick");
3688
0
  }
3689
0
  return -1;
3690
0
}
3691
3692
static int save_todo(struct todo_list *todo_list, struct replay_opts *opts,
3693
         int reschedule)
3694
0
{
3695
0
  struct lock_file todo_lock = LOCK_INIT;
3696
0
  const char *todo_path = get_todo_path(opts);
3697
0
  int next = todo_list->current, offset, fd;
3698
3699
  /*
3700
   * rebase -i writes "git-rebase-todo" without the currently executing
3701
   * command, appending it to "done" instead.
3702
   */
3703
0
  if (is_rebase_i(opts) && !reschedule)
3704
0
    next++;
3705
3706
0
  fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
3707
0
  if (fd < 0)
3708
0
    return error_errno(_("could not lock '%s'"), todo_path);
3709
0
  offset = get_item_line_offset(todo_list, next);
3710
0
  if (write_in_full(fd, todo_list->buf.buf + offset,
3711
0
      todo_list->buf.len - offset) < 0)
3712
0
    return error_errno(_("could not write to '%s'"), todo_path);
3713
0
  if (commit_lock_file(&todo_lock) < 0)
3714
0
    return error(_("failed to finalize '%s'"), todo_path);
3715
3716
0
  if (is_rebase_i(opts) && !reschedule && next > 0) {
3717
0
    const char *done = rebase_path_done();
3718
0
    int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
3719
0
    int ret = 0;
3720
3721
0
    if (fd < 0)
3722
0
      return 0;
3723
0
    if (write_in_full(fd, get_item_line(todo_list, next - 1),
3724
0
          get_item_line_length(todo_list, next - 1))
3725
0
        < 0)
3726
0
      ret = error_errno(_("could not write to '%s'"), done);
3727
0
    if (close(fd) < 0)
3728
0
      ret = error_errno(_("failed to finalize '%s'"), done);
3729
0
    return ret;
3730
0
  }
3731
0
  return 0;
3732
0
}
3733
3734
static int save_opts(struct replay_opts *opts)
3735
0
{
3736
0
  const char *opts_file = git_path_opts_file();
3737
0
  int res = 0;
3738
3739
0
  if (opts->no_commit)
3740
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3741
0
          "options.no-commit", NULL, "true");
3742
0
  if (opts->edit >= 0)
3743
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file, "options.edit", NULL,
3744
0
                 opts->edit ? "true" : "false");
3745
0
  if (opts->allow_empty)
3746
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3747
0
          "options.allow-empty", NULL, "true");
3748
0
  if (opts->allow_empty_message)
3749
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3750
0
        "options.allow-empty-message", NULL, "true");
3751
0
  if (opts->drop_redundant_commits)
3752
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3753
0
        "options.drop-redundant-commits", NULL, "true");
3754
0
  if (opts->keep_redundant_commits)
3755
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3756
0
        "options.keep-redundant-commits", NULL, "true");
3757
0
  if (opts->signoff)
3758
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3759
0
          "options.signoff", NULL, "true");
3760
0
  if (opts->record_origin)
3761
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3762
0
          "options.record-origin", NULL, "true");
3763
0
  if (opts->allow_ff)
3764
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3765
0
          "options.allow-ff", NULL, "true");
3766
0
  if (opts->mainline) {
3767
0
    struct strbuf buf = STRBUF_INIT;
3768
0
    strbuf_addf(&buf, "%d", opts->mainline);
3769
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3770
0
          "options.mainline", NULL, buf.buf);
3771
0
    strbuf_release(&buf);
3772
0
  }
3773
0
  if (opts->strategy)
3774
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3775
0
          "options.strategy", NULL, opts->strategy);
3776
0
  if (opts->gpg_sign)
3777
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3778
0
          "options.gpg-sign", NULL, opts->gpg_sign);
3779
0
  for (size_t i = 0; i < opts->xopts.nr; i++)
3780
0
    res |= repo_config_set_multivar_in_file_gently(the_repository, opts_file,
3781
0
        "options.strategy-option",
3782
0
        opts->xopts.v[i], "^$", NULL, 0);
3783
0
  if (opts->allow_rerere_auto)
3784
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3785
0
        "options.allow-rerere-auto", NULL,
3786
0
        opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
3787
0
        "true" : "false");
3788
3789
0
  if (opts->explicit_cleanup)
3790
0
    res |= repo_config_set_in_file_gently(the_repository, opts_file,
3791
0
        "options.default-msg-cleanup", NULL,
3792
0
        describe_cleanup_mode(opts->default_msg_cleanup));
3793
0
  return res;
3794
0
}
3795
3796
static int make_patch(struct repository *r,
3797
          struct commit *commit,
3798
          struct replay_opts *opts)
3799
0
{
3800
0
  struct rev_info log_tree_opt;
3801
0
  const char *subject;
3802
0
  char hex[GIT_MAX_HEXSZ + 1];
3803
0
  int res = 0;
3804
3805
0
  if (!is_rebase_i(opts))
3806
0
    BUG("make_patch should only be called when rebasing");
3807
3808
0
  oid_to_hex_r(hex, &commit->object.oid);
3809
0
  if (write_message(hex, strlen(hex), rebase_path_stopped_sha(), 1) < 0)
3810
0
    return -1;
3811
0
  res |= write_rebase_head(&commit->object.oid);
3812
3813
0
  memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3814
0
  repo_init_revisions(r, &log_tree_opt, NULL);
3815
0
  log_tree_opt.abbrev = 0;
3816
0
  log_tree_opt.diff = 1;
3817
0
  log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
3818
0
  log_tree_opt.disable_stdin = 1;
3819
0
  log_tree_opt.no_commit_id = 1;
3820
0
  log_tree_opt.diffopt.file = fopen(rebase_path_patch(), "w");
3821
0
  log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
3822
0
  if (!log_tree_opt.diffopt.file)
3823
0
    res |= error_errno(_("could not open '%s'"),
3824
0
           rebase_path_patch());
3825
0
  else {
3826
0
    res |= log_tree_commit(&log_tree_opt, commit);
3827
0
    fclose(log_tree_opt.diffopt.file);
3828
0
  }
3829
3830
0
  if (!file_exists(rebase_path_message())) {
3831
0
    const char *encoding = get_commit_output_encoding();
3832
0
    const char *commit_buffer = repo_logmsg_reencode(r,
3833
0
                 commit, NULL,
3834
0
                 encoding);
3835
0
    find_commit_subject(commit_buffer, &subject);
3836
0
    res |= write_message(subject, strlen(subject), rebase_path_message(), 1);
3837
0
    repo_unuse_commit_buffer(r, commit,
3838
0
           commit_buffer);
3839
0
  }
3840
0
  release_revisions(&log_tree_opt);
3841
3842
0
  return res;
3843
0
}
3844
3845
static int intend_to_amend(void)
3846
0
{
3847
0
  struct object_id head;
3848
0
  char *p;
3849
3850
0
  if (repo_get_oid(the_repository, "HEAD", &head))
3851
0
    return error(_("cannot read HEAD"));
3852
3853
0
  p = oid_to_hex(&head);
3854
0
  return write_message(p, strlen(p), rebase_path_amend(), 1);
3855
0
}
3856
3857
static int error_with_patch(struct repository *r,
3858
          struct commit *commit,
3859
          const char *subject, int subject_len,
3860
          struct replay_opts *opts,
3861
          int exit_code, int to_amend)
3862
0
{
3863
0
  struct replay_ctx *ctx = opts->ctx;
3864
3865
  /*
3866
   * Write the commit message to be used by "git rebase
3867
   * --continue". If a "fixup" or "squash" command has conflicts
3868
   * then we will have already written rebase_path_message() in
3869
   * error_failed_squash(). If an "edit" command was
3870
   * fast-forwarded then we don't have a message in ctx->message
3871
   * and rely on make_patch() to write rebase_path_message()
3872
   * instead.
3873
   */
3874
0
  if (ctx->have_message && !file_exists(rebase_path_message()) &&
3875
0
      write_message(ctx->message.buf, ctx->message.len,
3876
0
        rebase_path_message(), 0))
3877
0
    return error(_("could not write commit message file"));
3878
3879
0
  if (commit && make_patch(r, commit, opts))
3880
0
      return -1;
3881
3882
0
  if (to_amend) {
3883
0
    if (intend_to_amend())
3884
0
      return -1;
3885
3886
0
    fprintf(stderr,
3887
0
      _("You can amend the commit now, with\n"
3888
0
        "\n"
3889
0
        "  git commit --amend %s\n"
3890
0
        "\n"
3891
0
        "Once you are satisfied with your changes, run\n"
3892
0
        "\n"
3893
0
        "  git rebase --continue\n"),
3894
0
      gpg_sign_opt_quoted(opts));
3895
0
  } else if (exit_code) {
3896
0
    if (commit)
3897
0
      fprintf_ln(stderr, _("Could not apply %s... %.*s"),
3898
0
           short_commit_name(r, commit), subject_len, subject);
3899
0
    else
3900
      /*
3901
       * We don't have the hash of the parent so
3902
       * just print the line from the todo file.
3903
       */
3904
0
      fprintf_ln(stderr, _("Could not merge %.*s"),
3905
0
           subject_len, subject);
3906
0
  }
3907
3908
0
  return exit_code;
3909
0
}
3910
3911
static int error_failed_squash(struct repository *r,
3912
             struct commit *commit,
3913
             struct replay_opts *opts,
3914
             int subject_len,
3915
             const char *subject)
3916
0
{
3917
0
  if (copy_file(r, rebase_path_message(), rebase_path_squash_msg(), 0666))
3918
0
    return error(_("could not copy '%s' to '%s'"),
3919
0
      rebase_path_squash_msg(), rebase_path_message());
3920
0
  unlink(git_path_merge_msg(r));
3921
0
  if (copy_file(r, git_path_merge_msg(r), rebase_path_message(), 0666))
3922
0
    return error(_("could not copy '%s' to '%s'"),
3923
0
           rebase_path_message(),
3924
0
           git_path_merge_msg(r));
3925
0
  return error_with_patch(r, commit, subject, subject_len, opts, 1, 1);
3926
0
}
3927
3928
static int do_exec(struct repository *r, const char *command_line, int quiet)
3929
0
{
3930
0
  struct child_process cmd = CHILD_PROCESS_INIT;
3931
0
  int dirty, status;
3932
3933
0
  if (!quiet)
3934
0
    fprintf(stderr, _("Executing: %s\n"), command_line);
3935
0
  cmd.use_shell = 1;
3936
0
  strvec_push(&cmd.args, command_line);
3937
0
  strvec_push(&cmd.env, "GIT_CHERRY_PICK_HELP");
3938
0
  status = run_command(&cmd);
3939
3940
  /* force re-reading of the cache */
3941
0
  discard_index(r->index);
3942
0
  if (repo_read_index(r) < 0)
3943
0
    return error(_("could not read index"));
3944
3945
0
  dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
3946
3947
0
  if (status) {
3948
0
    warning(_("execution failed: %s\n%s"
3949
0
        "You can fix the problem, and then run\n"
3950
0
        "\n"
3951
0
        "  git rebase --continue\n"
3952
0
        "\n"),
3953
0
      command_line,
3954
0
      dirty ? _("and made changes to the index and/or the "
3955
0
        "working tree.\n") : "");
3956
0
    if (status == 127)
3957
      /* command not found */
3958
0
      status = 1;
3959
0
  } else if (dirty) {
3960
0
    warning(_("execution succeeded: %s\nbut "
3961
0
        "left changes to the index and/or the working tree.\n"
3962
0
        "Commit or stash your changes, and then run\n"
3963
0
        "\n"
3964
0
        "  git rebase --continue\n"
3965
0
        "\n"), command_line);
3966
0
    status = 1;
3967
0
  }
3968
3969
0
  return status;
3970
0
}
3971
3972
__attribute__((format (printf, 2, 3)))
3973
static int safe_append(const char *filename, const char *fmt, ...)
3974
0
{
3975
0
  va_list ap;
3976
0
  struct lock_file lock = LOCK_INIT;
3977
0
  int fd = hold_lock_file_for_update(&lock, filename,
3978
0
             LOCK_REPORT_ON_ERROR);
3979
0
  struct strbuf buf = STRBUF_INIT;
3980
3981
0
  if (fd < 0)
3982
0
    return -1;
3983
3984
0
  if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3985
0
    error_errno(_("could not read '%s'"), filename);
3986
0
    rollback_lock_file(&lock);
3987
0
    return -1;
3988
0
  }
3989
0
  strbuf_complete(&buf, '\n');
3990
0
  va_start(ap, fmt);
3991
0
  strbuf_vaddf(&buf, fmt, ap);
3992
0
  va_end(ap);
3993
3994
0
  if (write_in_full(fd, buf.buf, buf.len) < 0) {
3995
0
    error_errno(_("could not write to '%s'"), filename);
3996
0
    strbuf_release(&buf);
3997
0
    rollback_lock_file(&lock);
3998
0
    return -1;
3999
0
  }
4000
0
  if (commit_lock_file(&lock) < 0) {
4001
0
    strbuf_release(&buf);
4002
0
    return error(_("failed to finalize '%s'"), filename);
4003
0
  }
4004
4005
0
  strbuf_release(&buf);
4006
0
  return 0;
4007
0
}
4008
4009
static int do_label(struct repository *r, const char *name, int len)
4010
0
{
4011
0
  struct ref_store *refs = get_main_ref_store(r);
4012
0
  struct ref_transaction *transaction;
4013
0
  struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
4014
0
  struct strbuf msg = STRBUF_INIT;
4015
0
  int ret = 0;
4016
0
  struct object_id head_oid;
4017
4018
0
  if (len == 1 && *name == '#')
4019
0
    return error(_("illegal label name: '%.*s'"), len, name);
4020
4021
0
  strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
4022
0
  strbuf_addf(&msg, "rebase (label) '%.*s'", len, name);
4023
4024
0
  transaction = ref_store_transaction_begin(refs, 0, &err);
4025
0
  if (!transaction) {
4026
0
    error("%s", err.buf);
4027
0
    ret = -1;
4028
0
  } else if (repo_get_oid(r, "HEAD", &head_oid)) {
4029
0
    error(_("could not read HEAD"));
4030
0
    ret = -1;
4031
0
  } else if (ref_transaction_update(transaction, ref_name.buf,
4032
0
            &head_oid, NULL, NULL, NULL,
4033
0
            0, msg.buf, &err) < 0 ||
4034
0
       ref_transaction_commit(transaction, &err)) {
4035
0
    error("%s", err.buf);
4036
0
    ret = -1;
4037
0
  }
4038
0
  ref_transaction_free(transaction);
4039
0
  strbuf_release(&err);
4040
0
  strbuf_release(&msg);
4041
4042
0
  if (!ret)
4043
0
    ret = safe_append(rebase_path_refs_to_delete(),
4044
0
          "%s\n", ref_name.buf);
4045
0
  strbuf_release(&ref_name);
4046
4047
0
  return ret;
4048
0
}
4049
4050
static struct commit *lookup_label(struct repository *r, const char *label,
4051
           int len, struct strbuf *buf)
4052
0
{
4053
0
  struct commit *commit;
4054
0
  struct object_id oid;
4055
4056
0
  strbuf_reset(buf);
4057
0
  strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
4058
0
  if (!refs_read_ref(get_main_ref_store(the_repository), buf->buf, &oid)) {
4059
0
    commit = lookup_commit_object(r, &oid);
4060
0
  } else {
4061
    /* fall back to non-rewritten ref or commit */
4062
0
    strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
4063
0
    commit = lookup_commit_reference_by_name(buf->buf);
4064
0
  }
4065
4066
0
  if (!commit)
4067
0
    error(_("could not resolve '%s'"), buf->buf);
4068
4069
0
  return commit;
4070
0
}
4071
4072
static int do_reset(struct repository *r,
4073
        const char *name, int len,
4074
        struct replay_opts *opts)
4075
0
{
4076
0
  struct strbuf ref_name = STRBUF_INIT;
4077
0
  struct object_id oid;
4078
0
  struct lock_file lock = LOCK_INIT;
4079
0
  struct tree_desc desc = { 0 };
4080
0
  struct tree *tree;
4081
0
  struct unpack_trees_options unpack_tree_opts = { 0 };
4082
0
  int ret = 0;
4083
4084
0
  if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
4085
0
    return -1;
4086
4087
0
  if (len == 10 && !strncmp("[new root]", name, len)) {
4088
0
    if (!opts->have_squash_onto) {
4089
0
      const char *hex;
4090
0
      if (commit_tree("", 0, the_hash_algo->empty_tree,
4091
0
          NULL, &opts->squash_onto,
4092
0
          NULL, NULL))
4093
0
        return error(_("writing fake root commit"));
4094
0
      opts->have_squash_onto = 1;
4095
0
      hex = oid_to_hex(&opts->squash_onto);
4096
0
      if (write_message(hex, strlen(hex),
4097
0
            rebase_path_squash_onto(), 0))
4098
0
        return error(_("writing squash-onto"));
4099
0
    }
4100
0
    oidcpy(&oid, &opts->squash_onto);
4101
0
  } else {
4102
0
    int i;
4103
0
    struct commit *commit;
4104
4105
    /* Determine the length of the label */
4106
0
    for (i = 0; i < len; i++)
4107
0
      if (isspace(name[i]))
4108
0
        break;
4109
0
    len = i;
4110
4111
0
    commit = lookup_label(r, name, len, &ref_name);
4112
0
    if (!commit) {
4113
0
      ret = -1;
4114
0
      goto cleanup;
4115
0
    }
4116
0
    oid = commit->object.oid;
4117
0
  }
4118
4119
0
  setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
4120
0
  unpack_tree_opts.head_idx = 1;
4121
0
  unpack_tree_opts.src_index = r->index;
4122
0
  unpack_tree_opts.dst_index = r->index;
4123
0
  unpack_tree_opts.fn = oneway_merge;
4124
0
  unpack_tree_opts.merge = 1;
4125
0
  unpack_tree_opts.update = 1;
4126
0
  unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
4127
0
  unpack_tree_opts.skip_cache_tree_update = 1;
4128
0
  init_checkout_metadata(&unpack_tree_opts.meta, name, &oid, NULL);
4129
4130
0
  if (repo_read_index_unmerged(r)) {
4131
0
    ret = error_resolve_conflict(action_name(opts));
4132
0
    goto cleanup;
4133
0
  }
4134
4135
0
  if (!fill_tree_descriptor(r, &desc, &oid)) {
4136
0
    ret = error(_("failed to find tree of %s"), oid_to_hex(&oid));
4137
0
    goto cleanup;
4138
0
  }
4139
4140
0
  if (unpack_trees(1, &desc, &unpack_tree_opts)) {
4141
0
    ret = -1;
4142
0
    goto cleanup;
4143
0
  }
4144
4145
0
  tree = repo_parse_tree_indirect(the_repository, &oid);
4146
0
  if (!tree)
4147
0
    return error(_("unable to read tree (%s)"), oid_to_hex(&oid));
4148
0
  prime_cache_tree(r, r->index, tree);
4149
4150
0
  if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
4151
0
    ret = error(_("could not write index"));
4152
4153
0
  if (!ret)
4154
0
    ret = refs_update_ref(get_main_ref_store(the_repository), reflog_message(opts, "reset", "'%.*s'",
4155
0
                       len, name),
4156
0
              "HEAD", &oid,
4157
0
              NULL, 0, UPDATE_REFS_MSG_ON_ERR);
4158
0
cleanup:
4159
0
  free((void *)desc.buffer);
4160
0
  if (ret < 0)
4161
0
    rollback_lock_file(&lock);
4162
0
  strbuf_release(&ref_name);
4163
0
  clear_unpack_trees_porcelain(&unpack_tree_opts);
4164
0
  return ret;
4165
0
}
4166
4167
static int do_merge(struct repository *r,
4168
        struct commit *commit,
4169
        const char *arg, int arg_len,
4170
        int flags, int *check_todo, struct replay_opts *opts)
4171
0
{
4172
0
  struct replay_ctx *ctx = opts->ctx;
4173
0
  int run_commit_flags = 0;
4174
0
  struct strbuf ref_name = STRBUF_INIT;
4175
0
  struct commit *head_commit, *merge_commit, *i;
4176
0
  struct commit_list *bases = NULL, *j;
4177
0
  struct commit_list *to_merge = NULL, **tail = &to_merge;
4178
0
  const char *strategy = !opts->xopts.nr &&
4179
0
    (!opts->strategy ||
4180
0
     !strcmp(opts->strategy, "recursive") ||
4181
0
     !strcmp(opts->strategy, "ort")) ?
4182
0
    NULL : opts->strategy;
4183
0
  struct merge_options o;
4184
0
  int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
4185
0
  static struct lock_file lock;
4186
0
  const char *p;
4187
0
  const char *reflog_action = reflog_message(opts, "merge", NULL);
4188
4189
0
  if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
4190
0
    ret = -1;
4191
0
    goto leave_merge;
4192
0
  }
4193
4194
0
  head_commit = lookup_commit_reference_by_name("HEAD");
4195
0
  if (!head_commit) {
4196
0
    ret = error(_("cannot merge without a current revision"));
4197
0
    goto leave_merge;
4198
0
  }
4199
4200
  /*
4201
   * For octopus merges, the arg starts with the list of revisions to be
4202
   * merged. The list is optionally followed by '#' and the oneline.
4203
   */
4204
0
  merge_arg_len = oneline_offset = arg_len;
4205
0
  for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
4206
0
    if (!*p)
4207
0
      break;
4208
0
    if (*p == '#' && (!p[1] || isspace(p[1]))) {
4209
0
      p += 1 + strspn(p + 1, " \t\n");
4210
0
      oneline_offset = p - arg;
4211
0
      break;
4212
0
    }
4213
0
    k = strcspn(p, " \t\n");
4214
0
    if (!k)
4215
0
      continue;
4216
0
    merge_commit = lookup_label(r, p, k, &ref_name);
4217
0
    if (!merge_commit) {
4218
0
      ret = error(_("unable to parse '%.*s'"), k, p);
4219
0
      goto leave_merge;
4220
0
    }
4221
0
    tail = &commit_list_insert(merge_commit, tail)->next;
4222
0
    p += k;
4223
0
    merge_arg_len = p - arg;
4224
0
  }
4225
4226
0
  if (!to_merge) {
4227
0
    ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
4228
0
    goto leave_merge;
4229
0
  }
4230
4231
0
  if (opts->have_squash_onto &&
4232
0
      oideq(&head_commit->object.oid, &opts->squash_onto)) {
4233
    /*
4234
     * When the user tells us to "merge" something into a
4235
     * "[new root]", let's simply fast-forward to the merge head.
4236
     */
4237
0
    rollback_lock_file(&lock);
4238
0
    if (to_merge->next)
4239
0
      ret = error(_("octopus merge cannot be executed on "
4240
0
              "top of a [new root]"));
4241
0
    else
4242
0
      ret = fast_forward_to(r, &to_merge->item->object.oid,
4243
0
                &head_commit->object.oid, 0,
4244
0
                opts);
4245
0
    goto leave_merge;
4246
0
  }
4247
4248
  /*
4249
   * If HEAD is not identical to the first parent of the original merge
4250
   * commit, we cannot fast-forward.
4251
   */
4252
0
  can_fast_forward = opts->allow_ff && commit && commit->parents &&
4253
0
    oideq(&commit->parents->item->object.oid,
4254
0
          &head_commit->object.oid);
4255
4256
  /*
4257
   * If any merge head is different from the original one, we cannot
4258
   * fast-forward.
4259
   */
4260
0
  if (can_fast_forward) {
4261
0
    struct commit_list *p = commit->parents->next;
4262
4263
0
    for (j = to_merge; j && p; j = j->next, p = p->next)
4264
0
      if (!oideq(&j->item->object.oid,
4265
0
           &p->item->object.oid)) {
4266
0
        can_fast_forward = 0;
4267
0
        break;
4268
0
      }
4269
    /*
4270
     * If the number of merge heads differs from the original merge
4271
     * commit, we cannot fast-forward.
4272
     */
4273
0
    if (j || p)
4274
0
      can_fast_forward = 0;
4275
0
  }
4276
4277
0
  if (can_fast_forward) {
4278
0
    rollback_lock_file(&lock);
4279
0
    ret = fast_forward_to(r, &commit->object.oid,
4280
0
              &head_commit->object.oid, 0, opts);
4281
0
    if (flags & TODO_EDIT_MERGE_MSG)
4282
0
      goto fast_forward_edit;
4283
4284
0
    goto leave_merge;
4285
0
  }
4286
4287
0
  if (commit) {
4288
0
    const char *encoding = get_commit_output_encoding();
4289
0
    const char *message = repo_logmsg_reencode(r, commit, NULL,
4290
0
                 encoding);
4291
0
    const char *body;
4292
0
    int len;
4293
4294
0
    if (!message) {
4295
0
      ret = error(_("could not get commit message of '%s'"),
4296
0
            oid_to_hex(&commit->object.oid));
4297
0
      goto leave_merge;
4298
0
    }
4299
0
    write_author_script(message);
4300
0
    find_commit_subject(message, &body);
4301
0
    len = strlen(body);
4302
0
    strbuf_add(&ctx->message, body, len);
4303
0
    repo_unuse_commit_buffer(r, commit, message);
4304
0
  } else {
4305
0
    struct strbuf buf = STRBUF_INIT;
4306
4307
0
    strbuf_addf(&buf, "author %s", git_author_info(0));
4308
0
    write_author_script(buf.buf);
4309
0
    strbuf_release(&buf);
4310
4311
0
    if (oneline_offset < arg_len) {
4312
0
      strbuf_add(&ctx->message, arg + oneline_offset,
4313
0
           arg_len - oneline_offset);
4314
0
    } else {
4315
0
      strbuf_addf(&ctx->message, "Merge %s '%.*s'",
4316
0
            to_merge->next ? "branches" : "branch",
4317
0
            merge_arg_len, arg);
4318
0
    }
4319
0
  }
4320
0
  ctx->have_message = 1;
4321
0
  if (write_message(ctx->message.buf, ctx->message.len,
4322
0
        git_path_merge_msg(r), 0)) {
4323
0
        ret = error_errno(_("could not write '%s'"),
4324
0
              git_path_merge_msg(r));
4325
0
        goto leave_merge;
4326
0
  }
4327
4328
0
  if (strategy || to_merge->next) {
4329
    /* Octopus merge */
4330
0
    struct child_process cmd = CHILD_PROCESS_INIT;
4331
4332
0
    if (read_env_script(&cmd.env)) {
4333
0
      const char *gpg_opt = gpg_sign_opt_quoted(opts);
4334
4335
0
      ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
4336
0
      goto leave_merge;
4337
0
    }
4338
4339
0
    if (opts->committer_date_is_author_date)
4340
0
      strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
4341
0
             opts->ignore_date ?
4342
0
             "" :
4343
0
             author_date_from_env(&cmd.env));
4344
0
    if (opts->ignore_date)
4345
0
      strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
4346
4347
0
    cmd.git_cmd = 1;
4348
0
    strvec_push(&cmd.args, "merge");
4349
0
    strvec_push(&cmd.args, "-s");
4350
0
    if (!strategy)
4351
0
      strvec_push(&cmd.args, "octopus");
4352
0
    else {
4353
0
      strvec_push(&cmd.args, strategy);
4354
0
      for (k = 0; k < opts->xopts.nr; k++)
4355
0
        strvec_pushf(&cmd.args,
4356
0
               "-X%s", opts->xopts.v[k]);
4357
0
    }
4358
0
    if (!(flags & TODO_EDIT_MERGE_MSG))
4359
0
      strvec_push(&cmd.args, "--no-edit");
4360
0
    else
4361
0
      strvec_push(&cmd.args, "--edit");
4362
0
    strvec_push(&cmd.args, "--no-ff");
4363
0
    strvec_push(&cmd.args, "--no-log");
4364
0
    strvec_push(&cmd.args, "--no-stat");
4365
0
    strvec_push(&cmd.args, "-F");
4366
0
    strvec_push(&cmd.args, git_path_merge_msg(r));
4367
0
    if (opts->gpg_sign)
4368
0
      strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
4369
0
    else
4370
0
      strvec_push(&cmd.args, "--no-gpg-sign");
4371
4372
    /* Add the tips to be merged */
4373
0
    for (j = to_merge; j; j = j->next)
4374
0
      strvec_push(&cmd.args,
4375
0
            oid_to_hex(&j->item->object.oid));
4376
4377
0
    strbuf_release(&ref_name);
4378
0
    refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
4379
0
        NULL, REF_NO_DEREF);
4380
0
    rollback_lock_file(&lock);
4381
4382
0
    ret = run_command(&cmd);
4383
4384
    /* force re-reading of the cache */
4385
0
    if (!ret) {
4386
0
      discard_index(r->index);
4387
0
      if (repo_read_index(r) < 0)
4388
0
        ret = error(_("could not read index"));
4389
0
    }
4390
0
    goto leave_merge;
4391
0
  }
4392
4393
0
  merge_commit = to_merge->item;
4394
0
  if (repo_get_merge_bases(r, head_commit, merge_commit, &bases) < 0) {
4395
0
    ret = -1;
4396
0
    goto leave_merge;
4397
0
  }
4398
4399
0
  if (bases && oideq(&merge_commit->object.oid,
4400
0
         &bases->item->object.oid)) {
4401
0
    ret = 0;
4402
    /* skip merging an ancestor of HEAD */
4403
0
    goto leave_merge;
4404
0
  }
4405
4406
0
  write_message(oid_to_hex(&merge_commit->object.oid), the_hash_algo->hexsz,
4407
0
          git_path_merge_head(r), 0);
4408
0
  write_message("no-ff", 5, git_path_merge_mode(r), 0);
4409
4410
0
  bases = commit_list_reverse(bases);
4411
4412
0
  repo_read_index(r);
4413
0
  init_ui_merge_options(&o, r);
4414
0
  o.branch1 = "HEAD";
4415
0
  o.branch2 = ref_name.buf;
4416
0
  o.buffer_output = 2;
4417
4418
  /*
4419
   * TODO: Should use merge_incore_recursive() and
4420
   * merge_switch_to_result(), skipping the call to
4421
   * merge_switch_to_result() when we don't actually need to
4422
   * update the index and working copy immediately.
4423
   */
4424
0
  ret = merge_ort_recursive(&o, head_commit, merge_commit, bases, &i);
4425
0
  if (ret <= 0)
4426
0
    fputs(o.obuf.buf, stdout);
4427
0
  strbuf_release(&o.obuf);
4428
0
  if (ret < 0) {
4429
0
    error(_("could not even attempt to merge '%.*s'"),
4430
0
          merge_arg_len, arg);
4431
0
    unlink(git_path_merge_msg(r));
4432
0
    goto leave_merge;
4433
0
  }
4434
  /*
4435
   * The return value of merge_ort_recursive() is 1 on clean, and 0 on
4436
   * unclean merge.
4437
   *
4438
   * Let's reverse that, so that do_merge() returns 0 upon success and
4439
   * 1 upon failed merge (keeping the return value -1 for the cases where
4440
   * we will want to reschedule the `merge` command).
4441
   */
4442
0
  ret = !ret;
4443
4444
0
  if (r->index->cache_changed &&
4445
0
      write_locked_index(r->index, &lock, COMMIT_LOCK)) {
4446
0
    ret = error(_("merge: Unable to write new index file"));
4447
0
    goto leave_merge;
4448
0
  }
4449
4450
0
  rollback_lock_file(&lock);
4451
0
  if (ret)
4452
0
    repo_rerere(r, opts->allow_rerere_auto);
4453
0
  else
4454
    /*
4455
     * In case of problems, we now want to return a positive
4456
     * value (a negative one would indicate that the `merge`
4457
     * command needs to be rescheduled).
4458
     */
4459
0
    ret = !!run_git_commit(git_path_merge_msg(r), reflog_action,
4460
0
               opts, run_commit_flags);
4461
4462
0
  if (!ret && flags & TODO_EDIT_MERGE_MSG) {
4463
0
  fast_forward_edit:
4464
0
    *check_todo = 1;
4465
0
    run_commit_flags |= AMEND_MSG | EDIT_MSG | VERIFY_MSG;
4466
0
    ret = !!run_git_commit(NULL, reflog_action, opts,
4467
0
               run_commit_flags);
4468
0
  }
4469
4470
4471
0
leave_merge:
4472
0
  strbuf_release(&ref_name);
4473
0
  rollback_lock_file(&lock);
4474
0
  commit_list_free(to_merge);
4475
0
  commit_list_free(bases);
4476
0
  return ret;
4477
0
}
4478
4479
static int write_update_refs_state(struct string_list *refs_to_oids)
4480
0
{
4481
0
  int result = 0;
4482
0
  struct lock_file lock = LOCK_INIT;
4483
0
  FILE *fp = NULL;
4484
0
  struct string_list_item *item;
4485
0
  char *path;
4486
4487
0
  path = rebase_path_update_refs(the_repository->gitdir);
4488
4489
0
  if (!refs_to_oids->nr) {
4490
0
    if (unlink(path) && errno != ENOENT)
4491
0
      result = error_errno(_("could not unlink: %s"), path);
4492
0
    goto cleanup;
4493
0
  }
4494
4495
0
  if (safe_create_leading_directories(the_repository, path)) {
4496
0
    result = error(_("unable to create leading directories of %s"),
4497
0
             path);
4498
0
    goto cleanup;
4499
0
  }
4500
4501
0
  if (hold_lock_file_for_update(&lock, path, 0) < 0) {
4502
0
    result = error(_("another 'rebase' process appears to be running; "
4503
0
         "'%s.lock' already exists"),
4504
0
             path);
4505
0
    goto cleanup;
4506
0
  }
4507
4508
0
  fp = fdopen_lock_file(&lock, "w");
4509
0
  if (!fp) {
4510
0
    result = error_errno(_("could not open '%s' for writing"), path);
4511
0
    rollback_lock_file(&lock);
4512
0
    goto cleanup;
4513
0
  }
4514
4515
0
  for_each_string_list_item(item, refs_to_oids) {
4516
0
    struct update_ref_record *rec = item->util;
4517
0
    fprintf(fp, "%s\n%s\n%s\n", item->string,
4518
0
      oid_to_hex(&rec->before), oid_to_hex(&rec->after));
4519
0
  }
4520
4521
0
  result = commit_lock_file(&lock);
4522
4523
0
cleanup:
4524
0
  free(path);
4525
0
  return result;
4526
0
}
4527
4528
/*
4529
 * Parse the update-refs file for the current rebase, then remove the
4530
 * refs that do not appear in the todo_list (and have not had updated
4531
 * values stored) and add refs that are in the todo_list but not
4532
 * represented in the update-refs file.
4533
 *
4534
 * If there are changes to the update-refs list, then write the new state
4535
 * to disk.
4536
 */
4537
void todo_list_filter_update_refs(struct repository *r,
4538
          struct todo_list *todo_list)
4539
0
{
4540
0
  int i;
4541
0
  int updated = 0;
4542
0
  struct string_list update_refs = STRING_LIST_INIT_DUP;
4543
4544
0
  sequencer_get_update_refs_state(r->gitdir, &update_refs);
4545
4546
  /*
4547
   * For each item in the update_refs list, if it has no updated
4548
   * value and does not appear in the todo_list, then remove it
4549
   * from the update_refs list.
4550
   */
4551
0
  for (i = 0; i < update_refs.nr; i++) {
4552
0
    int j;
4553
0
    int found = 0;
4554
0
    const char *ref = update_refs.items[i].string;
4555
0
    size_t reflen = strlen(ref);
4556
0
    struct update_ref_record *rec = update_refs.items[i].util;
4557
4558
    /* OID already stored as updated. */
4559
0
    if (!is_null_oid(&rec->after))
4560
0
      continue;
4561
4562
0
    for (j = 0; !found && j < todo_list->nr; j++) {
4563
0
      struct todo_item *item = &todo_list->items[j];
4564
0
      const char *arg = todo_list->buf.buf + item->arg_offset;
4565
4566
0
      if (item->command != TODO_UPDATE_REF)
4567
0
        continue;
4568
4569
0
      if (item->arg_len != reflen ||
4570
0
          strncmp(arg, ref, reflen))
4571
0
        continue;
4572
4573
0
      found = 1;
4574
0
    }
4575
4576
0
    if (!found) {
4577
0
      free(update_refs.items[i].string);
4578
0
      free(update_refs.items[i].util);
4579
4580
0
      update_refs.nr--;
4581
0
      MOVE_ARRAY(update_refs.items + i, update_refs.items + i + 1, update_refs.nr - i);
4582
4583
0
      updated = 1;
4584
0
      i--;
4585
0
    }
4586
0
  }
4587
4588
  /*
4589
   * For each todo_item, check if its ref is in the update_refs list.
4590
   * If not, then add it as an un-updated ref.
4591
   */
4592
0
  for (i = 0; i < todo_list->nr; i++) {
4593
0
    struct todo_item *item = &todo_list->items[i];
4594
0
    const char *arg = todo_list->buf.buf + item->arg_offset;
4595
0
    int j, found = 0;
4596
4597
0
    if (item->command != TODO_UPDATE_REF)
4598
0
      continue;
4599
4600
0
    for (j = 0; !found && j < update_refs.nr; j++) {
4601
0
      const char *ref = update_refs.items[j].string;
4602
4603
0
      found = strlen(ref) == item->arg_len &&
4604
0
        !strncmp(ref, arg, item->arg_len);
4605
0
    }
4606
4607
0
    if (!found) {
4608
0
      struct string_list_item *inserted;
4609
0
      struct strbuf argref = STRBUF_INIT;
4610
4611
0
      strbuf_add(&argref, arg, item->arg_len);
4612
0
      inserted = string_list_insert(&update_refs, argref.buf);
4613
0
      inserted->util = init_update_ref_record(argref.buf);
4614
0
      strbuf_release(&argref);
4615
0
      updated = 1;
4616
0
    }
4617
0
  }
4618
4619
0
  if (updated)
4620
0
    write_update_refs_state(&update_refs);
4621
0
  string_list_clear(&update_refs, 1);
4622
0
}
4623
4624
static int do_update_ref(struct repository *r, const char *refname)
4625
0
{
4626
0
  struct string_list_item *item;
4627
0
  struct string_list list = STRING_LIST_INIT_DUP;
4628
4629
0
  if (sequencer_get_update_refs_state(r->gitdir, &list))
4630
0
    return -1;
4631
4632
0
  for_each_string_list_item(item, &list) {
4633
0
    if (!strcmp(item->string, refname)) {
4634
0
      struct update_ref_record *rec = item->util;
4635
0
      if (refs_read_ref(get_main_ref_store(the_repository), "HEAD", &rec->after))
4636
0
        return -1;
4637
0
      break;
4638
0
    }
4639
0
  }
4640
4641
0
  write_update_refs_state(&list);
4642
0
  string_list_clear(&list, 1);
4643
0
  return 0;
4644
0
}
4645
4646
static int do_update_refs(struct repository *r, int quiet)
4647
0
{
4648
0
  int res = 0;
4649
0
  struct string_list_item *item;
4650
0
  struct string_list refs_to_oids = STRING_LIST_INIT_DUP;
4651
0
  struct ref_store *refs = get_main_ref_store(r);
4652
0
  struct strbuf update_msg = STRBUF_INIT;
4653
0
  struct strbuf error_msg = STRBUF_INIT;
4654
4655
0
  if ((res = sequencer_get_update_refs_state(r->gitdir, &refs_to_oids)))
4656
0
    return res;
4657
4658
0
  for_each_string_list_item(item, &refs_to_oids) {
4659
0
    struct update_ref_record *rec = item->util;
4660
0
    int loop_res;
4661
4662
0
    loop_res = refs_update_ref(refs, "rewritten during rebase",
4663
0
             item->string,
4664
0
             &rec->after, &rec->before,
4665
0
             0, UPDATE_REFS_MSG_ON_ERR);
4666
0
    res |= loop_res;
4667
4668
0
    if (quiet)
4669
0
      continue;
4670
4671
0
    if (loop_res)
4672
0
      strbuf_addf(&error_msg, "\t%s\n", item->string);
4673
0
    else
4674
0
      strbuf_addf(&update_msg, "\t%s\n", item->string);
4675
0
  }
4676
4677
0
  if (!quiet &&
4678
0
      (update_msg.len || error_msg.len)) {
4679
0
    fprintf(stderr,
4680
0
      _("Updated the following refs with %s:\n%s"),
4681
0
      "--update-refs",
4682
0
      update_msg.buf);
4683
4684
0
    if (res)
4685
0
      fprintf(stderr,
4686
0
        _("Failed to update the following refs with %s:\n%s"),
4687
0
        "--update-refs",
4688
0
        error_msg.buf);
4689
0
  }
4690
4691
0
  string_list_clear(&refs_to_oids, 1);
4692
0
  strbuf_release(&update_msg);
4693
0
  strbuf_release(&error_msg);
4694
0
  return res;
4695
0
}
4696
4697
static int is_final_fixup(struct todo_list *todo_list)
4698
0
{
4699
0
  int i = todo_list->current;
4700
4701
0
  if (!is_fixup(todo_list->items[i].command))
4702
0
    return 0;
4703
4704
0
  while (++i < todo_list->nr)
4705
0
    if (is_fixup(todo_list->items[i].command))
4706
0
      return 0;
4707
0
    else if (!is_noop(todo_list->items[i].command))
4708
0
      break;
4709
0
  return 1;
4710
0
}
4711
4712
static enum todo_command peek_command(struct todo_list *todo_list, int offset)
4713
0
{
4714
0
  int i;
4715
4716
0
  for (i = todo_list->current + offset; i < todo_list->nr; i++)
4717
0
    if (!is_noop(todo_list->items[i].command))
4718
0
      return todo_list->items[i].command;
4719
4720
0
  return -1;
4721
0
}
4722
4723
static void create_autostash_internal(struct repository *r,
4724
              const char *path,
4725
              const char *refname,
4726
              const char *message,
4727
              bool silent)
4728
0
{
4729
0
  struct strbuf buf = STRBUF_INIT;
4730
0
  struct lock_file lock_file = LOCK_INIT;
4731
0
  int fd;
4732
4733
0
  if (path && refname)
4734
0
    BUG("can only pass path or refname");
4735
4736
0
  fd = repo_hold_locked_index(r, &lock_file, 0);
4737
0
  refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
4738
0
  if (0 <= fd)
4739
0
    repo_update_index_if_able(r, &lock_file);
4740
0
  rollback_lock_file(&lock_file);
4741
4742
0
  if (has_unstaged_changes(r, 1) ||
4743
0
      has_uncommitted_changes(r, 1)) {
4744
0
    struct child_process stash = CHILD_PROCESS_INIT;
4745
0
    struct reset_working_tree_options ropts = {
4746
0
      .flags = RESET_WORKING_TREE_HARD |
4747
0
         RESET_WORKING_TREE_UPDATE_HEAD,
4748
0
    };
4749
0
    struct object_id oid;
4750
4751
0
    strvec_pushl(&stash.args,
4752
0
           "stash", "create",
4753
0
           message ? message : "autostash", NULL);
4754
0
    stash.git_cmd = 1;
4755
0
    stash.no_stdin = 1;
4756
0
    strbuf_reset(&buf);
4757
0
    if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
4758
0
      die(_("Cannot autostash"));
4759
0
    strbuf_trim_trailing_newline(&buf);
4760
0
    if (repo_get_oid(r, buf.buf, &oid))
4761
0
      die(_("Unexpected stash response: '%s'"),
4762
0
          buf.buf);
4763
0
    strbuf_reset(&buf);
4764
0
    strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
4765
4766
0
    if (path) {
4767
0
      if (safe_create_leading_directories_const(the_repository, path))
4768
0
        die(_("Could not create directory for '%s'"),
4769
0
            path);
4770
0
      write_file(path, "%s", oid_to_hex(&oid));
4771
0
    } else {
4772
0
      refs_update_ref(get_main_ref_store(r), "", refname,
4773
0
          &oid, null_oid(the_hash_algo), 0, UPDATE_REFS_DIE_ON_ERR);
4774
0
    }
4775
4776
0
    if (!silent)
4777
0
      printf(_("Created autostash: %s\n"), buf.buf);
4778
0
    if (reset_working_tree(r, &ropts) < 0)
4779
0
      die(_("could not reset --hard"));
4780
0
    discard_index(r->index);
4781
0
    if (repo_read_index(r) < 0)
4782
0
      die(_("could not read index"));
4783
0
  }
4784
0
  strbuf_release(&buf);
4785
0
}
4786
4787
void create_autostash(struct repository *r, const char *path)
4788
0
{
4789
0
  create_autostash_internal(r, path, NULL, NULL, false);
4790
0
}
4791
4792
void create_autostash_ref(struct repository *r, const char *refname,
4793
        const char *message, bool silent)
4794
0
{
4795
0
  create_autostash_internal(r, NULL, refname, message, silent);
4796
0
}
4797
4798
static enum stash_apply_result do_stash_apply(const char *stash_oid,
4799
                const char *label_ours,
4800
                const char *label_theirs,
4801
                const char *label_base)
4802
0
{
4803
0
  struct child_process child = CHILD_PROCESS_INIT;
4804
4805
0
  child.git_cmd = 1;
4806
0
  child.no_stdout = 1;
4807
0
  child.no_stderr = 1;
4808
0
  strvec_push(&child.args, "stash");
4809
0
  strvec_push(&child.args, "apply");
4810
0
  if (label_ours)
4811
0
    strvec_pushf(&child.args, "--label-ours=%s", label_ours);
4812
0
  if (label_theirs)
4813
0
    strvec_pushf(&child.args, "--label-theirs=%s", label_theirs);
4814
0
  if (label_base)
4815
0
    strvec_pushf(&child.args, "--label-base=%s", label_base);
4816
0
  strvec_push(&child.args, stash_oid);
4817
4818
0
  switch (run_command(&child)) {
4819
0
  case 0:
4820
0
    return STASH_APPLY_CLEAN;
4821
0
  case STASH_APPLY_CONFLICT:
4822
0
    return STASH_APPLY_CONFLICT;
4823
0
  default:
4824
0
    return STASH_APPLY_ERROR;
4825
0
  }
4826
0
}
4827
4828
static enum stash_apply_result apply_save_autostash_oid(const char *stash_oid,
4829
              int attempt_apply,
4830
              const char *label_ours,
4831
              const char *label_theirs,
4832
              const char *label_base,
4833
              const char *stash_msg)
4834
0
{
4835
0
  enum stash_apply_result ret = STASH_APPLY_CLEAN;
4836
4837
0
  if (attempt_apply)
4838
0
    ret = do_stash_apply(stash_oid, label_ours, label_theirs,
4839
0
             label_base);
4840
4841
0
  if (attempt_apply && ret == STASH_APPLY_CLEAN)
4842
0
    fprintf(stderr, _("Applied autostash.\n"));
4843
0
  else {
4844
0
    struct child_process store = CHILD_PROCESS_INIT;
4845
4846
0
    store.git_cmd = 1;
4847
0
    strvec_push(&store.args, "stash");
4848
0
    strvec_push(&store.args, "store");
4849
0
    strvec_push(&store.args, "-m");
4850
0
    strvec_push(&store.args, stash_msg ? stash_msg : "autostash");
4851
0
    strvec_push(&store.args, "-q");
4852
0
    strvec_push(&store.args, stash_oid);
4853
0
    if (run_command(&store))
4854
0
      ret = error(_("cannot store %s"), stash_oid);
4855
0
    else if (attempt_apply && ret == STASH_APPLY_CONFLICT)
4856
0
      fprintf(stderr,
4857
0
        _("Your local changes are stashed, however applying them\n"
4858
0
          "resulted in conflicts.  You can either resolve the conflicts\n"
4859
0
          "and then discard the stash with \"git stash drop\", or, if you\n"
4860
0
          "do not want to resolve them now, run \"git reset --hard\" and\n"
4861
0
          "apply the local changes later by running \"git stash pop\".\n"));
4862
0
    else if (attempt_apply)
4863
0
      ret = error(_("could not apply autostash; "
4864
0
              "your changes are safe in the stash"));
4865
0
    else
4866
0
      fprintf(stderr,
4867
0
        _("Autostash exists; creating a new stash entry.\n"
4868
0
          "Your changes are safe in the stash.\n"
4869
0
          "You can run \"git stash pop\" or"
4870
0
          " \"git stash drop\" at any time.\n"));
4871
0
  }
4872
4873
0
  return ret;
4874
0
}
4875
4876
static enum stash_apply_result apply_save_autostash(const char *path,
4877
                int attempt_apply)
4878
0
{
4879
0
  struct strbuf stash_oid = STRBUF_INIT;
4880
0
  enum stash_apply_result ret = STASH_APPLY_CLEAN;
4881
4882
0
  if (!read_oneliner(&stash_oid, path,
4883
0
         READ_ONELINER_SKIP_IF_EMPTY)) {
4884
0
    strbuf_release(&stash_oid);
4885
0
    return STASH_APPLY_CLEAN;
4886
0
  }
4887
0
  strbuf_trim(&stash_oid);
4888
4889
0
  ret = apply_save_autostash_oid(stash_oid.buf, attempt_apply,
4890
0
              NULL, NULL, NULL, NULL);
4891
4892
0
  unlink(path);
4893
0
  strbuf_release(&stash_oid);
4894
0
  return ret;
4895
0
}
4896
4897
enum stash_apply_result save_autostash(const char *path)
4898
0
{
4899
0
  return apply_save_autostash(path, 0);
4900
0
}
4901
4902
enum stash_apply_result apply_autostash(const char *path)
4903
0
{
4904
0
  return apply_save_autostash(path, 1);
4905
0
}
4906
4907
enum stash_apply_result apply_autostash_oid(const char *stash_oid)
4908
0
{
4909
0
  return apply_save_autostash_oid(stash_oid, 1, NULL, NULL, NULL, NULL);
4910
0
}
4911
4912
static enum stash_apply_result apply_save_autostash_ref(struct repository *r,
4913
              const char *refname,
4914
              int attempt_apply,
4915
              const char *label_ours,
4916
              const char *label_theirs,
4917
              const char *label_base,
4918
              const char *stash_msg)
4919
0
{
4920
0
  struct object_id stash_oid;
4921
0
  char stash_oid_hex[GIT_MAX_HEXSZ + 1];
4922
0
  int flag;
4923
0
  enum stash_apply_result ret;
4924
4925
0
  if (!refs_ref_exists(get_main_ref_store(r), refname))
4926
0
    return STASH_APPLY_CLEAN;
4927
4928
0
  if (!refs_resolve_ref_unsafe(get_main_ref_store(r), refname,
4929
0
             RESOLVE_REF_READING, &stash_oid, &flag))
4930
0
    return STASH_APPLY_ERROR;
4931
0
  if (flag & REF_ISSYMREF)
4932
0
    return error(_("autostash reference is a symref"));
4933
4934
0
  oid_to_hex_r(stash_oid_hex, &stash_oid);
4935
0
  ret = apply_save_autostash_oid(stash_oid_hex, attempt_apply,
4936
0
               label_ours, label_theirs, label_base,
4937
0
               stash_msg);
4938
4939
0
  refs_delete_ref(get_main_ref_store(r), "", refname,
4940
0
      &stash_oid, REF_NO_DEREF);
4941
4942
0
  return ret;
4943
0
}
4944
4945
enum stash_apply_result save_autostash_ref(struct repository *r,
4946
             const char *refname)
4947
0
{
4948
0
  return apply_save_autostash_ref(r, refname, 0,
4949
0
          NULL, NULL, NULL, NULL);
4950
0
}
4951
4952
enum stash_apply_result apply_autostash_ref(struct repository *r,
4953
              const char *refname,
4954
              const char *label_ours,
4955
              const char *label_theirs,
4956
              const char *label_base,
4957
              const char *stash_msg)
4958
0
{
4959
0
  return apply_save_autostash_ref(r, refname, 1,
4960
0
          label_ours, label_theirs, label_base,
4961
0
          stash_msg);
4962
0
}
4963
4964
static int checkout_onto(struct repository *r, struct replay_opts *opts,
4965
       const char *onto_name, const struct object_id *onto,
4966
       const struct object_id *orig_head)
4967
0
{
4968
0
  struct reset_working_tree_options ropts = {
4969
0
    .oid = onto,
4970
0
    .orig_head = orig_head,
4971
0
    .flags = RESET_WORKING_TREE_DETACH |
4972
0
       RESET_WORKING_TREE_UPDATE_HEAD |
4973
0
       RESET_WORKING_TREE_UPDATE_ORIG_HEAD |
4974
0
       RESET_WORKING_TREE_RUN_POST_CHECKOUT_HOOK,
4975
0
    .head_msg = reflog_message(opts, "start", "checkout %s",
4976
0
             onto_name),
4977
0
    .default_reflog_action = sequencer_reflog_action(opts)
4978
0
  };
4979
0
  if (reset_working_tree(r, &ropts)) {
4980
0
    apply_autostash(rebase_path_autostash());
4981
0
    sequencer_remove_state(opts);
4982
0
    return error(_("could not detach HEAD"));
4983
0
  }
4984
4985
0
  return 0;
4986
0
}
4987
4988
static int stopped_at_head(struct repository *r)
4989
0
{
4990
0
  struct object_id head;
4991
0
  struct commit *commit;
4992
0
  struct commit_message message;
4993
4994
0
  if (repo_get_oid(r, "HEAD", &head) ||
4995
0
      !(commit = lookup_commit(r, &head)) ||
4996
0
      repo_parse_commit(r, commit) || get_message(commit, &message))
4997
0
    fprintf(stderr, _("Stopped at HEAD\n"));
4998
0
  else {
4999
0
    fprintf(stderr, _("Stopped at %s\n"), message.label);
5000
0
    free_message(commit, &message);
5001
0
  }
5002
0
  return 0;
5003
5004
0
}
5005
5006
static int reread_todo_if_changed(struct repository *r,
5007
          struct todo_list *todo_list,
5008
          struct replay_opts *opts)
5009
0
{
5010
0
  int offset;
5011
0
  struct strbuf buf = STRBUF_INIT;
5012
5013
0
  if (strbuf_read_file_or_whine(&buf, get_todo_path(opts)) < 0)
5014
0
    return -1;
5015
0
  offset = get_item_line_offset(todo_list, todo_list->current + 1);
5016
0
  if (buf.len != todo_list->buf.len - offset ||
5017
0
      memcmp(buf.buf, todo_list->buf.buf + offset, buf.len)) {
5018
    /* Reread the todo file if it has changed. */
5019
0
    todo_list_release(todo_list);
5020
0
    if (read_populate_todo(r, todo_list, opts))
5021
0
      return -1; /* message was printed */
5022
    /* `current` will be incremented on return */
5023
0
    todo_list->current = -1;
5024
0
  }
5025
0
  strbuf_release(&buf);
5026
5027
0
  return 0;
5028
0
}
5029
5030
static const char rescheduled_advice[] =
5031
N_("Could not execute the todo command\n"
5032
"\n"
5033
"    %.*s"
5034
"\n"
5035
"It has been rescheduled; To edit the command before continuing, please\n"
5036
"edit the todo list first:\n"
5037
"\n"
5038
"    git rebase --edit-todo\n"
5039
"    git rebase --continue\n");
5040
5041
static int pick_one_commit(struct repository *r,
5042
         struct todo_list *todo_list,
5043
         struct replay_opts *opts,
5044
         int *check_todo, int* reschedule)
5045
0
{
5046
0
  enum pick_result pick_res;
5047
0
  struct todo_item *item = todo_list->items + todo_list->current;
5048
0
  const char *arg = todo_item_get_arg(todo_list, item);
5049
5050
0
  pick_res = do_pick_commit(r, item, opts, is_final_fixup(todo_list),
5051
0
          check_todo);
5052
0
  if (!is_rebase_i(opts))
5053
0
    switch (pick_res) {
5054
0
    case PICK_RESULT_ERROR:
5055
0
      return -1;
5056
0
    case PICK_RESULT_CONFLICTS:
5057
0
      return 1;
5058
0
    default:
5059
0
      return 0;
5060
0
    }
5061
5062
0
  if (pick_res == PICK_RESULT_ERROR) {
5063
    /* Reschedule */
5064
0
    *reschedule = 1;
5065
0
    return -1;
5066
0
  } else if (item->command == TODO_EDIT) {
5067
0
    struct commit *commit = item->commit;
5068
0
    int res = pick_res == PICK_RESULT_CONFLICTS;
5069
0
    int to_amend = pick_res != PICK_RESULT_CONFLICTS &&
5070
0
        pick_res != PICK_RESULT_DROPPED;
5071
5072
    /*
5073
     * NEEDSWORK: Do not record the commit as rewritten when
5074
     * continuing if it was dropped. Does it even make sense
5075
     * to stop if the commit was dropped?
5076
     */
5077
0
    if (pick_res == PICK_RESULT_OK ||
5078
0
        pick_res == PICK_RESULT_DROPPED) {
5079
0
      if (!opts->verbose)
5080
0
        term_clear_line();
5081
0
      fprintf(stderr, _("Stopped at %s...  %.*s\n"),
5082
0
        short_commit_name(r, commit), item->arg_len, arg);
5083
0
    }
5084
0
    return error_with_patch(r, commit, arg, item->arg_len, opts,
5085
0
          res, to_amend);
5086
0
  } else if (pick_res == PICK_RESULT_OK) {
5087
0
    record_in_rewritten(&item->commit->object.oid,
5088
0
            peek_command(todo_list, 1));
5089
0
    return 0;
5090
0
  } else if (pick_res == PICK_RESULT_DROPPED) {
5091
0
    if (is_final_fixup(todo_list))
5092
0
      flush_rewritten_pending();
5093
0
    return 0;
5094
0
  } else if (pick_res == PICK_RESULT_CONFLICTS &&
5095
0
       is_fixup(item->command)) {
5096
0
    return error_failed_squash(r, item->commit, opts,
5097
0
             item->arg_len, arg);
5098
0
  } else if (pick_res == PICK_RESULT_CONFLICTS) {
5099
0
    int to_amend = 0;
5100
0
    struct object_id oid;
5101
5102
    /*
5103
     * If we are rewording and have either
5104
     * fast-forwarded already, or are about to
5105
     * create a new root commit, we want to amend,
5106
     * otherwise we do not.
5107
     */
5108
0
    if (item->command == TODO_REWORD &&
5109
0
        !repo_get_oid(r, "HEAD", &oid) &&
5110
0
        (oideq(&item->commit->object.oid, &oid) ||
5111
0
         (opts->have_squash_onto &&
5112
0
          oideq(&opts->squash_onto, &oid))))
5113
0
      to_amend = 1;
5114
5115
0
    return error_with_patch(r, item->commit, arg, item->arg_len,
5116
0
          opts, 1, to_amend);
5117
0
  }
5118
5119
0
  BUG("Unhandled return value from do_pick_commit()");
5120
0
}
5121
5122
static int pick_commits(struct repository *r,
5123
      struct todo_list *todo_list,
5124
      struct replay_opts *opts)
5125
0
{
5126
0
  struct replay_ctx *ctx = opts->ctx;
5127
0
  int res = 0, reschedule = 0;
5128
5129
0
  if (opts->allow_ff)
5130
0
    ASSERT(!(opts->signoff || opts->no_commit ||
5131
0
       opts->record_origin || should_edit(opts) ||
5132
0
       opts->committer_date_is_author_date ||
5133
0
       opts->ignore_date));
5134
0
  if (read_and_refresh_cache(r, opts))
5135
0
    return -1;
5136
5137
0
  unlink(rebase_path_message());
5138
0
  unlink(rebase_path_stopped_sha());
5139
0
  unlink(rebase_path_amend());
5140
0
  unlink(rebase_path_patch());
5141
5142
0
  while (todo_list->current < todo_list->nr) {
5143
0
    struct todo_item *item = todo_list->items + todo_list->current;
5144
0
    const char *arg = todo_item_get_arg(todo_list, item);
5145
0
    int check_todo = 0;
5146
5147
0
    if (save_todo(todo_list, opts, reschedule))
5148
0
      return -1;
5149
0
    if (is_rebase_i(opts)) {
5150
0
      if (item->command != TODO_COMMENT) {
5151
0
        FILE *f = fopen(rebase_path_msgnum(), "w");
5152
5153
0
        todo_list->done_nr++;
5154
5155
0
        if (f) {
5156
0
          fprintf(f, "%d\n", todo_list->done_nr);
5157
0
          fclose(f);
5158
0
        }
5159
0
        if (!opts->quiet)
5160
0
          fprintf(stderr, _("Rebasing (%d/%d)%s"),
5161
0
            todo_list->done_nr,
5162
0
            todo_list->total_nr,
5163
0
            opts->verbose ? "\n" : "\r");
5164
0
      }
5165
0
      unlink(rebase_path_author_script());
5166
0
      unlink(git_path_merge_head(r));
5167
0
      refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
5168
0
          NULL, REF_NO_DEREF);
5169
0
      refs_delete_ref(get_main_ref_store(r), "", "REBASE_HEAD",
5170
0
          NULL, REF_NO_DEREF);
5171
5172
0
      if (item->command == TODO_BREAK) {
5173
0
        if (!opts->verbose)
5174
0
          term_clear_line();
5175
0
        return stopped_at_head(r);
5176
0
      }
5177
0
    }
5178
0
    strbuf_reset(&ctx->message);
5179
0
    ctx->have_message = 0;
5180
0
    if (item->command <= TODO_SQUASH) {
5181
0
      res = pick_one_commit(r, todo_list, opts, &check_todo,
5182
0
                &reschedule);
5183
0
      if (!res && item->command == TODO_EDIT)
5184
0
        return 0;
5185
0
    } else if (item->command == TODO_EXEC) {
5186
0
      char *end_of_arg = (char *)(arg + item->arg_len);
5187
0
      int saved = *end_of_arg;
5188
5189
0
      if (!opts->verbose)
5190
0
        term_clear_line();
5191
0
      *end_of_arg = '\0';
5192
0
      res = do_exec(r, arg, opts->quiet);
5193
0
      *end_of_arg = saved;
5194
5195
0
      if (res) {
5196
0
        if (opts->reschedule_failed_exec)
5197
0
          reschedule = 1;
5198
0
      }
5199
0
      check_todo = 1;
5200
0
    } else if (item->command == TODO_LABEL) {
5201
0
      if ((res = do_label(r, arg, item->arg_len)))
5202
0
        reschedule = 1;
5203
0
    } else if (item->command == TODO_RESET) {
5204
0
      if ((res = do_reset(r, arg, item->arg_len, opts)))
5205
0
        reschedule = 1;
5206
0
    } else if (item->command == TODO_MERGE) {
5207
0
      if ((res = do_merge(r, item->commit, arg, item->arg_len,
5208
0
              item->flags, &check_todo, opts)) < 0)
5209
0
        reschedule = 1;
5210
0
      else if (item->commit)
5211
0
        record_in_rewritten(&item->commit->object.oid,
5212
0
                peek_command(todo_list, 1));
5213
0
      if (res > 0)
5214
        /* failed with merge conflicts */
5215
0
        return error_with_patch(r, item->commit,
5216
0
              arg, item->arg_len,
5217
0
              opts, res, 0);
5218
0
    } else if (item->command == TODO_UPDATE_REF) {
5219
0
      struct strbuf ref = STRBUF_INIT;
5220
0
      strbuf_add(&ref, arg, item->arg_len);
5221
0
      if ((res = do_update_ref(r, ref.buf)))
5222
0
        reschedule = 1;
5223
0
      strbuf_release(&ref);
5224
0
    } else if (!is_noop(item->command))
5225
0
      return error(_("unknown command %d"), item->command);
5226
5227
0
    if (reschedule) {
5228
0
      advise(_(rescheduled_advice),
5229
0
             get_item_line_length(todo_list,
5230
0
                todo_list->current),
5231
0
             get_item_line(todo_list, todo_list->current));
5232
0
      if (save_todo(todo_list, opts, reschedule))
5233
0
        return -1;
5234
0
      if (item->commit)
5235
0
        write_rebase_head(&item->commit->object.oid);
5236
0
    } else if (is_rebase_i(opts) && check_todo && !res &&
5237
0
         reread_todo_if_changed(r, todo_list, opts)) {
5238
0
      return -1;
5239
0
    }
5240
5241
0
    if (res)
5242
0
      return res;
5243
5244
0
    todo_list->current++;
5245
0
  }
5246
5247
0
  if (is_rebase_i(opts)) {
5248
0
    struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
5249
0
    struct stat st;
5250
5251
0
    if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
5252
0
        starts_with(head_ref.buf, "refs/")) {
5253
0
      const char *msg;
5254
0
      struct object_id head, orig;
5255
0
      int res;
5256
5257
0
      if (repo_get_oid(r, "HEAD", &head)) {
5258
0
        res = error(_("cannot read HEAD"));
5259
0
cleanup_head_ref:
5260
0
        strbuf_release(&head_ref);
5261
0
        strbuf_release(&buf);
5262
0
        return res;
5263
0
      }
5264
0
      if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
5265
0
          get_oid_hex(buf.buf, &orig)) {
5266
0
        res = error(_("could not read orig-head"));
5267
0
        goto cleanup_head_ref;
5268
0
      }
5269
0
      strbuf_reset(&buf);
5270
0
      if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
5271
0
        res = error(_("could not read 'onto'"));
5272
0
        goto cleanup_head_ref;
5273
0
      }
5274
0
      msg = reflog_message(opts, "finish", "%s onto %s",
5275
0
        head_ref.buf, buf.buf);
5276
0
      if (refs_update_ref(get_main_ref_store(the_repository), msg, head_ref.buf, &head, &orig,
5277
0
              REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
5278
0
        res = error(_("could not update %s"),
5279
0
          head_ref.buf);
5280
0
        goto cleanup_head_ref;
5281
0
      }
5282
0
      msg = reflog_message(opts, "finish", "returning to %s",
5283
0
        head_ref.buf);
5284
0
      if (refs_update_symref(get_main_ref_store(the_repository), "HEAD", head_ref.buf, msg)) {
5285
0
        res = error(_("could not update HEAD to %s"),
5286
0
          head_ref.buf);
5287
0
        goto cleanup_head_ref;
5288
0
      }
5289
0
      strbuf_reset(&buf);
5290
0
    }
5291
5292
0
    if (opts->verbose) {
5293
0
      struct rev_info log_tree_opt;
5294
0
      struct object_id orig, head;
5295
5296
0
      memset(&log_tree_opt, 0, sizeof(log_tree_opt));
5297
0
      repo_init_revisions(r, &log_tree_opt, NULL);
5298
0
      log_tree_opt.diff = 1;
5299
0
      log_tree_opt.diffopt.output_format =
5300
0
        DIFF_FORMAT_DIFFSTAT;
5301
0
      log_tree_opt.disable_stdin = 1;
5302
5303
0
      if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
5304
0
          !repo_get_oid(r, buf.buf, &orig) &&
5305
0
          !repo_get_oid(r, "HEAD", &head)) {
5306
0
        diff_tree_oid(&orig, &head, "",
5307
0
                &log_tree_opt.diffopt);
5308
0
        log_tree_diff_flush(&log_tree_opt);
5309
0
      }
5310
0
      release_revisions(&log_tree_opt);
5311
0
    }
5312
0
    flush_rewritten_pending();
5313
0
    if (!stat(rebase_path_rewritten_list(), &st) &&
5314
0
        st.st_size > 0) {
5315
0
      struct child_process child = CHILD_PROCESS_INIT;
5316
0
      struct run_hooks_opt hook_opt = RUN_HOOKS_OPT_INIT;
5317
5318
0
      child.in = open(rebase_path_rewritten_list(), O_RDONLY);
5319
0
      child.git_cmd = 1;
5320
0
      strvec_push(&child.args, "notes");
5321
0
      strvec_push(&child.args, "copy");
5322
0
      strvec_push(&child.args, "--for-rewrite=rebase");
5323
      /* we don't care if this copying failed */
5324
0
      run_command(&child);
5325
5326
0
      hook_opt.path_to_stdin = rebase_path_rewritten_list();
5327
0
      strvec_push(&hook_opt.args, "rebase");
5328
0
      run_hooks_opt(r, "post-rewrite", &hook_opt);
5329
0
    }
5330
0
    apply_autostash(rebase_path_autostash());
5331
5332
0
    if (!opts->quiet) {
5333
0
      if (!opts->verbose)
5334
0
        term_clear_line();
5335
0
      fprintf(stderr,
5336
0
        _("Successfully rebased and updated %s.\n"),
5337
0
        head_ref.buf);
5338
0
    }
5339
5340
0
    strbuf_release(&buf);
5341
0
    strbuf_release(&head_ref);
5342
5343
0
    if (do_update_refs(r, opts->quiet))
5344
0
      return -1;
5345
0
  }
5346
5347
  /*
5348
   * Sequence of picks finished successfully; cleanup by
5349
   * removing the .git/sequencer directory
5350
   */
5351
0
  return sequencer_remove_state(opts);
5352
0
}
5353
5354
static int continue_single_pick(struct repository *r, struct replay_opts *opts)
5355
0
{
5356
0
  struct child_process cmd = CHILD_PROCESS_INIT;
5357
5358
0
  if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
5359
0
      !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
5360
0
    return error(_("no cherry-pick or revert in progress"));
5361
5362
0
  cmd.git_cmd = 1;
5363
0
  strvec_push(&cmd.args, "commit");
5364
5365
  /*
5366
   * continue_single_pick() handles the case of recovering from a
5367
   * conflict.  should_edit() doesn't handle that case; for a conflict,
5368
   * we want to edit if the user asked for it, or if they didn't specify
5369
   * and stdin is a tty.
5370
   */
5371
0
  if (!opts->edit || (opts->edit < 0 && !isatty(0)))
5372
    /*
5373
     * Include --cleanup=strip as well because we don't want the
5374
     * "# Conflicts:" messages.
5375
     */
5376
0
    strvec_pushl(&cmd.args, "--no-edit", "--cleanup=strip", NULL);
5377
5378
0
  return run_command(&cmd);
5379
0
}
5380
5381
static int commit_staged_changes(struct repository *r,
5382
         struct replay_opts *opts,
5383
         struct todo_list *todo_list)
5384
0
{
5385
0
  struct replay_ctx *ctx = opts->ctx;
5386
0
  unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
5387
0
  unsigned int final_fixup = 0, is_clean;
5388
0
  struct strbuf rev = STRBUF_INIT;
5389
0
  const char *reflog_action = reflog_message(opts, "continue", NULL);
5390
0
  int ret;
5391
5392
0
  if (has_unstaged_changes(r, 1)) {
5393
0
    ret = error(_("cannot rebase: You have unstaged changes."));
5394
0
    goto out;
5395
0
  }
5396
5397
0
  is_clean = !has_uncommitted_changes(r, 0);
5398
5399
0
  if (!is_clean && !file_exists(rebase_path_message())) {
5400
0
    const char *gpg_opt = gpg_sign_opt_quoted(opts);
5401
0
    ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
5402
0
    goto out;
5403
0
  }
5404
5405
0
  if (file_exists(rebase_path_amend())) {
5406
0
    struct object_id head, to_amend;
5407
5408
0
    if (repo_get_oid(r, "HEAD", &head)) {
5409
0
      ret = error(_("cannot amend non-existing commit"));
5410
0
      goto out;
5411
0
    }
5412
5413
0
    if (!read_oneliner(&rev, rebase_path_amend(), 0)) {
5414
0
      ret = error(_("invalid file: '%s'"), rebase_path_amend());
5415
0
      goto out;
5416
0
    }
5417
5418
0
    if (get_oid_hex(rev.buf, &to_amend)) {
5419
0
      ret = error(_("invalid contents: '%s'"),
5420
0
            rebase_path_amend());
5421
0
      goto out;
5422
0
    }
5423
0
    if (!is_clean && !oideq(&head, &to_amend)) {
5424
0
      ret = error(_("\nYou have uncommitted changes in your "
5425
0
              "working tree. Please, commit them\n"
5426
0
              "first and then run 'git rebase "
5427
0
              "--continue' again."));
5428
0
      goto out;
5429
0
    }
5430
    /*
5431
     * When skipping a failed fixup/squash, we need to edit the
5432
     * commit message, the current fixup list and count, and if it
5433
     * was the last fixup/squash in the chain, we need to clean up
5434
     * the commit message and if there was a squash, let the user
5435
     * edit it.
5436
     */
5437
0
    if (!is_clean || !ctx->current_fixup_count)
5438
0
      ; /* this is not the final fixup */
5439
0
    else if (!oideq(&head, &to_amend) ||
5440
0
       !file_exists(rebase_path_stopped_sha())) {
5441
      /* was a final fixup or squash done manually? */
5442
0
      if (!is_fixup(peek_command(todo_list, 0))) {
5443
0
        unlink(rebase_path_fixup_msg());
5444
0
        unlink(rebase_path_squash_msg());
5445
0
        unlink(rebase_path_current_fixups());
5446
0
        strbuf_reset(&ctx->current_fixups);
5447
0
        ctx->current_fixup_count = 0;
5448
0
      }
5449
0
    } else {
5450
      /* we are in a fixup/squash chain */
5451
0
      const char *p = ctx->current_fixups.buf;
5452
0
      int len = ctx->current_fixups.len;
5453
5454
0
      ctx->current_fixup_count--;
5455
0
      if (!len)
5456
0
        BUG("Incorrect current_fixups:\n%s", p);
5457
0
      while (len && p[len - 1] != '\n')
5458
0
        len--;
5459
      /* Remove trailing newline */
5460
0
      if (len)
5461
0
        len--;
5462
0
      strbuf_setlen(&ctx->current_fixups, len);
5463
0
      if (write_message(p, len, rebase_path_current_fixups(),
5464
0
            0) < 0) {
5465
0
        ret = error(_("could not write file: '%s'"),
5466
0
              rebase_path_current_fixups());
5467
0
        goto out;
5468
0
      }
5469
5470
      /*
5471
       * If a fixup/squash in a fixup/squash chain failed, the
5472
       * commit message is already correct, no need to commit
5473
       * it again.
5474
       *
5475
       * Only if it is the final command in the fixup/squash
5476
       * chain, and only if the chain is longer than a single
5477
       * fixup/squash command (which was just skipped), do we
5478
       * actually need to re-commit with a cleaned up commit
5479
       * message.
5480
       */
5481
0
      if (ctx->current_fixup_count > 0 &&
5482
0
          !is_fixup(peek_command(todo_list, 0))) {
5483
0
        final_fixup = 1;
5484
        /*
5485
         * If there was not a single "squash" in the
5486
         * chain, we only need to clean up the commit
5487
         * message, no need to bother the user with
5488
         * opening the commit message in the editor.
5489
         */
5490
0
        if (!seen_squash(ctx) &&
5491
0
            !seen_fixup_edit_msg(ctx))
5492
0
          flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
5493
0
      } else if (is_fixup(peek_command(todo_list, 0))) {
5494
        /*
5495
         * We need to update the squash message to skip
5496
         * the latest commit message.
5497
         */
5498
0
        struct commit *commit;
5499
0
        const char *msg;
5500
0
        const char *path = rebase_path_squash_msg();
5501
0
        const char *encoding = get_commit_output_encoding();
5502
5503
0
        if (parse_head(r, &commit)) {
5504
0
          ret = error(_("could not parse HEAD"));
5505
0
          goto out;
5506
0
        }
5507
5508
0
        p = repo_logmsg_reencode(r, commit, NULL, encoding);
5509
0
        if (!p)  {
5510
0
          ret = error(_("could not parse commit %s"),
5511
0
                oid_to_hex(&commit->object.oid));
5512
0
          goto unuse_commit_buffer;
5513
0
        }
5514
0
        find_commit_subject(p, &msg);
5515
0
        if (write_message(msg, strlen(msg), path, 0)) {
5516
0
          ret = error(_("could not write file: "
5517
0
                   "'%s'"), path);
5518
0
          goto unuse_commit_buffer;
5519
0
        }
5520
5521
0
        ret = 0;
5522
5523
0
      unuse_commit_buffer:
5524
0
        repo_unuse_commit_buffer(r, commit, p);
5525
0
        if (ret)
5526
0
          goto out;
5527
0
      }
5528
0
    }
5529
5530
0
    flags |= AMEND_MSG;
5531
0
  }
5532
5533
0
  if (is_clean) {
5534
0
    if (refs_ref_exists(get_main_ref_store(r),
5535
0
            "CHERRY_PICK_HEAD") &&
5536
0
        refs_delete_ref(get_main_ref_store(r), "",
5537
0
            "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF)) {
5538
0
      ret = error(_("could not remove CHERRY_PICK_HEAD"));
5539
0
      goto out;
5540
0
    }
5541
5542
0
    if (unlink(git_path_merge_msg(r)) && errno != ENOENT) {
5543
0
      ret = error_errno(_("could not remove '%s'"),
5544
0
            git_path_merge_msg(r));
5545
0
      goto out;
5546
0
    }
5547
5548
0
    if (!final_fixup) {
5549
0
      ret = 0;
5550
0
      goto out;
5551
0
    }
5552
0
  }
5553
5554
0
  if (run_git_commit(final_fixup ? NULL : rebase_path_message(),
5555
0
         reflog_action, opts, flags)) {
5556
0
    ret = error(_("could not commit staged changes."));
5557
0
    goto out;
5558
0
  }
5559
5560
0
  unlink(rebase_path_amend());
5561
0
  unlink(git_path_merge_head(r));
5562
0
  refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
5563
0
      NULL, REF_NO_DEREF);
5564
0
  if (final_fixup) {
5565
0
    unlink(rebase_path_fixup_msg());
5566
0
    unlink(rebase_path_squash_msg());
5567
0
  }
5568
0
  if (ctx->current_fixup_count > 0) {
5569
    /*
5570
     * Whether final fixup or not, we just cleaned up the commit
5571
     * message...
5572
     */
5573
0
    unlink(rebase_path_current_fixups());
5574
0
    strbuf_reset(&ctx->current_fixups);
5575
0
    ctx->current_fixup_count = 0;
5576
0
  }
5577
5578
0
  ret = 0;
5579
5580
0
out:
5581
0
  strbuf_release(&rev);
5582
0
  return ret;
5583
0
}
5584
5585
int sequencer_continue(struct repository *r, struct replay_opts *opts)
5586
0
{
5587
0
  struct todo_list todo_list = TODO_LIST_INIT;
5588
0
  int res;
5589
5590
0
  if (read_and_refresh_cache(r, opts))
5591
0
    return -1;
5592
5593
0
  if (read_populate_opts(opts))
5594
0
    return -1;
5595
0
  if (is_rebase_i(opts)) {
5596
0
    if ((res = read_populate_todo(r, &todo_list, opts)))
5597
0
      goto release_todo_list;
5598
5599
0
    if (file_exists(rebase_path_dropped())) {
5600
0
      if ((res = todo_list_check_against_backup(r, opts,
5601
0
                  &todo_list)))
5602
0
        goto release_todo_list;
5603
5604
0
      unlink(rebase_path_dropped());
5605
0
    }
5606
5607
0
    if (commit_staged_changes(r, opts, &todo_list)) {
5608
0
      res = -1;
5609
0
      goto release_todo_list;
5610
0
    }
5611
0
  } else if (!file_exists(get_todo_path(opts)))
5612
0
    return continue_single_pick(r, opts);
5613
0
  else if ((res = read_populate_todo(r, &todo_list, opts)))
5614
0
    goto release_todo_list;
5615
5616
0
  if (!is_rebase_i(opts)) {
5617
    /* Verify that the conflict has been resolved */
5618
0
    if (refs_ref_exists(get_main_ref_store(r),
5619
0
            "CHERRY_PICK_HEAD") ||
5620
0
        refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
5621
0
      res = continue_single_pick(r, opts);
5622
0
      if (res)
5623
0
        goto release_todo_list;
5624
0
    }
5625
0
    if (index_differs_from(r, "HEAD", NULL, 0)) {
5626
0
      res = error_dirty_index(r, opts);
5627
0
      goto release_todo_list;
5628
0
    }
5629
0
    todo_list.current++;
5630
0
  } else if (file_exists(rebase_path_stopped_sha())) {
5631
0
    struct strbuf buf = STRBUF_INIT;
5632
0
    struct object_id oid;
5633
5634
0
    if (read_oneliner(&buf, rebase_path_stopped_sha(),
5635
0
          READ_ONELINER_SKIP_IF_EMPTY) &&
5636
0
        !get_oid_hex(buf.buf, &oid))
5637
0
      record_in_rewritten(&oid, peek_command(&todo_list, 0));
5638
0
    strbuf_release(&buf);
5639
0
  }
5640
5641
0
  res = pick_commits(r, &todo_list, opts);
5642
0
release_todo_list:
5643
0
  todo_list_release(&todo_list);
5644
0
  return res;
5645
0
}
5646
5647
static int single_pick(struct repository *r,
5648
           struct commit *cmit,
5649
           struct replay_opts *opts)
5650
0
{
5651
0
  int check_todo;
5652
0
  struct todo_item item;
5653
5654
0
  item.command = opts->action == REPLAY_PICK ?
5655
0
      TODO_PICK : TODO_REVERT;
5656
0
  item.commit = cmit;
5657
5658
0
  switch (do_pick_commit(r, &item, opts, 0, &check_todo)) {
5659
0
  case PICK_RESULT_ERROR:
5660
0
    return -1;
5661
0
  case PICK_RESULT_CONFLICTS:
5662
0
    return 1;
5663
0
  default:
5664
0
    return 0;
5665
0
  }
5666
5667
0
}
5668
5669
int sequencer_pick_revisions(struct repository *r,
5670
           struct replay_opts *opts)
5671
0
{
5672
0
  struct todo_list todo_list = TODO_LIST_INIT;
5673
0
  struct object_id oid;
5674
0
  int i, res;
5675
5676
0
  assert(opts->revs);
5677
0
  if (read_and_refresh_cache(r, opts)) {
5678
0
    res = -1;
5679
0
    goto out;
5680
0
  }
5681
5682
0
  for (i = 0; i < opts->revs->pending.nr; i++) {
5683
0
    struct object_id oid;
5684
0
    const char *name = opts->revs->pending.objects[i].name;
5685
5686
    /* This happens when using --stdin. */
5687
0
    if (!strlen(name))
5688
0
      continue;
5689
5690
0
    if (!repo_get_oid(r, name, &oid)) {
5691
0
      if (!lookup_commit_reference_gently(r, &oid, 1)) {
5692
0
        enum object_type type = odb_read_object_info(r->objects,
5693
0
                       &oid, NULL);
5694
0
        res = error(_("%s: can't cherry-pick a %s"),
5695
0
              name, type_name(type));
5696
0
        goto out;
5697
0
      }
5698
0
    } else {
5699
0
      res = error(_("%s: bad revision"), name);
5700
0
      goto out;
5701
0
    }
5702
0
  }
5703
5704
  /*
5705
   * If we were called as "git cherry-pick <commit>", just
5706
   * cherry-pick/revert it, set CHERRY_PICK_HEAD /
5707
   * REVERT_HEAD, and don't touch the sequencer state.
5708
   * This means it is possible to cherry-pick in the middle
5709
   * of a cherry-pick sequence.
5710
   */
5711
0
  if (opts->revs->cmdline.nr == 1 &&
5712
0
      opts->revs->cmdline.rev->whence == REV_CMD_REV &&
5713
0
      opts->revs->no_walk &&
5714
0
      !opts->revs->cmdline.rev->flags) {
5715
0
    struct commit *cmit;
5716
5717
0
    if (prepare_revision_walk(opts->revs)) {
5718
0
      res = error(_("revision walk setup failed"));
5719
0
      goto out;
5720
0
    }
5721
5722
0
    cmit = get_revision(opts->revs);
5723
0
    if (!cmit) {
5724
0
      res = error(_("empty commit set passed"));
5725
0
      goto out;
5726
0
    }
5727
5728
0
    if (get_revision(opts->revs))
5729
0
      BUG("unexpected extra commit from walk");
5730
5731
0
    res = single_pick(r, cmit, opts);
5732
0
    goto out;
5733
0
  }
5734
5735
  /*
5736
   * Start a new cherry-pick/ revert sequence; but
5737
   * first, make sure that an existing one isn't in
5738
   * progress
5739
   */
5740
5741
0
  if (walk_revs_populate_todo(&todo_list, opts) ||
5742
0
      create_seq_dir(r) < 0) {
5743
0
    res = -1;
5744
0
    goto out;
5745
0
  }
5746
5747
0
  if (repo_get_oid(r, "HEAD", &oid) && (opts->action == REPLAY_REVERT)) {
5748
0
    res = error(_("can't revert as initial commit"));
5749
0
    goto out;
5750
0
  }
5751
5752
0
  if (save_head(oid_to_hex(&oid))) {
5753
0
    res = -1;
5754
0
    goto out;
5755
0
  }
5756
5757
0
  if (save_opts(opts)) {
5758
0
    res = -1;
5759
0
    goto out;
5760
0
  }
5761
5762
0
  update_abort_safety_file();
5763
0
  res = pick_commits(r, &todo_list, opts);
5764
5765
0
out:
5766
0
  todo_list_release(&todo_list);
5767
0
  return res;
5768
0
}
5769
5770
void sequencer_format_revert_message(struct repository *r,
5771
             const char *subject,
5772
             const struct commit *commit,
5773
             const struct commit *parent,
5774
             bool use_commit_reference,
5775
             struct strbuf *message)
5776
0
{
5777
0
  const char *orig_subject;
5778
5779
0
  if (use_commit_reference) {
5780
0
    strbuf_commented_addf(message, comment_line_str,
5781
0
              "*** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
5782
0
  } else if (skip_prefix(subject, "Revert \"", &orig_subject) &&
5783
       /*
5784
        * We don't touch pre-existing repeated reverts, because
5785
        * theoretically these can be nested arbitrarily deeply,
5786
        * thus requiring excessive complexity to deal with.
5787
        */
5788
0
       !starts_with(orig_subject, "Revert \"")) {
5789
0
    strbuf_addstr(message, "Reapply \"");
5790
0
    strbuf_addstr(message, orig_subject);
5791
0
    strbuf_addstr(message, "\n");
5792
0
  } else {
5793
0
    strbuf_addstr(message, "Revert \"");
5794
0
    strbuf_addstr(message, subject);
5795
0
    strbuf_addstr(message, "\"\n");
5796
0
  }
5797
0
  strbuf_addstr(message, "\nThis reverts commit ");
5798
0
  refer_to_commit(r, message, commit, use_commit_reference);
5799
5800
0
  if (commit->parents && commit->parents->next) {
5801
0
    strbuf_addstr(message, ", reversing\nchanges made to ");
5802
0
    refer_to_commit(r, message, parent, use_commit_reference);
5803
0
  }
5804
0
  strbuf_addstr(message, ".\n");
5805
0
}
5806
5807
void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
5808
0
{
5809
0
  unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
5810
0
  struct strbuf sob = STRBUF_INIT;
5811
0
  int has_footer;
5812
5813
0
  strbuf_addstr(&sob, sign_off_header);
5814
0
  strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
5815
0
  strbuf_addch(&sob, '\n');
5816
5817
0
  if (!ignore_footer)
5818
0
    strbuf_complete_line(msgbuf);
5819
5820
  /*
5821
   * If the whole message buffer is equal to the sob, pretend that we
5822
   * found a conforming footer with a matching sob
5823
   */
5824
0
  if (msgbuf->len - ignore_footer == sob.len &&
5825
0
      !strncmp(msgbuf->buf, sob.buf, sob.len))
5826
0
    has_footer = 3;
5827
0
  else
5828
0
    has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
5829
5830
0
  if (!has_footer) {
5831
0
    const char *append_newlines = NULL;
5832
0
    size_t len = msgbuf->len - ignore_footer;
5833
5834
0
    if (!len) {
5835
      /*
5836
       * The buffer is completely empty.  Leave foom for
5837
       * the title and body to be filled in by the user.
5838
       */
5839
0
      append_newlines = "\n\n";
5840
0
    } else if (len == 1) {
5841
      /*
5842
       * Buffer contains a single newline.  Add another
5843
       * so that we leave room for the title and body.
5844
       */
5845
0
      append_newlines = "\n";
5846
0
    } else if (msgbuf->buf[len - 2] != '\n') {
5847
      /*
5848
       * Buffer ends with a single newline.  Add another
5849
       * so that there is an empty line between the message
5850
       * body and the sob.
5851
       */
5852
0
      append_newlines = "\n";
5853
0
    } /* else, the buffer already ends with two newlines. */
5854
5855
0
    if (append_newlines)
5856
0
      strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5857
0
        append_newlines, strlen(append_newlines));
5858
0
  }
5859
5860
0
  if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
5861
0
    strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5862
0
        sob.buf, sob.len);
5863
5864
0
  strbuf_release(&sob);
5865
0
}
5866
5867
struct labels_entry {
5868
  struct hashmap_entry entry;
5869
  char label[FLEX_ARRAY];
5870
};
5871
5872
static int labels_cmp(const void *fndata UNUSED,
5873
          const struct hashmap_entry *eptr,
5874
          const struct hashmap_entry *entry_or_key, const void *key)
5875
0
{
5876
0
  const struct labels_entry *a, *b;
5877
5878
0
  a = container_of(eptr, const struct labels_entry, entry);
5879
0
  b = container_of(entry_or_key, const struct labels_entry, entry);
5880
5881
0
  return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
5882
0
}
5883
5884
struct string_entry {
5885
  struct oidmap_entry entry;
5886
  char string[FLEX_ARRAY];
5887
};
5888
5889
struct label_state {
5890
  struct oidmap commit2label;
5891
  struct hashmap labels;
5892
  struct strbuf buf;
5893
  int max_label_length;
5894
};
5895
5896
static const char *label_oid(struct object_id *oid, const char *label,
5897
           struct label_state *state)
5898
0
{
5899
0
  struct labels_entry *labels_entry;
5900
0
  struct string_entry *string_entry;
5901
0
  struct object_id dummy;
5902
0
  int i;
5903
5904
0
  string_entry = oidmap_get(&state->commit2label, oid);
5905
0
  if (string_entry)
5906
0
    return string_entry->string;
5907
5908
  /*
5909
   * For "uninteresting" commits, i.e. commits that are not to be
5910
   * rebased, and which can therefore not be labeled, we use a unique
5911
   * abbreviation of the commit name. This is slightly more complicated
5912
   * than calling repo_find_unique_abbrev() because we also need to make
5913
   * sure that the abbreviation does not conflict with any other
5914
   * label.
5915
   *
5916
   * We disallow "interesting" commits to be labeled by a string that
5917
   * is a valid full-length hash, to ensure that we always can find an
5918
   * abbreviation for any uninteresting commit's names that does not
5919
   * clash with any other label.
5920
   */
5921
0
  strbuf_reset(&state->buf);
5922
0
  if (!label) {
5923
0
    char *p;
5924
5925
0
    strbuf_grow(&state->buf, GIT_MAX_HEXSZ);
5926
0
    label = p = state->buf.buf;
5927
5928
0
    repo_find_unique_abbrev_r(the_repository, p, oid,
5929
0
            default_abbrev);
5930
5931
    /*
5932
     * We may need to extend the abbreviated hash so that there is
5933
     * no conflicting label.
5934
     */
5935
0
    if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
5936
0
      size_t i = strlen(p) + 1;
5937
5938
0
      oid_to_hex_r(p, oid);
5939
0
      for (; i < the_hash_algo->hexsz; i++) {
5940
0
        char save = p[i];
5941
0
        p[i] = '\0';
5942
0
        if (!hashmap_get_from_hash(&state->labels,
5943
0
                 strihash(p), p))
5944
0
          break;
5945
0
        p[i] = save;
5946
0
      }
5947
0
    }
5948
0
  } else {
5949
0
    struct strbuf *buf = &state->buf;
5950
0
    int label_is_utf8 = 1; /* start with this assumption */
5951
0
    size_t max_len = buf->len + state->max_label_length;
5952
5953
    /*
5954
     * Sanitize labels by replacing non-alpha-numeric characters
5955
     * (including white-space ones) by dashes, as they might be
5956
     * illegal in file names (and hence in ref names).
5957
     *
5958
     * Note that we retain non-ASCII UTF-8 characters (identified
5959
     * via the most significant bit). They should be all acceptable
5960
     * in file names.
5961
     *
5962
     * As we will use the labels as names of (loose) refs, it is
5963
     * vital that the name not be longer than the maximum component
5964
     * size of the file system (`NAME_MAX`). We are careful to
5965
     * truncate the label accordingly, allowing for the `.lock`
5966
     * suffix and for the label to be UTF-8 encoded (i.e. we avoid
5967
     * truncating in the middle of a character).
5968
     */
5969
0
    for (; *label && buf->len + 1 < max_len; label++)
5970
0
      if (isalnum(*label) ||
5971
0
          (!label_is_utf8 && (*label & 0x80)))
5972
0
        strbuf_addch(buf, *label);
5973
0
      else if (*label & 0x80) {
5974
0
        const char *p = label;
5975
5976
0
        utf8_width(&p, NULL);
5977
0
        if (p) {
5978
0
          if (buf->len + (p - label) > max_len)
5979
0
            break;
5980
0
          strbuf_add(buf, label, p - label);
5981
0
          label = p - 1;
5982
0
        } else {
5983
0
          label_is_utf8 = 0;
5984
0
          strbuf_addch(buf, *label);
5985
0
        }
5986
      /* avoid leading dash and double-dashes */
5987
0
      } else if (buf->len && buf->buf[buf->len - 1] != '-')
5988
0
        strbuf_addch(buf, '-');
5989
0
    if (!buf->len) {
5990
0
      strbuf_addstr(buf, "rev-");
5991
0
      strbuf_add_unique_abbrev(buf, oid, default_abbrev);
5992
0
    }
5993
0
    label = buf->buf;
5994
5995
0
    if ((buf->len == the_hash_algo->hexsz &&
5996
0
         !get_oid_hex(label, &dummy)) ||
5997
0
        (buf->len == 1 && *label == '#') ||
5998
0
        hashmap_get_from_hash(&state->labels,
5999
0
            strihash(label), label)) {
6000
      /*
6001
       * If the label already exists, or if the label is a
6002
       * valid full OID, or the label is a '#' (which we use
6003
       * as a separator between merge heads and oneline), we
6004
       * append a dash and a number to make it unique.
6005
       */
6006
0
      size_t len = buf->len;
6007
6008
0
      for (i = 2; ; i++) {
6009
0
        strbuf_setlen(buf, len);
6010
0
        strbuf_addf(buf, "-%d", i);
6011
0
        if (!hashmap_get_from_hash(&state->labels,
6012
0
                 strihash(buf->buf),
6013
0
                 buf->buf))
6014
0
          break;
6015
0
      }
6016
6017
0
      label = buf->buf;
6018
0
    }
6019
0
  }
6020
6021
0
  FLEX_ALLOC_STR(labels_entry, label, label);
6022
0
  hashmap_entry_init(&labels_entry->entry, strihash(label));
6023
0
  hashmap_add(&state->labels, &labels_entry->entry);
6024
6025
0
  FLEX_ALLOC_STR(string_entry, string, label);
6026
0
  oidcpy(&string_entry->entry.oid, oid);
6027
0
  oidmap_put(&state->commit2label, string_entry);
6028
6029
0
  return string_entry->string;
6030
0
}
6031
6032
static int make_script_with_merges(struct pretty_print_context *pp,
6033
           struct rev_info *revs, struct strbuf *out,
6034
           unsigned flags)
6035
0
{
6036
0
  int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
6037
0
  int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
6038
0
  int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
6039
0
  int skipped_commit = 0;
6040
0
  struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
6041
0
  struct strbuf label_from_message = STRBUF_INIT;
6042
0
  struct commit_list *commits = NULL, **tail = &commits, *iter;
6043
0
  struct commit_list *tips = NULL, **tips_tail = &tips;
6044
0
  struct commit *commit;
6045
0
  struct oidmap commit2todo = OIDMAP_INIT;
6046
0
  struct string_entry *entry;
6047
0
  struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
6048
0
    shown = OIDSET_INIT;
6049
0
  struct label_state state =
6050
0
    { OIDMAP_INIT, { NULL }, STRBUF_INIT, GIT_MAX_LABEL_LENGTH };
6051
6052
0
  int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
6053
0
  const char *cmd_pick = abbr ? "p" : "pick",
6054
0
    *cmd_label = abbr ? "l" : "label",
6055
0
    *cmd_reset = abbr ? "t" : "reset",
6056
0
    *cmd_merge = abbr ? "m" : "merge";
6057
6058
0
  repo_config_get_int(the_repository, "rebase.maxlabellength", &state.max_label_length);
6059
6060
0
  oidmap_init(&commit2todo, 0);
6061
0
  oidmap_init(&state.commit2label, 0);
6062
0
  hashmap_init(&state.labels, labels_cmp, NULL, 0);
6063
0
  strbuf_init(&state.buf, 32);
6064
0
  load_branch_decorations();
6065
6066
0
  if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
6067
0
    struct labels_entry *onto_label_entry;
6068
0
    struct object_id *oid = &revs->cmdline.rev[0].item->oid;
6069
0
    FLEX_ALLOC_STR(entry, string, "onto");
6070
0
    oidcpy(&entry->entry.oid, oid);
6071
0
    oidmap_put(&state.commit2label, entry);
6072
6073
0
    FLEX_ALLOC_STR(onto_label_entry, label, "onto");
6074
0
    hashmap_entry_init(&onto_label_entry->entry, strihash("onto"));
6075
0
    hashmap_add(&state.labels, &onto_label_entry->entry);
6076
0
  }
6077
6078
  /*
6079
   * First phase:
6080
   * - get onelines for all commits
6081
   * - gather all branch tips (i.e. 2nd or later parents of merges)
6082
   * - label all branch tips
6083
   */
6084
0
  while ((commit = get_revision(revs))) {
6085
0
    struct commit_list *to_merge;
6086
0
    const char *p1, *p2;
6087
0
    struct object_id *oid;
6088
0
    int is_empty;
6089
6090
0
    tail = &commit_list_insert(commit, tail)->next;
6091
0
    oidset_insert(&interesting, &commit->object.oid);
6092
6093
0
    is_empty = is_original_commit_empty(commit);
6094
0
    if (!is_empty && (commit->object.flags & PATCHSAME)) {
6095
0
      if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
6096
0
        warning(_("skipped previously applied commit %s"),
6097
0
          short_commit_name(the_repository, commit));
6098
0
      skipped_commit = 1;
6099
0
      continue;
6100
0
    }
6101
0
    if (is_empty && !keep_empty)
6102
0
      continue;
6103
6104
0
    strbuf_reset(&oneline);
6105
0
    pretty_print_commit(pp, commit, &oneline);
6106
6107
0
    to_merge = commit->parents ? commit->parents->next : NULL;
6108
0
    if (!to_merge) {
6109
      /* non-merge commit: easy case */
6110
0
      strbuf_reset(&buf);
6111
0
      strbuf_addf(&buf, "%s %s %s", cmd_pick,
6112
0
            oid_to_hex(&commit->object.oid),
6113
0
            oneline.buf);
6114
0
      if (is_empty)
6115
0
        strbuf_addf(&buf, " %s empty",
6116
0
              comment_line_str);
6117
6118
0
      FLEX_ALLOC_STR(entry, string, buf.buf);
6119
0
      oidcpy(&entry->entry.oid, &commit->object.oid);
6120
0
      oidmap_put(&commit2todo, entry);
6121
6122
0
      continue;
6123
0
    }
6124
6125
    /* Create a label from the commit message */
6126
0
    strbuf_reset(&label_from_message);
6127
0
    if (skip_prefix(oneline.buf, "# Merge ", &p1) &&
6128
0
        (p1 = strchr(p1, '\'')) &&
6129
0
        (p2 = strchr(++p1, '\'')))
6130
0
      strbuf_add(&label_from_message, p1, p2 - p1);
6131
0
    else if (skip_prefix(oneline.buf, "# Merge pull request ",
6132
0
             &p1) &&
6133
0
       (p1 = strstr(p1, " from ")))
6134
0
      strbuf_addstr(&label_from_message, p1 + strlen(" from "));
6135
0
    else
6136
0
      strbuf_addbuf(&label_from_message, &oneline);
6137
6138
0
    strbuf_reset(&buf);
6139
0
    strbuf_addf(&buf, "%s -C %s",
6140
0
          cmd_merge, oid_to_hex(&commit->object.oid));
6141
6142
    /* label the tips of merged branches */
6143
0
    for (; to_merge; to_merge = to_merge->next) {
6144
0
      const char *label = label_from_message.buf;
6145
0
      const struct name_decoration *decoration =
6146
0
        get_name_decoration(&to_merge->item->object);
6147
6148
0
      if (decoration)
6149
0
        skip_prefix(decoration->name, "refs/heads/",
6150
0
              &label);
6151
6152
0
      oid = &to_merge->item->object.oid;
6153
0
      strbuf_addch(&buf, ' ');
6154
6155
0
      if (!oidset_contains(&interesting, oid)) {
6156
0
        strbuf_addstr(&buf, label_oid(oid, NULL,
6157
0
                    &state));
6158
0
        continue;
6159
0
      }
6160
6161
0
      tips_tail = &commit_list_insert(to_merge->item,
6162
0
              tips_tail)->next;
6163
6164
0
      strbuf_addstr(&buf, label_oid(oid, label, &state));
6165
0
    }
6166
0
    strbuf_addf(&buf, " %s", oneline.buf);
6167
6168
0
    FLEX_ALLOC_STR(entry, string, buf.buf);
6169
0
    oidcpy(&entry->entry.oid, &commit->object.oid);
6170
0
    oidmap_put(&commit2todo, entry);
6171
0
  }
6172
0
  if (skipped_commit)
6173
0
    advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
6174
0
          _("use --reapply-cherry-picks to include skipped commits"));
6175
6176
  /*
6177
   * Second phase:
6178
   * - label branch points
6179
   * - add HEAD to the branch tips
6180
   */
6181
0
  for (iter = commits; iter; iter = iter->next) {
6182
0
    struct commit_list *parent = iter->item->parents;
6183
0
    for (; parent; parent = parent->next) {
6184
0
      struct object_id *oid = &parent->item->object.oid;
6185
0
      if (!oidset_contains(&interesting, oid))
6186
0
        continue;
6187
0
      if (oidset_insert(&child_seen, oid))
6188
0
        label_oid(oid, "branch-point", &state);
6189
0
    }
6190
6191
    /* Add HEAD as implicit "tip of branch" */
6192
0
    if (!iter->next)
6193
0
      tips_tail = &commit_list_insert(iter->item,
6194
0
              tips_tail)->next;
6195
0
  }
6196
6197
  /*
6198
   * Third phase: output the todo list. This is a bit tricky, as we
6199
   * want to avoid jumping back and forth between revisions. To
6200
   * accomplish that goal, we walk backwards from the branch tips,
6201
   * gathering commits not yet shown, reversing the list on the fly,
6202
   * then outputting that list (labeling revisions as needed).
6203
   */
6204
0
  strbuf_addf(out, "%s onto\n", cmd_label);
6205
0
  for (iter = tips; iter; iter = iter->next) {
6206
0
    struct commit_list *list = NULL, *iter2;
6207
6208
0
    commit = iter->item;
6209
0
    if (oidset_contains(&shown, &commit->object.oid))
6210
0
      continue;
6211
0
    entry = oidmap_get(&state.commit2label, &commit->object.oid);
6212
6213
0
    if (entry)
6214
0
      strbuf_addf(out, "\n%s Branch %s\n", comment_line_str, entry->string);
6215
0
    else
6216
0
      strbuf_addch(out, '\n');
6217
6218
0
    while (oidset_contains(&interesting, &commit->object.oid) &&
6219
0
           !oidset_contains(&shown, &commit->object.oid)) {
6220
0
      commit_list_insert(commit, &list);
6221
0
      if (!commit->parents) {
6222
0
        commit = NULL;
6223
0
        break;
6224
0
      }
6225
0
      commit = commit->parents->item;
6226
0
    }
6227
6228
0
    if (!commit)
6229
0
      strbuf_addf(out, "%s %s\n", cmd_reset,
6230
0
            rebase_cousins || root_with_onto ?
6231
0
            "onto" : "[new root]");
6232
0
    else {
6233
0
      const char *to = NULL;
6234
6235
0
      entry = oidmap_get(&state.commit2label,
6236
0
             &commit->object.oid);
6237
0
      if (entry)
6238
0
        to = entry->string;
6239
0
      else if (!rebase_cousins)
6240
0
        to = label_oid(&commit->object.oid, NULL,
6241
0
                 &state);
6242
6243
0
      if (!to || !strcmp(to, "onto"))
6244
0
        strbuf_addf(out, "%s onto\n", cmd_reset);
6245
0
      else {
6246
0
        strbuf_reset(&oneline);
6247
0
        pretty_print_commit(pp, commit, &oneline);
6248
0
        strbuf_addf(out, "%s %s %s\n",
6249
0
              cmd_reset, to, oneline.buf);
6250
0
      }
6251
0
    }
6252
6253
0
    for (iter2 = list; iter2; iter2 = iter2->next) {
6254
0
      struct object_id *oid = &iter2->item->object.oid;
6255
0
      entry = oidmap_get(&commit2todo, oid);
6256
      /* only show if not already upstream */
6257
0
      if (entry)
6258
0
        strbuf_addf(out, "%s\n", entry->string);
6259
0
      entry = oidmap_get(&state.commit2label, oid);
6260
0
      if (entry)
6261
0
        strbuf_addf(out, "%s %s\n",
6262
0
              cmd_label, entry->string);
6263
0
      oidset_insert(&shown, oid);
6264
0
    }
6265
6266
0
    commit_list_free(list);
6267
0
  }
6268
6269
0
  commit_list_free(commits);
6270
0
  commit_list_free(tips);
6271
6272
0
  strbuf_release(&label_from_message);
6273
0
  strbuf_release(&oneline);
6274
0
  strbuf_release(&buf);
6275
6276
0
  oidset_clear(&interesting);
6277
0
  oidset_clear(&child_seen);
6278
0
  oidset_clear(&shown);
6279
0
  oidmap_clear(&commit2todo, 1);
6280
0
  oidmap_clear(&state.commit2label, 1);
6281
0
  hashmap_clear_and_free(&state.labels, struct labels_entry, entry);
6282
0
  strbuf_release(&state.buf);
6283
6284
0
  return 0;
6285
0
}
6286
6287
int sequencer_make_script(struct repository *r, struct strbuf *out,
6288
        struct strvec *argv, unsigned flags)
6289
0
{
6290
0
  char *format = NULL;
6291
0
  struct pretty_print_context pp = {0};
6292
0
  struct rev_info revs;
6293
0
  struct commit *commit;
6294
0
  int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
6295
0
  const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
6296
0
  int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
6297
0
  int reapply_cherry_picks = flags & TODO_LIST_REAPPLY_CHERRY_PICKS;
6298
0
  int skipped_commit = 0;
6299
0
  int ret = 0;
6300
6301
0
  repo_init_revisions(r, &revs, NULL);
6302
0
  revs.verbose_header = 1;
6303
0
  if (!rebase_merges)
6304
0
    revs.max_parents = 1;
6305
0
  revs.cherry_mark = !reapply_cherry_picks;
6306
0
  revs.limited = 1;
6307
0
  revs.reverse = 1;
6308
0
  revs.right_only = 1;
6309
0
  revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
6310
0
  revs.topo_order = 1;
6311
6312
0
  repo_config_get_string(the_repository, "rebase.instructionFormat", &format);
6313
0
  if (!format || !*format) {
6314
0
    free(format);
6315
0
    format = xstrdup("# %s");
6316
0
  }
6317
0
  if (*format != '#') {
6318
0
    char *temp = format;
6319
0
    format = xstrfmt("# %s", temp);
6320
0
    free(temp);
6321
0
  }
6322
6323
0
  get_commit_format(format, &revs);
6324
0
  free(format);
6325
0
  pp.fmt = revs.commit_format;
6326
0
  pp.output_encoding = get_log_output_encoding();
6327
6328
0
  setup_revisions_from_strvec(argv, &revs, NULL);
6329
0
  if (argv->nr > 1) {
6330
0
    ret = error(_("make_script: unhandled options"));
6331
0
    goto cleanup;
6332
0
  }
6333
6334
0
  if (prepare_revision_walk(&revs) < 0) {
6335
0
    ret = error(_("make_script: error preparing revisions"));
6336
0
    goto cleanup;
6337
0
  }
6338
6339
0
  if (rebase_merges) {
6340
0
    ret = make_script_with_merges(&pp, &revs, out, flags);
6341
0
    goto cleanup;
6342
0
  }
6343
6344
0
  while ((commit = get_revision(&revs))) {
6345
0
    int is_empty = is_original_commit_empty(commit);
6346
6347
0
    if (!is_empty && (commit->object.flags & PATCHSAME)) {
6348
0
      if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
6349
0
        warning(_("skipped previously applied commit %s"),
6350
0
          short_commit_name(r, commit));
6351
0
      skipped_commit = 1;
6352
0
      continue;
6353
0
    }
6354
0
    if (is_empty && !keep_empty)
6355
0
      continue;
6356
0
    strbuf_addf(out, "%s %s ", insn,
6357
0
          oid_to_hex(&commit->object.oid));
6358
0
    pretty_print_commit(&pp, commit, out);
6359
0
    if (is_empty)
6360
0
      strbuf_addf(out, " %s empty", comment_line_str);
6361
0
    strbuf_addch(out, '\n');
6362
0
  }
6363
0
  if (skipped_commit)
6364
0
    advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
6365
0
          _("use --reapply-cherry-picks to include skipped commits"));
6366
0
cleanup:
6367
0
  release_revisions(&revs);
6368
0
  return ret;
6369
0
}
6370
6371
/*
6372
 * Add commands after pick and (series of) squash/fixup commands
6373
 * in the todo list.
6374
 */
6375
static void todo_list_add_exec_commands(struct todo_list *todo_list,
6376
          struct string_list *commands)
6377
0
{
6378
0
  struct strbuf *buf = &todo_list->buf;
6379
0
  size_t base_offset = buf->len;
6380
0
  int i, insert, nr = 0, alloc = 0;
6381
0
  struct todo_item *items = NULL, *base_items = NULL;
6382
6383
0
  CALLOC_ARRAY(base_items, commands->nr);
6384
0
  for (i = 0; i < commands->nr; i++) {
6385
0
    size_t command_len = strlen(commands->items[i].string);
6386
6387
0
    strbuf_addstr(buf, commands->items[i].string);
6388
0
    strbuf_addch(buf, '\n');
6389
6390
0
    base_items[i].command = TODO_EXEC;
6391
0
    base_items[i].offset_in_buf = base_offset;
6392
0
    base_items[i].arg_offset = base_offset;
6393
0
    base_items[i].arg_len = command_len;
6394
6395
0
    base_offset += command_len + 1;
6396
0
  }
6397
6398
  /*
6399
   * Insert <commands> after every pick. Here, fixup/squash chains
6400
   * are considered part of the pick, so we insert the commands *after*
6401
   * those chains if there are any.
6402
   *
6403
   * As we insert the exec commands immediately after rearranging
6404
   * any fixups and before the user edits the list, a fixup chain
6405
   * can never contain comments (any comments are empty picks that
6406
   * have been commented out because the user did not specify
6407
   * --keep-empty).  So, it is safe to insert an exec command
6408
   * without looking at the command following a comment.
6409
   */
6410
0
  insert = 0;
6411
0
  for (i = 0; i < todo_list->nr; i++) {
6412
0
    enum todo_command command = todo_list->items[i].command;
6413
0
    if (insert && !is_fixup(command)) {
6414
0
      ALLOC_GROW(items, nr + commands->nr, alloc);
6415
0
      COPY_ARRAY(items + nr, base_items, commands->nr);
6416
0
      nr += commands->nr;
6417
6418
0
      insert = 0;
6419
0
    }
6420
6421
0
    ALLOC_GROW(items, nr + 1, alloc);
6422
0
    items[nr++] = todo_list->items[i];
6423
6424
0
    if (command == TODO_PICK || command == TODO_MERGE)
6425
0
      insert = 1;
6426
0
  }
6427
6428
  /* insert or append final <commands> */
6429
0
  if (insert) {
6430
0
    ALLOC_GROW(items, nr + commands->nr, alloc);
6431
0
    COPY_ARRAY(items + nr, base_items, commands->nr);
6432
0
    nr += commands->nr;
6433
0
  }
6434
6435
0
  free(base_items);
6436
0
  FREE_AND_NULL(todo_list->items);
6437
0
  todo_list->items = items;
6438
0
  todo_list->nr = nr;
6439
0
  todo_list->alloc = alloc;
6440
0
}
6441
6442
static void todo_list_to_strbuf(struct repository *r,
6443
        struct todo_list *todo_list,
6444
        struct strbuf *buf, int num, unsigned flags)
6445
0
{
6446
0
  struct todo_item *item;
6447
0
  int i, max = todo_list->nr;
6448
6449
0
  if (num > 0 && num < max)
6450
0
    max = num;
6451
6452
0
  for (item = todo_list->items, i = 0; i < max; i++, item++) {
6453
0
    char cmd;
6454
6455
    /* if the item is not a command write it and continue */
6456
0
    if (item->command >= TODO_COMMENT) {
6457
0
      strbuf_addf(buf, "%.*s\n", item->arg_len,
6458
0
            todo_item_get_arg(todo_list, item));
6459
0
      continue;
6460
0
    }
6461
6462
    /* add command to the buffer */
6463
0
    cmd = command_to_char(item->command);
6464
0
    if ((flags & TODO_LIST_ABBREVIATE_CMDS) && cmd)
6465
0
      strbuf_addch(buf, cmd);
6466
0
    else
6467
0
      strbuf_addstr(buf, command_to_string(item->command));
6468
6469
    /* add commit id */
6470
0
    if (item->commit) {
6471
0
      const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
6472
0
            short_commit_name(r, item->commit) :
6473
0
            oid_to_hex(&item->commit->object.oid);
6474
6475
0
      if (item->command == TODO_FIXUP) {
6476
0
        if (item->flags & TODO_EDIT_FIXUP_MSG)
6477
0
          strbuf_addstr(buf, " -c");
6478
0
        else if (item->flags & TODO_REPLACE_FIXUP_MSG) {
6479
0
          strbuf_addstr(buf, " -C");
6480
0
        }
6481
0
      }
6482
6483
0
      if (item->command == TODO_MERGE) {
6484
0
        if (item->flags & TODO_EDIT_MERGE_MSG)
6485
0
          strbuf_addstr(buf, " -c");
6486
0
        else
6487
0
          strbuf_addstr(buf, " -C");
6488
0
      }
6489
6490
0
      strbuf_addf(buf, " %s", oid);
6491
0
    }
6492
6493
    /* add all the rest */
6494
0
    if (!item->arg_len)
6495
0
      strbuf_addch(buf, '\n');
6496
0
    else
6497
0
      strbuf_addf(buf, " %.*s\n", item->arg_len,
6498
0
            todo_item_get_arg(todo_list, item));
6499
0
  }
6500
0
}
6501
6502
int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
6503
          const char *file, const char *shortrevisions,
6504
          const char *shortonto, int num, unsigned flags)
6505
0
{
6506
0
  int res;
6507
0
  struct strbuf buf = STRBUF_INIT;
6508
6509
0
  todo_list_to_strbuf(r, todo_list, &buf, num, flags);
6510
0
  if (flags & TODO_LIST_APPEND_TODO_HELP)
6511
0
    append_todo_help(count_commands(todo_list),
6512
0
         shortrevisions, shortonto, &buf);
6513
6514
0
  res = write_message(buf.buf, buf.len, file, 0);
6515
0
  strbuf_release(&buf);
6516
6517
0
  return res;
6518
0
}
6519
6520
/* skip picking commits whose parents are unchanged */
6521
static int skip_unnecessary_picks(struct repository *r,
6522
          struct todo_list *todo_list,
6523
          struct object_id *base_oid)
6524
0
{
6525
0
  struct object_id *parent_oid;
6526
0
  int i;
6527
6528
0
  for (i = 0; i < todo_list->nr; i++) {
6529
0
    struct todo_item *item = todo_list->items + i;
6530
6531
0
    if (item->command >= TODO_NOOP)
6532
0
      continue;
6533
0
    if (item->command != TODO_PICK)
6534
0
      break;
6535
0
    if (repo_parse_commit(r, item->commit)) {
6536
0
      return error(_("could not parse commit '%s'"),
6537
0
        oid_to_hex(&item->commit->object.oid));
6538
0
    }
6539
0
    if (!item->commit->parents)
6540
0
      break; /* root commit */
6541
0
    if (item->commit->parents->next)
6542
0
      break; /* merge commit */
6543
0
    parent_oid = &item->commit->parents->item->object.oid;
6544
0
    if (!oideq(parent_oid, base_oid))
6545
0
      break;
6546
0
    oidcpy(base_oid, &item->commit->object.oid);
6547
0
  }
6548
0
  if (i > 0) {
6549
0
    const char *done_path = rebase_path_done();
6550
6551
0
    if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
6552
0
      error_errno(_("could not write to '%s'"), done_path);
6553
0
      return -1;
6554
0
    }
6555
6556
0
    MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
6557
0
    todo_list->nr -= i;
6558
0
    todo_list->current = 0;
6559
0
    todo_list->done_nr += i;
6560
6561
0
    if (is_fixup(peek_command(todo_list, 0)))
6562
0
      record_in_rewritten(base_oid, peek_command(todo_list, 0));
6563
0
  }
6564
6565
0
  return 0;
6566
0
}
6567
6568
struct todo_add_branch_context {
6569
  struct todo_item *items;
6570
  size_t items_nr;
6571
  size_t items_alloc;
6572
  struct strbuf *buf;
6573
  struct string_list refs_to_oids;
6574
};
6575
6576
static int add_decorations_to_list(const struct commit *commit,
6577
           struct todo_add_branch_context *ctx)
6578
0
{
6579
0
  const struct name_decoration *decoration = get_name_decoration(&commit->object);
6580
0
  const char *head_ref = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
6581
0
                   "HEAD",
6582
0
                   RESOLVE_REF_READING,
6583
0
                   NULL,
6584
0
                   NULL);
6585
6586
0
  while (decoration) {
6587
0
    struct todo_item *item;
6588
0
    const char *path;
6589
0
    size_t base_offset = ctx->buf->len;
6590
6591
    /*
6592
     * If the branch is the current HEAD, then it will be
6593
     * updated by the default rebase behavior.
6594
     * Exclude it from the list of refs to update,
6595
     * as well as any non-branch decorations.
6596
     * Non-branch decorations may be present if the pretty format
6597
     * includes "%d", which would have loaded all refs
6598
     * into the global decoration table.
6599
     */
6600
0
    if ((head_ref && !strcmp(head_ref, decoration->name)) ||
6601
0
        (decoration->type != DECORATION_REF_LOCAL)) {
6602
0
      decoration = decoration->next;
6603
0
      continue;
6604
0
    }
6605
6606
0
    ALLOC_GROW(ctx->items,
6607
0
      ctx->items_nr + 1,
6608
0
      ctx->items_alloc);
6609
0
    item = &ctx->items[ctx->items_nr];
6610
0
    memset(item, 0, sizeof(*item));
6611
6612
    /* If the branch is checked out, then leave a comment instead. */
6613
0
    if ((path = branch_checked_out(decoration->name))) {
6614
0
      item->command = TODO_COMMENT;
6615
0
      strbuf_commented_addf(ctx->buf, comment_line_str,
6616
0
                "Ref %s checked out at '%s'\n",
6617
0
                decoration->name, path);
6618
0
    } else {
6619
0
      struct string_list_item *sti;
6620
0
      item->command = TODO_UPDATE_REF;
6621
0
      strbuf_addf(ctx->buf, "%s\n", decoration->name);
6622
6623
0
      sti = string_list_insert(&ctx->refs_to_oids,
6624
0
             decoration->name);
6625
0
      sti->util = init_update_ref_record(decoration->name);
6626
0
    }
6627
6628
0
    item->offset_in_buf = base_offset;
6629
0
    item->arg_offset = base_offset;
6630
0
    item->arg_len = ctx->buf->len - base_offset;
6631
0
    ctx->items_nr++;
6632
6633
0
    decoration = decoration->next;
6634
0
  }
6635
6636
0
  return 0;
6637
0
}
6638
6639
/*
6640
 * For each 'pick' command, find out if the commit has a decoration in
6641
 * refs/heads/. If so, then add a 'label for-update-refs/' command.
6642
 */
6643
static int todo_list_add_update_ref_commands(struct todo_list *todo_list)
6644
0
{
6645
0
  int i, res;
6646
0
  struct todo_add_branch_context ctx = {
6647
0
    .buf = &todo_list->buf,
6648
0
    .refs_to_oids = STRING_LIST_INIT_DUP,
6649
0
  };
6650
6651
0
  ctx.items_alloc = 2 * todo_list->nr + 1;
6652
0
  ALLOC_ARRAY(ctx.items, ctx.items_alloc);
6653
6654
0
  load_branch_decorations();
6655
6656
0
  for (i = 0; i < todo_list->nr; ) {
6657
0
    struct todo_item *item = &todo_list->items[i];
6658
6659
    /* insert ith item into new list */
6660
0
    ALLOC_GROW(ctx.items,
6661
0
         ctx.items_nr + 1,
6662
0
         ctx.items_alloc);
6663
6664
0
    ctx.items[ctx.items_nr++] = todo_list->items[i++];
6665
6666
0
    if (item->commit) {
6667
0
      add_decorations_to_list(item->commit, &ctx);
6668
0
    }
6669
0
  }
6670
6671
0
  res = write_update_refs_state(&ctx.refs_to_oids);
6672
6673
0
  string_list_clear(&ctx.refs_to_oids, 1);
6674
6675
0
  if (res) {
6676
    /* we failed, so clean up the new list. */
6677
0
    free(ctx.items);
6678
0
    return res;
6679
0
  }
6680
6681
0
  free(todo_list->items);
6682
0
  todo_list->items = ctx.items;
6683
0
  todo_list->nr = ctx.items_nr;
6684
0
  todo_list->alloc = ctx.items_alloc;
6685
6686
0
  return 0;
6687
0
}
6688
6689
int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
6690
        const char *shortrevisions, const char *onto_name,
6691
        struct commit *onto, const struct object_id *orig_head,
6692
        struct string_list *commands, unsigned autosquash,
6693
        unsigned update_refs,
6694
        struct todo_list *todo_list)
6695
0
{
6696
0
  char shortonto[GIT_MAX_HEXSZ + 1];
6697
0
  const char *todo_file = rebase_path_todo();
6698
0
  struct todo_list new_todo = TODO_LIST_INIT;
6699
0
  struct strbuf *buf = &todo_list->buf, buf2 = STRBUF_INIT;
6700
0
  struct object_id oid = onto->object.oid;
6701
0
  int res;
6702
6703
0
  repo_find_unique_abbrev_r(r, shortonto, &oid,
6704
0
          DEFAULT_ABBREV);
6705
6706
0
  if (buf->len == 0) {
6707
0
    struct todo_item *item = append_new_todo(todo_list);
6708
0
    item->command = TODO_NOOP;
6709
0
    item->commit = NULL;
6710
0
    item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
6711
0
  }
6712
6713
0
  if (update_refs && todo_list_add_update_ref_commands(todo_list))
6714
0
    return -1;
6715
6716
0
  if (autosquash && todo_list_rearrange_squash(todo_list))
6717
0
    return -1;
6718
6719
0
  if (commands->nr)
6720
0
    todo_list_add_exec_commands(todo_list, commands);
6721
6722
0
  if (count_commands(todo_list) == 0) {
6723
0
    apply_autostash(rebase_path_autostash());
6724
0
    sequencer_remove_state(opts);
6725
6726
0
    return error(_("nothing to do"));
6727
0
  }
6728
6729
0
  res = edit_todo_list(r, opts, todo_list, &new_todo, shortrevisions,
6730
0
           shortonto, flags);
6731
0
  if (res == -1)
6732
0
    return -1;
6733
0
  else if (res == -2) {
6734
0
    apply_autostash(rebase_path_autostash());
6735
0
    sequencer_remove_state(opts);
6736
6737
0
    return -1;
6738
0
  } else if (res == -3) {
6739
0
    apply_autostash(rebase_path_autostash());
6740
0
    sequencer_remove_state(opts);
6741
0
    todo_list_release(&new_todo);
6742
6743
0
    return error(_("nothing to do"));
6744
0
  } else if (res == -4) {
6745
0
    checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
6746
0
    todo_list_release(&new_todo);
6747
6748
0
    return -1;
6749
0
  }
6750
6751
  /* Expand the commit IDs */
6752
0
  todo_list_to_strbuf(r, &new_todo, &buf2, -1, 0);
6753
0
  strbuf_swap(&new_todo.buf, &buf2);
6754
0
  strbuf_release(&buf2);
6755
  /* Nothing is done yet, and we're reparsing, so let's reset the count */
6756
0
  new_todo.total_nr = 0;
6757
0
  if (todo_list_parse_insn_buffer(r, opts, new_todo.buf.buf, &new_todo) < 0)
6758
0
    BUG("invalid todo list after expanding IDs:\n%s",
6759
0
        new_todo.buf.buf);
6760
6761
0
  if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
6762
0
    todo_list_release(&new_todo);
6763
0
    return error(_("could not skip unnecessary pick commands"));
6764
0
  }
6765
6766
0
  if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
6767
0
            flags & ~(TODO_LIST_SHORTEN_IDS))) {
6768
0
    todo_list_release(&new_todo);
6769
0
    return error_errno(_("could not write '%s'"), todo_file);
6770
0
  }
6771
6772
0
  res = -1;
6773
6774
0
  if (checkout_onto(r, opts, onto_name, &oid, orig_head))
6775
0
    goto cleanup;
6776
6777
0
  if (require_clean_work_tree(r, "rebase", NULL, 1, 1))
6778
0
    goto cleanup;
6779
6780
0
  todo_list_write_total_nr(&new_todo);
6781
0
  res = pick_commits(r, &new_todo, opts);
6782
6783
0
cleanup:
6784
0
  todo_list_release(&new_todo);
6785
6786
0
  return res;
6787
0
}
6788
6789
struct subject2item_entry {
6790
  struct hashmap_entry entry;
6791
  int i;
6792
  char subject[FLEX_ARRAY];
6793
};
6794
6795
static int subject2item_cmp(const void *fndata UNUSED,
6796
          const struct hashmap_entry *eptr,
6797
          const struct hashmap_entry *entry_or_key,
6798
          const void *key)
6799
0
{
6800
0
  const struct subject2item_entry *a, *b;
6801
6802
0
  a = container_of(eptr, const struct subject2item_entry, entry);
6803
0
  b = container_of(entry_or_key, const struct subject2item_entry, entry);
6804
6805
0
  return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
6806
0
}
6807
6808
0
define_commit_slab(commit_todo_item, struct todo_item *);
Unexecuted instantiation: sequencer.c:init_commit_todo_item_with_stride
Unexecuted instantiation: sequencer.c:commit_todo_item_at_peek
Unexecuted instantiation: sequencer.c:clear_commit_todo_item
6809
0
6810
0
static int skip_fixupish(const char *subject, const char **p) {
6811
0
  return skip_prefix(subject, "fixup! ", p) ||
6812
0
         skip_prefix(subject, "amend! ", p) ||
6813
0
         skip_prefix(subject, "squash! ", p);
6814
0
}
6815
6816
/*
6817
 * Rearrange the todo list that has both "pick commit-id msg" and "pick
6818
 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
6819
 * after the former, and change "pick" to "fixup"/"squash".
6820
 *
6821
 * Note that if the config has specified a custom instruction format, each log
6822
 * message will have to be retrieved from the commit (as the oneline in the
6823
 * script cannot be trusted) in order to normalize the autosquash arrangement.
6824
 */
6825
int todo_list_rearrange_squash(struct todo_list *todo_list)
6826
0
{
6827
0
  struct hashmap subject2item;
6828
0
  int rearranged = 0, *next, *tail, i, nr = 0;
6829
0
  char **subjects;
6830
0
  struct commit_todo_item commit_todo;
6831
0
  struct todo_item *items = NULL;
6832
0
  int ret = 0;
6833
6834
0
  init_commit_todo_item(&commit_todo);
6835
  /*
6836
   * The hashmap maps onelines to the respective todo list index.
6837
   *
6838
   * If any items need to be rearranged, the next[i] value will indicate
6839
   * which item was moved directly after the i'th.
6840
   *
6841
   * In that case, last[i] will indicate the index of the latest item to
6842
   * be moved to appear after the i'th.
6843
   */
6844
0
  hashmap_init(&subject2item, subject2item_cmp, NULL, todo_list->nr);
6845
0
  ALLOC_ARRAY(next, todo_list->nr);
6846
0
  ALLOC_ARRAY(tail, todo_list->nr);
6847
0
  ALLOC_ARRAY(subjects, todo_list->nr);
6848
0
  for (i = 0; i < todo_list->nr; i++) {
6849
0
    struct strbuf buf = STRBUF_INIT;
6850
0
    struct todo_item *item = todo_list->items + i;
6851
0
    const char *commit_buffer, *subject, *p;
6852
0
    size_t subject_len;
6853
0
    int i2 = -1;
6854
0
    struct subject2item_entry *entry;
6855
6856
0
    next[i] = tail[i] = -1;
6857
0
    if (!item->commit || item->command == TODO_DROP) {
6858
0
      subjects[i] = NULL;
6859
0
      continue;
6860
0
    }
6861
6862
0
    if (is_fixup(item->command)) {
6863
0
      ret = error(_("the script was already rearranged."));
6864
0
      goto cleanup;
6865
0
    }
6866
6867
0
    repo_parse_commit(the_repository, item->commit);
6868
0
    commit_buffer = repo_logmsg_reencode(the_repository,
6869
0
                 item->commit, NULL,
6870
0
                 "UTF-8");
6871
0
    find_commit_subject(commit_buffer, &subject);
6872
0
    format_subject(&buf, subject, " ");
6873
0
    subject = subjects[i] = strbuf_detach(&buf, &subject_len);
6874
0
    repo_unuse_commit_buffer(the_repository, item->commit,
6875
0
           commit_buffer);
6876
0
    if (skip_fixupish(subject, &p)) {
6877
0
      struct commit *commit2;
6878
6879
0
      for (;;) {
6880
0
        while (isspace(*p))
6881
0
          p++;
6882
0
        if (!skip_fixupish(p, &p))
6883
0
          break;
6884
0
      }
6885
6886
0
      entry = hashmap_get_entry_from_hash(&subject2item,
6887
0
            strhash(p), p,
6888
0
            struct subject2item_entry,
6889
0
            entry);
6890
0
      if (entry)
6891
        /* found by title */
6892
0
        i2 = entry->i;
6893
0
      else if (!strchr(p, ' ') &&
6894
0
         (commit2 =
6895
0
          lookup_commit_reference_by_name(p)) &&
6896
0
         *commit_todo_item_at(&commit_todo, commit2))
6897
        /* found by commit name */
6898
0
        i2 = *commit_todo_item_at(&commit_todo, commit2)
6899
0
          - todo_list->items;
6900
0
      else {
6901
        /* copy can be a prefix of the commit subject */
6902
0
        for (i2 = 0; i2 < i; i2++)
6903
0
          if (subjects[i2] &&
6904
0
              starts_with(subjects[i2], p))
6905
0
            break;
6906
0
        if (i2 == i)
6907
0
          i2 = -1;
6908
0
      }
6909
0
    }
6910
0
    if (i2 >= 0) {
6911
0
      rearranged = 1;
6912
0
      if (starts_with(subject, "fixup!")) {
6913
0
        todo_list->items[i].command = TODO_FIXUP;
6914
0
      } else if (starts_with(subject, "amend!")) {
6915
0
        todo_list->items[i].command = TODO_FIXUP;
6916
0
        todo_list->items[i].flags = TODO_REPLACE_FIXUP_MSG;
6917
0
      } else {
6918
0
        todo_list->items[i].command = TODO_SQUASH;
6919
0
      }
6920
0
      if (tail[i2] < 0) {
6921
0
        next[i] = next[i2];
6922
0
        next[i2] = i;
6923
0
      } else {
6924
0
        next[i] = next[tail[i2]];
6925
0
        next[tail[i2]] = i;
6926
0
      }
6927
0
      tail[i2] = i;
6928
0
    } else if (!hashmap_get_from_hash(&subject2item,
6929
0
            strhash(subject), subject)) {
6930
0
      FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
6931
0
      entry->i = i;
6932
0
      hashmap_entry_init(&entry->entry,
6933
0
          strhash(entry->subject));
6934
0
      hashmap_put(&subject2item, &entry->entry);
6935
0
    }
6936
6937
0
    *commit_todo_item_at(&commit_todo, item->commit) = item;
6938
0
  }
6939
6940
0
  if (rearranged) {
6941
0
    ALLOC_ARRAY(items, todo_list->nr);
6942
6943
0
    for (i = 0; i < todo_list->nr; i++) {
6944
0
      enum todo_command command = todo_list->items[i].command;
6945
0
      int cur = i;
6946
6947
      /*
6948
       * Initially, all commands are 'pick's. If it is a
6949
       * fixup or a squash now, we have rearranged it.
6950
       */
6951
0
      if (is_fixup(command))
6952
0
        continue;
6953
6954
0
      while (cur >= 0) {
6955
0
        items[nr++] = todo_list->items[cur];
6956
0
        cur = next[cur];
6957
0
      }
6958
0
    }
6959
6960
0
    assert(nr == todo_list->nr);
6961
0
    todo_list->alloc = nr;
6962
0
    FREE_AND_NULL(todo_list->items);
6963
0
    todo_list->items = items;
6964
0
  }
6965
6966
0
cleanup:
6967
0
  free(next);
6968
0
  free(tail);
6969
0
  for (i = 0; i < todo_list->nr; i++)
6970
0
    free(subjects[i]);
6971
0
  free(subjects);
6972
0
  hashmap_clear_and_free(&subject2item, struct subject2item_entry, entry);
6973
6974
0
  clear_commit_todo_item(&commit_todo);
6975
6976
0
  return ret;
6977
0
}
6978
6979
int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)
6980
0
{
6981
0
  if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
6982
0
    struct object_id cherry_pick_head, rebase_head;
6983
6984
0
    if (file_exists(git_path_seq_dir()))
6985
0
      *whence = FROM_CHERRY_PICK_MULTI;
6986
0
    if (file_exists(rebase_path()) &&
6987
0
        !repo_get_oid(r, "REBASE_HEAD", &rebase_head) &&
6988
0
        !repo_get_oid(r, "CHERRY_PICK_HEAD", &cherry_pick_head) &&
6989
0
        oideq(&rebase_head, &cherry_pick_head))
6990
0
      *whence = FROM_REBASE_PICK;
6991
0
    else
6992
0
      *whence = FROM_CHERRY_PICK_SINGLE;
6993
6994
0
    return 1;
6995
0
  }
6996
6997
0
  return 0;
6998
0
}
6999
7000
int sequencer_get_update_refs_state(const char *wt_dir,
7001
            struct string_list *refs)
7002
0
{
7003
0
  int result = 0;
7004
0
  FILE *fp = NULL;
7005
0
  struct strbuf ref = STRBUF_INIT;
7006
0
  struct strbuf hash = STRBUF_INIT;
7007
0
  struct update_ref_record *rec = NULL;
7008
7009
0
  char *path = rebase_path_update_refs(wt_dir);
7010
7011
0
  fp = fopen(path, "r");
7012
0
  if (!fp)
7013
0
    goto cleanup;
7014
7015
0
  while (strbuf_getline(&ref, fp) != EOF) {
7016
0
    struct string_list_item *item;
7017
7018
0
    CALLOC_ARRAY(rec, 1);
7019
7020
0
    if (strbuf_getline(&hash, fp) == EOF ||
7021
0
        get_oid_hex(hash.buf, &rec->before)) {
7022
0
      warning(_("update-refs file at '%s' is invalid"),
7023
0
          path);
7024
0
      result = -1;
7025
0
      goto cleanup;
7026
0
    }
7027
7028
0
    if (strbuf_getline(&hash, fp) == EOF ||
7029
0
        get_oid_hex(hash.buf, &rec->after)) {
7030
0
      warning(_("update-refs file at '%s' is invalid"),
7031
0
          path);
7032
0
      result = -1;
7033
0
      goto cleanup;
7034
0
    }
7035
7036
0
    item = string_list_insert(refs, ref.buf);
7037
0
    item->util = rec;
7038
0
    rec = NULL;
7039
0
  }
7040
7041
0
cleanup:
7042
0
  if (fp)
7043
0
    fclose(fp);
7044
0
  free(path);
7045
0
  free(rec);
7046
0
  strbuf_release(&ref);
7047
0
  strbuf_release(&hash);
7048
0
  return result;
7049
0
}