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:
parent
cb7f3326c4
commit
0766fbe480
@ -171,10 +171,10 @@ type importFlag struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// buildExerciceFlags read challenge.txt and extract all flags.
|
// 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)
|
params, gerrs := getExerciceParams(i, exercice)
|
||||||
if len(gerrs) > 0 {
|
if len(gerrs) > 0 {
|
||||||
return flags, gerrs
|
return flags, flagids, gerrs
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = map[int64]importFlag{}
|
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
|
// Read dependency to flag
|
||||||
for _, nf := range flag.NeedFlag {
|
for _, nf := range flag.NeedFlag {
|
||||||
if v, ok := flags[flag.Id]; ok {
|
if v, ok := flags[flag.Id]; ok {
|
||||||
@ -307,32 +309,34 @@ func buildExerciceFlags(i Importer, exercice fic.Exercice) (flags map[int64]impo
|
|||||||
|
|
||||||
// CheckExerciceFlags checks if all flags for the given challenge are correct.
|
// 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) {
|
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...)
|
errs = append(errs, berrs...)
|
||||||
|
|
||||||
for _, flag := range flags {
|
for _, flagid := range flagsids {
|
||||||
// Check dependency to flag
|
if flag, ok := flags[flagid]; ok {
|
||||||
for _, nf := range flag.FlagsDeps {
|
// Check dependency to flag
|
||||||
if _, ok := flags[nf]; !ok {
|
for _, nf := range flag.FlagsDeps {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to flag id=%d: id not defined", path.Base(exercice.Path), flag.Line, nf))
|
if _, ok := flags[nf]; !ok {
|
||||||
}
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to flag id=%d: id not defined", path.Base(exercice.Path), flag.Line, nf))
|
||||||
}
|
|
||||||
|
|
||||||
// Check dependency to file
|
|
||||||
for _, lf := range flag.FilesDeps {
|
|
||||||
found := false
|
|
||||||
for _, f := range files {
|
|
||||||
if f.Name == lf {
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !found {
|
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: No such file", path.Base(exercice.Path), flag.Line, lf))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rf = append(rf, flag.Flag)
|
// Check dependency to file
|
||||||
|
for _, lf := range flag.FilesDeps {
|
||||||
|
found := false
|
||||||
|
for _, f := range files {
|
||||||
|
if f.Name == lf {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: No such file", path.Base(exercice.Path), flag.Line, lf))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rf = append(rf, flag.Flag)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -345,41 +349,43 @@ func SyncExerciceFlags(i Importer, exercice fic.Exercice) (errs []string) {
|
|||||||
} else if _, err := exercice.WipeMCQs(); err != nil {
|
} else if _, err := exercice.WipeMCQs(); err != nil {
|
||||||
errs = append(errs, err.Error())
|
errs = append(errs, err.Error())
|
||||||
} else {
|
} else {
|
||||||
flags, berrs := buildExerciceFlags(i, exercice)
|
flags, flagids, berrs := buildExerciceFlags(i, exercice)
|
||||||
errs = append(errs, berrs...)
|
errs = append(errs, berrs...)
|
||||||
|
|
||||||
kmap := map[int64]fic.Flag{}
|
kmap := map[int64]fic.Flag{}
|
||||||
|
|
||||||
// Import flags
|
// Import flags
|
||||||
for flagid, flag := range flags {
|
for _, flagid := range flagids {
|
||||||
if addedFlag, err := exercice.AddFlag(flag.Flag); err != nil {
|
if flag, ok := flags[flagid]; ok {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d: %s", path.Base(exercice.Path), flag.Line, err))
|
if addedFlag, err := exercice.AddFlag(flag.Flag); err != nil {
|
||||||
} else {
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d: %s", path.Base(exercice.Path), flag.Line, err))
|
||||||
if f, ok := addedFlag.(fic.FlagKey); ok {
|
} else {
|
||||||
for _, choice := range flag.Choices {
|
if f, ok := addedFlag.(fic.FlagKey); ok {
|
||||||
if _, err := f.AddChoice(choice); err != nil {
|
for _, choice := range flag.Choices {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error in flag #%d choice #FIXME: %s", path.Base(exercice.Path), flag.Line, err))
|
if _, err := f.AddChoice(choice); err != nil {
|
||||||
|
errs = append(errs, fmt.Sprintf("%q: error in flag #%d choice #FIXME: %s", path.Base(exercice.Path), flag.Line, err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
kmap[flagid] = addedFlag
|
kmap[flagid] = addedFlag
|
||||||
|
|
||||||
// Import dependency to flag
|
// Import dependency to flag
|
||||||
for _, nf := range flag.FlagsDeps {
|
for _, nf := range flag.FlagsDeps {
|
||||||
if rf, ok := kmap[nf]; !ok {
|
if rf, ok := kmap[nf]; !ok {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to flag id=%d: id not defined, perhaps not available at time of processing", path.Base(exercice.Path), flag.Line, nf))
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to flag id=%d: id not defined, perhaps not available at time of processing", path.Base(exercice.Path), flag.Line, nf))
|
||||||
} else if err := addedFlag.AddDepend(rf); err != nil {
|
} else if err := addedFlag.AddDepend(rf); err != nil {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to id=%d: %s", path.Base(exercice.Path), flag.Line, nf, err))
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to id=%d: %s", path.Base(exercice.Path), flag.Line, nf, err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Import dependency to file
|
// Import dependency to file
|
||||||
for _, lf := range flag.FilesDeps {
|
for _, lf := range flag.FilesDeps {
|
||||||
if rf, err := exercice.GetFileByFilename(lf); err != nil {
|
if rf, err := exercice.GetFileByFilename(lf); err != nil {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: %s", path.Base(exercice.Path), flag.Line, lf, err))
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: %s", path.Base(exercice.Path), flag.Line, lf, err))
|
||||||
} else if err := rf.AddDepend(addedFlag); err != nil {
|
} else if err := rf.AddDepend(addedFlag); err != nil {
|
||||||
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: %s", path.Base(exercice.Path), flag.Line, lf, err))
|
errs = append(errs, fmt.Sprintf("%q: error flag #%d dependency to %s: %s", path.Base(exercice.Path), flag.Line, lf, err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user