apps/kepler/archive.go 1.8 K raw
1
package main
2
3
import (
4
	"archive/tar"
5
	"archive/zip"
6
	"compress/gzip"
7
	"io"
8
	"net/http"
9
	"strings"
10
11
	"github.com/go-git/go-git/v5"
12
	"github.com/go-git/go-git/v5/plumbing/filemode"
13
	"github.com/go-git/go-git/v5/plumbing/object"
14
)
15
16
func writeTarGz(w http.ResponseWriter, repo *git.Repository, ref, prefix string) error {
17
	c, err := resolveRef(repo, ref)
18
	if err != nil {
19
		return err
20
	}
21
	tree, err := c.Tree()
22
	if err != nil {
23
		return err
24
	}
25
26
	gz := gzip.NewWriter(w)
27
	defer gz.Close()
28
	tw := tar.NewWriter(gz)
29
	defer tw.Close()
30
31
	return tree.Files().ForEach(func(f *object.File) error {
32
		mode := int64(0644)
33
		if f.Mode == filemode.Executable {
34
			mode = 0755
35
		}
36
		hdr := &tar.Header{
37
			Name: prefix + "/" + f.Name,
38
			Mode: mode,
39
			Size: f.Size,
40
		}
41
		if err := tw.WriteHeader(hdr); err != nil {
42
			return err
43
		}
44
		r, err := f.Blob.Reader()
45
		if err != nil {
46
			return err
47
		}
48
		_, err = io.Copy(tw, r)
49
		r.Close()
50
		return err
51
	})
52
}
53
54
func writeZip(w http.ResponseWriter, repo *git.Repository, ref, prefix string) error {
55
	c, err := resolveRef(repo, ref)
56
	if err != nil {
57
		return err
58
	}
59
	tree, err := c.Tree()
60
	if err != nil {
61
		return err
62
	}
63
64
	zw := zip.NewWriter(w)
65
	defer zw.Close()
66
67
	return tree.Files().ForEach(func(f *object.File) error {
68
		zf, err := zw.Create(prefix + "/" + f.Name)
69
		if err != nil {
70
			return err
71
		}
72
		r, err := f.Blob.Reader()
73
		if err != nil {
74
			return err
75
		}
76
		_, err = io.Copy(zf, r)
77
		r.Close()
78
		return err
79
	})
80
}
81
82
func parseArchiveName(name string) (ref, format string, ok bool) {
83
	if strings.HasSuffix(name, ".tar.gz") {
84
		return strings.TrimSuffix(name, ".tar.gz"), "tar.gz", true
85
	}
86
	if strings.HasSuffix(name, ".tgz") {
87
		return strings.TrimSuffix(name, ".tgz"), "tar.gz", true
88
	}
89
	if strings.HasSuffix(name, ".zip") {
90
		return strings.TrimSuffix(name, ".zip"), "zip", true
91
	}
92
	return "", "", false
93
}