sync: don't rely on map order to import flags

Sometimes, maps order doesn't match file order. Return flag ID as
list to keep the order.
This commit is contained in:
nemunaire 2019-10-12 12:54:01 +02:00
parent cb7f3326c4
commit 0766fbe480

View file

@ -171,10 +171,10 @@ type importFlag struct {
}
// buildExerciceFlags read challenge.txt and extract all flags.
func buildExerciceFlags(i Importer, exercice fic.Exercice) (flags map[int64]importFlag, errs []string) {
func buildExerciceFlags(i Importer, exercice fic.Exercice) (flags map[int64]importFlag, flagids []int64, errs []string) {
params, gerrs := getExerciceParams(i, exercice)
if len(gerrs) > 0 {
return flags, gerrs
return flags, flagids, gerrs
}
flags = map[int64]importFlag{}
@ -285,6 +285,8 @@ func buildExerciceFlags(i Importer, exercice fic.Exercice) (flags map[int64]impo
}
}
flagids = append(flagids, flag.Id)
// Read dependency to flag
for _, nf := range flag.NeedFlag {
if v, ok := flags[flag.Id]; ok {
@ -307,10 +309,11 @@ func buildExerciceFlags(i Importer, exercice fic.Exercice) (flags map[int64]impo
// CheckExerciceFlags checks if all flags for the given challenge are correct.
func CheckExerciceFlags(i Importer, exercice fic.Exercice, files []fic.EFile) (rf []fic.Flag, errs []string) {
flags, berrs := buildExerciceFlags(i, exercice)
flags, flagsids, berrs := buildExerciceFlags(i, exercice)
errs = append(errs, berrs...)
for _, flag := range flags {
for _, flagid := range flagsids {
if flag, ok := flags[flagid]; ok {
// Check dependency to flag
for _, nf := range flag.FlagsDeps {
if _, ok := flags[nf]; !ok {
@ -334,6 +337,7 @@ func CheckExerciceFlags(i Importer, exercice fic.Exercice, files []fic.EFile) (r
rf = append(rf, flag.Flag)
}
}
return
}
@ -345,13 +349,14 @@ func SyncExerciceFlags(i Importer, exercice fic.Exercice) (errs []string) {
} else if _, err := exercice.WipeMCQs(); err != nil {
errs = append(errs, err.Error())
} else {
flags, berrs := buildExerciceFlags(i, exercice)
flags, flagids, berrs := buildExerciceFlags(i, exercice)
errs = append(errs, berrs...)
kmap := map[int64]fic.Flag{}
// Import flags
for flagid, flag := range flags {
for _, flagid := range flagids {
if flag, ok := flags[flagid]; ok {
if addedFlag, err := exercice.AddFlag(flag.Flag); err != nil {
errs = append(errs, fmt.Sprintf("%q: error flag #%d: %s", path.Base(exercice.Path), flag.Line, err))
} else {
@ -385,6 +390,7 @@ func SyncExerciceFlags(i Importer, exercice fic.Exercice) (errs []string) {
}
}
}
}
return
}