Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Create and edit releases from the browser

ec34301375902f6b08c0171bf91b98cbcc55c63c · Keenan Nemetz · 15d ago · parent 09b15120

Create and edit releases from the browser

Maintainers get a New release form that writes the same annotated tag the CLI writes: tag name, target commit, and notes become the tag message, with the account as tagger. Edit notes rewrites the tag message only while no artifact is attached, matching the release-immutability rule; lightweight tags and releases with files stay locked. Tag names are validated, existing tags are refused, reserved page names are rejected, and both actions are audited.

server/server.go +4

@@ -224,6 +224,10 @@ func (s *Server) routes() *http.ServeMux {
224 224 mux.HandleFunc("POST /r/{name}/settings/rename", w.RenameRepository)
225 225 mux.HandleFunc("POST /r/{name}/settings/delete", w.DeleteRepository)
226 226 mux.HandleFunc("GET /r/{name}/releases", w.Releases)
227 mux.HandleFunc("GET /r/{name}/releases/new", w.ReleaseNewPage)
228 mux.HandleFunc("POST /r/{name}/releases", w.CreateRelease)
229 mux.HandleFunc("GET /r/{name}/releases/edit", w.ReleaseEditPage)
230 mux.HandleFunc("POST /r/{name}/releases/edit", w.UpdateRelease)
227 231 mux.HandleFunc("GET /r/{name}/releases/{tag...}", w.ReleaseView)
228 232 mux.HandleFunc("GET /r/{name}/releases/{tag}/archive.tar", w.ReleaseTar)
229 233 mux.HandleFunc("GET /r/{name}/releases/{tag}/archive.tar.gz", w.ReleaseTarGz)