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.
This commit is contained in:
Junio C Hamano
2006-12-13 11:10:24 -08:00
9 changed files with 139 additions and 20 deletions

View File

@ -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);
}