migrate.go

v1.3.4
Doc Versions Source
1
package store
2
3
import (
4
	"encoding/json"
5
	"fmt"
6
	"os"
7
8
	"go.bigb.es/curator/internal/config"
9
)
10
11
// legacyConfig matches the old config.json format for migration.
12
type legacyConfig struct {
13
	Modules        map[string]config.Module `json:"modules"`
14
	ModulePatterns []legacyPattern          `json:"module_patterns"`
15
}
16
17
type legacyPattern struct {
18
	Pattern string `json:"pattern"`
19
	VCS     string `json:"vcs"`
20
	Repo    string `json:"repo"`
21
	Web     string `json:"web"`
22
	Private bool   `json:"private,omitempty"`
23
}
24
25
// ImportFromConfigFile reads an old config.json and imports modules and patterns into the store.
26
func ImportFromConfigFile(st *Store, path string) (modules int, patterns int, err error) {
27
	data, err := os.ReadFile(path)
28
	if err != nil {
29
		return 0, 0, fmt.Errorf("read config: %w", err)
30
	}
31
32
	var legacy legacyConfig
33
	if err := json.Unmarshal(data, &legacy); err != nil {
34
		return 0, 0, fmt.Errorf("parse config: %w", err)
35
	}
36
37
	tx, err := st.db.Begin()
38
	if err != nil {
39
		return 0, 0, fmt.Errorf("begin transaction: %w", err)
40
	}
41
	defer tx.Rollback()
42
43
	for name, mod := range legacy.Modules {
44
		private := 0
45
		if mod.Private {
46
			private = 1
47
		}
48
		_, err := tx.Exec(st.dialect.importModuleSQL, name, mod.VCS, mod.Repo, mod.Web, private, "")
49
		if err != nil {
50
			return 0, 0, fmt.Errorf("insert module %s: %w", name, err)
51
		}
52
		modules++
53
	}
54
55
	for i, p := range legacy.ModulePatterns {
56
		private := 0
57
		if p.Private {
58
			private = 1
59
		}
60
		_, err := tx.Exec(st.dialect.importPatternSQL, p.Pattern, p.VCS, p.Repo, p.Web, private, i, "")
61
		if err != nil {
62
			return 0, 0, fmt.Errorf("insert pattern %s: %w", p.Pattern, err)
63
		}
64
		patterns++
65
	}
66
67
	if err := tx.Commit(); err != nil {
68
		return 0, 0, fmt.Errorf("commit: %w", err)
69
	}
70
71
	// Refresh the pattern cache after import.
72
	if err := st.refreshPatterns(); err != nil {
73
		return modules, patterns, fmt.Errorf("refresh patterns: %w", err)
74
	}
75
76
	return modules, patterns, nil
77
}
78

Source Files