]> git.ipfire.org Git - thirdparty/git.git/blobdiff - trailer.h
The seventh batch
[thirdparty/git.git] / trailer.h
index 9f42aa75994f3f5b54243239b7ce839b21d7fc45..6eb53df155eb45ec2082d34084e4c470596b1e6c 100644 (file)
--- a/trailer.h
+++ b/trailer.h
@@ -4,6 +4,9 @@
 #include "list.h"
 #include "strbuf.h"
 
+struct trailer_info;
+struct strvec;
+
 enum trailer_where {
        WHERE_DEFAULT,
        WHERE_END,
@@ -29,27 +32,6 @@ int trailer_set_where(enum trailer_where *item, const char *value);
 int trailer_set_if_exists(enum trailer_if_exists *item, const char *value);
 int trailer_set_if_missing(enum trailer_if_missing *item, const char *value);
 
-struct trailer_info {
-       /*
-        * True if there is a blank line before the location pointed to by
-        * trailer_block_start.
-        */
-       int blank_line_before_trailer;
-
-       /*
-        * Offsets to the trailer block start and end positions in the input
-        * string. If no trailer block is found, these are both set to the
-        * "true" end of the input (find_end_of_log_message()).
-        */
-       size_t trailer_block_start, trailer_block_end;
-
-       /*
-        * Array of trailers found.
-        */
-       char **trailers;
-       size_t trailer_nr;
-};
-
 /*
  * A list that represents newly-added trailers, such as those provided
  * with the --trailer command line option of git-interpret-trailers.
@@ -89,15 +71,63 @@ void parse_trailers_from_command_line_args(struct list_head *arg_head,
 void process_trailers_lists(struct list_head *head,
                            struct list_head *arg_head);
 
-void parse_trailers(const struct process_trailer_options *,
-                   struct trailer_info *,
-                   const char *str,
-                   struct list_head *head);
+/*
+ * Given some input string "str", return a pointer to an opaque trailer_info
+ * structure. Also populate the trailer_objects list with parsed trailer
+ * objects. Internally this calls trailer_info_get() to get the opaque pointer,
+ * but does some extra work to populate the trailer_objects linked list.
+ *
+ * The opaque trailer_info pointer can be used to check the position of the
+ * trailer block as offsets relative to the beginning of "str" in
+ * trailer_block_start() and trailer_block_end().
+ * blank_line_before_trailer_block() returns 1 if there is a blank line just
+ * before the trailer block. All of these functions are useful for preserving
+ * the input before and after the trailer block, if we were to write out the
+ * original input (but with the trailer block itself modified); see
+ * builtin/interpret-trailers.c for an example.
+ *
+ * For iterating through the parsed trailer block (if you don't care about the
+ * position of the trailer block itself in the context of the larger string text
+ * from which it was parsed), please see trailer_iterator_init() which uses the
+ * trailer_info struct internally.
+ *
+ * Lastly, callers should call trailer_info_release() when they are done using
+ * the opaque pointer.
+ *
+ * NOTE: Callers should treat both trailer_info and trailer_objects as
+ * read-only items, because there is some overlap between the two (trailer_info
+ * has "char **trailers" string array, and trailer_objects will have the same
+ * data but as a linked list of trailer_item objects). This API does not perform
+ * any synchronization between the two. In the future we should be able to
+ * reduce the duplication and use just the linked list.
+ */
+struct trailer_info *parse_trailers(const struct process_trailer_options *,
+                                   const char *str,
+                                   struct list_head *trailer_objects);
+
+/*
+ * Return the offset of the start of the trailer block. That is, 0 is the start
+ * of the input ("str" in parse_trailers()) and some other positive number
+ * indicates how many bytes we have to skip over before we get to the beginning
+ * of the trailer block.
+ */
+size_t trailer_block_start(struct trailer_info *);
+
+/*
+ * Return the end of the trailer block, again relative to the start of the
+ * input.
+ */
+size_t trailer_block_end(struct trailer_info *);
 
-void trailer_info_get(const struct process_trailer_options *,
-                     const char *str,
-                     struct trailer_info *);
+/*
+ * Return 1 if the trailer block had an extra newline (blank line) just before
+ * it.
+ */
+int blank_line_before_trailer_block(struct trailer_info *);
 
+/*
+ * Free trailer_info struct.
+ */
 void trailer_info_release(struct trailer_info *info);
 
 void trailer_config_init(void);
@@ -125,12 +155,19 @@ void format_trailers_from_commit(const struct process_trailer_options *,
  *   trailer_iterator_release(&iter);
  */
 struct trailer_iterator {
+       /*
+        * Raw line (e.g., "foo: bar baz") before being parsed as a trailer
+        * key/val pair as part of a trailer block (as the "key" and "val"
+        * fields below). If a line fails to parse as a trailer, then the "key"
+        * will be the entire line and "val" will be the empty string.
+        */
+       const char *raw;
        struct strbuf key;
        struct strbuf val;
 
        /* private */
        struct {
-               struct trailer_info info;
+               struct trailer_info *info;
                size_t cur;
        } internal;
 };
@@ -158,4 +195,11 @@ int trailer_iterator_advance(struct trailer_iterator *iter);
  */
 void trailer_iterator_release(struct trailer_iterator *iter);
 
+/*
+ * Augment a file to add trailers to it by running git-interpret-trailers.
+ * This calls run_command() and its return value is the same (i.e. 0 for
+ * success, various non-zero for other errors). See run-command.h.
+ */
+int amend_file_with_trailers(const char *path, const struct strvec *trailer_args);
+
 #endif /* TRAILER_H */