Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
f144d51
fsmonitor: require content checks for reported paths
ttaylorr-oai Jul 21, 2026
b5c6791
fsmonitor: support provider-wide invalidation
ttaylorr-oai Jul 11, 2026
9f9d556
Merge the S06 prerequisites
ttaylorr-oai Jul 11, 2026
1dc1093
status: pin semantic verification to the worktree root
ttaylorr-oai Jul 11, 2026
8436705
status: resolve semantic proof paths through pinned parents
ttaylorr-oai Jul 11, 2026
35490ae
path-namespace: check reopened component identity
ttaylorr-oai Jul 24, 2026
60039b4
status: hash tracked files through anchored descriptors
ttaylorr-oai Jul 11, 2026
1f7d58a
convert: support independent conversion attribute checks
ttaylorr-oai Jul 10, 2026
9f4f431
status: classify candidates for semantic verification
ttaylorr-oai Jul 11, 2026
9169e5a
status: assemble and test serial semantic proof candidates
ttaylorr-oai Jul 11, 2026
c97feb2
status: apply complete semantic proofs atomically
ttaylorr-oai Jul 11, 2026
00ee690
status: verify semantic proof ranges in parallel
ttaylorr-oai Jul 11, 2026
fb00c9c
status: fingerprint configuration for semantic clean proofs
ttaylorr-oai Jul 11, 2026
3e2273a
status: write bounded attribute manifests
ttaylorr-oai Jul 11, 2026
b908fdb
status: validate attribute manifest records
ttaylorr-oai Jul 11, 2026
72c623d
status: iterate changed attribute manifest entries
ttaylorr-oai Jul 11, 2026
bf79489
status: read attribute sources through pinned paths
ttaylorr-oai Jul 11, 2026
5244300
status: build worktree attribute manifests
ttaylorr-oai Jul 11, 2026
db68dc7
status: probe attribute sources in parallel
ttaylorr-oai Jul 11, 2026
750b209
fsmonitor: add a bounded clean-proof record format
ttaylorr-oai Jul 10, 2026
c23170e
status: retain validated worktree attribute manifests
ttaylorr-oai Jul 10, 2026
6548d5b
path: snapshot external source namespaces
ttaylorr-oai Jul 11, 2026
a07c512
attr: fingerprint external sources in stable namespaces
ttaylorr-oai Jul 11, 2026
a750b5b
Merge the S08 prerequisites
ttaylorr-oai Jul 29, 2026
daf3d5c
status: bind semantic configuration to its index
ttaylorr-oai Jul 26, 2026
ae3e36f
commit: stage semantic configuration before reading the index
ttaylorr-oai Jul 26, 2026
0bbb6a9
status: classify durable index source identities
ttaylorr-oai Jul 24, 2026
407fec9
read-cache: bind null-checksum indexes to their source file
ttaylorr-oai Jul 11, 2026
fcb19d8
read-cache: validate persisted fsmonitor semantic history
ttaylorr-oai Jul 24, 2026
613d0c5
read-cache: write only token-closed fsmonitor history
ttaylorr-oai Jul 24, 2026
6bbc3c0
read-cache: preserve validated fsmonitor history across indexes
ttaylorr-oai Jul 11, 2026
a480198
status: hold external attributes stable across refresh
ttaylorr-oai Jul 21, 2026
2181cb2
fsmonitor: seed missing-history baselines from legacy tokens
ttaylorr-oai Jul 24, 2026
4ba322a
status: prepare logical-index history checkpoints
ttaylorr-oai Jul 29, 2026
949c3c6
fsmonitor: rebuild sparse-index history without expanding the live index
ttaylorr-oai Jul 24, 2026
b0d71ac
status: bind each closing token to its complete proof epoch
ttaylorr-oai Jul 21, 2026
89c8142
fsmonitor: reopen semantic proofs after attribute events
ttaylorr-oai Jul 21, 2026
66b05b3
status: adopt tracked history only after closing its proof
ttaylorr-oai Jul 21, 2026
1808e38
wt-status: close tracked proofs before scanning untracked paths
ttaylorr Jul 24, 2026
3501231
dir: reject oversized pattern files before allocation
ttaylorr-oai Jul 24, 2026
cfca3fd
commit: close fsmonitor tokens across pre-commit hooks
ttaylorr-oai Jul 21, 2026
bee056c
Merge the S13 prerequisites
ttaylorr-oai Jul 30, 2026
7ffb384
exclude: prove the contents of observed ignore sources
ttaylorr-oai Jul 21, 2026
217941b
dir: capture ignore sources beneath anchored parents
ttaylorr-oai Jul 21, 2026
9278f7c
preload-index: stage proven untracked bulk results
ttaylorr-oai Jul 21, 2026
aa40443
preload-index: collect visible paths during the APFS walk
ttaylorr-oai Jul 21, 2026
7d5f592
status: reuse complete APFS untracked preload results
ttaylorr-oai Jul 21, 2026
36bdcc4
preload-index: translate complete Linux statx observations
ttaylorr-oai Jul 21, 2026
fe5a1a8
dir: compare all saved metadata for UNTR directories
ttaylorr-oai Jul 11, 2026
dcf54f3
preload-index: anchor Linux directory opens to the worktree
ttaylorr-oai Jul 21, 2026
522f61f
dir: consume preloaded UNTR directory stat results
ttaylorr-oai Jul 10, 2026
84d2614
preload-index: enumerate Linux directories without trusting d_type
ttaylorr-oai Jul 21, 2026
f8bbac2
dir: snapshot UNTR directory validation inputs
ttaylorr-oai Jul 10, 2026
eede914
preload-index: detect replaced Linux scan directories
ttaylorr-oai Jul 21, 2026
c06e176
dir: validate captured UNTR directory stats
ttaylorr-oai Jul 10, 2026
1aa5e9b
preload-index: validate Linux mount topology around bulk scans
ttaylorr-oai Jul 21, 2026
b2e7dcf
dir: validate captured UNTR directory stats in parallel
ttaylorr-oai Jul 10, 2026
6f70d18
preload-index: enable the verified Linux bulk scan backend
ttaylorr-oai Jul 21, 2026
176a394
status: overlap UNTR validation with tracked-index refresh
ttaylorr-oai Jul 21, 2026
922cea4
status: close bulk content proofs with the provider token
ttaylorr-oai Jul 29, 2026
987940d
status: gate automatic UNTR validation preloads
ttaylorr-oai Jul 26, 2026
3bb4e57
exclude: compute stable source-proof digests
ttaylorr-oai Jul 24, 2026
9124f8f
fsmonitor: rediscover linked worktrees when starting a daemon
ttaylorr-oai Jul 24, 2026
3b51fcf
Merge standalone S01/P08 into S01
ttaylorr-oai Jul 21, 2026
a035ffa
fsmonitor: keep multiply-linked files invalid
ttaylorr Jul 11, 2026
3195ebc
status: add a bounded clean-status sidecar format
ttaylorr-oai Jul 21, 2026
f8c8ac1
fsmonitor: start implicit daemons with the invoking Git executable
ttaylorr-oai Jul 24, 2026
db1393e
dir: verify cached excludes during UNTR preload
ttaylorr-oai Jul 21, 2026
19f9c5c
fsmonitor--daemon: invalidate globally for worktree hardlink events
ttaylorr-oai Jul 11, 2026
28a3f3c
status: install sidecars against a pinned index
ttaylorr-oai Jul 24, 2026
b1d033b
fsmonitor: ignore startup timeout configuration in daemon run
ttaylorr Jul 24, 2026
d1ce571
dir: rescan invalid collapsed UNTR witnesses
ttaylorr Jul 24, 2026
4d1d526
fsmonitor: invalidate conversion state for attribute-file events
ttaylorr-oai Jul 24, 2026
bb91656
status: classify indexes that clean proofs may certify
ttaylorr-oai Jul 24, 2026
2dff414
fsmonitor: bind daemon queries to the canonical worktree root
ttaylorr-oai Jul 11, 2026
d2da975
dir: skip recursively valid empty UNTR subtrees
ttaylorr Jul 24, 2026
34483f8
fsmonitor: invalidate attributes for matched directory summaries
ttaylorr-oai Jul 24, 2026
e4f0e54
status: issue sidecars after a verified full scan
ttaylorr-oai Jul 28, 2026
cc17eae
path-namespace: compare complete filesystem object identities
ttaylorr-oai Jul 21, 2026
e23ed6f
Merge the S05 prerequisites
ttaylorr-oai Jul 29, 2026
a40cd9e
status: load bounded clean-status sidecars
ttaylorr-oai Jul 24, 2026
101756f
preload-index: queue bounded bulk directory scans
ttaylorr Jul 24, 2026
7fd4ec8
fsmonitor: validate FSMN before publishing it
ttaylorr-oai Jul 11, 2026
16740fa
exclude: support nonblocking proof captures
ttaylorr-oai Jul 27, 2026
eec942e
preload-index: classify sparse-aware bulk stat observations
ttaylorr Jul 24, 2026
30377a1
fsmonitor: add an untracked-cache token extension
ttaylorr-oai Jul 11, 2026
61f7705
status: answer exact clean status before index deserialization
ttaylorr-oai Jul 27, 2026
d35fdba
preload-index: bind APFS scans to a stable worktree root
ttaylorr-oai Jul 21, 2026
8ed3824
fsmonitor: bind untracked-cache state to its token
ttaylorr-oai Jul 11, 2026
fefc815
Documentation: describe status clean-proof sidecars
ttaylorr-oai Jul 21, 2026
fd577ae
precompose: prepare Unicode configuration before parallel conversion
ttaylorr-oai Jul 21, 2026
98053c2
fsmonitor: validate builtin daemon responses before applying them
ttaylorr-oai Jul 10, 2026
6234022
status: reuse clean proofs for plain status after restore
ttaylorr-oai Aug 10, 2026
e00b53a
preload-index: validate packed APFS directory records
ttaylorr Jul 24, 2026
b020db0
fsmonitor: apply validated builtin path records directly
ttaylorr-oai Jul 24, 2026
03fdf83
fsmonitor: restore recursive validity for paired untracked state
ttaylorr-oai Aug 10, 2026
aeea960
preload-index: walk APFS directories beneath a held root
ttaylorr Jul 24, 2026
6d7e279
fsmonitor: ignore empty hook path records
ttaylorr-oai Jul 24, 2026
2119b48
status: bind external history to physical index sources
ttaylorr-oai Aug 10, 2026
52d8382
preload-index: factor the ordinary preload eligibility predicate
ttaylorr-oai Jul 21, 2026
5a28816
fsmonitor: centralize complete fsmonitor invalidation
ttaylorr-oai Jul 11, 2026
5684c45
status: refresh external history before exact proofs
ttaylorr Aug 10, 2026
32321fd
preload-index: enable opt-in APFS bulk preloading
ttaylorr-oai Jul 28, 2026
7b4a231
wt-status: separate untracked traversal from result collection
ttaylorr-oai Jul 11, 2026
19f2a78
status: keep a forward fsmonitor boundary over stale history
ttaylorr-oai Aug 10, 2026
08758b6
t7529: cover APFS preload directory and root replacement
ttaylorr-oai Jul 28, 2026
cae38fd
status: close fsmonitor tokens around complete status scans
ttaylorr-oai Jul 29, 2026
ed6c886
status: preserve external history for dirty root-wide queries
ttaylorr-oai Aug 11, 2026
7c9aac6
Merge the S11 prerequisites
ttaylorr-oai Jul 24, 2026
b76a6c5
status: show delayed progress during semantic refresh
ttaylorr-oai Aug 11, 2026
b9b56f3
preload-index: retain proven deletions from complete bulk scans
ttaylorr-oai Jul 24, 2026
8ba8f9d
preload-index: avoid bulk scans for sparse provider deltas
ttaylorr-oai Aug 11, 2026
118a899
preload-index: classify definitive tracked-file size changes
ttaylorr-oai Jul 24, 2026
29e9dff
fsmonitor: keep external history disabled on Windows
ttaylorr-oai Aug 11, 2026
490e844
read-cache: reject out-of-bounds index extensions
ttaylorr-oai Jul 10, 2026
959348f
status: consume definitive bulk changes exactly once
ttaylorr-oai Jul 24, 2026
d8a46b6
fsmonitor: honor explicitly invalidated external history
ttaylorr-oai Aug 11, 2026
d5279d0
cache-tree: avoid allocations and searches while reading
ttaylorr-oai Jul 21, 2026
1fe83a6
read-cache: factor refreshed entry construction
ttaylorr-oai Jul 21, 2026
a3bd2bc
status: preserve semantic history for scoped queries
ttaylorr-oai Aug 11, 2026
c7c1f82
read-cache: decode bounded TREE and UNTR extensions in parallel
ttaylorr-oai Jul 21, 2026
36a5a94
status: refresh verified writable bulk-preload entries
ttaylorr-oai Jul 21, 2026
d067582
status: reuse closed proofs for scoped queries
ttaylorr-oai Aug 11, 2026
78d7b65
Merge the status optimization topics
ttaylorr-oai Aug 11, 2026
cd5e01d
fsmonitor: preserve authenticated legacy daemon history
ttaylorr-oai Aug 11, 2026
3dd50ee
t7527: guard invalidated external fsmonitor history
ttaylorr-oai Aug 11, 2026
cb70e96
t7529: open the resume FIFO before publishing readiness
ttaylorr Aug 6, 2026
e621728
t7527: disable split index for legacy daemon queries
ttaylorr-oai Aug 11, 2026
43f995b
t7527: allow a clean read-tree reset to skip refresh
ttaylorr-oai Aug 11, 2026
dc7cad0
t7527: cover scoped fsmonitor history reuse
ttaylorr-oai Aug 11, 2026
b15691d
t7527: tolerate unpersisted fsmonitor-valid bits
ttaylorr-oai Aug 11, 2026
09d6088
t7527: cover closed scoped untracked-cache reuse
ttaylorr-oai Aug 11, 2026
ed4c48a
Merge tb/codex/status-preview-unstable into codex-unstable
chatgpt-codex-connector[bot] Aug 11, 2026
cbe5d53
diff: honor --no-optional-locks when refreshing the index
ttaylorr-oai Aug 7, 2026
a01a3ff
describe: honor optional locks for dirty-worktree checks
ttaylorr-oai Aug 12, 2026
f1598f8
stash: avoid rewriting the index when nothing can be saved
ttaylorr-oai Aug 12, 2026
379ba8f
status: reuse clean proofs across equivalent query shapes
ttaylorr-oai Aug 12, 2026
60077b9
status: preserve semantic history across scoped and index changes
ttaylorr-oai Aug 12, 2026
35e68d5
checkout: avoid rewriting an unchanged index
tnm-oai Jul 29, 2026
af83c31
t7530: tolerate an already-exited fast fallback
ttaylorr-oai Aug 12, 2026
3bedbda
commit: honor optional locks during a dry run
ttaylorr-oai Aug 12, 2026
60c41c1
reset: avoid rewriting an unchanged index
ttaylorr-oai Aug 12, 2026
2039dce
status: certify clean output with configured stash display
ttaylorr-oai Aug 12, 2026
d8489d9
t7530: preserve clean proofs across no-op index commands
ttaylorr-oai Aug 12, 2026
4e32c1a
checkout-index: avoid rewriting an unchanged index
ttaylorr-oai Aug 12, 2026
047394b
diff: restore external fsmonitor history when available
ttaylorr-oai Aug 12, 2026
935249c
sparse-checkout: avoid rewriting an unchanged index
ttaylorr-oai Aug 12, 2026
cfb9444
status: integrate the reviewed preview on codex-unstable
ttaylorr-oai Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions attr-fingerprint.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,97 @@ int attr_fingerprint_repository(struct repository *repo,
return ret;
}

