mirror of
https://github.com/git/git.git
synced 2024-12-04 07:24:41 +08:00
1e8fef609e
If the user enables untracked cache, then - move worktree to an unsupported filesystem - or simply upgrade OS - or move the whole (portable) disk from one machine to another - or access a shared fs from another machine there's no guarantee that untracked cache can still function properly. Record the worktree location and OS footprint in the cache. If it changes, err on the safe side and disable the cache. The user can 'update-index --untracked-cache' again to make sure all conditions are met. This adds a new requirement that setup_git_directory* must be called before read_cache() because we need worktree location by then, or the cache is dropped. This change does not cover all bases, you can fool it if you try hard. The point is to stop accidents. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Helped-by: brian m. carlson <sandals@crustytoothpaste.net> Helped-by: Torsten Bögershausen <tboegi@web.de> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
#include "cache.h"
|
|
#include "dir.h"
|
|
|
|
static int compare_untracked(const void *a_, const void *b_)
|
|
{
|
|
const char *const *a = a_;
|
|
const char *const *b = b_;
|
|
return strcmp(*a, *b);
|
|
}
|
|
|
|
static int compare_dir(const void *a_, const void *b_)
|
|
{
|
|
const struct untracked_cache_dir *const *a = a_;
|
|
const struct untracked_cache_dir *const *b = b_;
|
|
return strcmp((*a)->name, (*b)->name);
|
|
}
|
|
|
|
static void dump(struct untracked_cache_dir *ucd, struct strbuf *base)
|
|
{
|
|
int i, len;
|
|
qsort(ucd->untracked, ucd->untracked_nr, sizeof(*ucd->untracked),
|
|
compare_untracked);
|
|
qsort(ucd->dirs, ucd->dirs_nr, sizeof(*ucd->dirs),
|
|
compare_dir);
|
|
len = base->len;
|
|
strbuf_addf(base, "%s/", ucd->name);
|
|
printf("%s %s", base->buf,
|
|
sha1_to_hex(ucd->exclude_sha1));
|
|
if (ucd->recurse)
|
|
fputs(" recurse", stdout);
|
|
if (ucd->check_only)
|
|
fputs(" check_only", stdout);
|
|
if (ucd->valid)
|
|
fputs(" valid", stdout);
|
|
printf("\n");
|
|
for (i = 0; i < ucd->untracked_nr; i++)
|
|
printf("%s\n", ucd->untracked[i]);
|
|
for (i = 0; i < ucd->dirs_nr; i++)
|
|
dump(ucd->dirs[i], base);
|
|
strbuf_setlen(base, len);
|
|
}
|
|
|
|
int main(int ac, char **av)
|
|
{
|
|
struct untracked_cache *uc;
|
|
struct strbuf base = STRBUF_INIT;
|
|
setup_git_directory();
|
|
if (read_cache() < 0)
|
|
die("unable to read index file");
|
|
uc = the_index.untracked;
|
|
if (!uc) {
|
|
printf("no untracked cache\n");
|
|
return 0;
|
|
}
|
|
printf("info/exclude %s\n", sha1_to_hex(uc->ss_info_exclude.sha1));
|
|
printf("core.excludesfile %s\n", sha1_to_hex(uc->ss_excludes_file.sha1));
|
|
printf("exclude_per_dir %s\n", uc->exclude_per_dir);
|
|
printf("flags %08x\n", uc->dir_flags);
|
|
if (uc->root)
|
|
dump(uc->root, &base);
|
|
return 0;
|
|
}
|