projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'np/delta' into next
[git.git]
/
update-index.c
diff --git
a/update-index.c
b/update-index.c
index
64f4c49
..
157488f
100644
(file)
--- a/
update-index.c
+++ b/
update-index.c
@@
-7,6
+7,7
@@
#include "strbuf.h"
#include "quote.h"
#include "tree-walk.h"
#include "strbuf.h"
#include "quote.h"
#include "tree-walk.h"
+#include "cache-tree.h"
/*
* Default to not allowing changes to the list of files. The
/*
* Default to not allowing changes to the list of files. The
@@
-71,6
+72,7
@@
static int mark_valid(const char *path)
active_cache[pos]->ce_flags &= ~htons(CE_VALID);
break;
}
active_cache[pos]->ce_flags &= ~htons(CE_VALID);
break;
}
+ cache_tree_invalidate_path(active_cache_tree, path);
active_cache_changed = 1;
return 0;
}
active_cache_changed = 1;
return 0;
}
@@
-84,6
+86,12
@@
static int add_file_to_cache(const char *path)
struct stat st;
status = lstat(path, &st);
struct stat st;
status = lstat(path, &st);
+
+ /* We probably want to do this in remove_file_from_cache() and
+ * add_cache_entry() instead...
+ */
+ cache_tree_invalidate_path(active_cache_tree, path);
+
if (status < 0 || 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
if (status < 0 || 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
@@
-326,10
+334,11
@@
static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
return error("%s: cannot add to the index - missing --add option?",
path);
report("add '%s'", path);
return error("%s: cannot add to the index - missing --add option?",
path);
report("add '%s'", path);
+ cache_tree_invalidate_path(active_cache_tree, path);
return 0;
}
return 0;
}
-static
int
chmod_path(int flip, const char *path)
+static
void
chmod_path(int flip, const char *path)
{
int pos;
struct cache_entry *ce;
{
int pos;
struct cache_entry *ce;
@@
-337,21
+346,25
@@
static int chmod_path(int flip, const char *path)
pos = cache_name_pos(path, strlen(path));
if (pos < 0)
pos = cache_name_pos(path, strlen(path));
if (pos < 0)
-
return -1
;
+
goto fail
;
ce = active_cache[pos];
mode = ntohl(ce->ce_mode);
if (!S_ISREG(mode))
ce = active_cache[pos];
mode = ntohl(ce->ce_mode);
if (!S_ISREG(mode))
-
return -1
;
+
goto fail
;
switch (flip) {
case '+':
ce->ce_mode |= htonl(0111); break;
case '-':
ce->ce_mode &= htonl(~0111); break;
default:
switch (flip) {
case '+':
ce->ce_mode |= htonl(0111); break;
case '-':
ce->ce_mode &= htonl(~0111); break;
default:
-
return -1
;
+
goto fail
;
}
}
+ cache_tree_invalidate_path(active_cache_tree, path);
active_cache_changed = 1;
active_cache_changed = 1;
- return 0;
+ report("chmod %cx '%s'", flip, path);
+ return;
+ fail:
+ die("git-update-index: cannot chmod %cx '%s'", flip, path);
}
static struct cache_file cache_file;
}
static struct cache_file cache_file;
@@
-368,6
+381,7
@@
static void update_one(const char *path, const char *prefix, int prefix_length)
die("Unable to mark file %s", path);
return;
}
die("Unable to mark file %s", path);
return;
}
+ cache_tree_invalidate_path(active_cache_tree, path);
if (force_remove) {
if (remove_file_from_cache(p))
if (force_remove) {
if (remove_file_from_cache(p))
@@
-443,6
+457,7
@@
static void read_index_info(int line_termination)
free(path_name);
continue;
}
free(path_name);
continue;
}
+ cache_tree_invalidate_path(active_cache_tree, path_name);
if (!mode) {
/* mode == 0 means there is no such path -- remove */
if (!mode) {
/* mode == 0 means there is no such path -- remove */
@@
-547,6
+562,7
@@
static int unresolve_one(const char *path)
goto free_return;
}
goto free_return;
}
+ cache_tree_invalidate_path(active_cache_tree, path);
remove_file_from_cache(path);
if (add_cache_entry(ce_2, ADD_CACHE_OK_TO_ADD)) {
error("%s: cannot add our version to the index.", path);
remove_file_from_cache(path);
if (add_cache_entry(ce_2, ADD_CACHE_OK_TO_ADD)) {
error("%s: cannot add our version to the index.", path);
@@
-597,6
+613,7
@@
int main(int argc, const char **argv)
int read_from_stdin = 0;
const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0;
int read_from_stdin = 0;
const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0;
+ char set_executable_bit = 0;
git_config(git_default_config);
git_config(git_default_config);
@@
-663,8
+680,7
@@
int main(int argc, const char **argv)
!strcmp(path, "--chmod=+x")) {
if (argc <= i+1)
die("git-update-index: %s <path>", path);
!strcmp(path, "--chmod=+x")) {
if (argc <= i+1)
die("git-update-index: %s <path>", path);
- if (chmod_path(path[8], argv[++i]))
- die("git-update-index: %s cannot chmod %s", path, argv[i]);
+ set_executable_bit = path[8];
continue;
}
if (!strcmp(path, "--assume-unchanged")) {
continue;
}
if (!strcmp(path, "--assume-unchanged")) {
@@
-719,6
+735,8
@@
int main(int argc, const char **argv)
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);
+ if (set_executable_bit)
+ chmod_path(set_executable_bit, path);
}
if (read_from_stdin) {
struct strbuf buf;
}
if (read_from_stdin) {
struct strbuf buf;
@@
-733,6
+751,10
@@
int main(int argc, const char **argv)
else
path_name = buf.buf;
update_one(path_name, prefix, prefix_length);
else
path_name = buf.buf;
update_one(path_name, prefix, prefix_length);
+ if (set_executable_bit) {
+ const char *p = prefix_path(prefix, prefix_length, path_name);
+ chmod_path(set_executable_bit, p);
+ }
if (path_name != buf.buf)
free(path_name);
}
if (path_name != buf.buf)
free(path_name);
}