Compare commits

...

4 Commits

Author SHA1 Message Date
agent-company ca49cdbbf3 feat: add GET /issues/new handler to serve create-issue form
Register GET /issues/new route and implement NewIssue handler that
fetches orgs/repos via ListOrgsAndRepos and renders the existing
create_issue.html template. Supports HTMX partial responses.

Closes leeworks-agents/gitea-mobile#28

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 17:06:45 +00:00
AI-Manager 919a91d6aa Merge pull request 'feat: implement issue and PR detail handlers' (#27) from feature/issue-pr-detail-handlers into master
Build and Push / test (push) Has been cancelled
Build and Push / build (push) Has been cancelled
2026-03-26 11:04:40 +00:00
AI-Manager 3c9a947017 Merge pull request 'fix: replace $GITHUB_OUTPUT with inline env vars in CI' (#26) from fix/remove-github-output into master
Build and Push / test (push) Has been cancelled
Build and Push / build (push) Has been cancelled
2026-03-26 11:04:28 +00:00
agent-company cc90857cf5 fix: replace $GITHUB_OUTPUT with inline env vars in CI workflow
Collapse Set image tag, Build Docker image, and Push image steps into
a single step that computes TAG inline, eliminating the dependency on
$GITHUB_OUTPUT which is not reliably available in Gitea Actions runners.
Also moves registry login before the build+push step for correct ordering.

Closes leeworks-agents/gitea-mobile#25

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 10:03:14 +00:00
2 changed files with 44 additions and 15 deletions
+8 -15
View File
@@ -24,25 +24,18 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set image tag
id: tag
run: |
TIMESTAMP=$(date +%Y%m%d%H%M%S)
SHA=$(echo ${{ gitea.sha }} | cut -c1-7)
echo "tag=${TIMESTAMP}-${SHA}" >> $GITHUB_OUTPUT
- name: Build Docker image
run: |
docker build -t gitea.leeworks.dev/0xwheatyz/gitea-mobile:${{ steps.tag.outputs.tag }} .
docker tag gitea.leeworks.dev/0xwheatyz/gitea-mobile:${{ steps.tag.outputs.tag }} \
gitea.leeworks.dev/0xwheatyz/gitea-mobile:latest
- name: Login to Gitea registry - name: Login to Gitea registry
run: | run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login gitea.leeworks.dev \ echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login gitea.leeworks.dev \
-u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
- name: Push image - name: Build and push Docker image
run: | run: |
docker push gitea.leeworks.dev/0xwheatyz/gitea-mobile:${{ steps.tag.outputs.tag }} TIMESTAMP=$(date +%Y%m%d%H%M%S)
SHA=$(echo ${{ gitea.sha }} | cut -c1-7)
TAG="${TIMESTAMP}-${SHA}"
docker build -t gitea.leeworks.dev/0xwheatyz/gitea-mobile:${TAG} .
docker tag gitea.leeworks.dev/0xwheatyz/gitea-mobile:${TAG} \
gitea.leeworks.dev/0xwheatyz/gitea-mobile:latest
docker push gitea.leeworks.dev/0xwheatyz/gitea-mobile:${TAG}
docker push gitea.leeworks.dev/0xwheatyz/gitea-mobile:latest docker push gitea.leeworks.dev/0xwheatyz/gitea-mobile:latest
+36
View File
@@ -38,6 +38,7 @@ func (h *Handler) RegisterRoutes(mux *http.ServeMux) {
// Issues. // Issues.
mux.HandleFunc("GET /issues", h.ListIssues) mux.HandleFunc("GET /issues", h.ListIssues)
mux.HandleFunc("GET /issues/new", h.NewIssue)
mux.HandleFunc("POST /issues", h.CreateIssue) mux.HandleFunc("POST /issues", h.CreateIssue)
mux.HandleFunc("POST /issues/{owner}/{repo}/{index}/labels", h.ApplyLabels) mux.HandleFunc("POST /issues/{owner}/{repo}/{index}/labels", h.ApplyLabels)
@@ -444,6 +445,41 @@ func (h *Handler) PullDetail(w http.ResponseWriter, r *http.Request) {
renderPage(w, r, fmt.Sprintf("PR #%d", index), "pulls", buf.String()) renderPage(w, r, fmt.Sprintf("PR #%d", index), "pulls", buf.String())
} }
// NewIssue handles GET /issues/new — renders the create-issue form.
func (h *Handler) NewIssue(w http.ResponseWriter, r *http.Request) {
token := getToken(r)
repos, err := h.Client.ListOrgsAndRepos(r.Context(), token)
if err != nil {
slog.Error("failed to list repos for new issue form", "error", err)
renderPage(w, r, "New Issue", "issues",
`<h1>New Issue</h1><p class="empty">Error loading repositories.</p>`)
return
}
tmpl, err := template.ParseFiles("internal/templates/create_issue.html")
if err != nil {
slog.Error("failed to parse create_issue template", "error", err)
http.Error(w, "template error", http.StatusInternalServerError)
return
}
type templateData struct {
Repos map[string][]giteaclient.Repo
}
data := templateData{Repos: repos}
var buf strings.Builder
if err := tmpl.ExecuteTemplate(&buf, "content", data); err != nil {
slog.Error("failed to execute create_issue template", "error", err)
http.Error(w, "template error", http.StatusInternalServerError)
return
}
renderPage(w, r, "New Issue", "issues", buf.String())
}
// CreateIssue handles POST /issues. // CreateIssue handles POST /issues.
func (h *Handler) CreateIssue(w http.ResponseWriter, r *http.Request) { func (h *Handler) CreateIssue(w http.ResponseWriter, r *http.Request) {
token := getToken(r) token := getToken(r)