forked from flowchartsman/swaggerui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate.go
131 lines (122 loc) · 3.6 KB
/
generate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// This program downloads the dist assets for the current swagger-ui version and places them into the embed directory
// TODO: Compress?
// +build ignore
package main
import (
"archive/tar"
"bytes"
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strings"
)
type releaseResp []struct {
// TagName is a release tag name
TagName string `json:"tag_name"`
}
func main() {
log.SetFlags(0)
releases := releaseResp{}
// get the releases so we can download the latest one
req, _ := http.NewRequest("GET", "https://api.github.com/repos/swagger-api/swagger-ui/releases", nil)
req.Header.Set("Accept", "application/vnd.github.v3+json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("error getting release list: %v", err)
}
if resp.StatusCode != http.StatusOK {
log.Fatalf("got status [%s] on release list download", resp.Status)
}
if err := json.NewDecoder(resp.Body).Decode(&releases); err != nil {
log.Fatalf("error decoding response: %v", err)
}
resp.Body.Close()
if len(releases) == 0 {
log.Fatal("somehow got no releases, nothing to do")
}
tag := releases[0].TagName
current, err := ioutil.ReadFile("current_version.txt")
if err != nil {
log.Fatalf("unable to check version in current_version.txt: %v", err)
}
cv := string(bytes.TrimRight(current, "\n"))
if cv == tag {
log.Print("version is current, nothing to do")
os.Exit(0)
}
log.Printf("downloading release %s...", tag)
resp, err = http.Get(fmt.Sprintf("https://github.com/swagger-api/swagger-ui/archive/%s.tar.gz", tag))
if err != nil {
log.Fatalf("error downloading release archive: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Fatalf("got status [%s] on release archive download", resp.Status)
}
zr, err := gzip.NewReader(resp.Body)
if err != nil {
log.Fatalf("error opening file as gzip: %v", err)
}
if err := os.RemoveAll("embed"); err != nil {
log.Fatalf("error removing old embed directory")
}
if err := os.Mkdir("embed", 0o700); err != nil {
log.Fatalf("error recreating embed directory")
}
tr := tar.NewReader(zr)
for {
header, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("tar parsing error: %v", err)
}
if header.Typeflag == tar.TypeReg {
// got a file, remove version directory
fname := header.Name[strings.Index(header.Name, `/`):]
if strings.HasPrefix(fname, `/dist`) {
fname = strings.TrimPrefix(fname, `/dist`)
out, err := os.Create(filepath.Join("embed", fname))
if err != nil {
log.Fatalf("error create output file: %v", err)
}
if _, err := io.Copy(out, tr); err != nil {
log.Fatalf("error writing output file: %v", err)
}
}
}
}
// replace the hard-coded JSON file with a generic file
idxFile, err := os.ReadFile(filepath.Join("embed", "index.html"))
if err != nil {
log.Fatalf("error opening index.html for templating :%v", err)
}
newidx := strings.Replace(
string(idxFile),
`url: "https://petstore.swagger.io/v2/swagger.json"`,
`url: "./swagger_spec"`,
-1,
)
newidxFile, err := os.Create(filepath.Join("embed", "index.html"))
if err != nil {
log.Fatalf("error re-creating index.html file: %v", err)
}
defer newidxFile.Close()
if _, err := newidxFile.WriteString(newidx); err != nil {
log.Fatalf("unable to write to index.html: %v", err)
}
newcv, err := os.Create("current_version.txt")
if err != nil {
log.Fatalf("can't update current_version.txt: %v", err)
}
defer newcv.Close()
newcv.WriteString(tag)
log.Printf("updated swaggerui from %s => %s, please check templated index.html and retag repo", cv, tag)
}