Compare commits
1 Commits
v0.21.3
...
b3c2d3ae32
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3c2d3ae32 |
@@ -8,7 +8,7 @@ Create a PR on Gitea, wait for CI, and squash-merge it. Push code to both remote
|
||||
5. Create a Gitea PR: `tea pr create --head <branch> --base main`. Reference related issues with `#X`. Only use `Closes #X` if the PR fully resolves the issue.
|
||||
6. Wait for CI to pass: poll Gitea CI status. If CI fails, report the failure and stop — do not merge.
|
||||
7. Once CI passes, squash-merge on Gitea: `tea pr merge <index> --style squash` with a clean, semantic commit message including the PR number. No Claude attribution lines.
|
||||
8. Update local main and push to both remotes. If in a worktree, `main` is checked out in the primary tree, so run from there: `cd <primary-worktree> && git pull gitea main && git push origin main` (the primary worktree path is the repo root without `.claude/worktrees/…`). If not in a worktree: `git checkout main && git pull gitea main && git push origin main`.
|
||||
8. Update local main and push to both remotes: `git checkout main && git pull gitea main && git push origin main`.
|
||||
9. Clean up remote branches: `git push gitea --delete <branch> && git push origin --delete <branch>`.
|
||||
10. Prune refs: `git remote prune gitea && git remote prune origin`.
|
||||
11. Report the merged PR URL.
|
||||
|
||||
32
context.go
32
context.go
@@ -25,7 +25,7 @@ type Context struct {
|
||||
app *V
|
||||
view func() h.H
|
||||
routeParams map[string]string
|
||||
parentPageCtx *Context
|
||||
parentPageCtx *Context
|
||||
patchChan chan patch
|
||||
actionLimiter *rate.Limiter
|
||||
actionRegistry map[string]actionEntry
|
||||
@@ -39,9 +39,9 @@ type Context struct {
|
||||
subscriptions []Subscription
|
||||
subsMu sync.Mutex
|
||||
disposeOnce sync.Once
|
||||
createdAt time.Time
|
||||
sseConnected atomic.Bool
|
||||
sseDisconnectedAt atomic.Pointer[time.Time]
|
||||
createdAt time.Time
|
||||
sseConnected atomic.Bool
|
||||
sseDisconnectedAt atomic.Pointer[time.Time]
|
||||
}
|
||||
|
||||
// View defines the UI rendered by this context.
|
||||
@@ -630,17 +630,17 @@ func newContext(id string, route string, v *V) *Context {
|
||||
}
|
||||
|
||||
return &Context{
|
||||
id: id,
|
||||
route: route,
|
||||
csrfToken: genCSRFToken(),
|
||||
routeParams: make(map[string]string),
|
||||
app: v,
|
||||
actionLimiter: newLimiter(v.actionRateLimit, defaultActionRate, defaultActionBurst),
|
||||
actionRegistry: make(map[string]actionEntry),
|
||||
signals: new(sync.Map),
|
||||
patchChan: make(chan patch, 8),
|
||||
ctxDisposedChan: make(chan struct{}, 1),
|
||||
pageStopChan: make(chan struct{}),
|
||||
createdAt: time.Now(),
|
||||
id: id,
|
||||
route: route,
|
||||
csrfToken: genCSRFToken(),
|
||||
routeParams: make(map[string]string),
|
||||
app: v,
|
||||
actionLimiter: newLimiter(v.actionRateLimit, defaultActionRate, defaultActionBurst),
|
||||
actionRegistry: make(map[string]actionEntry),
|
||||
signals: new(sync.Map),
|
||||
patchChan: make(chan patch, 8),
|
||||
ctxDisposedChan: make(chan struct{}, 1),
|
||||
pageStopChan: make(chan struct{}),
|
||||
createdAt: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ func main() {
|
||||
|
||||
v.Config(via.Options{
|
||||
LogLevel: via.LogLevelDebug,
|
||||
DevMode: true,
|
||||
Plugins: []via.Plugin{
|
||||
DevMode: true,
|
||||
Plugins: []via.Plugin{
|
||||
// picocss.Default,
|
||||
},
|
||||
})
|
||||
|
||||
@@ -6,9 +6,9 @@ import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"github.com/ryanhamamura/via"
|
||||
"github.com/ryanhamamura/via/h"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
|
||||
type DataSource interface {
|
||||
|
||||
@@ -316,7 +316,7 @@ type Marker struct {
|
||||
type Popup struct {
|
||||
Content string // HTML content
|
||||
LngLat LngLat
|
||||
HideCloseButton bool // true removes the close button (MapLibre shows it by default)
|
||||
HideCloseButton bool // true removes the close button (MapLibre shows it by default)
|
||||
MaxWidth string
|
||||
}
|
||||
|
||||
|
||||
@@ -81,8 +81,8 @@ func TestStaticAutoSlash(t *testing.T) {
|
||||
|
||||
func TestStaticFS(t *testing.T) {
|
||||
fsys := fstest.MapFS{
|
||||
"style.css": {Data: []byte("body{}")},
|
||||
"js/app.js": {Data: []byte("console.log('hi')")},
|
||||
"style.css": {Data: []byte("body{}")},
|
||||
"js/app.js": {Data: []byte("console.log('hi')")},
|
||||
}
|
||||
|
||||
v := New()
|
||||
|
||||
8
via.go
8
via.go
@@ -240,10 +240,10 @@ func (v *V) page(route string, raw, wrapped func(*Context)) {
|
||||
bodyElements = append(bodyElements, h.Raw("<dataspa-inspector/>"))
|
||||
}
|
||||
view := h.HTML5(h.HTML5Props{
|
||||
Title: v.cfg.DocumentTitle,
|
||||
Head: headElements,
|
||||
Body: bodyElements,
|
||||
})
|
||||
Title: v.cfg.DocumentTitle,
|
||||
Head: headElements,
|
||||
Body: bodyElements,
|
||||
})
|
||||
_ = view.Render(w)
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -134,9 +134,9 @@ func TestAction(t *testing.T) {
|
||||
|
||||
func TestEventTypes(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attr string
|
||||
buildEl func(trigger *actionTrigger) h.H
|
||||
name string
|
||||
attr string
|
||||
buildEl func(trigger *actionTrigger) h.H
|
||||
}{
|
||||
{"OnSubmit", "data-on:submit", func(tr *actionTrigger) h.H { return h.Form(tr.OnSubmit()) }},
|
||||
{"OnInput", "data-on:input", func(tr *actionTrigger) h.H { return h.Input(tr.OnInput()) }},
|
||||
|
||||
Reference in New Issue
Block a user