-
Notifications
You must be signed in to change notification settings - Fork 386
/
local.go
82 lines (74 loc) · 2.42 KB
/
local.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
package buildcontext
import (
"context"
"path/filepath"
"github.com/earthly/earthly/analytics"
"github.com/earthly/earthly/conslogging"
"github.com/earthly/earthly/domain"
"github.com/earthly/earthly/util/gitutil"
"github.com/earthly/earthly/util/llbutil"
"github.com/earthly/earthly/util/llbutil/pllb"
"github.com/earthly/earthly/util/syncutil/synccache"
"github.com/moby/buildkit/client/llb"
"github.com/pkg/errors"
)
type localResolver struct {
gitMetaCache *synccache.SyncCache // local path -> *gitutil.GitMetadata
sessionID string
console conslogging.ConsoleLogger
}
func (lr *localResolver) resolveLocal(ctx context.Context, ref domain.Reference) (*Data, error) {
analytics.Count("localResolver.resolveLocal", "local-reference")
if ref.IsRemote() {
return nil, errors.Errorf("unexpected remote target %s", ref.String())
}
metadataValue, err := lr.gitMetaCache.Do(ctx, ref.GetLocalPath(), func(ctx context.Context, _ interface{}) (interface{}, error) {
metadata, err := gitutil.Metadata(ctx, ref.GetLocalPath())
if err != nil {
if errors.Is(err, gitutil.ErrNoGitBinary) ||
errors.Is(err, gitutil.ErrNotAGitDir) ||
errors.Is(err, gitutil.ErrCouldNotDetectRemote) ||
errors.Is(err, gitutil.ErrCouldNotDetectGitHash) ||
errors.Is(err, gitutil.ErrCouldNotDetectGitBranch) {
// Keep going anyway. Either not a git dir, or git not installed, or
// remote not detected.
if errors.Is(err, gitutil.ErrNoGitBinary) {
// TODO: Log this properly in the console.
lr.console.Warnf("Warning: %s\n", err.Error())
}
} else {
return nil, err
}
}
return metadata, nil
})
if err != nil {
return nil, err
}
metadata := metadataValue.(*gitutil.GitMetadata)
buildFilePath, err := detectBuildFile(ref, filepath.FromSlash(ref.GetLocalPath()))
if err != nil {
return nil, err
}
var buildContext pllb.State
if _, isTarget := ref.(domain.Target); isTarget {
excludes, err := readExcludes(ref.GetLocalPath())
if err != nil {
return nil, err
}
buildContext = pllb.Local(
ref.GetLocalPath(),
llb.ExcludePatterns(excludes),
llb.SessionID(lr.sessionID),
llb.Platform(llbutil.DefaultPlatform()),
llb.WithCustomNamef("[context %s] local context %s", ref.GetLocalPath(), ref.GetLocalPath()),
)
} else {
// Commands don't come with a build context.
}
return &Data{
BuildFilePath: buildFilePath,
BuildContext: buildContext,
GitMetadata: metadata,
}, nil
}