Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
338 commits
Select commit Hold shift + click to select a range
ba785e0
gvfs-helper: V2 robust retry and throttling
jeffhostetler Oct 10, 2019
b4a64db
trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache
jeffhostetler Jun 14, 2019
378799d
gvfs-helper: expose gvfs/objects GET and POST semantics
jeffhostetler Oct 21, 2019
6255d06
trace2:gvfs:experiment: read-cache: time read/write of cache-tree ext…
jeffhostetler Jul 9, 2019
1b9986e
gvfs-helper: dramatically reduce progress noise
derrickstolee Oct 24, 2019
0bc1d4e
trace2:gvfs:experiment: add region to apply_virtualfilesystem()
jeffhostetler Jul 16, 2019
83a5676
gvfs-helper: handle pack-file after single POST request
derrickstolee Nov 11, 2019
dc39334
trace2:gvfs:experiment: add region around unpack_trees()
jeffhostetler Jul 16, 2019
28e9b87
test-gvfs-prococol, t5799: tests for gvfs-helper
jeffhostetler Oct 25, 2019
1a5a2c1
gvfs-helper: add prefetch support
jeffhostetler Nov 11, 2019
bd87c7f
trace2:gvfs:experiment: add region to cache_tree_fully_valid()
jeffhostetler Jul 16, 2019
bd4c979
gvfs-helper: move result-list construction into install functions
jeffhostetler Nov 13, 2019
b85cab8
gvfs-helper: add prefetch .keep file for last packfile
jeffhostetler Nov 26, 2019
339699c
trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() …
jeffhostetler Jul 16, 2019
aa02b47
t5799: add support for POST to return either a loose object or packfile
jeffhostetler Nov 13, 2019
844d0ff
gvfs-helper: do one read in my_copy_fd_len_tail()
derrickstolee Dec 16, 2019
182493b
trace2:gvfs:experiment: increase default event depth for unpack-tree …
jeffhostetler Jul 25, 2019
76181f3
t5799: cleanup wc-l and grep-c lines
jeffhostetler Nov 13, 2019
4578b1c
gvfs-helper: move content-type warning for prefetch packs
derrickstolee Dec 16, 2019
ea97dfb
trace2:gvfs:experiment: add data for check_updates() in unpack_trees()
jeffhostetler Jul 25, 2019
c60075a
gvfs-helper: verify loose objects after write
derrickstolee Sep 18, 2020
ca11909
fetch: use gvfs-helper prefetch under config
derrickstolee Dec 17, 2019
123dbef
Trace2:gvfs:experiment: capture more 'tracking' details
jeffhostetler Jul 26, 2019
7391d25
t7599: create corrupt blob test
jeffhostetler Sep 18, 2020
b93a081
.github/actions/akv-secret: add action to get secrets
mjcheetham Apr 1, 2025
9770d18
release: create initial Windows installer build workflow
dscho Apr 29, 2026
cd9be54
help: special-case HOST_CPU `universal`
jeffhostetler Oct 17, 2023
f482141
release: add Mac OSX installer build
vdye Jul 16, 2021
c6ab58e
gvfs-helper: better support for concurrent packfile fetches
jeffhostetler Dec 18, 2019
c5f64af
release: build unsigned Ubuntu .deb package
vdye Jul 16, 2021
6db5036
remote-curl: do not call fetch-pack when using gvfs-helper
derrickstolee Feb 3, 2020
33c712a
t5799: explicitly test gvfs-helper --fallback and --no-fallback
jeffhostetler Jun 28, 2024
eed1d81
release: add signing step for .deb package
vdye Jul 16, 2021
71f3b4b
fetch: reprepare packs before checking connectivity
derrickstolee Mar 12, 2020
5ba16b6
gvfs-helper: add --max-retries to prefetch verb
jeffhostetler Apr 12, 2023
5b41025
gvfs-helper: don't fallback with new config
derrickstolee Jun 27, 2024
2a376be
release: create draft GitHub release with packages & installers
vdye Jul 16, 2021
b3949bb
dist: archive HEAD instead of HEAD^{tree}
vdye Dec 2, 2021
f61edee
gvfs-helper: retry when creating temp files
derrickstolee Dec 26, 2019
7753a55
t5799: add tests to detect corrupt pack/idx files in prefetch
jeffhostetler Apr 13, 2023
94843e2
test-gvfs-protocol: add cache_http_503 to mayhem
jeffhostetler Jun 28, 2024
06ad061
homebrew: add GitHub workflow to release Cask
mjcheetham Jul 24, 2020
29fa7f6
Disable the `monitor-components` workflow in msft-git
dscho May 13, 2022
21f99af
build-git-installers: publish gpg public key
ldennington Oct 24, 2023
877c259
release: include GIT_BUILT_FROM_COMMIT in MacOS build
vdye Dec 2, 2021
8c0e13c
sparse: avoid warnings about known cURL issues in gvfs-helper.c
derrickstolee Aug 3, 2021
2411a0c
gvfs-helper: ignore .idx files in prefetch multi-part responses
jeffhostetler Apr 13, 2023
73c6f11
t5799: add unit tests for new `gvfs.fallback` config setting
jeffhostetler Jun 28, 2024
3291b28
maintenance: care about gvfs.sharedCache config
derrickstolee Dec 15, 2020
9286910
unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags
neerajsi-msft2 Feb 6, 2021
d726e2d
Adding winget workflows
Apr 29, 2021
b415171
.github: enable windows builds on microsoft fork
derrickstolee Mar 8, 2023
c639034
release: continue pestering until user upgrades
derrickstolee Oct 6, 2021
b684c2f
release: add installer validation
ldennington Aug 17, 2022
8ed8789
git_config_set_multivar_in_file_gently(): add a lock timeout
dscho May 18, 2021
e2d29f5
scalar: set the config write-lock timeout to 150ms
dscho May 18, 2021
ae44b01
scalar: add docs from microsoft/scalar
derrickstolee Jun 16, 2021
0391e61
Merge branch 'scalar-gentler-config-locking'
dscho May 19, 2021
baf47f3
Merge branch 'scalar-extra-docs'
dscho Nov 16, 2021
4f9ed68
scalar (Windows): use forward slashes as directory separators
dscho May 10, 2022
6999ee3
scalar: implement a minimal JSON parser
dscho Apr 26, 2021
0b99ac3
scalar: add retry logic to run_git()
derrickstolee Jun 17, 2021
5c85e0c
update-microsoft-git: create barebones builtin
derrickstolee Apr 29, 2021
8ec3abe
.github: reinstate ISSUE_TEMPLATE.md for microsoft/git
derrickstolee Mar 16, 2022
85525a5
scalar clone: support GVFS-enabled remote repositories
dscho Aug 24, 2021
e2ebca0
scalar: support the `config` command for backwards compatibility
dscho May 27, 2021
b52020c
Merge branch 'microsoft/vfs-2.35.0'
dscho Oct 7, 2021
7dc851d
update-microsoft-git: Windows implementation
derrickstolee Apr 29, 2021
1ffbd35
.github: update PULL_REQUEST_TEMPLATE.md
derrickstolee Mar 16, 2022
dd60f05
test-gvfs-protocol: also serve smart protocol
dscho Apr 16, 2021
f35f2da
Merge branch 'scalar'
dscho Aug 24, 2021
c1f0e12
update-microsoft-git: use brew on macOS
derrickstolee Apr 29, 2021
bf85114
Adjust README.md for microsoft/git
May 4, 2021
b0f59cf
gvfs-helper: add the `endpoint` command
dscho Apr 26, 2021
1e55bae
dir_inside_of(): handle directory separators correctly
dscho May 14, 2021
e59b071
scalar: disable authentication in unattended mode
dscho May 6, 2021
74919f0
abspath: make strip_last_path_component() global
derrickstolee Oct 4, 2022
4cc6677
scalar: do initialize `gvfs.sharedCache`
dscho May 3, 2021
9fd3785
scalar diagnose: include shared cache info
dscho Jun 1, 2021
c08ec18
scalar: only try GVFS protocol on https:// URLs
dscho Apr 28, 2021
80c9b42
scalar: verify that we can use a GVFS-enabled repository
dscho Apr 16, 2021
39d5f03
scalar: add the `cache-server` command
dscho Apr 23, 2021
fd531ca
scalar: add a test toggle to skip accessing the vsts/info endpoint
dscho May 12, 2021
bf10877
scalar: adjust documentation to the microsoft/git fork
dscho Jan 25, 2022
eb608f8
scalar: enable untracked cache unconditionally
derrickstolee Jun 21, 2021
b682e21
scalar: parse `clone --no-fetch-commits-and-trees` for backwards comp…
dscho Aug 24, 2021
05c5b93
scalar: make GVFS Protocol a forced choice
derrickstolee May 1, 2024
f58358b
scalar: work around GVFS Protocol HTTP/2 failures
Copilot May 22, 2025
0ff7288
scalar diagnose: accommodate Scalar's Functional Tests
dscho May 9, 2022
67ccce0
gvfs-helper-client: clean up server process(es)
derrickstolee May 23, 2025
eb7910c
ci: run Scalar's Functional Tests
dscho Jun 8, 2021
ed8c37f
Merge branch 'scalar-with-gvfs'
dscho May 3, 2021
da9a24c
sparse-checkout: add config to disable deleting dirs
derrickstolee Aug 22, 2021
c39b7f4
scalar: upgrade to newest FSMonitor config setting
vdye Apr 5, 2022
fdfef56
Merge branch 'run-scalar-functional-tests'
dscho Nov 16, 2021
4bfd87e
add/rm: allow adding sparse entries when virtual
derrickstolee Jun 29, 2021
17c64c4
diff: ignore sparse paths in diffstat
derrickstolee Jul 26, 2021
b8b43e6
repo-settings: enable sparse index by default
derrickstolee Jun 15, 2021
2852c75
TO-UPSTREAM: sequencer: avoid progress when stderr is redirected
derrickstolee Sep 23, 2021
ec2301a
Merge branch 'scalar-reconfigure'
dscho Jun 1, 2021
87bf363
sparse-index: add ensure_full_index_with_reason()
derrickstolee Sep 30, 2024
109be76
treewide: add reasons for expanding index
derrickstolee Sep 30, 2024
7113071
Merge pull request #392: add: allow adding sparse entries when virtual
derrickstolee Jul 1, 2021
c6231b3
treewide: custom reasons for expanding index
derrickstolee Sep 30, 2024
15c334b
Merge pull request #410: Sparse Index: latest integrations
derrickstolee Aug 24, 2021
c86ddfd
sparse-index: add macro for unaudited expansions
derrickstolee Sep 30, 2024
eaffeaa
TO-CHECK: t1092: use quiet mode for rebase tests
derrickstolee Oct 31, 2021
a7ac866
Merge pull request #414: Make sparse index the default
derrickstolee Aug 26, 2021
dba43a8
Docs: update sparse index plan with logging
derrickstolee Sep 30, 2024
3843aaf
reset: fix mixed reset when using virtual filesystem
Mar 15, 2017
a636921
Merge pull request #432: sequencer: avoid progress when stderr is red…
derrickstolee Sep 23, 2021
198d4d5
sparse-index: log failure to clear skip-worktree
derrickstolee Sep 30, 2024
9b6a20a
diff(sparse-index): verify with partially-sparse
ldennington Sep 10, 2021
0e1f3b6
Merge pull request #494: reset: fix mixed reset when using virtual fi…
derrickstolee Apr 4, 2022
e094d14
stash: use -f in checkout-index child process
derrickstolee Sep 30, 2024
907b5ac
stash: expand testing for `git stash -u`
vdye Sep 22, 2021
b82993e
Merge pull request #419 from ldennington/sparse-index-diff
ldennington Sep 12, 2021
96c86f3
sparse-index: do not copy hashtables during expansion
derrickstolee Sep 27, 2024
c6cde31
Merge pull request #430 from vdye/sparse-index/clean
vdye Sep 23, 2021
172b172
Merge core VFS features
dscho Jun 11, 2018
72e7a4f
Merge advanced VFS-specific features
dscho Jun 11, 2018
3fd80cb
Permit `repack` command in Scalar clones (#732)
mjcheetham Mar 31, 2025
6a23324
Merge virtualfilesystem hook
dscho Jun 11, 2018
d95cdd8
Merge updates to serialized status
dscho Jun 11, 2018
b065a72
Merge trace2 experimental regions
jeffhostetler Apr 23, 2019
4b8bc42
Merge first wave of gvfs-helper feature
jeffhostetler Nov 14, 2019
28b31a9
Merge gvfs-helper prefetch feature
derrickstolee Dec 17, 2019
6a6c150
Harden gvfs-helper to validate the packfiles in a multipart prefetch …
jeffhostetler Apr 17, 2023
3fcfede
gvfs-helper: add gvfs.fallback and unit tests (#665)
dscho Jul 1, 2024
e4ddd43
Fix rare segfault in sparse-index (#690)
dscho Oct 9, 2024
e83cd1e
Merge pull request #301: Update 'git maintenance' to match upstream
derrickstolee Dec 15, 2020
2455e0d
Merge pull request #315: unpack-trees:virtualfilesystem: Improve effi…
derrickstolee Feb 16, 2021
185c7d7
Merge branch 'add-workflows'
derrickstolee Apr 30, 2021
100a5ad
Merge branch 'adjust-g4w-workflows'
dscho May 13, 2022
70cbff3
Merge pull request #399 from vdye/feature/build-installers
vdye Jul 29, 2021
0be4036
Merge pull request #472 from vdye/ms/macos-build-options
vdye Dec 6, 2021
d0fc01c
Merge pull request #329: Add `git update-microsoft-git`
derrickstolee Apr 30, 2021
62bc1a1
TO-UPSTREAM: sub-process: avoid leaking `cmd`
dscho Dec 18, 2024
082e3d5
Merge pull request #333: update microsoft/git README
derrickstolee May 17, 2021
def8d98
remote-curl: release filter options before re-setting them
dscho Dec 18, 2024
21ae3f6
Merge pull request #371 from dscho/run-scalar-functional-tests-and-fi…
dscho Jun 9, 2021
adb8435
transport: release object filter options
dscho Dec 18, 2024
0d31bd0
Merge branch 'sparse-index-stuff'
dscho Jun 17, 2022
9358e69
push: don't reuse deltas with path walk
derrickstolee Nov 16, 2024
25a4243
Merge branch 'leak-fixes'
dscho Dec 18, 2024
555bd17
pack-objects: don't reuse deltas with path walk (#707)
dscho Dec 19, 2024
7967ebe
revision: defensive programming
dscho Dec 16, 2022
94e7655
get_parent(): defensive programming
dscho Dec 16, 2022
9986e1e
fetch-pack: defensive programming
dscho Dec 16, 2022
14059ce
hooks: add custom post-command hook config
derrickstolee Mar 25, 2025
f349811
unparse_commit(): defensive programming
dscho Dec 16, 2022
3cfba9d
cat_one_file(): make it easy to see that the `size` variable is initi…
dscho Oct 27, 2022
227cd14
TO-UPSTREAM: Docs: fix asciidoc failures from short delimiters
derrickstolee Mar 25, 2025
cb7e6f1
t7900-maintenance.sh: reset config between tests
mjcheetham Jan 22, 2025
4612c00
verify_commit_graph(): defensive programming
dscho Dec 16, 2022
97649e6
fsck: avoid using an uninitialized variable
dscho Dec 16, 2022
c138e50
hooks: make hook logic memory-leak free
derrickstolee Mar 25, 2025
9bd6087
maintenance: add cache-local-objects maintenance task
mjcheetham Jan 14, 2025
51e4d1f
stash: defensive programming
dscho Dec 16, 2022
15f7344
load_revindex_from_disk(): avoid accessing uninitialized data
dscho Dec 16, 2022
1b82c45
t0401: test post-command for alias, version, typo
derrickstolee Nov 7, 2025
9d8ee0d
scalar.c: add cache-local-objects task
mjcheetham Jan 23, 2025
51a0a7c
stash: defensive programming
dscho Dec 16, 2022
f408262
load_pack_mtimes_file(): avoid accessing uninitialized data
dscho Dec 16, 2022
96e3705
hooks: better handle config without gitdir
derrickstolee Nov 7, 2025
bab0c90
maintenance: add new `cache-local-objects` maintenance task (#720)
mjcheetham Jan 31, 2025
9f6dc57
codeql: run static analysis as part of CI builds
dscho Aug 9, 2022
15fd055
codeql: publish the sarif file as build artifact
dscho Mar 22, 2023
a979c02
codeql: disable a couple of non-critical queries for now
dscho Mar 21, 2025
ccc9944
date: help CodeQL understand that there are no leap-year issues here
dscho Jul 23, 2025
c01f6ef
help: help CodeQL understand that consuming envvars is okay here
dscho Jul 23, 2025
0890646
push: defensive programming
dscho Dec 16, 2022
6d260e0
ctype: help CodeQL understand that `sane_istest()` does not access ar…
dscho Jul 23, 2025
4b6132d
test-tool repository: check return value of `lookup_commit()`
dscho Dec 16, 2022
9c01f1c
fetch: defensive programming
dscho Dec 16, 2022
0d66048
ctype: accommodate for CodeQL misinterpreting the `z` in `mallocz()`
dscho Jul 23, 2025
31a19db
shallow: handle missing shallow commits gracefully
dscho Dec 16, 2022
cea32c6
inherit_tracking(): defensive programming
dscho Dec 16, 2022
0ba55ed
Merge branch 'uninitialized-variables'
dscho Oct 27, 2022
f0b96c2
strbuf_read: help with CodeQL misunderstanding that `strbuf_read()` d…
dscho Jul 23, 2025
0d1d6b1
commit-graph: suppress warning about using a stale stack addresses
dscho Dec 17, 2022
d6c15f8
Merge branch 'defensive-programming'
dscho Mar 21, 2025
58638ae
codeql: also check JavaScript code
dscho Jul 24, 2025
f7970ad
Merge branch 'codeql-fixes'
dscho Mar 21, 2025
fe60229
Merge branch 'codeql'
dscho Mar 21, 2025
a94bd7f
hooks: add custom post-command hook config (#736)
dscho Apr 7, 2025
8dee44f
t5799: update cache-server methods for multiple instances
derrickstolee Jan 17, 2026
8ea2da9
gvfs-helper: override cache server for prefetch
derrickstolee Jan 5, 2026
fd7b4a5
gvfs-helper: override cache server for get
derrickstolee Jan 5, 2026
c8a7c94
gvfs-helper: override cache server for post
derrickstolee Jan 5, 2026
d135230
gvfs-helper: skip collision check for loose objects
derrickstolee Jan 8, 2026
612ce83
scalar: add run_git_argv
mjcheetham Dec 17, 2025
3ec76cb
t5799: add test for all verb-specific cache-servers together
derrickstolee Jan 17, 2026
5b27e1d
gvfs-helper: emit advice on transient errors
derrickstolee Jan 8, 2026
c3d2ea2
scalar: add --ref-format option to scalar clone
mjcheetham Dec 17, 2025
53b5021
Merge branch 'codeql'
dscho Mar 21, 2025
da76a65
lib-gvfs-helper: create helper script for protocol tests
derrickstolee Jan 18, 2026
ddb3692
gvfs-helper: avoid collision check for packfiles
derrickstolee Jan 8, 2026
a4bb6da
Add `--ref-format` option to scalar clone (port to `vfs-2.52.0`) (#832)
dscho Jan 8, 2026
aef034f
t579*: split t5799 into several parts
derrickstolee Jan 18, 2026
9b03662
gvfs-helper: prevent and/or give advice on repeated downloads to shar…
dscho Jan 9, 2026
425dc84
scalar: add --<verb>-cache-server-url options
derrickstolee Jan 23, 2026
b7a6a6c
Restore previous errno after post command hook
tyrielv Feb 10, 2026
5031c65
gvfs-helper: add config to incrementally replace cache servers (#836)
derrickstolee Jan 22, 2026
a5efecf
t9210: differentiate origin and cache servers
derrickstolee Jan 28, 2026
9af8340
Restore previous errno after post command hook (#860)
dscho Feb 10, 2026
51bde98
unpack-trees: skip lstats for deleted VFS entries in checkout
Mar 6, 2026
4d159b3
scalar: add --<verb>-cache-server-url options (#849)
dscho Feb 11, 2026
01a2901
worktree: conditionally allow worktree on VFS-enabled repos
Mar 26, 2026
65e99da
unpack-trees: skip lstats for deleted VFS entries in checkout (#865)
dscho Mar 26, 2026
0f8f165
gvfs-helper: send X-Session-Id headers
derrickstolee Mar 24, 2026
57ba578
gvfs-helper: create shared object cache if missing
derrickstolee Feb 12, 2026
fc00d74
worktree: conditionally allow worktree on VFS-enabled repos (#868)
mjcheetham Mar 27, 2026
25ea558
gvfs: add gvfs.sessionKey config
derrickstolee Mar 24, 2026
c4f4a80
gvfs-helper: create shared object cache if missing (#861)
mjcheetham Mar 27, 2026
343fd83
gvfs: clear DIE_IF_CORRUPT in streaming incore fallback
tyrielv Mar 27, 2026
d69f5e7
gvfs-helper: emit X-Session-Id headers for requests (#862)
mjcheetham Mar 27, 2026
3123c94
workflow: add release-vfsforgit to automate VFS for Git updates
mjcheetham Mar 27, 2026
f4422e9
gvfs: clear DIE_IF_CORRUPT in streaming incore fallback (#873)
dscho Mar 28, 2026
05684e5
worktree remove: use GVFS_SUPPORTS_WORKTREES for skip-clean-check gate
tyrielv Mar 30, 2026
c5e3e88
workflow: add release-vfsforgit to automate VFS for Git updates (#871)
mjcheetham Mar 31, 2026
5e4f930
ci: add new VFS for Git functional tests workflow
mjcheetham Mar 30, 2026
ddfb91f
worktree remove: use gvfs_config_is_set for skip-clean-check gate (#875)
mjcheetham Apr 2, 2026
34345cb
azure-pipelines: add stub release pipeline for Azure
mjcheetham Apr 17, 2026
029c3ac
Add VFS for Git functional tests workflow (#874)
mjcheetham Apr 2, 2026
8975897
diff: add renameThreshold configuration option
tyrielv Apr 8, 2026
1da3fc6
azure-pipelines: add stub release pipeline for Azure (#886)
mjcheetham Apr 17, 2026
7e7749d
azure-pipelines: add ESRP code signing
mjcheetham Apr 30, 2026
a5bccda
azure-pipelines: allow overriding Git version
mjcheetham May 15, 2026
0eceaf5
azure-pipelines: build, sign and stage the Linux Debian package
dscho Apr 30, 2026
ab59b20
azure-pipelines: build, sign, notarize and stage the macOS installer
dscho Apr 30, 2026
08acd11
azure-pipelines: build, sign and stage the Windows installer
mjcheetham May 1, 2026
7fa9ab3
azure-pipelines: enable on tag push, default ESRP and GitHub release on
dscho May 8, 2026
6789ad3
gvfs-helper: separate packfile extraction from indexing
derrickstolee Apr 7, 2026
f9b7087
blame: add blame.renames, blame.renameThreshold, blame.renameLimit
Apr 20, 2026
1b141e4
release: binskim for Windows
mjcheetham May 21, 2026
8c56651
gvfs-helper: run prefetch index-pack in parallel
derrickstolee Apr 7, 2026
cee21c8
blame: add blame.rename* configuration (#894)
dscho Apr 22, 2026
646b487
diff: add renameThreshold configuration option (#878)
dscho Apr 20, 2026
d377a87
release: suppress unfixable binskim findings
mjcheetham May 28, 2026
a7b145a
gvfs-helper: add gvfs.prefetchThreads config for parallel prefetch
derrickstolee Apr 21, 2026
081f236
Synchronize `vfs-2.54.0` with `vfs-2.53.0` (`git blame` changes) (#896)
dscho Apr 27, 2026
c18e915
binskim: add baseline
microsoft-github-policy-service[bot] May 29, 2026
243f472
scalar: Install prefetch packfiles in parallel (#876)
dscho Apr 28, 2026
ec0f443
checkout: preserve skip-worktree for virtual filesystem paths
tyrielv May 14, 2026
b97ce59
azure-pipelines: migrate installer release pipeline from GitHub Actio…
dscho May 19, 2026
46a0e53
checkout: preserve skip-worktree for virtual filesystem paths (forwar…
dscho May 27, 2026
f06b2f7
rust: pick a GCC-compatible Cargo target under MSYS2/MinGW
dscho Jun 11, 2026
de58de1
ci(vfs): install the GCC-compatible Rust target before building
dscho Jun 11, 2026
58d51d8
DEBUG
dscho Jun 16, 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
106 changes: 106 additions & 0 deletions .azure-pipelines/esrp/sign.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Reusable step template for ESRP code signing via EsrpCodeSigning@6.
#
# For macOS, ESRP requires files to be submitted as a zip archive.
# Set 'useArchive: true' to automatically handle the
# copy → zip → sign → extract cycle. For Windows/Linux where ESRP
# can sign files directly in a folder, leave it as false (default).
#
parameters:
- name: displayName
type: string
- name: folderPath
type: string
- name: pattern
type: string
- name: inlineOperation
type: string
# When true, matching files are copied to a staging dir, zipped,
# signed, and extracted back to folderPath.
- name: useArchive
type: boolean
default: false
# ESRP connection parameters (defaults use pipeline variables)
- name: connectedServiceName
type: string
default: $(esrpAppConnectionName)
- name: appRegistrationClientId
type: string
default: $(esrpClientId)
- name: appRegistrationTenantId
type: string
default: $(esrpTenantId)
- name: authAkvName
type: string
default: $(esrpKeyVaultName)
- name: authSignCertName
type: string
default: $(esrpSignReqCertName)
- name: serviceEndpointUrl
type: string
default: $(esrpEndpointUrl)

steps:
- ${{ if eq(parameters.useArchive, true) }}:
- task: DeleteFiles@1
displayName: 'Clean staging dir for ${{ parameters.displayName }}'
inputs:
SourceFolder: '$(Agent.TempDirectory)/esrp-staging'
Contents: '*'
RemoveSourceFolder: true
- task: CopyFiles@2
displayName: 'Collect files for ${{ parameters.displayName }}'
inputs:
SourceFolder: '${{ parameters.folderPath }}'
Contents: '${{ parameters.pattern }}'
TargetFolder: '$(Agent.TempDirectory)/esrp-staging/contents'
- task: ArchiveFiles@2
displayName: 'Archive files for ${{ parameters.displayName }}'
inputs:
rootFolderOrFile: '$(Agent.TempDirectory)/esrp-staging/contents'
includeRootFolder: false
archiveType: zip
archiveFile: '$(Agent.TempDirectory)/esrp-staging/archive.zip'
- task: EsrpCodeSigning@6
displayName: '${{ parameters.displayName }}'
inputs:
connectedServiceName: '${{ parameters.connectedServiceName }}'
useMSIAuthentication: true
appRegistrationClientId: '${{ parameters.appRegistrationClientId }}'
appRegistrationTenantId: '${{ parameters.appRegistrationTenantId }}'
authAkvName: '${{ parameters.authAkvName }}'
authSignCertName: '${{ parameters.authSignCertName }}'
serviceEndpointUrl: '${{ parameters.serviceEndpointUrl }}'
folderPath: '$(Agent.TempDirectory)/esrp-staging'
pattern: 'archive.zip'
useMinimatch: true
signConfigType: inlineSignParams
inlineOperation: ${{ parameters.inlineOperation }}
- task: ExtractFiles@1
displayName: 'Extract signed files for ${{ parameters.displayName }}'
inputs:
archiveFilePatterns: '$(Agent.TempDirectory)/esrp-staging/archive.zip'
destinationFolder: '${{ parameters.folderPath }}'
overwriteExistingFiles: true
- task: DeleteFiles@1
displayName: 'Clean up staging dir for ${{ parameters.displayName }}'
condition: always()
inputs:
SourceFolder: '$(Agent.TempDirectory)/esrp-staging'
Contents: '*'
RemoveSourceFolder: true
- ${{ else }}:
- task: EsrpCodeSigning@6
displayName: '${{ parameters.displayName }}'
inputs:
connectedServiceName: '${{ parameters.connectedServiceName }}'
useMSIAuthentication: true
appRegistrationClientId: '${{ parameters.appRegistrationClientId }}'
appRegistrationTenantId: '${{ parameters.appRegistrationTenantId }}'
authAkvName: '${{ parameters.authAkvName }}'
authSignCertName: '${{ parameters.authSignCertName }}'
serviceEndpointUrl: '${{ parameters.serviceEndpointUrl }}'
folderPath: '${{ parameters.folderPath }}'
pattern: '${{ parameters.pattern }}'
useMinimatch: true
signConfigType: inlineSignParams
inlineOperation: ${{ parameters.inlineOperation }}
173 changes: 173 additions & 0 deletions .azure-pipelines/esrp/windows/esrpsign.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
#!/bin/bash
#
# Sign Windows files using the ESRP client (Authenticode).
# Usage: esrpsign.sh <file1> [file2 ...]
#
# Required environment variables:
# ESRP_TOOL - Path to ESRPClient.exe
# ESRP_AUTH - Path to the ESRP auth JSON file
# SYSTEM_ACCESSTOKEN - ADO system access token (OAuth bearer)
#
# Optional environment variables:
# ESRP_KEYCODE - Signing key code (default: CP-231522)
#
# The script generates the auth and input JSON files and sets the
# following ESRP client environment variables automatically:
# ESRP_AUTH_CONFIG - Path to the auth JSON file
# ESRP_POLICY_CONFIG - Path to the policy JSON file
# ESRP_SESSION_CONFIG - Not set; ESRP client defaults are used
#
set -euo pipefail

if [ $# -lt 1 ]; then
echo "usage: esrpsign.sh <file> [file ...]" >&2
exit 1
fi

if [ -z "${ESRP_TOOL:-}" ]; then
echo "error: ESRP_TOOL environment variable must be set" >&2
exit 1
fi
if [ -z "${ESRP_AUTH:-}" ]; then
echo "error: ESRP_AUTH environment variable must be set" >&2
exit 1
fi
if [ -z "${SYSTEM_ACCESSTOKEN:-}" ]; then
echo "error: SYSTEM_ACCESSTOKEN environment variable must be set" >&2
exit 1
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
. "$SCRIPT_DIR/../../scripts/windows/utils.sh"

# Check for overriden key code, otherwise use default (Microsoft Third-Party/OSS)
ESRP_KEYCODE="${ESRP_KEYCODE:-CP-231522}"

# Create work dir and resolve its Windows path by cd-ing into it.
WORK_DIR="$(mktemp -d)"
WORK_DIR_WIN="$(cd "$WORK_DIR" && pwd -W | sed 's|/|\\|g')"

echo "==> ESRP signing tool: $ESRP_TOOL"
echo "==> Working directory: $WORK_DIR"

if [ ! -f "$ESRP_TOOL" ]; then
echo "error: ESRPClient.exe not found at $ESRP_TOOL" >&2
exit 1
fi

# Build the SignRequestFiles JSON array
echo "==> Preparing files for signing ($# file(s))..."
files_json=""
for file in "$@"; do
if [ ! -f "$file" ]; then
echo "error: file not found: $file" >&2
exit 1
fi

abs_path="$(cd "$(dirname "$file")" && pwd)/$(basename "$file")"
win_path="$(to_windows_path "$abs_path")"
# Escape backslashes for JSON
win_path_escaped="${win_path//\\/\\\\}"
echo " - $win_path"

if [ -n "$files_json" ]; then
files_json+=","
fi
files_json+="
{
\"SourceLocation\": \"$win_path_escaped\",
\"DestinationLocation\": \"$win_path_escaped\"
}"
done

# Generate the input JSON
input_json="$WORK_DIR/input.json"
output_json="$WORK_DIR/output.json"

echo "==> Generating input JSON: $input_json"
cat > "$input_json" <<-EOF
{
"Version": "1.0.0",
"SignBatches": [
{
"SourceLocationType": "UNC",
"DestinationLocationType": "UNC",
"SignRequestFiles": [$files_json
],
"SigningInfo": {
"Operations": [
{
"KeyCode": "$ESRP_KEYCODE",
"OperationCode": "SigntoolSign",
"ToolName": "sign",
"ToolVersion": "1.0",
"Parameters": {
"OpusName": "Microsoft",
"OpusInfo": "https://www.microsoft.com",
"FileDigest": "/fd SHA256",
"PageHash": "/NPH",
"TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
}
},
{
"KeyCode": "$ESRP_KEYCODE",
"OperationCode": "SigntoolVerify",
"ToolName": "sign",
"ToolVersion": "1.0",
"Parameters": {}
}
]
}
}
]
}
EOF

# Generate policy JSON
echo "==> Generating policy JSON..."
policy_json="$WORK_DIR/policy.json"
cat > "$policy_json" <<-EOF
{
"Version": "1.0.0",
"Intent": "ProductRelease",
"ContentType": "Binaries",
"ContentOrigin": "1stParty",
"ProductState": "Current",
"Audience": "ExternalBroad"
}
EOF

# Use auth JSON from ESRP_AUTH
export ESRP_AUTH_CONFIG="$(to_windows_path "$ESRP_AUTH")"
export ESRP_POLICY_CONFIG="$WORK_DIR_WIN\\policy.json"

# The ADO system access token is referenced in the auth JSON via the environment
# variable - export this so the ESRP client can pick it up when it runs.
export SYSTEM_ACCESSTOKEN

# Print generated JSON files for debugging
echo "==> Auth JSON:"
cat "$ESRP_AUTH"
echo ""
echo "==> Policy JSON:"
cat "$policy_json"
echo ""
echo "==> Input JSON:"
cat "$input_json"
echo ""

# Sign the files
esrp_tool_win="$(to_windows_path "$ESRP_TOOL")"
input_json_win="$WORK_DIR_WIN\\input.json"
output_json_win="$WORK_DIR_WIN\\output.json"

echo "==> ESRP_AUTH_CONFIG=$ESRP_AUTH_CONFIG"
echo "==> ESRP_POLICY_CONFIG=$ESRP_POLICY_CONFIG"
echo "==> Running: $esrp_tool_win sign -i $input_json_win -o $output_json_win"
"$esrp_tool_win" sign \
-i "$input_json_win" \
-o "$output_json_win"

echo "==> Signing complete."
echo "==> Output JSON:"
cat "$output_json"
69 changes: 69 additions & 0 deletions .azure-pipelines/esrp/windows/setup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
parameters:
- name: serviceConnectionName
type: string
- name: esrpClientId
type: string
- name: keyVaultName
type: string
- name: signCertName
type: string

steps:
- task: EsrpClientTool@5
name: esrpinstall
displayName: 'Install ESRP client'
- task: AzureCLI@2
displayName: 'Set up ESRP environment'
inputs:
azureSubscription: ${{ parameters.serviceConnectionName }}
addSpnToEnvironment: true
scriptType: ps
scriptLocation: inlineScript
inlineScript: |
# Resolve ESRP client tool path (passed via env to avoid PS subexpression issues)
$esrpTool = "$env:ESRPCLIENT_TOOLPATH\$env:ESRPCLIENT_TOOLNAME"
if (-not (Test-Path $esrpTool)) { Write-Error "ESRPClient.exe not found at $esrpTool"; exit 1 }
Write-Host "Found ESRP client: $esrpTool"
Write-Host "##vso[task.setvariable variable=ESRP_TOOL]$esrpTool"

# Derive the service connection GUID from the ENDPOINT_URL_* env vars
# that the agent emits for the bound connection. Filter out the
# built-in SystemVssConnection which is always present.
$scId = (Get-ChildItem env:ENDPOINT_URL_*).Name `
-replace '^ENDPOINT_URL_','' |
Where-Object { $_ -ne 'SYSTEMVSSCONNECTION' }
if (-not $scId) { Write-Error "Could not derive service connection GUID"; exit 1 }
Write-Host "Resolved service connection GUID: $scId"

# servicePrincipalId and tenantId are provided by addSpnToEnvironment
$authJson = @{
Version = "1.0.0"
AuthenticationType = "AAD_MSI_WIF"
EsrpClientId = "${{ parameters.esrpClientId }}"
ClientId = $env:servicePrincipalId
TenantId = $env:tenantId
AADAuthorityBaseUri = "https://login.microsoftonline.com/"
FederatedTokenData = @{
JobId = "$(System.JobId)"
PlanId = "$(System.PlanId)"
ProjectId = "$(System.TeamProjectId)"
Hub = "$(System.HostType)"
Uri = "$(System.CollectionUri)"
ServiceConnectionId = $scId
SystemAccessToken = "SYSTEM_ACCESSTOKEN"
}
RequestSigningCert = @{
GetCertFromKeyVault = $true
KeyVaultName = "${{ parameters.keyVaultName }}"
KeyVaultCertName = "${{ parameters.signCertName }}"
}
} | ConvertTo-Json -Depth 4

$authPath = "$(Agent.TempDirectory)\esrp-auth.json"
$authJson | Set-Content -Path $authPath -Encoding UTF8
Write-Host "Generated ESRP auth JSON: $authPath"
Write-Host "##vso[task.setvariable variable=ESRP_AUTH]$authPath"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
ESRPCLIENT_TOOLPATH: $(esrpinstall.esrpclient.toolpath)
ESRPCLIENT_TOOLNAME: $(esrpinstall.esrpclient.toolname)
1 change: 1 addition & 0 deletions .azure-pipelines/patches/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.patch whitespace=-trailing-space,-blank-at-eof
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/installer/install.iss b/installer/install.iss
index 70787b7..137f660 100644
--- a/installer/install.iss
+++ b/installer/install.iss
@@ -65,7 +65,7 @@ SignTool=signtool
; Installer-related
AllowNoIcons=yes
AppName={#APP_NAME}
-AppPublisher=The Git Development Community
+AppPublisher=The Git Client Team at Microsoft
AppPublisherURL={#APP_URL}
AppSupportURL={#APP_CONTACT_URL}
AppVersion={#APP_VERSION}
Loading
Loading