dir: convert read_directory_recursive to take an index

Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Brandon Williams committed May 5, 2017 at 12:53 UTC 0ef8e169aa40ac98dce71f61074bcd729cd9ba54
1 file changed +29 -23
dir.c
+29 -23
@@ -46,7 +46,8 @@ struct cached_dir {
46 };
47
48 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
49 - const char *path, int len, struct untracked_cache_dir *untracked,
49 + struct index_state *istate, const char *path, int len,
50 + struct untracked_cache_dir *untracked,
51 int check_only, const struct pathspec *pathspec);
52 static int get_dtype(struct dirent *de, struct index_state *istate,
53 const char *path, int len);
@@ -1362,12 +1363,13 @@ static enum exist_status directory_exists_in_index(struct index_state *istate,
1363 * (c) otherwise, we recurse into it.
1364 */
1365 static enum path_treatment treat_directory(struct dir_struct *dir,
1366 + struct index_state *istate,
1367 struct untracked_cache_dir *untracked,
1368 const char *dirname, int len, int baselen, int exclude,
1369 const struct pathspec *pathspec)
1370 {
1371 /* The "len-1" is to strip the final '/' */
1370 - switch (directory_exists_in_index(&the_index, dirname, len-1)) {
1372 + switch (directory_exists_in_index(istate, dirname, len-1)) {
1373 case index_directory:
1374 return path_recurse;
1375
@@ -1392,7 +1394,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
1394
1395 untracked = lookup_untracked(dir->untracked, untracked,
1396 dirname + baselen, len - baselen);
1395 - return read_directory_recursive(dir, dirname, len,
1397 + return read_directory_recursive(dir, istate, dirname, len,
1398 untracked, 1, pathspec);
1399 }
1400
@@ -1536,16 +1538,17 @@ static int get_dtype(struct dirent *de, struct index_state *istate,
1538
1539 static enum path_treatment treat_one_path(struct dir_struct *dir,
1540 struct untracked_cache_dir *untracked,
1541 + struct index_state *istate,
1542 struct strbuf *path,
1543 int baselen,
1544 const struct pathspec *pathspec,
1545 int dtype, struct dirent *de)
1546 {
1547 int exclude;
1545 - int has_path_in_index = !!index_file_exists(&the_index, path->buf, path->len, ignore_case);
1548 + int has_path_in_index = !!index_file_exists(istate, path->buf, path->len, ignore_case);
1549
1550 if (dtype == DT_UNKNOWN)
1548 - dtype = get_dtype(de, &the_index, path->buf, path->len);
1551 + dtype = get_dtype(de, istate, path->buf, path->len);
1552
1553 /* Always exclude indexed files */
1554 if (dtype != DT_DIR && has_path_in_index)
@@ -1572,10 +1575,10 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
1575 if ((dir->flags & DIR_COLLECT_KILLED_ONLY) &&
1576 (dtype == DT_DIR) &&
1577 !has_path_in_index &&
1575 - (directory_exists_in_index(&the_index, path->buf, path->len) == index_nonexistent))
1578 + (directory_exists_in_index(istate, path->buf, path->len) == index_nonexistent))
1579 return path_none;
1580
1578 - exclude = is_excluded(dir, &the_index, path->buf, &dtype);
1581 + exclude = is_excluded(dir, istate, path->buf, &dtype);
1582
1583 /*
1584 * Excluded? If we don't explicitly want to show
@@ -1589,7 +1592,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
1592 return path_none;
1593 case DT_DIR:
1594 strbuf_addch(path, '/');
1592 - return treat_directory(dir, untracked, path->buf, path->len,
1595 + return treat_directory(dir, istate, untracked, path->buf, path->len,
1596 baselen, exclude, pathspec);
1597 case DT_REG:
1598 case DT_LNK:
@@ -1600,6 +1603,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
1603 static enum path_treatment treat_path_fast(struct dir_struct *dir,
1604 struct untracked_cache_dir *untracked,
1605 struct cached_dir *cdir,
1606 + struct index_state *istate,
1607 struct strbuf *path,
1608 int baselen,
1609 const struct pathspec *pathspec)
@@ -1618,7 +1622,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
1622 * to its bottom. Verify again the same set of directories
1623 * with check_only set.
1624 */
1621 - return read_directory_recursive(dir, path->buf, path->len,
1625 + return read_directory_recursive(dir, istate, path->buf, path->len,
1626 cdir->ucd, 1, pathspec);
1627 /*
1628 * We get path_recurse in the first run when
@@ -1632,6 +1636,7 @@ static enum path_treatment treat_path_fast(struct dir_struct *dir,
1636 static enum path_treatment treat_path(struct dir_struct *dir,
1637 struct untracked_cache_dir *untracked,
1638 struct cached_dir *cdir,
1639 + struct index_state *istate,
1640 struct strbuf *path,
1641 int baselen,
1642 const struct pathspec *pathspec)
@@ -1640,7 +1645,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
1645 struct dirent *de = cdir->de;
1646
1647 if (!de)
1643 - return treat_path_fast(dir, untracked, cdir, path,
1648 + return treat_path_fast(dir, untracked, cdir, istate, path,
1649 baselen, pathspec);
1650 if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git"))
1651 return path_none;
@@ -1650,7 +1655,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
1655 return path_none;
1656
1657 dtype = DTYPE(de);
1653 - return treat_one_path(dir, untracked, path, baselen, pathspec, dtype, de);
1658 + return treat_one_path(dir, untracked, istate, path, baselen, pathspec, dtype, de);
1659 }
1660
1661 static void add_untracked(struct untracked_cache_dir *dir, const char *name)
@@ -1781,9 +1786,9 @@ static void close_cached_dir(struct cached_dir *cdir)
1786 * Returns the most significant path_treatment value encountered in the scan.
1787 */
1788 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
1784 - const char *base, int baselen,
1785 - struct untracked_cache_dir *untracked, int check_only,
1786 - const struct pathspec *pathspec)
1789 + struct index_state *istate, const char *base, int baselen,
1790 + struct untracked_cache_dir *untracked, int check_only,
1791 + const struct pathspec *pathspec)
1792 {
1793 struct cached_dir cdir;
1794 enum path_treatment state, subdir_state, dir_state = path_none;
@@ -1791,7 +1796,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
1796
1797 strbuf_add(&path, base, baselen);
1798
1794 - if (open_cached_dir(&cdir, dir, untracked, &the_index, &path, check_only))
1799 + if (open_cached_dir(&cdir, dir, untracked, istate, &path, check_only))
1800 goto out;
1801
1802 if (untracked)
@@ -1799,7 +1804,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
1804
1805 while (!read_cached_dir(&cdir)) {
1806 /* check how the file or directory should be treated */
1802 - state = treat_path(dir, untracked, &cdir, &path,
1807 + state = treat_path(dir, untracked, &cdir, istate, &path,
1808 baselen, pathspec);
1809
1810 if (state > dir_state)
@@ -1812,7 +1817,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
1817 path.buf + baselen,
1818 path.len - baselen);
1819 subdir_state =
1815 - read_directory_recursive(dir, path.buf,
1820 + read_directory_recursive(dir, istate, path.buf,
1821 path.len, ud,
1822 check_only, pathspec);
1823 if (subdir_state > dir_state)
@@ -1834,18 +1839,18 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
1839 switch (state) {
1840 case path_excluded:
1841 if (dir->flags & DIR_SHOW_IGNORED)
1837 - dir_add_name(dir, &the_index, path.buf, path.len);
1842 + dir_add_name(dir, istate, path.buf, path.len);
1843 else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
1844 ((dir->flags & DIR_COLLECT_IGNORED) &&
1845 exclude_matches_pathspec(path.buf, path.len,
1846 pathspec)))
1842 - dir_add_ignored(dir, &the_index, path.buf, path.len);
1847 + dir_add_ignored(dir, istate, path.buf, path.len);
1848 break;
1849
1850 case path_untracked:
1851 if (dir->flags & DIR_SHOW_IGNORED)
1852 break;
1848 - dir_add_name(dir, &the_index, path.buf, path.len);
1853 + dir_add_name(dir, istate, path.buf, path.len);
1854 if (cdir.fdir)
1855 add_untracked(untracked, path.buf + baselen);
1856 break;
@@ -1870,6 +1875,7 @@ static int cmp_name(const void *p1, const void *p2)
1875 }
1876
1877 static int treat_leading_path(struct dir_struct *dir,
1878 + struct index_state *istate,
1879 const char *path, int len,
1880 const struct pathspec *pathspec)
1881 {
@@ -1897,7 +1903,7 @@ static int treat_leading_path(struct dir_struct *dir,
1903 break;
1904 if (simplify_away(sb.buf, sb.len, pathspec))
1905 break;
1900 - if (treat_one_path(dir, NULL, &sb, baselen, pathspec,
1906 + if (treat_one_path(dir, NULL, istate, &sb, baselen, pathspec,
1907 DT_DIR, NULL) == path_none)
1908 break; /* do not recurse into it */
1909 if (len <= baselen) {
@@ -2080,8 +2086,8 @@ int read_directory(struct dir_struct *dir, const char *path,
2086 * e.g. prep_exclude()
2087 */
2088 dir->untracked = NULL;
2083 - if (!len || treat_leading_path(dir, path, len, pathspec))
2084 - read_directory_recursive(dir, path, len, untracked, 0, pathspec);
2089 + if (!len || treat_leading_path(dir, &the_index, path, len, pathspec))
2090 + read_directory_recursive(dir, &the_index, path, len, untracked, 0, pathspec);
2091 QSORT(dir->entries, dir->nr, cmp_name);
2092 QSORT(dir->ignored, dir->ignored_nr, cmp_name);
2093 if (dir->untracked) {