Use array for prefixmap instead of map

Go doesn't guarantee the order of items in a map, in fact the order
is randomized, but for prefixmap the order is important so use array.

Bug: 3300
Change-Id: Icbf2b2ccc68f980001ed657f090d29b308b602a0
Reviewed-on: https://fuchsia-review.googlesource.com/c/tools/+/408554
Commit-Queue: Petr Hosek <phosek@google.com>
Reviewed-by: Scott Graham <scottmg@google.com>
Reviewed-by: David Turner <digit@google.com>
diff --git a/godepfile/cmd/godepfile.go b/godepfile/cmd/godepfile.go
index 9d06fe8..d410a4c 100644
--- a/godepfile/cmd/godepfile.go
+++ b/godepfile/cmd/godepfile.go
@@ -30,17 +30,17 @@
 	return nil
 }
 
-type mapFlag map[string]string
+type prefixmapFlag []struct{from, to string}
 
-func (v *mapFlag) String() string {
+func (v *prefixmapFlag) String() string {
 	var s []string
-	for from, to := range *v {
-		s = append(s, fmt.Sprintf("%s=%s", from, to))
+	for _, p := range *v {
+		s = append(s, fmt.Sprintf("%s=%s", p.from, p.to))
 	}
 	return strings.Join(s, " ")
 }
 
-func (v *mapFlag) Set(s string) error {
+func (v *prefixmapFlag) Set(s string) error {
 	if strings.Count(s, "=") != 1 {
 		return errors.New("argument must be of the form from=to")
 	}
@@ -49,7 +49,7 @@
 	if from == "" || to == "" {
 		return errors.New("from and to must be non-empty")
 	}
-	(*v)[from] = to
+	*v = append(*v, struct{from, to string}{from, to})
 	return nil
 }
 
@@ -57,7 +57,7 @@
 	ctx       = build.Default
 	output    string
 	test      bool
-	prefixmap = mapFlag{}
+	prefixmap = prefixmapFlag{}
 )
 
 func init() {
@@ -122,9 +122,9 @@
 
 		var files []string
 		srcdir := pkg.Dir + "/"
-		for from, to := range prefixmap {
-			if strings.HasPrefix(srcdir, from) {
-				srcdir = to + srcdir[len(from):]
+		for _, p := range prefixmap {
+			if strings.HasPrefix(srcdir, p.from) {
+				srcdir = p.to + srcdir[len(p.from):]
 			}
 		}