<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/src/lib, branch v2.4.2</title>
<subtitle>Personal mirror of DanConwayDev/ngit-cli on git.upleb.uk
</subtitle>
<id>https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/atom?h=v2.4.2</id>
<link rel='self' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/atom?h=v2.4.2'/>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/'/>
<updated>2026-04-28T08:49:27+00:00</updated>
<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/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/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>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/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/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>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/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/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/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/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/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/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>
<entry>
<title>fix(patch): handle diff.noprefix and normalize non-standard diff paths</title>
<updated>2026-03-30T16:29:19+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-30T08:54:31+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/commit/?id=3a03cca6eb6597c19f5146c5f0d18f9230eb0fae'/>
<id>urn:sha1:3a03cca6eb6597c19f5146c5f0d18f9230eb0fae</id>
<content type='text'>
libgit2 respects the user's `diff.noprefix` git config when generating
patches via `git_email_create_from_commit`, producing diffs without the
standard `a/`/`b/` path prefixes. `git2::Diff::from_buffer` always
expects the standard prefix format and fails with "header filename does
not contain 1 path components" when it is absent.

Two fixes:
- In `make_patch_from_commit`: explicitly set `old_prefix("a/")` and
  `new_prefix("b/")` on the diff options so ngit always generates
  interoperable patches regardless of the submitter's git config.
- In `create_commit_from_patch`: normalize no-prefix diffs before
  passing to `git2::Diff::from_buffer`, as a defensive measure for
  patches already published by affected ngit versions or other tools.

Adds unit tests for the normalization function covering: no-op on
already-prefixed diffs, single and multi-file patches, new/deleted
files (/dev/null preservation), and end-to-end libgit2 parse
verification.
</content>
</entry>
<entry>
<title>fix(client): panic cloning bare npub nostr:// URL with no relay hints</title>
<updated>2026-03-20T09:25:02+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-20T09:25:02+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/commit/?id=f3a6ae82ccee44dc3b66a66caafe1bb39e7a46a6'/>
<id>urn:sha1:f3a6ae82ccee44dc3b66a66caafe1bb39e7a46a6</id>
<content type='text'>
When cloning a nostr:// URL containing only an npub and identifier (no
relay hints), and nothing is cached yet, the relay set was empty because
fallback relays were intentionally skipped when a coordinate was present.
This caused an unwrap() on a None from reduce() over an empty iterator.

Fall back to fallback relays when the coordinate-derived relay set is
still empty after processing all hints, and replace unwrap() with
map_or() as a defensive guard.
</content>
</entry>
<entry>
<title>fix(whoami): detect and fall back to system git config for nostr login</title>
<updated>2026-03-05T15:06:02+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-05T15:03:37+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/commit/?id=09c3ae91830bd9c7543b401b19f8c65a15205d32'/>
<id>urn:sha1:09c3ae91830bd9c7543b401b19f8c65a15205d32</id>
<content type='text'>
Add GitSystem to SignerInfoSource so credentials stored in the system
git config (/etc/gitconfig) are included in the priority fallback chain
(local &gt; global &gt; system) and shown as a separate level in whoami output.
</content>
</entry>
<entry>
<title>feat(cover-note): add kind-1624 cover notes for PRs, patches, and issues</title>
<updated>2026-03-05T14:23:07+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-05T14:19:49+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/commit/?id=37244449d6d0d58bb639f181bd15092de1acaaee'/>
<id>urn:sha1:37244449d6d0d58bb639f181bd15092de1acaaee</id>
<content type='text'>
Implements experimental kind-1624 cover note events:

- KIND_COVER_NOTE constant and process_cover_note() in git_events.rs;
  replaceable semantics (latest created_at, hex-id tiebreak), author or
  maintainer only
- kind-1624 events fetched alongside labels in the fetch pipeline;
  cover_notes count added to FetchReport display
- ngit pr/issue view: cover note displayed in place of description with
  a clear 'Cover Note:' header; maintainer-authored notes identify the
  author; original description shown only with --comments; cover_note
  object included in --json output
- ngit pr set-cover-note / ngit issue set-cover-note: publish a
  kind-1624 event; nostr: mentions in --body converted to q/p tags via
  tags_from_content (same rules as issue --body)
- Fix pre-existing clippy::too_many_lines on repo/mod.rs show_info
</content>
</entry>
<entry>
<title>feat(subject): add pr/issue set-subject via NIP-32 kind-1985 labels</title>
<updated>2026-03-05T13:03:50+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-05T13:03:50+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1tkq8unhsd5jqx6ueex5lcpsgknrpquxuk44ftpjlpm3ulaake7xs76txrw/ngit-cli-mirror/commit/?id=f3fcf863aae000964753f574b00e9fb9f5fcd452'/>
<id>urn:sha1:f3fcf863aae000964753f574b00e9fb9f5fcd452</id>
<content type='text'>
Adds the ability to update the displayed title of a PR or issue after
creation using a kind-1985 label event with the #subject namespace.
Only the author or a repository maintainer may set the subject. The
latest authorised event wins with tiebreak by lexicographically larger
event ID (NIP-1 replaceable event semantics). Branch names and commit
messages are never affected.

- Split get_labels() into process_labels() (additive #t) and
  process_subject() (replaceable-style #subject), with a shared
  get_labels_and_subject() entry point that processes both from a
  single pre-fetched slice of kind-1985 events
- All list/view/JSON display paths apply the subject override silently
- New ngit pr set-subject &lt;id&gt; --subject &lt;text&gt; command
- New ngit issue set-subject &lt;id&gt; --subject &lt;text&gt; command
</content>
</entry>
</feed>
