diff --git a/client/changelist/file_changelist.go b/client/changelist/file_changelist.go index fe9fdbea13..a25215482c 100644 --- a/client/changelist/file_changelist.go +++ b/client/changelist/file_changelist.go @@ -46,6 +46,7 @@ func getFileNames(dirName string) ([]os.FileInfo, error) { } fileInfos = append(fileInfos, f) } + sort.Sort(fileChanges(fileInfos)) return fileInfos, nil } @@ -70,7 +71,6 @@ func (cl FileChangelist) List() []Change { if err != nil { return changes } - sort.Sort(fileChanges(fileInfos)) for _, f := range fileInfos { c, err := unmarshalFile(cl.dir, f) if err != nil { @@ -98,7 +98,6 @@ func (cl FileChangelist) Remove(idxs []int) error { if err != nil { return err } - sort.Sort(fileChanges(fileInfos)) remove := make(map[int]struct{}) for _, i := range idxs { remove[i] = struct{}{} @@ -115,6 +114,7 @@ func (cl FileChangelist) Remove(idxs []int) error { } // Clear clears the change list +// N.B. archiving not currently implemented func (cl FileChangelist) Clear(archive string) error { dir, err := os.Open(cl.dir) if err != nil { @@ -143,7 +143,6 @@ func (cl FileChangelist) NewIterator() (ChangeIterator, error) { if err != nil { return &FileChangeListIterator{}, err } - sort.Sort(fileChanges(fileInfos)) return &FileChangeListIterator{dirname: cl.dir, collection: fileInfos}, nil } diff --git a/cmd/notary/tuf.go b/cmd/notary/tuf.go index ee5c798ff3..99113c847a 100644 --- a/cmd/notary/tuf.go +++ b/cmd/notary/tuf.go @@ -98,8 +98,8 @@ type tufCommander struct { output string quiet bool - changes []int - resetStatus bool + deleteIdx []int + reset bool archiveChangelist string } @@ -109,8 +109,8 @@ func (t *tufCommander) AddToCommand(cmd *cobra.Command) { cmd.AddCommand(cmdTUFInit) cmdStatus := cmdTUFStatusTemplate.ToCommand(t.tufStatus) - cmdStatus.Flags().IntSliceVarP(&t.changes, "unstage", "u", nil, "Numbers of changes to delete, as show in status list") - cmdStatus.Flags().BoolVar(&t.resetStatus, "reset", false, "Reset the changelist for the GUN by deleting all pending changes") + cmdStatus.Flags().IntSliceVarP(&t.deleteIdx, "unstage", "u", nil, "Numbers of changes to delete, as show in status list") + cmdStatus.Flags().BoolVar(&t.reset, "reset", false, "Reset the changelist for the GUN by deleting all pending changes") cmd.AddCommand(cmdStatus) cmd.AddCommand(cmdTUFPublishTemplate.ToCommand(t.tufPublish)) @@ -448,12 +448,12 @@ func (t *tufCommander) tufStatus(cmd *cobra.Command, args []string) error { return err } - if t.resetStatus { + if t.reset { return cl.Clear(t.archiveChangelist) } - if len(t.changes) > 0 { - return cl.Remove(t.changes) + if len(t.deleteIdx) > 0 { + return cl.Remove(t.deleteIdx) } if len(cl.List()) == 0 { diff --git a/cmd/notary/tuf_test.go b/cmd/notary/tuf_test.go index be2d5647ff..81fc351501 100644 --- a/cmd/notary/tuf_test.go +++ b/cmd/notary/tuf_test.go @@ -3,8 +3,11 @@ package main import ( "net/http" "net/http/httptest" + "os" "testing" + "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/stretchr/testify/require" ) @@ -118,3 +121,58 @@ func TestAdminTokenAuthNon200Non401Status(t *testing.T) { require.NoError(t, err) require.Nil(t, auth) } + +func TestStatusUnstageAndReset(t *testing.T) { + setUp(t) + tempBaseDir := tempDirWithConfig(t, "{}") + defer os.RemoveAll(tempBaseDir) + + tc := &tufCommander{ + configGetter: func() (*viper.Viper, error) { + v := viper.New() + v.SetDefault("trust_dir", tempBaseDir) + return v, nil + }, + } + + tc.reset = true + + // run a reset with an empty changelist and make sure it succeeds + err := tc.tufStatus(&cobra.Command{}, []string{"gun"}) + require.NoError(t, err) + + // add some targets + tc.sha256 = "88b76b34ab83a9e4d5abe3697950fb73f940aab1aa5b534f80cf9de9708942be" + err = tc.tufAddByHash(&cobra.Command{}, []string{"gun", "test1", "100"}) + require.NoError(t, err) + tc.sha256 = "4a7c203ce63b036a1999ea74eebd307c338368eb2b32218b722de6c5fdc7f016" + err = tc.tufAddByHash(&cobra.Command{}, []string{"gun", "test2", "100"}) + require.NoError(t, err) + tc.sha256 = "64bd0565907a6a55fc66fd828a71dbadd976fa875d0a3869f53d02eb8710ecb4" + err = tc.tufAddByHash(&cobra.Command{}, []string{"gun", "test3", "100"}) + require.NoError(t, err) + + out, err := runCommand(t, tempBaseDir, "status", "gun") + require.NoError(t, err) + require.Contains(t, out, "test1") + require.Contains(t, out, "test2") + require.Contains(t, out, "test3") + + _, err = runCommand(t, tempBaseDir, "status", "gun", "--unstage", "1") + + out, err = runCommand(t, tempBaseDir, "status", "gun") + require.NoError(t, err) + require.Contains(t, out, "test1") + require.NotContains(t, out, "test2") + require.Contains(t, out, "test3") + + _, err = runCommand(t, tempBaseDir, "status", "gun", "--reset") + require.NoError(t, err) + + out, err = runCommand(t, tempBaseDir, "status", "gun") + require.NoError(t, err) + require.NotContains(t, out, "test1") + require.NotContains(t, out, "test2") + require.NotContains(t, out, "test3") + +}