Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,15 @@ jobs:
tag: ${{ env.BUILD_TAG }}
is_nightly: ${{ inputs.is_nightly || 'false' }}
run: |
# Detect nightly builds and mark as pre-release
# Detect pre-release builds (nightly, alpha, beta, rc, etc.)
# Any tag with a hyphen after the version (e.g. v2.10.0-beta2) is pre-release
VERSION="${tag#v}"
if [[ "$is_nightly" == "true" ]] || [[ "$tag" == *"nightly"* ]]; then
PRERELEASE="--prerelease"
TITLE="Nightly Build ${tag}"
elif [[ "$VERSION" == *-* ]]; then
PRERELEASE="--prerelease"
TITLE="${tag}"
else
PRERELEASE=""
TITLE="${tag}"
Expand Down
59 changes: 59 additions & 0 deletions .github/workflows/publish-update-manifest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Publish update manifest
on:
release:
types: [published]

permissions:
contents: read

jobs:
publish:
# Only publish manifest for stable releases (no pre-releases like v2.10.0-rc3)
if: ${{ !github.event.release.prerelease }}
runs-on: ubuntu-latest
timeout-minutes: 10
name: Publish update manifest to CDN
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
scripts/generate-update-manifest/
go.mod
go.sum
sparse-checkout-cone-mode: false
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: false
- name: Download release assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
mkdir -p _assets
gh release download "${{ github.event.release.tag_name }}" --dir _assets \
--pattern "zaparoo-*.tar.gz" \
--pattern "zaparoo-*.zip"
- name: Generate checksums and manifest
env:
RELEASE_NOTES: ${{ github.event.release.body }}
run: |
cd _assets && sha256sum * > checksums.txt && cd ..
go run scripts/generate-update-manifest/main.go \
--version "${{ github.event.release.tag_name }}" \
--assets-dir _assets \
--release-notes "$RELEASE_NOTES" \
--output _assets/manifest.yaml
- name: Upload to Bunny.net storage
uses: R-J-dev/bunny-deploy@v2.1.1
with:
storage-zone-password: ${{ secrets.BUNNY_STORAGE_ZONE_PASSWORD }}
storage-endpoint: "https://storage.bunnycdn.com"
storage-zone-name: ${{ secrets.BUNNY_STORAGE_ZONE }}
directory-to-upload: "_assets"
target-directory: "ZaparooProject/zaparoo-core"
concurrency: "10"
access-key: ${{ secrets.BUNNY_API_KEY }}
pull-zone-id: ${{ secrets.BUNNY_PULL_ZONE_ID }}
enable-purge-pull-zone: true
replication-timeout: "15000"
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ git commit -m "add reader support" # Missing type prefix

Before committing: run `task lint-fix` then `task test`.

Pull requests should NOT include a test plan section.

## When Stuck

Don't guess — ask for help or gather more information first.
Expand Down
2 changes: 1 addition & 1 deletion cmd/batocera/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func run() error {
)

