aboutsummaryrefslogtreecommitdiffstats
path: root/commit-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'commit-tree.c')
-rw-r--r--commit-tree.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/commit-tree.c b/commit-tree.c
index 50fe19652f..cbb7d12a86 100644
--- a/commit-tree.c
+++ b/commit-tree.c
@@ -83,11 +83,11 @@ static void finish_buffer(char *tag, char **bufp, unsigned int *sizep)
static void remove_special(char *p)
{
char c;
- char *dst = p;
+ char *dst = p, *src = p;
for (;;) {
- c = *p;
- p++;
+ c = *src;
+ src++;
switch(c) {
case '\n': case '<': case '>':
continue;
@@ -96,6 +96,21 @@ static void remove_special(char *p)
if (!c)
break;
}
+
+ /*
+ * Go back, and remove crud from the end: some people
+ * have commas etc in their gecos field
+ */
+ dst--;
+ while (--dst >= p) {
+ unsigned char c = *dst;
+ switch (c) {
+ case ',': case ';': case '.':
+ *dst = 0;
+ continue;
+ }
+ break;
+ }
}
static const char *month_names[] = {
@@ -240,6 +255,18 @@ static void parse_rfc2822_date(char *date, char *result, int maxlen)
snprintf(result, maxlen, "%lu %5.5s", then, p);
}
+static void check_valid(unsigned char *sha1, const char *expect)
+{
+ void *buf;
+ char type[20];
+ unsigned long size;
+
+ buf = read_sha1_file(sha1, type, &size);
+ if (!buf || strcmp(type, expect))
+ die("%s is not a valid '%s' object", sha1_to_hex(sha1), expect);
+ free(buf);
+}
+
/*
* Having more than two parents may be strange, but hey, there's
* no conceptual reason why the file format couldn't accept multi-way
@@ -271,11 +298,13 @@ int main(int argc, char **argv)
if (argc < 2 || get_sha1_hex(argv[1], tree_sha1) < 0)
usage("commit-tree <sha1> [-p <sha1>]* < changelog");
+ check_valid(tree_sha1, "tree");
for (i = 2; i < argc; i += 2) {
char *a, *b;
a = argv[i]; b = argv[i+1];
if (!b || strcmp(a, "-p") || get_sha1_hex(b, parent_sha1[parents]))
usage("commit-tree <sha1> [-p <sha1>]* < changelog");
+ check_valid(parent_sha1[parents], "commit");
parents++;
}
if (!parents)