Git fork
at reftables-rust 274 lines 8.7 kB view raw
1#ifndef SEQUENCER_H 2#define SEQUENCER_H 3 4#include "strbuf.h" 5#include "strvec.h" 6#include "wt-status.h" 7 8struct commit; 9struct index_state; 10struct repository; 11 12const char *git_path_commit_editmsg(void); 13const char *rebase_path_todo(void); 14const char *rebase_path_todo_backup(void); 15const char *rebase_path_dropped(void); 16 17extern const char *rebase_resolvemsg; 18 19#define APPEND_SIGNOFF_DEDUP (1u << 0) 20 21enum replay_action { 22 REPLAY_REVERT, 23 REPLAY_PICK, 24 REPLAY_INTERACTIVE_REBASE 25}; 26 27enum commit_msg_cleanup_mode { 28 COMMIT_MSG_CLEANUP_SPACE, 29 COMMIT_MSG_CLEANUP_NONE, 30 COMMIT_MSG_CLEANUP_SCISSORS, 31 COMMIT_MSG_CLEANUP_ALL 32}; 33 34struct replay_ctx; 35struct replay_ctx* replay_ctx_new(void); 36 37struct replay_opts { 38 enum replay_action action; 39 40 /* Tri-state options: unspecified, false, or true */ 41 int edit; 42 43 /* Boolean options */ 44 int record_origin; 45 int no_commit; 46 int signoff; 47 int allow_ff; 48 int allow_rerere_auto; 49 int allow_empty; 50 int allow_empty_message; 51 int drop_redundant_commits; 52 int keep_redundant_commits; 53 int verbose; 54 int quiet; 55 int reschedule_failed_exec; 56 int committer_date_is_author_date; 57 int ignore_date; 58 int commit_use_reference; 59 60 int mainline; 61 62 char *gpg_sign; 63 enum commit_msg_cleanup_mode default_msg_cleanup; 64 int explicit_cleanup; 65 66 /* Merge strategy */ 67 char *default_strategy; /* from config options */ 68 char *strategy; 69 struct strvec xopts; 70 71 /* Reflog */ 72 char *reflog_action; 73 74 /* placeholder commit for -i --root */ 75 struct object_id squash_onto; 76 int have_squash_onto; 77 78 /* Only used by REPLAY_NONE */ 79 struct rev_info *revs; 80 81 /* Private use */ 82 struct replay_ctx *ctx; 83}; 84#define REPLAY_OPTS_INIT { \ 85 .edit = -1, \ 86 .action = -1, \ 87 .xopts = STRVEC_INIT, \ 88 .ctx = replay_ctx_new(), \ 89} 90 91/* 92 * Note that ordering matters in this enum. Not only must it match the mapping 93 * of todo_command_info (in sequencer.c), it is also divided into several 94 * sections that matter. When adding new commands, make sure you add it in the 95 * right section. 96 */ 97enum todo_command { 98 /* commands that handle commits */ 99 TODO_PICK = 0, 100 TODO_REVERT, 101 TODO_EDIT, 102 TODO_REWORD, 103 TODO_FIXUP, 104 TODO_SQUASH, 105 /* commands that do something else than handling a single commit */ 106 TODO_EXEC, 107 TODO_BREAK, 108 TODO_LABEL, 109 TODO_RESET, 110 TODO_MERGE, 111 TODO_UPDATE_REF, 112 /* commands that do nothing but are counted for reporting progress */ 113 TODO_NOOP, 114 TODO_DROP, 115 /* comments (not counted for reporting progress) */ 116 TODO_COMMENT 117}; 118 119struct todo_item { 120 enum todo_command command; 121 struct commit *commit; 122 unsigned int flags; 123 int arg_len; 124 /* The offset of the command and its argument in the strbuf */ 125 size_t offset_in_buf, arg_offset; 126}; 127 128struct todo_list { 129 struct strbuf buf; 130 struct todo_item *items; 131 int nr, alloc, current; 132 int done_nr, total_nr; 133}; 134 135#define TODO_LIST_INIT { \ 136 .buf = STRBUF_INIT, \ 137} 138 139int todo_list_parse_insn_buffer(struct repository *r, struct replay_opts *opts, 140 char *buf, struct todo_list *todo_list); 141int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list, 142 const char *file, const char *shortrevisions, 143 const char *shortonto, int num, unsigned flags); 144void todo_list_release(struct todo_list *todo_list); 145const char *todo_item_get_arg(struct todo_list *todo_list, 146 struct todo_item *item); 147 148/* 149 * Parse the update-refs file for the current rebase, then remove the 150 * refs that do not appear in the todo_list (and have not had updated 151 * values stored) and add refs that are in the todo_list but not 152 * represented in the update-refs file. 153 * 154 * If there are changes to the update-refs list, then write the new state 155 * to disk. 156 */ 157void todo_list_filter_update_refs(struct repository *r, 158 struct todo_list *todo_list); 159 160/* Call this to setup defaults before parsing command line options */ 161void sequencer_init_config(struct replay_opts *opts); 162int sequencer_pick_revisions(struct repository *repo, 163 struct replay_opts *opts); 164int sequencer_continue(struct repository *repo, struct replay_opts *opts); 165int sequencer_rollback(struct repository *repo, struct replay_opts *opts); 166int sequencer_skip(struct repository *repo, struct replay_opts *opts); 167void replay_opts_release(struct replay_opts *opts); 168int sequencer_remove_state(struct replay_opts *opts); 169 170#define TODO_LIST_KEEP_EMPTY (1U << 0) 171#define TODO_LIST_SHORTEN_IDS (1U << 1) 172#define TODO_LIST_ABBREVIATE_CMDS (1U << 2) 173#define TODO_LIST_REBASE_MERGES (1U << 3) 174/* 175 * When rebasing merges, commits that do have the base commit as ancestor 176 * ("cousins") are *not* rebased onto the new base by default. If those 177 * commits should be rebased onto the new base, this flag needs to be passed. 178 */ 179#define TODO_LIST_REBASE_COUSINS (1U << 4) 180#define TODO_LIST_APPEND_TODO_HELP (1U << 5) 181/* 182 * When generating a script that rebases merges with `--root` *and* with 183 * `--onto`, we do not want to re-generate the root commits. 184 */ 185#define TODO_LIST_ROOT_WITH_ONTO (1U << 6) 186#define TODO_LIST_REAPPLY_CHERRY_PICKS (1U << 7) 187#define TODO_LIST_WARN_SKIPPED_CHERRY_PICKS (1U << 8) 188 189int sequencer_make_script(struct repository *r, struct strbuf *out, 190 struct strvec *argv, unsigned flags); 191 192int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags, 193 const char *shortrevisions, const char *onto_name, 194 struct commit *onto, const struct object_id *orig_head, 195 struct string_list *commands, unsigned autosquash, 196 unsigned update_refs, 197 struct todo_list *todo_list); 198int todo_list_rearrange_squash(struct todo_list *todo_list); 199 200/* 201 * Append a signoff to the commit message in "msgbuf". The ignore_footer 202 * parameter specifies the number of bytes at the end of msgbuf that should 203 * not be considered at all. I.e., they are not checked for existing trailers, 204 * and the new signoff will be spliced into the buffer before those bytes. 205 */ 206void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag); 207 208void append_conflicts_hint(struct index_state *istate, 209 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode); 210enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg, 211 int use_editor); 212 213void cleanup_message(struct strbuf *msgbuf, 214 enum commit_msg_cleanup_mode cleanup_mode, int verbose); 215 216int message_is_empty(const struct strbuf *sb, 217 enum commit_msg_cleanup_mode cleanup_mode); 218int template_untouched(const struct strbuf *sb, const char *template_file, 219 enum commit_msg_cleanup_mode cleanup_mode); 220int update_head_with_reflog(const struct commit *old_head, 221 const struct object_id *new_head, 222 const char *action, const struct strbuf *msg, 223 struct strbuf *err); 224void commit_post_rewrite(struct repository *r, 225 const struct commit *current_head, 226 const struct object_id *new_head); 227 228void create_autostash(struct repository *r, const char *path); 229void create_autostash_ref(struct repository *r, const char *refname); 230int save_autostash(const char *path); 231int save_autostash_ref(struct repository *r, const char *refname); 232int apply_autostash(const char *path); 233int apply_autostash_oid(const char *stash_oid); 234int apply_autostash_ref(struct repository *r, const char *refname); 235 236#define SUMMARY_INITIAL_COMMIT (1 << 0) 237#define SUMMARY_SHOW_AUTHOR_DATE (1 << 1) 238void print_commit_summary(struct repository *repo, 239 const char *prefix, 240 const struct object_id *oid, 241 unsigned int flags); 242 243#define READ_ONELINER_SKIP_IF_EMPTY (1 << 0) 244#define READ_ONELINER_WARN_MISSING (1 << 1) 245 246/* 247 * Reads a file that was presumably written by a shell script, i.e. with an 248 * end-of-line marker that needs to be stripped. 249 * 250 * Note that only the last end-of-line marker is stripped, consistent with the 251 * behavior of "$(cat path)" in a shell script. 252 * 253 * Returns 1 if the file was read, 0 if it could not be read or does not exist. 254 */ 255int read_oneliner(struct strbuf *buf, 256 const char *path, unsigned flags); 257int read_author_script(const char *path, char **name, char **email, char **date, 258 int allow_missing); 259int write_basic_state(struct replay_opts *opts, const char *head_name, 260 struct commit *onto, const struct object_id *orig_head); 261void sequencer_post_commit_cleanup(struct repository *r, int verbose); 262int sequencer_get_last_command(struct repository* r, 263 enum replay_action *action); 264int sequencer_determine_whence(struct repository *r, enum commit_whence *whence); 265 266/** 267 * Append the set of ref-OID pairs that are currently stored for the 'git 268 * rebase --update-refs' feature if such a rebase is currently happening. 269 * 270 * Localized to a worktree's git dir. 271 */ 272int sequencer_get_update_refs_state(const char *wt_dir, struct string_list *refs); 273 274#endif /* SEQUENCER_H */