<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/src/bin/git_remote_nostr/push.rs, 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-03-09T10:02:25+00:00</updated>
<entry>
<title>fix(push): gracefully handle errors identifying potential PR merges</title>
<updated>2026-03-09T10:02:25+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-09T09:14:03+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=3daf61e74c8969c91333bc92c4914c8c6077592c'/>
<id>urn:sha1:3daf61e74c8969c91333bc92c4914c8c6077592c</id>
<content type='text'>
Errors from get_merged_status_events no longer abort the push; the
call site now uses if let Ok(...) so failures are silently skipped.
Also replace an .unwrap() in create_merge_events with a safe
.map().unwrap_or_default() to avoid any panic in that path.
</content>
</entry>
<entry>
<title>add nostr.repo-relay-only config to limit publishing to repo relays</title>
<updated>2026-03-04T12:48:37+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-03-03T13:08:56+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=a55d4150066456084fd18987acf014c18d0da976'/>
<id>urn:sha1:a55d4150066456084fd18987acf014c18d0da976</id>
<content type='text'>
Adds a git config key nostr.repo-relay-only that, when set to true, causes
nostr events to be sent only to the repository's own relays, skipping the
user's personal write relays and default/blaster relays. Useful for
repositories that should not broadcast to the maintainer's personal relay set.
Set persistently via \`git config nostr.repo-relay-only true\` or in one step
with \`ngit init --repo-relay-only\`.
</content>
</entry>
<entry>
<title>fix: annotated tags missing from list due to dropped peeled refs</title>
<updated>2026-02-27T15:46:37+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-27T15:40:24+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=28ad5440c7184de9833f8448bc90153ee4499c83'/>
<id>urn:sha1:28ad5440c7184de9833f8448bc90153ee4499c83</id>
<content type='text'>
RepoState::try_from was explicitly discarding all refs/tags/*^{} entries
("peeled" refs) when parsing the nostr state event. This meant the list
command only advertised the tag object OID, but git requires two lines for
annotated tags:

  &lt;tag-object-oid&gt; refs/tags/v1.0.0
  &lt;commit-oid&gt;     refs/tags/v1.0.0^{}

Without the ^{} peeled line git cannot resolve the tag to a commit, so
git fetch --prune treats it as unresolvable and deletes it.

The nostr state event already stores both entries correctly (written by
generate_updated_state in push.rs). The fix simply stops try_from from
discarding the ^{} entries on read, so they flow through to the list
output unchanged.
</content>
</entry>
<entry>
<title>fix: correct merge-base in PR events from git push of pr/ branch</title>
<updated>2026-02-26T16:35:59+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T16:35:59+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=01aeb2a3265bcafa162987c85dd281981770bba7'/>
<id>urn:sha1:01aeb2a3265bcafa162987c85dd281981770bba7</id>
<content type='text'>
When pushing a pr/ branch, the ahead slice is reversed by callers before
being passed to generate_patches_or_pr_event_or_pr_updates, making it
oldest-first. The tip/first_commit assignments were backwards (using
first()/last() as if the slice were youngest-first), so the merge-base
was computed as the parent of the PR tip rather than the parent of the
oldest commit. Multi-commit PRs therefore showed only 1 commit when
applied via ngit apply.

Adds an integration test that pushes a two-commit large-file PR branch
and asserts the merge-base tag equals the main branch tip.
</content>
</entry>
<entry>
<title>fix: store tag object OID in tracking ref for annotated tags after push</title>
<updated>2026-02-26T15:26:22+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T15:23:04+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=54f0542a27e4ccab459d87283e4668d865ddd2bb'/>
<id>urn:sha1:54f0542a27e4ccab459d87283e4668d865ddd2bb</id>
<content type='text'>
update_remote_refs_pushed was calling peel_to_commit() for all refs,
discarding the tag object OID for annotated tags. This caused a mismatch
with generate_updated_state, which correctly stores the tag object OID in
the nostr state event. ngit sync would then push the commit OID to grasp
servers that expected the tag object OID, causing rejections.
</content>
</entry>
<entry>
<title>fix: strip refs/tags/ prefix when computing remote tracking ref name</title>
<updated>2026-02-26T15:26:19+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T13:41:01+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=b85683201250e97a30bfe7a5dbba5508f8e86f65'/>
<id>urn:sha1:b85683201250e97a30bfe7a5dbba5508f8e86f65</id>
<content type='text'>
refspec_remote_ref_name() only stripped refs/heads/, so tag refspecs
produced refs/remotes/origin/refs/tags/v1.0.0 instead of
refs/remotes/origin/v1.0.0. ngit sync reads the latter form, so the
tracking ref was never found and sync failed with 'src refspec does not
match any existing object'.
</content>
</entry>
<entry>
<title>fix: rollback local state event cache on total push failure</title>
<updated>2026-02-26T15:26:18+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T12:47:12+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=ee68ccadce6a6c90747cbdaae557babb4683413e'/>
<id>urn:sha1:ee68ccadce6a6c90747cbdaae557babb4683413e</id>
<content type='text'>
When all git servers reject or skip a push, delete the newly-published
state event from the local nostr cache and restore the previous state
event (if any), so that a subsequent retry starts from a clean baseline
rather than a state that no server ever accepted.
</content>
</entry>
<entry>
<title>fix: skip grasp servers whose relay did not receive state event</title>
<updated>2026-02-26T15:26:17+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T12:33:52+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=f252dd0f1fb7374b5b6d44e77facdc902ee52c43'/>
<id>urn:sha1:f252dd0f1fb7374b5b6d44e77facdc902ee52c43</id>
<content type='text'>
When publishing the nostr state event before a git push, use the relay
results from send_events to skip any grasp server whose internal relay
did not receive the event. Print a clear warning for each skipped server
and emit error lines for all refs if no git servers remain to push to.
</content>
</entry>
<entry>
<title>fix: report per-relay publish results in send_events summary</title>
<updated>2026-02-26T15:26:16+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-26T12:24:40+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=dc6c20d29ea4456eee1dbc2aa8757fe955d1afc7'/>
<id>urn:sha1:dc6c20d29ea4456eee1dbc2aa8757fe955d1afc7</id>
<content type='text'>
Change send_events() return type from Result&lt;()&gt; to
Result&lt;Vec&lt;(String, bool)&gt;&gt; so callers can inspect which relays
accepted events. Update the finish message to show
"Published to X/N relays (failed: ...)" instead of the unconditional
"Published ... to nostr relays".
</content>
</entry>
<entry>
<title>feat: forward unrecognised push options to git servers</title>
<updated>2026-02-26T15:26:14+00:00</updated>
<author>
<name>DanConwayDev</name>
<email>DanConwayDev@protonmail.com</email>
</author>
<published>2026-02-25T16:46:02+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub1sh4dwqc9ypguemh6m8tmxxl8xuzfsz0j8av8vq7t3xd3mldsg9ls4ew80h/ngit-cli-mirror/commit/?id=5c305e922e19e4ac65c6a1473be67145a1c73f2b'/>
<id>urn:sha1:5c305e922e19e4ac65c6a1473be67145a1c73f2b</id>
<content type='text'>
Any -o option passed to `git push` that is not handled by ngit
(title, description) is forwarded verbatim to the git server via
git2::PushOptions::remote_push_options. This allows options such as
`-o secret-scanning.skip` to pass through transparently.

`ngit send` gains a matching -o / --push-option flag for the same
purpose.
</content>
</entry>
</feed>
