Merge branches 'bw/ls-files-sans-the-index' and 'bw/config-h' into bw/repo-object
* bw/ls-files-sans-the-index: ls-files: factor out tag calculation ls-files: factor out debug info into a function ls-files: convert show_files to take an index ls-files: convert show_ce_entry to take an index ls-files: convert prune_cache to take an index ls-files: convert ce_excluded to take an index ls-files: convert show_ru_info to take an index ls-files: convert show_other_files to take an index ls-files: convert show_killed_files to take an index ls-files: convert write_eolinfo to take an index ls-files: convert overlay_tree_on_cache to take an index tree: convert read_tree to take an index parameter convert: convert renormalize_buffer to take an index convert: convert convert_to_git to take an index convert: convert convert_to_git_filter_fd to take an index convert: convert crlf_to_git to take an index convert: convert get_cached_convert_stats_ascii to take an index * bw/config-h: config: don't implicitly use gitdir or commondir config: respect commondir setup: teach discover_git_directory to respect the commondir config: don't include config.h by default config: remove git_config_iter config: create config.h alias: use the early config machinery to expand aliases t7006: demonstrate a problem with aliases in subdirectories t1308: relax the test verifying that empty alias values are disallowed help: use early config when autocorrecting aliases config: report correct line number upon error discover_git_directory(): avoid setting invalid git_dir
This commit is contained in:
@ -6,6 +6,7 @@
|
||||
* Copyright (C) Linus Torvalds, 2005
|
||||
*/
|
||||
#include "cache.h"
|
||||
#include "config.h"
|
||||
#include "quote.h"
|
||||
#include "dir.h"
|
||||
#include "builtin.h"
|
||||
@ -53,17 +54,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 +94,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 +142,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 +174,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 +270,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 +289,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 +300,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 +337,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 +352,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 +386,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 +396,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 +450,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 +466,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 +480,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 +678,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 +699,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;
|
||||
|
||||
Reference in New Issue
Block a user