git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Subject: [PATCH 13/14] trailer: add interface for parsing commit trailers
Date: Tue, 29 Dec 2015 02:36:58 -0500	[thread overview]
Message-ID: <20151229073658.GM8842@sigill.intra.peff.net> (raw)
In-Reply-To: <20151229071847.GA8726@sigill.intra.peff.net>

The git-trailer command and its subfunctions work in only
one way: they take a set of trailer operations, and pass
through a file while performing those operations on it.

However, other parts of the system may want to simply parse
trailers, and we should be able to reuse the code here. This
patch provides a simple interface for parsing a commit
message with trailers, iterating over them, and retrieving
individual keys.

The trailer code is a little heavy on the use of strbufs, so
this is perhaps a bit slower than it would be if we were
able to parse the message in place (and this speed matters
when you are iterating over every commit in the repository).
However, there's nothing in this interface that paints us
too far into a corner; we can always optimize the internals
later.

Signed-off-by: Jeff King <peff@peff.net>
---
 trailer.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 trailer.h | 31 +++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+)

diff --git a/trailer.c b/trailer.c
index 18bf209..36ba476 100644
--- a/trailer.c
+++ b/trailer.c
@@ -882,3 +882,46 @@ void process_trailers(const char *file, int trim_empty, struct string_list *trai
 
 	strbuf_list_free(lines);
 }
+
+void trailer_parse_init(struct trailer_parse_context *ctx, const struct strbuf *buf)
+{
+	int nr_lines = 0;
+
+	init_trailer_config();
+
+	ctx->lines = strbuf_split(buf, '\n');
+	while (ctx->lines[nr_lines])
+		nr_lines++;
+
+	ctx->end = find_trailer_end(ctx->lines, nr_lines);
+	ctx->start = find_trailer_start(ctx->lines, ctx->end);
+
+	strbuf_init(&ctx->token, 0);
+	strbuf_init(&ctx->value, 0);
+}
+
+void trailer_parse_clear(struct trailer_parse_context *ctx)
+{
+	strbuf_list_free(ctx->lines);
+	strbuf_release(&ctx->token);
+	strbuf_release(&ctx->value);
+}
+
+const char *trailer_parse_match(struct trailer_parse_context *ctx, int line, const char *match)
+{
+	size_t len;
+
+	if (ctx->lines[line]->buf[0] == comment_line_char)
+		return NULL;
+
+	strbuf_reset(&ctx->token);
+	strbuf_reset(&ctx->value);
+	if (parse_trailer(&ctx->token, &ctx->value, ctx->lines[line]->buf))
+		return NULL;
+
+	len = token_len_without_separator(ctx->token.buf, ctx->token.len);
+	if (strncasecmp(ctx->token.buf, match, len) || match[len])
+		return NULL;
+
+	return ctx->value.buf;
+}
diff --git a/trailer.h b/trailer.h
index 8eb25d5..1f985f6 100644
--- a/trailer.h
+++ b/trailer.h
@@ -3,4 +3,35 @@
 
 void process_trailers(const char *file, int trim_empty, struct string_list *trailers);
 
+struct trailer_parse_context {
+	struct strbuf **lines;
+	int start;
+	int end;
+
+	/* These fields are private to the parser. */
+	struct strbuf token;
+	struct strbuf value;
+};
+
+/*
+ * Parse the commit message found in "buf", looking for trailers. Any data in
+ * ctx is overwritten, and should later be freed with trailer_parse_clear().
+ *
+ * The caller can iterate over all trailers using the "start" and "end" indices
+ * into "lines".
+ */
+void trailer_parse_init(struct trailer_parse_context *ctx, const struct strbuf *buf);
+
+/*
+ * If the line contains a trailer with key "trailer", returns a pointer into
+ * "line" for the value. Otherwise, returns NULL.
+ */
+const char *trailer_parse_match(struct trailer_parse_context *ctx, int line,
+				const char *trailer);
+
+/*
+ * Free resources allocated by trailer_parse_init().
+ */
+void trailer_parse_clear(struct trailer_parse_context *ctx);
+
 #endif /* TRAILER_H */
-- 
2.7.0.rc3.367.g09631da

  parent reply	other threads:[~2015-12-29  7:37 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-29  7:18 [PATCH 0/14] counting trailers with shortlogs Jeff King
2015-12-29  7:19 ` [PATCH 01/14] move string functions out of git-compat-util Jeff King
2015-12-29  7:20 ` [PATCH 02/14] log: refactor add_header to drop some magic numbers Jeff King
2015-12-31  6:21   ` Eric Sunshine
2016-01-01  8:42     ` Jeff King
2016-01-01  8:46       ` Jeff King
2015-12-29  7:22 ` [PATCH 03/14] strutil: add skip_prefix_icase Jeff King
2015-12-31  6:40   ` Eric Sunshine
2016-01-01  8:50     ` Jeff King
2015-12-29  7:27 ` [PATCH 04/14] shortlog: use skip_prefix_icase to parse "Author" lines Jeff King
2015-12-31  6:47   ` Eric Sunshine
2016-01-01  8:53     ` Jeff King
2015-12-29  7:28 ` [PATCH 05/14] shortlog: use strbufs to read from stdin Jeff King
2015-12-29  7:29 ` [PATCH 06/14] shortlog: replace hand-parsing of author with pretty-printer Jeff King
2016-01-04  9:43   ` Eric Sunshine
2016-01-04 10:17     ` Jeff King
2015-12-29  7:30 ` [PATCH 07/14] shortlog: optimize "--summary" mode Jeff King
2015-12-29  7:31 ` [PATCH 08/14] shortlog: optimize out useless "<none>" normalization Jeff King
2015-12-29  7:32 ` [PATCH 09/14] shortlog: optimize out useless string list Jeff King
2015-12-29  7:32 ` [PATCH 10/14] shortlog: change "author" variables to "ident" Jeff King
2015-12-29  7:35 ` [PATCH 11/14] shortlog: allow grouping by committer ident Jeff King
2016-01-04  9:44   ` Eric Sunshine
2016-01-04 10:23     ` Jeff King
2015-12-29  7:35 ` [PATCH 12/14] trailer: factor out config reading Jeff King
2015-12-29  7:36 ` Jeff King [this message]
2015-12-29  7:38 ` [PATCH 14/14] shortlog: match commit trailers with --ident Jeff King
2015-12-29  7:50   ` Jeff King
2016-01-04  9:44     ` Eric Sunshine
2016-01-04 10:31       ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151229073658.GM8842@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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).