From b2fbfc22526fb2a1f56ef56836b7412c53524e60 Mon Sep 17 00:00:00 2001 From: Riesen Date: Wed, 28 Jun 2006 10:45:05 +0200 Subject: fix processEntries to avoid multiple calls to write-tree and update-index --- merge-recursive.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 files changed, 36 insertions(+), 11 deletions(-) diff --git a/merge-recursive.c b/merge-recursive.c index ba5b024..5b7ed51 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -19,6 +19,13 @@ #include "run-command.h" #include "graph.h" #include "path-list.h" +#define DEBUG +#ifdef DEBUG +#define debug(args, ...) fprintf(stderr, args, ## __VA_ARGS__) +#else +#define debug(args, ...) +#endif + #define for_each_commit(p,list) for ( p = (list); p; p = p->next ) struct merge_result @@ -345,9 +352,14 @@ int getFilesAndDirs(struct tree *tree, path_list_clear(dirs, 1); data.files = files; data.dirs = dirs; - if ( read_tree_rt(tree, "", 0, save_files_dirs, &data) != 0 ) + debug("getFilesAndDirs ...\n"); + if ( read_tree_rt(tree, "", 0, save_files_dirs, &data) != 0 ) { + debug("\tgetFilesAndDirs done (0)\n"); return 0; - return path_list_count(files) + path_list_count(dirs); + } + int n = path_list_count(files) + path_list_count(dirs); + debug("\tgetFilesAndDirs done (%d)\n", n); + return n; } struct index_entry *index_entry_find(struct index_entry *ents, const char *path) @@ -478,6 +490,7 @@ struct index_entry *unmergedCacheEntries FILE *fp = popen("git-ls-files -z --unmerged", "r"); if ( !fp ) return NULL; + debug("unmergedCacheEntries...\n"); int ch; while ( !feof(fp) ) { unsigned mode; @@ -524,6 +537,7 @@ struct index_entry *unmergedCacheEntries while ( (ch = fgetc(fp)) != EOF && ch ); } pclose(fp); + debug("\tunmergedCacheEntries done\n"); return unmerged; } @@ -595,6 +609,7 @@ struct rename_entry *getRenames(struct t struct tree *bTree, struct index_entry **entries) { + debug("getRenames ...\n"); struct rename_entry *renames = NULL; struct rename_entry **rptr = &renames; struct diff_options opts; @@ -639,6 +654,7 @@ struct rename_entry *getRenames(struct t } opts.output_format = DIFF_FORMAT_NO_OUTPUT; diff_flush(&opts); + debug("\tgetRenames done\n"); return renames; } @@ -991,6 +1007,7 @@ int processRenames(struct rename_entry * const char *branchNameA, const char *branchNameB) { + debug("processRenames...\n"); int cleanMerge = 1; struct path_list srcNames = {NULL, 0, 0}; @@ -1207,6 +1224,7 @@ int processRenames(struct rename_entry * if (pclose(fp)) { die("git update-index --index-info failed"); } + debug("\tprocessRenames done\n"); return cleanMerge; } @@ -1223,7 +1241,8 @@ static int sha_eq(const unsigned char *a } /* Per entry merge function */ -int processEntry(struct index_entry *entry, +int processEntry(FILE *fp, + struct index_entry *entry, const char *branch1Name, const char *branch2Name) { @@ -1239,7 +1258,6 @@ int processEntry(struct index_entry *ent unsigned oMode = entry->stages[1].mode; unsigned aMode = entry->stages[2].mode; unsigned bMode = entry->stages[3].mode; - FILE *fp = git_update_index_pipe(); if ( oSha && (!aSha || !bSha) ) { /* Case A: Deleted in one */ @@ -1353,8 +1371,6 @@ int processEntry(struct index_entry *ent } else die("Fatal merge failure, shouldn't happen."); - if (pclose(fp)) - die("updating entry failed in git update-index"); return cleanMerge; } @@ -1373,6 +1389,7 @@ struct merge_tree_result merge_trees(str return result; } + debug("merge_trees ...\n"); code = git_merge_trees(index_only ? "-i": "-u", common, head, merge); if ( code != 0 ) @@ -1397,17 +1414,22 @@ struct merge_tree_result merge_trees(str renamesMerge = getRenames(merge, common, head, merge, &entries); result.clean = processRenames(renamesHead, renamesMerge, branch1Name, branch2Name); + debug("\tprocessing entries...\n"); + FILE *fp = git_update_index_pipe(); struct index_entry *e; for ( e = entries; e; e = e->next ) { if ( e->processed ) continue; - if ( !processEntry(e, branch1Name, branch2Name) ) + if ( !processEntry(fp, e, branch1Name, branch2Name) ) result.clean = 0; - if ( result.clean || index_only ) - result.tree = git_write_tree(); - else - result.tree = NULL; } + if (pclose(fp)) + die("updating entry failed in git update-index"); + if ( result.clean || index_only ) + result.tree = git_write_tree(); + else + result.tree = NULL; + debug("\t\tprocessing entries done\n"); free_rename_entries(&renamesMerge); free_rename_entries(&renamesHead); free_index_entries(&entries); @@ -1419,6 +1441,7 @@ struct merge_tree_result merge_trees(str sha1_to_hex(result.tree->object.sha1)); } + debug("\tmerge_trees done\n"); return result; } @@ -1558,7 +1581,9 @@ int main(int argc, char *argv[]) struct node_list *commits = NULL; node_list_insert(h1, &commits); node_list_insert(h2, &commits->next); + debug("building graph...\n"); struct graph *graph = graph_build(commits); + debug("\tbuilding graph...\n"); result = merge(h1, h2, branch1, branch2, graph, 0, NULL); } return result.clean ? 0: 1; -- 1.4.1.rc1.g8b09-dirty