Skip to content

Commit

Permalink
Fix exclude_by_attribute feature on POSIX
Browse files Browse the repository at this point in the history
The exclude by attribute function is broken on non-Darwin POSIX: linux and freebsd.
This is because those xattrs must be prefixed by a legal namespace. The old xattr
library implicitly appended the user namespace to the xattr, but the current
official go pkg does not (which is just as well).

Also fix the test to remove the discordant old xattr dependency and provide
test cases for both darwin and non-darwin POSIX.
  • Loading branch information
jkl1337 committed Sep 30, 2023
1 parent 7cc1b42 commit 33e483e
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 30 deletions.
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ require (
github.com/gilbertchen/gopass v0.0.0-20170109162249-bf9dde6d0d2c
github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8
github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508
github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01
github.com/hirochachacha/go-smb2 v1.1.0
github.com/klauspost/compress v1.16.3
github.com/klauspost/reedsolomon v1.9.9
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8 h1:ijgl4Y+
github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8/go.mod h1:0lQcVva56+L1PuUFXLOsJ6arJQaU0baIH8q+IegeBhg=
github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508 h1:SqTyk5KkNXp7zTdTttIZSDcTrL5uau4K/2OpKvgBZVI=
github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508/go.mod h1:w/pisxUZezf2XzU9Ewjphcf6q1mZtOzKPHhJiuc8cag=
github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01 h1:LqwS9qL6SrDkp0g0iwUkETrDdtB9gTKaIbSn9imUq5o=
github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01/go.mod h1:TMlibuxKfkdtHyltooAw7+DHqRpaXs9nxaffk00Sh1Q=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/goamz/goamz v0.0.0-20180131231218-8b901b531db8 h1:G1U0vew/vA/1/hBmf1XNeyIzJJbPFVv+kb+HPl6rj6c=
Expand Down
27 changes: 18 additions & 9 deletions src/duplicacy_entry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package duplicacy

import (
"bytes"
"encoding/json"
"io/ioutil"
"math/rand"
"os"
Expand All @@ -13,11 +15,10 @@ import (
"sort"
"strings"
"testing"
"bytes"
"encoding/json"

"github.com/gilbertchen/xattr"
"github.com/vmihailenco/msgpack"
"github.com/pkg/xattr"

"github.com/vmihailenco/msgpack"
)

func TestEntrySort(t *testing.T) {
Expand Down Expand Up @@ -175,7 +176,7 @@ func TestEntryOrder(t *testing.T) {
directories = append(directories, CreateEntry("", 0, 0, 0))

entries := make([]*Entry, 0, 4)
entryChannel := make(chan *Entry, 1024)
entryChannel := make(chan *Entry, 1024)
entries = append(entries, CreateEntry("", 0, 0, 0))

for len(directories) > 0 {
Expand Down Expand Up @@ -233,8 +234,16 @@ func TestEntryOrder(t *testing.T) {
// TestEntryExcludeByAttribute tests the excludeByAttribute parameter to the ListEntries function
func TestEntryExcludeByAttribute(t *testing.T) {

if !(runtime.GOOS == "darwin" || runtime.GOOS == "linux") {
t.Skip("skipping test not darwin or linux")
var excludeAttrName string
var excludeAttrValue []byte

if runtime.GOOS == "darwin" {
excludeAttrName = "com.apple.metadata:com_apple_backup_excludeItem"
excludeAttrValue = []byte("com.apple.backupd")
} else if runtime.GOOS == "linux" || runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" || runtime.GOOS == "solaris" {
excludeAttrName = "user.duplicacy_exclude"
} else {
t.Skip("skipping test, not darwin, linux, freebsd, netbsd, or solaris")
}

testDir := filepath.Join(os.TempDir(), "duplicacy_test")
Expand Down Expand Up @@ -273,7 +282,7 @@ func TestEntryExcludeByAttribute(t *testing.T) {
for _, file := range DATA {
fullPath := filepath.Join(testDir, file)
if strings.Contains(file, "exclude") {
xattr.Setxattr(fullPath, "com.apple.metadata:com_apple_backup_excludeItem", []byte("com.apple.backupd"))
xattr.Set(fullPath, excludeAttrName, excludeAttrValue)
}
}

Expand Down Expand Up @@ -372,4 +381,4 @@ func TestEntryEncoding(t *testing.T) {
t.Error("Decoded entry is different than the original one")
}

}
}
4 changes: 2 additions & 2 deletions src/duplicacy_utils_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"strings"
)

func excludedByAttribute(attirbutes map[string][]byte) bool {
value, ok := attirbutes["com.apple.metadata:com_apple_backup_excludeItem"]
func excludedByAttribute(attributes map[string][]byte) bool {
value, ok := attributes["com.apple.metadata:com_apple_backup_excludeItem"]
return ok && strings.Contains(string(value), "com.apple.backupd")
}
13 changes: 0 additions & 13 deletions src/duplicacy_utils_freebsd.go

This file was deleted.

6 changes: 4 additions & 2 deletions src/duplicacy_utils_linux.go → src/duplicacy_utils_posix.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
// Free for personal use and commercial trial
// Commercial use requires per-user licenses available from https://duplicacy.com

// +build freebsd netbsd linux solaris

package duplicacy

import (
)

func excludedByAttribute(attirbutes map[string][]byte) bool {
_, ok := attirbutes["duplicacy_exclude"]
func excludedByAttribute(attributes map[string][]byte) bool {
_, ok := attributes["user.duplicacy_exclude"]
return ok
}
2 changes: 1 addition & 1 deletion src/duplicacy_utils_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,6 @@ func SplitDir(fullPath string) (dir string, file string) {
return fullPath[:i+1], fullPath[i+1:]
}

func excludedByAttribute(attirbutes map[string][]byte) bool {
func excludedByAttribute(attributes map[string][]byte) bool {
return false
}

0 comments on commit 33e483e

Please sign in to comment.