Skip to content

Commit ad8dab0

Browse files
committed
Upload instead of package
1 parent b1ac2b4 commit ad8dab0

File tree

5 files changed

+138
-161
lines changed

5 files changed

+138
-161
lines changed

internal/bundler/build.go

Lines changed: 0 additions & 82 deletions
This file was deleted.

internal/bundler/metadata.go

Lines changed: 8 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,19 @@
11
package bundler
22

33
import (
4-
"archive/tar"
5-
"encoding/json"
6-
"fmt"
74
"runtime"
85
"time"
96

107
"github.com/kyleconroy/sqlc/internal/info"
118
)
129

13-
type jsonTime struct {
14-
time.Time
15-
}
16-
17-
func (t jsonTime) MarshalJSON() ([]byte, error) {
18-
//do your serializing here
19-
stamp := fmt.Sprintf("\"%s\"", t.Format(time.RFC3339))
20-
return []byte(stamp), nil
21-
}
22-
23-
type setting struct {
24-
Key, Value string
25-
}
26-
27-
type metadata struct {
28-
Version string `json:"version"`
29-
GoVersion string `json:"go_version"`
30-
GOOS string `json:"goos"`
31-
GOARCH string `json:"goarch"`
32-
Created jsonTime `json:"created"`
33-
Settings []setting `json:"settings"`
34-
}
35-
36-
func buildMetadata() (*metadata, error) {
37-
return &metadata{
38-
Version: info.Version,
39-
GoVersion: runtime.Version(),
40-
GOOS: runtime.GOOS,
41-
GOARCH: runtime.GOARCH,
42-
Created: jsonTime{time.Now().UTC()},
10+
func projectMetadata() ([][2]string, error) {
11+
now := time.Now().UTC()
12+
return [][2]string{
13+
{"sqlc_version", info.Version},
14+
{"go_version", runtime.Version()},
15+
{"goos", runtime.GOOS},
16+
{"goach", runtime.GOARCH},
17+
{"created", now.Format(time.RFC3339)},
4318
}, nil
4419
}
45-
46-
func addMetadata(w *tar.Writer) error {
47-
md, err := buildMetadata()
48-
if err != nil {
49-
return err
50-
}
51-
blob, err := json.Marshal(md)
52-
if err != nil {
53-
return err
54-
}
55-
header := &tar.Header{
56-
Name: "metadata.json",
57-
Size: int64(len(blob)),
58-
Mode: 0420,
59-
ModTime: md.Created.Time,
60-
AccessTime: md.Created.Time,
61-
ChangeTime: md.Created.Time,
62-
}
63-
if err := w.WriteHeader(header); err != nil {
64-
return err
65-
}
66-
if _, err := w.Write(blob); err != nil {
67-
return err
68-
}
69-
return nil
70-
}

internal/bundler/multipart.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package bundler
2+
3+
import (
4+
"io"
5+
"mime/multipart"
6+
"os"
7+
"path/filepath"
8+
9+
"github.com/kyleconroy/sqlc/internal/config"
10+
"github.com/kyleconroy/sqlc/internal/sql/sqlpath"
11+
)
12+
13+
func writeContents(w *multipart.Writer, file string, conf *config.Config) error {
14+
refs := map[string]struct{}{}
15+
refs[filepath.Base(file)] = struct{}{}
16+
17+
for _, pkg := range conf.SQL {
18+
for _, paths := range []config.Paths{pkg.Schema, pkg.Queries} {
19+
files, err := sqlpath.Glob(paths)
20+
if err != nil {
21+
return err
22+
}
23+
for _, file := range files {
24+
refs[file] = struct{}{}
25+
}
26+
}
27+
}
28+
29+
for file, _ := range refs {
30+
if err := addPart(w, file); err != nil {
31+
return err
32+
}
33+
}
34+
35+
params, err := projectMetadata()
36+
if err != nil {
37+
return err
38+
}
39+
for _, val := range params {
40+
if err = w.WriteField(val[0], val[1]); err != nil {
41+
return err
42+
}
43+
}
44+
return nil
45+
}
46+
47+
func addPart(w *multipart.Writer, file string) error {
48+
h, err := os.Open(file)
49+
if err != nil {
50+
return err
51+
}
52+
defer h.Close()
53+
part, err := w.CreateFormFile("contents", file)
54+
if err != nil {
55+
return err
56+
}
57+
_, err = io.Copy(part, h)
58+
if err != nil {
59+
return err
60+
}
61+
return nil
62+
}

internal/bundler/upload.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package bundler
2+
3+
import (
4+
"bytes"
5+
"compress/gzip"
6+
"context"
7+
"fmt"
8+
"mime/multipart"
9+
"net/http"
10+
11+
"github.com/kyleconroy/sqlc/internal/config"
12+
)
13+
14+
type Uploader struct {
15+
configPath string
16+
config *config.Config
17+
}
18+
19+
func NewUploader(configPath string, conf *config.Config) *Uploader {
20+
return &Uploader{
21+
configPath: configPath,
22+
config: conf,
23+
}
24+
}
25+
26+
func (up *Uploader) Upload(ctx context.Context) error {
27+
body := bytes.NewBuffer([]byte{})
28+
29+
gw := gzip.NewWriter(body)
30+
defer gw.Close()
31+
w := multipart.NewWriter(gw)
32+
defer w.Close()
33+
34+
if err := writeContents(w, up.configPath, up.config); err != nil {
35+
return err
36+
}
37+
38+
if err := gw.Flush(); err != nil {
39+
return err
40+
}
41+
w.Close()
42+
gw.Close()
43+
44+
req, err := http.NewRequest("POST", "http://localhost:8000/upload", body)
45+
if err != nil {
46+
return err
47+
}
48+
req.Header.Set("Content-Type", w.FormDataContentType())
49+
req = req.WithContext(ctx)
50+
51+
client := &http.Client{}
52+
resp, err := client.Do(req)
53+
if err != nil {
54+
return err
55+
}
56+
if resp.StatusCode != http.StatusOK {
57+
return fmt.Errorf("code=%d", resp.StatusCode)
58+
}
59+
return nil
60+
}

internal/cmd/package.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package cmd
22

33
import (
4-
"crypto/sha256"
4+
"context"
55
"fmt"
66
"io"
77
"os"
@@ -12,39 +12,27 @@ import (
1212
)
1313

1414
var packageCmd = &cobra.Command{
15-
Use: "build",
16-
Short: "Create a tarball containing schema, queries, and configuration",
15+
Use: "upload",
16+
Short: "Upload the schema, queries, and configuration for this project",
1717
RunE: func(cmd *cobra.Command, args []string) error {
1818
stderr := cmd.ErrOrStderr()
1919
dir, name := getConfigPath(stderr, cmd.Flag("file"))
20-
if err := createPkg(ParseEnv(cmd), dir, name, stderr); err != nil {
21-
fmt.Fprintf(stderr, "error building package: %s\n", err)
20+
if err := createPkg(cmd.Context(), ParseEnv(cmd), dir, name, stderr); err != nil {
21+
fmt.Fprintf(stderr, "error uploading project: %s\n", err)
2222
os.Exit(1)
2323
}
2424
return nil
2525
},
2626
}
2727

28-
func createPkg(e Env, dir, filename string, stderr io.Writer) error {
28+
func createPkg(ctx context.Context, e Env, dir, filename string, stderr io.Writer) error {
2929
configPath, conf, err := readConfig(stderr, dir, filename)
3030
if err != nil {
3131
return err
3232
}
33-
tarball, err := bundler.Build(configPath, conf)
33+
up := bundler.NewUploader(configPath, conf)
3434
if err != nil {
3535
return err
3636
}
37-
38-
// TODO: Move this to the configuration file
39-
owner := "tabbed"
40-
project := "sqlc"
41-
42-
checksum := sha256.Sum256(tarball)
43-
sha := fmt.Sprintf("%x", checksum)
44-
output := fmt.Sprintf("%s_%s_%s.tar.gz", owner, project, sha[:10])
45-
if err := os.WriteFile(output, tarball, 0644); err != nil {
46-
return err
47-
}
48-
49-
return nil
37+
return up.Upload(ctx)
5038
}

0 commit comments

Comments
 (0)