Merge branch 'sb/hashmap-customize-comparison' into sb/diff-color-move
[gitweb.git] / builtin / ls-files.c
index b1626b13b43f3a69b35bc242c30a28b51a855306..b12d0bb61240890b3145baa8f051c83005b97dbe 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (C) Linus Torvalds, 2005
  */
 #include "cache.h"
+#include "config.h"
 #include "quote.h"
 #include "dir.h"
 #include "builtin.h"
@@ -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;
@@ -232,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;
@@ -250,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);
@@ -276,17 +300,9 @@ 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(&the_index, 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);
@@ -328,7 +344,7 @@ static int ce_excluded(struct dir_struct *dir, struct index_state *istate,
        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;
 
@@ -336,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(&the_index, dir);
+                       show_other_files(istate, dir);
                if (show_killed)
-                       show_killed_files(&the_index, 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, &the_index, 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, &the_index, ce))
+                           !ce_excluded(dir, istate, ce))
                                continue;
                        if (ce->ce_flags & CE_UPDATE)
                                continue;
@@ -370,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);
                }
        }
 }
@@ -685,7 +701,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
                        die("ls-files --with-tree is incompatible with -s or -u");
                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(&the_index);