#include "tree-walk.h"
static const char builtin_rm_usage[] =
-"git-rm [-n] [-f] [--cached] <filepattern>...";
+"git-rm [-f] [-n] [-r] [--cached] [--] <file>...";
static struct {
int nr, alloc;
char *slash;
ret = unlink(name);
+ if (ret && errno == ENOENT)
+ /* The user has removed it from the filesystem by hand */
+ ret = errno = 0;
+
if (!ret && (slash = strrchr(name, '/'))) {
char *n = xstrdup(name);
do {
if (ce_match_stat(ce, &st, 0))
errs = error("'%s' has local modifications "
"(hint: try -f)", ce->name);
- if (no_head)
- continue;
- /*
- * It is Ok to remove a newly added path, as long as
- * it is cache-clean.
- */
- if (get_tree_entry(head, name, sha1, &mode))
- continue;
- /*
- * Otherwise make sure the version from the HEAD
- * matches the index.
- */
- if (ce->ce_mode != create_ce_mode(mode) ||
- hashcmp(ce->sha1, sha1))
+ if (no_head
+ || get_tree_entry(head, name, sha1, &mode)
+ || ce->ce_mode != create_ce_mode(mode)
+ || hashcmp(ce->sha1, sha1))
errs = error("'%s' has changes staged in the index "
"(hint: try -f)", name);
}
git_config(git_default_config);
- newfd = hold_lock_file_for_update(&lock_file, get_index_file(), 1);
+ newfd = hold_locked_index(&lock_file, 1);
if (read_cache() < 0)
die("index file corrupt");
return 0;
/*
- * Then, unless we used "--cache", remove the filenames from
+ * Then, unless we used "--cached", remove the filenames from
* the workspace. If we fail to remove the first one, we
* abort the "git rm" (but once we've successfully removed
* any file at all, we'll go ahead and commit to it all:
if (active_cache_changed) {
if (write_cache(newfd, active_cache, active_nr) ||
- close(newfd) || commit_lock_file(&lock_file))
+ close(newfd) || commit_locked_index(&lock_file))
die("Unable to write new index file");
}