Coverage Report

Created: 2026-10-17 07:15

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