Git Mailing List Archive mirror
 help / color / mirror / Atom feed
blob 5e2843d320aacb60583c5c488b0b30c514d91fea 4035 bytes (raw)
name: trailer.h 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
 
#ifndef TRAILER_H
#define TRAILER_H

#include "list.h"
#include "strbuf.h"

enum trailer_where {
	WHERE_UNSPECIFIED,
	WHERE_END,
	WHERE_AFTER,
	WHERE_BEFORE,
	WHERE_START
};
enum trailer_if_exists {
	EXISTS_UNSPECIFIED,
	EXISTS_ADD_IF_DIFFERENT_NEIGHBOR,
	EXISTS_ADD_IF_DIFFERENT,
	EXISTS_ADD,
	EXISTS_REPLACE,
	EXISTS_DO_NOTHING
};
enum trailer_if_missing {
	MISSING_UNSPECIFIED,
	MISSING_ADD,
	MISSING_DO_NOTHING
};

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 set to 0.
	 */
	size_t trailer_block_start, trailer_block_end;

	/*
	 * Offset to the end of the log message in the input (may not be the
	 * same as the end of the input).
	 */
	size_t end_of_log_message;

	/*
	 * 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.
 */
struct new_trailer_item {
	struct list_head list;

	const char *text;

	enum trailer_where where;
	enum trailer_if_exists if_exists;
	enum trailer_if_missing if_missing;
};

struct process_trailer_options {
	int in_place;
	int trim_empty;
	int only_trailers;
	int only_input;
	int unfold;
	int no_divider;
	int key_only;
	int value_only;
	const struct strbuf *separator;
	const struct strbuf *key_value_separator;
	int (*filter)(const struct strbuf *, void *);
	void *filter_data;
};

#define PROCESS_TRAILER_OPTIONS_INIT {0}

void process_trailers(const char *file,
		      const struct process_trailer_options *opts,
		      struct list_head *new_trailer_head);

void trailer_info_get(struct trailer_info *info, const char *str,
		      const struct process_trailer_options *opts);

void trailer_info_release(struct trailer_info *info);

/*
 * Format the trailers from the commit msg "msg" into the strbuf "out".
 * Note two caveats about "opts":
 *
 *   - this is primarily a helper for pretty.c, and not
 *     all of the flags are supported.
 *
 *   - this differs from process_trailers slightly in that we always format
 *     only the trailer block itself, even if the "only_trailers" option is not
 *     set.
 */
void format_trailers_from_commit(struct strbuf *out, const char *msg,
				 const struct process_trailer_options *opts);

/*
 * An interface for iterating over the trailers found in a particular commit
 * message. Use like:
 *
 *   struct trailer_iterator iter;
 *   trailer_iterator_init(&iter, msg);
 *   while (trailer_iterator_advance(&iter))
 *      ... do something with iter.key and iter.val ...
 *   trailer_iterator_release(&iter);
 */
struct trailer_iterator {
	struct strbuf key;
	struct strbuf val;

	/* private */
	struct {
		struct trailer_info info;
		size_t cur;
	} internal;
};

/*
 * Initialize "iter" in preparation for walking over the trailers in the commit
 * message "msg". The "msg" pointer must remain valid until the iterator is
 * released.
 *
 * After initializing, note that key/val will not yet point to any trailer.
 * Call advance() to parse the first one (if any).
 */
void trailer_iterator_init(struct trailer_iterator *iter, const char *msg);

/*
 * Advance to the next trailer of the iterator. Returns 0 if there is no such
 * trailer, and 1 otherwise. The key and value of the trailer can be
 * fetched from the iter->key and iter->value fields (which are valid
 * only until the next advance).
 */
int trailer_iterator_advance(struct trailer_iterator *iter);

/*
 * Release all resources associated with the trailer iteration.
 */
void trailer_iterator_release(struct trailer_iterator *iter);

#endif /* TRAILER_H */

debug log:

solving 5e2843d320a ...
found 5e2843d320a in https://80x24.org/lore/git/1762f78a613f4a744e76ad515b6d27ca9bea47ed.1695412245.git.gitgitgadget@gmail.com/
found 4dcb9080327 in https://80x24.org/lore/git/091805eb7d93efa6fbe3831bcddd2a6fdc033388.1695412245.git.gitgitgadget@gmail.com/
found a689d768c79 in https://80x24.org/lore/git/47186a09b24522bacf459006330fd469766072f2.1695412245.git.gitgitgadget@gmail.com/ ||
	https://80x24.org/lore/git/52958c3557c34992df59e9c10f098f457526702c.1694240177.git.gitgitgadget@gmail.com/
found ab2cd017567 in https://80x24.org/lore/pub/scm/linux/kernel/git/mst/git.git/
preparing index
index prepared:
100644 ab2cd017567b3f782fa9b342ad03e7e93bc17a37	trailer.h

applying [1/3] https://80x24.org/lore/git/47186a09b24522bacf459006330fd469766072f2.1695412245.git.gitgitgadget@gmail.com/
diff --git a/trailer.h b/trailer.h
index ab2cd017567..a689d768c79 100644

Checking patch trailer.h...
Applied patch trailer.h cleanly.

skipping https://80x24.org/lore/git/52958c3557c34992df59e9c10f098f457526702c.1694240177.git.gitgitgadget@gmail.com/ for a689d768c79
index at:
100644 a689d768c79d4a39e8249b93a85f71f751e8c2b0	trailer.h

applying [2/3] https://80x24.org/lore/git/091805eb7d93efa6fbe3831bcddd2a6fdc033388.1695412245.git.gitgitgadget@gmail.com/
diff --git a/trailer.h b/trailer.h
index a689d768c79..4dcb9080327 100644


applying [3/3] https://80x24.org/lore/git/1762f78a613f4a744e76ad515b6d27ca9bea47ed.1695412245.git.gitgitgadget@gmail.com/
diff --git a/trailer.h b/trailer.h
index 4dcb9080327..5e2843d320a 100644

Checking patch trailer.h...
Applied patch trailer.h cleanly.
Checking patch trailer.h...
Applied patch trailer.h cleanly.

index at:
100644 5e2843d320aacb60583c5c488b0b30c514d91fea	trailer.h

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).