Commit Graph

79617 Commits (1970fcef93adcc5a35f6468d00a5a634d5af2b3c)

Author SHA1 Message Date
Patrick Steinhardt 1970fcef93 wrapper: introduce writev(3p) wrappers
In the preceding commit we have added a compatibility wrapper for the
writev(3p) syscall. Introduce some generic wrappers for this function
that we nowadays take for granted in the Git codebase.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:14 -07:00
Patrick Steinhardt 3b9b2c2a29 compat/posix: introduce writev(3p) wrapper
In a subsequent commit we're going to add the first caller to
writev(3p). Introduce a compatibility wrapper for this syscall that we
can use on systems that don't have this syscall.

The syscall exists on modern Unixes like Linux and macOS, and seemingly
even for NonStop according to [1]. It doesn't seem to exist on Windows
though.

[1]: http://nonstoptools.com/manuals/OSS-SystemCalls.pdf
[2]: https://www.gnu.org/software/gnulib/manual/html_node/writev.html

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:14 -07:00
Patrick Steinhardt a5816e4596 upload-pack: reduce lock contention when writing packfile data
In our production systems we have recently observed write contention in
git-upload-pack(1). The system in question was consistently streaming
packfiles at a rate of dozens of gigabits per second, but curiously the
system was neither bottlenecked on CPU, memory or IOPS.

We eventually discovered that Git was spending 80% of its time in
`pipe_write()`, out of which almost all of the time was spent in the
`ep_poll_callback` function in the kernel. Quoting the reporter:

  This infrastructure is part of an event notification queue designed to
  allow for multiple producers to emit events, but that concurrency
  safety is guarded by 3 layers of locking. The layer we're hitting
  contention in uses a simple reader/writer lock mode (a.k.a. shared
  versus exclusive mode), where producers need shared-mode (read mode),
  and various other actions use exclusive (write) mode.

The system in question generates workloads where we have hundreds of
git-upload-pack(1) processes active at the same point in time. These
processes end up contending around those locks, and the consequence is
that the Git processes stall.

Now git-upload-pack(1) already has the infrastructure in place to buffer
some of the data it reads from git-pack-objects(1) before actually
sending it out. We only use this infrastructure in very limited ways
though, so we generally end up matching one read(3p) call with one
write(3p) call. Even worse, when the sideband is enabled we end up
matching one read with _two_ writes: one for the pkt-line length, and
one for the packfile data.

Extend our use of the buffering infrastructure so that we soak up bytes
until the buffer is filled up at least 2/3rds of its capacity. The
change is relatively simple to implement as we already know to flush the
buffer in `create_pack_file()` after git-pack-objects(1) has finished.

This significantly reduces the number of write(3p) syscalls we need to
do. Before this change, cloning the Linux repository resulted in around
400,000 write(3p) syscalls. With the buffering in place we only do
around 130,000 syscalls.

Now we could of course go even further and make sure that we always fill
up the whole buffer. But this might cause an increase in read(3p)
syscalls, and some tests show that this only reduces the number of
write(3p) syscalls from 130,000 to 100,000. So overall this doesn't seem
worth it.

Note that the issue could also be fixed by adapting the write buffer
that we use in the downstream git-pack-objects(1) command, and such a
change would have roughly the same result. But the command that
generates the packfile data may not always be git-pack-objects(1) as it
can be changed via "uploadpack.packObjectsHook", so such a fix would
only help in _some_ cases. Regardless of that, we'll also adapt the
write buffer size of git-pack-objects(1) in a subsequent commit.

Helped-by: Matt Smiley <msmiley@gitlab.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:14 -07:00
Patrick Steinhardt c422ec886c upload-pack: prefer flushing data over sending keepalive
When using the sideband in git-upload-pack(1) we know to send out
keepalive packets in case generating the pack takes too long. These
keepalives take the form of a simple empty pktline.

In the preceding commit we have adapted git-upload-pack(1) to buffer
data more aggressively before sending it to the client. This creates an
obvious optimization opportunity: when we hit the keepalive timeout
while we still hold on to some buffered data, then it makes more sense
to flush out the data instead of sending the empty keepalive packet.

This is overall not going to be a significant win. Most keepalives will
come before the pack data starts, and once pack-objects starts producing
data, it tends to do so pretty consistently. And of course we can't send
data before we see the PACK header, because the whole point is to buffer
the early bit waiting for packfile URIs. But the optimization is easy
enough to realize.

