]> git.ipfire.org Git - thirdparty/git.git/blobdiff - revision.h
Merge branch 'es/bugreport-with-hooks'
[thirdparty/git.git] / revision.h
index 4134dc6029c40f39659b39927ba239aed845673b..93491b79d475adb32414008558d0d94ec9240d56 100644 (file)
@@ -9,6 +9,19 @@
 #include "diff.h"
 #include "commit-slab-decl.h"
 
+/**
+ * The revision walking API offers functions to build a list of revisions
+ * and then iterate over that list.
+ *
+ * Calling sequence
+ * ----------------
+ *
+ * The walking API has a given calling sequence: first you need to initialize
+ * a rev_info structure, then add revisions to control what kind of revision
+ * list do you want to get, finally you can iterate over the revision list.
+ *
+ */
+
 /* Remember to update object flag allocation in object.h */
 #define SEEN           (1u<<0)
 #define UNINTERESTING   (1u<<1)
@@ -21,6 +34,9 @@
 #define SYMMETRIC_LEFT (1u<<8)
 #define PATCHSAME      (1u<<9)
 #define BOTTOM         (1u<<10)
+
+/* WARNING: This is also used as REACHABLE in commit-graph.c. */
+#define PULL_MERGE     (1u<<15)
 /*
  * Indicates object was reached by traversal. i.e. not given by user on
  * command-line or stdin.
@@ -30,7 +46,7 @@
  */
 #define NOT_USER_GIVEN (1u<<25)
 #define TRACK_LINEAR   (1u<<26)
-#define ALL_REV_FLAGS  (((1u<<11)-1) | NOT_USER_GIVEN | TRACK_LINEAR)
+#define ALL_REV_FLAGS  (((1u<<11)-1) | NOT_USER_GIVEN | TRACK_LINEAR | PULL_MERGE)
 
 #define TOPO_WALK_EXPLORED     (1u<<27)
 #define TOPO_WALK_INDEGREE     (1u<<28)
@@ -43,6 +59,8 @@ struct repository;
 struct rev_info;
 struct string_list;
 struct saved_parents;
+struct bloom_key;
+struct bloom_filter_settings;
 define_shared_commit_slab(revision_sources, char *);
 
 struct rev_cmdline_info {
@@ -116,6 +134,7 @@ struct rev_info {
                        no_walk:2,
                        remove_empty_trees:1,
                        simplify_history:1,
+                       show_pulls:1,
                        topo_order:1,
                        simplify_merges:1,
                        simplify_by_decoration:1,
@@ -177,10 +196,10 @@ struct rev_info {
                        always_show_header:1;
 
        /* Format info */
+       int             show_notes;
        unsigned int    shown_one:1,
                        shown_dashes:1,
                        show_merge:1,
-                       show_notes:1,
                        show_notes_given:1,
                        show_signature:1,
                        pretty_given:1,
@@ -190,7 +209,8 @@ struct rev_info {
                        use_terminator:1,
                        missing_newline:1,
                        date_mode_explicit:1,
-                       preserve_subject:1;
+                       preserve_subject:1,
+                       encode_email_headers:1;
        unsigned int    disable_stdin:1;
        /* --show-linear-break */
        unsigned int    track_linear:1,
@@ -278,6 +298,15 @@ struct rev_info {
        struct revision_sources *sources;
 
        struct topo_walk_info *topo_walk_info;
+
+       /* Commit graph bloom filter fields */
+       /* The bloom filter key for the pathspec */
+       struct bloom_key *bloom_key;
+       /*
+        * The bloom filter settings used to generate the key.
+        * This is loaded from the commit-graph being used.
+        */
+       struct bloom_filter_settings *bloom_filter_settings;
 };
 
 int ref_excluded(struct string_list *, const char *path);
@@ -306,11 +335,29 @@ struct setup_revision_opt {
 #ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
 #define init_revisions(revs, prefix) repo_init_revisions(the_repository, revs, prefix)
 #endif
+
+/**
+ * Initialize a rev_info structure with default values. The third parameter may
+ * be NULL or can be prefix path, and then the `.prefix` variable will be set
+ * to it. This is typically the first function you want to call when you want
+ * to deal with a revision list. After calling this function, you are free to
+ * customize options, like set `.ignore_merges` to 0 if you don't want to
+ * ignore merges, and so on.
+ */
 void repo_init_revisions(struct repository *r,
                         struct rev_info *revs,
                         const char *prefix);
+
+/**
+ * Parse revision information, filling in the `rev_info` structure, and
+ * removing the used arguments from the argument list. Returns the number
+ * of arguments left that weren't recognized, which are also moved to the
+ * head of the argument list. The last parameter is used in case no
+ * parameter given by the first two arguments.
+ */
 int setup_revisions(int argc, const char **argv, struct rev_info *revs,
                    struct setup_revision_opt *);
+
 void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
                        const struct option *options,
                        const char * const usagestr[]);
@@ -319,11 +366,28 @@ void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
 int handle_revision_arg(const char *arg, struct rev_info *revs,
                        int flags, unsigned revarg_opt);
 
+/**
+ * Reset the flags used by the revision walking api. You can use this to do
+ * multiple sequential revision walks.
+ */
 void reset_revision_walk(void);
+
+/**
+ * Prepares the rev_info structure for a walk. You should check if it returns
+ * any error (non-zero return code) and if it does not, you can start using
+ * get_revision() to do the iteration.
+ */
 int prepare_revision_walk(struct rev_info *revs);
+
+/**
+ * Takes a pointer to a `rev_info` structure and iterates over it, returning a
+ * `struct commit *` each time you call it. The end of the revision list is
+ * indicated by returning a NULL pointer.
+ */
 struct commit *get_revision(struct rev_info *revs);
-char *get_revision_mark(const struct rev_info *revs,
-                       const struct commit *commit);
+
+const char *get_revision_mark(const struct rev_info *revs,
+                             const struct commit *commit);
 void put_revision_mark(const struct rev_info *revs,
                       const struct commit *commit);
 
@@ -333,8 +397,19 @@ void mark_trees_uninteresting_sparse(struct repository *r, struct oidset *trees)
 
 void show_object_with_name(FILE *, struct object *, const char *);
 
+/**
+ * This function can be used if you want to add commit objects as revision
+ * information. You can use the `UNINTERESTING` object flag to indicate if
+ * you want to include or exclude the given commit (and commits reachable
+ * from the given commit) from the revision list.
+ *
+ * NOTE: If you have the commits as a string list then you probably want to
+ * use setup_revisions(), instead of parsing each string and using this
+ * function.
+ */
 void add_pending_object(struct rev_info *revs,
                        struct object *obj, const char *name);
+
 void add_pending_oid(struct rev_info *revs,
                     const char *name, const struct object_id *oid,
                     unsigned int flags);