Skip to content

Commit a47cfb7

Browse files
committed
dockerui: forward git fetch options for remote contexts
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
1 parent ec68141 commit a47cfb7

2 files changed

Lines changed: 88 additions & 0 deletions

File tree

frontend/dockerui/build_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package dockerui
22

33
import (
4+
"context"
45
"testing"
56

67
"github.com/containerd/platforms"
8+
"github.com/moby/buildkit/client/llb"
79
"github.com/moby/buildkit/exporter/containerimage/exptypes"
10+
"github.com/moby/buildkit/solver/pb"
11+
"github.com/opencontainers/go-digest"
812
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
913
"github.com/stretchr/testify/require"
1014
)
@@ -98,3 +102,81 @@ func TestNormalizePlatform(t *testing.T) {
98102
require.Equal(t, platforms.FormatAll(platforms.Normalize(tc.p)), tc.expected.ID)
99103
}
100104
}
105+
106+
func TestDetectGitContextForwardsFetchDepth(t *testing.T) {
107+
t.Parallel()
108+
109+
st, ok, err := DetectGitContext("https://github.com/crazy-max/diun.git?ref=refs/pull/1544/merge&subdir=.&fetch-depth=0", nil)
110+
require.True(t, ok)
111+
require.NoError(t, err)
112+
113+
g := marshalGitContext(t, st)
114+
require.Equal(t, "git://github.com/crazy-max/diun.git#refs/pull/1544/merge:.", g.Identifier)
115+
require.Equal(t, map[string]string{
116+
"git.authheadersecret": "GIT_AUTH_HEADER",
117+
"git.authtokensecret": "GIT_AUTH_TOKEN",
118+
"git.fetchdepth": "0",
119+
"git.fullurl": "https://github.com/crazy-max/diun.git",
120+
}, g.Attrs)
121+
}
122+
123+
func TestDetectGitContextForwardsFetchTags(t *testing.T) {
124+
t.Parallel()
125+
126+
st, ok, err := DetectGitContext("https://github.com/crazy-max/diun.git?ref=refs/pull/1544/merge&subdir=.&fetch-tags=true", nil)
127+
require.True(t, ok)
128+
require.NoError(t, err)
129+
130+
g := marshalGitContext(t, st)
131+
require.Equal(t, "git://github.com/crazy-max/diun.git#refs/pull/1544/merge:.", g.Identifier)
132+
require.Equal(t, map[string]string{
133+
"git.authheadersecret": "GIT_AUTH_HEADER",
134+
"git.authtokensecret": "GIT_AUTH_TOKEN",
135+
"git.fetchtags": "true",
136+
"git.fullurl": "https://github.com/crazy-max/diun.git",
137+
}, g.Attrs)
138+
}
139+
140+
func marshalGitContext(t *testing.T, st *llb.State) *pb.SourceOp {
141+
t.Helper()
142+
143+
def, err := st.Marshal(context.TODO())
144+
require.NoError(t, err)
145+
146+
m, arr := parseDef(t, def.Def)
147+
require.Equal(t, 2, len(arr))
148+
149+
dgst, idx := last(t, arr)
150+
require.Equal(t, 0, idx)
151+
require.Equal(t, m[dgst], arr[0])
152+
153+
return arr[0].Op.(*pb.Op_Source).Source
154+
}
155+
156+
func parseDef(t *testing.T, def [][]byte) (map[string]*pb.Op, []*pb.Op) {
157+
t.Helper()
158+
159+
m := map[string]*pb.Op{}
160+
arr := make([]*pb.Op, 0, len(def))
161+
162+
for _, dt := range def {
163+
var op pb.Op
164+
err := op.Unmarshal(dt)
165+
require.NoError(t, err)
166+
dgst := digest.FromBytes(dt)
167+
m[string(dgst)] = &op
168+
arr = append(arr, &op)
169+
}
170+
171+
return m, arr
172+
}
173+
174+
func last(t *testing.T, arr []*pb.Op) (string, int) {
175+
t.Helper()
176+
177+
require.Greater(t, len(arr), 1)
178+
179+
op := arr[len(arr)-1]
180+
require.Equal(t, 1, len(op.Inputs))
181+
return op.Inputs[0].Digest, int(op.Inputs[0].Index)
182+
}

frontend/dockerui/context.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,12 @@ func DetectGitContext(ref string, keepGit *bool) (*llb.State, bool, error) {
161161
if g.SubDir != "" {
162162
gitOpts = append(gitOpts, llb.GitSubDir(g.SubDir))
163163
}
164+
if g.FetchDepth != nil {
165+
gitOpts = append(gitOpts, llb.GitFetchDepth(*g.FetchDepth))
166+
}
167+
if g.FetchTags != nil && *g.FetchTags {
168+
gitOpts = append(gitOpts, llb.GitFetchTags())
169+
}
164170
if g.Checksum != "" {
165171
gitOpts = append(gitOpts, llb.GitChecksum(g.Checksum))
166172
}

0 commit comments

Comments
 (0)