Do so and flush out data instead of sending an empty pktline.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:13 -07:00
Patrick Steinhardt 5d4b7ddce1 upload-pack: adapt keepalives based on buffering
The function `create_pack_file()` is responsible for sending the
packfile data to the client of git-upload-pack(1). As generating the
bytes may take significant computing resources we also have a mechanism
in place that optionally sends keepalive pktlines in case we haven't
sent out any data.

The keepalive logic is purely based poll(3p): we pass a timeout to that
syscall, and if the call times out we send out the keepalive pktline.
While reasonable, this logic isn't entirely sufficient: even if the call
to poll(3p) ends because we have received data on any of the file
descriptors we may not necessarily send data to the client.

The most important edge case here happens in `relay_pack_data()`. When
we haven't seen the initial "PACK" signature from git-pack-objects(1)
yet we buffer incoming data. So in the worst case, if each of the bytes
of that signature arrive shortly before the configured keepalive
timeout, then we may not send out any data for a time period that is
(almost) four times as long as the configured timeout.

This edge case is rather unlikely to matter in practice. But in a
subsequent commit we're going to adapt our buffering mechanism to become
more aggressive, which makes it more likely that we don't send any data
for an extended amount of time.

Adapt the logic so that instead of using a fixed timeout on every call
to poll(3p), we instead figure out how much time has passed since the
last-sent data.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:13 -07:00
Patrick Steinhardt 9f4cdf5901 upload-pack: fix debug statement when flushing packfile data
When git-upload-pack(1) writes packfile data to the client we have some
logic in place that buffers some partial lines. When that buffer still
contains data after git-pack-objects(1) has finished we flush the buffer
so that all remaining bytes are sent out.

Curiously, when we do so we also print the string "flushed." to stderr.
This statement has been introduced in b1c71b7281 (upload-pack: avoid
sending an incomplete pack upon failure, 2006-06-20), so quite a while
ago. What's interesting though is that stderr is typically spliced
through to the client-side, and consequently the client would see this
message. Munging the way how we do the caching indeed confirms this:

  $ git clone file:///home/pks/Development/linux/
  Cloning into bare repository 'linux.git'...
  remote: Enumerating objects: 12980346, done.
  remote: Counting objects: 100% (131820/131820), done.
  remote: Compressing objects: 100% (50290/50290), done.
  remote: Total 12980346 (delta 96319), reused 104500 (delta 81217), pack-reused 12848526 (from 1)
  Receiving objects: 100% (12980346/12980346), 3.23 GiB | 57.44 MiB/s, done.
  flushed.
  Resolving deltas: 100% (10676718/10676718), done.

It's quite clear that this string shouldn't ever be visible to the
client, so it rather feels like this is a left-over debug statement. The
menitoned commit doesn't mention this line, either.

Remove the debug output to prepare for a change in how we do the
buffering in the next commit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-13 08:54:13 -07:00
Junio C Hamano 67ad42147a Git 2.53
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-02-01 18:15:01 -08:00
Junio C Hamano 6f328bc9e3 l10n-2.53.0-v1
-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE37vMEzKDqYvVxs51k24VDd1FMtUFAml+C8cACgkQk24VDd1F
 MtX/AA/+L3XJD3hcwz6BbCqZdIYSdj324KylNHHfsNZ0jw6DH5SwAR91/6VM4wzH
 7yqelAYydWwp265EkfGQNSxY8zPL5YCAd9/xYyNG3oZu7wbJwT13KovWgX2sXr43
 dWXFJIurXNBpiOeJi+82ghmaRS5SfPW1YFConUFj7zsFq3Bb4iXYt2KZ65FpiR5Z
 JJEkqEXi1a8YiuO/b0kTior4kuHyEyOVnzI7OrQihhAls3YQvf8L46zKcDqr/gPp
 6MoiNIFPWomyJl0stNRb9W5w3sr5UDgJ2aR/qj7MutA/2JN7mOqmCB6uGroMmxCU
 FV+gBqhj56di/+sQ0c446NLPUa3nSO4JP5TiUO8MUhP8BnEGopemngpyJLpWzhSr
 0tG5LK32RtMmszBM+XNV247oWL9IiePdhcy6FZr2JIRrVGBpN6RtkmlRKcdAxUIC
 7k+g4u1LzM9vVeLjm8brIMQ78TLY2tL/eOl91fl+5tTRvsJvC4tydIaqEb1k/L9/
 sCj5GMmVs0hxdXMXLtArlbzYvNl0cwkJnqehpQuFkowJmqjAnAV9gKUkId2iaRQh
 TGq9ukCSzwn1XpIsC1o477JoQm+hzCFOFXCESuj9+il4ndfZ+BQgsp7Omb12U0TY
 f4upg2lJJokcoqd0HJoXXD2dkayZlslVhwY7X03BlHRd3VRbiYk=
 =MkCD
 -----END PGP SIGNATURE-----

