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/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software: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/web/releases.go +4−1

@@ -49,7 +49,8 @@ func (w *Web) Releases(rw http.ResponseWriter, r *http.Request) {
49 49 Name string
50 50 Tags []git.Tag
51 51 Lightweight int
52 }{w.page(r, m.Name+" · releases"), m.Name, tags, light}, 0)
52 CanManage bool
53 }{w.page(r, m.Name+" · releases"), m.Name, tags, light, w.canManageReleases(r, m)}, 0)
53 54 }
54 55
55 56 func (w *Web) ReleaseView(rw http.ResponseWriter, r *http.Request) {
@@ -111,6 +112,7 @@ func (w *Web) ReleaseView(rw http.ResponseWriter, r *http.Request) {
111 112 LFSPointers bool
112 113 Artifacts []metadata.Artifact
113 114 ArtifactBytes int64
115 CanEdit bool
114 116 }{
115 117 Page: w.page(r, m.Name+" · "+t.Name),
116 118 Name: m.Name,
@@ -124,6 +126,7 @@ func (w *Web) ReleaseView(rw http.ResponseWriter, r *http.Request) {
124 126 LFSPointers: lfsPointers,
125 127 Artifacts: artifacts,
126 128 ArtifactBytes: artifactBytes,
129 CanEdit: w.canManageReleases(r, m) && t.Annotated && len(artifacts) == 0,
127 130 }, 0)
128 131 }
129 132