static int legacy_absent_path_is_stable(const char *path)
{
struct path_namespace_snapshot *before = NULL, *after = NULL;
struct strbuf normalized = STRBUF_INIT;
char *absolute = NULL;
int stable = 0;

if (!path)
return 0;
absolute = absolute_pathdup(path);
strbuf_addstr(&normalized, absolute);
if (!strbuf_normalize_path(&normalized) &&
!path_namespace_capture(normalized.buf, &before) &&
!path_namespace_target_present(before) &&
!path_namespace_capture(normalized.buf, &after) &&
!path_namespace_target_present(after) &&
path_namespace_equal(before, after))
stable = 1;
free(absolute);
path_namespace_clear(before);
path_namespace_clear(after);
strbuf_release(&normalized);
return stable;
}

static void legacy_absent_source_hash(
const struct attr_fingerprint_source *sources,
const char *system_path, const struct git_hash_algo *algo,
unsigned char *hash)
{
struct git_hash_ctx ctx;
uint32_t value;

git_hash_init(&ctx, algo);
hash_optional_cstring(&ctx, "attribute-source-content-v1");
put_be32(&value, ATTR_SOURCE_SNAPSHOT_NR);
hash_length_delimited(&ctx, &value, sizeof(value));
for (size_t i = 0; i < ATTR_SOURCE_SNAPSHOT_NR; i++) {
const char *path = i == ATTR_SOURCE_SNAPSHOT_SYSTEM ?
system_path : sources[i].path;

hash_optional_cstring(&ctx, path);
put_be32(&value, sources[i].enabled);
hash_length_delimited(&ctx, &value, sizeof(value));
if (!sources[i].enabled || !path)
continue;
put_be32(&value, 0);
hash_length_delimited(&ctx, &value, sizeof(value));
}
git_hash_final(hash, &ctx);
}