Merge tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po

l10n-2.53.0-v1

* tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons
  l10n: fr: v2.53
  l10n: zh_TW.po: update Git 2.53 translation
  l10n: tr: Update Turkish translations
  l10n: sv.po: Update Swedish translation
  l10n: po-id for 2.53
  l10n: ga.po: Fix git-po-helper warnings
  l10n: bg.po: Updated Bulgarian translation (6091t)
  l10n: ga.po: Update Irish translation for Git 2.53
2026-02-01 18:13:52 -08:00
Carlo Marcelo Arenas Belón 239b7f686c RelNotes: fully spell negation
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-02-01 18:07:39 -08:00
Jiang Xin 532543fa46 Merge branch 'jx/zh_CN' of github.com:jiangxin/git
* 'jx/zh_CN' of github.com:jiangxin/git:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons
2026-01-31 21:32:54 +08:00
Jiang Xin 5a83d800f3 Merge branch 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po
* 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po:
  l10n: zh_TW.po: update Git 2.53 translation
2026-01-31 21:20:06 +08:00
Jiang Xin e996719801 Merge branch 'po-id' of github.com:bagasme/git-po
* 'po-id' of github.com:bagasme/git-po:
  l10n: po-id for 2.53
2026-01-31 21:15:38 +08:00
Jiang Xin 8ef65d7efd Merge branch 'l10n-ga-2.53' of github.com:aindriu80/git-po
* 'l10n-ga-2.53' of github.com:aindriu80/git-po:
  l10n: ga.po: Fix git-po-helper warnings
  l10n: ga.po: Update Irish translation for Git 2.53
2026-01-31 21:13:55 +08:00
Jiang Xin b386b3aea7 Merge branch 'master' of github.com:alshopov/git-po
* 'master' of github.com:alshopov/git-po:
  l10n: bg.po: Updated Bulgarian translation (6091t)
2026-01-31 21:11:50 +08:00
Jiang Xin af1a298e2c Merge branch 'fr_2.53' of github.com:jnavila/git
* 'fr_2.53' of github.com:jnavila/git:
  l10n: fr: v2.53
2026-01-31 21:08:43 +08:00
Jiang Xin 6f75c474d7 Merge branch 'tr-l10n' of github.com:bitigchi/git-po
* 'tr-l10n' of github.com:bitigchi/git-po:
  l10n: tr: Update Turkish translations
2026-01-31 21:06:38 +08:00
Jiang Xin 3eaaa7fea4 Merge branch 'master' of github.com:nafmo/git-l10n-sv
* 'master' of github.com:nafmo/git-l10n-sv:
  l10n: sv.po: Update Swedish translation
2026-01-31 21:03:10 +08:00
Jiang Xin eb816ef79e l10n: zh_CN: standardize glossary terms
Add preferred Chinese terminology notes and align existing translations
to the updated glossary. AI-assisted review was used to check and
improve legacy translations.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2026-01-31 20:51:27 +08:00
Junio C Hamano 2258446484 RelNotes: correct "fast-import" option name
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-30 09:50:03 -08:00
Jiang Xin 3065daed59 l10n: zh_CN: updated translation for 2.53
Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2026-01-29 21:42:38 +08:00
Jiang Xin eb3cfc6b2f l10n: zh_CN: fix inconsistent use of standard vs. wide colons
Replace mixed usage of standard (ASCII) colons ':' with full-width
(wide) colons ':' in Chinese translations to ensure typographic
consistency, as reported by CAESIUS-TIM [1].

Full-width punctuation is preferred in Chinese localization for better
readability and adherence to typesetting conventions.

[1]: https://github.com/git-l10n/git-po/issues/884

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
2026-01-29 21:42:38 +08:00
Jean-Noël Avila 72dd507505 l10n: fr: v2.53
Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
2026-01-28 19:43:46 +01:00
Yi-Jyun Pan b47610d61d
l10n: zh_TW.po: update Git 2.53 translation
Co-authored-by: Lumynous <lumynou5.tw@gmail.com>
Signed-off-by: Yi-Jyun Pan <pan93412@gmail.com>
2026-01-28 22:51:42 +08:00
Junio C Hamano ea717645d1 RelNotes: a few spelling fixes
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-27 12:12:06 -08:00
Emir SARI d63adbbbd5
l10n: tr: Update Turkish translations
Signed-off-by: Emir SARI <emir_sari@icloud.com>
2026-01-27 23:00:13 +03:00
Peter Krefting cba7353aed l10n: sv.po: Update Swedish translation
Also fix typos reported by Tuomas Ahola.

