upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/bin/git_remote_nostr
AgeCommit message (Collapse)Author
2026-03-09fix(push): gracefully handle errors identifying potential PR mergesDanConwayDev
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.
2026-03-04add nostr.repo-relay-only config to limit publishing to repo relaysDanConwayDev
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\`.
2026-02-27fix: annotated tags missing from list due to dropped peeled refsDanConwayDev
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: <tag-object-oid> refs/tags/v1.0.0 <commit-oid> 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.
2026-02-26fix: correct merge-base in PR events from git push of pr/ branchDanConwayDev
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.
2026-02-26fix: store tag object OID in tracking ref for annotated tags after pushDanConwayDev
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.
2026-02-26fix: advertise only state events with resolvable git objectsDanConwayDev
git-remote-nostr now walks the per-relay state events captured in FetchReport::state_per_relay (newest first) and advertises the first one whose every OID is either present on at least one git server (confirmed via list_refs) or already available locally. If no such state event exists it falls back to the raw git server state. Previously the latest nostr state event was always used regardless of whether its OIDs had been pushed to any server, causing catastrophic missing-object errors during clone or fetch when a state event was published ahead of the corresponding git push.
2026-02-26fix: strip refs/tags/ prefix when computing remote tracking ref nameDanConwayDev
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'.
2026-02-26fix: rollback local state event cache on total push failureDanConwayDev
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.
2026-02-26fix: skip grasp servers whose relay did not receive state eventDanConwayDev
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.
2026-02-26fix: report per-relay publish results in send_events summaryDanConwayDev
Change send_events() return type from Result<()> to Result<Vec<(String, bool)>> 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".
2026-02-26feat: forward unrecognised push options to git serversDanConwayDev
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.
2026-02-20extract grasp/maintainership helpers to lib and auto-accept on pushDanConwayDev
move apply_grasp_infrastructure, latest_event_repo_ref to lib/repo_ref.rs and wait_for_grasp_servers + grasp_servers_from_user_or_fallback to a new lib/accept_maintainership.rs so both binaries can share them. add accept_maintainership_with_defaults which publishes the co-maintainer's own Kind:30617 announcement with defaults (user grasp servers, shared metadata from existing events) then waits for grasp server provisioning and updates nostr.repo config and origin remote. replace the push error block with a call to accept_maintainership_with_defaults so pushing now silently accepts co-maintainership instead of failing.
2026-02-20improve push error when co-maintainer has no announcementDanConwayDev
the previous message said 'run ngit init' with no explanation of why or what it does. the new message explains the user has been offered co-maintainership, names the repo, and points to 'ngit init -d' for a fast non-interactive acceptance path.
2026-02-18fix: remove outdated patch_supports gate and fix fetch parent fallbackDanConwayDev
Remove the patch_supports_commit_ids gates in checkout.rs and list.rs that pre-dated the mbox fallback logic. apply_patch_chain already handles all fallback cases. Also replace the main-branch TODO fallback in make_commits_for_proposal with get_parent_commit_from_patch, which uses timestamp-based best-guess when the parent-commit tag is absent.
2026-02-17fix: handle git c-style quoting of push-option values with backslashesDanConwayDev
Git wraps push-option values in double quotes and doubles backslashes when the value contains special characters. This broke \\n escape decoding because the key arrived as '"description' instead of 'description'. Added strip_git_quoting() to reverse git's quoting before parsing the key=value pair.
2026-02-17fix: apply push-options to patch series generationDanConwayDev
The title and description push-options were previously only applied to PR creation but not to patch series generation. When force-pushing to update an existing patch series, the custom title and description were ignored. This change passes the title_description parameter to the patch generation function, allowing users to customize patch series cover letters via: git push --force --push-option=title="Title" \ --push-option=description="Description" origin branch Includes integration test for force-pushing patches with custom cover letter.
2026-02-17feat: support multiline descriptions in push-options via \n escapeDanConwayDev
Git push-options are line-based so literal newlines cannot be sent. Users can now write the two-character sequence \n which is decoded into real newlines before publishing. Use \\n for a literal backslash-n. Includes unit tests, integration test, help text, and changelog entry.
2026-02-17fix: require both title and description push-options or neitherDanConwayDev
Previously, providing only one of title or description would silently ignore both. Now returns a clear error message.
2026-02-17feat: add push-options for title and description to git-remote-nostrDanConwayDev
Allows setting PR title and description via git push options: git push --push-option=title="My PR" \ --push-option=description="Details" origin pr/branch
2026-02-16fix: report wording consistancy in publishingDanConwayDev
always report publishing and finish with published
2026-02-16fix: fetch report ouputDanConwayDev
so that report gets removed when not in verbose mode and fix removal so summary displayed instead 1st line of original report.
2026-02-16test: verbose always on for remote testsDanConwayDev
to ensure verbose mode is used during tests
2026-02-13fix: preserve progress bars on relay errors during cloneDanConwayDev
fetching_with_report_for_helper unconditionally cleared the progress reporter, wiping error bars that showed relay timeouts. Only clear when all relays succeeded (or in verbose mode where bars were always visible), matching the pattern in fetching_with_report.
2026-02-13feat: add spinner for git fetch in non-verbose modeDanConwayDev
Shows a progress spinner when fetching from git remotes in non-verbose mode. Suppresses git fetch output and listing messages when not in verbose mode. Uses NGITTEST environment variable for test timeouts.
2026-02-13fix: clear progress reporters on successful completionDanConwayDev
Progress reporters were not being cleared after successful operations, leaving progress bars visible in the terminal output. Now they are properly cleared when all operations complete without errors.
2026-02-10fix: make git-remote-nostr push non-interactiveDanConwayDev
Update push operations to use non-interactive mode by default, removing prompts that would block automated git operations.
2025-11-14chore: bump rust-nostr v0.44DanConwayDev
fix breaking changes
2025-11-13feat(remote): don't hide fetch report if successfulDanConwayDev
as its useful information
2025-11-13feat(list): make list async and include sync report inlineDanConwayDev
copy relay fetching approach to async and reporting
2025-11-13refactor: simplify get_short_git_server_nameDanConwayDev
so it doesnt use the git_repo
2025-11-13fix: out of sync grasp server cli outputDanConwayDev
so it shows a summary rather than a lot of lines of issues
2025-11-13fix: cli output line deletion during fetchDanConwayDev
also reduce the clutter in the cli output for grasp servers.
2025-10-20fix: grasp server detectionDanConwayDev
to ensure we dont try and fallback to ssh
2025-10-17chore: cargo updateDanConwayDev
update patches ahead of wider upgrade. clippy required some autofixes
2025-10-17fix(fetch): surpress some warnings for some usersDanConwayDev
only the maintainers and author of a poorly formatted proposal need to know it was submitted but cant be created as a PR branch
2025-10-17fix: pr or pr update merge supportDanConwayDev
fixes to change attempted in 4fc659074ec5ced3cc0727cf1f3e6af082a189cc
2025-10-17feat(send): add `merge-base` tag to PR (Update)DanConwayDev
following its inclusion in the NIP-34 spec
2025-09-04feat(remote): use push PR non-interactive fallbackDanConwayDev
move the PR push code in 'ngit send' into lib. reuse the non-interactive fallbacks in git-remote-nostr
2025-09-03fix(remote): `refs/pr-by-id/*` ~> `refs/pr/*/head`DanConwayDev
to align more closely with githubs `refs/pull/*/head` we can pretend that pr means both Patch Request and Pull Request
2025-09-01fix: list shows `/pr` PRs when git data is localDanConwayDev
even if it is not on repository remotes, as it may have been pushed to a user's git server instead
2025-08-19feat(list): add PR fetch and checkout supportDanConwayDev
abstracted git remote helper fetch functions added support to `ngit list` to fetch PR data and checkout as proposal branch
2025-08-18fix(remote): push handle annotated tags syncDanConwayDev
handle scenario when correct annotated tag is on a remote. peel to tip commit doesnt give the correct oid so we must use the annotated tag oid instead when comparing.
2025-08-18feat(sync): add `ref-name` param to limit syncDanConwayDev
limit syncing to a single reference with this new parameter. change instructions for out of sync remotes to use sync with this new option.
2025-08-15feat(remote): list proposals as `refs/pr-by-id/*`DanConwayDev
This branch name cannot be attacked by brute forcing a shorthand event id like refs/pr/<branch-name(<shorthand-event-id) can.
2025-08-15feat(remote): list all proposals as `refs/pr/*`DanConwayDev
here we can list Pull Requests whose data aren't on the repo relays without causing `git clone nostr://` to fail. we can also list proposals of all statuses so that can review closed proposals.
2025-08-15fix: inaccessable PR commits breaks `git clone`DanConwayDev
we cannot list PRs under refs/heads/pr/* unless we are sure the oids are accessable on a git server as it will cause `git clone` to fail. we now only list PRs that are on accessable repo git servers under refs/heads/pr/*. we should be able to list them under under refs/pr/* as the clone command only fetches refs in refs/heads so we will do this seperately.
2025-08-07Merge branch 'add-prs-to-ngit-send'DanConwayDev
2025-08-07refactor: rename fn `is_grasp_server_in_list`DanConwayDev
to make it's purpose clearer
2025-08-06feat(send): custom ref for PR clone urlDanConwayDev
allow specifying ref for pushing PR to custom clone url
2025-08-05feat(send): push PR to custom clone urlDanConwayDev
if the repo doesnt list any grasp servers, or pushing to them fails
2025-08-05feat(send): support PR and PR update eventsDanConwayDev
send as a PR if the commit would make patches that are too big for nostr events. send as a PR update if the proposal is PR. send as a PR, revising a patch root, if patches would be too big. in tests `get_pretend_proposal_root_event` has to be a actual proposal with a tip, rather than just a cover letter, so we have replaced it.
2025-08-04refactor: move generate pr event fn into libDanConwayDev
for future use in `ngit send`
2025-08-04fix: `t` tag `revision-root` ~> `root-revision`DanConwayDev
NIP-34 specifies patch revisions should have a `t` tag of `root-revision` whereas we have been using `revision-root`. this fixes it and and handles events created with the incorrect tag.
2025-08-04refactor: abstract pr event generation & ref pushDanConwayDev
so that we can use it in `ngit send`
2025-08-01refactor: move patch size evaluation fn to libDanConwayDev
so we can use it in ngit as well as remote helper
2025-07-31fix: mention marker ~> q tag NIP-10 updateDanConwayDev
required for rust-nostr v0.43 update
2025-07-30fix(remote): support lightweight tagsDanConwayDev
I have now replicated the issue discussed in the last commit by overwriting my global git config item tag.gpgSign and setting it back to false, which is default the default. ngit was only supporting annotated tags and fiatjaf was pushing a lightweight tag. I'm confident that this will resolve the issue
2025-07-28fix(remote): push all tagsDanConwayDev
fiatjaf reported panic: ``` <commit-id> can not be successfully peeled into a tag (git_object_t=4). ``` when making a tag and running `git push --tags` I could not replicate but line it was coming from should use 'from' rather than 'to'.
2025-07-25refactor: move push helpers to libDanConwayDev
to enable forthcoming ngit sync cmd
2025-07-25refactor: move `utils` and `list` helpers to libDanConwayDev
to enable forthcoming `ngit sync` cmd
2025-07-25feat(pr): add pr and pr update merge supportDanConwayDev
as these events use `c` instead of `commit`
2025-07-25refactor: abstract `get_status`DanConwayDev
for use by `ngit list`
2025-07-23fix(remote): improve pr error messagesDanConwayDev
as a temporary measure
2025-07-23fix(remote): dont send pr and patches on upgradeDanConwayDev
when an upgrade to a pr is needed, dont also try and send patches
2025-07-23fix(remote): error if pushed proposal is emptyDanConwayDev
erorr if the pushed ref would produce a proposal with no patches, or if the ref is in origin/<main-or-master>
2025-07-23feat(pr): patch upgraded to pr inherit pr statusDanConwayDev
when a patch is upgraded to a pr, eg because new commits would be too large to be additional patches, the patch receives a closed staus and the new pr 'e' tags the original root patch. we therefore need to inherit the new pr's status instead of using the closed status. the closed status was used so that clients don't have to support pr revisions of patches, and still have a good UX.
2025-07-23fix(status): only use events from author and maintainersDanConwayDev
instead of status events from any pubkey
2025-07-23feat(pr): updates and pr as patch revisionDanConwayDev
issue a pull request update if pushing or force pushing a pull request issue a pull request with an e tag for original patch and close status for the original patch when pushing or force pushing against a patch when the new commits are too big to be iussed as patches
2025-07-23refactor(pr): rename functionsDanConwayDev
to reflect there new role of also pushing prs to git severs
2025-07-22feat(pr): generate pr event > oversized patchDanConwayDev
but only for new proposals
2025-07-18feat(pr): fetch pr and pr updates from clone urlsDanConwayDev
we try and get them from clone urls of repo and fallback to those specified by contributor
2025-07-18feat(pr): list PR and PR updatesDanConwayDev
remote will list the refs under `pr/*` namespace. `ngit list` will display in the list of open / draft proposals. it won't yet fetch the related oids to enable fetching or checking out the branch.
2025-07-16chore: bump nightly rustfmtDanConwayDev
to latest available and apply fmt fixes
2025-07-15feat: add git timeoutDanConwayDev
to improve reliability
2025-06-19refactor: rename ngit_relay to graspDanConwayDev
in function, params and variable names
2025-06-19rename ngit-relay to graspDanConwayDev
includes a change to a git config itme name
2025-06-19refactor: move build state functionDanConwayDev
in preparation for enforcing the inclusion of HEAD
2025-06-17fix: support `git://` in clone urlsDanConwayDev
based on jb55 trying to use this with damus nostr:event1qvzqqqqqqypzqvhpsfmr23gwhv795lgjc8uw0v44z3pe4sg2vlh08k0an3wx3cj9qy88wumn8ghj7mn0wvhxcmmv9uq3jamnwvaz7tmjv4kxz7fwwdhx7un59eek7cmfv9kz7qpqec3c59c4yu4yrsa9fedu27rnygnemj2cfmumf6fw7385wfthg57slj72ux
2025-06-02fix: ignore dereferenced tags in stateDanConwayDev
as they are just noise
2025-05-31feat(push): prevent push if no ann eventDanConwayDev
To ensure additional maintainers publish an annoucement event, require it for them to push
2025-05-23feat(push): avoid out of sync issues for ngit relayDanConwayDev
we need to be careful with git servers with their own permissions so a ngit user doesn't inadvertantly push changes on top of a another user who pushed directly to the git server without using the force flag. We dont have this problem with ngit-relay so we can always force push, even if the user didnt as nostr is the authority of state.
2025-05-23feat: only try http(s) for ngit-relaysDanConwayDev
otherwise it tries all the protocols and reprots on each
2025-05-21feat: add support for default relay overridesDanConwayDev
via git config so they can be overwritten locally and globally
2025-05-09fix: always try git servers over other protocolsDanConwayDev
remove the code that guessed whether it was an authentication failure and gave up is it wasn't. this prevents it from trying http for push when ssh is not supported eg. ngit-relay
2025-05-05chore: nix flake updateDanConwayDev
update nix dependancies to latest version using default update options run `cargo clippy --fix` and `cargo fmt` to fix new clippy errors
2025-04-03feat(send): add description to event signing processDanConwayDev
resolving nostr:note1qu8le4a8qz9hhxy6q85txejcq0kln0r3s9vdtwrhtqwvauc6nxuqn3fj0z so it doesnt appear frozen when there are lots of events being signed by a remote signer
2025-04-01fix: allow soft push if not behind serverDanConwayDev
when nostr and the gitserver are out of sync an error was thrown when the git server was behind during soft push. It should only throw the error if its ahead of the tip to be pushed.
2025-04-01chore: bump rust-nostr v0.37 ~> v0.40DanConwayDev
and fix all of the breaking changes
2024-12-20feat(remote): include draft PRsDanConwayDev
show draft as well as open PRs as remote branches
2024-12-20fix(push): find existing proposalDanConwayDev
improve reliability of getting current logged in user to assess if they have submitted a proposal with the same name / branch name
2024-12-20refactor: branch_name handlingDanConwayDev
improve clarity by renaming variables and methods defend against `branch-name` tag with an unsafe name
2024-12-20refactor: use nostr url from repo_refDanConwayDev
simplify to allow the removal of warning: `#[allow(clippy::too_many_arguments)]`
2024-12-16chore: bump nix flake rust nightly `fmt` overlayDanConwayDev
update the rust nightly `fmt` overlay which needs to be pinned to a specific version (this case by date) update formatting in main files via `cargo fmt`
2024-12-16chore: nix flake updateDanConwayDev
update nix dependancies to latest version using default update options fix warning related to idomatic patterns
2024-12-13fix(push): refactor errorsDanConwayDev
comparing different versions of the nostr url string
2024-12-13refactor(push): split `run_push` functionDanConwayDev
as it was way too long
2024-12-12feat(push): merge event for applied commitsDanConwayDev
publish a merge event when the commit author signature and timestamp match patches within an open proposal
2024-12-12test(push): ff merge commit tag `merge-commit-id`DanConwayDev
allow any order of the commit ids
2024-12-12fix(push): three-way `merge-commit-id` `tag`DanConwayDev
should alway list only the three-way merge commit id.
2024-12-12fix: defend against empty`tags`DanConwayDev
prevent a panic when tags are of an unexpect length