| Age | Commit message (Collapse) | Author | Files | Lines |
|
Phase 1 was driven by text presence: stanza_exists read the working
gitolite.conf, so a run that died at the y/N prompt (EOFError with no
TTY) left the stanza uncommitted, and the next run reported "already
present", skipped the commit+push, then timed out waiting for a bare
repo gitolite was never told to build.
Drive Phase 1 by git state instead: ensure the stanza is in the working
file (idempotent), commit it if the working tree differs from HEAD, and
push if HEAD is ahead of upstream. This recovers both a leftover
uncommitted edit and a committed-but-unpushed stanza, and is a no-op
when already in sync. Confirm now happens before the commit, and abort
reverts to HEAD. Self-test pins the three git states with a throwaway
repo and bare upstream.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
A repo create that dies at the y/N prompt leaves the stanza uncommitted
in the working tree; stanza_exists reads the working file, so a re-run
skips Phase 1 and times out waiting for a bare repo gitolite was never
told to build. Records recovery and fix options.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
--private makes the gitolite stanza and bare repo but skips the helper
call, so the repo is never written to cgitrc and stays off the public
cgit index (shows PRIV in repo list). --section is required unless
--private. Bash completion offers --private; README and CLAUDE.md
document the flag and the local /usr/local/bin install.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
- README: completion note now covers repo-name completion for
desc/delete/add-remote, not just --section; new Notes entry on the
server: prefix for helper/sync passthrough.
- SKILL.md: gotcha explaining that server:-prefixed lines are remote
echo (not errors) and that repo list output is not prefixed.
Docs only. (The global ~/.claude copy of the skill got the same gotcha,
outside the repo.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
- Bash completion now completes repo NAMES for desc/delete/add-remote at
the name position, sourced from `gitctl repo list` (first field, header
row dropped). One ssh call, only at that position, so a stray Tab never
hits the network; the leading -y is handled.
- call_helper prefixes every passthrough line from the helper (and the
sync script it runs) with "server: " via _server_prefixed, so output
like "No changes." reads as remote output instead of interleaved local
noise. quiet=True callers (repo list) still get raw stdout to parse.
Client-only, no helper redeploy needed. Self-test pins _server_prefixed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
- CLAUDE.md: new hard rule that removal functions are exact inverses of
their add counterparts (round-trip self-tests); TRASH_DIR added to the
server constants; verified-live list extended with list-repos and a
full delete cycle.
- README: TRASH_DIR in the server-install constants and its dir note.
- TODO: items 1-3 already marked done; cross-cutting work folded in;
remaining leftovers listed (repo-name completion, the cosmetic
No changes. echo, and the YAGNI gc-trash prune verb).
- Removed all pre-existing em dashes from CLAUDE.md and README.
Docs only, no code change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
gitctl repo delete <name> removes a repo from all three places it lives,
the inverse of repo create:
- gitolite stanza via remove_stanza (inverse of add_stanza), committed
and pushed FIRST so gitolite stops serving the repo before its bytes
move.
- cgit block via the new delete-repo helper verb (remove_repo_block,
inverse of insert_repo_block), backed up and synced.
- the bare repo is MOVED to TRASH_DIR (/var/lib/gitolite3/trash,
timestamped) with a .trashinfo breadcrumb, not rm, so it is
recoverable. A realpath check keeps the move one level under REPO_BASE.
Always confirms; the global -y is deliberately not honored (cmd_delete
never reads a.yes). Idempotent: a piece already gone is skipped.
Partial failure is resumable by re-running, like create. Both inverse
functions are pinned by add/insert-then-remove round-trip self-tests
plus middle/last/missing cases; trash_repo and do_delete_repo run on
temp dirs. Verified live: create then delete round-trips against the
real gitolite.conf, bare repo lands in the trash dir intact.
Helper changed: redeploy gitctl-helper to the server.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
repo create's y/N push confirmation can now be skipped with -y. The flag
is global (top-level parser), so it goes before the subcommand:
gitctl -y repo create ... . The diff is still printed and an
auto-confirmed note shown. -y does NOT bypass SSH key auth (the phase-1
push still needs the password / smartcard touch), so creation is never
fully unattended.
Hard wall: -y is never honored by a future destructive delete; the flag
help, a client comment, and TODO item 1 all record this. Bash completion
offers -y at the top level and transparently skips a leading -y when
resolving the subcommand. Self-test pins the parse round-trip.
Client-only change; the server helper is unchanged, no redeploy needed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
New gitctl repo list / helper list-repos verb. Source of truth is the
bare repos on disk (REPO_BASE/*.git), not cgitrc, so private repos
(absent from cgitrc since cgit auto-discovery is off) show too. Each
repo is tagged PUB/PRIV by cgitrc membership, with its section and a
60-char description from the repo's description file. Client renders an
aligned table, green public / dim private on a TTY.
Adds repo_sections_from() primitive; find_repo_section becomes a thin
lookup over it. Self-tests cover the cgitrc parse and a temp-FS scan.
Updates README, SKILL.md, bash completion (repo list action), TODO.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Thin CLI plus a server helper (run as the git user) to manage repos on a
personal gitolite3 + cgit server over a command=-restricted SSH key. Includes
the client, the helper, bash completion, a Claude Code skill, and docs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|