From: Junio C Hamano Date: Wed, 13 Dec 2006 19:10:24 +0000 (-0800) Subject: Merge branch 'jc/read-tree-ignore' X-Git-Tag: v1.5.0-rc0~118 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/f388cec3d77751a6c20b3b10415344f5355b5a2f?ds=inline;hp=-c Merge branch 'jc/read-tree-ignore' * jc/read-tree-ignore: read-tree: document --exclude-per-directory Loosen "working file will be lost" check in Porcelain-ish read-tree: further loosen "working file will be lost" check. --- f388cec3d77751a6c20b3b10415344f5355b5a2f diff --combined git-merge.sh index 2f3d936b9c,397b33f8d3..c895a04f6b --- a/git-merge.sh +++ b/git-merge.sh @@@ -188,9 -188,8 +188,9 @@@ els # in this loop. merge_name=$(for remote do - rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) && - bh=$(git show-ref -s --verify "refs/heads/$remote") && + rh=$(git-rev-parse --verify "$remote"^0 2>/dev/null) || + continue ;# not something we can merge + bh=$(git show-ref -s --verify "refs/heads/$remote" 2>/dev/null) if test "$rh" = "$bh" then echo "$rh branch '$remote' of ." @@@ -265,7 -264,7 +265,7 @@@ f,* echo "Updating $(git-rev-parse --short $head)..$(git-rev-parse --short $1)" git-update-index --refresh 2>/dev/null new_head=$(git-rev-parse --verify "$1^0") && - git-read-tree -u -v -m $head "$new_head" && + git-read-tree -v -m -u --exclude-per-directory=.gitignore $head "$new_head" && finish "$new_head" "Fast forward" dropsave exit 0 @@@ -400,14 -399,7 +400,14 @@@ f case "$best_strategy" in '') restorestate - echo >&2 "No merge strategy handled the merge." + case "$use_strategies" in + ?*' '?*) + echo >&2 "No merge strategy handled the merge." + ;; + *) + echo >&2 "Merge with strategy $use_strategies failed." + ;; + esac exit 2 ;; "$wt_strategy") diff --combined unpack-trees.c index 47aa804a86,79d21e2e8d..b8689ebc86 --- a/unpack-trees.c +++ b/unpack-trees.c @@@ -1,6 -1,7 +1,7 @@@ #include #include #include "cache.h" + #include "dir.h" #include "tree.h" #include "tree-walk.h" #include "cache-tree.h" @@@ -77,6 -78,12 +78,12 @@@ static int unpack_trees_rec(struct tree { int baselen = strlen(base); int src_size = len + 1; + int i_stk = i_stk; + int retval = 0; + + if (o->dir) + i_stk = push_exclude_per_directory(o->dir, base, strlen(base)); + do { int i; const char *first; @@@ -143,7 -150,7 +150,7 @@@ } /* No name means we're done */ if (!first) - return 0; + goto leave_directory; pathlen = strlen(first); ce_size = cache_entry_size(baselen + pathlen); @@@ -240,13 -247,20 +247,20 @@@ newbase[baselen + pathlen] = '/'; newbase[baselen + pathlen + 1] = '\0'; if (unpack_trees_rec(subposns, len, newbase, o, - indpos, df_conflict_list)) - return -1; + indpos, df_conflict_list)) { + retval = -1; + goto leave_directory; + } free(newbase); } free(subposns); free(src); } while (1); + + leave_directory: + if (o->dir) + pop_exclude_per_directory(o->dir, i_stk); + return retval; } /* Unlink the last component and attempt to remove leading @@@ -370,7 -384,7 +384,7 @@@ int unpack_trees(struct object_list *tr int i; struct object_list *posn = trees; struct tree_entry_list df_conflict_list; - struct cache_entry df_conflict_entry; + static struct cache_entry *dfc; memset(&df_conflict_list, 0, sizeof(df_conflict_list)); df_conflict_list.next = &df_conflict_list; @@@ -381,10 -395,8 +395,10 @@@ state.refresh_cache = 1; o->merge_size = len; - memset(&df_conflict_entry, 0, sizeof(df_conflict_entry)); - o->df_conflict_entry = &df_conflict_entry; + + if (!dfc) + dfc = xcalloc(1, sizeof(struct cache_entry) + 1); + o->df_conflict_entry = dfc; if (len) { posns = xmalloc(len * sizeof(struct tree_entry_list *)); @@@ -458,7 -470,7 +472,7 @@@ static void invalidate_ce_path(struct c /* * We do not want to remove or overwrite a working tree file that - * is not tracked. + * is not tracked, unless it is ignored. */ static void verify_absent(const char *path, const char *action, struct unpack_trees_options *o) @@@ -467,7 -479,7 +481,7 @@@ if (o->index_only || o->reset || !o->update) return; - if (!lstat(path, &st)) + if (!lstat(path, &st) && !(o->dir && excluded(o->dir, path))) die("Untracked working tree file '%s' " "would be %s by merge.", path, action); }