latest
This commit is contained in:
parent
a9f23c79d2
commit
ec3e7c23eb
@ -4,3 +4,4 @@
|
|||||||
/dockerdeps
|
/dockerdeps
|
||||||
/tmp
|
/tmp
|
||||||
*.docker.tzst
|
*.docker.tzst
|
||||||
|
*.tmp
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,7 +2,7 @@ mfer/*.pb.go
|
|||||||
/mfer.cmd
|
/mfer.cmd
|
||||||
vendor
|
vendor
|
||||||
/tmp
|
/tmp
|
||||||
/buildimage/go.mod
|
*.tmp
|
||||||
/buildimage/go.sum
|
|
||||||
*.docker.tzst
|
*.docker.tzst
|
||||||
*.tzst
|
*.tzst
|
||||||
|
/builddeps/modcache.tar
|
||||||
|
2
.golangci.yml
Normal file
2
.golangci.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
run:
|
||||||
|
tests: false
|
80
Dockerfile
80
Dockerfile
@ -1,47 +1,53 @@
|
|||||||
FROM golang:1.19.3-bullseye AS cacher
|
################################################################################
|
||||||
|
#2345678911234567892123456789312345678941234567895123456789612345678971234567898
|
||||||
|
################################################################################
|
||||||
|
FROM golang:1.19.3-bullseye AS builder
|
||||||
ENV GOPATH /go
|
ENV GOPATH /go
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
RUN --mount=type=cache,target=/var/cache/apt \
|
RUN --mount=type=cache,target=/var/cache/apt \
|
||||||
apt update && apt install -y make zstd curl unzip
|
apt update && \
|
||||||
RUN mkdir -p /build
|
apt install -y make zstd unzip && \
|
||||||
WORKDIR /build
|
mkdir /build
|
||||||
|
WORKDIR /tmp
|
||||||
# install newer protoc
|
# install newer protoc
|
||||||
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v21.10/protoc-21.10-linux-aarch_64.zip && \
|
COPY ./builddeps/* ./
|
||||||
unzip *.zip -d /usr/local && rm -v *.zip && protoc --version
|
RUN unzip protoc-*-linux-$(uname -m).zip -d /usr/local && \
|
||||||
|
protoc --version && \
|
||||||
RUN go install -v google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.1
|
mkdir -p /go/pkg/mod && \
|
||||||
|
cd /go/pkg/mod && \
|
||||||
COPY ./go.mod .
|
tar xvf /tmp/modcache.tar && \
|
||||||
COPY ./go.sum .
|
cd / && \
|
||||||
|
go install -v google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.1 && \
|
||||||
RUN --mount=type=cache,target=/go/pkg go mod download -x
|
go install -v mvdan.cc/gofumpt@latest && \
|
||||||
RUN go env
|
go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1 && \
|
||||||
## build image
|
rm -rf /tmp/*
|
||||||
FROM golang:1.19.3-bullseye AS builder
|
|
||||||
|
|
||||||
COPY --from=cacher /usr/local /usr/local
|
|
||||||
COPY --from=cacher /usr/bin /usr/bin
|
|
||||||
COPY --from=cacher /go/bin /go/bin
|
|
||||||
COPY --from=cacher /build /build
|
|
||||||
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
COPY ./go.mod ./go.sum .
|
||||||
COPY ./ ./
|
RUN \
|
||||||
RUN --mount=type=cache,target=/go/pkg go mod download -x && go mod tidy && cd mfer && go generate .
|
go mod download -x
|
||||||
RUN --mount=type=cache,target=/go/pkg make mfer.cmd && go mod vendor
|
################################################################################
|
||||||
RUN tar -c . | zstdmt -19 > /src.tzst
|
#### caching phase done
|
||||||
|
################################################################################
|
||||||
## lint image
|
|
||||||
FROM golangci/golangci-lint:v1.50.1 AS linter
|
|
||||||
|
|
||||||
COPY --from=cacher /build /build
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
RUN golangci-lint run
|
COPY ./Makefile ./.golangci.yml ./go.mod ./go.sum .
|
||||||
|
COPY ./internal ./internal
|
||||||
|
COPY ./bin/gitrev.sh ./bin/gitrev.sh
|
||||||
|
COPY ./mfer ./mfer
|
||||||
|
COPY ./cmd ./cmd
|
||||||
|
RUN find /build
|
||||||
|
ARG GITREV unknown
|
||||||
|
RUN \
|
||||||
|
cd mfer && go generate . && cd .. && \
|
||||||
|
GOPACKAGESDEBUG=true golangci-lint run ./... && \
|
||||||
|
make mfer.cmd
|
||||||
|
RUN go mod vendor && tar -c . | zstdmt -19 > /src.tzst
|
||||||
|
################################################################################
|
||||||
|
#2345678911234567892123456789312345678941234567895123456789612345678971234567898
|
||||||
|
################################################################################
|
||||||
|
## final image
|
||||||
|
################################################################################
|
||||||
FROM scratch
|
FROM scratch
|
||||||
|
# we put all the source into the final image for posterity, it's small
|
||||||
COPY --from=builder /src.tzst /src.tzst
|
COPY --from=builder /src.tzst /src.tzst
|
||||||
COPY --from=builder /build/mfer.cmd /mfer
|
COPY --from=builder /build/mfer.cmd /mfer
|
||||||
ENTRYPOINT ["/mfer"]
|
ENTRYPOINT ["/mfer"]
|
||||||
|
|
||||||
|
20
Makefile
20
Makefile
@ -3,16 +3,14 @@ export PROGRESS_NO_TRUNC := 1
|
|||||||
GOPATH := $(shell go env GOPATH)
|
GOPATH := $(shell go env GOPATH)
|
||||||
export PATH := $(PATH):$(GOPATH)/bin
|
export PATH := $(PATH):$(GOPATH)/bin
|
||||||
PROTOC_GEN_GO := $(GOPATH)/bin/protoc-gen-go
|
PROTOC_GEN_GO := $(GOPATH)/bin/protoc-gen-go
|
||||||
|
|
||||||
SOURCEFILES := mfer/*.go mfer/*.proto internal/*/*.go cmd/*/*.go go.mod go.sum
|
SOURCEFILES := mfer/*.go mfer/*.proto internal/*/*.go cmd/*/*.go go.mod go.sum
|
||||||
|
|
||||||
ARCH := $(shell uname -m)
|
ARCH := $(shell uname -m)
|
||||||
GITREV := $(shell git describe --always --dirty=-dirty)
|
GITREV_BUILD := $(shell bash $(PWD)/bin/gitrev.sh)
|
||||||
APPNAME := mfer
|
APPNAME := mfer
|
||||||
|
VERSION := 0.1.0
|
||||||
export DOCKER_IMAGE_CACHE_DIR := $(HOME)/Library/Caches/Docker/$(APPNAME)-$(ARCH)
|
export DOCKER_IMAGE_CACHE_DIR := $(HOME)/Library/Caches/Docker/$(APPNAME)-$(ARCH)
|
||||||
|
GOLDFLAGS += -X main.Version=$(VERSION)
|
||||||
GOLDFLAGS += -X main.Version=0.1.0
|
GOLDFLAGS += -X main.Gitrev=$(GITREV_BUILD)
|
||||||
GOLDFLAGS += -X main.Gitrev=$(GITREV)
|
|
||||||
GOFLAGS := -ldflags "$(GOLDFLAGS)"
|
GOFLAGS := -ldflags "$(GOLDFLAGS)"
|
||||||
|
|
||||||
.PHONY: docker default run ci test fixme
|
.PHONY: docker default run ci test fixme
|
||||||
@ -25,7 +23,7 @@ run: ./mfer.cmd
|
|||||||
|
|
||||||
ci: test
|
ci: test
|
||||||
|
|
||||||
test:
|
test: $(SOURCEFILES) mfer/mf.pb.go
|
||||||
go test -v --timeout 3s ./...
|
go test -v --timeout 3s ./...
|
||||||
|
|
||||||
$(PROTOC_GEN_GO):
|
$(PROTOC_GEN_GO):
|
||||||
@ -38,9 +36,11 @@ devprereqs:
|
|||||||
which gofumpt || go install -v mvdan.cc/gofumpt@latest
|
which gofumpt || go install -v mvdan.cc/gofumpt@latest
|
||||||
which golangci-lint || go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
|
which golangci-lint || go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
|
||||||
|
|
||||||
mfer.cmd: $(SOURCEFILES)
|
mfer/mf.pb.go: mfer/mf.proto
|
||||||
protoc --version
|
|
||||||
cd mfer && go generate .
|
cd mfer && go generate .
|
||||||
|
|
||||||
|
mfer.cmd: $(SOURCEFILES) mfer/mf.pb.go
|
||||||
|
protoc --version
|
||||||
make test
|
make test
|
||||||
cd cmd/mfer && go build -tags urfave_cli_no_docs -o ../../mfer.cmd $(GOFLAGS) .
|
cd cmd/mfer && go build -tags urfave_cli_no_docs -o ../../mfer.cmd $(GOFLAGS) .
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ docker: sneak-mfer.$(ARCH).docker.tzst
|
|||||||
|
|
||||||
sneak-mfer.$(ARCH).docker.tzst: $(SOURCEFILES)
|
sneak-mfer.$(ARCH).docker.tzst: $(SOURCEFILES)
|
||||||
bash -x bin/docker-prereqs.sh
|
bash -x bin/docker-prereqs.sh
|
||||||
docker build --progress plain -t sneak/mfer .
|
docker build --progress plain --build-arg GITREV=$(GITREV_BUILD) -t sneak/mfer .
|
||||||
docker save sneak/mfer | pv | zstdmt -19 > $@
|
docker save sneak/mfer | pv | zstdmt -19 > $@
|
||||||
du -sh $@
|
du -sh $@
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -euxo pipefail
|
set -euxo pipefail
|
||||||
GOI="golang:1.19.3-bullseye"
|
GOI="golang:1.19.3-bullseye"
|
||||||
CII="golangci/golangci-lint:v1.50.1"
|
#CII="golangci/golangci-lint:v1.50.1"
|
||||||
|
|
||||||
if [[ ! -d "$DOCKER_IMAGE_CACHE_DIR" ]]; then
|
if [[ ! -d "$DOCKER_IMAGE_CACHE_DIR" ]]; then
|
||||||
mkdir -p "$DOCKER_IMAGE_CACHE_DIR"
|
mkdir -p "$DOCKER_IMAGE_CACHE_DIR"
|
||||||
@ -16,21 +16,32 @@ function buildImageCache() {
|
|||||||
mv $DICD/go.tzst.tmp $DICD/go.tzst
|
mv $DICD/go.tzst.tmp $DICD/go.tzst
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -e "$DICD/ci.tzst" ]]; then
|
#if [[ ! -e "$DICD/ci.tzst" ]]; then
|
||||||
docker pull $CII
|
# docker pull $CII
|
||||||
docker save $CII | pv | zstdmt -19 > $DICD/ci.tzst.tmp && \
|
# docker save $CII | pv | zstdmt -19 > $DICD/ci.tzst.tmp && \
|
||||||
mv $DICD/ci.tzst.tmp $DICD/ci.tzst
|
# mv $DICD/ci.tzst.tmp $DICD/ci.tzst
|
||||||
fi
|
#fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadImageCache() {
|
function loadImageCache() {
|
||||||
docker image ls $CII || \
|
# zstdmt -d --stdout $DICD/ci.tzst | pv | docker load
|
||||||
zstdmt -d --stdout $DICD/ci.tzst | pv | docker load
|
zstdmt -d --stdout $DICD/go.tzst | pv | docker load
|
||||||
|
|
||||||
docker image ls $GOI || \
|
#docker image ls $CII
|
||||||
zstdmt -d --stdout $DICD/go.tzst | pv | docker load
|
docker image ls $GOI
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeModuleCache() {
|
||||||
|
if [[ ! -e $DICD/modcache.tar ]]; then
|
||||||
|
cd $(go env GOMODCACHE)
|
||||||
|
tar -c . | pv > $DICD/modcache.tar.tmp && mv $DICD/modcache.tar.tmp $DICD/modcache.tar
|
||||||
|
cd -
|
||||||
|
fi
|
||||||
|
cp -av $DICD/modcache.tar ./builddeps/modcache.tar.tmp && mv ./builddeps/modcache.tar.tmp ./builddeps/modcache.tar
|
||||||
}
|
}
|
||||||
|
|
||||||
buildImageCache
|
buildImageCache
|
||||||
|
|
||||||
loadImageCache
|
loadImageCache
|
||||||
|
writeModuleCache
|
||||||
|
|
||||||
|
6
bin/gitrev.sh
Normal file
6
bin/gitrev.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if [[ ! -z "$GITREV" ]]; then
|
||||||
|
echo $GITREV
|
||||||
|
else
|
||||||
|
git describe --always --dirty=-dirty
|
||||||
|
fi
|
BIN
builddeps/protoc-21.10-linux-aarch64.zip
Normal file
BIN
builddeps/protoc-21.10-linux-aarch64.zip
Normal file
Binary file not shown.
BIN
builddeps/protoc-21.10-linux-x86_64.zip
Normal file
BIN
builddeps/protoc-21.10-linux-x86_64.zip
Normal file
Binary file not shown.
9
go.mod
9
go.mod
@ -1,6 +1,6 @@
|
|||||||
module git.eeqj.de/sneak/mfer
|
module git.eeqj.de/sneak/mfer
|
||||||
|
|
||||||
go 1.19
|
go 1.17
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/apex/log v1.9.0
|
github.com/apex/log v1.9.0
|
||||||
@ -8,14 +8,14 @@ require (
|
|||||||
github.com/pterm/pterm v0.12.35
|
github.com/pterm/pterm v0.12.35
|
||||||
github.com/spf13/afero v1.8.0
|
github.com/spf13/afero v1.8.0
|
||||||
github.com/stretchr/testify v1.8.1
|
github.com/stretchr/testify v1.8.1
|
||||||
github.com/urfave/cli/v2 v2.3.0
|
github.com/urfave/cli/v2 v2.23.6
|
||||||
google.golang.org/protobuf v1.28.1
|
google.golang.org/protobuf v1.28.1
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/atomicgo/cursor v0.0.1 // indirect
|
github.com/atomicgo/cursor v0.0.1 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||||
github.com/fatih/color v1.7.0 // indirect
|
github.com/fatih/color v1.7.0 // indirect
|
||||||
github.com/gookit/color v1.4.2 // indirect
|
github.com/gookit/color v1.4.2 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.2 // indirect
|
github.com/mattn/go-colorable v0.1.2 // indirect
|
||||||
@ -24,9 +24,10 @@ require (
|
|||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
|
||||||
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||||
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c // indirect
|
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c // indirect
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
||||||
golang.org/x/text v0.3.4 // indirect
|
golang.org/x/text v0.3.4 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -63,6 +63,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht
|
|||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@ -190,6 +192,8 @@ github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
|
|||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
@ -219,8 +223,12 @@ github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPf
|
|||||||
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
|
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
|
||||||
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
|
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
|
||||||
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
|
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
|
||||||
|
github.com/urfave/cli/v2 v2.23.6 h1:iWmtKD+prGo1nKUtLO0Wg4z9esfBM4rAV4QRLQiEmJ4=
|
||||||
|
github.com/urfave/cli/v2 v2.23.6/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
|
||||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
||||||
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
||||||
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
@ -7,5 +7,6 @@ import (
|
|||||||
|
|
||||||
func (mfa *CLIApp) fetchManifestOperation(c *cli.Context) error {
|
func (mfa *CLIApp) fetchManifestOperation(c *cli.Context) error {
|
||||||
log.Debugf("fetchManifestOperation()")
|
log.Debugf("fetchManifestOperation()")
|
||||||
return nil
|
panic("not implemented")
|
||||||
|
return nil //nolint
|
||||||
}
|
}
|
||||||
|
@ -8,27 +8,31 @@ import (
|
|||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (mfa *CLIApp) generateManifestOperation(c *cli.Context) error {
|
func (mfa *CLIApp) generateManifestOperation(ctx *cli.Context) error {
|
||||||
fmt.Println("generateManifestOperation()")
|
fmt.Println("generateManifestOperation()")
|
||||||
myArgs := c.Args()
|
myArgs := ctx.Args()
|
||||||
spew.Dump(myArgs)
|
spew.Dump(myArgs)
|
||||||
|
|
||||||
fmt.Printf("%#v\n", c.Args().First())
|
fmt.Printf("%#v\n", ctx.Args().First())
|
||||||
if c.Args().Len() > 0 {
|
if ctx.Args().Len() > 0 {
|
||||||
fmt.Printf("%#v\n", c.Args().Get(1))
|
fmt.Printf("%#v\n", ctx.Args().Get(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt.Printf("called with arg: %s\n", c.String("input"))
|
// fmt.Printf("called with arg: %s\n", c.String("input"))
|
||||||
|
|
||||||
opts := &mfer.ManifestScanOptions{
|
opts := &mfer.ManifestScanOptions{
|
||||||
IgnoreDotfiles: c.Bool("IgnoreDotfiles"),
|
IgnoreDotfiles: ctx.Bool("IgnoreDotfiles"),
|
||||||
FollowSymLinks: c.Bool("FollowSymLinks"),
|
FollowSymLinks: ctx.Bool("FollowSymLinks"),
|
||||||
}
|
}
|
||||||
// FIXME add command flags for ignoring dotfiles and following symlinks
|
paths := make([]string, ctx.Args().Len())
|
||||||
mf, err := mfer.NewFromPath(c.String("input"), opts)
|
for i := 0; i < ctx.Args().Len(); i++ {
|
||||||
|
paths = append(paths, ctx.Args().Get(i))
|
||||||
|
}
|
||||||
|
mf, err := mfer.NewFromPaths(opts, paths...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
mf.WithContext(ctx)
|
||||||
|
|
||||||
spew.Dump(mf)
|
spew.Dump(mf)
|
||||||
|
|
||||||
|
@ -5,11 +5,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.eeqj.de/sneak/mfer/internal/log"
|
||||||
"github.com/pterm/pterm"
|
"github.com/pterm/pterm"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
"github.com/apex/log"
|
|
||||||
acli "github.com/apex/log/handlers/cli"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CLIApp struct {
|
type CLIApp struct {
|
||||||
@ -26,17 +24,6 @@ func (mfa *CLIApp) printBanner() {
|
|||||||
pterm.DefaultCenter.Println(s) // Print BigLetters with the default CenterPrinter
|
pterm.DefaultCenter.Println(s) // Print BigLetters with the default CenterPrinter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mfa *CLIApp) disableStyling() {
|
|
||||||
pterm.DisableColor()
|
|
||||||
pterm.DisableStyling()
|
|
||||||
pterm.Debug.Prefix.Text = ""
|
|
||||||
pterm.Info.Prefix.Text = ""
|
|
||||||
pterm.Success.Prefix.Text = ""
|
|
||||||
pterm.Warning.Prefix.Text = ""
|
|
||||||
pterm.Error.Prefix.Text = ""
|
|
||||||
pterm.Fatal.Prefix.Text = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mfa *CLIApp) VersionString() string {
|
func (mfa *CLIApp) VersionString() string {
|
||||||
return fmt.Sprintf("%s (%s)", mfa.version, mfa.gitrev)
|
return fmt.Sprintf("%s (%s)", mfa.version, mfa.gitrev)
|
||||||
}
|
}
|
||||||
@ -46,11 +33,10 @@ func (mfa *CLIApp) run() {
|
|||||||
|
|
||||||
if NO_COLOR {
|
if NO_COLOR {
|
||||||
// shoutout to rob pike who thinks it's juvenile
|
// shoutout to rob pike who thinks it's juvenile
|
||||||
mfa.disableStyling()
|
log.DisableStyling()
|
||||||
}
|
}
|
||||||
|
|
||||||
log.SetHandler(acli.Default)
|
log.Init()
|
||||||
log.SetLevel(log.InfoLevel)
|
|
||||||
|
|
||||||
mfa.app = &cli.App{
|
mfa.app = &cli.App{
|
||||||
Name: mfa.appname,
|
Name: mfa.appname,
|
||||||
@ -71,7 +57,7 @@ func (mfa *CLIApp) run() {
|
|||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
if c.Bool("verbose") {
|
if c.Bool("verbose") {
|
||||||
log.SetLevel(log.DebugLevel)
|
log.IncreaseLevel()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
45
internal/log/log.go
Normal file
45
internal/log/log.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package log
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/apex/log"
|
||||||
|
acli "github.com/apex/log/handlers/cli"
|
||||||
|
"github.com/pterm/pterm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DisableStyling() {
|
||||||
|
pterm.DisableColor()
|
||||||
|
pterm.DisableStyling()
|
||||||
|
pterm.Debug.Prefix.Text = ""
|
||||||
|
pterm.Info.Prefix.Text = ""
|
||||||
|
pterm.Success.Prefix.Text = ""
|
||||||
|
pterm.Warning.Prefix.Text = ""
|
||||||
|
pterm.Error.Prefix.Text = ""
|
||||||
|
pterm.Fatal.Prefix.Text = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func Init() {
|
||||||
|
log.SetHandler(acli.Default)
|
||||||
|
log.SetLevel(log.InfoLevel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetLevel(arg log.Level) {
|
||||||
|
log.SetLevel(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLevel() log.Level {
|
||||||
|
if logger, ok := log.Log.(*log.Logger); ok {
|
||||||
|
return logger.Level
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func IncreaseLevel() {
|
||||||
|
SetLevel(GetLevel() + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithError(e error) *log.Entry {
|
||||||
|
if logger, ok := log.Log.(*log.Logger); ok {
|
||||||
|
return logger.WithError(e)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
171
mfer/manifest.go
171
mfer/manifest.go
@ -8,29 +8,32 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/spf13/afero"
|
"github.com/spf13/afero"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ManifestFile struct {
|
type manifestFile struct {
|
||||||
Path string
|
path string
|
||||||
FileInfo fs.FileInfo
|
info fs.FileInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ManifestFile) String() string {
|
func (m *manifestFile) String() string {
|
||||||
return fmt.Sprintf("<File \"%s\">", m.Path)
|
return fmt.Sprintf("<File \"%s\">", m.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Manifest struct {
|
type manifest struct {
|
||||||
SourceFS afero.Fs
|
sourceFS []afero.Fs
|
||||||
SourceFSRoot string
|
//sourceFSRoot string
|
||||||
Files []*ManifestFile
|
files []*manifestFile
|
||||||
ScanOptions *ManifestScanOptions
|
scanOptions *ManifestScanOptions
|
||||||
TotalFileSize int64
|
totalFileSize int64
|
||||||
PBInner *MFFile
|
pbInner *MFFile
|
||||||
PBOuter *MFFileOuter
|
pbOuter *MFFileOuter
|
||||||
|
ctx *cli.Context
|
||||||
|
errors []*error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manifest) String() string {
|
func (m *manifest) String() string {
|
||||||
return fmt.Sprintf("<Manifest count=%d totalSize=%d>", len(m.Files), m.TotalFileSize)
|
return fmt.Sprintf("<Manifest count=%d totalSize=%d>", len(m.files), m.totalFileSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ManifestScanOptions struct {
|
type ManifestScanOptions struct {
|
||||||
@ -38,38 +41,74 @@ type ManifestScanOptions struct {
|
|||||||
FollowSymLinks bool
|
FollowSymLinks bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFromPath(inputPath string, options *ManifestScanOptions) (*Manifest, error) {
|
func (m *manifest) HasError() bool {
|
||||||
|
return len(m.errors) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) AddError(e error) *manifest {
|
||||||
|
m.errors = append(m.errors, &e)
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) WithContext(c *cli.Context) *manifest {
|
||||||
|
m.ctx = c
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) addInputPath(inputPath string) error {
|
||||||
abs, err := filepath.Abs(inputPath)
|
abs, err := filepath.Abs(inputPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
afs := afero.NewBasePathFs(afero.NewOsFs(), abs)
|
// FIXME check to make sure inputPath/abs exists maybe
|
||||||
m, err := NewFromFS(afs, options)
|
afs := afero.NewReadOnlyFs(afero.NewBasePathFs(afero.NewOsFs(), abs))
|
||||||
if err != nil {
|
m.addInputFS(afs)
|
||||||
return nil, err
|
return nil
|
||||||
}
|
|
||||||
m.SourceFSRoot = abs
|
|
||||||
return m, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFromFS(fs afero.Fs, options *ManifestScanOptions) (*Manifest, error) {
|
func (m *manifest) addInputFS(f afero.Fs) error {
|
||||||
m := &Manifest{
|
if m.sourceFS == nil {
|
||||||
SourceFS: fs,
|
m.sourceFS = make([]afero.Fs, 1)
|
||||||
ScanOptions: options,
|
|
||||||
}
|
}
|
||||||
err := m.Scan()
|
m.sourceFS = append(m.sourceFS, f)
|
||||||
|
// FIXME do some sort of check on f here?
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() *manifest {
|
||||||
|
m := &manifest{}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFromPaths(options *ManifestScanOptions, inputPaths ...string) (*manifest, error) {
|
||||||
|
m := New()
|
||||||
|
m.scanOptions = options
|
||||||
|
for _, p := range inputPaths {
|
||||||
|
m.addInputPath(p)
|
||||||
|
}
|
||||||
|
err := m.scan()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manifest) GetFileCount() int64 {
|
func NewFromFS(options *ManifestScanOptions, fs afero.Fs) (*manifest, error) {
|
||||||
return int64(len(m.Files))
|
m := New()
|
||||||
|
m.scanOptions = options
|
||||||
|
err := m.addInputFS(fs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manifest) GetTotalFileSize() int64 {
|
func (m *manifest) GetFileCount() int64 {
|
||||||
return m.TotalFileSize
|
return int64(len(m.files))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) GetTotalFileSize() int64 {
|
||||||
|
return m.totalFileSize
|
||||||
}
|
}
|
||||||
|
|
||||||
func pathIsHidden(p string) bool {
|
func pathIsHidden(p string) bool {
|
||||||
@ -89,39 +128,41 @@ func pathIsHidden(p string) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
func (m *manifest) addFile(p string, fi fs.FileInfo, sfsIndex int) error {
|
||||||
func timeToTimestamp(t time.Time) *Timestamp {
|
if m.scanOptions.IgnoreDotfiles && pathIsHidden(p) {
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func (m *Manifest) Scan() error {
|
|
||||||
// FIXME scan and whatever function does the hashing should take ctx
|
|
||||||
oe := afero.Walk(m.SourceFS, "/", func(p string, info fs.FileInfo, err error) error {
|
|
||||||
if m.ScanOptions.IgnoreDotfiles && pathIsHidden(p) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if info != nil && info.IsDir() {
|
|
||||||
// manifests contain only files, directories are implied.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fileinfo, staterr := m.SourceFS.Stat(p)
|
|
||||||
if staterr != nil {
|
|
||||||
panic(staterr)
|
|
||||||
}
|
|
||||||
|
|
||||||
nf := &ManifestFile{
|
|
||||||
Path: p,
|
|
||||||
FileInfo: fileinfo,
|
|
||||||
}
|
|
||||||
m.Files = append(m.Files, nf)
|
|
||||||
m.TotalFileSize = m.TotalFileSize + info.Size()
|
|
||||||
return nil
|
return nil
|
||||||
})
|
}
|
||||||
if oe != nil {
|
if fi != nil && fi.IsDir() {
|
||||||
return oe
|
// manifests contain only files, directories are implied.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// FIXME test if 'fi' is already result of stat
|
||||||
|
fileinfo, staterr := m.sourceFS[sfsIndex].Stat(p)
|
||||||
|
if staterr != nil {
|
||||||
|
return staterr
|
||||||
|
}
|
||||||
|
cleanPath := p
|
||||||
|
if cleanPath[0:1] == "/" {
|
||||||
|
cleanPath = cleanPath[1:]
|
||||||
|
}
|
||||||
|
nf := &manifestFile{
|
||||||
|
path: cleanPath,
|
||||||
|
info: fileinfo,
|
||||||
|
}
|
||||||
|
m.files = append(m.files, nf)
|
||||||
|
m.totalFileSize = m.totalFileSize + fi.Size()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) scan() error {
|
||||||
|
// FIXME scan and whatever function does the hashing should take ctx
|
||||||
|
for idx, sfs := range m.sourceFS {
|
||||||
|
e := afero.Walk(sfs, "/", func(p string, info fs.FileInfo, err error) error {
|
||||||
|
return m.addFile(p, info, idx)
|
||||||
|
})
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
option go_package = "git.eeqj.de/sneak/mfer";
|
option go_package = "git.eeqj.de/sneak/mfer/mfer";
|
||||||
|
|
||||||
message Timestamp {
|
message Timestamp {
|
||||||
int64 seconds = 1;
|
int64 seconds = 1;
|
||||||
|
@ -37,9 +37,9 @@ func TestPathHiddenFunc(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestManifestGenerationOne(t *testing.T) {
|
func TestManifestGenerationOne(t *testing.T) {
|
||||||
m, err := NewFromFS(mf, &ManifestScanOptions{
|
m, err := NewFromFS(&ManifestScanOptions{
|
||||||
IgnoreDotfiles: true,
|
IgnoreDotfiles: true,
|
||||||
})
|
}, mf)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.NotNil(t, m)
|
assert.NotNil(t, m)
|
||||||
assert.Equal(t, int64(2), m.GetFileCount())
|
assert.Equal(t, int64(2), m.GetFileCount())
|
||||||
@ -47,12 +47,14 @@ func TestManifestGenerationOne(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestManifestGenerationTwo(t *testing.T) {
|
func TestManifestGenerationTwo(t *testing.T) {
|
||||||
m, err := NewFromFS(mf, &ManifestScanOptions{
|
m, err := NewFromFS(&ManifestScanOptions{
|
||||||
IgnoreDotfiles: false,
|
IgnoreDotfiles: false,
|
||||||
})
|
}, mf)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.NotNil(t, m)
|
assert.NotNil(t, m)
|
||||||
spew.Dump(m)
|
spew.Dump(m)
|
||||||
assert.Equal(t, int64(4), m.GetFileCount())
|
assert.Equal(t, int64(4), m.GetFileCount())
|
||||||
assert.Equal(t, int64(54), m.GetTotalFileSize())
|
assert.Equal(t, int64(54), m.GetTotalFileSize())
|
||||||
|
err = m.generate()
|
||||||
|
assert.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (m *Manifest) WriteToFile(path string) error {
|
func (m *manifest) WriteToFile(path string) error {
|
||||||
// FIXME refuse to overwrite without -f if file exists
|
// FIXME refuse to overwrite without -f if file exists
|
||||||
|
|
||||||
f, err := os.Create(path)
|
f, err := os.Create(path)
|
||||||
@ -17,7 +17,7 @@ func (m *Manifest) WriteToFile(path string) error {
|
|||||||
return m.Write(f)
|
return m.Write(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manifest) Write(output io.Writer) error {
|
func (m *manifest) Write(output io.Writer) error {
|
||||||
// FIXME implement
|
// FIXME implement
|
||||||
panic("nope")
|
panic("nope")
|
||||||
return nil // nolint:all
|
return nil // nolint:all
|
||||||
|
@ -1,12 +1,55 @@
|
|||||||
package mfer
|
package mfer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
//go:generate protoc --go_out=. --go_opt=paths=source_relative mf.proto
|
//go:generate protoc --go_out=. --go_opt=paths=source_relative mf.proto
|
||||||
|
|
||||||
func (m *Manifest) Generate() error {
|
func newTimestampFromTime(t time.Time) *Timestamp {
|
||||||
m.PBInner = &MFFile{
|
out := &Timestamp{
|
||||||
Version: MFFile_ONE,
|
Seconds: t.Unix(),
|
||||||
// CreatedAt: time.Now(),
|
Nanos: int32(t.UnixNano() - (t.Unix() * 1000000000)),
|
||||||
Files: []*MFFilePath{},
|
|
||||||
}
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) generate() error {
|
||||||
|
if m.pbInner == nil {
|
||||||
|
e := m.generateInner()
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output, err := proto.Marshal(m.pbInner)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
spew.Dump(output)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) generateOuter(inner *MFFile) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *manifest) generateInner() error {
|
||||||
|
m.pbInner = &MFFile{
|
||||||
|
Version: MFFile_ONE,
|
||||||
|
CreatedAt: newTimestampFromTime(time.Now()),
|
||||||
|
Files: []*MFFilePath{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range m.files {
|
||||||
|
nf := &MFFilePath{
|
||||||
|
Path: f.path,
|
||||||
|
// FIXME add more stuff
|
||||||
|
}
|
||||||
|
m.pbInner.Files = append(m.pbInner.Files, nf)
|
||||||
|
}
|
||||||
|
spew.Dump(m.pbInner)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user