From 9a4816ac3f77c0f11fb2a1e3eb75231382dfee2b Mon Sep 17 00:00:00 2001 From: Sebastian Ibanez Date: Tue, 25 Feb 2025 13:55:07 -0500 Subject: [PATCH] feat: reimplement GetFileHashes, remove glob functionality --- client/client.go | 5 +- cmd/sync.go | 5 +- directory/directory.go | 108 ++++++++++------------------------------- go.mod | 1 - go.sum | 2 - test/client_test.go | 9 ++-- 6 files changed, 38 insertions(+), 92 deletions(-) diff --git a/client/client.go b/client/client.go index c9c3901..21cf729 100644 --- a/client/client.go +++ b/client/client.go @@ -53,7 +53,8 @@ func (c Client) AwaitSync(portNum int) error { } // Get and send file hashes - hashes, err := c.DirMan.GetFileHashes("") // "" will get all file hashes + files := []string{} + hashes, err := c.DirMan.GetFileHashes(files) // Empty slice will get all file hashes if err != nil { msg := "unable to hash directory: " + err.Error() return errors.New(msg) @@ -90,7 +91,7 @@ func (c Client) AwaitSync(portNum int) error { } // Init sync with peers -func (c Client) InitSync(filePattern string) error { +func (c Client) InitSync(filePattern []string) error { // Get file hashes localHashes, err := c.DirMan.GetFileHashes(filePattern) if err != nil { diff --git a/cmd/sync.go b/cmd/sync.go index e3f730e..8bea174 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -71,10 +71,11 @@ Uses list of peers unless port flag is specified.`, } // Init sync - filePattern := "" + filePattern := []string{} if len(args) > 0 { - filePattern = args[0] + filePattern = args } + err = c.InitSync(filePattern) if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) diff --git a/directory/directory.go b/directory/directory.go index e096b85..000cc0c 100644 --- a/directory/directory.go +++ b/directory/directory.go @@ -5,9 +5,6 @@ import ( "encoding/hex" "errors" "os" - "strings" - - "github.com/gobwas/glob" ) type DirManager struct { @@ -53,18 +50,28 @@ func (d DirManager) GetFileNames() ([]string, error) { return names, nil } -// Get file hashes. Can be: -// 1. All files -// 2. Files that match glob pattern -// 3. File that matches name -func (d DirManager) GetFileHashes(filePattern string) ([]FileHash, error) { - if filePattern == "" { +// Get file hashes +func (d DirManager) GetFileHashes(fileNames []string) ([]FileHash, error) { + if len(fileNames) == 0 { return d.getAllFileHashes() - } else if isGlobPattern(filePattern) { - return d.getGlobPatternFileHashes(filePattern) - } else { - return d.getSpecificFileHash(filePattern) } + + var hashes []FileHash + for _, file := range fileNames { + entry, err := d.findFileEntry(file) + if err != nil { + return nil, err + } + + hash, err := d.hashFile(entry) + if err != nil { + return nil, err + } + + hashes = append(hashes, hash) + } + + return hashes, nil } // Get hashes of all files in directory @@ -90,72 +97,14 @@ func (d DirManager) getAllFileHashes() ([]FileHash, error) { return hashes, err } -// Get hashes of files that math glob pattern in directory -func (d DirManager) getGlobPatternFileHashes(filePattern string) ([]FileHash, error) { - var hashes []FileHash - - if strings.Contains(filePattern, "..") { - err := errors.New("invalid glob pattern: '..' is not allowed") - return nil, err - } - - g := glob.MustCompile(filePattern) - - dirEntries, err := os.ReadDir(d.Path) - if err != nil { - return nil, err - } - - for _, entry := range dirEntries { - entryname := entry.Name() - if !entry.IsDir() && g.Match(entryname) { - // Open + read file - file, err := os.Open(d.Path + "/" + entryname) - if err != nil { - return nil, err - } - var fileData []byte - file.Read(fileData) - - // Hash raw file data - hashBytes := sha256.Sum256(fileData) - hash := hex.EncodeToString(hashBytes[:]) - - info, err := entry.Info() - if err != nil { - return nil, err - } - - fh := FileHash{ - Name: entryname, - Hash: hash, - Size: info.Size(), - } - - hashes = append(hashes, fh) - } - } - - return hashes, err -} - -// Get file hash slice for single file entry -func (d DirManager) getSpecificFileHash(filePattern string) ([]FileHash, error) { - entry, err := d.findFileEntry(filePattern) - if err != nil { - return nil, err - } - - hash, err := d.hashFile(entry) - if err != nil { - return nil, err - } - - return []FileHash{hash}, nil -} - // Return the SHA256 hash of file func (d DirManager) hashFile(entry os.DirEntry) (FileHash, error) { + // Get file as DirEntry + // entry, err := d.findFileEntry(fileName) + // if err != nil { + // return FileHash{}, err + // } + // Open + read file file, err := os.Open(d.Path + "/" + entry.Name()) if err != nil { @@ -219,8 +168,3 @@ func containsHash(hashes []FileHash, hash FileHash) bool { } return false } - -// Check if string is a file glob pattern -func isGlobPattern(s string) bool { - return strings.ContainsAny(s, "*?[]") -} diff --git a/go.mod b/go.mod index 241620b..1165e25 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ toolchain go1.23.2 require ( github.com/cloudflare/circl v1.5.0 - github.com/gobwas/glob v0.2.3 github.com/hashicorp/mdns v1.0.5 github.com/spf13/cobra v1.8.1 ) diff --git a/go.sum b/go.sum index c5b3975..50ecaf5 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,6 @@ github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/hashicorp/mdns v1.0.5 h1:1M5hW1cunYeoXOqHwEb/GBDDHAFo0Yqb/uz/beC6LbE= github.com/hashicorp/mdns v1.0.5/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= diff --git a/test/client_test.go b/test/client_test.go index 3fcdd1d..86ca3c5 100644 --- a/test/client_test.go +++ b/test/client_test.go @@ -79,7 +79,8 @@ func Test3_InitSync(t *testing.T) { } // Init sync with peer - err = c.InitSync("") + files := []string{} + err = c.InitSync(files) if err != nil { t.Fatal(err) } @@ -131,7 +132,8 @@ func Test6_SendAndReceivePacket(t *testing.T) { } c.Peers = append(c.Peers, peer) - err = c.InitSync("") + files := []string{} + err = c.InitSync(files) if err != nil { t.Fatal(err) } @@ -143,7 +145,8 @@ func RunServer() { os.Exit(-1) } - err = c.InitSync("") + files := []string{} + err = c.InitSync(files) if err != nil { os.Exit(-1) }