Merge branch 'rj/header-check'
[gitweb.git] / sequencer.h
index 81f6d7d393fd1a502e3763cd1717b87ffa243717..c986bc825161f1f4702a0cd435c6d9705e3be2df 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef SEQUENCER_H
 #define SEQUENCER_H
 
+#include "cache.h"
+#include "strbuf.h"
+
+struct commit;
+
+const char *git_path_commit_editmsg(void);
 const char *git_path_seq_dir(void);
 
 #define APPEND_SIGNOFF_DEDUP (1u << 0)
@@ -11,6 +17,13 @@ enum replay_action {
        REPLAY_INTERACTIVE_REBASE
 };
 
+enum commit_msg_cleanup_mode {
+       COMMIT_MSG_CLEANUP_SPACE,
+       COMMIT_MSG_CLEANUP_NONE,
+       COMMIT_MSG_CLEANUP_SCISSORS,
+       COMMIT_MSG_CLEANUP_ALL
+};
+
 struct replay_opts {
        enum replay_action action;
 
@@ -29,17 +42,28 @@ struct replay_opts {
        int mainline;
 
        char *gpg_sign;
+       enum commit_msg_cleanup_mode default_msg_cleanup;
 
        /* Merge strategy */
        char *strategy;
        char **xopts;
        size_t xopts_nr, xopts_alloc;
 
+       /* Used by fixup/squash */
+       struct strbuf current_fixups;
+       int current_fixup_count;
+
+       /* placeholder commit for -i --root */
+       struct object_id squash_onto;
+       int have_squash_onto;
+
        /* Only used by REPLAY_NONE */
        struct rev_info *revs;
 };
-#define REPLAY_OPTS_INIT { -1 }
+#define REPLAY_OPTS_INIT { .action = -1, .current_fixups = STRBUF_INIT }
 
+/* Call this to setup defaults before parsing command line options */
+void sequencer_init_config(struct replay_opts *opts);
 int sequencer_pick_revisions(struct replay_opts *opts);
 int sequencer_continue(struct replay_opts *opts);
 int sequencer_rollback(struct replay_opts *opts);
@@ -48,6 +72,13 @@ int sequencer_remove_state(struct replay_opts *opts);
 #define TODO_LIST_KEEP_EMPTY (1U << 0)
 #define TODO_LIST_SHORTEN_IDS (1U << 1)
 #define TODO_LIST_ABBREVIATE_CMDS (1U << 2)
+#define TODO_LIST_REBASE_MERGES (1U << 3)
+/*
+ * When rebasing merges, commits that do have the base commit as ancestor
+ * ("cousins") are *not* rebased onto the new base by default. If those
+ * commits should be rebased onto the new base, this flag needs to be passed.
+ */
+#define TODO_LIST_REBASE_COUSINS (1U << 4)
 int sequencer_make_script(FILE *out, int argc, const char **argv,
                          unsigned flags);
 
@@ -59,7 +90,28 @@ int rearrange_squash(void);
 
 extern const char sign_off_header[];
 
-void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag);
+/*
+ * Append a signoff to the commit message in "msgbuf". The ignore_footer
+ * parameter specifies the number of bytes at the end of msgbuf that should
+ * not be considered at all. I.e., they are not checked for existing trailers,
+ * and the new signoff will be spliced into the buffer before those bytes.
+ */
+void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag);
+
 void append_conflicts_hint(struct strbuf *msgbuf);
+int message_is_empty(const struct strbuf *sb,
+                    enum commit_msg_cleanup_mode cleanup_mode);
+int template_untouched(const struct strbuf *sb, const char *template_file,
+                      enum commit_msg_cleanup_mode cleanup_mode);
+int update_head_with_reflog(const struct commit *old_head,
+                           const struct object_id *new_head,
+                           const char *action, const struct strbuf *msg,
+                           struct strbuf *err);
+void commit_post_rewrite(const struct commit *current_head,
+                        const struct object_id *new_head);
 
+#define SUMMARY_INITIAL_COMMIT   (1 << 0)
+#define SUMMARY_SHOW_AUTHOR_DATE (1 << 1)
+void print_commit_summary(const char *prefix, const struct object_id *oid,
+                         unsigned int flags);
 #endif