@ -53,17 +53,17 @@ static const char *tag_modified = "";
@@ -53,17 +53,17 @@ static const char *tag_modified = "";
static const char *tag_skip_worktree = "";
static const char *tag_resolve_undo = "";
static void write_eolinfo(const struct cache_entry *ce, const char *path)
static void write_eolinfo(const struct index_state *istate,
const struct cache_entry *ce, const char *path)
{
if (!show_eol)
return;
else {
if (show_eol) {
struct stat st;
const char *i_txt = "";
const char *w_txt = "";
const char *a_txt = get_convert_attr_ascii(path);
if (ce && S_ISREG(ce->ce_mode))
i_txt = get_cached_convert_stats_ascii(ce->name);
i_txt = get_cached_convert_stats_ascii(istate,
ce->name);
if (!lstat(path, &st) && S_ISREG(st.st_mode))
w_txt = get_wt_convert_stats_ascii(path);
printf("i/%-5s w/%-5s attr/%-17s\t", i_txt, w_txt, a_txt);
@ -93,6 +93,43 @@ static void write_name(const char *name)
@@ -93,6 +93,43 @@ static void write_name(const char *name)
strbuf_release(&full_name);
}
static const char *get_tag(const struct cache_entry *ce, const char *tag)
{
static char alttag[4];
if (tag && *tag && show_valid_bit && (ce->ce_flags & CE_VALID)) {
memcpy(alttag, tag, 3);
if (isalpha(tag[0])) {
alttag[0] = tolower(tag[0]);
} else if (tag[0] == '?') {
alttag[0] = '!';
} else {
alttag[0] = 'v';
alttag[1] = tag[0];
alttag[2] = ' ';
alttag[3] = 0;
}
tag = alttag;
}
return tag;
}
static void print_debug(const struct cache_entry *ce)
{
if (debug_mode) {
const struct stat_data *sd = &ce->ce_stat_data;
printf(" ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec);
printf(" mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec);
printf(" dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino);
printf(" uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid);
printf(" size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags);
}
}
static void show_dir_entry(const char *tag, struct dir_entry *ent)
{
int len = max_prefix_len;
@ -104,23 +141,25 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent)
@@ -104,23 +141,25 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent)
return;
fputs(tag, stdout);
write_eolinfo(NULL, ent->name);
write_eolinfo(NULL, NULL, ent->name);
write_name(ent->name);
}
static void show_other_files(struct dir_struct *dir)
static void show_other_files(const struct index_state *istate,
const struct dir_struct *dir)
{
int i;
for (i = 0; i < dir->nr; i++) {
struct dir_entry *ent = dir->entries[i];
if (!cache_name_is_other(ent->name, ent->len))
if (!index_name_is_other(istate, ent->name, ent->len))
continue;
show_dir_entry(tag_other, ent);
}
}
static void show_killed_files(struct dir_struct *dir)
static void show_killed_files(const struct index_state *istate,
const struct dir_struct *dir)
{
int i;
for (i = 0; i < dir->nr; i++) {
@ -134,29 +173,29 @@ static void show_killed_files(struct dir_struct *dir)
@@ -134,29 +173,29 @@ static void show_killed_files(struct dir_struct *dir)
/* If ent->name is prefix of an entry in the
* cache, it will be killed.
*/
pos = cache_name_pos(ent->name, ent->len);
pos = index_name_pos(istate, ent->name, ent->len);
if (0 <= pos)
die("BUG: killed-file %.*s not found",
ent->len, ent->name);
pos = -pos - 1;
while (pos < active_nr &&
ce_stage(active_cache[pos]))
while (pos < istate->cache_nr &&
ce_stage(istate->cache[pos]))
pos++; /* skip unmerged */
if (active_nr <= pos)
if (istate->cache_nr <= pos)
break;
/* pos points at a name immediately after
* ent->name in the cache. Does it expect
* ent->name to be a directory?
*/
len = ce_namelen(active_cache[pos]);
len = ce_namelen(istate->cache[pos]);
if ((ent->len < len) &&
!strncmp(active_cache[pos]->name,
!strncmp(istate->cache[pos]->name,
ent->name, ent->len) &&
active_cache[pos]->name[ent->len] == '/')
istate->cache[pos]->name[ent->len] == '/')
killed = 1;
break;
}
if (0 <= cache_name_pos(ent->name, sp - ent->name)) {
if (0 <= index_name_pos(istate, ent->name, sp - ent->name)) {
/* If any of the leading directories in
* ent->name is registered in the cache,
* ent->name will be killed.
@ -230,7 +269,8 @@ static void show_gitlink(const struct cache_entry *ce)
@@ -230,7 +269,8 @@ static void show_gitlink(const struct cache_entry *ce)
exit(status);
}
static void show_ce_entry(const char *tag, const struct cache_entry *ce)
static void show_ce_entry(const struct index_state *istate,
const char *tag, const struct cache_entry *ce)
{
struct strbuf name = STRBUF_INIT;
int len = max_prefix_len;
@ -248,22 +288,7 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce)
@@ -248,22 +288,7 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce)
len, ps_matched,
S_ISDIR(ce->ce_mode) ||
S_ISGITLINK(ce->ce_mode))) {
if (tag && *tag && show_valid_bit &&
(ce->ce_flags & CE_VALID)) {
static char alttag[4];
memcpy(alttag, tag, 3);
if (isalpha(tag[0]))
alttag[0] = tolower(tag[0]);
else if (tag[0] == '?')
alttag[0] = '!';
else {
alttag[0] = 'v';
alttag[1] = tag[0];
alttag[2] = ' ';
alttag[3] = 0;
}
tag = alttag;
}
tag = get_tag(ce, tag);
if (!show_stage) {
fputs(tag, stdout);
@ -274,30 +299,22 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce)
@@ -274,30 +299,22 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce)
find_unique_abbrev(ce->oid.hash, abbrev),
ce_stage(ce));
}
write_eolinfo(ce, ce->name);
write_eolinfo(istate, ce, ce->name);
write_name(ce->name);
if (debug_mode) {
const struct stat_data *sd = &ce->ce_stat_data;
printf(" ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec);
printf(" mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec);
printf(" dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino);
printf(" uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid);
printf(" size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags);
}
print_debug(ce);
}
strbuf_release(&name);
}
static void show_ru_info(void)
static void show_ru_info(const struct index_state *istate)
{
struct string_list_item *item;
if (!the_index.resolve_undo)
if (!istate->resolve_undo)
return;
for_each_string_list_item(item, the_index.resolve_undo) {
for_each_string_list_item(item, istate->resolve_undo) {
const char *path = item->string;
struct resolve_undo_info *ui = item->util;
int i, len;
@ -319,13 +336,14 @@ static void show_ru_info(void)
@@ -319,13 +336,14 @@ static void show_ru_info(void)
}
}
static int ce_excluded(struct dir_struct *dir, const struct cache_entry *ce)
static int ce_excluded(struct dir_struct *dir, struct index_state *istate,
const struct cache_entry *ce)
{
int dtype = ce_to_dtype(ce);
return is_excluded(dir, &the_index, ce->name, &dtype);
return is_excluded(dir, istate, ce->name, &dtype);
}
static void show_files(struct dir_struct *dir)
static void show_files(struct index_state *istate, struct dir_struct *dir)
{
int i;
@ -333,33 +351,33 @@ static void show_files(struct dir_struct *dir)
@@ -333,33 +351,33 @@ static void show_files(struct dir_struct *dir)
if (show_others || show_killed) {
if (!show_others)
dir->flags |= DIR_COLLECT_KILLED_ONLY;
fill_directory(dir, &the_index, &pathspec);
fill_directory(dir, istate, &pathspec);
if (show_others)
show_other_files(dir);
show_other_files(istate, dir);
if (show_killed)
show_killed_files(dir);
show_killed_files(istate, dir);
}
if (show_cached || show_stage) {
for (i = 0; i < active_nr; i++) {
const struct cache_entry *ce = active_cache[i];
for (i = 0; i < istate->cache_nr; i++) {
const struct cache_entry *ce = istate->cache[i];
if ((dir->flags & DIR_SHOW_IGNORED) &&
!ce_excluded(dir, ce))
!ce_excluded(dir, istate, ce))
continue;
if (show_unmerged && !ce_stage(ce))
continue;
if (ce->ce_flags & CE_UPDATE)
continue;
show_ce_entry(ce_stage(ce) ? tag_unmerged :
show_ce_entry(istate, ce_stage(ce) ? tag_unmerged :
(ce_skip_worktree(ce) ? tag_skip_worktree : tag_cached), ce);
}
}
if (show_deleted || show_modified) {
for (i = 0; i < active_nr; i++) {
const struct cache_entry *ce = active_cache[i];
for (i = 0; i < istate->cache_nr; i++) {
const struct cache_entry *ce = istate->cache[i];
struct stat st;
int err;
if ((dir->flags & DIR_SHOW_IGNORED) &&
!ce_excluded(dir, ce))
!ce_excluded(dir, istate, ce))
continue;
if (ce->ce_flags & CE_UPDATE)
continue;
@ -367,9 +385,9 @@ static void show_files(struct dir_struct *dir)
@@ -367,9 +385,9 @@ static void show_files(struct dir_struct *dir)
continue;
err = lstat(ce->name, &st);
if (show_deleted && err)
show_ce_entry(tag_removed, ce);
if (show_modified && ce_modified(ce, &st, 0))
show_ce_entry(tag_modified, ce);
show_ce_entry(istate, tag_removed, ce);
if (show_modified && ie_modified(istate, ce, &st, 0))
show_ce_entry(istate, tag_modified, ce);
}
}
}
@ -377,30 +395,31 @@ static void show_files(struct dir_struct *dir)
@@ -377,30 +395,31 @@ static void show_files(struct dir_struct *dir)
/*
* Prune the index to only contain stuff starting with "prefix"
*/
static void prune_cache(const char *prefix, size_t prefixlen)
static void prune_index(struct index_state *istate,
const char *prefix, size_t prefixlen)
{
int pos;
unsigned int first, last;
if (!prefix)
return;
pos = cache_name_pos(prefix, prefixlen);
pos = index_name_pos(istate, prefix, prefixlen);
if (pos < 0)
pos = -pos-1;
first = pos;
last = active_nr;
last = istate->cache_nr;
while (last > first) {
int next = (last + first) >> 1;
const struct cache_entry *ce = active_cache[next];
const struct cache_entry *ce = istate->cache[next];
if (!strncmp(ce->name, prefix, prefixlen)) {
first = next+1;
continue;
}
last = next;
}
memmove(active_cache, active_cache + pos,
memmove(istate->cache, istate->cache + pos,
(last - pos) * sizeof(struct cache_entry *));
active_nr = last - pos;
istate->cache_nr = last - pos;
}
static int get_common_prefix_len(const char *common_prefix)
@ -430,7 +449,8 @@ static int get_common_prefix_len(const char *common_prefix)
@@ -430,7 +449,8 @@ static int get_common_prefix_len(const char *common_prefix)
* that were given from the command line. We are not
* going to write this index out.
*/
void overlay_tree_on_cache(const char *tree_name, const char *prefix)
void overlay_tree_on_index(struct index_state *istate,
const char *tree_name, const char *prefix)
{
struct tree *tree;
struct object_id oid;
@ -445,8 +465,8 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
@@ -445,8 +465,8 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
die("bad tree-ish %s", tree_name);
/* Hoist the unmerged entries up to stage #3 to make room */
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
for (i = 0; i < istate->cache_nr; i++) {
struct cache_entry *ce = istate->cache[i];
if (!ce_stage(ce))
continue;
ce->ce_flags |= CE_STAGEMASK;
@ -459,11 +479,11 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
@@ -459,11 +479,11 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
PATHSPEC_PREFER_CWD, prefix, matchbuf);
} else
memset(&pathspec, 0, sizeof(pathspec));
if (read_tree(tree, 1, &pathspec))
if (read_tree(tree, 1, &pathspec, istate))
die("unable to read tree entries %s", tree_name);
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
for (i = 0; i < istate->cache_nr; i++) {
struct cache_entry *ce = istate->cache[i];
switch (ce_stage(ce)) {
case 0:
last_stage0 = ce;
@ -657,7 +677,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
@@ -657,7 +677,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
max_prefix = common_prefix(&pathspec);
max_prefix_len = get_common_prefix_len(max_prefix);
prune_cache(max_prefix, max_prefix_len);
prune_index(&the_index, max_prefix, max_prefix_len);
/* Treat unmatching pathspec elements as errors */
if (pathspec.nr && error_unmatch)
@ -678,11 +698,11 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
@@ -678,11 +698,11 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
*/
if (show_stage || show_unmerged)
die("ls-files --with-tree is incompatible with -s or -u");
overlay_tree_on_cache(with_tree, max_prefix);
overlay_tree_on_index(&the_index, with_tree, max_prefix);
}
show_files(&dir);
show_files(&the_index, &dir);
if (show_resolve_undo)
show_ru_info();
show_ru_info(&the_index);
if (ps_matched) {
int bad;