提交 227bdb18 编写于 作者: A Alex Riesen 提交者: Junio C Hamano

make update-index --chmod work with multiple files and --stdin

The patch makes "--chmod=-x" and "--chmod=+x" act like "--add"
and "--remove" to affect the behaviour of the command for the
rest of the path parameters, not just the following one.
Signed-off-by: NJunio C Hamano <junkio@cox.net>
上级 e64961b0
...@@ -328,7 +328,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1, ...@@ -328,7 +328,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
return 0; return 0;
} }
static int chmod_path(int flip, const char *path) static void chmod_path(int flip, const char *path)
{ {
int pos; int pos;
struct cache_entry *ce; struct cache_entry *ce;
...@@ -336,21 +336,24 @@ static int chmod_path(int flip, const char *path) ...@@ -336,21 +336,24 @@ static int chmod_path(int flip, const char *path)
pos = cache_name_pos(path, strlen(path)); pos = cache_name_pos(path, strlen(path));
if (pos < 0) if (pos < 0)
return -1; goto fail;
ce = active_cache[pos]; ce = active_cache[pos];
mode = ntohl(ce->ce_mode); mode = ntohl(ce->ce_mode);
if (!S_ISREG(mode)) if (!S_ISREG(mode))
return -1; goto fail;
switch (flip) { switch (flip) {
case '+': case '+':
ce->ce_mode |= htonl(0111); break; ce->ce_mode |= htonl(0111); break;
case '-': case '-':
ce->ce_mode &= htonl(~0111); break; ce->ce_mode &= htonl(~0111); break;
default: default:
return -1; goto fail;
} }
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;
...@@ -478,6 +481,7 @@ int main(int argc, const char **argv) ...@@ -478,6 +481,7 @@ int main(int argc, const char **argv)
int read_from_stdin = 0; int read_from_stdin = 0;
const char *prefix = setup_git_directory(); const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0; int prefix_length = prefix ? strlen(prefix) : 0;
char set_executable_bit = 0;
git_config(git_default_config); git_config(git_default_config);
...@@ -544,8 +548,7 @@ int main(int argc, const char **argv) ...@@ -544,8 +548,7 @@ int main(int argc, const char **argv)
!strcmp(path, "--chmod=+x")) { !strcmp(path, "--chmod=+x")) {
if (argc <= i+1) if (argc <= i+1)
die("git-update-index: %s <path>", path); die("git-update-index: %s <path>", path);
if (chmod_path(path[8], argv[++i])) set_executable_bit = path[8];
die("git-update-index: %s cannot chmod %s", path, argv[i]);
continue; continue;
} }
if (!strcmp(path, "--assume-unchanged")) { if (!strcmp(path, "--assume-unchanged")) {
...@@ -594,6 +597,8 @@ int main(int argc, const char **argv) ...@@ -594,6 +597,8 @@ int main(int argc, const char **argv)
die("unknown option %s", path); die("unknown option %s", path);
} }
update_one(path, prefix, prefix_length); update_one(path, prefix, prefix_length);
if (set_executable_bit)
chmod_path(set_executable_bit, path);
} }
if (read_from_stdin) { if (read_from_stdin) {
struct strbuf buf; struct strbuf buf;
...@@ -608,6 +613,10 @@ int main(int argc, const char **argv) ...@@ -608,6 +613,10 @@ int main(int argc, const char **argv)
else else
path_name = buf.buf; path_name = buf.buf;
update_one(path_name, prefix, prefix_length); 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) if (path_name != buf.buf)
free(path_name); free(path_name);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册