Helped-by: Tuomas Ahola <taahol@utu.fi>.
Signed-off-by: Peter Krefting <peter@softwolves.pp.se>
2026-01-27 19:33:55 +01:00
Junio C Hamano ab380cb80b Git 2.53-rc2
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-26 22:26:31 -08:00
Bagas Sanjaya 6ef4d11472 l10n: po-id for 2.53
Update following components:

  * branch.c
  * builtin/blame.c
  * builtin/config.c
  * builtin/fast-export.c
  * builtin/fast-import.c
  * builtin/fetch.c
  * builtin/gc.c
  * builtin/index-pack.c
  * builtin/pack-objects.c
  * builtin/patch-id.c
  * builtin/replay.c
  * builtin/repo.c
  * bundle-uri.c
  * command-list.c
  * object-file.c
  * refs/reftable-backend.c
  * repack-promisor.c
  * strbuf.c

Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
2026-01-27 10:05:58 +07:00
Aindriú Mac Giolla Eoin d534a373e7
l10n: ga.po: Fix git-po-helper warnings
Signed-off-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
2026-01-26 10:39:45 +00:00
Junio C Hamano ab689ea7f9 Revert "Merge branch 'cs/rebased-subtree-split'"
This reverts commit 79e3055bab, reversing
changes made to 9813aace1e.

Regresison report

    https://lore.kernel.org/git/755578cb-07e0-4b40-aa90-aacf4d45ccaa@heusel.eu/
2026-01-25 22:37:35 -08:00
Junio C Hamano 6959eee16e Merge branch 'master' of https://github.com/j6t/git-gui
* 'master' of https://github.com/j6t/git-gui:
  git-gui: mark *.po files at any directory level as UTF-8
  git-gui i18n: Update Bulgarian translation (558t)
  git-gui i18n: Update Bulgarian translation (557t)
2026-01-25 09:08:06 -08:00
Alexander Shopov 06045e3984 l10n: bg.po: Updated Bulgarian translation (6091t)
Signed-off-by: Alexander Shopov <ash@kambanaria.org>
2026-01-25 16:43:40 +01:00
Johannes Sixt 1a729ccb93 git-gui: mark *.po files at any directory level as UTF-8
When a commit is viewed in Gitk that changes a file in po/glossary, the
patch text shows mojibake instead of correctly decoded UTF-8 text.
Gitk retrieves the encoding attribute to decide how to treat the bytes
that make up the patch text. There is an attribute definition that all
files are US-ASCII, and a later attribute definition overrides this.
But the override, which specifies UTF-8, applies only to *.po files in
directory po/ and does not apply to subdirectories.

Widen the pattern to apply to all directory levels.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2026-01-25 10:53:08 +01:00
Johannes Sixt 4b700c24e8 Merge branch 'master' of github.com:alshopov/git-gui
* 'master' of github.com:alshopov/git-gui:
  git-gui i18n: Update Bulgarian translation (558t)
2026-01-25 10:32:21 +01:00
Alexander Shopov 539e6337b8 git-gui i18n: Update Bulgarian translation (558t)
- Translate new string (558t)
- Add graves for disambiguation
- Improve glossary translation (96t) and synchonize with git

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
2026-01-24 21:47:12 +01:00
Johannes Sixt 453fd8d14c Merge branch 'master' of github.com:alshopov/git-gui
* 'master' of github.com:alshopov/git-gui:
  git-gui i18n: Update Bulgarian translation (557t)

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2026-01-24 09:25:29 +01:00
Junio C Hamano ea24e2c554 A bit more before -rc2
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-23 13:34:37 -08:00
Junio C Hamano a85b5220e1 Merge branch 'dk/replay-doc-omit-irrelevant-rev-list-options'
Documentation clean-up.

* dk/replay-doc-omit-irrelevant-rev-list-options:
  lint-gitlink: preemptively ignore all /ifn?def|endif/ macros
  replay: drop rev-list formatting options from manual
2026-01-23 13:34:37 -08:00
Junio C Hamano 26f50ef98f Merge branch 'js/symlink-windows'
Upstream symbolic link support on Windows from Git-for-Windows.

