14287: Merge list results from multiple backends.
[arvados.git] / lib / controller / federation / generate.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 // +build ignore
6
7 package main
8
9 import (
10         "bytes"
11         "io"
12         "io/ioutil"
13         "os"
14         "os/exec"
15         "regexp"
16 )
17
18 func main() {
19         checkOnly := false
20         if len(os.Args) == 2 && os.Args[1] == "-check" {
21                 checkOnly = true
22         } else if len(os.Args) != 1 {
23                 panic("usage: go run generate.go [-check]")
24         }
25
26         in, err := os.Open("list.go")
27         if err != nil {
28                 panic(err)
29         }
30         buf, err := ioutil.ReadAll(in)
31         if err != nil {
32                 panic(err)
33         }
34         orig := regexp.MustCompile(`(?ms)\nfunc [^\n]*CollectionList\(.*?\n}\n`).Find(buf)
35         if len(orig) == 0 {
36                 panic("can't find CollectionList func")
37         }
38
39         outfile, err := os.OpenFile("generated.go~", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
40         if err != nil {
41                 panic(err)
42         }
43
44         gofmt := exec.Command("goimports")
45         gofmt.Stdout = outfile
46         gofmt.Stderr = os.Stderr
47         out, err := gofmt.StdinPipe()
48         if err != nil {
49                 panic(err)
50         }
51         go func() {
52                 out.Write(regexp.MustCompile(`(?ms)^.*package .*?import.*?\n\)\n`).Find(buf))
53                 io.WriteString(out, "//\n// -- this file is auto-generated -- do not edit -- edit list.go and run \"go generate\" instead --\n//\n\n")
54                 for _, t := range []string{"Container", "Specimen"} {
55                         _, err := out.Write(bytes.ReplaceAll(orig, []byte("Collection"), []byte(t)))
56                         if err != nil {
57                                 panic(err)
58                         }
59                 }
60                 err = out.Close()
61                 if err != nil {
62                         panic(err)
63                 }
64         }()
65         err = gofmt.Run()
66         if err != nil {
67                 panic(err)
68         }
69         err = outfile.Close()
70         if err != nil {
71                 panic(err)
72         }
73         if checkOnly {
74                 diff := exec.Command("diff", "-u", "/dev/fd/3", "/dev/fd/4")
75                 for _, fnm := range []string{"generated.go", "generated.go~"} {
76                         f, err := os.Open(fnm)
77                         if err != nil {
78                                 panic(err)
79                         }
80                         defer f.Close()
81                         diff.ExtraFiles = append(diff.ExtraFiles, f)
82                 }
83                 diff.Stdout = os.Stdout
84                 diff.Stderr = os.Stderr
85                 err = diff.Run()
86                 if err != nil {
87                         os.Exit(1)
88                 }
89         } else {
90                 err = os.Rename("generated.go~", "generated.go")
91                 if err != nil {
92                         panic(err)
93                 }
94         }
95 }