8
#include "bulk-checkin.h"
10
#include "environment.h"
16
#include "cache-tree.h"
18
#include "object-file.h"
20
#include "resolve-undo.h"
21
#include "parse-options.h"
24
#include "read-cache.h"
25
#include "repository.h"
27
#include "sparse-index.h"
28
#include "split-index.h"
31
#include "write-or-die.h"
41
static int allow_remove;
42
static int allow_replace;
44
static int force_remove;
46
static int mark_valid_only;
47
static int mark_skip_worktree_only;
48
static int mark_fsmonitor_only;
49
static int ignore_skip_worktree_entries;
52
static struct strbuf mtime_dir = STRBUF_INIT;
63
__attribute__((format (printf, 1, 2)))
64
static void report(const char *fmt, ...)
78
flush_odb_transaction();
85
static void remove_test_directory(void)
88
remove_dir_recursively(&mtime_dir, 0);
91
static const char *get_mtime_path(const char *path)
93
static struct strbuf sb = STRBUF_INIT;
95
strbuf_addf(&sb, "%s/%s", mtime_dir.buf, path);
99
static void xmkdir(const char *path)
101
path = get_mtime_path(path);
102
if (mkdir(path, 0700))
103
die_errno(_("failed to create directory %s"), path);
106
static int xstat_mtime_dir(struct stat *st)
108
if (stat(mtime_dir.buf, st))
109
die_errno(_("failed to stat %s"), mtime_dir.buf);
113
static int create_file(const char *path)
116
path = get_mtime_path(path);
117
fd = xopen(path, O_CREAT | O_RDWR, 0644);
121
static void xunlink(const char *path)
123
path = get_mtime_path(path);
125
die_errno(_("failed to delete file %s"), path);
128
static void xrmdir(const char *path)
130
path = get_mtime_path(path);
132
die_errno(_("failed to delete directory %s"), path);
135
static void avoid_racy(void)
145
static int test_if_untracked_cache_is_supported(void)
148
struct stat_data base;
152
strbuf_addstr(&mtime_dir, "mtime-test-XXXXXX");
153
if (!mkdtemp(mtime_dir.buf))
154
die_errno("Could not make temporary directory");
157
fprintf(stderr, _("Testing mtime in '%s' "), cwd);
160
atexit(remove_test_directory);
161
xstat_mtime_dir(&st);
162
fill_stat_data(&base, &st);
166
fd = create_file("newfile");
167
xstat_mtime_dir(&st);
168
if (!match_stat_data(&base, &st)) {
171
fprintf_ln(stderr,_("directory stat info does not "
172
"change after adding a new file"));
175
fill_stat_data(&base, &st);
180
xstat_mtime_dir(&st);
181
if (!match_stat_data(&base, &st)) {
184
fprintf_ln(stderr, _("directory stat info does not change "
185
"after adding a new directory"));
188
fill_stat_data(&base, &st);
192
write_or_die(fd, "data", 4);
194
xstat_mtime_dir(&st);
195
if (match_stat_data(&base, &st)) {
197
fprintf_ln(stderr, _("directory stat info changes "
198
"after updating a file"));
204
close(create_file("new-dir/new"));
205
xstat_mtime_dir(&st);
206
if (match_stat_data(&base, &st)) {
208
fprintf_ln(stderr, _("directory stat info changes after "
209
"adding a file inside subdirectory"));
216
xstat_mtime_dir(&st);
217
if (!match_stat_data(&base, &st)) {
219
fprintf_ln(stderr, _("directory stat info does not "
220
"change after deleting a file"));
223
fill_stat_data(&base, &st);
227
xunlink("new-dir/new");
229
xstat_mtime_dir(&st);
230
if (!match_stat_data(&base, &st)) {
232
fprintf_ln(stderr, _("directory stat info does not "
233
"change after deleting a directory"));
237
if (rmdir(mtime_dir.buf))
238
die_errno(_("failed to delete directory %s"), mtime_dir.buf);
239
fprintf_ln(stderr, _(" OK"));
243
strbuf_release(&mtime_dir);
247
static int mark_ce_flags(const char *path, int flag, int mark)
249
int namelen = strlen(path);
250
int pos = index_name_pos(the_repository->index, path, namelen);
252
mark_fsmonitor_invalid(the_repository->index, the_repository->index->cache[pos]);
254
the_repository->index->cache[pos]->ce_flags |= flag;
256
the_repository->index->cache[pos]->ce_flags &= ~flag;
257
the_repository->index->cache[pos]->ce_flags |= CE_UPDATE_IN_BASE;
258
cache_tree_invalidate_path(the_repository->index, path);
259
the_repository->index->cache_changed |= CE_ENTRY_CHANGED;
265
static int remove_one_path(const char *path)
268
return error("%s: does not exist and --remove not passed", path);
269
if (remove_file_from_index(the_repository->index, path))
270
return error("%s: cannot remove from the index", path);
281
static int process_lstat_error(const char *path, int err)
283
if (is_missing_file_error(err))
284
return remove_one_path(path);
285
return error("lstat(\"%s\"): %s", path, strerror(err));
288
static int add_one_path(const struct cache_entry *old, const char *path, int len, struct stat *st)
291
struct cache_entry *ce;
294
if (old && !ce_stage(old) && !ie_match_stat(the_repository->index, old, st, 0))
297
ce = make_empty_cache_entry(the_repository->index, len);
298
memcpy(ce->name, path, len);
299
ce->ce_flags = create_ce_flags(0);
300
ce->ce_namelen = len;
301
fill_stat_cache_info(the_repository->index, ce, st);
302
ce->ce_mode = ce_mode_from_stat(old, st->st_mode);
304
if (index_path(the_repository->index, &ce->oid, path, st,
305
info_only ? 0 : HASH_WRITE_OBJECT)) {
306
discard_cache_entry(ce);
309
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
310
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
311
if (add_index_entry(the_repository->index, ce, option)) {
312
discard_cache_entry(ce);
313
return error("%s: cannot add to the index - missing --add option?", path);
341
static int process_directory(const char *path, int len, struct stat *st)
343
struct object_id oid;
344
int pos = index_name_pos(the_repository->index, path, len);
348
const struct cache_entry *ce = the_repository->index->cache[pos];
349
if (S_ISGITLINK(ce->ce_mode)) {
352
if (repo_resolve_gitlink_ref(the_repository, path,
356
return add_one_path(ce, path, len, st);
359
return remove_one_path(path);
364
while (pos < the_repository->index->cache_nr) {
365
const struct cache_entry *ce = the_repository->index->cache[pos++];
367
if (strncmp(ce->name, path, len))
369
if (ce->name[len] > '/')
371
if (ce->name[len] < '/')
375
return error("%s: is a directory - add individual files instead", path);
379
if (!repo_resolve_gitlink_ref(the_repository, path, "HEAD", &oid))
380
return add_one_path(NULL, path, len, st);
383
return error("%s: is a directory - add files inside instead", path);
386
static int process_path(const char *path, struct stat *st, int stat_errno)
389
const struct cache_entry *ce;
392
if (has_symlink_leading_path(path, len))
393
return error("'%s' is beyond a symbolic link", path);
395
pos = index_name_pos(the_repository->index, path, len);
396
ce = pos < 0 ? NULL : the_repository->index->cache[pos];
397
if (ce && ce_skip_worktree(ce)) {
403
if (!ignore_skip_worktree_entries && allow_remove &&
404
remove_file_from_index(the_repository->index, path))
405
return error("%s: cannot remove from the index", path);
414
return process_lstat_error(path, stat_errno);
416
if (S_ISDIR(st->st_mode))
417
return process_directory(path, len, st);
419
return add_one_path(ce, path, len, st);
422
static int add_cacheinfo(unsigned int mode, const struct object_id *oid,
423
const char *path, int stage)
426
struct cache_entry *ce;
428
if (!verify_path(path, mode))
429
return error("Invalid path '%s'", path);
432
ce = make_empty_cache_entry(the_repository->index, len);
434
oidcpy(&ce->oid, oid);
435
memcpy(ce->name, path, len);
436
ce->ce_flags = create_ce_flags(stage);
437
ce->ce_namelen = len;
438
ce->ce_mode = create_ce_mode(mode);
439
if (assume_unchanged)
440
ce->ce_flags |= CE_VALID;
441
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
442
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
443
if (add_index_entry(the_repository->index, ce, option))
444
return error("%s: cannot add to the index - missing --add option?",
446
report("add '%s'", path);
450
static void chmod_path(char flip, const char *path)
453
struct cache_entry *ce;
455
pos = index_name_pos(the_repository->index, path, strlen(path));
458
ce = the_repository->index->cache[pos];
459
if (chmod_index_entry(the_repository->index, ce, flip) < 0)
462
report("chmod %cx '%s'", flip, path);
465
die("git update-index: cannot chmod %cx '%s'", flip, path);
468
static void update_one(const char *path)
473
if (mark_valid_only || mark_skip_worktree_only || force_remove ||
476
else if (lstat(path, &st) < 0) {
481
if (!verify_path(path, st.st_mode)) {
482
fprintf(stderr, "Ignoring path %s\n", path);
485
if (mark_valid_only) {
486
if (mark_ce_flags(path, CE_VALID, mark_valid_only == MARK_FLAG))
487
die("Unable to mark file %s", path);
490
if (mark_skip_worktree_only) {
491
if (mark_ce_flags(path, CE_SKIP_WORKTREE, mark_skip_worktree_only == MARK_FLAG))
492
die("Unable to mark file %s", path);
495
if (mark_fsmonitor_only) {
496
if (mark_ce_flags(path, CE_FSMONITOR_VALID, mark_fsmonitor_only == MARK_FLAG))
497
die("Unable to mark file %s", path);
502
if (remove_file_from_index(the_repository->index, path))
503
die("git update-index: unable to remove %s", path);
504
report("remove '%s'", path);
507
if (process_path(path, &st, stat_errno))
508
die("Unable to process path %s", path);
509
report("add '%s'", path);
512
static void read_index_info(int nul_term_line)
514
const int hexsz = the_hash_algo->hexsz;
515
struct strbuf buf = STRBUF_INIT;
516
struct strbuf uq = STRBUF_INIT;
517
strbuf_getline_fn getline_fn;
519
getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf;
520
while (getline_fn(&buf, stdin) != EOF) {
523
struct object_id oid;
545
ul = strtoul(buf.buf, &ptr, 8);
546
if (ptr == buf.buf || *ptr != ' '
547
|| errno || (unsigned int) ul != ul)
551
tab = strchr(ptr, '\t');
552
if (!tab || tab - ptr < hexsz + 1)
555
if (tab[-2] == ' ' && '0' <= tab[-1] && tab[-1] <= '3') {
556
stage = tab[-1] - '0';
565
if (get_oid_hex(tab - hexsz, &oid) ||
566
tab[-(hexsz + 1)] != ' ')
570
if (!nul_term_line && path_name[0] == '"') {
572
if (unquote_c_style(&uq, path_name, NULL)) {
573
die("git update-index: bad quoting of path name");
578
if (!verify_path(path_name, mode)) {
579
fprintf(stderr, "Ignoring path %s\n", path_name);
585
if (remove_file_from_index(the_repository->index, path_name))
586
die("git update-index: unable to remove %s",
594
ptr[-(hexsz + 2)] = ptr[-1] = 0;
595
if (add_cacheinfo(mode, &oid, path_name, stage))
596
die("git update-index: unable to update %s",
602
die("malformed index info %s", buf.buf);
604
strbuf_release(&buf);
608
static const char * const update_index_usage[] = {
609
N_("git update-index [<options>] [--] [<file>...]"),
613
static struct cache_entry *read_one_ent(const char *which,
614
struct object_id *ent, const char *path,
615
int namelen, int stage)
618
struct object_id oid;
619
struct cache_entry *ce;
621
if (get_tree_entry(the_repository, ent, path, &oid, &mode)) {
623
error("%s: not in %s branch.", path, which);
626
if (!the_repository->index->sparse_index && mode == S_IFDIR) {
628
error("%s: not a blob in %s branch.", path, which);
631
ce = make_empty_cache_entry(the_repository->index, namelen);
633
oidcpy(&ce->oid, &oid);
634
memcpy(ce->name, path, namelen);
635
ce->ce_flags = create_ce_flags(stage);
636
ce->ce_namelen = namelen;
637
ce->ce_mode = create_ce_mode(mode);
641
static int unresolve_one(const char *path)
643
struct string_list_item *item;
646
if (!the_repository->index->resolve_undo)
648
item = string_list_lookup(the_repository->index->resolve_undo, path);
651
res = unmerge_index_entry(the_repository->index, path, item->util, 0);
652
FREE_AND_NULL(item->util);
656
static int do_unresolve(int ac, const char **av,
657
const char *prefix, int prefix_length)
662
for (i = 1; i < ac; i++) {
663
const char *arg = av[i];
664
char *p = prefix_path(prefix, prefix_length, arg);
665
err |= unresolve_one(p);
671
static int do_reupdate(const char **paths,
679
struct pathspec pathspec;
680
struct object_id head_oid;
682
parse_pathspec(&pathspec, 0,
686
if (refs_read_ref(get_main_ref_store(the_repository), "HEAD", &head_oid))
692
for (pos = 0; pos < the_repository->index->cache_nr; pos++) {
693
const struct cache_entry *ce = the_repository->index->cache[pos];
694
struct cache_entry *old = NULL;
698
if (ce_stage(ce) || !ce_path_match(the_repository->index, ce, &pathspec, NULL))
701
old = read_one_ent(NULL, &head_oid,
702
ce->name, ce_namelen(ce), 0);
703
if (old && ce->ce_mode == old->ce_mode &&
704
oideq(&ce->oid, &old->oid)) {
705
discard_cache_entry(old);
713
if (S_ISSPARSEDIR(ce->ce_mode)) {
714
ensure_full_index(the_repository->index);
722
save_nr = the_repository->index->cache_nr;
723
path = xstrdup(ce->name);
726
discard_cache_entry(old);
727
if (save_nr != the_repository->index->cache_nr)
730
clear_pathspec(&pathspec);
734
struct refresh_params {
739
static int refresh(struct refresh_params *o, unsigned int flag)
742
repo_read_index(the_repository);
743
*o->has_errors |= refresh_index(the_repository->index, o->flags | flag, NULL,
745
if (has_racy_timestamp(the_repository->index)) {
754
the_repository->index->cache_changed |= SOMETHING_CHANGED;
759
static int refresh_callback(const struct option *opt,
760
const char *arg, int unset)
762
BUG_ON_OPT_NEG(unset);
764
return refresh(opt->value, 0);
767
static int really_refresh_callback(const struct option *opt,
768
const char *arg, int unset)
770
BUG_ON_OPT_NEG(unset);
772
return refresh(opt->value, REFRESH_REALLY);
775
static int chmod_callback(const struct option *opt,
776
const char *arg, int unset)
778
char *flip = opt->value;
779
BUG_ON_OPT_NEG(unset);
780
if ((arg[0] != '-' && arg[0] != '+') || arg[1] != 'x' || arg[2])
781
return error("option 'chmod' expects \"+x\" or \"-x\"");
786
static int resolve_undo_clear_callback(const struct option *opt UNUSED,
787
const char *arg, int unset)
789
BUG_ON_OPT_NEG(unset);
791
resolve_undo_clear_index(the_repository->index);
795
static int parse_new_style_cacheinfo(const char *arg,
797
struct object_id *oid,
808
ul = strtoul(arg, &endp, 8);
809
if (errno || endp == arg || *endp != ',' || (unsigned int) ul != ul)
813
if (parse_oid_hex(endp, oid, &p) || *p != ',')
819
static enum parse_opt_result cacheinfo_callback(
820
struct parse_opt_ctx_t *ctx, const struct option *opt UNUSED,
821
const char *arg, int unset)
823
struct object_id oid;
827
BUG_ON_OPT_NEG(unset);
830
if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, &oid, &path)) {
831
if (add_cacheinfo(mode, &oid, path, 0))
832
die("git update-index: --cacheinfo cannot add %s", path);
838
return error("option 'cacheinfo' expects <mode>,<sha1>,<path>");
839
if (strtoul_ui(*++ctx->argv, 8, &mode) ||
840
get_oid_hex(*++ctx->argv, &oid) ||
841
add_cacheinfo(mode, &oid, *++ctx->argv, 0))
842
die("git update-index: --cacheinfo cannot add %s", *ctx->argv);
847
static enum parse_opt_result stdin_cacheinfo_callback(
848
struct parse_opt_ctx_t *ctx, const struct option *opt,
849
const char *arg, int unset)
851
int *nul_term_line = opt->value;
853
BUG_ON_OPT_NEG(unset);
857
return error("option '%s' must be the last argument", opt->long_name);
858
allow_add = allow_replace = allow_remove = 1;
859
read_index_info(*nul_term_line);
863
static enum parse_opt_result stdin_callback(
864
struct parse_opt_ctx_t *ctx, const struct option *opt,
865
const char *arg, int unset)
867
int *read_from_stdin = opt->value;
869
BUG_ON_OPT_NEG(unset);
873
return error("option '%s' must be the last argument", opt->long_name);
874
*read_from_stdin = 1;
878
static enum parse_opt_result unresolve_callback(
879
struct parse_opt_ctx_t *ctx, const struct option *opt,
880
const char *arg, int unset)
882
int *has_errors = opt->value;
883
const char *prefix = startup_info->prefix;
885
BUG_ON_OPT_NEG(unset);
889
*has_errors = do_unresolve(ctx->argc, ctx->argv,
890
prefix, prefix ? strlen(prefix) : 0);
892
the_repository->index->cache_changed = 0;
894
ctx->argv += ctx->argc - 1;
899
static enum parse_opt_result reupdate_callback(
900
struct parse_opt_ctx_t *ctx, const struct option *opt,
901
const char *arg, int unset)
903
int *has_errors = opt->value;
904
const char *prefix = startup_info->prefix;
906
BUG_ON_OPT_NEG(unset);
911
*has_errors = do_reupdate(ctx->argv + 1, prefix);
913
the_repository->index->cache_changed = 0;
915
ctx->argv += ctx->argc - 1;
920
int cmd_update_index(int argc, const char **argv, const char *prefix)
922
int newfd, entries, has_errors = 0, nul_term_line = 0;
923
enum uc_mode untracked_cache = UC_UNSPECIFIED;
924
int read_from_stdin = 0;
925
int prefix_length = prefix ? strlen(prefix) : 0;
926
int preferred_index_format = 0;
927
char set_executable_bit = 0;
928
struct refresh_params refresh_args = {0, &has_errors};
930
int split_index = -1;
933
struct lock_file lock_file = LOCK_INIT;
934
struct parse_opt_ctx_t ctx;
935
strbuf_getline_fn getline_fn;
936
int parseopt_state = PARSE_OPT_UNKNOWN;
937
struct repository *r = the_repository;
938
struct option options[] = {
939
OPT_BIT('q', NULL, &refresh_args.flags,
940
N_("continue refresh even when index needs update"),
942
OPT_BIT(0, "ignore-submodules", &refresh_args.flags,
943
N_("refresh: ignore submodules"),
944
REFRESH_IGNORE_SUBMODULES),
945
OPT_SET_INT(0, "add", &allow_add,
946
N_("do not ignore new files"), 1),
947
OPT_SET_INT(0, "replace", &allow_replace,
948
N_("let files replace directories and vice-versa"), 1),
949
OPT_SET_INT(0, "remove", &allow_remove,
950
N_("notice files missing from worktree"), 1),
951
OPT_BIT(0, "unmerged", &refresh_args.flags,
952
N_("refresh even if index contains unmerged entries"),
954
OPT_CALLBACK_F(0, "refresh", &refresh_args, NULL,
955
N_("refresh stat information"),
956
PARSE_OPT_NOARG | PARSE_OPT_NONEG,
958
OPT_CALLBACK_F(0, "really-refresh", &refresh_args, NULL,
959
N_("like --refresh, but ignore assume-unchanged setting"),
960
PARSE_OPT_NOARG | PARSE_OPT_NONEG,
961
really_refresh_callback),
962
{OPTION_LOWLEVEL_CALLBACK, 0, "cacheinfo", NULL,
963
N_("<mode>,<object>,<path>"),
964
N_("add the specified entry to the index"),
966
PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
969
OPT_CALLBACK_F(0, "chmod", &set_executable_bit, "(+|-)x",
970
N_("override the executable bit of the listed files"),
973
{OPTION_SET_INT, 0, "assume-unchanged", &mark_valid_only, NULL,
974
N_("mark files as \"not changing\""),
975
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
976
{OPTION_SET_INT, 0, "no-assume-unchanged", &mark_valid_only, NULL,
977
N_("clear assumed-unchanged bit"),
978
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
979
{OPTION_SET_INT, 0, "skip-worktree", &mark_skip_worktree_only, NULL,
980
N_("mark files as \"index-only\""),
981
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
982
{OPTION_SET_INT, 0, "no-skip-worktree", &mark_skip_worktree_only, NULL,
983
N_("clear skip-worktree bit"),
984
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
985
OPT_BOOL(0, "ignore-skip-worktree-entries", &ignore_skip_worktree_entries,
986
N_("do not touch index-only entries")),
987
OPT_SET_INT(0, "info-only", &info_only,
988
N_("add to index only; do not add content to object database"), 1),
989
OPT_SET_INT(0, "force-remove", &force_remove,
990
N_("remove named paths even if present in worktree"), 1),
991
OPT_BOOL('z', NULL, &nul_term_line,
992
N_("with --stdin: input lines are terminated by null bytes")),
993
{OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL,
994
N_("read list of paths to be updated from standard input"),
995
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
996
NULL, 0, stdin_callback},
997
{OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &nul_term_line, NULL,
998
N_("add entries from standard input to the index"),
999
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
1000
NULL, 0, stdin_cacheinfo_callback},
1001
{OPTION_LOWLEVEL_CALLBACK, 0, "unresolve", &has_errors, NULL,
1002
N_("repopulate stages #2 and #3 for the listed paths"),
1003
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
1004
NULL, 0, unresolve_callback},
1005
{OPTION_LOWLEVEL_CALLBACK, 'g', "again", &has_errors, NULL,
1006
N_("only update entries that differ from HEAD"),
1007
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
1008
NULL, 0, reupdate_callback},
1009
OPT_BIT(0, "ignore-missing", &refresh_args.flags,
1010
N_("ignore files missing from worktree"),
1011
REFRESH_IGNORE_MISSING),
1012
OPT_SET_INT(0, "verbose", &verbose,
1013
N_("report actions to standard output"), 1),
1014
OPT_CALLBACK_F(0, "clear-resolve-undo", NULL, NULL,
1015
N_("(for porcelains) forget saved unresolved conflicts"),
1016
PARSE_OPT_NOARG | PARSE_OPT_NONEG,
1017
resolve_undo_clear_callback),
1018
OPT_INTEGER(0, "index-version", &preferred_index_format,
1019
N_("write index in this format")),
1020
OPT_SET_INT(0, "show-index-version", &preferred_index_format,
1021
N_("report on-disk index format version"), -1),
1022
OPT_BOOL(0, "split-index", &split_index,
1023
N_("enable or disable split index")),
1024
OPT_BOOL(0, "untracked-cache", &untracked_cache,
1025
N_("enable/disable untracked cache")),
1026
OPT_SET_INT(0, "test-untracked-cache", &untracked_cache,
1027
N_("test if the filesystem supports untracked cache"), UC_TEST),
1028
OPT_SET_INT(0, "force-untracked-cache", &untracked_cache,
1029
N_("enable untracked cache without testing the filesystem"), UC_FORCE),
1030
OPT_SET_INT(0, "force-write-index", &force_write,
1031
N_("write out the index even if is not flagged as changed"), 1),
1032
OPT_BOOL(0, "fsmonitor", &fsmonitor,
1033
N_("enable or disable file system monitor")),
1034
{OPTION_SET_INT, 0, "fsmonitor-valid", &mark_fsmonitor_only, NULL,
1035
N_("mark files as fsmonitor valid"),
1036
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
1037
{OPTION_SET_INT, 0, "no-fsmonitor-valid", &mark_fsmonitor_only, NULL,
1038
N_("clear fsmonitor valid bit"),
1039
PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
1043
if (argc == 2 && !strcmp(argv[1], "-h"))
1044
usage_with_options(update_index_usage, options);
1046
git_config(git_default_config, NULL);
1048
prepare_repo_settings(r);
1049
the_repository->settings.command_requires_full_index = 0;
1052
newfd = repo_hold_locked_index(the_repository, &lock_file, 0);
1056
entries = repo_read_index(the_repository);
1058
die("cache corrupted");
1060
the_repository->index->updated_skipworktree = 1;
1066
parse_options_start(&ctx, argc, argv, prefix,
1067
options, PARSE_OPT_STOP_AT_NON_OPTION);
1073
begin_odb_transaction();
1075
if (parseopt_state != PARSE_OPT_DONE)
1076
parseopt_state = parse_options_step(&ctx, options,
1077
update_index_usage);
1080
switch (parseopt_state) {
1081
case PARSE_OPT_HELP:
1082
case PARSE_OPT_ERROR:
1084
case PARSE_OPT_COMPLETE:
1086
case PARSE_OPT_NON_OPTION:
1087
case PARSE_OPT_DONE:
1089
const char *path = ctx.argv[0];
1093
p = prefix_path(prefix, prefix_length, path);
1095
if (set_executable_bit)
1096
chmod_path(set_executable_bit, p);
1102
case PARSE_OPT_UNKNOWN:
1103
if (ctx.argv[0][1] == '-')
1104
error("unknown option '%s'", ctx.argv[0] + 2);
1106
error("unknown switch '%c'", *ctx.opt);
1107
usage_with_options(update_index_usage, options);
1110
argc = parse_options_end(&ctx);
1112
getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf;
1113
if (preferred_index_format) {
1114
if (preferred_index_format < 0) {
1115
printf(_("%d\n"), the_repository->index->version);
1116
} else if (preferred_index_format < INDEX_FORMAT_LB ||
1117
INDEX_FORMAT_UB < preferred_index_format) {
1118
die("index-version %d not in range: %d..%d",
1119
preferred_index_format,
1120
INDEX_FORMAT_LB, INDEX_FORMAT_UB);
1122
if (the_repository->index->version != preferred_index_format)
1123
the_repository->index->cache_changed |= SOMETHING_CHANGED;
1124
report(_("index-version: was %d, set to %d"),
1125
the_repository->index->version, preferred_index_format);
1126
the_repository->index->version = preferred_index_format;
1130
if (read_from_stdin) {
1131
struct strbuf buf = STRBUF_INIT;
1132
struct strbuf unquoted = STRBUF_INIT;
1135
while (getline_fn(&buf, stdin) != EOF) {
1137
if (!nul_term_line && buf.buf[0] == '"') {
1138
strbuf_reset(&unquoted);
1139
if (unquote_c_style(&unquoted, buf.buf, NULL))
1140
die("line is badly quoted");
1141
strbuf_swap(&buf, &unquoted);
1143
p = prefix_path(prefix, prefix_length, buf.buf);
1145
if (set_executable_bit)
1146
chmod_path(set_executable_bit, p);
1149
strbuf_release(&unquoted);
1150
strbuf_release(&buf);
1156
end_odb_transaction();
1158
if (split_index > 0) {
1159
if (repo_config_get_split_index(the_repository) == 0)
1160
warning(_("core.splitIndex is set to false; "
1161
"remove or change it, if you really want to "
1162
"enable split index"));
1163
if (the_repository->index->split_index)
1164
the_repository->index->cache_changed |= SPLIT_INDEX_ORDERED;
1166
add_split_index(the_repository->index);
1167
} else if (!split_index) {
1168
if (repo_config_get_split_index(the_repository) == 1)
1169
warning(_("core.splitIndex is set to true; "
1170
"remove or change it, if you really want to "
1171
"disable split index"));
1172
remove_split_index(the_repository->index);
1175
prepare_repo_settings(r);
1176
switch (untracked_cache) {
1177
case UC_UNSPECIFIED:
1180
if (r->settings.core_untracked_cache == UNTRACKED_CACHE_WRITE)
1181
warning(_("core.untrackedCache is set to true; "
1182
"remove or change it, if you really want to "
1183
"disable the untracked cache"));
1184
remove_untracked_cache(the_repository->index);
1185
report(_("Untracked cache disabled"));
1189
return !test_if_untracked_cache_is_supported();
1192
if (r->settings.core_untracked_cache == UNTRACKED_CACHE_REMOVE)
1193
warning(_("core.untrackedCache is set to false; "
1194
"remove or change it, if you really want to "
1195
"enable the untracked cache"));
1196
add_untracked_cache(the_repository->index);
1197
report(_("Untracked cache enabled for '%s'"), get_git_work_tree());
1200
BUG("bad untracked_cache value: %d", untracked_cache);
1203
if (fsmonitor > 0) {
1204
enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(r);
1205
enum fsmonitor_reason reason = fsm_settings__get_reason(r);
1217
if (reason > FSMONITOR_REASON_OK)
1219
fsm_settings__get_incompatible_msg(r, reason));
1221
if (fsm_mode == FSMONITOR_MODE_DISABLED) {
1222
warning(_("core.fsmonitor is unset; "
1223
"set it if you really want to "
1224
"enable fsmonitor"));
1226
add_fsmonitor(the_repository->index);
1227
report(_("fsmonitor enabled"));
1228
} else if (!fsmonitor) {
1229
enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(r);
1230
if (fsm_mode > FSMONITOR_MODE_DISABLED)
1231
warning(_("core.fsmonitor is set; "
1232
"remove it if you really want to "
1233
"disable fsmonitor"));
1234
remove_fsmonitor(the_repository->index);
1235
report(_("fsmonitor disabled"));
1238
if (the_repository->index->cache_changed || force_write) {
1240
if (refresh_args.flags & REFRESH_QUIET)
1242
unable_to_lock_die(get_index_file(), lock_error);
1244
if (write_locked_index(the_repository->index, &lock_file, COMMIT_LOCK))
1245
die("Unable to write new index file");
1248
rollback_lock_file(&lock_file);
1250
return has_errors ? 1 : 0;