Also, make "git commit -a" work with modifications of subproject HEADs.
---
This one works with update-index --remove (which is what git-commit -a
uses). It is ugly. I tried to keep the "F -> D/F" behaviour of
update-index. Still have to check if "F -> Subproject" works.
builtin-update-index.c | 45 +++++++++++++++++++++++++--------------------
1 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/builtin-update-index.c b/builtin-update-index.c
index eba756d..d075d50 100644
--- a/builtin-update-index.c
+++ b/builtin-update-index.c
@@ -62,7 +62,7 @@ static int mark_valid(const char *path)
static int process_file(const char *path)
{
- int size, namelen, option, status;
+ int size, namelen = -1, option, status;
struct cache_entry *ce;
struct stat st;
@@ -73,7 +73,7 @@ static int process_file(const char *path)
*/
cache_tree_invalidate_path(active_cache_tree, path);
- if (status < 0 || S_ISDIR(st.st_mode)) {
+ if (!status && S_ISDIR(st.st_mode)) {
/* When we used to have "path" and now we want to add
* "path/file", we need a way to remove "path" before
* being able to add "path/file". However,
@@ -82,27 +82,32 @@ static int process_file(const char *path)
* friendly, especially since we can do the opposite
* case just fine without --force-remove.
*/
- if (status == 0 || (errno == ENOENT || errno == ENOTDIR)) {
- if (allow_remove) {
- if (remove_file_from_cache(path))
- return error("%s: cannot remove from the index",
- path);
- else
- return 0;
- } else if (status < 0) {
+ namelen = strlen(path);
+ int pos = cache_name_pos(path, namelen);
+ if (0 <= pos && S_ISREG(ntohl(active_cache[pos]->ce_mode)) &&
+ allow_remove) {
+ if (remove_file_from_cache(path))
+ return error("%s: cannot remove from the index", path);
+ else
+ return 0;
+ }
+ }
+
+ if (status < 0) {
+ if (errno == ENOENT || errno == ENOTDIR) {
+ if (!allow_remove)
return error("%s: does not exist and --remove not passed",
- path);
- }
+ path);
+ if (remove_file_from_cache(path))
+ return error("%s: cannot remove from the index",
+ path);
+ return 0;
}
- if (0 == status)
- return error("%s: is a directory - add files inside instead",
- path);
- else
- return error("lstat(\"%s\"): %s", path,
- strerror(errno));
+ return error("lstat(\"%s\"): %s", path, strerror(errno));
}
- namelen = strlen(path);
+ if (namelen < 0)
+ namelen = strlen(path);
size = cache_entry_size(namelen);
ce = xcalloc(1, size);
memcpy(ce->name, path, namelen);
@@ -211,7 +216,7 @@ static void update_one(const char *path, const char *prefix, int prefix_length)
goto free_return;
}
if (process_file(p))
- die("Unable to process file %s", path);
+ die("Unable to process \"%s\"", path);
report("add '%s'", path);
free_return:
if (p < path || p > path + strlen(path))
--
1.5.1.135.g19a57-dirty
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html| Andrew Morton | -mm merge plans for 2.6.23 |
| David Miller | Re: [BUG] New Kernel Bugs |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Andrew Morton | Re: Linux 2.6.21-rc4 |
git: | |
| David Miller | [GIT]: Networking |
| Natalie Protasevich | [BUG] New Kernel Bugs |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Eric W. Biederman | [PATCH] macvlan: Support creating macvlans from macvlans |
