diff --git a/lib/protocol/bep_fileinfo.go b/lib/protocol/bep_fileinfo.go index fa5f78d5d..a02cb6347 100644 --- a/lib/protocol/bep_fileinfo.go +++ b/lib/protocol/bep_fileinfo.go @@ -849,9 +849,13 @@ func unixOwnershipEqual(a, b *UnixData) bool { if a == nil || b == nil { return false } - ownerEqual := a.OwnerName == "" || b.OwnerName == "" || a.OwnerName == b.OwnerName - groupEqual := a.GroupName == "" || b.GroupName == "" || a.GroupName == b.GroupName - return a.UID == b.UID && a.GID == b.GID && ownerEqual && groupEqual + if a.UID == b.UID && a.GID == b.GID { + return true + } + if a.OwnerName == b.OwnerName && a.GroupName == b.GroupName { + return true + } + return false } func windowsOwnershipEqual(a, b *WindowsData) bool { diff --git a/lib/protocol/bep_fileinfo_test.go b/lib/protocol/bep_fileinfo_test.go index ec241db68..743624adf 100644 --- a/lib/protocol/bep_fileinfo_test.go +++ b/lib/protocol/bep_fileinfo_test.go @@ -196,6 +196,42 @@ func TestIsEquivalent(t *testing.T) { b: FileInfo{Type: FileInfoTypeFile, SymlinkTarget: []byte("b")}, eq: true, }, + // Unix Ownership should be the same + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + eq: true, + }, + // ... but matching ID is enough + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "B", GroupName: "B", UID: 1000, GID: 1000}}}, + eq: true, + }, + // ... or matching name + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1001, GID: 1001}}}, + eq: true, + }, + // ... or empty name + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "", GroupName: "", UID: 1000, GID: 1000}}}, + eq: true, + }, + // ... but not different ownership + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "B", GroupName: "B", UID: 1001, GID: 1001}}}, + eq: false, + }, + // or missing ownership + { + a: FileInfo{Platform: PlatformData{Unix: &UnixData{OwnerName: "A", GroupName: "A", UID: 1000, GID: 1000}}}, + b: FileInfo{Platform: PlatformData{}}, + eq: false, + }, } if build.IsWindows {