]> git.ipfire.org Git - thirdparty/git.git/blobdiff - revision.h
split-index: accept that a base index can be empty
[thirdparty/git.git] / revision.h
index fbb068da9fb4d5ba8a89dde1d8e99c7b19f6aebe..30febad09a1e3493ed9b89cd57486134cc120f14 100644 (file)
@@ -8,6 +8,7 @@
 #include "pretty.h"
 #include "diff.h"
 #include "commit-slab-decl.h"
+#include "list-objects-filter-options.h"
 
 /**
  * The revision walking API offers functions to build a list of revisions
@@ -47,6 +48,7 @@
  */
 #define NOT_USER_GIVEN (1u<<25)
 #define TRACK_LINEAR   (1u<<26)
+#define ANCESTRY_PATH  (1u<<27)
 #define ALL_REV_FLAGS  (((1u<<11)-1) | NOT_USER_GIVEN | TRACK_LINEAR | PULL_MERGE)
 
 #define DECORATE_SHORT_REFS    1
@@ -79,9 +81,34 @@ struct rev_cmdline_info {
        } *rev;
 };
 
-#define REVISION_WALK_WALK 0
-#define REVISION_WALK_NO_WALK_SORTED 1
-#define REVISION_WALK_NO_WALK_UNSORTED 2
+struct ref_exclusions {
+       /*
+        * Excluded refs is a list of wildmatch patterns. If any of the
+        * patterns matches, the reference will be excluded.
+        */
+       struct string_list excluded_refs;
+
+       /*
+        * Hidden refs is a list of patterns that is to be hidden via
+        * `ref_is_hidden()`.
+        */
+       struct string_list hidden_refs;
+
+       /*
+        * Indicates whether hidden refs have been configured. This is to
+        * distinguish between no hidden refs existing and hidden refs not
+        * being parsed.
+        */
+       char hidden_refs_configured;
+};
+
+/**
+ * Initialize a `struct ref_exclusions` with a macro.
+ */
+#define REF_EXCLUSIONS_INIT { \
+       .excluded_refs = STRING_LIST_INIT_DUP, \
+       .hidden_refs = STRING_LIST_INIT_DUP, \
+}
 
 struct oidset;
 struct topo_walk_info;
