<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror, branch v2.4.2</title>
<subtitle>Personal mirror of DanConwayDev/ngit-cli on git.upleb.uk
</subtitle>
<id>https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/atom?h=v2.4.2</id>
<link rel='self' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/atom?h=v2.4.2'/>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/'/>
<updated>2026-04-28T10:48:50+00:00</updated>
<entry>
<title>chore: release v2.4.2</title>
<updated>2026-04-28T10:48:50+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-28T10:48:50+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=59e467b423e0ba66c30c7f1b7d41d47d938615de'/>
<id>urn:sha1:59e467b423e0ba66c30c7f1b7d41d47d938615de</id>
<content type='text'>
Fix GRASP server push path for PR proposals: URL normalisation
mismatch meant repo GRASP servers were never tried, causing every
PR submission to fall through to the fork-creation fallback.
</content>
</entry>
<entry>
<title>fix(send): repo GRASP servers never tried when pushing PR proposal refs</title>
<updated>2026-04-28T08:49:27+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-28T08:49:27+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=b9b0108972cbe532d41519850245adbcf6b4fd93'/>
<id>urn:sha1:b9b0108972cbe532d41519850245adbcf6b4fd93</id>
<content type='text'>
is_grasp_server_in_list does a direct string comparison, but repo_grasps
(from grasp_servers()) contains normalised hostnames (e.g. relay.ngit.dev)
while repo_ref.git_server holds full clone URLs. They never match, so
to_try was always empty and every PR submission fell through to the fork
creation / personal GRASP server fallback path.

Fix: normalise each clone URL before comparing against repo_grasps.
</content>
</entry>
<entry>
<title>chore: release v2.4.1</title>
<updated>2026-04-22T13:00:23+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-22T13:00:23+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=875f4e0a99688c7363cba69c1485af1cd4b34999'/>
<id>urn:sha1:875f4e0a99688c7363cba69c1485af1cd4b34999</id>
<content type='text'>
Fix fatal errors during clone/fetch when an open PR's git data is
unavailable on the repository's specified git servers.
</content>
</entry>
<entry>
<title>fix: prevent fatal clone/fetch errors when PR git data unavailable</title>
<updated>2026-04-22T13:00:17+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-22T13:00:17+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=e98acf8c5da5033b20aee8510485a8b4a4f4a56e'/>
<id>urn:sha1:e98acf8c5da5033b20aee8510485a8b4a4f4a56e</id>
<content type='text'>
Only advertise `refs/heads/pr/*` branches once their tip OIDs are
confirmed present locally; prevents `fatal: bad object` / `remote did
not send all necessary objects` errors during clone/fetch when a PR tip
lives on a different git server than the one that won the bulk prefetch
race.

After the bulk prefetch, collect remaining missing PR tip OIDs and do
one batch fetch per repo git server using only the OIDs that server has
advertised; break early once all are satisfied and skip servers that
carry none. Avoids batch-poisoning (a server rejects the whole request
if any single OID is absent) and redundant connections.

Restrict mop-up fetches and run_fetch to the repo's declared git
servers; do not fetch from clone-tag URLs in PR events - they are
submitter-supplied and could let a malicious or slow server stall every
clone/fetch operation.

Also apply rustfmt and fix clippy warnings.
</content>
</entry>
<entry>
<title>chore: release v2.4.0</title>
<updated>2026-04-10T20:46:02+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-10T20:45:06+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=205ca05897cbc727d9b75e7ab68375b5c93ead39'/>
<id>urn:sha1:205ca05897cbc727d9b75e7ab68375b5c93ead39</id>
<content type='text'>
Add git worktree support and fix patch parsing, panic on bare npub clone,
percent-encoding of reserved characters in identifiers, and push errors.
</content>
</entry>
<entry>
<title>fix: percent-encode identifier in nostr:// URLs and GRASP HTTP paths</title>
<updated>2026-04-10T16:30:02+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-04-10T16:25:26+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=47622eb762e802a9caa2f37d8162eaaf2f9aa9ca'/>
<id>urn:sha1:47622eb762e802a9caa2f37d8162eaaf2f9aa9ca</id>
<content type='text'>
Repository identifiers can contain any characters per NIP-01 d-tag rules.
Encode them in nostr:// clone URLs (display and parse) and in GRASP
/&lt;npub&gt;/&lt;identifier&gt;.git paths, aligning with NIP-34 and GRASP-01.
</content>
</entry>
<entry>
<title>docs: update changelog with fixes since v2.3.0</title>
<updated>2026-03-30T16:29:24+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-30T12:24:21+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=1978add2aa61a7e65655ec023d339e656402ad7b'/>
<id>urn:sha1:1978add2aa61a7e65655ec023d339e656402ad7b</id>
<content type='text'>
- more robust patch parsing and gracefully handle errors
- panic when cloning a bare `nostr://npub/identifier` URL with no relay hints
</content>
</entry>
<entry>
<title>feat: git worktree support</title>
<updated>2026-03-30T16:29:23+00:00</updated>
<author>
<name>m0wer</name>
<email>m0wer@sgn.space</email>
</author>
<published>2026-03-29T14:45:52+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=820fd706a24be7a58554a27e411e120cfa28d9a6'/>
<id>urn:sha1:820fd706a24be7a58554a27e411e120cfa28d9a6</id>
<content type='text'>
Git worktrees don't have a .git directory with a parent, so we need to
look for the git dir via git2's Repository::discover() and then look for
the cache database there. This allows the client to work correctly when
run from a worktree, and also allows the cache database to be shared
between the main repo and its worktrees (since they share the same git
dir and thus the same cache path).
</content>
</entry>
<entry>
<title>fix(patch): accept reconstructed OID when commit id mismatch occurs</title>
<updated>2026-03-30T16:29:22+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-30T11:43:55+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=e3276e74bc45cb4fb8f158b8249bee3d12a0805f'/>
<id>urn:sha1:e3276e74bc45cb4fb8f158b8249bee3d12a0805f</id>
<content type='text'>
When applying a patch, if the reconstructed commit OID doesn't match
the tagged commit id (after the existing amend attempt), accept the
reconstructed OID rather than erroring. The diff is applied correctly
regardless of the mismatch; apply_patch_chain already threads the
actual OID forward via next_parent_override so the chain remains
consistent.

Mismatches can occur for several reasons: GPG-signed commits where
libgit2's commit_create_buffer produces subtly different bytes than
the original git commit, patches produced with non-standard tooling,
or edge cases like the diff.noprefix issue fixed in 7a36aed.
</content>
</entry>
<entry>
<title>fix(patch): don't error on commit id mismatch for pgp-signed commits</title>
<updated>2026-03-30T16:29:20+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-30T10:54:31+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=33a72aa745ea6b6594bacfb71ea8ff2778f9b748'/>
<id>urn:sha1:33a72aa745ea6b6594bacfb71ea8ff2778f9b748</id>
<content type='text'>
When applying a patch with a pgp signature, commit_create_buffer +
commit_signed reconstructs the signed commit object. The resulting OID
matches the original only if commit_create_buffer produces the exact
same bytes that git originally signed — which isn't guaranteed across
different git implementations or versions.

The existing amend workaround (which re-applies author/committer to
recover the correct OID) is preserved for unsigned commits. For
pgp-signed commits the amend still runs but the mismatch bail is
skipped, since the tree, author, committer, message and signature are
all correct regardless of the OID difference.
</content>
</entry>
</feed>
