{"thread":{"id":"11740","subject":"[PATCH 2/9] Add flag to make unpack_trees() not print errors.","startedAt":"2008-01-25T23:24:43Z","lastAt":"2008-01-25T23:24:43Z","messageCount":1,"participants":["Daniel Barkalow"],"isPatch":true,"patchVersion":1,"patchTotal":9},"messages":[{"id":"66607","messageId":"alpine.LNX.1.00.0801251819440.13593@iabervon.org","threadId":"11740","inReplyTo":null,"subject":"[PATCH 2/9] Add flag to make unpack_trees() not print errors.","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2008-01-25T23:24:43Z","receivedAt":"2008-01-25T23:24:43Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"This will allow builtin-checkout to suppress merge errors if it's\ngoing to try more merging methods.\n\nAdditionally, if unpack_trees() returns with an error, but without\nprinting anything, it will roll back any changes to the index (by\nrereading the index, currently). This obviously could be done by the\ncaller, but chances are that the caller would forget and debugging\nthis is difficult.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\n unpack-trees.c |   43 +++++++++++++++++++++++++++++--------------\n unpack-trees.h |    1 +\n 2 files changed, 30 insertions(+), 14 deletions(-)\n\ndiff --git a/unpack-trees.c b/unpack-trees.c\nindex a56e1c9..fc0d2c7 100644\n--- a/unpack-trees.c\n+++ b/unpack-trees.c\n@@ -357,12 +357,23 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options\n \t\t\tposns[i] = create_tree_entry_list(t+i);\n \n \t\tif (unpack_trees_rec(posns, len, o->prefix ? o->prefix : \"\",\n-\t\t\t\t     o, &df_conflict_list))\n+\t\t\t\t     o, &df_conflict_list)) {\n+\t\t\tif (o->gently) {\n+\t\t\t\tdiscard_cache();\n+\t\t\t\tread_cache();\n+\t\t\t}\n \t\t\treturn -1;\n+\t\t}\n \t}\n \n-\tif (o->trivial_merges_only && o->nontrivial_merge)\n-\t\treturn error(\"Merge requires file-level merging\");\n+\tif (o->trivial_merges_only && o->nontrivial_merge) {\n+\t\tif (o->gently) {\n+\t\t\tdiscard_cache();\n+\t\t\tread_cache();\n+\t\t}\n+\t\treturn o->gently ? -1 :\n+\t\t\terror(\"Merge requires file-level merging\");\n+\t}\n \n \tcheck_updates(active_cache, active_nr, o);\n \treturn 0;\n@@ -416,7 +427,8 @@ static int verify_uptodate(struct cache_entry *ce,\n \t}\n \tif (errno == ENOENT)\n \t\treturn 0;\n-\treturn error(\"Entry '%s' not uptodate. Cannot merge.\", ce->name);\n+\treturn o->gently ? -1 :\n+\t\terror(\"Entry '%s' not uptodate. Cannot merge.\", ce->name);\n }\n \n static void invalidate_ce_path(struct cache_entry *ce)\n@@ -502,8 +514,9 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,\n \t\td.exclude_per_dir = o->dir->exclude_per_dir;\n \ti = read_directory(&d, ce->name, pathbuf, namelen+1, NULL);\n \tif (i)\n-\t\treturn error(\"Updating '%s' would lose untracked files in it\",\n-\t\t\t     ce->name);\n+\t\treturn o->gently ? -1 :\n+\t\t\terror(\"Updating '%s' would lose untracked files in it\",\n+\t\t\t      ce->name);\n \tfree(pathbuf);\n \treturn cnt;\n }\n@@ -575,8 +588,9 @@ static int verify_absent(struct cache_entry *ce, const char *action,\n \t\t\t\treturn 0;\n \t\t}\n \n-\t\treturn error(\"Untracked working tree file '%s' \"\n-\t\t\t     \"would be %s by merge.\", ce->name, action);\n+\t\treturn o->gently ? -1 :\n+\t\t\terror(\"Untracked working tree file '%s' \"\n+\t\t\t      \"would be %s by merge.\", ce->name, action);\n \t}\n \treturn 0;\n }\n@@ -708,7 +722,7 @@ int threeway_merge(struct cache_entry **stages,\n \t/* #14, #14ALT, #2ALT */\n \tif (remote && !df_conflict_head && head_match && !remote_match) {\n \t\tif (index && !same(index, remote) && !same(index, head))\n-\t\t\treturn reject_merge(index);\n+\t\t\treturn o->gently ? -1 : reject_merge(index);\n \t\treturn merged_entry(remote, index, o);\n \t}\n \t/*\n@@ -716,7 +730,7 @@ int threeway_merge(struct cache_entry **stages,\n \t * make sure that it matches head.\n \t */\n \tif (index && !same(index, head)) {\n-\t\treturn reject_merge(index);\n+\t\treturn o->gently ? -1 : reject_merge(index);\n \t}\n \n \tif (head) {\n@@ -867,11 +881,11 @@ int twoway_merge(struct cache_entry **src,\n \t\t\t/* all other failures */\n \t\t\tremove_entry(remove);\n \t\t\tif (oldtree)\n-\t\t\t\treturn reject_merge(oldtree);\n+\t\t\t\treturn o->gently ? -1 : reject_merge(oldtree);\n \t\t\tif (current)\n-\t\t\t\treturn reject_merge(current);\n+\t\t\t\treturn o->gently ? -1 : reject_merge(current);\n \t\t\tif (newtree)\n-\t\t\t\treturn reject_merge(newtree);\n+\t\t\t\treturn o->gently ? -1 : reject_merge(newtree);\n \t\t\treturn -1;\n \t\t}\n \t}\n@@ -898,7 +912,8 @@ int bind_merge(struct cache_entry **src,\n \t\treturn error(\"Cannot do a bind merge of %d trees\\n\",\n \t\t\t     o->merge_size);\n \tif (a && old)\n-\t\treturn error(\"Entry '%s' overlaps.  Cannot bind.\", a->name);\n+\t\treturn o->gently ? -1 :\n+\t\t\terror(\"Entry '%s' overlaps.  Cannot bind.\", a->name);\n \tif (!a)\n \t\treturn keep_entry(old, o);\n \telse\ndiff --git a/unpack-trees.h b/unpack-trees.h\nindex 5517faa..619950d 100644\n--- a/unpack-trees.h\n+++ b/unpack-trees.h\n@@ -16,6 +16,7 @@ struct unpack_trees_options {\n \tint trivial_merges_only;\n \tint verbose_update;\n \tint aggressive;\n+\tint gently;\n \tconst char *prefix;\n \tint pos;\n \tstruct dir_struct *dir;\n-- \n1.5.4.rc3.4.g16335\n"}]}