Skip to content

Commit 2f79462

Browse files
committed
Merge branch 'ds/more-index-cleanups'
Cleaning various codepaths up. * ds/more-index-cleanups: t1092: test interesting sparse-checkout scenarios test-lib: test_region looks for trace2 regions sparse-checkout: load sparse-checkout patterns name-hash: use trace2 regions for init repository: add repo reference to index_state fsmonitor: de-duplicate BUG()s around dirty bits cache-tree: extract subtree_pos() cache-tree: simplify verify_cache() prototype cache-tree: clean up cache_tree_update()
2 parents 02fb216 + 19a0acc commit 2f79462

15 files changed

+408
-53
lines changed

builtin/checkout.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -821,9 +821,6 @@ static int merge_working_tree(const struct checkout_opts *opts,
821821
}
822822
}
823823

824-
if (!active_cache_tree)
825-
active_cache_tree = cache_tree();
826-
827824
if (!cache_tree_fully_valid(active_cache_tree))
828825
cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR);
829826

builtin/sparse-checkout.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ static char const * const builtin_sparse_checkout_usage[] = {
2222
NULL
2323
};
2424

25-
static char *get_sparse_checkout_filename(void)
26-
{
27-
return git_pathdup("info/sparse-checkout");
28-
}
29-
3025
static void write_patterns_to_file(FILE *fp, struct pattern_list *pl)
3126
{
3227
int i;

cache-tree.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static int subtree_name_cmp(const char *one, int onelen,
4545
return memcmp(one, two, onelen);
4646
}
4747

48-
static int subtree_pos(struct cache_tree *it, const char *path, int pathlen)
48+
int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen)
4949
{
5050
struct cache_tree_sub **down = it->down;
5151
int lo, hi;
@@ -72,7 +72,7 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it,
7272
int create)
7373
{
7474
struct cache_tree_sub *down;
75-
int pos = subtree_pos(it, path, pathlen);
75+
int pos = cache_tree_subtree_pos(it, path, pathlen);
7676
if (0 <= pos)
7777
return it->down[pos];
7878
if (!create)
@@ -123,7 +123,7 @@ static int do_invalidate_path(struct cache_tree *it, const char *path)
123123
it->entry_count = -1;
124124
if (!*slash) {
125125
int pos;
126-
pos = subtree_pos(it, path, namelen);
126+
pos = cache_tree_subtree_pos(it, path, namelen);
127127
if (0 <= pos) {
128128
cache_tree_free(&it->down[pos]->cache_tree);
129129
free(it->down[pos]);
@@ -151,16 +151,15 @@ void cache_tree_invalidate_path(struct index_state *istate, const char *path)
151151
istate->cache_changed |= CACHE_TREE_CHANGED;
152152
}
153153

154-
static int verify_cache(struct cache_entry **cache,
155-
int entries, int flags)
154+
static int verify_cache(struct index_state *istate, int flags)
156155
{
157-
int i, funny;
156+
unsigned i, funny;
158157
int silent = flags & WRITE_TREE_SILENT;
159158

160159
/* Verify that the tree is merged */
161160
funny = 0;
162-
for (i = 0; i < entries; i++) {
163-
const struct cache_entry *ce = cache[i];
161+
for (i = 0; i < istate->cache_nr; i++) {
162+
const struct cache_entry *ce = istate->cache[i];
164163
if (ce_stage(ce)) {
165164
if (silent)
166165
return -1;
@@ -180,13 +179,13 @@ static int verify_cache(struct cache_entry **cache,
180179
* stage 0 entries.
181180
*/
182181
funny = 0;
183-
for (i = 0; i < entries - 1; i++) {
182+
for (i = 0; i + 1 < istate->cache_nr; i++) {
184183
/* path/file always comes after path because of the way
185184
* the cache is sorted. Also path can appear only once,
186185
* which means conflicting one would immediately follow.
187186
*/
188-
const struct cache_entry *this_ce = cache[i];
189-
const struct cache_entry *next_ce = cache[i + 1];
187+
const struct cache_entry *this_ce = istate->cache[i];
188+
const struct cache_entry *next_ce = istate->cache[i + 1];
190189
const char *this_name = this_ce->name;
191190
const char *next_name = next_ce->name;
192191
int this_len = ce_namelen(this_ce);
@@ -436,16 +435,20 @@ static int update_one(struct cache_tree *it,
436435

437436
int cache_tree_update(struct index_state *istate, int flags)
438437
{
439-
struct cache_tree *it = istate->cache_tree;
440-
struct cache_entry **cache = istate->cache;
441-
int entries = istate->cache_nr;
442-
int skip, i = verify_cache(cache, entries, flags);
438+
int skip, i;
439+
440+
i = verify_cache(istate, flags);
443441

444442
if (i)
445443
return i;
444+
445+
if (!istate->cache_tree)
446+
istate->cache_tree = cache_tree();
447+
446448
trace_performance_enter();
447449
trace2_region_enter("cache_tree", "update", the_repository);
448-
i = update_one(it, cache, entries, "", 0, &skip, flags);
450+
i = update_one(istate->cache_tree, istate->cache, istate->cache_nr,
451+
"", 0, &skip, flags);
449452
trace2_region_leave("cache_tree", "update", the_repository);
450453
trace_performance_leave("cache_tree_update");
451454
if (i < 0)
@@ -635,9 +638,6 @@ static int write_index_as_tree_internal(struct object_id *oid,
635638
cache_tree_valid = 0;
636639
}
637640

638-
if (!index_state->cache_tree)
639-
index_state->cache_tree = cache_tree();
640-
641641
if (!cache_tree_valid && cache_tree_update(index_state, flags) < 0)
642642
return WRITE_TREE_UNMERGED_INDEX;
643643

cache-tree.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ void cache_tree_free(struct cache_tree **);
2727
void cache_tree_invalidate_path(struct index_state *, const char *);
2828
struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
2929

30+
int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen);
31+
3032
void cache_tree_write(struct strbuf *, struct cache_tree *root);
3133
struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
3234

cache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ struct index_state {
328328
struct ewah_bitmap *fsmonitor_dirty;
329329
struct mem_pool *ce_mem_pool;
330330
struct progress *progress;
331+
struct repository *repo;
331332
};
332333

333334
/* Name hashing */

dir.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,6 +2998,23 @@ void setup_standard_excludes(struct dir_struct *dir)
29982998
}
29992999
}
30003000

3001+
char *get_sparse_checkout_filename(void)
3002+
{
3003+
return git_pathdup("info/sparse-checkout");
3004+
}
3005+
3006+
int get_sparse_checkout_patterns(struct pattern_list *pl)
3007+
{
3008+
int res;
3009+
char *sparse_filename = get_sparse_checkout_filename();
3010+
3011+
pl->use_cone_patterns = core_sparse_checkout_cone;
3012+
res = add_patterns_from_file_to_list(sparse_filename, "", 0, pl, NULL);
3013+
3014+
free(sparse_filename);
3015+
return res;
3016+
}
3017+
30013018
int remove_path(const char *name)
30023019
{
30033020
char *slash;

dir.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,8 @@ int is_empty_dir(const char *dir);
448448

449449
void setup_standard_excludes(struct dir_struct *dir);
450450

451+
char *get_sparse_checkout_filename(void);
452+
int get_sparse_checkout_patterns(struct pattern_list *pl);
451453

452454
/* Constants for remove_dir_recursively: */
453455

fsmonitor.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,19 @@
1313

1414
struct trace_key trace_fsmonitor = TRACE_KEY_INIT(FSMONITOR);
1515

16+
static void assert_index_minimum(struct index_state *istate, size_t pos)
17+
{
18+
if (pos > istate->cache_nr)
19+
BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
20+
(uintmax_t)pos, istate->cache_nr);
21+
}
22+
1623
static void fsmonitor_ewah_callback(size_t pos, void *is)
1724
{
1825
struct index_state *istate = (struct index_state *)is;
1926
struct cache_entry *ce;
2027

21-
if (pos >= istate->cache_nr)
22-
BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" >= %u)",
23-
(uintmax_t)pos, istate->cache_nr);
28+
assert_index_minimum(istate, pos + 1);
2429

2530
ce = istate->cache[pos];
2631
ce->ce_flags &= ~CE_FSMONITOR_VALID;
@@ -82,10 +87,8 @@ int read_fsmonitor_extension(struct index_state *istate, const void *data,
8287
}
8388
istate->fsmonitor_dirty = fsmonitor_dirty;
8489

85-
if (!istate->split_index &&
86-
istate->fsmonitor_dirty->bit_size > istate->cache_nr)
87-
BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
88-
(uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
90+
if (!istate->split_index)
91+
assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
8992

9093
trace_printf_key(&trace_fsmonitor, "read fsmonitor extension successful");
9194
return 0;
@@ -110,10 +113,8 @@ void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate)
110113
uint32_t ewah_size = 0;
111114
int fixup = 0;
112115

113-
if (!istate->split_index &&
114-
istate->fsmonitor_dirty->bit_size > istate->cache_nr)
115-
BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
116-
(uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
116+
if (!istate->split_index)
117+
assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
117118

118119
put_be32(&hdr_version, INDEX_EXTENSION_VERSION2);
119120
strbuf_add(sb, &hdr_version, sizeof(uint32_t));
@@ -335,9 +336,7 @@ void tweak_fsmonitor(struct index_state *istate)
335336
}
336337

337338
/* Mark all previously saved entries as dirty */
338-
if (istate->fsmonitor_dirty->bit_size > istate->cache_nr)
339-
BUG("fsmonitor_dirty has more entries than the index (%"PRIuMAX" > %u)",
340-
(uintmax_t)istate->fsmonitor_dirty->bit_size, istate->cache_nr);
339+
assert_index_minimum(istate, istate->fsmonitor_dirty->bit_size);
341340
ewah_each_bit(istate->fsmonitor_dirty, fsmonitor_ewah_callback, istate);
342341

343342
refresh_fsmonitor(istate);

name-hash.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
#include "cache.h"
99
#include "thread-utils.h"
10+
#include "trace2.h"
1011

1112
struct dir_entry {
1213
struct hashmap_entry ent;
@@ -577,6 +578,7 @@ static void lazy_init_name_hash(struct index_state *istate)
577578
if (istate->name_hash_initialized)
578579
return;
579580
trace_performance_enter();
581+
trace2_region_enter("index", "name-hash-init", istate->repo);
580582
hashmap_init(&istate->name_hash, cache_entry_cmp, NULL, istate->cache_nr);
581583
hashmap_init(&istate->dir_hash, dir_entry_cmp, NULL, istate->cache_nr);
582584

@@ -597,6 +599,7 @@ static void lazy_init_name_hash(struct index_state *istate)
597599
}
598600

599601
istate->name_hash_initialized = 1;
602+
trace2_region_leave("index", "name-hash-init", istate->repo);
600603
trace_performance_leave("initialize name hash");
601604
}
602605

repository.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ int repo_read_index(struct repository *repo)
264264
if (!repo->index)
265265
repo->index = xcalloc(1, sizeof(*repo->index));
266266

267+
/* Complete the double-reference */
268+
if (!repo->index->repo)
269+
repo->index->repo = repo;
270+
else if (repo->index->repo != repo)
271+
BUG("repo's index should point back at itself");
272+
267273
return read_index_from(repo->index, repo->index_file, repo->gitdir);
268274
}
269275

sequencer.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -679,9 +679,6 @@ static int do_recursive_merge(struct repository *r,
679679

680680
static struct object_id *get_cache_tree_oid(struct index_state *istate)
681681
{
682-
if (!istate->cache_tree)
683-
istate->cache_tree = cache_tree();
684-
685682
if (!cache_tree_fully_valid(istate->cache_tree))
686683
if (cache_tree_update(istate, 0)) {
687684
error(_("unable to update cache tree"));

t/t0500-progress-display.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,7 @@ test_expect_success 'progress generates traces' '
303303
"Working hard" <in 2>stderr &&
304304
305305
# t0212/parse_events.perl intentionally omits regions and data.
306-
grep -e "region_enter" -e "\"category\":\"progress\"" trace.event &&
307-
grep -e "region_leave" -e "\"category\":\"progress\"" trace.event &&
306+
test_region progress "Working hard" trace.event &&
308307
grep "\"key\":\"total_objects\",\"value\":\"40\"" trace.event &&
309308
grep "\"key\":\"total_bytes\",\"value\":\"409600\"" trace.event
310309
'

0 commit comments

Comments
 (0)