svc, err := daemon.NewService(daemon.ServiceArgs{
Entry: func() (func() error, <-chan struct{}, error) {
Entry: func() (*service.StartResult, error) {
return service.Start(pl, cfg)
},
Platform: pl,
Expand Down
2 changes: 1 addition & 1 deletion cmd/libreelec/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func run() error {
cfg := cli.Setup(pl, config.BaseDefaults, nil)

svc, err := daemon.NewService(daemon.ServiceArgs{
Entry: func() (func() error, <-chan struct{}, error) {
Entry: func() (*service.StartResult, error) {
return service.Start(pl, cfg)
},
Platform: pl,
Expand Down
33 changes: 23 additions & 10 deletions cmd/mac/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import (
"github.com/ZaparooProject/zaparoo-core/v2/pkg/config"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/platforms/mac"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service/restart"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/ui/systray"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/ui/tui"
"github.com/rs/zerolog/log"
Expand Down Expand Up @@ -104,23 +105,15 @@ func run() error {

flags.Post(cfg, pl)

var stopSvc func() error
var svcDone <-chan struct{}
var svcResult *service.StartResult
if !client.IsServiceRunning(cfg) {
log.Info().Msg("starting new service instance")
var err error
stopSvc, svcDone, err = service.Start(pl, cfg)
svcResult, err = service.Start(pl, cfg)
if err != nil {
log.Error().Msgf("error starting service: %s", err)
return fmt.Errorf("error starting service: %w", err)
}

defer func() {
err := stopSvc()
if err != nil {
log.Error().Msgf("error stopping service: %s", err)
}
}()
} else {
log.Info().
Int("port", cfg.APIPort()).
Expand Down Expand Up @@ -164,11 +157,31 @@ func run() error {
exit <- true
}

var svcDone <-chan struct{}
if svcResult != nil {
svcDone = svcResult.Done
}

stopSvc := func() {
if svcResult != nil {
if err := svcResult.Stop(); err != nil {
log.Error().Msgf("error stopping service: %s", err)
}
}
}

select {
case <-sigs:
stopSvc()
case <-exit:
stopSvc()
case <-svcDone:
log.Info().Msg("service shut down internally")
if svcResult != nil {
if err := restart.ExecIfRequested(svcResult.RestartRequested); err != nil {
return fmt.Errorf("failed to re-exec for restart: %w", err)
}
}
}

return nil
Expand Down
2 changes: 1 addition & 1 deletion cmd/mister/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func run() error {
}

svc, err := daemon.NewService(daemon.ServiceArgs{
Entry: func() (func() error, <-chan struct{}, error) {
Entry: func() (*service.StartResult, error) {
return service.Start(pl, cfg)
},
Platform: pl,
Expand Down
2 changes: 1 addition & 1 deletion cmd/mistex/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func run() error {
)

svc, err := daemon.NewService(daemon.ServiceArgs{
Entry: func() (func() error, <-chan struct{}, error) {
Entry: func() (*service.StartResult, error) {
return service.Start(pl, cfg)
},
Platform: pl,
Expand Down
19 changes: 11 additions & 8 deletions cmd/recalbox/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import (
"github.com/ZaparooProject/zaparoo-core/v2/pkg/config"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/platforms/recalbox"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service/restart"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
Expand Down Expand Up @@ -95,22 +96,24 @@ func run() error {

flags.Post(cfg, pl)

stop, done, err := service.Start(pl, cfg)
svcResult, err := service.Start(pl, cfg)
if err != nil {
log.Error().Err(err).Msg("error starting service")
return fmt.Errorf("error starting service: %w", err)
}

select {
case <-sigs:
case <-done:
err = svcResult.Stop()
if err != nil {
log.Error().Err(err).Msg("error stopping service")
return fmt.Errorf("error stopping service: %w", err)
}
case <-svcResult.Done:
log.Info().Msg("service shut down internally")
}

err = stop()
if err != nil {
log.Error().Err(err).Msg("error stopping service")
return fmt.Errorf("error stopping service: %w", err)
if err := restart.ExecIfRequested(svcResult.RestartRequested); err != nil {
return fmt.Errorf("failed to re-exec for restart: %w", err)
}
}

return nil
Expand Down
19 changes: 11 additions & 8 deletions cmd/retropie/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import (
"github.com/ZaparooProject/zaparoo-core/v2/pkg/config"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/platforms/retropie"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service/restart"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
Expand Down Expand Up @@ -95,22 +96,24 @@ func run() error {

flags.Post(cfg, pl)

stop, done, err := service.Start(pl, cfg)
svcResult, err := service.Start(pl, cfg)
if err != nil {
log.Error().Err(err).Msg("error starting service")
return fmt.Errorf("error starting service: %w", err)
}

select {
case <-sigs:
case <-done:
err = svcResult.Stop()
if err != nil {
log.Error().Err(err).Msg("error stopping service")
return fmt.Errorf("error stopping service: %w", err)
}
case <-svcResult.Done:
log.Info().Msg("service shut down internally")
}

err = stop()
if err != nil {
log.Error().Err(err).Msg("error stopping service")
return fmt.Errorf("error stopping service: %w", err)
if err := restart.ExecIfRequested(svcResult.RestartRequested); err != nil {
return fmt.Errorf("failed to re-exec for restart: %w", err)
}
}

return nil
Expand Down
21 changes: 14 additions & 7 deletions cmd/windows/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import (
"github.com/ZaparooProject/zaparoo-core/v2/pkg/helpers"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/platforms/windows"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/service/restart"
"github.com/ZaparooProject/zaparoo-core/v2/pkg/ui/systray"
"github.com/rs/zerolog/log"
syswindows "golang.org/x/sys/windows"
Expand Down Expand Up @@ -154,7 +155,7 @@ func run() error {
return errors.New("zaparoo is already running")
}

stopSvc, svcDone, err := service.Start(pl, cfg)
svcResult, err := service.Start(pl, cfg)
if err != nil {
log.Error().Msgf("error starting service: %s", err)
return fmt.Errorf("error starting service: %w", err)
Expand All @@ -178,14 +179,20 @@ func run() error {

select {
case <-sigs:
err = svcResult.Stop()
if err != nil {
log.Error().Msgf("error stopping service: %s", err)
}
case <-exit:
case <-svcDone:
err = svcResult.Stop()
if err != nil {
log.Error().Msgf("error stopping service: %s", err)
}
case <-svcResult.Done:
log.Info().Msg("service shut down internally")
}

err = stopSvc()
if err != nil {
log.Error().Msgf("error stopping service: %s", err)
if err := restart.ExecIfRequested(svcResult.RestartRequested); err != nil {
return fmt.Errorf("failed to re-exec for restart: %w", err)
}
}

return nil
Expand Down
Loading
Loading