github.com/rendon/cf@v0.0.0-20220806233241-5cb5d3939c03/setup.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strconv" 8 "strings" 9 10 log "github.com/Sirupsen/logrus" 11 "github.com/codegangsta/cli" 12 ) 13 14 func setup(c *cli.Context) { 15 if len(c.Args()) < 1 { 16 cli.ShowCommandHelp(c, "setup") 17 return 18 } 19 20 var cid, err = strconv.Atoi(c.Args()[0]) 21 if err != nil { 22 log.Fatalf("%q is not a valid contest ID: %s", c.Args()[0], err) 23 } 24 25 var lang = c.String("lang") 26 if lang != "" { 27 if langs[lang] == nil { 28 log.Fatalf("No language with code %q was found.", lang) 29 } 30 } 31 32 cname, err := GetContestName(cid) 33 if err != nil { 34 log.Printf("Failed to get contest name, using ID instead.") 35 cname = fmt.Sprintf("%d", cid) 36 } 37 38 // Sanitize contest name to avoid problems with directory names 39 cname = strings.Replace(cname, " ", "", -1) 40 cname = strings.Replace(cname, "#", "", -1) 41 cname = strings.Replace(cname, "(", "", -1) 42 cname = strings.Replace(cname, ")", "", -1) 43 44 if err = os.MkdirAll(cname, 0755); err != nil { 45 log.Fatalf("Failed to create contest directory: %s", err) 46 } 47 for p := 'A'; p <= 'Z'; p++ { 48 var problemUrl = fmt.Sprintf("%s/contest/%d/problem/%c", baseURL, cid, p) 49 var ins, outs, err = ParseProblem(problemUrl) 50 if err != nil { 51 break 52 } 53 var dir = fmt.Sprintf("%s/%c", cname, p) 54 if err = os.MkdirAll(dir, 0775); err != nil { 55 log.Fatalf("Failed to create directory: %s", err) 56 } 57 for i := 1; i <= len(ins); i++ { 58 if err = WriteTest(ins[i-1], outs[i-1], dir, i); err != nil { 59 log.Fatalf("Problem %c: %s", p, err) 60 } 61 } 62 63 var settings = map[string]interface{}{ 64 "tests": len(ins), 65 "problemUrl": problemUrl, 66 } 67 if lang != "" { 68 var sourceFile = fmt.Sprintf("%s/main.%s", dir, lang) 69 if err = GenerateSampleSolution(sourceFile, problemUrl); err != nil { 70 log.Printf("Failed to generate sample solution: %s", err) 71 } 72 settings["lang"] = lang 73 settings["sourceFile"] = filepath.Base(sourceFile) 74 } 75 76 err = WriteKeyValueYamlFile(dir+"/.settings.yml", settings) 77 if err != nil { 78 log.Fatalf("%c: Failed to write settings file: %s", p, err) 79 } 80 fmt.Printf("Problem %c is ready!\n", p) 81 } 82 fmt.Printf("\nContest directory: %s/\n", cname) 83 }