Skip to content

Commit

Permalink
feat: reimplement GetFileHashes, remove glob functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastian-j-ibanez committed Feb 25, 2025
1 parent a32c93a commit 9a4816a
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 92 deletions.
5 changes: 3 additions & 2 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand Down
5 changes: 3 additions & 2 deletions cmd/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
108 changes: 26 additions & 82 deletions directory/directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import (
"encoding/hex"
"errors"
"os"
"strings"

"github.com/gobwas/glob"
)

type DirManager struct {
Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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, "*?[]")
}
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -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=
Expand Down
9 changes: 6 additions & 3 deletions test/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down Expand Up @@ -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)
}
Expand All @@ -143,7 +145,8 @@ func RunServer() {
os.Exit(-1)
}

err = c.InitSync("")
files := []string{}
err = c.InitSync(files)
if err != nil {
os.Exit(-1)
}
Expand Down

0 comments on commit 9a4816a

Please sign in to comment.