Merge branch 'jk/maint-ls-files-other' into jk/fix-ls-files-other
* jk/maint-ls-files-other: refactor handling of "other" files in ls-files and status Conflicts: read-cache.c
This commit is contained in:
commit
e845e16ee6
@ -91,39 +91,10 @@ static void show_other_files(struct dir_struct *dir)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip matching and unmerged entries for the paths,
|
|
||||||
* since we want just "others".
|
|
||||||
*
|
|
||||||
* (Matching entries are normally pruned during
|
|
||||||
* the directory tree walk, but will show up for
|
|
||||||
* gitlinks because we don't necessarily have
|
|
||||||
* dir->show_other_directories set to suppress
|
|
||||||
* them).
|
|
||||||
*/
|
|
||||||
for (i = 0; i < dir->nr; i++) {
|
for (i = 0; i < dir->nr; i++) {
|
||||||
struct dir_entry *ent = dir->entries[i];
|
struct dir_entry *ent = dir->entries[i];
|
||||||
int len, pos;
|
if (!cache_name_is_other(ent->name, ent->len))
|
||||||
struct cache_entry *ce;
|
continue;
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove the '/' at the end that directory
|
|
||||||
* walking adds for directory entries.
|
|
||||||
*/
|
|
||||||
len = ent->len;
|
|
||||||
if (len && ent->name[len-1] == '/')
|
|
||||||
len--;
|
|
||||||
pos = cache_name_pos(ent->name, len);
|
|
||||||
if (0 <= pos)
|
|
||||||
continue; /* exact match */
|
|
||||||
pos = -pos - 1;
|
|
||||||
if (pos < active_nr) {
|
|
||||||
ce = active_cache[pos];
|
|
||||||
if (ce_namelen(ce) == len &&
|
|
||||||
!memcmp(ce->name, ent->name, len))
|
|
||||||
continue; /* Yup, this one exists unmerged */
|
|
||||||
}
|
|
||||||
show_dir_entry(tag_other, ent);
|
show_dir_entry(tag_other, ent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
cache.h
2
cache.h
@ -277,6 +277,7 @@ static inline void remove_name_hash(struct cache_entry *ce)
|
|||||||
#define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options))
|
#define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options))
|
||||||
#define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options))
|
#define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options))
|
||||||
#define cache_name_exists(name, namelen, igncase) index_name_exists(&the_index, (name), (namelen), (igncase))
|
#define cache_name_exists(name, namelen, igncase) index_name_exists(&the_index, (name), (namelen), (igncase))
|
||||||
|
#define cache_name_is_other(name, namelen) index_name_is_other(&the_index, (name), (namelen))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum object_type {
|
enum object_type {
|
||||||
@ -393,6 +394,7 @@ extern int add_to_index(struct index_state *, const char *path, struct stat *, i
|
|||||||
extern int add_file_to_index(struct index_state *, const char *path, int flags);
|
extern int add_file_to_index(struct index_state *, const char *path, int flags);
|
||||||
extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh);
|
extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh);
|
||||||
extern int ce_same_name(struct cache_entry *a, struct cache_entry *b);
|
extern int ce_same_name(struct cache_entry *a, struct cache_entry *b);
|
||||||
|
extern int index_name_is_other(const struct index_state *, const char *, int);
|
||||||
|
|
||||||
/* do stat comparison even if CE_VALID is true */
|
/* do stat comparison even if CE_VALID is true */
|
||||||
#define CE_MATCH_IGNORE_VALID 01
|
#define CE_MATCH_IGNORE_VALID 01
|
||||||
|
27
read-cache.c
27
read-cache.c
@ -1565,3 +1565,30 @@ int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
|
|||||||
return !!data.add_errors;
|
return !!data.add_errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns 1 if the path is an "other" path with respect to
|
||||||
|
* the index; that is, the path is not mentioned in the index at all,
|
||||||
|
* either as a file, a directory with some files in the index,
|
||||||
|
* or as an unmerged entry.
|
||||||
|
*
|
||||||
|
* We helpfully remove a trailing "/" from directories so that
|
||||||
|
* the output of read_directory can be used as-is.
|
||||||
|
*/
|
||||||
|
int index_name_is_other(const struct index_state *istate, const char *name,
|
||||||
|
int namelen)
|
||||||
|
{
|
||||||
|
int pos;
|
||||||
|
if (namelen && name[namelen - 1] == '/')
|
||||||
|
namelen--;
|
||||||
|
pos = index_name_pos(istate, name, namelen);
|
||||||
|
if (0 <= pos)
|
||||||
|
return 0; /* exact match */
|
||||||
|
pos = -pos - 1;
|
||||||
|
if (pos < istate->cache_nr) {
|
||||||
|
struct cache_entry *ce = istate->cache[pos];
|
||||||
|
if (ce_namelen(ce) == namelen &&
|
||||||
|
!memcmp(ce->name, name, namelen))
|
||||||
|
return 0; /* Yup, this one exists unmerged */
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@ -292,6 +292,12 @@ test_expect_success 'status submodule summary is disabled by default' '
|
|||||||
test_cmp expect output
|
test_cmp expect output
|
||||||
'
|
'
|
||||||
|
|
||||||
|
# we expect the same as the previous test
|
||||||
|
test_expect_success 'status --untracked-files=all does not show submodule' '
|
||||||
|
git status --untracked-files=all >output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
head=$(cd sm && git rev-parse --short=7 --verify HEAD)
|
head=$(cd sm && git rev-parse --short=7 --verify HEAD)
|
||||||
|
|
||||||
cat >expect <<EOF
|
cat >expect <<EOF
|
||||||
|
13
wt-status.c
13
wt-status.c
@ -277,20 +277,9 @@ static void wt_status_print_untracked(struct wt_status *s)
|
|||||||
|
|
||||||
read_directory(&dir, ".", "", 0, NULL);
|
read_directory(&dir, ".", "", 0, NULL);
|
||||||
for(i = 0; i < dir.nr; i++) {
|
for(i = 0; i < dir.nr; i++) {
|
||||||
/* check for matching entry, which is unmerged; lifted from
|
|
||||||
* builtin-ls-files:show_other_files */
|
|
||||||
struct dir_entry *ent = dir.entries[i];
|
struct dir_entry *ent = dir.entries[i];
|
||||||
int pos = cache_name_pos(ent->name, ent->len);
|
if (!cache_name_is_other(ent->name, ent->len))
|
||||||
struct cache_entry *ce;
|
|
||||||
if (0 <= pos)
|
|
||||||
die("bug in wt_status_print_untracked");
|
|
||||||
pos = -pos - 1;
|
|
||||||
if (pos < active_nr) {
|
|
||||||
ce = active_cache[pos];
|
|
||||||
if (ce_namelen(ce) == ent->len &&
|
|
||||||
!memcmp(ce->name, ent->name, ent->len))
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
if (!shown_header) {
|
if (!shown_header) {
|
||||||
s->workdir_untracked = 1;
|
s->workdir_untracked = 1;
|
||||||
wt_status_print_untracked_header(s);
|
wt_status_print_untracked_header(s);
|
||||||
|
Loading…
Reference in New Issue
Block a user