summaryrefslogtreecommitdiff
path: root/strbuf.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-04-26 01:26:45 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-26 01:26:45 (GMT)
commitd1df5743809614241883ecad51876607cf432034 (patch)
treeb49d0923200e1a1e765e88b044ed3c90100f8465 /strbuf.c
parent86436c28289eedd2ee9b7f9c872a0ed039866a0f (diff)
downloadgit-d1df5743809614241883ecad51876607cf432034.zip
git-d1df5743809614241883ecad51876607cf432034.tar.gz
git-d1df5743809614241883ecad51876607cf432034.tar.bz2
[PATCH] Introduce diff-tree-helper.
This patch introduces a new program, diff-tree-helper. It reads output from diff-cache and diff-tree, and produces a patch file. The diff format customization can be done the same way the show-diff uses; the same external diff interface introduced by the previous patch to drive diff from show-diff is used so this is not surprising. It is used like the following examples: $ diff-cache --cached -z <tree> | diff-tree-helper -z -R paths... $ diff-tree -r -z <tree1> <tree2> | diff-tree-helper -z paths... - As usual, the use of the -z flag is recommended in the script to pass NUL-terminated filenames through the pipe between commands. - The -R flag is used to generate reverse diff. It does not matter for diff-tree case, but it is sometimes useful to get a patch in the desired direction out of diff-cache. - The paths parameters are used to restrict the paths that appears in the output. Again this is useful to use with diff-cache, which, unlike diff-tree, does not take such paths restriction parameters. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'strbuf.c')
-rw-r--r--strbuf.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/strbuf.c b/strbuf.c
new file mode 100644
index 0000000..dac945c
--- /dev/null
+++ b/strbuf.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "strbuf.h"
+
+void strbuf_init(struct strbuf *sb) {
+ sb->buf = 0;
+ sb->eof = sb->alloc = sb->len = 0;
+}
+
+static void strbuf_begin(struct strbuf *sb) {
+ free(sb->buf);
+ strbuf_init(sb);
+}
+
+static void inline strbuf_add(struct strbuf *sb, int ch) {
+ if (sb->alloc <= sb->len) {
+ sb->alloc = sb->alloc * 3 / 2 + 16;
+ sb->buf = realloc(sb->buf, sb->alloc);
+ }
+ sb->buf[sb->len++] = ch;
+}
+
+static void strbuf_end(struct strbuf *sb) {
+ strbuf_add(sb, 0);
+}
+
+void read_line(struct strbuf *sb, FILE *fp, int term) {
+ int ch;
+ strbuf_begin(sb);
+ if (feof(fp)) {
+ sb->eof = 1;
+ return;
+ }
+ while ((ch = fgetc(fp)) != EOF) {
+ if (ch == term)
+ break;
+ strbuf_add(sb, ch);
+ }
+ if (sb->len == 0)
+ sb->eof = 1;
+ strbuf_end(sb);
+}
+