diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7f21d4b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.nemunai.re/shemu + +go 1.10 diff --git a/main.go b/main.go index 3796ce8..36a3542 100644 --- a/main.go +++ b/main.go @@ -30,9 +30,10 @@ func Serve(w http.ResponseWriter, r *http.Request) { ` + title + ` - + @@ -80,13 +111,23 @@ function disp(rendus) { @@ -136,7 +177,7 @@ func genStudent(login string) map[string]*Submission { ret[dir.Name()] = new(Submission) ret[dir.Name()].Date = fi.ModTime() if lnk, err := os.Readlink(p); err == nil { - ret[dir.Name()].Hash = strings.TrimPrefix(lnk, login + ".") + ret[dir.Name()].Hash = strings.TrimPrefix(lnk, login+".") } } else { ret[dir.Name()] = nil @@ -166,11 +207,22 @@ func ServeJSONStudent(w http.ResponseWriter, r *http.Request) { } } +type arrayFlags []string + +func (i *arrayFlags) String() string { + return fmt.Sprintf("%v", *i) +} + +func (i *arrayFlags) Set(value string) error { + *i = append(*i, value) + return nil +} + func main() { - var studentsFile string + var studentsFiles arrayFlags var bind = flag.String("bind", "0.0.0.0:8081", "Bind port/socket") - flag.StringVar(&studentsFile, "students", "./students.csv", "Path to a CSV file containing in the third column the name of the directory to look for") + flag.Var(&studentsFiles, "students", "Path to a CSV file containing in the third column the name of the directory to look for (can be repeated multiple times)") flag.StringVar(&rendusDir, "path", "./rendu/", "Path to the submissions directory (each subdirectory is a project)") flag.StringVar(&title, "title", "Rendus VIRLI", "Title of the page") flag.Parse() @@ -195,14 +247,21 @@ func main() { // Read and parse students list log.Println("Reading students files...") - if studentsFile, err = filepath.Abs(studentsFile); err != nil { - log.Fatal(err) - } else if fi, err := os.Open(studentsFile); err != nil { - log.Fatal(err) - } else { - r := csv.NewReader(bufio.NewReader(fi)) - if students, err = r.ReadAll(); err != nil { + for _, studentsFile := range studentsFiles { + log.Println("Reading", studentsFile, "...") + if studentsFile, err = filepath.Abs(studentsFile); err != nil { log.Fatal(err) + } else if fi, err := os.Open(studentsFile); err != nil { + log.Fatal(err) + } else { + var nstudents [][]string + + r := csv.NewReader(bufio.NewReader(fi)) + if nstudents, err = r.ReadAll(); err != nil { + log.Fatal(err) + } + + students = append(students, nstudents...) } } log.Println(len(students), "students loaded.") @@ -211,7 +270,7 @@ func main() { http.HandleFunc("/", Serve) http.HandleFunc("/rendus.json", ServeJSON) for _, student := range students { - http.HandleFunc("/" + student[2] + ".json", ServeJSONStudent) + http.HandleFunc("/"+student[2]+".json", ServeJSONStudent) } log.Println(fmt.Sprintf("Ready, listening on %s", *bind)) if err := http.ListenAndServe(*bind, nil); err != nil {