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) {