From 9a9675bcf5a87db074b4fe854df753a500ad8fc8 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Sat, 6 Jul 2019 01:25:34 +0200 Subject: [PATCH] repochecker: introduce new project --- repochecker/.gitignore | 1 + repochecker/main.go | 163 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 repochecker/.gitignore create mode 100644 repochecker/main.go diff --git a/repochecker/.gitignore b/repochecker/.gitignore new file mode 100644 index 00000000..ae3a90e6 --- /dev/null +++ b/repochecker/.gitignore @@ -0,0 +1 @@ +repochecker diff --git a/repochecker/main.go b/repochecker/main.go new file mode 100644 index 00000000..32eecd8a --- /dev/null +++ b/repochecker/main.go @@ -0,0 +1,163 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "path" + "path/filepath" + + "srs.epita.fr/fic-server/admin/sync" + "srs.epita.fr/fic-server/libfic" +) + +func checkExercice(theme fic.Theme, edir string, dmap *map[int64]fic.Exercice) (errs []string) { + e, _, eid, _, berrs := sync.BuildExercice(sync.GlobalImporter, theme, path.Join(theme.Path, edir), dmap) + errs = append(errs, berrs...) + + if e != nil { + // Files + files, cerrs := sync.CheckExerciceFiles(sync.GlobalImporter, *e) + errs = append(errs, cerrs...) + log.Printf("%d files checked.\n", len(files)) + + // Flags + flags, cerrs := sync.CheckExerciceFlags(sync.GlobalImporter, *e, files) + errs = append(errs, cerrs...) + log.Printf("%d flags checked.\n", len(flags)) + + // Hints + hints, cerrs := sync.CheckExerciceHints(sync.GlobalImporter, *e) + errs = append(errs, cerrs...) + log.Printf("%d hints checked.\n", len(hints)) + + if dmap != nil { + (*dmap)[int64(eid)] = *e + } + } + return +} + +func main() { + cloudDAVBase := "" + cloudUsername := "fic" + cloudPassword := "" + localImporterDirectory := "" + + // Read paremeters from environment + if v, exists := os.LookupEnv("FICCLOUD_URL"); exists { + cloudDAVBase = v + } + if v, exists := os.LookupEnv("FICCLOUD_USER"); exists { + cloudUsername = v + } + if v, exists := os.LookupEnv("FICCLOUD_PASS"); exists { + cloudPassword = v + } + + // Read parameters from command line + flag.StringVar(&localImporterDirectory, "localimport", localImporterDirectory, + "Base directory where to find challenges files to import, local part") + flag.StringVar(&cloudDAVBase, "clouddav", cloudDAVBase, + "Base directory where to find challenges files to import, cloud part") + flag.StringVar(&cloudUsername, "clouduser", cloudUsername, "Username used to sync") + flag.StringVar(&cloudPassword, "cloudpass", cloudPassword, "Password used to sync") + flag.BoolVar(&fic.OptionalDigest, "optionaldigest", fic.OptionalDigest, "Is the digest required when importing files?") + flag.BoolVar(&fic.StrongDigest, "strongdigest", fic.StrongDigest, "Are BLAKE2b digests required or is SHA-1 good enough?") + flag.Parse() + + log.SetPrefix("[repochecker] ") + + // Instantiate importer + regenImporter := false + if localImporterDirectory != "" { + sync.GlobalImporter = sync.LocalImporter{Base: localImporterDirectory, Symlink: true} + } else if cloudDAVBase != "" { + sync.GlobalImporter, _ = sync.NewCloudImporter(cloudDAVBase, cloudUsername, cloudPassword) + } else { + // In this case, we want to treat the entier path given + regenImporter = true + } + + if sync.GlobalImporter != nil { + log.Println("Using", sync.GlobalImporter.Kind()) + + if themes, err := sync.GetThemes(sync.GlobalImporter); err != nil { + log.Fatal(err) + } else if len(flag.Args()) == 0 { + log.Println("Existing themes:") + for _, th := range themes { + log.Println("-", th) + } + os.Exit(1) + } + } else if len(flag.Args()) == 0 { + log.Fatal("No importer nor path given!") + } + + // Variable that handles the exit status + hasError := false + + for _, p := range flag.Args() { + if regenImporter { + var err error + p, err = filepath.Abs(p) + if err != nil { + p = path.Clean(p) + } + sync.GlobalImporter = sync.LocalImporter{ + Base: path.Dir(p), + Symlink: true, + } + p = path.Base(p) + } + + nberr := 0 + theme, errs := sync.BuildTheme(sync.GlobalImporter, p) + + if theme != nil { + nberr += len(errs) + for _, err := range errs { + log.Println(err) + } + + exercices, err := sync.GetExercices(sync.GlobalImporter, *theme) + if err != nil { + nberr += 1 + log.Println(err) + continue + } + + dmap := map[int64]fic.Exercice{} + + for _, edir := range exercices { + for _, err := range checkExercice(*theme, edir, &dmap) { + nberr += 1 + log.Println(err) + } + log.Printf("================================== Exercice %q treated\n", edir) + } + + fmt.Printf("\n") + log.Printf("Theme %q treated. %d error(s) reported.\n\n", p, nberr) + } else { + log.Printf("This is not a theme directory, run checks for exercice.\n\n") + + for _, err := range checkExercice(fic.Theme{}, p, &map[int64]fic.Exercice{}) { + nberr += 1 + log.Println(err) + } + fmt.Printf("\n") + log.Printf("Exercice %q treated. %d error(s) reported.\n", p, nberr) + } + + if nberr > 0 { + hasError = true + } + } + + if hasError { + os.Exit(1) + } +}