int attr_fingerprint_matches_legacy_absent_sources(
struct repository *repo, const unsigned char *expected)
{
static const char shipped_system_path[] = "//etc/gitattributes";
struct attr_fingerprint_source sources[ATTR_SOURCE_SNAPSHOT_NR];
struct attr_fingerprint before, after;
unsigned char legacy[GIT_MAX_RAWSZ];
char *info_attributes = NULL;
int matches = 0;

if (!expected || !fstat_is_reliable() ||
repository_sources(repo, sources, &info_attributes) ||
!sources[ATTR_SOURCE_SNAPSHOT_SYSTEM].enabled ||
attr_fingerprint_repository(repo, &before) ||
before.sources_present)
goto done;
legacy_absent_source_hash(
sources, sources[ATTR_SOURCE_SNAPSHOT_SYSTEM].path,
repo->hash_algo, legacy);
if (!memcmp(legacy, expected, repo->hash_algo->rawsz)) {
matches = 1;
} else if (legacy_absent_path_is_stable(shipped_system_path)) {
legacy_absent_source_hash(
sources, shipped_system_path, repo->hash_algo, legacy);
matches = !memcmp(legacy, expected, repo->hash_algo->rawsz);
}
if (!matches || attr_fingerprint_repository(repo, &after) ||
after.sources_present ||
memcmp(before.content_hash, after.content_hash,
repo->hash_algo->rawsz) ||
memcmp(before.namespace_hash, after.namespace_hash,
repo->hash_algo->rawsz))
matches = 0;

done:
free(info_attributes);
return matches;
}

