Skip to content

[pull] master from microsoft:master#63

Merged
pull[bot] merged 10 commits intocgallred:masterfrom
microsoft:master
Mar 9, 2026
Merged

[pull] master from microsoft:master#63
pull[bot] merged 10 commits intocgallred:masterfrom
microsoft:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 9, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

tyrielv and others added 10 commits January 30, 2026 10:29
Replace the heavyweight SafeDirectoryOwnershipTests functional test
(which required elevation, P/Invoke for SeRestorePrivilege, directory
ownership changes, and global git config manipulation) with two layers
of lightweight unit tests:

Layer 1: NormalizePathForSafeDirectoryComparison - pure string tests
covering backslash/forward-slash conversion, case normalization,
trailing slash trimming, and null/empty safety.

Layer 2: Constructor control-flow tests using a mock subclass that
overrides the native calls (InitNative, TryOpenRepo, GetLastNativeError,
GetSafeDirectoryConfigEntries) to verify the safe.directory case-
sensitivity workaround logic without touching libgit2 or real config.

To support testability, extract virtual methods from LibGit2Repo for
native interactions and make CheckSafeDirectoryConfigForCaseSensitivity-
Issue protected. The NormalizePath helper is renamed to
NormalizePathForSafeDirectoryComparison and scoped as internal.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move authentication, server config query, version validation, cache
health checks, git config settings, and enlistment logging from the
mount verb (gvfs.exe) into the mount process (gvfs.mount.exe). This
eliminates duplicate work (auth and index parsing were done in both
processes) and reduces mount time from ~40s to ~22s.

The verb now only does: disk layout upgrade check, ProjFS attach,
enum arg validation, mount exe existence check, launch + wait.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Start auth + config query immediately on entry to Mount(), before repo
metadata loading. This overlaps network latency with all local I/O:
metadata, git version/hooks/filesystem checks, and git config writes.

The network task (auth + config) and local task (validations + git config)
run concurrently via Task.WhenAll. RepoMetadata loading runs on the main
thread between task launch and local task start, overlapping with the
initial anonymous auth probe.

Measured improvement on os.2020 (2.4M index entries):
  Production:  ~29s wall clock
  Sequential:  ~22s (prior commit moved work to mount.exe)
  Parallel:    ~19s (this commit)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add TryInitializeAndQueryGVFSConfig to GitAuthentication that merges
the anonymous probe, credential fetch, and config query into a single
flow, making at most 2 HTTP requests (or 1 for anonymous repos) and
reusing the same TCP/TLS connection.

Refactor TryInitialize to delegate to the combined method, eliminating
the duplicated TryAnonymousQuery logic. Add TryAuthenticateAndQueryGVFSConfig
to GVFSVerb and update CloneVerb, PrefetchVerb, and CacheServerVerb to
use it, replacing the two-step TryAuthenticate + QueryGVFSConfig pattern
with a single call. Remove the now-unused QueryGVFSConfigWithFallbackCacheServer.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Change the default 'gvfs dehydrate' behavior from full-enlistment
dehydration (unmount, backup entire src, recreate virtualization root)
to per-folder dehydration of all root-level folders. This is faster
and does not require a full unmount/remount cycle.

The previous full-enlistment behavior is preserved via the new --full
flag for cases where a complete reset is needed.

Changes:
- Add --full option for legacy full-enlistment dehydrate
- When neither --folders nor --full is specified, enumerate all
  root-level directories from HEAD via 'git ls-tree' and dehydrate
  them individually
- Using the git tree (not filesystem) ensures deleted folders are
  restored by the dehydrate
- Reject combining --full with --folders
- Update confirmation messages to reflect new defaults
- Update functional tests: existing full-dehydrate tests now pass
  --full, add new FullDehydrate* tests, default-path test exercises
  the new all-root-folders behavior

Performance (2.8M file repo, 1000 dirs hydrated, ~5,600 files):
  Root-folders (default): 13.0s
  Full (--full):          51.1s

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
dehydrate: default to per-folder dehydration, add --full flag
Improve mount performance by moving validation to mount process and parallelizing I/O
…sitive

Workaround libgit2 safe.directory case mismatch bug
@pull pull Bot locked and limited conversation to collaborators Mar 9, 2026
@pull pull Bot added the ⤵️ pull label Mar 9, 2026
@pull pull Bot merged commit 4b3bc38 into cgallred:master Mar 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant