From: Miklos Vajna <vmiklos@frugalware.org>
To: git@vger.kernel.org
Subject: [PATCH 07/10] git-fmt-merge-msg: make it useable from other builtins
Date: Thu, 5 Jun 2008 22:44:33 +0200 [thread overview]
Message-ID: <2e4b20178405cf993ce9e0f1ffe4ac402a96fd03.1212698317.git.vmiklos@frugalware.org> (raw)
In-Reply-To: <514d4184569ab033cad97be9afbd88c767bfb484.1212698317.git.vmiklos@frugalware.org>
In-Reply-To: <cover.1212698317.git.vmiklos@frugalware.org>
Move all functionality (except config and option parsing) from
cmd_fmt_merge_msg() to fmt_merge_msg(), so that other builtins can use
it without a child process.
All functions have been changed to use strbufs, and now only
cmd_fmt_merge_msg() reads directly from a file / writes anything to
stdout.
Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
---
builtin-fmt-merge-msg.c | 157 +++++++++++++++++++++++++++--------------------
builtin.h | 3 +
2 files changed, 94 insertions(+), 66 deletions(-)
diff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c
index b892621..5ec7195 100644
--- a/builtin-fmt-merge-msg.c
+++ b/builtin-fmt-merge-msg.c
@@ -159,23 +159,24 @@ static int handle_line(char *line)
}
static void print_joined(const char *singular, const char *plural,
- struct list *list)
+ struct list *list, struct strbuf *out)
{
if (list->nr == 0)
return;
if (list->nr == 1) {
- printf("%s%s", singular, list->list[0]);
+ strbuf_addf(out, "%s%s", singular, list->list[0]);
} else {
int i;
- printf("%s", plural);
+ strbuf_addf(out, "%s", plural);
for (i = 0; i < list->nr - 1; i++)
- printf("%s%s", i > 0 ? ", " : "", list->list[i]);
- printf(" and %s", list->list[list->nr - 1]);
+ strbuf_addf(out, "%s%s", i > 0 ? ", " : "", list->list[i]);
+ strbuf_addf(out, " and %s", list->list[list->nr - 1]);
}
}
static void shortlog(const char *name, unsigned char *sha1,
- struct commit *head, struct rev_info *rev, int limit)
+ struct commit *head, struct rev_info *rev, int limit,
+ struct strbuf *out)
{
int i, count = 0;
struct commit *commit;
@@ -232,15 +233,15 @@ static void shortlog(const char *name, unsigned char *sha1,
}
if (count > limit)
- printf("\n* %s: (%d commits)\n", name, count);
+ strbuf_addf(out, "\n* %s: (%d commits)\n", name, count);
else
- printf("\n* %s:\n", name);
+ strbuf_addf(out, "\n* %s:\n", name);
for (i = 0; i < subjects.nr; i++)
if (i >= limit)
- printf(" ...\n");
+ strbuf_addf(out, " ...\n");
else
- printf(" %s\n", subjects.list[i]);
+ strbuf_addf(out, " %s\n", subjects.list[i]);
clear_commit_marks((struct commit *)branch, flags);
clear_commit_marks(head, flags);
@@ -251,43 +252,13 @@ static void shortlog(const char *name, unsigned char *sha1,
free_list(&subjects);
}
-int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
-{
- int limit = 20, i = 0;
+int fmt_merge_msg(int merge_summary, struct strbuf *in, struct strbuf *out) {
+ int limit = 20, i = 0, pos = 0;
char line[1024];
- FILE *in = stdin;
- const char *sep = "";
+ char *p = line, *sep = "";
unsigned char head_sha1[20];
const char *current_branch;
- git_config(fmt_merge_msg_config, NULL);
-
- while (argc > 1) {
- if (!strcmp(argv[1], "--log") || !strcmp(argv[1], "--summary"))
- merge_summary = 1;
- else if (!strcmp(argv[1], "--no-log")
- || !strcmp(argv[1], "--no-summary"))
- merge_summary = 0;
- else if (!strcmp(argv[1], "-F") || !strcmp(argv[1], "--file")) {
- if (argc < 3)
- die ("Which file?");
- if (!strcmp(argv[2], "-"))
- in = stdin;
- else {
- fclose(in);
- in = fopen(argv[2], "r");
- if (!in)
- die("cannot open %s", argv[2]);
- }
- argc--; argv++;
- } else
- break;
- argc--; argv++;
- }
-
- if (argc > 1)
- usage(fmt_merge_msg_usage);
-
/* get current branch */
current_branch = resolve_ref("HEAD", head_sha1, 1, NULL);
if (!current_branch)
@@ -295,75 +266,129 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
if (!prefixcmp(current_branch, "refs/heads/"))
current_branch += 11;
- while (fgets(line, sizeof(line), in)) {
+ /* get a line */
+ for (;;) {
+ int len;
+ char *newline;
+
+ if (pos >= in->len)
+ break;
+ p = in->buf + pos;
+ newline = strchr(p, '\n');
+ len = newline ? newline - p : strlen(p);
+ pos += len + !!newline;
i++;
- if (line[0] == 0)
- continue;
- if (handle_line(line))
- die ("Error in line %d: %s", i, line);
+ p[len] = 0;
+ if (handle_line(p))
+ die ("Error in line %d: %.*s", i, len, p);
}
- printf("Merge ");
+ strbuf_addstr(out, "Merge ");
for (i = 0; i < srcs.nr; i++) {
struct src_data *src_data = srcs.payload[i];
const char *subsep = "";
- printf(sep);
+ strbuf_addstr(out, sep);
sep = "; ";
if (src_data->head_status == 1) {
- printf(srcs.list[i]);
+ strbuf_addstr(out, srcs.list[i]);
continue;
}
if (src_data->head_status == 3) {
subsep = ", ";
- printf("HEAD");
+ strbuf_addstr(out, "HEAD");
}
if (src_data->branch.nr) {
- printf(subsep);
+ strbuf_addstr(out, subsep);
subsep = ", ";
- print_joined("branch ", "branches ", &src_data->branch);
+ print_joined("branch ", "branches ", &src_data->branch,
+ out);
}
if (src_data->r_branch.nr) {
- printf(subsep);
+ strbuf_addstr(out, subsep);
subsep = ", ";
print_joined("remote branch ", "remote branches ",
- &src_data->r_branch);
+ &src_data->r_branch, out);
}
if (src_data->tag.nr) {
- printf(subsep);
+ strbuf_addstr(out, subsep);
subsep = ", ";
- print_joined("tag ", "tags ", &src_data->tag);
+ print_joined("tag ", "tags ", &src_data->tag, out);
}
if (src_data->generic.nr) {
- printf(subsep);
- print_joined("commit ", "commits ", &src_data->generic);
+ strbuf_addstr(out, subsep);
+ print_joined("commit ", "commits ", &src_data->generic,
+ out);
}
if (strcmp(".", srcs.list[i]))
- printf(" of %s", srcs.list[i]);
+ strbuf_addf(out, " of %s", srcs.list[i]);
}
if (!strcmp("master", current_branch))
- putchar('\n');
+ strbuf_addch(out, '\n');
else
- printf(" into %s\n", current_branch);
+ strbuf_addf(out, " into %s\n", current_branch);
if (merge_summary) {
struct commit *head;
struct rev_info rev;
head = lookup_commit(head_sha1);
- init_revisions(&rev, prefix);
+ init_revisions(&rev, NULL);
rev.commit_format = CMIT_FMT_ONELINE;
rev.ignore_merges = 1;
rev.limited = 1;
for (i = 0; i < origins.nr; i++)
shortlog(origins.list[i], origins.payload[i],
- head, &rev, limit);
+ head, &rev, limit, out);
}
+ return 0;
+}
+
+int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
+{
+ FILE *in = stdin;
+ struct strbuf input, output;
+ int ret;
+
+ git_config(fmt_merge_msg_config, NULL);
+
+ while (argc > 1) {
+ if (!strcmp(argv[1], "--log") || !strcmp(argv[1], "--summary"))
+ merge_summary = 1;
+ else if (!strcmp(argv[1], "--no-log")
+ || !strcmp(argv[1], "--no-summary"))
+ merge_summary = 0;
+ else if (!strcmp(argv[1], "-F") || !strcmp(argv[1], "--file")) {
+ if (argc < 3)
+ die ("Which file?");
+ if (!strcmp(argv[2], "-"))
+ in = stdin;
+ else {
+ fclose(in);
+ in = fopen(argv[2], "r");
+ if (!in)
+ die("cannot open %s", argv[2]);
+ }
+ argc--; argv++;
+ } else
+ break;
+ argc--; argv++;
+ }
+
+ if (argc > 1)
+ usage(fmt_merge_msg_usage);
- /* No cleanup yet; is standalone anyway */
+ strbuf_init(&input, 0);
+ if (strbuf_read(&input, fileno(in), 0) < 0)
+ die("could not read input file %s", strerror(errno));
+ strbuf_init(&output, 0);
+ ret = fmt_merge_msg(merge_summary, &input, &output);
+ if (ret)
+ return ret;
+ printf("%s", output.buf);
return 0;
}
diff --git a/builtin.h b/builtin.h
index 8bda111..9b928e2 100644
--- a/builtin.h
+++ b/builtin.h
@@ -2,6 +2,7 @@
#define BUILTIN_H
#include "git-compat-util.h"
+#include "strbuf.h"
extern const char git_version_string[];
extern const char git_usage_string[];
@@ -10,6 +11,8 @@ extern void list_common_cmds_help(void);
extern void help_unknown_cmd(const char *cmd);
extern void prune_packed_objects(int);
extern int read_line_with_nul(char *buf, int size, FILE *file);
+extern int fmt_merge_msg(int merge_summary, struct strbuf *in,
+ struct strbuf *out);
extern int cmd_add(int argc, const char **argv, const char *prefix);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
--
1.5.6.rc0.dirty
next prev parent reply other threads:[~2008-06-05 20:46 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-05 20:44 [PATCH 00/10] Build in merge Miklos Vajna
2008-06-05 20:44 ` [PATCH 01/10] Move split_cmdline() to alias.c Miklos Vajna
2008-06-05 20:44 ` [PATCH 02/10] Move commit_list_count() to commit.c Miklos Vajna
2008-06-05 20:44 ` [PATCH 03/10] Move builtin-remote's skip_prefix() to git-compat-util.h Miklos Vajna
2008-06-05 20:44 ` [PATCH 04/10] Add new test to ensure git-merge handles pull.twohead and pull.octopus Miklos Vajna
2008-06-05 20:44 ` [PATCH 05/10] parseopt: add a new PARSE_OPT_ARGV0_IS_AN_OPTION option Miklos Vajna
2008-06-05 20:44 ` [PATCH 06/10] Move read_cache_unmerged() to read-cache.c Miklos Vajna
2008-06-05 20:44 ` Miklos Vajna [this message]
2008-06-05 20:44 ` [PATCH 08/10] Introduce commit_list_append() in commit.c Miklos Vajna
2008-06-05 20:44 ` [PATCH 09/10] Introduce get_octopus_merge_bases() " Miklos Vajna
2008-06-05 20:44 ` [PATCH 10/10] Build in merge Miklos Vajna
2008-06-06 3:51 ` [PATCH 09/10] Introduce get_octopus_merge_bases() in commit.c Junio C Hamano
2008-06-06 5:53 ` Junio C Hamano
2008-06-06 12:28 ` Johannes Schindelin
2008-06-06 12:36 ` Johannes Schindelin
2008-06-06 15:36 ` Junio C Hamano
2008-06-07 21:38 ` [PATCH] " Miklos Vajna
2008-06-09 14:02 ` Johannes Schindelin
2008-06-09 22:43 ` Miklos Vajna
2008-06-09 22:55 ` Junio C Hamano
2008-06-09 23:08 ` Johannes Schindelin
2008-06-09 23:20 ` Junio C Hamano
2008-06-09 23:35 ` Miklos Vajna
2008-06-09 23:06 ` Junio C Hamano
2008-06-09 23:25 ` Miklos Vajna
2008-06-09 23:31 ` Johannes Schindelin
2008-06-09 23:41 ` Junio C Hamano
2008-06-10 0:03 ` Miklos Vajna
2008-06-10 2:43 ` Johannes Schindelin
2008-06-06 12:30 ` [PATCH 09/10] " Johannes Schindelin
2008-06-07 2:30 ` Miklos Vajna
2008-06-05 23:16 ` [PATCH 08/10] Introduce commit_list_append() " Junio C Hamano
2008-06-06 23:52 ` Miklos Vajna
2008-06-07 0:14 ` Junio C Hamano
2008-06-07 2:03 ` Miklos Vajna
2008-06-05 23:12 ` [PATCH 07/10] git-fmt-merge-msg: make it useable from other builtins Junio C Hamano
2008-06-07 1:04 ` Miklos Vajna
2008-06-09 8:58 ` Andreas Ericsson
2008-06-09 22:53 ` [PATCH] git-fmt-merge-msg: make it usable " Miklos Vajna
2008-06-05 23:05 ` [PATCH 06/10] Move read_cache_unmerged() to read-cache.c Junio C Hamano
2008-06-07 1:00 ` [PATCH] " Miklos Vajna
2008-06-05 22:58 ` [PATCH 04/10] Add new test to ensure git-merge handles pull.twohead and pull.octopus Junio C Hamano
2008-06-07 0:47 ` [PATCH] " Miklos Vajna
2008-06-05 22:38 ` [PATCH 03/10] Move builtin-remote's skip_prefix() to git-compat-util.h Junio C Hamano
2008-06-06 23:42 ` [PATCH] Move parse-options's " Miklos Vajna
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=2e4b20178405cf993ce9e0f1ffe4ac402a96fd03.1212698317.git.vmiklos@frugalware.org \
--to=vmiklos@frugalware.org \
--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).