int attr_source_snapshot_repository(struct repository *repo,
struct attr_source_snapshot **result)
{
Expand Down
2 changes: 2 additions & 0 deletions attr-fingerprint.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ int attr_fingerprint_sources(
const struct git_hash_algo *algo, struct attr_fingerprint *result);
int attr_fingerprint_repository(struct repository *repo,
struct attr_fingerprint *result);
int attr_fingerprint_matches_legacy_absent_sources(
struct repository *repo, const unsigned char *expected);
int attr_source_snapshot_repository(struct repository *repo,
struct attr_source_snapshot **result);
int attr_source_snapshot_matches_repository(
Expand Down
81 changes: 81 additions & 0 deletions attr-manifest.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "git-compat-util.h"
#include "attr.h"
#include "attr-manifest.h"
#include "environment.h"
#include "read-cache-ll.h"
Expand Down Expand Up @@ -45,6 +46,86 @@ static int attr_manifest_entry_equal(const struct attr_manifest_entry *a,
!memcmp(a->hash, b->hash, algo->rawsz);
}

static void release_parsed_attr(struct match_attr *match)
{
for (size_t i = 0; i < match->num_attr; i++) {
const char *value = match->state[i].setto;

if (!ATTR_TRUE(value) && !ATTR_FALSE(value) &&
!ATTR_UNSET(value))
free((char *)value);
}
free(match);
}

static int normalize_conversion_attributes(
const char *data, size_t len, struct strbuf *normalized)
{
struct strbuf line = STRBUF_INIT;
size_t offset = 0;
int lineno = 0, ret = -1;

if ((!data && len) || memchr(data, '\0', len))
goto done;
while (offset < len) {
const char *start = data + offset;
const char *newline = memchr(start, '\n', len - offset);
const char *trimmed;
struct match_attr *match;
size_t line_len = newline ?
(size_t)(newline - start) + 1 : len - offset;
int display_only;

strbuf_reset(&line);
strbuf_add(&line, start, line_len);
trimmed = line.buf + strspn(line.buf, " \t\r\n");
lineno++;
if (!*trimmed || *trimmed == '#') {
strbuf_add(normalized, start, line_len);
offset += line_len;
continue;
}
if (starts_with(trimmed, ATTRIBUTE_MACRO_PREFIX))
goto done;
match = parse_attr_line(line.buf, GITATTRIBUTES_FILE, lineno, 0);
if (!match || match->is_macro || !match->num_attr) {
if (match)
release_parsed_attr(match);
goto done;
}
display_only = 1;
for (size_t i = 0; i < match->num_attr; i++)
if (strcmp(git_attr_name(match->state[i].attr),
"linguist-generated"))
display_only = 0;
release_parsed_attr(match);
if (!display_only)
strbuf_add(normalized, start, line_len);
offset += line_len;
}
ret = 0;

done:
strbuf_release(&line);
return ret;
}

int attr_manifest_only_linguist_generated_changed(
const char *old_data, size_t old_len,
const char *new_data, size_t new_len)
{
struct strbuf old = STRBUF_INIT, new = STRBUF_INIT;
int equal = 0;

if (!normalize_conversion_attributes(old_data, old_len, &old) &&
!normalize_conversion_attributes(new_data, new_len, &new))
equal = old.len == new.len &&
!memcmp(old.buf, new.buf, old.len);
strbuf_release(&old);
strbuf_release(&new);
return equal;
}

void attr_manifest_writer_init(struct attr_manifest_writer *writer,
struct strbuf *buf,
const struct git_hash_algo *algo)
Expand Down
3 changes: 3 additions & 0 deletions attr-manifest.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,8 @@ int attr_manifest_for_each_changed(const void *old_data, size_t old_len,
const void *new_data, size_t new_len,
const struct git_hash_algo *algo,
attr_manifest_change_fn fn, void *data);
int attr_manifest_only_linguist_generated_changed(
const char *old_data, size_t old_len,
const char *new_data, size_t new_len);

#endif /* ATTR_MANIFEST_H */
2 changes: 2 additions & 0 deletions builtin/add.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,11 +511,13 @@ int cmd_add(int argc,
* add/remove decision below.
*/
if (refresh_only) {
clean_status_enable_external_history(repo);
clean_status_set_config_digest(repo, &clean_digest);
} else if (!show_only && !intent_to_add && !add_renormalize &&
!chmod_arg && !include_sparse && !ignore_add_errors) {
preserve_add_history = 1;
flags |= ADD_CACHE_TRACK_CLEAN_HISTORY;
clean_status_enable_external_history(repo);
clean_status_set_config_digest(repo, &clean_digest);
}

Expand Down
8 changes: 6 additions & 2 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,9 +671,11 @@ static int checkout_paths(const struct checkout_opts *opts,
!opts->merge && !opts->writeout_stage;
if ((opts->checkout_worktree && !opts->source_tree &&
!opts->merge && !opts->writeout_stage) ||
preserve_source_tree_history)
preserve_source_tree_history) {
clean_status_enable_external_history(the_repository);
clean_status_set_config_digest(the_repository,
&opts->clean_digest);
}
if (repo_read_index_preload(the_repository, &opts->pathspec, 0) < 0)
return error(_("index file corrupt"));

Expand Down Expand Up @@ -916,9 +918,11 @@ static int merge_working_tree(const struct checkout_opts *opts,
* proof only after it proves that the rebuilt index is identical.
*/
if (opts->discard_changes ||
(!opts->merge && !opts->new_orphan_branch))
(!opts->merge && !opts->new_orphan_branch)) {
clean_status_enable_external_history(the_repository);
clean_status_set_config_digest(the_repository,
&opts->clean_digest);
}
if (repo_read_index_preload(the_repository, NULL, 0) < 0) {
rollback_lock_file(&lock_file);
return error(_("index file corrupt"));
Expand Down
Loading
Loading