Merge branch 'en/fast-export-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 31 Aug 2010 23:15:20 +0000 (16:15 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 31 Aug 2010 23:15:20 +0000 (16:15 -0700)
* en/fast-export-fix:
fast-export: Add a --full-tree option
fast-export: Fix dropping of files with --import-marks and path limiting

1  2 
builtin/fast-export.c
diff --combined builtin/fast-export.c
index ab792d5db2ba6e96acd6f8401879442667b66cfb,8c7760279d3022b7a47390435ce0d2d407e6ce1d..66cafe63301ab242b4e7994ba08d9c75d33eca62
@@@ -27,6 -27,7 +27,7 @@@ static enum { ABORT, VERBATIM, WARN, ST
  static enum { ERROR, DROP, REWRITE } tag_of_filtered_mode = ABORT;
  static int fake_missing_tagger;
  static int no_data;
+ static int full_tree;
  
  static int parse_opt_signed_tag_mode(const struct option *opt,
                                     const char *arg, int unset)
@@@ -241,7 -242,8 +242,8 @@@ static void handle_commit(struct commi
                message += 2;
  
        if (commit->parents &&
-           get_object_mark(&commit->parents->item->object) != 0) {
+           get_object_mark(&commit->parents->item->object) != 0 &&
+           !full_tree) {
                parse_commit(commit->parents->item);
                diff_tree_sha1(commit->parents->item->tree->object.sha1,
                               commit->tree->object.sha1, "", &rev->diffopt);
                i++;
        }
  
+       if (full_tree)
+               printf("deleteall\n");
        log_tree_diff_flush(rev);
        rev->diffopt.output_format = saved_output_format;
  
@@@ -438,7 -442,7 +442,7 @@@ static void get_tags_and_duplicates(str
                        /* handle nested tags */
                        while (tag && tag->object.type == OBJ_TAG) {
                                parse_object(tag->object.sha1);
 -                              string_list_append(full_name, extra_refs)->util = tag;
 +                              string_list_append(extra_refs, full_name)->util = tag;
                                tag = (struct tag *)tag->tagged;
                        }
                        if (!tag)
                }
                if (commit->util)
                        /* more than one name for the same object */
 -                      string_list_append(full_name, extra_refs)->util = commit;
 +                      string_list_append(extra_refs, full_name)->util = commit;
                else
                        commit->util = full_name;
        }
@@@ -565,8 -569,8 +569,8 @@@ static void import_marks(char *input_fi
  int cmd_fast_export(int argc, const char **argv, const char *prefix)
  {
        struct rev_info revs;
 -      struct object_array commits = { 0, 0, NULL };
 -      struct string_list extra_refs = { NULL, 0, 0, 0 };
 +      struct object_array commits = OBJECT_ARRAY_INIT;
 +      struct string_list extra_refs = STRING_LIST_INIT_NODUP;
        struct commit *commit;
        char *export_filename = NULL, *import_filename = NULL;
        struct option options[] = {
                             "Import marks from this file"),
                OPT_BOOLEAN(0, "fake-missing-tagger", &fake_missing_tagger,
                             "Fake a tagger when tags lack one"),
+               OPT_BOOLEAN(0, "full-tree", &full_tree,
+                            "Output full tree for each commit"),
                { OPTION_NEGBIT, 0, "data", &no_data, NULL,
                        "Skip output of blob data",
                        PARSE_OPT_NOARG | PARSE_OPT_NEGHELP, NULL, 1 },
        if (import_filename)
                import_marks(import_filename);
  
+       if (import_filename && revs.prune_data)
+               full_tree = 1;
        get_tags_and_duplicates(&revs.pending, &extra_refs);
  
        if (prepare_revision_walk(&revs))