git-svn: test that extra blank lines aren't inserted in commit messages.
[gitweb.git] / builtin-fast-export.c
old mode 100755 (executable)
new mode 100644 (file)
index 2136aad..d0a462f
@@ -103,7 +103,7 @@ static void handle_object(const unsigned char *sha1)
        mark_object(object);
 
        printf("blob\nmark :%d\ndata %lu\n", last_idnum, size);
-       if (fwrite(buf, size, 1, stdout) != 1)
+       if (size && fwrite(buf, size, 1, stdout) != 1)
                die ("Could not write blob %s", sha1_to_hex(sha1));
        printf("\n");
 
@@ -123,7 +123,7 @@ static void show_filemodify(struct diff_queue_struct *q,
                        printf("D %s\n", spec->path);
                else {
                        struct object *object = lookup_object(spec->sha1);
-                       printf("M 0%06o :%d %s\n", spec->mode,
+                       printf("M %06o :%d %s\n", spec->mode,
                               get_object_mark(object), spec->path);
                }
        }
@@ -188,6 +188,8 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
        mark_object(&commit->object);
        if (!is_encoding_utf8(encoding))
                reencoded = reencode_string(message, "UTF-8", encoding);
+       if (!commit->parents)
+               printf("reset %s\n", (const char*)commit->util);
        printf("commit %s\nmark :%d\n%.*s\n%.*s\ndata %u\n%s",
               (const char *)commit->util, last_idnum,
               (int)(author_end - author), author,
@@ -196,8 +198,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
                          ? strlen(reencoded) : message
                          ? strlen(message) : 0),
               reencoded ? reencoded : message ? message : "");
-       if (reencoded)
-               free(reencoded);
+       free(reencoded);
 
        for (i = 0, p = commit->parents; p; p = p->next) {
                int mark = get_object_mark(&p->item->object);
@@ -205,14 +206,10 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
                        continue;
                if (i == 0)
                        printf("from :%d\n", mark);
-               else if (i == 1)
-                       printf("merge :%d", mark);
                else
-                       printf(" :%d", mark);
+                       printf("merge :%d\n", mark);
                i++;
        }
-       if (i > 1)
-               printf("\n");
 
        log_tree_diff_flush(rev);
        rev->diffopt.output_format = saved_output_format;
@@ -373,7 +370,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
        };
 
        /* we handle encodings */
-       git_config(git_default_config);
+       git_config(git_default_config, NULL);
 
        init_revisions(&revs, prefix);
        argc = setup_revisions(argc, argv, &revs, NULL);
@@ -383,7 +380,8 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
 
        get_tags_and_duplicates(&revs.pending, &extra_refs);
 
-       prepare_revision_walk(&revs);
+       if (prepare_revision_walk(&revs))
+               die("revision walk setup failed");
        revs.diffopt.format_callback = show_filemodify;
        DIFF_OPT_SET(&revs.diffopt, RECURSIVE);
        while ((commit = get_revision(&revs))) {