Skip to content
This repository was archived by the owner on Jan 16, 2021. It is now read-only.

Commit ec3bb16

Browse files
committed
Merge pull request #24 from pavanka/migrate
add migrate command to upgrate to preferred config format
2 parents e3bae97 + 8bda36a commit ec3bb16

File tree

4 files changed

+164
-2
lines changed

4 files changed

+164
-2
lines changed

commands.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ http://parse.com`,
3434
c.AddCommand(newJsSdkCmd(e))
3535
c.AddCommand(newListCmd(e))
3636
c.AddCommand(newLogsCmd(e))
37+
c.AddCommand(newMigrateCmd(e))
3738
c.AddCommand(newNewCmd(e))
3839
c.AddCommand(newReleasesCmd(e))
3940
c.AddCommand(newRollbackCmd(e))

config.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ func configFromDir(dir string) (config, error) {
6868
}
6969
if l != nil { // legacy config format
7070
projectConfig := &projectConfig{
71-
Type: legacyParseFormat,
72-
Parse: &parseProjectConfig{JSSDK: l.Global.ParseVersion},
71+
Type: legacyParseFormat,
72+
Parse: &parseProjectConfig{
73+
JSSDK: l.Global.ParseVersion,
74+
},
75+
ParserEmail: l.Global.ParserEmail,
7376
}
7477
applications := l.Applications
7578
if applications == nil {

migrate_cmd.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
8+
"github.com/facebookgo/stackerr"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
type migrateCmd struct {
13+
retainMaster bool
14+
}
15+
16+
func (m *migrateCmd) upgradeLegacy(e *env, c config) (*parseConfig, error) {
17+
p := c.getProjectConfig()
18+
if p.Type != legacyParseFormat {
19+
return nil, stackerr.New("Already using the preferred config format.")
20+
}
21+
p.Type = parseFormat
22+
config, ok := (c).(*parseConfig)
23+
if !ok {
24+
return nil, stackerr.Newf("Unexpected config format: %d", p.Type)
25+
}
26+
if !m.retainMaster {
27+
for _, app := range config.Applications {
28+
app.MasterKey = ""
29+
}
30+
}
31+
return config, nil
32+
}
33+
34+
func (m *migrateCmd) run(e *env) error {
35+
c, err := configFromDir(e.Root)
36+
if err != nil {
37+
return err
38+
}
39+
40+
c, err = m.upgradeLegacy(e, c)
41+
if err != nil {
42+
return err
43+
}
44+
localErr := storeConfig(e, c)
45+
projectErr := storeProjectConfig(e, c)
46+
if localErr == nil && projectErr == nil {
47+
legacy := filepath.Join(e.Root, legacyConfigFile)
48+
err := os.Remove(legacy)
49+
if err != nil {
50+
fmt.Fprintf(e.Err, "Could not delete: %q. Please remove this file manually.\n", legacy)
51+
}
52+
} else {
53+
local := filepath.Join(e.Root, parseLocal)
54+
err := os.Remove(local)
55+
if err != nil {
56+
fmt.Fprintf(e.Err, "Failed to clean up: %q. Please remove this file manually.\n", local)
57+
}
58+
project := filepath.Join(e.Root, parseProject)
59+
err = os.Remove(project)
60+
if err != nil {
61+
fmt.Fprintf(e.Err, "Failed to clean up: %q. Please remove this file manually.\n", project)
62+
}
63+
}
64+
return nil
65+
}
66+
67+
func newMigrateCmd(e *env) *cobra.Command {
68+
var m migrateCmd
69+
cmd := &cobra.Command{
70+
Use: "migrate",
71+
Short: "Migrate project config format to preferred format",
72+
Long: `Use this on projects with legacy config format to migrate
73+
to the preferred format.
74+
`,
75+
Run: runNoArgs(e, m.run),
76+
}
77+
cmd.Flags().BoolVarP(&m.retainMaster, "retain", "r", m.retainMaster,
78+
"Retain any master keys present in config during migration")
79+
return cmd
80+
}

migrate_cmd_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package main
2+
3+
import (
4+
"regexp"
5+
"testing"
6+
7+
"github.com/facebookgo/ensure"
8+
)
9+
10+
func TestUpgradeLegacyNoOp(t *testing.T) {
11+
t.Parallel()
12+
13+
h := newHarness(t)
14+
defer h.Stop()
15+
16+
var m migrateCmd
17+
c := &parseConfig{projectConfig: &projectConfig{Type: parseFormat}}
18+
_, err := m.upgradeLegacy(h.env, c)
19+
ensure.Err(t, err, regexp.MustCompile("Already using the preferred config format."))
20+
}
21+
22+
func TestUpgradeLegacyRetainMaster(t *testing.T) {
23+
t.Parallel()
24+
25+
h := newHarness(t)
26+
defer h.Stop()
27+
28+
m := migrateCmd{retainMaster: true}
29+
c := &parseConfig{
30+
Applications: map[string]*parseAppConfig{
31+
"app": {ApplicationID: "a", MasterKey: "m"},
32+
},
33+
projectConfig: &projectConfig{Type: legacyParseFormat},
34+
}
35+
config, err := m.upgradeLegacy(h.env, c)
36+
ensure.Nil(t, err)
37+
ensure.DeepEqual(t, config.Applications["app"].MasterKey, "m")
38+
}
39+
40+
func TestUpgradeLegacy(t *testing.T) {
41+
t.Parallel()
42+
43+
h := newHarness(t)
44+
defer h.Stop()
45+
46+
m := migrateCmd{retainMaster: false}
47+
c := &parseConfig{
48+
Applications: map[string]*parseAppConfig{
49+
"app": {ApplicationID: "a", MasterKey: "m"},
50+
},
51+
projectConfig: &projectConfig{Type: legacyParseFormat},
52+
}
53+
config, err := m.upgradeLegacy(h.env, c)
54+
ensure.Nil(t, err)
55+
ensure.DeepEqual(t, config.Applications["app"].MasterKey, "")
56+
}
57+
58+
func TestUpgradeLegacyWithEmail(t *testing.T) {
59+
t.Parallel()
60+
61+
h := newHarness(t)
62+
defer h.Stop()
63+
64+
m := migrateCmd{retainMaster: false}
65+
c := &parseConfig{
66+
Applications: map[string]*parseAppConfig{
67+
"app": {ApplicationID: "a", MasterKey: "m"},
68+
},
69+
projectConfig: &projectConfig{
70+
Type: legacyParseFormat,
71+
ParserEmail: "test@email.com",
72+
},
73+
}
74+
config, err := m.upgradeLegacy(h.env, c)
75+
ensure.Nil(t, err)
76+
ensure.DeepEqual(t, config.Applications["app"].MasterKey, "")
77+
ensure.DeepEqual(t, config.getProjectConfig().ParserEmail, "test@email.com")
78+
}

0 commit comments

Comments
 (0)