* js/symlink-windows:
  mingw: special-case index entries for symlinks with buggy size
  mingw: emulate `stat()` a little more faithfully
  mingw: try to create symlinks without elevated permissions
  mingw: add support for symlinks to directories
  mingw: implement basic `symlink()` functionality (file symlinks only)
  mingw: implement `readlink()`
  mingw: allow `mingw_chdir()` to change to symlink-resolved directories
  mingw: support renaming symlinks
  mingw: handle symlinks to directories in `mingw_unlink()`
  mingw: add symlink-specific error codes
  mingw: change default of `core.symlinks` to false
  mingw: factor out the retry logic
  mingw: compute the correct size for symlinks in `mingw_lstat()`
  mingw: teach dirent about symlinks
  mingw: let `mingw_lstat()` error early upon problems with reparse points
  mingw: drop the separate `do_lstat()` function
  mingw: implement `stat()` with symlink support
  mingw: don't call `GetFileAttributes()` twice in `mingw_lstat()`
2026-01-23 13:34:37 -08:00
Junio C Hamano f2e92f7b04 Merge branch 'pw/mailmap-self'
Unify entries in .mailmap file for Phillip Wood.

* pw/mailmap-self:
  mailmap: add an entry for Phillip Wood
2026-01-23 13:34:36 -08:00
Junio C Hamano 1f047a6fba Merge branch 'js/ci-leak-skip-svn'
Dscho observed that SVN tests are taking too much time in CI leak
checking tasks, but most time is spent not in our code but in libsvn
code (which happen to be written in Perl), whose leaks have little
value to discover for us.  Skip SVN, P4, and CVS tests in the leak
checking tasks.

* js/ci-leak-skip-svn:
  ci: skip CVS and P4 tests in leaks job, too
  ci(*-leaks): skip the git-svn tests to save time
2026-01-23 13:34:36 -08:00
Junio C Hamano 3d95282129 Merge branch 'jx/build-options-gettext'
"git bugreport" and "git version --build-options" learned to
include use of 'gettext' feature, to make it easier to diagnose
problems around l10n.

* jx/build-options-gettext:
  help: report on whether or not gettext is enabled
2026-01-23 13:34:36 -08:00
Junio C Hamano 62627a3484 Merge branch 'ty/t1005-test-path-is-helpers'
Test clean-up.

* ty/t1005-test-path-is-helpers:
  t1005: modernize "! test -f" to "test_path_is_missing"
2026-01-23 13:34:36 -08:00
Junio C Hamano cd8b8cba47 Merge branch 'rj/cygwin-test-fixes-for-2.53'
Test fixup.

* rj/cygwin-test-fixes-for-2.53:
  t0610-reftable-basics: mitigate a flaky test on cygwin
  t9700/test.pl: fix path type expectation on cygwin
2026-01-23 13:34:36 -08:00
Junio C Hamano cfa173a5fa Merge branch 'sb/doc-update-ref-markup-fix'
Doc mark-up fix.

* sb/doc-update-ref-markup-fix:
  doc: fix `update-ref` `symref-create` formatting
2026-01-23 13:34:35 -08:00
Junio C Hamano b3722b381e Merge branch 'kh/mailmap-avila'
* kh/mailmap-avila:
  .mailmap: fix and expand mappings for Jean-Noël Avila
2026-01-23 13:34:35 -08:00
Aindriú Mac Giolla Eoin 0c19f7f950
l10n: ga.po: Update Irish translation for Git 2.53
Signed-off-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
2026-01-23 11:54:09 +00:00
Alexander Shopov 83a705b687 git-gui i18n: Update Bulgarian translation (557t)
Fix the meaning of a string

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
2026-01-23 11:14:01 +01:00
Junio C Hamano 1faf5b085a A few on top of -rc1
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-01-21 16:16:28 -08:00
Junio C Hamano 214cbb7b1d Merge branch 'rs/tree-wo-the-repository'
Remove implicit reliance on the_repository global in the APIs
around tree objects and make it explicit which repository to work
in.

* rs/tree-wo-the-repository:
  cocci: remove obsolete the_repository rules
  cocci: convert parse_tree functions to repo_ variants
  tree: stop using the_repository
  tree: use repo_parse_tree()
  path-walk: use repo_parse_tree_gently()
  pack-bitmap-write: use repo_parse_tree()
  delta-islands: use repo_parse_tree()
  bloom: use repo_parse_tree()
  add-interactive: use repo_parse_tree_indirect()
  tree: add repo_parse_tree*()
  environment: move access to core.maxTreeDepth into repo settings
2026-01-21 16:16:28 -08:00