ui-assets: Integrate UI assets.

This commit is contained in:
Harshavardhana 2016-02-04 16:00:52 -08:00
parent 53a983659e
commit a066184bed
7 changed files with 40 additions and 14 deletions

3
.gitignore vendored
View File

@ -9,4 +9,5 @@ site/
/.idea/ /.idea/
/Minio.iml /Minio.iml
**/access.log **/access.log
assetfs.go ui-assets.go
ui-assets.asc

View File

@ -3,6 +3,8 @@ DOCKER_BIN := $(shell which docker)
DOCKER_LDFLAGS := '$(LDFLAGS) -extldflags "-static"' DOCKER_LDFLAGS := '$(LDFLAGS) -extldflags "-static"'
BUILD_LDFLAGS := '$(LDFLAGS)' BUILD_LDFLAGS := '$(LDFLAGS)'
TAG := latest TAG := latest
UI_ASSETS := ui-assets.go
UI_ASSETS_ARMOR := ui-assets.asc
all: install all: install
@ -25,6 +27,12 @@ getdeps: checkdeps checkgopath
@go get -u github.com/fzipp/gocyclo && echo "Installed gocyclo:" @go get -u github.com/fzipp/gocyclo && echo "Installed gocyclo:"
@go get -u github.com/remyoudompheng/go-misc/deadcode && echo "Installed deadcode:" @go get -u github.com/remyoudompheng/go-misc/deadcode && echo "Installed deadcode:"
$(UI_ASSETS):
@curl -s https://dl.minio.io/assets/server/$(UI_ASSETS_ARMOR) 2>&1 > $(UI_ASSETS_ARMOR) && echo "Downloading signature file $(UI_ASSETS_ARMOR) for verification:"
@gpg --batch --no-tty --yes --keyserver pgp.mit.edu --recv-keys F9AAC728 2>&1 > /dev/null && echo "Importing public key:"
@curl -s https://dl.minio.io/assets/server/$@ 2>&1 > $@ && echo "Downloading UI assets file $@:"
@gpg --batch --no-tty --verify $(UI_ASSETS_ARMOR) $@ 2>&1 > /dev/null && echo "Verifying signature of downloaded assets."
verifiers: getdeps vet fmt lint cyclo verifiers: getdeps vet fmt lint cyclo
vet: vet:
@ -49,7 +57,7 @@ cyclo:
@GO15VENDOREXPERIMENT=1 ${GOPATH}/bin/gocyclo -over 65 *.go @GO15VENDOREXPERIMENT=1 ${GOPATH}/bin/gocyclo -over 65 *.go
@GO15VENDOREXPERIMENT=1 ${GOPATH}/bin/gocyclo -over 65 pkg @GO15VENDOREXPERIMENT=1 ${GOPATH}/bin/gocyclo -over 65 pkg
build: getdeps verifiers build: getdeps verifiers $(UI_ASSETS)
@echo "Installing minio:" @echo "Installing minio:"
deadcode: deadcode:

View File

@ -10,6 +10,8 @@ clone_folder: c:\gopath\src\github.com\minio\minio
environment: environment:
GOPATH: c:\gopath GOPATH: c:\gopath
GO15VENDOREXPERIMENT: 1 GO15VENDOREXPERIMENT: 1
UI_ASSETS: ui-assets.go
UI_ASSETS_ARMOR: ui-assets.asc
# scripts that run after cloning repository # scripts that run after cloning repository
install: install:
@ -19,6 +21,10 @@ install:
# to run your custom scripts instead of automatic MSBuild # to run your custom scripts instead of automatic MSBuild
build_script: build_script:
- curl -o ui-assets.go -L https://dl.minio.io/assets/server/%UI_ASSETS%
- curl -o ui-assets.asc -L https://dl.minio.io/assets/server/%UI_ASSETS_ARMOR%
- gpg --batch --no-tty --yes --keyserver pgp.mit.edu --recv-keys F9AAC728
- gpg --batch --no-tty --verify %UI_ASSETS_ARMOR% %UI_ASSETS%
- go test . - go test .
- go test -race . - go test -race .
- go test github.com/minio/minio/pkg... - go test github.com/minio/minio/pkg...

View File

@ -75,8 +75,8 @@ func getWebAPIHandler(web *WebAPI) http.Handler {
root.Handle("/rpc", s) root.Handle("/rpc", s)
// Enable this when we add assets. // Enable this when we add assets.
// root.PathPrefix("/login").Handler(http.StripPrefix("/login", http.FileServer(assetFS()))) root.PathPrefix("/login").Handler(http.StripPrefix("/login", http.FileServer(assetFS())))
// root.Handle("/{file:.*}", http.FileServer(assetFS())) root.Handle("/{file:.*}", http.FileServer(assetFS()))
return registerHandlers(mux, handlerFns...) return registerHandlers(mux, handlerFns...)
} }