@@ -98,8 +125,14 @@ struct rev_info {
        /* The end-points specified by the end user */
        struct rev_cmdline_info cmdline;
 
+       /*
+        * Object filter options. No filtering is specified
+        * if and only if filter.choice is zero.
+        */
+       struct list_objects_filter_options filter;
+
        /* excluding from --branches, --refs, etc. expansion */
-       struct string_list *ref_excludes;
+       struct ref_exclusions ref_excludes;
 
        /* Basic information */
        const char *prefix;
@@ -129,7 +162,8 @@ struct rev_info {
        /* Traversal flags */
        unsigned int    dense:1,
                        prune:1,
-                       no_walk:2,
+                       no_walk:1,
+                       unsorted_input:1,
                        remove_empty_trees:1,
                        simplify_history:1,
                        show_pulls:1,
@@ -160,7 +194,15 @@ struct rev_info {
                        cherry_mark:1,
                        bisect:1,
                        ancestry_path:1,
+
+                       /* True if --ancestry-path was specified without an
+                        * argument. The bottom revisions are implicitly
+                        * the arguments in this case.
+                        */
+                       ancestry_path_implicit_bottoms:1,
+
                        first_parent_only:1,
+                       exclude_first_parent_only:1,
                        line_level_traverse:1,
                        tree_blobs_in_commit_order:1,
 
@@ -198,7 +240,8 @@ struct rev_info {
                        combine_merges:1,
                        combined_all_paths:1,
                        dense_combined_merges:1,
-                       first_parent_merges:1;
+                       first_parent_merges:1,
+                       remerge_diff:1;
 
        /* Format info */
        int             show_notes;
@@ -215,6 +258,7 @@ struct rev_info {
                        missing_newline:1,
                        date_mode_explicit:1,
                        preserve_subject:1,
+                       force_in_body_from:1,
                        encode_email_headers:1,
                        include_header:1;
        unsigned int    disable_stdin:1;
@@ -249,8 +293,6 @@ struct rev_info {
 
        /* Filter by commit log message */
        struct grep_opt grep_filter;
-       /* Negate the match of grep_filter */
-       int invert_grep;
 
        /* Display history graph */
        struct git_graph *graph;
@@ -259,6 +301,7 @@ struct rev_info {
        int skip_count;
        int max_count;
        timestamp_t max_age;
+       timestamp_t max_age_as_filter;
        timestamp_t min_age;
        int min_parents;
        int max_parents;
@@ -301,6 +344,7 @@ struct rev_info {
        struct saved_parents *saved_parents_slab;
 
        struct commit_list *previous_parents;
+       struct commit_list *ancestry_path_bottoms;
        const char *break_bar;
 
        struct revision_sources *sources;
@@ -320,34 +364,45 @@ struct rev_info {
 
        /* misc. flags related to '--no-kept-objects' */
        unsigned keep_pack_cache_flags;
-};
 
-int ref_excluded(struct string_list *, const char *path);
-void clear_ref_exclusion(struct string_list **);
-void add_ref_exclusion(struct string_list **, const char *exclude);
-
-
-#define REV_TREE_SAME          0
-#define REV_TREE_NEW           1       /* Only new files */
-#define REV_TREE_OLD           2       /* Only files removed */
-#define REV_TREE_DIFFERENT     3       /* Mixed changes */
-
-/* revision.c */
-typedef void (*show_early_output_fn_t)(struct rev_info *, struct commit_list *);
-extern volatile show_early_output_fn_t show_early_output;
-
-struct setup_revision_opt {
-       const char *def;
-       void (*tweak)(struct rev_info *, struct setup_revision_opt *);
-       const char *submodule;  /* TODO: drop this and use rev_info->repo */
-       unsigned int    assume_dashdash:1,
-                       allow_exclude_promisor_objects:1;
-       unsigned revarg_opt;
+       /* Location where temporary objects for remerge-diff are written. */
+       struct tmp_objdir *remerge_objdir;
 };
 
-#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
-#define init_revisions(revs, prefix) repo_init_revisions(the_repository, revs, prefix)
-#endif
+/**
+ * Initialize the "struct rev_info" structure with a macro.
+ *
+ * This will not fully initialize a "struct rev_info", the
+ * repo_init_revisions() function needs to be called before
+ * setup_revisions() and any revision walking takes place.
+ *
+ * Use REV_INFO_INIT to make the "struct rev_info" safe for passing to
+ * release_revisions() when it's inconvenient (e.g. due to a "goto
+ * cleanup" pattern) to arrange for repo_init_revisions() to be called
+ * before release_revisions() is called.
+ *
+ * Initializing with this REV_INFO_INIT is redundant to invoking
+ * repo_init_revisions(). If repo_init_revisions() is guaranteed to be
+ * called before release_revisions() the "struct rev_info" can be left
+ * uninitialized.
+ */
+#define REV_INFO_INIT { \
+       .abbrev = DEFAULT_ABBREV, \
+       .simplify_history = 1, \
+       .pruning.flags.recursive = 1, \
+       .pruning.flags.quick = 1, \
+       .sort_order = REV_SORT_IN_GRAPH_ORDER, \
+       .dense = 1, \
+       .max_age = -1, \
+       .max_age_as_filter = -1, \
+       .min_age = -1, \
+       .skip_count = -1, \
+       .max_count = -1, \
+       .max_parents = -1, \
+       .expand_tabs_in_log = -1, \
+       .commit_format = CMIT_FMT_DEFAULT, \
+       .expand_tabs_in_log_default = 8, \
+}
 
 /**
  * Initialize a rev_info structure with default values. The third parameter may
@@ -360,6 +415,9 @@ struct setup_revision_opt {
 void repo_init_revisions(struct repository *r,
                         struct rev_info *revs,
                         const char *prefix);
+#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
+#define init_revisions(revs, prefix) repo_init_revisions(the_repository, revs, prefix)
+#endif
 
 /**
  * Parse revision information, filling in the `rev_info` structure, and
@@ -368,9 +426,23 @@ void repo_init_revisions(struct repository *r,
  * head of the argument list. The last parameter is used in case no
  * parameter given by the first two arguments.
  */
+struct setup_revision_opt {
+       const char *def;
+       void (*tweak)(struct rev_info *, struct setup_revision_opt *);
+       unsigned int    assume_dashdash:1,
+                       allow_exclude_promisor_objects:1,
+                       free_removed_argv_elements:1;
+       unsigned revarg_opt;
+};
 int setup_revisions(int argc, const char **argv, struct rev_info *revs,
                    struct setup_revision_opt *);
 
+/**
+ * Free data allocated in a "struct rev_info" after it's been
+ * initialized with repo_init_revisions() or REV_INFO_INIT.
+ */
+void release_revisions(struct rev_info *revs);
+
 void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
                        const struct option *options,
                        const char * const usagestr[]);
@@ -378,6 +450,7 @@ void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
 #define REVARG_COMMITTISH 02
 int handle_revision_arg(const char *arg, struct rev_info *revs,
                        int flags, unsigned revarg_opt);
+void revision_opts_finish(struct rev_info *revs);
 
 /**
  * Reset the flags used by the revision walking api. You can use this to do
@@ -404,12 +477,22 @@ const char *get_revision_mark(const struct rev_info *revs,
 void put_revision_mark(const struct rev_info *revs,
                       const struct commit *commit);
 
-void mark_parents_uninteresting(struct commit *commit);
+void mark_parents_uninteresting(struct rev_info *revs, struct commit *commit);
 void mark_tree_uninteresting(struct repository *r, struct tree *tree);
 void mark_trees_uninteresting_sparse(struct repository *r, struct oidset *trees);
 
 void show_object_with_name(FILE *, struct object *, const char *);
 
+/**
+ * Helpers to check if a reference should be excluded.
+ */
+
+int ref_excluded(const struct ref_exclusions *exclusions, const char *path);
+void init_ref_exclusions(struct ref_exclusions *);
+void clear_ref_exclusions(struct ref_exclusions *);
+void add_ref_exclusion(struct ref_exclusions *, const char *exclude);
+void exclude_hidden_refs(struct ref_exclusions *, const char *section);
+
 /**
  * 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
@@ -465,4 +548,10 @@ int rewrite_parents(struct rev_info *revs,
  */
 struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit);
 
+/**
+ * Global for the (undocumented) "--early-output" flag for "git log".
+ */
+typedef void (*show_early_output_fn_t)(struct rev_info *, struct commit_list *);
+extern volatile show_early_output_fn_t show_early_output;
+
 #endif