From c7dbfc908a84ed76c7ec63cd13662201f5d256e5 Mon Sep 17 00:00:00 2001 From: Pavan Kumar Date: Tue, 1 Sep 2015 16:42:27 +0000 Subject: [PATCH] fix releases cmd unmarshaling bug this bug is related to consolidation of deploy & releases cmd https://developers.facebook.com/bugs/1477221272603618/ --- deploy_cmd.go | 3 +-- releases_cmd.go | 48 +++++++++++++++++++++++++------------ releases_cmd_test.go | 57 ++++++++++++++------------------------------ 3 files changed, 52 insertions(+), 56 deletions(-) diff --git a/deploy_cmd.go b/deploy_cmd.go index 38161e3..702c667 100644 --- a/deploy_cmd.go +++ b/deploy_cmd.go @@ -309,8 +309,7 @@ type deployInfo struct { ParseVersion string `json:"parseVersion,omitempty"` Checksums deployFileData `json:"checksums,omitempty"` Versions deployFileData `json:"userFiles,omitempty"` - Timestamp string `json:"timestamp,omitempty"` // only populated by get from releases - Warning string `json:"warning,omitempty"` // only populated by post to deploy + Warning string `json:"warning,omitempty"` // only populated by post to deploy } func (d *deployCmd) makeNewRelease(info *deployInfo, e *env) (deployInfo, error) { diff --git a/releases_cmd.go b/releases_cmd.go index 17ae857..2485c5c 100644 --- a/releases_cmd.go +++ b/releases_cmd.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "net/url" "sort" @@ -11,12 +12,24 @@ import ( "github.com/spf13/cobra" ) +type userFiles struct { + Cloud map[string]interface{} `json:"cloud"` + Public map[string]interface{} `json:"public"` +} + +type releasesResponse struct { + Version string `json:"version"` + Description string `json:"description"` + Timestamp string `json:"timestamp"` + UserFiles string `json:"userFiles"` +} + type releasesCmd struct { version string } func (r *releasesCmd) printFileNames( - fileVersions map[string]string, + fileVersions map[string]interface{}, e *env) { var files []string for name := range fileVersions { @@ -26,32 +39,37 @@ func (r *releasesCmd) printFileNames( fmt.Fprintln(e.Out, strings.Join(files, "\n")) } -func (r *releasesCmd) printFiles( - version string, - releases []deployInfo, +func (r *releasesCmd) printFiles(version string, + releases []releasesResponse, e *env) error { - var files deployFileData + var files string for _, release := range releases { - if release.ParseVersion == version { - files = release.Versions + if release.Version == version { + files = release.UserFiles break } } - if len(files.Cloud) == 0 && len(files.Public) == 0 { + if files == "" { return stackerr.Newf(`Unable to fetch files for release version: %s Note that you can list files for all releases shown in "parse releases"`, version) } - if len(files.Cloud) != 0 { + var versionFileNames userFiles + if err := json.NewDecoder( + strings.NewReader(files), + ).Decode(&versionFileNames); err != nil { + return stackerr.Wrap(err) + } + if len(versionFileNames.Cloud) != 0 { fmt.Fprintf(e.Out, "Deployed cloud code files:\n") - r.printFileNames(files.Cloud, e) + r.printFileNames(versionFileNames.Cloud, e) } - if len(files.Cloud) != 0 && len(files.Public) != 0 { + if len(versionFileNames.Cloud) != 0 && len(versionFileNames.Public) != 0 { fmt.Fprintln(e.Out) } - if len(files.Public) != 0 { + if len(versionFileNames.Public) != 0 { fmt.Fprintf(e.Out, "Deployed public hosting files:\n") - r.printFileNames(files.Public, e) + r.printFileNames(versionFileNames.Public, e) } return nil } @@ -60,7 +78,7 @@ func (r *releasesCmd) run(e *env, c *context) error { u := &url.URL{ Path: "releases", } - var releasesList []deployInfo + var releasesList []releasesResponse if _, err := e.ParseAPIClient.Get(u, &releasesList); err != nil { return stackerr.Wrap(err) } @@ -77,7 +95,7 @@ func (r *releasesCmd) run(e *env, c *context) error { if release.Description != "" { description = release.Description } - fmt.Fprintf(w, "%s\t%s\t%s\n", release.ParseVersion, description, release.Timestamp) + fmt.Fprintf(w, "%s\t%s\t%s\n", release.Version, description, release.Timestamp) } w.Flush() return nil diff --git a/releases_cmd_test.go b/releases_cmd_test.go index aebe48e..b7f0c72 100644 --- a/releases_cmd_test.go +++ b/releases_cmd_test.go @@ -22,9 +22,9 @@ func newReleasesCmdHarness(t testing.TB) (*Harness, *releasesCmd) { func TestReleasesCmd(t *testing.T) { h, r := newReleasesCmdHarness(t) defer h.Stop() - rows := []deployInfo{ - {ParseVersion: "v1", Description: "version 1", Timestamp: "time 1"}, - {ParseVersion: "v2", Description: "version 2", Timestamp: "time 2"}, + rows := []releasesResponse{ + {Version: "v1", Description: "version 1", Timestamp: "time 1"}, + {Version: "v2", Description: "version 2", Timestamp: "time 2"}, } ht := transportFunc(func(r *http.Request) (*http.Response, error) { ensure.DeepEqual(t, r.URL.Path, "/1/releases") @@ -57,44 +57,23 @@ func TestReleasesCmdError(t *testing.T) { func TestReleasesCmdPrintVersion(t *testing.T) { h, r := newReleasesCmdHarness(t) - releases := []deployInfo{ - { - ParseVersion: "v1", - Versions: deployFileData{ - Cloud: map[string]string{ - "main.js": "1", - "app.js": "1", - "views/index.js": "1", - }, - }, + releases := []releasesResponse{ + {Version: "v1", + UserFiles: `{ + "cloud": {"main.js": "1", "app.js": "1", "views/index.js": "1"} + }`, }, - { - ParseVersion: "v2", - Versions: deployFileData{ - Cloud: map[string]string{ - "main.js": "2", - "app.js": "2", - "views/docs.js": "1", - }, - Public: map[string]string{ - "index.html": "2", - "docs.html": "2", - }, - }, + {Version: "v2", + UserFiles: `{ + "cloud": {"main.js": "2", "app.js": "2", "views/docs.js": "1"}, + "public": {"index.html": "2", "docs.html": "2"} + }`, }, - { - ParseVersion: "v2", - Versions: deployFileData{ - Cloud: map[string]string{ - "v2_main.js": "2", - "v2_app.js": "2", - "views/v2_docs.js": "2", - }, - Public: map[string]string{ - "v2_index.html": "2", - "v2_docs.html": "2", - }, - }, + {Version: "v2", + UserFiles: `{ + "cloud": {"v2_main.js": "2", "v2_app.js": "2", "views/v2_docs.js": "2"}, + "public": {"v2_index.html": "2", "v2_docs.html": "2"} + }`, }, } err := r.printFiles("", releases, h.env)