-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.go
139 lines (112 loc) · 2.74 KB
/
utils.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package rcache
import (
"context"
"fmt"
"github.com/c2fo/vfs/v6"
"github.com/hephbuild/heph/graph"
"github.com/hephbuild/heph/log/log"
"github.com/hephbuild/heph/utils/instance"
"github.com/hephbuild/heph/utils/xio"
"os"
"path"
)
func (e *RemoteCache) remoteCacheLocation(loc vfs.Location, ttarget graph.Targeter) (vfs.Location, error) {
target := ttarget.GraphTarget()
// TODO: cache
inputHash, err := e.LocalCache.HashInput(target)
if err != nil {
return nil, err
}
return loc.NewLocation(path.Join(target.Package.Path, target.Name, inputHash) + "/")
}
func (e *RemoteCache) vfsCopyFileIfNotExists(ctx context.Context, from, to vfs.Location, path string, atomic bool, progress func(percent float64)) (bool, error) {
if progress != nil {
progress(-1)
}
tof, err := to.NewFile(path)
if err != nil {
return false, err
}
defer tof.Close()
fromf, err := from.NewFile(path)
if err != nil {
return false, err
}
defer fromf.Close()
exists, err := tof.Exists()
if err != nil {
return false, err
}
if exists {
tos, _ := tof.Size()
froms, _ := fromf.Size()
if tos == froms {
log.Tracef("vfs copy %v to %v: exists", from.URI(), to.URI())
return false, nil
}
}
_ = tof.Close()
_ = fromf.Close()
err = e.vfsCopyFile(ctx, from, to, path, atomic, progress)
if err != nil {
return false, err
}
return true, nil
}
func (e *RemoteCache) vfsCopyFile(ctx context.Context, from, to vfs.Location, path string, atomic bool, progress func(percent float64)) error {
log.Tracef("vfs copy %v to %v", from.URI(), to.URI())
if progress != nil {
progress(-1)
}
doneTrace := log.TraceTimingDone(fmt.Sprintf("vfs copy to %v", to.URI()))
defer doneTrace()
sf, err := from.NewFile(path)
if err != nil {
return fmt.Errorf("NewFile sf: %w", err)
}
defer sf.Close()
doneCloser := xio.CloserContext(sf, ctx)
defer doneCloser()
ok, err := sf.Exists()
if err != nil {
return fmt.Errorf("Exists: %w", err)
}
log.Tracef("%v exists: %v", sf.URI(), ok)
if !ok {
return fmt.Errorf("copy %v: %w", sf.URI(), os.ErrNotExist)
}
if atomic {
dftmp, err := to.NewFile(path + "_tmp_" + instance.UID)
if err != nil {
return fmt.Errorf("NewFile df: %w", err)
}
defer dftmp.Close()
err = CopyWithProgress(sf, dftmp, progress)
if err != nil {
return err
}
if progress != nil {
progress(-1)
}
df, err := to.NewFile(path)
if err != nil {
return fmt.Errorf("NewFile df: %w", err)
}
defer df.Close()
err = dftmp.MoveToFile(df)
if err != nil {
return fmt.Errorf("Move: %w", err)
}
} else {
df, err := to.NewFile(path)
if err != nil {
return fmt.Errorf("NewFile df: %w", err)
}
defer df.Close()
err = CopyWithProgress(sf, df, progress)
if err != nil {
return err
}
}
return nil
}