Skip to content

Commit 4dcd4de

Browse files
derrickstoleegitster
authored andcommitted
unpack-trees: add progress to clear_ce_flags()
When a large repository has many sparse-checkout patterns, the process for updating the skip-worktree bits can take long enough that a user gets confused why nothing is happening. Update the clear_ce_flags() method to write progress. Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent eb42fec commit 4dcd4de

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

cache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ static inline unsigned int canon_mode(unsigned int mode)
304304

305305
struct split_index;
306306
struct untracked_cache;
307+
struct progress;
307308

308309
struct index_state {
309310
struct cache_entry **cache;
@@ -326,6 +327,7 @@ struct index_state {
326327
uint64_t fsmonitor_last_update;
327328
struct ewah_bitmap *fsmonitor_dirty;
328329
struct mem_pool *ce_mem_pool;
330+
struct progress *progress;
329331
};
330332

331333
/* Name hashing */

unpack-trees.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,8 @@ static int clear_ce_flags_1(struct index_state *istate,
12691269
struct strbuf *prefix,
12701270
int select_mask, int clear_mask,
12711271
struct pattern_list *pl,
1272-
enum pattern_match_result default_match);
1272+
enum pattern_match_result default_match,
1273+
int progress_nr);
12731274

12741275
/* Whole directory matching */
12751276
static int clear_ce_flags_dir(struct index_state *istate,
@@ -1278,7 +1279,8 @@ static int clear_ce_flags_dir(struct index_state *istate,
12781279
char *basename,
12791280
int select_mask, int clear_mask,
12801281
struct pattern_list *pl,
1281-
enum pattern_match_result default_match)
1282+
enum pattern_match_result default_match,
1283+
int progress_nr)
12821284
{
12831285
struct cache_entry **cache_end;
12841286
int dtype = DT_DIR;
@@ -1315,7 +1317,8 @@ static int clear_ce_flags_dir(struct index_state *istate,
13151317
rc = clear_ce_flags_1(istate, cache, cache_end - cache,
13161318
prefix,
13171319
select_mask, clear_mask,
1318-
pl, ret);
1320+
pl, ret,
1321+
progress_nr);
13191322
}
13201323

13211324
strbuf_setlen(prefix, prefix->len - 1);
@@ -1342,7 +1345,8 @@ static int clear_ce_flags_1(struct index_state *istate,
13421345
struct strbuf *prefix,
13431346
int select_mask, int clear_mask,
13441347
struct pattern_list *pl,
1345-
enum pattern_match_result default_match)
1348+
enum pattern_match_result default_match,
1349+
int progress_nr)
13461350
{
13471351
struct cache_entry **cache_end = cache + nr;
13481352

@@ -1356,8 +1360,11 @@ static int clear_ce_flags_1(struct index_state *istate,
13561360
int len, dtype;
13571361
enum pattern_match_result ret;
13581362

1363+
display_progress(istate->progress, progress_nr);
1364+
13591365
if (select_mask && !(ce->ce_flags & select_mask)) {
13601366
cache++;
1367+
progress_nr++;
13611368
continue;
13621369
}
13631370

@@ -1378,20 +1385,26 @@ static int clear_ce_flags_1(struct index_state *istate,
13781385
prefix,
13791386
prefix->buf + prefix->len - len,
13801387
select_mask, clear_mask,
1381-
pl, default_match);
1388+
pl, default_match,
1389+
progress_nr);
13821390

13831391
/* clear_c_f_dir eats a whole dir already? */
13841392
if (processed) {
13851393
cache += processed;
1394+
progress_nr += processed;
13861395
strbuf_setlen(prefix, prefix->len - len);
13871396
continue;
13881397
}
13891398

13901399
strbuf_addch(prefix, '/');
1391-
cache += clear_ce_flags_1(istate, cache, cache_end - cache,
1392-
prefix,
1393-
select_mask, clear_mask, pl,
1394-
default_match);
1400+
processed = clear_ce_flags_1(istate, cache, cache_end - cache,
1401+
prefix,
1402+
select_mask, clear_mask, pl,
1403+
default_match, progress_nr);
1404+
1405+
cache += processed;
1406+
progress_nr += processed;
1407+
13951408
strbuf_setlen(prefix, prefix->len - len - 1);
13961409
continue;
13971410
}
@@ -1406,19 +1419,27 @@ static int clear_ce_flags_1(struct index_state *istate,
14061419
if (ret == MATCHED)
14071420
ce->ce_flags &= ~clear_mask;
14081421
cache++;
1422+
progress_nr++;
14091423
}
1424+
1425+
display_progress(istate->progress, progress_nr);
14101426
return nr - (cache_end - cache);
14111427
}
14121428

