...
1
16
17 package continuity
18
19 import (
20 "fmt"
21 "os"
22 )
23
24 var errNotAHardLink = fmt.Errorf("invalid hardlink")
25
26 type hardlinkManager struct {
27 hardlinks map[hardlinkKey][]Resource
28 }
29
30 func newHardlinkManager() *hardlinkManager {
31 return &hardlinkManager{
32 hardlinks: map[hardlinkKey][]Resource{},
33 }
34 }
35
36
37
38 func (hlm *hardlinkManager) Add(fi os.FileInfo, resource Resource) error {
39 if _, ok := resource.(Hardlinkable); !ok {
40 return errNotAHardLink
41 }
42
43 key, err := newHardlinkKey(fi)
44 if err != nil {
45 return err
46 }
47
48 hlm.hardlinks[key] = append(hlm.hardlinks[key], resource)
49
50 return nil
51 }
52
53
54
55 func (hlm *hardlinkManager) Merge() ([]Resource, error) {
56 var resources []Resource
57 for key, linked := range hlm.hardlinks {
58 if len(linked) < 1 {
59 return nil, fmt.Errorf("no hardlink entrys for dev, inode pair: %#v", key)
60 }
61
62 merged, err := Merge(linked...)
63 if err != nil {
64 return nil, fmt.Errorf("error merging hardlink: %w", err)
65 }
66
67 resources = append(resources, merged)
68 }
69
70 return resources, nil
71 }
72
View as plain text