From 5c76824e14ea4cb0d48128bff4220b63e7a3499a Mon Sep 17 00:00:00 2001 From: sneak Date: Fri, 2 Dec 2022 01:31:49 +0100 Subject: [PATCH] builds now --- .gitignore | 4 +- Makefile | 13 +++--- cmd/mfer/main.go | 9 ++-- src/app.go => internal/cli/cli.go | 7 ++-- internal/cli/manifest.go | 51 +++++++++++++++++++++++ {src => internal/cli}/mfer.go | 33 ++++++++------- {src => mfer}/gen.go | 0 mfer/manifest.go | 46 +++++++++++++++++++++ {src => mfer}/mf.proto | 20 ++++----- mfer/mfer_test.go | 13 ++++++ src/manifest.go | 69 ------------------------------- 11 files changed, 153 insertions(+), 112 deletions(-) rename src/app.go => internal/cli/cli.go (69%) create mode 100644 internal/cli/manifest.go rename {src => internal/cli}/mfer.go (78%) rename {src => mfer}/gen.go (100%) create mode 100644 mfer/manifest.go rename {src => mfer}/mf.proto (81%) create mode 100644 mfer/mfer_test.go delete mode 100644 src/manifest.go diff --git a/.gitignore b/.gitignore index c85ffb7..8c2487d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -src/*.pb.go -/mfer +mfer/*.pb.go +/mfer.cmd diff --git a/Makefile b/Makefile index 728b444..121bb96 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,11 @@ ARCH := $(shell uname -m) VERSION := $(shell git describe --always --dirty=-dirty) GOLDFLAGS += -X main.Version=$(VERSION) -GOLDFLAGS += -X main.Buildarch=$(ARCH) GOFLAGS := -ldflags "$(GOLDFLAGS)" default: run -run: ./mfer +run: ./mfer.cmd ./$< ./$< gen @@ -23,16 +22,16 @@ devprereqs: which gofumpt || go install -v mvdan.cc/gofumpt@latest which golangci-lint || go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@latest -mfer: $(PROTOC_GEN_GO) src/*.go cmd/*/*.go +mfer.cmd: $(PROTOC_GEN_GO) mfer/*.go internal/*/*.go cmd/*/*.go protoc --version - cd src && go generate . - cd cmd/mfer && go build -o ../../mfer $(GOFLAGS) . + cd mfer && go generate . + cd cmd/mfer && go build -o ../../mfer.cmd $(GOFLAGS) . clean: - rm -rfv src/*.pb.go ./mfer + rm -rfv mfer/*.pb.go ./mfer fmt: prereqs - gofumpt -l -w src cmd + gofumpt -l -w mfer internal cmd golangci-lint run --fix prettier -w *.json *.md diff --git a/cmd/mfer/main.go b/cmd/mfer/main.go index bf613bb..efc3416 100644 --- a/cmd/mfer/main.go +++ b/cmd/mfer/main.go @@ -3,15 +3,14 @@ package main import ( "os" - mfer "git.eeqj.de/sneak/mfer/src" + "git.eeqj.de/sneak/mfer/internal/cli" ) var ( - Appname string = "mfer" - Version string - Buildarch string + Appname string = "mfer" + Version string ) func main() { - os.Exit(mfer.Run(Appname, Version, Buildarch)) + os.Exit(cli.Run(Appname, Version)) } diff --git a/src/app.go b/internal/cli/cli.go similarity index 69% rename from src/app.go rename to internal/cli/cli.go index 7815fd3..af43d4e 100644 --- a/src/app.go +++ b/internal/cli/cli.go @@ -1,4 +1,4 @@ -package mfer +package cli import ( "os" @@ -13,11 +13,10 @@ func init() { } } -func Run(Appname, Version, Buildarch string) int { - m := &mfer{} +func Run(Appname, Version string) int { + m := &CLIApp{} m.appname = Appname m.version = Version - m.buildarch = Buildarch m.exitCode = 0 m.run() diff --git a/internal/cli/manifest.go b/internal/cli/manifest.go new file mode 100644 index 0000000..4b8661b --- /dev/null +++ b/internal/cli/manifest.go @@ -0,0 +1,51 @@ +package cli + +import ( + "git.eeqj.de/sneak/mfer/mfer" + "github.com/spf13/afero" +) + +type Job struct { + innerpb *mfer.MFFileInner + outerpb *mfer.MFFile + fileCount int64 + totalSize int64 + afs afero.Fs +} + +func (m *Job) scanForFiles() error { + + m.innerpb = &mfer.MFFileInner{} + m.innerpb.Version = mfer.MFFileInner_ONE + return nil +} + +/* + walkErr := filepath.Walk(m.sourcePath, func(itemPath string, info os.FileInfo, err error) error { + + // we do not include the manifest file in the manifest + if itemPath == "index.mf" { + return nil + } + + fpi := mfer.MFFilePath{} + fpi.Path = itemPath + fpi.Size = info.Size() + m.innerpb.Files = append(m.innerpb.Files, &fpi) + m.fileCount++ + m.totalSize += fpi.Size + return nil + }) + + if walkErr != nil { + log.Fatal(walkErr) + return walkErr + } + + fmt.Printf("%#v\n", m.innerpb) + fmt.Printf("filecount = %#v\n", m.fileCount) + fmt.Printf("totalsize = %#v\n", m.totalSize) + return nil +} + +*/ diff --git a/src/mfer.go b/internal/cli/mfer.go similarity index 78% rename from src/mfer.go rename to internal/cli/mfer.go index 5d6b7a9..f58b07b 100644 --- a/src/mfer.go +++ b/internal/cli/mfer.go @@ -1,4 +1,4 @@ -package mfer +package cli import ( "fmt" @@ -10,7 +10,7 @@ import ( "github.com/urfave/cli/v2" ) -type mfer struct { +type CLIApp struct { appname string version string buildarch string @@ -20,12 +20,12 @@ type mfer struct { app *cli.App } -func (m *mfer) printBanner() { +func (m *CLIApp) printBanner() { s, _ := pterm.DefaultBigText.WithLetters(pterm.NewLettersFromString(m.appname)).Srender() pterm.DefaultCenter.Println(s) // Print BigLetters with the default CenterPrinter } -func (m *mfer) disableStyling() { +func (m *CLIApp) disableStyling() { pterm.DisableColor() pterm.DisableStyling() pterm.Debug.Prefix.Text = "" @@ -36,7 +36,7 @@ func (m *mfer) disableStyling() { pterm.Fatal.Prefix.Text = "" } -func (m *mfer) run() { +func (m *CLIApp) run() { if NO_COLOR { // shoutout to rob pike who thinks it's juvenile @@ -91,20 +91,25 @@ func (m *mfer) run() { } } -func (m *mfer) validateManifestOperation(c *cli.Context) error { +func (m *CLIApp) validateManifestOperation(c *cli.Context) error { log.Fatal("unimplemented") return nil } -func (m *mfer) generateManifestOperation(c *cli.Context) error { +func (m *CLIApp) generateManifestOperation(c *cli.Context) error { fmt.Println("generateManifest()") - mgj, err := NewMFGenerationJobFromFilesystem(c.String("input")) - if err != nil { - log.Fatal(err) - return err - } - mgj.scanForFiles() - //mgj.outputFile = c.String("output") + fmt.Printf("called with arg: %s", c.String("input")) + /* + + mgj, err := NewMFGenerationJobFromFilesystem(c.String("input")) + if err != nil { + log.Fatal(err) + return err + } + mgj.scanForFiles() + //mgj.outputFile = c.String("output") + + */ return nil } diff --git a/src/gen.go b/mfer/gen.go similarity index 100% rename from src/gen.go rename to mfer/gen.go diff --git a/mfer/manifest.go b/mfer/manifest.go new file mode 100644 index 0000000..6d9b4a7 --- /dev/null +++ b/mfer/manifest.go @@ -0,0 +1,46 @@ +package mfer + +import ( + "io" + "io/fs" + + "github.com/spf13/afero" +) + +type ManifestFile struct { + Path string + FileInfo fs.FileInfo +} + +type Manifest struct { + SourceFS afero.Fs + Files []*ManifestFile +} + +func NewFromPath(inputPath string) (*Manifest, error) { + afs := afero.NewBasePathFs(afero.NewOsFs(), inputPath) + return NewFromFilesystem(afs) +} + +func NewFromFilesystem(fs afero.Fs) (*Manifest, error) { + m := &Manifest{ + SourceFS: fs, + } + m.Scan() + return m, nil +} + +func (m *Manifest) Scan() { + afero.Walk(m.SourceFS, "", func(path string, info fs.FileInfo, err error) error { + nf := &ManifestFile{ + Path: path, + FileInfo: info, + } + m.Files = append(m.Files, nf) + return nil + }) +} + +func (m *Manifest) Write(output io.Writer) error { + return nil +} diff --git a/src/mf.proto b/mfer/mf.proto similarity index 81% rename from src/mf.proto rename to mfer/mf.proto index 1659314..7cedde3 100644 --- a/src/mf.proto +++ b/mfer/mf.proto @@ -14,12 +14,12 @@ message MFFile { } // required mffile root attributes 1xx - Version version = 101; - bytes innerMessage = 102; + Version version = 1; + bytes innerMessage = 2; // these are used solely to detect corruption/truncation // and not for cryptographic integrity. - int64 size = 103; - bytes sha256 = 104; + int64 size = 3; + bytes sha256 = 4; // 2xx for optional manifest root attributes // think we might use gosignify instead of gpg: @@ -35,18 +35,17 @@ message MFFile { message MFFilePath { // required attributes: - string path = 101; - int64 size = 102; + string path = 1; + int64 size = 2; // gotta have at least one: - repeated MFFileChecksum hashes = 201; + repeated MFFileChecksum hashes = 3; // optional per-file metadata optional string mimeType = 301; optional Timestamp mtime = 302; optional Timestamp ctime = 303; optional Timestamp atime = 304; - } message MFFileChecksum { @@ -60,11 +59,10 @@ message MFFileInner { NONE = 0; ONE = 1; // only one for now } - Version version = 101; + Version version = 1; // required manifest attributes: - int64 fileCount = 102; //FIXME is this necessary? - repeated MFFilePath files = 103; + repeated MFFilePath files = 2; // optional manifest attributes 2xx: optional Timestamp createdAt = 201; diff --git a/mfer/mfer_test.go b/mfer/mfer_test.go new file mode 100644 index 0000000..90caefc --- /dev/null +++ b/mfer/mfer_test.go @@ -0,0 +1,13 @@ +package mfer + +import "testing" + +// Add those variables as well +var ( + existingFolder = "./testdata/a-folder-that-exists" + nonExistingFolder = "./testdata/a-folder-that-does-not-exists" +) + +func TestManifestGeneration(t *testing.T) { + +} diff --git a/src/manifest.go b/src/manifest.go deleted file mode 100644 index 71a9221..0000000 --- a/src/manifest.go +++ /dev/null @@ -1,69 +0,0 @@ -package mfer - -import ( - "fmt" - "log" - "os" - "path/filepath" - - "github.com/spf13/afero" -) - -type MFGenerationJob struct { - sourcePath string - outputFile string - innerpb *MFFileInner - outerpb *MFFile - fileCount int64 - totalSize int64 - afs afero.Fs -} - -func NewMFGenerationJobFromFilesystem(sourcePath string) (*MFGenerationJob, error) { - afs := afero.NewOsFs() - exists, err := afero.DirExists(afs, sourcePath) - if err != nil { - return nil, err - } - if !exists { - return nil, fmt.Errorf("source directory does not exist") - } - - mgj := MFGenerationJob{} - mgj.afs = afs - mgj.sourcePath = sourcePath - - return &mgj, nil -} - -func (m *MFGenerationJob) scanForFiles() error { - - m.innerpb = &MFFileInner{} - m.innerpb.Version = MFFileInner_ONE - - walkErr := filepath.Walk(m.sourcePath, func(itemPath string, info os.FileInfo, err error) error { - - // we do not include the manifest file in the manifest - if itemPath == "index.mf" { - return nil - } - - fpi := MFFilePath{} - fpi.Path = itemPath - fpi.Size = info.Size() - m.innerpb.Files = append(m.innerpb.Files, &fpi) - m.fileCount++ - m.totalSize += fpi.Size - return nil - }) - - if walkErr != nil { - log.Fatal(walkErr) - return walkErr - } - - fmt.Printf("%#v\n", m.innerpb) - fmt.Printf("filecount = %#v\n", m.fileCount) - fmt.Printf("totalsize = %#v\n", m.totalSize) - return nil -}