summaryrefslogtreecommitdiff
path: root/unpack-trees.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-13 19:10:24 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-12-13 19:10:24 (GMT)
commitf388cec3d77751a6c20b3b10415344f5355b5a2f (patch)
tree557f4a01f9da0851617f290aa556e56e5c07092b /unpack-trees.c
parentd0085ade9598942077f12f22b16978411d15188a (diff)
parent22f741dab7cc93f00f7cf96cd65d7481677cd855 (diff)
downloadgit-f388cec3d77751a6c20b3b10415344f5355b5a2f.zip
git-f388cec3d77751a6c20b3b10415344f5355b5a2f.tar.gz
git-f388cec3d77751a6c20b3b10415344f5355b5a2f.tar.bz2
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.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/unpack-trees.c b/unpack-trees.c
index 47aa804..b8689eb 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);
}