projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Support receiving server capabilities
[git.git]
/
update-index.c
diff --git
a/update-index.c
b/update-index.c
index
01b4088
..
661b86a
100644
(file)
--- a/
update-index.c
+++ b/
update-index.c
@@
-5,6
+5,7
@@
*/
#include "cache.h"
#include "strbuf.h"
*/
#include "cache.h"
#include "strbuf.h"
+#include "quote.h"
/*
* Default to not allowing changes to the list of files. The
/*
* Default to not allowing changes to the list of files. The
@@
-13,8
+14,15
@@
* like "git-update-index *" and suddenly having all the object
* files be revision controlled.
*/
* like "git-update-index *" and suddenly having all the object
* files be revision controlled.
*/
-static int allow_add = 0, allow_remove = 0, allow_replace = 0, allow_unmerged = 0, not_new = 0, quiet = 0, info_only = 0;
+static int allow_add;
+static int allow_remove;
+static int allow_replace;
+static int allow_unmerged; /* --refresh needing merge is not error */
+static int not_new; /* --refresh not having working tree files is not error */
+static int quiet; /* --refresh needing update is not error */
+static int info_only;
static int force_remove;
static int force_remove;
+static int verbose;
/* Three functions to allow overloaded pointer return; see linux/err.h */
static inline void *ERR_PTR(long error)
/* Three functions to allow overloaded pointer return; see linux/err.h */
static inline void *ERR_PTR(long error)
@@
-32,6
+40,19
@@
static inline long IS_ERR(const void *ptr)
return (unsigned long)ptr > (unsigned long)-1000L;
}
return (unsigned long)ptr > (unsigned long)-1000L;
}
+static void report(const char *fmt, ...)
+{
+ va_list vp;
+
+ if (!verbose)
+ return;
+
+ va_start(vp, fmt);
+ vprintf(fmt, vp);
+ putchar('\n');
+ va_end(vp);
+}
+
static int add_file_to_cache(const char *path)
{
int size, namelen, option, status;
static int add_file_to_cache(const char *path)
{
int size, namelen, option, status;
@@
-67,13
+88,23
@@
static int add_file_to_cache(const char *path)
return error("lstat(\"%s\"): %s", path,
strerror(errno));
}
return error("lstat(\"%s\"): %s", path,
strerror(errno));
}
+
namelen = strlen(path);
size = cache_entry_size(namelen);
ce = xmalloc(size);
memset(ce, 0, size);
memcpy(ce->name, path, namelen);
fill_stat_cache_info(ce, &st);
namelen = strlen(path);
size = cache_entry_size(namelen);
ce = xmalloc(size);
memset(ce, 0, size);
memcpy(ce->name, path, namelen);
fill_stat_cache_info(ce, &st);
+
ce->ce_mode = create_ce_mode(st.st_mode);
ce->ce_mode = create_ce_mode(st.st_mode);
+ if (!trust_executable_bit) {
+ /* If there is an existing entry, pick the mode bits
+ * from it.
+ */
+ int pos = cache_name_pos(path, namelen);
+ if (0 <= pos)
+ ce->ce_mode = active_cache[pos]->ce_mode;
+ }
ce->ce_flags = htons(namelen);
if (index_path(ce->sha1, path, &st, !info_only))
ce->ce_flags = htons(namelen);
if (index_path(ce->sha1, path, &st, !info_only))
@@
-250,11
+281,39
@@
static int add_cacheinfo(const char *arg1, const char *arg2, const char *arg3)
ce->ce_mode = create_ce_mode(mode);
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
ce->ce_mode = create_ce_mode(mode);
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
- return add_cache_entry(ce, option);
+ if (add_cache_entry(ce, option))
+ return error("%s: cannot add to the index - missing --add option?",
+ arg3);
+ report("add '%s'", arg3);
+ return 0;
}
}
-static struct cache_file cache_file;
+static int chmod_path(int flip, const char *path)
+{
+ int pos;
+ struct cache_entry *ce;
+ unsigned int mode;
+ pos = cache_name_pos(path, strlen(path));
+ if (pos < 0)
+ return -1;
+ ce = active_cache[pos];
+ mode = ntohl(ce->ce_mode);
+ if (!S_ISREG(mode))
+ return -1;
+ switch (flip) {
+ case '+':
+ ce->ce_mode |= htonl(0111); break;
+ case '-':
+ ce->ce_mode &= htonl(~0111); break;
+ default:
+ return -1;
+ }
+ active_cache_changed = 1;
+ return 0;
+}
+
+static struct cache_file cache_file;
static void update_one(const char *path, const char *prefix, int prefix_length)
{
static void update_one(const char *path, const char *prefix, int prefix_length)
{
@@
-266,10
+325,12
@@
static void update_one(const char *path, const char *prefix, int prefix_length)
if (force_remove) {
if (remove_file_from_cache(p))
die("git-update-index: unable to remove %s", path);
if (force_remove) {
if (remove_file_from_cache(p))
die("git-update-index: unable to remove %s", path);
+ report("remove '%s'", path);
return;
}
if (add_file_to_cache(p))
die("Unable to process file %s", path);
return;
}
if (add_file_to_cache(p))
die("Unable to process file %s", path);
+ report("add '%s'", path);
}
static void read_index_info(int line_termination)
}
static void read_index_info(int line_termination)
@@
-278,6
+339,7
@@
static void read_index_info(int line_termination)
strbuf_init(&buf);
while (1) {
char *ptr;
strbuf_init(&buf);
while (1) {
char *ptr;
+ char *path_name;
unsigned char sha1[20];
unsigned int mode;
unsigned char sha1[20];
unsigned int mode;
@@
-292,14
+354,22
@@
static void read_index_info(int line_termination)
goto bad_line;
ptr += 42;
goto bad_line;
ptr += 42;
- if (!verify_path(ptr)) {
- fprintf(stderr, "Ignoring path %s\n", ptr);
+
+ if (line_termination && ptr[0] == '"')
+ path_name = unquote_c_style(ptr, NULL);
+ else
+ path_name = ptr;
+
+ if (!verify_path(path_name)) {
+ fprintf(stderr, "Ignoring path %s\n", path_name);
+ if (path_name != ptr)
+ free(path_name);
continue;
}
if (!mode) {
/* mode == 0 means there is no such path -- remove */
continue;
}
if (!mode) {
/* mode == 0 means there is no such path -- remove */
- if (remove_file_from_cache(p
tr
))
+ if (remove_file_from_cache(p
ath_name
))
die("git-update-index: unable to remove %s",
ptr);
}
die("git-update-index: unable to remove %s",
ptr);
}
@@
-309,10
+379,12
@@
static void read_index_info(int line_termination)
* ptr[-41] is at the beginning of sha1
*/
ptr[-42] = ptr[-1] = 0;
* ptr[-41] is at the beginning of sha1
*/
ptr[-42] = ptr[-1] = 0;
- if (add_cacheinfo(buf.buf, ptr-41, p
tr
))
+ if (add_cacheinfo(buf.buf, ptr-41, p
ath_name
))
die("git-update-index: unable to update %s",
die("git-update-index: unable to update %s",
- p
tr
);
+ p
ath_name
);
}
}
+ if (path_name != ptr)
+ free(path_name);
continue;
bad_line:
continue;
bad_line:
@@
-320,6
+392,9
@@
static void read_index_info(int line_termination)
}
}
}
}
+static const char update_index_usage[] =
+"git-update-index [-q] [--add] [--replace] [--remove] [--unmerged] [--refresh] [--cacheinfo] [--chmod=(+|-)x] [--info-only] [--force-remove] [--stdin] [--index-info] [--ignore-missing] [-z] [--version] [--] <file>...";
+
int main(int argc, const char **argv)
{
int i, newfd, entries, has_errors = 0, line_termination = '\n';
int main(int argc, const char **argv)
{
int i, newfd, entries, has_errors = 0, line_termination = '\n';
@@
-328,6
+403,8
@@
int main(int argc, const char **argv)
const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0;
const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0;
+ git_config(git_default_config);
+
newfd = hold_index_file_for_update(&cache_file, get_index_file());
if (newfd < 0)
die("unable to create new cachefile");
newfd = hold_index_file_for_update(&cache_file, get_index_file());
if (newfd < 0)
die("unable to create new cachefile");
@@
-376,6
+453,14
@@
int main(int argc, const char **argv)
i += 3;
continue;
}
i += 3;
continue;
}
+ if (!strcmp(path, "--chmod=-x") ||
+ !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]);
+ continue;
+ }
if (!strcmp(path, "--info-only")) {
info_only = 1;
continue;
if (!strcmp(path, "--info-only")) {
info_only = 1;
continue;
@@
-403,6
+488,12
@@
int main(int argc, const char **argv)
not_new = 1;
continue;
}
not_new = 1;
continue;
}
+ if (!strcmp(path, "--verbose")) {
+ verbose = 1;
+ continue;
+ }
+ if (!strcmp(path, "-h") || !strcmp(path, "--help"))
+ usage(update_index_usage);
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);