View File

@ -41,6 +41,6 @@ use
... ...
http.Handle("/", http.Handle("/",
http.FileServer( http.FileServer(
&assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"})) &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: AssetInfo, Prefix: "data"}))
to serve files embedded from the `data` directory. to serve files embedded from the `data` directory.

View File

@ -13,7 +13,7 @@ import (
) )
var ( var (
fileTimestamp = time.Now() defaultFileTimestamp = time.Now()
) )
// FakeFile implements os.FileInfo interface for a given path and size // FakeFile implements os.FileInfo interface for a given path and size
@ -24,6 +24,8 @@ type FakeFile struct {
Dir bool Dir bool
// Len is the length of the fake file, zero if it is a directory // Len is the length of the fake file, zero if it is a directory
Len int64 Len int64
// Timestamp is the ModTime of this file
Timestamp time.Time
} }
func (f *FakeFile) Name() string { func (f *FakeFile) Name() string {
@ -40,7 +42,7 @@ func (f *FakeFile) Mode() os.FileMode {
} }
func (f *FakeFile) ModTime() time.Time { func (f *FakeFile) ModTime() time.Time {
return fileTimestamp return f.Timestamp
} }
func (f *FakeFile) Size() int64 { func (f *FakeFile) Size() int64 {
@ -62,11 +64,14 @@ type AssetFile struct {
FakeFile FakeFile
} }
func NewAssetFile(name string, content []byte) *AssetFile { func NewAssetFile(name string, content []byte, timestamp time.Time) *AssetFile {
if timestamp.IsZero() {
timestamp = defaultFileTimestamp
}
return &AssetFile{ return &AssetFile{
bytes.NewReader(content), bytes.NewReader(content),
ioutil.NopCloser(nil), ioutil.NopCloser(nil),
FakeFile{name, false, int64(len(content))}} FakeFile{name, false, int64(len(content)), timestamp}}
} }
func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) { func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) {
@ -92,13 +97,13 @@ func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirect
fileinfos := make([]os.FileInfo, 0, len(children)) fileinfos := make([]os.FileInfo, 0, len(children))
for _, child := range children { for _, child := range children {
_, err := fs.AssetDir(filepath.Join(name, child)) _, err := fs.AssetDir(filepath.Join(name, child))
fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0}) fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0, time.Time{}})
} }
return &AssetDirectory{ return &AssetDirectory{
AssetFile{ AssetFile{
bytes.NewReader(nil), bytes.NewReader(nil),
ioutil.NopCloser(nil), ioutil.NopCloser(nil),
FakeFile{name, true, 0}, FakeFile{name, true, 0, time.Time{}},
}, },
0, 0,
fileinfos} fileinfos}
@ -127,6 +132,8 @@ type AssetFS struct {
Asset func(path string) ([]byte, error) Asset func(path string) ([]byte, error)
// AssetDir should return list of files in the path // AssetDir should return list of files in the path
AssetDir func(path string) ([]string, error) AssetDir func(path string) ([]string, error)
// AssetInfo should return the info of file in path if exists
AssetInfo func(path string) (os.FileInfo, error)
// Prefix would be prepended to http requests // Prefix would be prepended to http requests
Prefix string Prefix string
} }
@ -137,7 +144,11 @@ func (fs *AssetFS) Open(name string) (http.File, error) {
name = name[1:] name = name[1:]
} }
if b, err := fs.Asset(name); err == nil { if b, err := fs.Asset(name); err == nil {
return NewAssetFile(name, b), nil timestamp := defaultFileTimestamp
if info, err := fs.AssetInfo(name); err == nil {
timestamp = info.ModTime()
}
return NewAssetFile(name, b, timestamp), nil
} }
if children, err := fs.AssetDir(name); err == nil { if children, err := fs.AssetDir(name); err == nil {
return NewAssetDirectory(name, children, fs), nil return NewAssetDirectory(name, children, fs), nil

4
vendor/vendor.json vendored
View File

@ -19,8 +19,8 @@
}, },
{ {
"path": "github.com/elazarl/go-bindata-assetfs", "path": "github.com/elazarl/go-bindata-assetfs",
"revision": "d5cac425555ca5cf00694df246e04f05e6a55150", "revision": "57eb5e1fc594ad4b0b1dbea7b286d299e0cb43c2",
"revisionTime": "2015-08-13T07:46:22+03:00" "revisionTime": "2015-12-24T06:54:52+02:00"
}, },
{ {
"path": "github.com/fatih/color", "path": "github.com/fatih/color",