14131429
static int clear_ce_flags(struct index_state *istate,
14141430
int select_mask, int clear_mask,
1415-
struct pattern_list *pl)
1431+
struct pattern_list *pl,
1432+
int show_progress)
14161433
{
14171434
static struct strbuf prefix = STRBUF_INIT;
14181435
char label[100];
14191436
int rval;
14201437

14211438
strbuf_reset(&prefix);
1439+
if (show_progress)
1440+
istate->progress = start_delayed_progress(
1441+
_("Updating index flags"),
1442+
istate->cache_nr);
14221443

14231444
xsnprintf(label, sizeof(label), "clear_ce_flags(0x%08lx,0x%08lx)",
14241445
(unsigned long)select_mask, (unsigned long)clear_mask);
@@ -1428,9 +1449,10 @@ static int clear_ce_flags(struct index_state *istate,
14281449
istate->cache_nr,
14291450
&prefix,
14301451
select_mask, clear_mask,
1431-
pl, 0);
1452+
pl, 0, 0);
14321453
trace2_region_leave("unpack_trees", label, the_repository);
14331454

1455+
stop_progress(&istate->progress);
14341456
return rval;
14351457
}
14361458

@@ -1439,7 +1461,8 @@ static int clear_ce_flags(struct index_state *istate,
14391461
*/
14401462
static void mark_new_skip_worktree(struct pattern_list *pl,
14411463
struct index_state *istate,
1442-
int select_flag, int skip_wt_flag)
1464+
int select_flag, int skip_wt_flag,
1465+
int show_progress)
14431466
{
14441467
int i;
14451468

@@ -1463,7 +1486,7 @@ static void mark_new_skip_worktree(struct pattern_list *pl,
14631486
* 2. Widen worktree according to sparse-checkout file.
14641487
* Matched entries will have skip_wt_flag cleared (i.e. "in")
14651488
*/
1466-
clear_ce_flags(istate, select_flag, skip_wt_flag, pl);
1489+
clear_ce_flags(istate, select_flag, skip_wt_flag, pl, show_progress);
14671490
}
14681491

14691492
static int verify_absent(const struct cache_entry *,
@@ -1525,7 +1548,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
15251548
* Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
15261549
*/
15271550
if (!o->skip_sparse_checkout)
1528-
mark_new_skip_worktree(o->pl, o->src_index, 0, CE_NEW_SKIP_WORKTREE);
1551+
mark_new_skip_worktree(o->pl, o->src_index, 0,
1552+
CE_NEW_SKIP_WORKTREE, o->verbose_update);
15291553

15301554
if (!dfc)
15311555
dfc = xcalloc(1, cache_entry_size(0));
@@ -1590,7 +1614,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
15901614
* If the will have NEW_SKIP_WORKTREE, also set CE_SKIP_WORKTREE
15911615
* so apply_sparse_checkout() won't attempt to remove it from worktree
15921616
*/
1593-
mark_new_skip_worktree(o->pl, &o->result, CE_ADDED, CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE);
1617+
mark_new_skip_worktree(o->pl, &o->result,
1618+
CE_ADDED, CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE,
1619+
o->verbose_update);
15941620

15951621
ret = 0;
15961622
for (i = 0; i < o->result.cache_nr; i++) {

0 commit comments

Comments
 (0)