-
Notifications
You must be signed in to change notification settings - Fork 255
/
Copy pathsync_strategy.go
52 lines (43 loc) · 1.43 KB
/
sync_strategy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package command
import (
errorpkg "github.com/peak/s5cmd/v2/error"
"github.com/peak/s5cmd/v2/storage"
)
// SyncStrategy is the interface to make decision whether given source object should be synced
// to destination object
type SyncStrategy interface {
ShouldSync(srcObject, dstObject *storage.Object) error
}
func NewStrategy(sizeOnly bool) SyncStrategy {
if sizeOnly {
return &SizeOnlyStrategy{}
} else {
return &SizeAndModificationStrategy{}
}
}
// SizeOnlyStrategy determines to sync based on objects' file sizes.
type SizeOnlyStrategy struct{}
func (s *SizeOnlyStrategy) ShouldSync(srcObj, dstObj *storage.Object) error {
if srcObj.Size == dstObj.Size {
return errorpkg.ErrObjectSizesMatch
}
return nil
}
// SizeAndModificationStrategy determines to sync based on objects' both sizes and modification times.
// It treats source object as the source-of-truth;
//
// time: src > dst size: src != dst should sync: yes
// time: src > dst size: src == dst should sync: yes
// time: src <= dst size: src != dst should sync: yes
// time: src <= dst size: src == dst should sync: no
type SizeAndModificationStrategy struct{}
func (sm *SizeAndModificationStrategy) ShouldSync(srcObj, dstObj *storage.Object) error {
srcMod, dstMod := srcObj.ModTime, dstObj.ModTime
if srcMod.After(*dstMod) {
return nil
}
if srcObj.Size != dstObj.Size {
return nil
}
return errorpkg.ErrObjectIsNewerAndSizesMatch
}