diff --git a/convert-cache.c b/convert-cache.c
index 77f8bff9ac0cd61412e69921c610e7301f7c350b..95f0302f7abef98b785bb26edd1b5e2785d609d8 100644 (file)
--- a/convert-cache.c
+++ b/convert-cache.c
struct entry *entry;
if (get_sha1_hex(buffer, sha1))
struct entry *entry;
if (get_sha1_hex(buffer, sha1))
- die("bad sha1");
+ die("expected sha1, got '%s'", (char*) buffer);
entry = convert_entry(sha1);
memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
}
entry = convert_entry(sha1);
memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
}
+static unsigned int convert_mode(unsigned int mode)
+{
+ unsigned int newmode;
+
+ newmode = mode & S_IFMT;
+ if (S_ISREG(mode))
+ newmode |= (mode & 0100) ? 0755 : 0644;
+ return newmode;
+}
+
static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
{
char *new = xmalloc(size);
static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
{
char *new = xmalloc(size);
if (!path || sscanf(buffer, "%o", &mode) != 1)
die("bad tree conversion");
if (!path || sscanf(buffer, "%o", &mode) != 1)
die("bad tree conversion");
+ mode = convert_mode(mode);
path++;
if (memcmp(path, base, baselen))
break;
path++;
if (memcmp(path, base, baselen))
break;
@@ -260,6 +271,8 @@ static void convert_commit(void *buffer, unsigned long size, unsigned char *resu
void *orig_buffer = buffer;
unsigned long orig_size = size;
void *orig_buffer = buffer;
unsigned long orig_size = size;
+ if (memcmp(buffer, "tree ", 5))
+ die("Bad commit '%s'", (char*) buffer);
convert_ascii_sha1(buffer+5);
buffer += 46; /* "tree " + "hex sha1" + "\n" */
while (!memcmp(buffer, "parent ", 7)) {
convert_ascii_sha1(buffer+5);
buffer += 46; /* "tree " + "hex sha1" + "\n" */
while (!memcmp(buffer, "parent ", 7)) {
die("unknown object type '%s' in %s", type, sha1_to_hex(sha1));
entry->converted = 1;
free(buffer);
die("unknown object type '%s' in %s", type, sha1_to_hex(sha1));
entry->converted = 1;
free(buffer);
+ free(data);
return entry;
}
return entry;
}