support config clone timeout, do upgrades
This commit is contained in:
2
internal/cache/cache.go
vendored
2
internal/cache/cache.go
vendored
@ -122,7 +122,7 @@ func (c *Cache) Read() error {
|
||||
d.Decode(c)
|
||||
|
||||
// Perform migrations
|
||||
err, migrated := c.doMigrations()
|
||||
migrated, err := c.doMigrations()
|
||||
if err != nil {
|
||||
c.log.Error("Failed to run cache migrations",
|
||||
c.log.Args(
|
||||
|
14
internal/cache/cache_migrations.go
vendored
14
internal/cache/cache_migrations.go
vendored
@ -11,7 +11,7 @@ import (
|
||||
|
||||
// Migrations funcs should return errors along with
|
||||
// number of records updated
|
||||
type migrationFunc func(c *Cache) (error, int)
|
||||
type migrationFunc func(c *Cache) (int, error)
|
||||
|
||||
// Registry of migrations by version
|
||||
var migrations = map[string]map[string]migrationFunc{
|
||||
@ -24,20 +24,20 @@ var migrations = map[string]map[string]migrationFunc{
|
||||
// of cache read from disk.
|
||||
// Does not check to ensure migrations were successful,
|
||||
// only checks if a version has been achieved
|
||||
func (c *Cache) DoMigrations() (error, int) {
|
||||
func (c *Cache) DoMigrations() (int, error) {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
return c.doMigrations()
|
||||
}
|
||||
|
||||
func (c *Cache) doMigrations() (error, int) {
|
||||
func (c *Cache) doMigrations() (int, error) {
|
||||
var errs error
|
||||
var migrated int
|
||||
for version, migrationFuncs := range migrations {
|
||||
var funcMigrated int
|
||||
if semver.Compare(c.CacheVersion, version) < 0 {
|
||||
for name, migration := range migrationFuncs {
|
||||
err, numMigrated := migration(c)
|
||||
numMigrated, err := migration(c)
|
||||
if err != nil {
|
||||
errs = errors.Join(
|
||||
errs,
|
||||
@ -57,10 +57,10 @@ func (c *Cache) doMigrations() (error, int) {
|
||||
migrated += funcMigrated
|
||||
}
|
||||
|
||||
return errs, migrated
|
||||
return migrated, errs
|
||||
}
|
||||
|
||||
func v010_aliases(c *Cache) (error, int) {
|
||||
func v010_aliases(c *Cache) (int, error) {
|
||||
var aliasesMigrated int
|
||||
var errs error
|
||||
for i, a := range c.Aliases {
|
||||
@ -74,5 +74,5 @@ func v010_aliases(c *Cache) (error, int) {
|
||||
aliasesMigrated++
|
||||
}
|
||||
}
|
||||
return errs, aliasesMigrated
|
||||
return aliasesMigrated, errs
|
||||
}
|
||||
|
4
internal/cache/projects_git.go
vendored
4
internal/cache/projects_git.go
vendored
@ -9,14 +9,12 @@ import (
|
||||
"gitea.libretechconsulting.com/rmcguire/git-project-manager/internal/remotes/projects"
|
||||
)
|
||||
|
||||
const gitCloneTimeoutSecs = 60
|
||||
|
||||
// Will either read in the current repo, preparing a report
|
||||
// on its current state, or will clone the project if it has not
|
||||
// already been cloned in its path
|
||||
func (c *Cache) OpenProject(ctx context.Context, project *projects.Project) *git.Repository {
|
||||
path := c.GetProjectPath(project)
|
||||
cloneCtx, cncl := context.WithDeadline(ctx, time.Now().Add(gitCloneTimeoutSecs*time.Second))
|
||||
cloneCtx, cncl := context.WithDeadline(ctx, time.Now().Add(c.config.GetCloneTimeout()))
|
||||
defer cncl()
|
||||
|
||||
var repo *git.Repository
|
||||
|
@ -1,6 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitea.libretechconsulting.com/rmcguire/git-project-manager/internal/remotes/info"
|
||||
@ -9,14 +10,17 @@ import (
|
||||
type Config struct {
|
||||
// Named keys above maintained for backwards compatibility
|
||||
// Ideally only Gitlabs is used
|
||||
Remotes []info.RemoteInfo
|
||||
LogLevel string `yaml:"logLevel" json:"logLevel" enum:"info,warn,debug,error"`
|
||||
ProjectPath string `yaml:"projectPath" json:"projectPath"`
|
||||
Cache cacheConfig `yaml:"cache" json:"cache"`
|
||||
Dump struct {
|
||||
Full bool `yaml:"full" json:"full"`
|
||||
Remotes []info.RemoteInfo `yaml:"remotes" json:"remotes,omitempty"`
|
||||
LogLevel string `yaml:"logLevel" json:"logLevel,omitempty" enum:"info,warn,debug,error"`
|
||||
ProjectPath string `yaml:"projectPath" json:"projectPath,omitempty"`
|
||||
Cache cacheConfig `yaml:"cache" json:"cache"`
|
||||
CloneTimeout string `yaml:"cloneTimeout" json:"cloneTimeout,omitempty" default:"120s"`
|
||||
cloneTimeout time.Duration
|
||||
Dump struct {
|
||||
Full bool `yaml:"full" json:"full,omitempty"`
|
||||
} `yaml:"dump" json:"dump"`
|
||||
Editor editorConfig `yaml:"editor" json:"editor"`
|
||||
lock *sync.RWMutex
|
||||
}
|
||||
|
||||
type editorConfig struct {
|
||||
@ -39,12 +43,13 @@ type cacheConfig struct {
|
||||
} `yaml:"unlock" json:"unlock"`
|
||||
Clear struct {
|
||||
ClearAliases bool `yaml:"clearAliases,omitempty" json:"clearAliases,omitempty"`
|
||||
} `yaml:"clear,omitempty" json:"clear,omitempty"`
|
||||
} `yaml:"clear" json:"clear"`
|
||||
}
|
||||
|
||||
var DefaultConfig = Config{
|
||||
LogLevel: "warn",
|
||||
ProjectPath: "~/work/projects",
|
||||
LogLevel: "warn",
|
||||
ProjectPath: "~/work/projects",
|
||||
CloneTimeout: "120s",
|
||||
Remotes: []info.RemoteInfo{{
|
||||
Host: "https://gitlab.com",
|
||||
Token: "yourtokenhere",
|
||||
@ -59,3 +64,29 @@ var DefaultConfig = Config{
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func NewConfig() *Config {
|
||||
return &Config{
|
||||
lock: &sync.RWMutex{},
|
||||
}
|
||||
}
|
||||
|
||||
// Perform updates to config
|
||||
func (c *Config) Prepare() (err error) {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
if c.CloneTimeout == "" {
|
||||
c.CloneTimeout = DefaultConfig.CloneTimeout
|
||||
}
|
||||
|
||||
c.cloneTimeout, err = time.ParseDuration(c.CloneTimeout)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *Config) GetCloneTimeout() time.Duration {
|
||||
c.lock.RLock()
|
||||
defer c.lock.RUnlock()
|
||||
|
||||
return c.cloneTimeout
|
||||
}
|
||||
|
Reference in New Issue
Block a user