Cache the Git remote URL to speed up rendering hyperlinks#1940
Conversation
|
Thanks for reporting this! Caching is fine, the slowdown is from libgit2 being overly correct and assuming that the remote url could change while the program is running. |
aeb4fca to
c184e5f
Compare
|
@th1000s Took a while until I had some spare cycles to look at this again, but following your guidance I was able to use a |
|
@dandavison 1) Thank you for delta - it's incredible 2) Any chance you could enable the tests? |
|
Hi @charlievieth -- tests are running! I'm sorry that I personally am finding so little time to work on delta at the moment, but thank you very much for your work here. |
c184e5f to
3e50f42
Compare
|
@dandavison Thank you and I completely understand (I've only recently had the cycles to address my own OSS commits and projects). The For context my rust toolchain is:
Script used to check the delta of
|
|
If you'd like to deal with the clippy complaints then that would be great! I think the best way would be to open a PR for the clippy-related fixes against |
Created #2038 to address the clippy complaints. |
3e50f42 to
09b6d7e
Compare
@dandavison now that #2038 is merged any chance you can take a look at this PR? |
09b6d7e to
9f045c5
Compare
|
The clippy error reported here also occurs on the main branch. |
This commit changes the GitConfig struct to cache the GitRemoteRepo, which speeds up the rendering of hyperlinks by ~55x. Fixes dandavison#1939
9f045c5 to
1330f6f
Compare
|
Thank you for this improvement, and apologies for the delays. I also fixed the new v1.91 (which was released in the meantime) clippy warning. |
| config_from_env_var: HashMap<String, String>, | ||
| pub enabled: bool, | ||
| repo: Option<git2::Repository>, | ||
| remote_url: OnceCell<Option<GitRemoteRepo>>, |
There was a problem hiding this comment.
Nice, a OnceCell is much better than RefCell`.
|
@th1000s thank you for the review and for merging this PR! |
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [dandavison/delta](https://github.com/dandavison/delta) | minor | `0.18.2` → `0.19.1` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>dandavison/delta (dandavison/delta)</summary> ### [`v0.19.1`](https://github.com/dandavison/delta/releases/tag/0.19.1) [Compare Source](dandavison/delta@0.19.0...0.19.1) This patch release fixes a release automation [bug](dandavison/delta#2127): release [0.19.0](https://github.com/dandavison/delta/releases/tag/0.19.0) did not include all release binaries. #### What's Changed - Fix CD: replace defunct ubuntu-20.04 runners by [@​dandavison](https://github.com/dandavison) in [#​2129](dandavison/delta#2129) **Full Changelog**: <dandavison/delta@0.19.0...0.19.1> ### [`v0.19.0`](https://github.com/dandavison/delta/releases/tag/0.19.0) [Compare Source](dandavison/delta@0.18.2...0.19.0) Tons of improvements; thanks very much to all delta contributors. **This release is missing several binaries due to a [bug in the GitHub Actions release workflow](dandavison/delta#2127). Please use <https://github.com/dandavison/delta/releases/tag/0.19.1> instead.** #### What's Changed - Do not double panic in FakeParentArgs::drop by [@​dvermd](https://github.com/dvermd) in [#​1856](dandavison/delta#1856) - Improve blame file type detection ([#​1803](dandavison/delta#1803)) by [@​dvermd](https://github.com/dvermd) in [#​1829](dandavison/delta#1829) - Use same example config in manual as README by [@​dandavison](https://github.com/dandavison) in [#​1879](dandavison/delta#1879) - Clarify grep highlighter-related code by [@​dandavison](https://github.com/dandavison) in [#​1877](dandavison/delta#1877) - Don't set colorMoved in introductory instructions by [@​dandavison](https://github.com/dandavison) in [#​1884](dandavison/delta#1884) - Recommend zdiff3 merge.conflictStyle by [@​adamchainz](https://github.com/adamchainz) in [#​1260](dandavison/delta#1260) - Add themes `weeping-willow`, `mirthful-willow` by [@​lvdh](https://github.com/lvdh) in [#​1864](dandavison/delta#1864) - CI: switch to macos-13, as 12 will be unsupported soon by [@​th1000s](https://github.com/th1000s) in [#​1890](dandavison/delta#1890) - Add optional capture-output writer to run\_app() by [@​th1000s](https://github.com/th1000s) in [#​1889](dandavison/delta#1889) - Center-align README content by [@​dandavison](https://github.com/dandavison) in [#​1893](dandavison/delta#1893) - Redundant Option Checks, Unwrap Safety by [@​sharma-shray](https://github.com/sharma-shray) in [#​1892](dandavison/delta#1892) - Add console commands for git configuration by [@​harmtemolder](https://github.com/harmtemolder) in [#​1896](dandavison/delta#1896) - Honor pager path when checking less version by [@​dandavison](https://github.com/dandavison) in [#​1903](dandavison/delta#1903) - Rename some variables by [@​dandavison](https://github.com/dandavison) in [#​1904](dandavison/delta#1904) - Delete now-unused pricate homebrew formula step from Makefile (III) by [@​dvermd](https://github.com/dvermd) in [#​1830](dandavison/delta#1830) - Support {host} in hyperlinks by [@​dandavison](https://github.com/dandavison) in [#​1901](dandavison/delta#1901) - Allow multiple hyperlinks per line by [@​th1000s](https://github.com/th1000s) in [#​1909](dandavison/delta#1909) - Clippy 1.83 by [@​th1000s](https://github.com/th1000s) in [#​1918](dandavison/delta#1918) - Support external subcommands: rg, diff, git-show (etc.) by [@​th1000s](https://github.com/th1000s) in [#​1769](dandavison/delta#1769) - Don't keep subcommand stdout around by [@​th1000s](https://github.com/th1000s) in [#​1920](dandavison/delta#1920) - hyperlink commit hashes of length 7 as well by [@​th1000s](https://github.com/th1000s) in [#​1924](dandavison/delta#1924) - clippy 1.84 fix by [@​th1000s](https://github.com/th1000s) in [#​1938](dandavison/delta#1938) - chore(deps): update git2 to use libgit2 1.9 by [@​chenrui333](https://github.com/chenrui333) in [#​1930](dandavison/delta#1930) - Suggest minimum bat version in manual by [@​ernstki](https://github.com/ernstki) in [#​1941](dandavison/delta#1941) - Upgrade unicode-width to v0.1.14 (but still < 0.2.0) by [@​th1000s](https://github.com/th1000s) in [#​1937](dandavison/delta#1937) - Update terminal-colorsaurus version to 0.4.8 by [@​rashil2000](https://github.com/rashil2000) in [#​1936](dandavison/delta#1936) - Fix index out of bounds crash for '@​@​ @​@​' hunk header by [@​adamchainz](https://github.com/adamchainz) in [#​1995](dandavison/delta#1995) - Tune themes weeping-willow, mirthful-willow by [@​lvdh](https://github.com/lvdh) in [#​2011](dandavison/delta#2011) - clippy 1.88 fixes by [@​injust](https://github.com/injust) in [#​2016](dandavison/delta#2016) - Fix diff output when a diff ends with a mode change by [@​th1000s](https://github.com/th1000s) in [#​2023](dandavison/delta#2023) - fix: `cargo install git-delta --locked` fails on systems with GCC 15 by [@​tquin](https://github.com/tquin) in [#​2007](dandavison/delta#2007) - Normalize `merge.conflictStyle` casing by [@​injust](https://github.com/injust) in [#​2015](dandavison/delta#2015) - Styled zero lines fix by [@​th1000s](https://github.com/th1000s) in [#​1916](dandavison/delta#1916) - config: add setup instructions for Jujutsu (jj) vcs by [@​arjunmahishi](https://github.com/arjunmahishi) in [#​2048](dandavison/delta#2048) - all: fix clippy complaints by [@​charlievieth](https://github.com/charlievieth) in [#​2038](dandavison/delta#2038) - Cache the Git remote URL to speed up rendering hyperlinks by [@​charlievieth](https://github.com/charlievieth) in [#​1940](dandavison/delta#1940) - deps: update cc by [@​ognevny](https://github.com/ognevny) in [#​2053](dandavison/delta#2053) - rg json handling: fix line comment highlighting by [@​th1000s](https://github.com/th1000s) in [#​2057](dandavison/delta#2057) - Update dirs dependency to version 6 by [@​musicinmybrain](https://github.com/musicinmybrain) in [#​2063](dandavison/delta#2063) - default line number to 1 for hyperlinks by [@​schpet](https://github.com/schpet) in [#​2061](dandavison/delta#2061) - Fix line numbers showing filename when hyperlinks enabled by [@​tsvikas](https://github.com/tsvikas) in [#​2058](dandavison/delta#2058) - less hist file: look at xdg paths by [@​th1000s](https://github.com/th1000s) in [#​2065](dandavison/delta#2065) - CI: remove x86 apple/macOS by [@​th1000s](https://github.com/th1000s) in [#​2074](dandavison/delta#2074) - Update bat dependency from 0.24 to 0.26 by [@​dandavison](https://github.com/dandavison) in [#​2115](dandavison/delta#2115) #### New Contributors - [@​dvermd](https://github.com/dvermd) made their first contribution in [#​1856](dandavison/delta#1856) - [@​lvdh](https://github.com/lvdh) made their first contribution in [#​1864](dandavison/delta#1864) - [@​sharma-shray](https://github.com/sharma-shray) made their first contribution in [#​1892](dandavison/delta#1892) - [@​harmtemolder](https://github.com/harmtemolder) made their first contribution in [#​1896](dandavison/delta#1896) - [@​ernstki](https://github.com/ernstki) made their first contribution in [#​1941](dandavison/delta#1941) - [@​tquin](https://github.com/tquin) made their first contribution in [#​2007](dandavison/delta#2007) - [@​arjunmahishi](https://github.com/arjunmahishi) made their first contribution in [#​2048](dandavison/delta#2048) - [@​charlievieth](https://github.com/charlievieth) made their first contribution in [#​2038](dandavison/delta#2038) - [@​ognevny](https://github.com/ognevny) made their first contribution in [#​2053](dandavison/delta#2053) - [@​musicinmybrain](https://github.com/musicinmybrain) made their first contribution in [#​2063](dandavison/delta#2063) - [@​schpet](https://github.com/schpet) made their first contribution in [#​2061](dandavison/delta#2061) - [@​tsvikas](https://github.com/tsvikas) made their first contribution in [#​2058](dandavison/delta#2058) **Full Changelog**: <dandavison/delta@0.18.2...0.19.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44OS42IiwidXBkYXRlZEluVmVyIjoiNDMuODkuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6Om1pbm9yIl19-->
This commit speeds up the rendering of hyperlinks by ~47x by caching the Git repos remote URL instead of fetching it each time a hyperlink is rendered.
Fixes #1939
Note
I am very new to Rust so I am very open to feedback and completely understand if you want to rewrite or abandon this entire PR (especially if for some reason the remote URL should not be cached). Additionally, I think the
GitConfigshould be responsible for storing the cached remote, but struggled to make that work due to borrowing, lifetimes, mutability, etc.Benchmarks
The below benchmarks were ran in the root of Linux v6.12. We use
head -c $((128 * 1024 * 1024))to limit the amount of Git log data since otherwise benchmarkingdeltabefore this change takes a very long time.TLDR: This change makes processing 128Mib of Git log output take 3.7 seconds instead of 176.1 seconds.
Without git remote caching
With git remote caching (this change)