diff options
author | Junio C Hamano <junkio@cox.net> | 2006-12-13 11:10:24 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-13 11:10:24 -0800 |
commit | f388cec3d77751a6c20b3b10415344f5355b5a2f (patch) | |
tree | 557f4a01f9da0851617f290aa556e56e5c07092b /unpack-trees.c | |
parent | d0085ade9598942077f12f22b16978411d15188a (diff) | |
parent | 22f741dab7cc93f00f7cf96cd65d7481677cd855 (diff) | |
download | git-f388cec3d77751a6c20b3b10415344f5355b5a2f.tar.gz |
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.
Diffstat (limited to 'unpack-trees.c')
-rw-r--r-- | unpack-trees.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/unpack-trees.c b/unpack-trees.c index 47aa804a86..b8689ebc86 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1,6 +1,7 @@ #include <signal.h> #include <sys/time.h> #include "cache.h" +#include "dir.h" #include "tree.h" #include "tree-walk.h" #include "cache-tree.h" @@ -77,6 +78,12 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len, { 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 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len, } /* 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 @@ static int unpack_trees_rec(struct tree_entry_list **posns, int len, 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 @@ -458,7 +472,7 @@ static void invalidate_ce_path(struct cache_entry *ce) /* * 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 +481,7 @@ static void verify_absent(const char *path, const char *action, 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); } |