X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=convert-cache.c;h=77f8bff9ac0cd61412e69921c610e7301f7c350b;hb=deb153a75ae1f5eca628a38b911474a69edd242d;hp=35191dffa7cba3de5297111c1ffa4253df6124a7;hpb=bfac5d94291bdb951ae3e739598a32bf868ea806;p=git.git diff --git a/convert-cache.c b/convert-cache.c index 35191dff..77f8bff9 100644 --- a/convert-cache.c +++ b/convert-cache.c @@ -18,8 +18,7 @@ static struct entry * convert_entry(unsigned char *sha1); static struct entry *insert_new(unsigned char *sha1, int pos) { - struct entry *new = malloc(sizeof(struct entry)); - + struct entry *new = xmalloc(sizeof(struct entry)); memset(new, 0, sizeof(*new)); memcpy(new->old_sha1, sha1, 20); memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *)); @@ -66,25 +65,11 @@ static void convert_ascii_sha1(void *buffer) memcpy(buffer, sha1_to_hex(entry->new_sha1), 40); } -#define ORIG_OFFSET (40) - -static int prepend_integer(char *buffer, unsigned val, int i) -{ - buffer[--i] = '\0'; - do { - buffer[--i] = '0' + (val % 10); - val /= 10; - } while (val); - return i; -} - - static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1) { - char *new = malloc(size + ORIG_OFFSET); - unsigned long newlen = ORIG_OFFSET; + char *new = xmalloc(size); + unsigned long newlen = 0; unsigned long used; - int i; used = 0; while (size) { @@ -114,7 +99,7 @@ static int write_subdirectory(void *buffer, unsigned long size, const char *base continue; } - newlen += sprintf(new + newlen, "%o %.*s", S_IFDIR, slash - path, path); + newlen += sprintf(new + newlen, "%o %.*s", S_IFDIR, (int)(slash - path), path); new[newlen++] = 0; sha1 = (unsigned char *)(new + newlen); newlen += 20; @@ -126,11 +111,7 @@ static int write_subdirectory(void *buffer, unsigned long size, const char *base buffer += len; } - i = prepend_integer(new, newlen - ORIG_OFFSET, ORIG_OFFSET); - i -= 5; - memcpy(new + i, "tree ", 5); - - write_sha1_file(new + i, newlen - i, result_sha1); + write_sha1_file(new, newlen, "tree", result_sha1); free(new); return used; } @@ -170,7 +151,7 @@ static unsigned long parse_oldstyle_date(const char *buf) }; /* We only ever did two timezones in the bad old format .. */ const char *timezones[] = { - "PDT", "PST", NULL + "PDT", "PST", "CEST", NULL }; const char **fmt = formats; @@ -229,19 +210,24 @@ static int convert_date_line(char *dst, void **buf, unsigned long *sp) if (isdigit(*date)) { int datelen = next - date; memcpy(dst, date, datelen); - printf("new format date '%.*s'?\n", datelen-1, date); return len + datelen; } + /* + * Hacky hacky: one of the sparse old-style commits does not have + * any date at all, but we can fake it by using the committer date. + */ + if (*date == '\n' && strchr(next, '>')) + date = strchr(next, '>')+2; + return len + sprintf(dst, "%lu -0700\n", parse_oldstyle_date(date)); } static void convert_date(void *buffer, unsigned long size, unsigned char *result_sha1) { - char *new = malloc(size + ORIG_OFFSET + 100); - unsigned long newlen = ORIG_OFFSET; - int i; - + char *new = xmalloc(size + 100); + unsigned long newlen = 0; + // "tree \n" memcpy(new + newlen, buffer, 46); newlen += 46; @@ -265,11 +251,7 @@ static void convert_date(void *buffer, unsigned long size, unsigned char *result memcpy(new + newlen, buffer, size); newlen += size; - i = prepend_integer(new, newlen - ORIG_OFFSET, ORIG_OFFSET); - i -= 7; - memcpy(new + i, "commit ", 7); - - write_sha1_file(new + i, newlen - i, result_sha1); + write_sha1_file(new, newlen, "commit", result_sha1); free(new); } @@ -292,7 +274,7 @@ static struct entry * convert_entry(unsigned char *sha1) struct entry *entry = lookup_entry(sha1); char type[20]; void *buffer, *data; - unsigned long size, offset; + unsigned long size; if (entry->converted) return entry; @@ -300,16 +282,15 @@ static struct entry * convert_entry(unsigned char *sha1) if (!data) die("unable to read object %s", sha1_to_hex(sha1)); - buffer = malloc(size + 100); - offset = sprintf(buffer, "%s %lu", type, size)+1; - memcpy(buffer + offset, data, size); + buffer = xmalloc(size); + memcpy(buffer, data, size); if (!strcmp(type, "blob")) { - write_sha1_file(buffer, size + offset, entry->new_sha1); + write_sha1_file(buffer, size, "blob", entry->new_sha1); } else if (!strcmp(type, "tree")) - convert_tree(buffer + offset, size, entry->new_sha1); + convert_tree(buffer, size, entry->new_sha1); else if (!strcmp(type, "commit")) - convert_commit(buffer + offset, size, entry->new_sha1); + convert_commit(buffer, size, entry->new_sha1); else die("unknown object type '%s' in %s", type, sha1_to_hex(sha1)); entry->converted = 1; @@ -322,8 +303,8 @@ int main(int argc, char **argv) unsigned char sha1[20]; struct entry *entry; - if (argc != 2 || get_sha1_hex(argv[1], sha1)) - usage("convert-cache "); + if (argc != 2 || get_sha1(argv[1], sha1)) + usage("git-convert-cache "); entry = convert_entry(sha1); printf("new sha1: %s\n", sha1_to_hex(entry->new_sha1));