diff --git a/cmd/submit.go b/cmd/submit.go index 4f2a8df72..aaf3a93c1 100644 --- a/cmd/submit.go +++ b/cmd/submit.go @@ -26,7 +26,6 @@ var submitCmd = &cobra.Command{ Call the command with the list of files you want to submit. `, - Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg := config.NewConfig() @@ -45,6 +44,14 @@ var submitCmd = &cobra.Command{ // Ignore error. If the file doesn't exist, that is fine. _ = v.ReadInConfig() + if len(args) == 0 { + files, err := getExerciseSolutionFiles(".") + if err != nil { + return err + } + args = files + } + return runSubmit(cfg, cmd.Flags(), args) }, } @@ -114,6 +121,23 @@ func runSubmit(cfg config.Config, flags *pflag.FlagSet, args []string) error { return nil } +func getExerciseSolutionFiles(baseDir string) ([]string, error) { + v := viper.New() + v.AddConfigPath(filepath.Join(baseDir, ".exercism")) + v.SetConfigName("config") + v.SetConfigType("json") + err := v.ReadInConfig() + if err != nil { + return nil, errors.New("no files to submit") + } + solutionFiles := v.GetStringSlice("files.solution") + if len(solutionFiles) == 0 { + return nil, errors.New("no files to submit") + } + + return solutionFiles, nil +} + type submitCmdContext struct { usrCfg *viper.Viper flags *pflag.FlagSet diff --git a/cmd/submit_test.go b/cmd/submit_test.go index c20c47748..7286a19e6 100644 --- a/cmd/submit_test.go +++ b/cmd/submit_test.go @@ -108,6 +108,45 @@ func TestSubmitExerciseWithoutMetadataFile(t *testing.T) { } } +func TestGetExerciseSolutionFiles(t *testing.T) { + + tmpDir, err := ioutil.TempDir("", "dir-with-no-metadata") + defer os.RemoveAll(tmpDir) + assert.NoError(t, err) + + _, err = getExerciseSolutionFiles(tmpDir) + if assert.Error(t, err) { + assert.Regexp(t, "no files to submit", err.Error()) + } + + validTmpDir, err := ioutil.TempDir("", "dir-with-valid-metadata") + defer os.RemoveAll(validTmpDir) + assert.NoError(t, err) + + metadataDir := filepath.Join(validTmpDir, ".exercism") + err = os.MkdirAll(metadataDir, os.FileMode(0755)) + assert.NoError(t, err) + + err = ioutil.WriteFile( + filepath.Join(metadataDir, "config.json"), + []byte(` +{ + "files": { + "solution": [ + "expenses.go" + ] + } +} +`), os.FileMode(0755)) + assert.NoError(t, err) + + files, err := getExerciseSolutionFiles(validTmpDir) + assert.NoError(t, err) + if assert.Equal(t, len(files), 1) { + assert.Equal(t, files[0], "expenses.go") + } +} + func TestSubmitFilesAndDir(t *testing.T) { tmpDir, err := ioutil.TempDir("", "submit-no-such-file") defer os.RemoveAll(tmpDir)