From 2424f05d6c803dbcc29d6fa839d6101ecadc2240 Mon Sep 17 00:00:00 2001 From: Ivo Jimenez Date: Wed, 9 Nov 2016 19:00:49 -0800 Subject: [PATCH] Adds experiment scaffolding fixes #38 --- popper/experiment.go | 86 ++++++++++++++++++++++++++++++++++++++++---- popper/main.go | 20 +++-------- 2 files changed, 85 insertions(+), 21 deletions(-) diff --git a/popper/experiment.go b/popper/experiment.go index 2cb5e04f0..fe4dccfc4 100644 --- a/popper/experiment.go +++ b/popper/experiment.go @@ -1,22 +1,46 @@ package main import ( + "fmt" + "io/ioutil" "log" "github.com/codeskyblue/go-sh" "github.com/spf13/cobra" ) +var runSh = []byte(`#!/bin/bash +# The point of entry to the experiment. This file should contain the series of +# steps that are required to execute the experiment. Any non-zero exit code will +# be interpreted as a failure by the 'popper check' command. +set -e +exit 0 +`) + +var validateSh = []byte(`#!/bin/bash +# The point of entry to the validation of results produced by the experiment. +# Any non-zero exit code will be interpreted as a failure by the 'popper check' +# command. Additionally, the command should print "true" or "false" for each +# validation (one per line, each interpreted as a separate validation). +set -e +exit 0 +`) + +var popperYml = []byte(`code: [] +run: docker +validate: docker +`) + func checkTemplateFolderExists(template_type string) { - if !sh.Test("dir", popperFolder+"/"+template_type) { - log.Fatalln("Can't find '" + popperFolder + "/" + template_type + "'." + + if !sh.Test("dir", popperFolder+"/templates/"+template_type) { + log.Fatalln("Can't find '" + popperFolder + "/templates/" + template_type + "'." + "This command must be executed from the project's root folder.") } } func listTemplates(template_type string) { checkTemplateFolderExists(template_type) - if err := sh.Command("ls", "-1", popperFolder+"/"+template_type).Run(); err != nil { + if err := sh.Command("ls", "-1", popperFolder+"/templates/"+template_type).Run(); err != nil { log.Fatalln(err) } } @@ -28,24 +52,58 @@ func addTemplate(template_type string, template_name string, folder string) { log.Fatalln("Folder " + folder + " already exists.") } - template := popperFolder + "/" + template_type + "/" + template_name + template := popperFolder + "/templates/" + template_type + "/" + template_name if _, err := sh.Command("cp", "-r", template, folder).CombinedOutput(); err != nil { log.Fatalln(err) } } +func initExperiment(name string) { + if sh.Test("d", "experiments/"+name) { + log.Fatalln("Folder " + name + " already exists.") + } + + if _, err := sh.Command("mkdir", "experiments/"+name).Output(); err != nil { + log.Fatalln(err) + } + + // create template files + if err := ioutil.WriteFile("experiments/"+name+"/run.sh", runSh, 0755); err != nil { + log.Fatalln(err) + } + if err := ioutil.WriteFile("experiments/"+name+"/validate.sh", validateSh, 0755); err != nil { + log.Fatalln(err) + } + if err := ioutil.WriteFile("experiments/"+name+"/.popper.yml", popperYml, 0644); err != nil { + log.Fatalln(err) + } + + // add README + usr, repo, err := getRepoInfo() + if err != nil { + log.Fatalln(err) + } + readme := []byte("# " + name + "\n\n[![Popper Status](http://popper-status.falsifiable.us/repos/" + usr + "/" + repo + "/" + name + "/status.svg)](http://falsifiable.us)\n") + if err := ioutil.WriteFile("experiments/"+name+"/README.md", readme, 0644); err != nil { + log.Fatalln(err) + } + + fmt.Println("Initialized " + name + " experiment.") +} + var experimentCmd = &cobra.Command{ Use: "experiment", Short: "List or add experiments.", Long: ``, Run: func(cmd *cobra.Command, args []string) { + log.Fatalln("Can't use this subcommand directly. See 'popper help experiment' for usage") }, } var experimentListCmd = &cobra.Command{ Use: "list", - Short: "List available experiment templates.", + Short: "List available experiment templates", Long: ``, Run: func(cmd *cobra.Command, args []string) { if len(args) != 0 { @@ -57,7 +115,7 @@ var experimentListCmd = &cobra.Command{ var experimentAddCmd = &cobra.Command{ Use: "add