woodpecker/cli/common/hooks.go

69 lines
1.7 KiB
Go

package common
import (
"context"
"errors"
"time"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v3"
"go.woodpecker-ci.org/woodpecker/v3/cli/internal/config"
"go.woodpecker-ci.org/woodpecker/v3/cli/update"
)
var (
waitForUpdateCheck context.Context
cancelWaitForUpdate context.CancelCauseFunc
)
func Before(ctx context.Context, c *cli.Command) (context.Context, error) {
if err := setupGlobalLogger(ctx, c); err != nil {
return ctx, err
}
go func(context.Context) {
if c.Bool("disable-update-check") {
return
}
// Don't check for updates when the update command is executed
if firstArg := c.Args().First(); firstArg == "update" {
return
}
waitForUpdateCheck, cancelWaitForUpdate = context.WithCancelCause(context.Background())
defer cancelWaitForUpdate(errors.New("update check finished"))
log.Debug().Msg("checking for updates ...")
newVersion, err := update.CheckForUpdate(waitForUpdateCheck, false) //nolint:contextcheck
if err != nil {
log.Error().Err(err).Msgf("failed to check for updates")
return
}
if newVersion != nil {
log.Warn().Msgf("new version of woodpecker-cli is available: %s, update with: %s update", newVersion.Version, c.Root().Name)
} else {
log.Debug().Msgf("no update required")
}
}(ctx)
return ctx, config.Load(ctx, c)
}
func After(_ context.Context, _ *cli.Command) error {
if waitForUpdateCheck != nil {
select {
case <-waitForUpdateCheck.Done():
// When the actual command already finished, we still wait 500ms for the update check to finish
case <-time.After(time.Millisecond * 500):
log.Debug().Msg("update check stopped due to timeout")
cancelWaitForUpdate(errors.New("update check timeout"))
}
}
return nil
}