23
23
#define iterator__has_been_accessed (I ) iterator__flag(I,FIRST_ACCESS)
24
24
#define iterator__honor_ignores (I ) iterator__flag(I,HONOR_IGNORES)
25
25
#define iterator__ignore_dot_git (I ) iterator__flag(I,IGNORE_DOT_GIT)
26
- #define iterator__symlinksdir (I ) iterator__flag(I,INCLUDE_SYMLINK_REFSDIR )
26
+ #define iterator__descend_symlinks (I ) iterator__flag(I,DESCEND_SYMLINKS )
27
27
28
28
29
29
static void iterator_set_ignore_case (git_iterator * iter , bool ignore_case )
@@ -1492,29 +1492,41 @@ static int filesystem_iterator_current(
1492
1492
return 0 ;
1493
1493
}
1494
1494
1495
- static int is_directory (
1496
- const filesystem_iterator * iter , const filesystem_iterator_entry * entry )
1495
+ static int filesystem_iterator_is_dir (
1496
+ bool * is_dir ,
1497
+ const filesystem_iterator * iter ,
1498
+ const filesystem_iterator_entry * entry )
1497
1499
{
1498
- int isdir = 0 ;
1499
1500
struct stat st ;
1500
- git_buf fullpath ;
1501
+ git_buf fullpath = GIT_BUF_INIT ;
1502
+ int error = 0 ;
1501
1503
1502
- if (S_ISDIR (entry -> st .st_mode ))
1503
- return 1 ;
1504
- if (!iterator__symlinksdir (iter ) || !S_ISLNK (entry -> st .st_mode ))
1505
- return 0 ;
1504
+ if (S_ISDIR (entry -> st .st_mode )) {
1505
+ * is_dir = 1 ;
1506
+ goto done ;
1507
+ }
1508
+
1509
+ if (!iterator__descend_symlinks (iter ) || !S_ISLNK (entry -> st .st_mode )) {
1510
+ * is_dir = 0 ;
1511
+ goto done ;
1512
+ }
1506
1513
1507
- git_buf_init (& fullpath , 0 );
1508
- git_buf_joinpath (& fullpath , iter -> root , entry -> path );
1509
- isdir = !p_stat (fullpath .ptr , & st ) && S_ISDIR (st .st_mode );
1514
+ if ((error = git_buf_joinpath (& fullpath , iter -> root , entry -> path )) < 0 ||
1515
+ (error = p_stat (fullpath .ptr , & st )) < 0 )
1516
+ goto done ;
1517
+
1518
+ * is_dir = S_ISDIR (st .st_mode );
1519
+
1520
+ done :
1510
1521
git_buf_free (& fullpath );
1511
- return isdir ;
1522
+ return error ;
1512
1523
}
1513
1524
1514
1525
static int filesystem_iterator_advance (
1515
1526
const git_index_entry * * out , git_iterator * i )
1516
1527
{
1517
1528
filesystem_iterator * iter = (filesystem_iterator * )i ;
1529
+ bool is_dir ;
1518
1530
int error = 0 ;
1519
1531
1520
1532
iter -> base .flags |= GIT_ITERATOR_FIRST_ACCESS ;
@@ -1539,7 +1551,10 @@ static int filesystem_iterator_advance(
1539
1551
entry = frame -> entries .contents [frame -> next_idx ];
1540
1552
frame -> next_idx ++ ;
1541
1553
1542
- if (is_directory (iter , entry )) {
1554
+ if ((error = filesystem_iterator_is_dir (& is_dir , iter , entry )) < 0 )
1555
+ break ;
1556
+
1557
+ if (is_dir ) {
1543
1558
if (iterator__do_autoexpand (iter )) {
1544
1559
error = filesystem_iterator_frame_push (iter , entry );
1545
1560
0 commit comments