Skip to content

Commit 70e5929

Browse files
committed
git: add git commit support to ResolveSourceMeta
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 32cbdcd commit 70e5929

File tree

9 files changed

+834
-246
lines changed

9 files changed

+834
-246
lines changed

client/client_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ import (
1616
"io"
1717
"net"
1818
"net/http"
19+
"net/http/httptest"
1920
"net/url"
2021
"os"
22+
"os/exec"
2123
"path"
2224
"path/filepath"
2325
"runtime"
@@ -239,6 +241,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
239241
testRunValidExitCodes,
240242
testFileOpSymlink,
241243
testMetadataOnlyLocal,
244+
testGitResolveSourceMetadata,
242245
}
243246

244247
func TestIntegration(t *testing.T) {
@@ -11968,6 +11971,108 @@ func testRunValidExitCodes(t *testing.T, sb integration.Sandbox) {
1196811971
require.ErrorContains(t, err, "exit code: 0")
1196911972
}
1197011973

11974+
func testGitResolveSourceMetadata(t *testing.T, sb integration.Sandbox) {
11975+
ctx := sb.Context()
11976+
c, err := New(ctx, sb.Address())
11977+
require.NoError(t, err)
11978+
defer c.Close()
11979+
11980+
gitDir := t.TempDir()
11981+
gitCommands := []string{
11982+
"git init",
11983+
"git config --local user.email test",
11984+
"git config --local user.name test",
11985+
"touch a",
11986+
"git add a",
11987+
"git commit -m a",
11988+
"git tag -a v0.1 -m v0.1",
11989+
"echo b > b",
11990+
"git add b",
11991+
"git commit -m b",
11992+
"git checkout -B v2",
11993+
"git update-server-info",
11994+
}
11995+
err = runInDir(gitDir, gitCommands...)
11996+
require.NoError(t, err)
11997+
11998+
cmd := exec.Command("git", "rev-parse", "HEAD")
11999+
cmd.Dir = gitDir
12000+
out, err := cmd.Output()
12001+
require.NoError(t, err)
12002+
commitHEAD := strings.TrimSpace(string(out))
12003+
12004+
cmd = exec.Command("git", "rev-parse", "v0.1")
12005+
cmd.Dir = gitDir
12006+
out, err = cmd.Output()
12007+
require.NoError(t, err)
12008+
commitTag := strings.TrimSpace(string(out))
12009+
12010+
cmd = exec.Command("git", "rev-parse", "v0.1^{commit}")
12011+
cmd.Dir = gitDir
12012+
out, err = cmd.Output()
12013+
require.NoError(t, err)
12014+
commitTagCommit := strings.TrimSpace(string(out))
12015+
12016+
server := httptest.NewServer(http.FileServer(http.Dir(filepath.Clean(gitDir))))
12017+
defer server.Close()
12018+
12019+
_, err = c.Build(ctx, SolveOpt{}, "test", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
12020+
id := "git://" + strings.TrimPrefix(server.URL, "http://") + "/.git"
12021+
md, err := c.ResolveSourceMetadata(ctx, &pb.SourceOp{
12022+
Identifier: id,
12023+
Attrs: map[string]string{
12024+
"git.fullurl": server.URL + "/.git",
12025+
},
12026+
}, sourceresolver.Opt{})
12027+
if err != nil {
12028+
return nil, err
12029+
}
12030+
require.NotNil(t, md.Git)
12031+
require.Equal(t, "refs/heads/v2", md.Git.Ref) // default to branch head
12032+
require.Equal(t, commitHEAD, md.Git.Checksum)
12033+
require.Equal(t, "", md.Git.CommitChecksum) // not annotated tag
12034+
require.Equal(t, id, md.Op.Identifier)
12035+
require.Equal(t, server.URL+"/.git", md.Op.Attrs["git.fullurl"])
12036+
12037+
id += "#v0.1"
12038+
md, err = c.ResolveSourceMetadata(ctx, &pb.SourceOp{
12039+
Identifier: id,
12040+
Attrs: map[string]string{
12041+
"git.fullurl": server.URL + "/.git",
12042+
},
12043+
}, sourceresolver.Opt{})
12044+
if err != nil {
12045+
return nil, err
12046+
}
12047+
require.NotNil(t, md.Git)
12048+
require.Equal(t, "refs/tags/v0.1", md.Git.Ref)
12049+
require.Equal(t, commitTag, md.Git.Checksum) // annotated tag
12050+
require.Equal(t, commitTagCommit, md.Git.CommitChecksum)
12051+
12052+
require.Equal(t, id, md.Op.Identifier)
12053+
require.Equal(t, server.URL+"/.git", md.Op.Attrs["git.fullurl"])
12054+
12055+
return nil, nil
12056+
}, nil)
12057+
require.NoError(t, err)
12058+
}
12059+
12060+
func runInDir(dir string, cmds ...string) error {
12061+
for _, args := range cmds {
12062+
var cmd *exec.Cmd
12063+
if runtime.GOOS == "windows" {
12064+
cmd = exec.Command("powershell", "-command", args)
12065+
} else {
12066+
cmd = exec.Command("sh", "-c", args)
12067+
}
12068+
cmd.Dir = dir
12069+
if err := cmd.Run(); err != nil {
12070+
return errors.Wrapf(err, "error running %v", args)
12071+
}
12072+
}
12073+
return nil
12074+
}
12075+
1197112076
type warningsListOutput []*VertexWarning
1197212077

1197312078
func (w warningsListOutput) String() string {

client/llb/sourceresolver/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type MetaResponse struct {
3333
Op *pb.SourceOp
3434

3535
Image *ResolveImageResponse
36+
Git *ResolveGitResponse
3637
}
3738

3839
type ResolveImageOpt struct {
@@ -44,6 +45,12 @@ type ResolveImageResponse struct {
4445
Config []byte
4546
}
4647

48+
type ResolveGitResponse struct {
49+
Checksum string
50+
Ref string
51+
CommitChecksum string
52+
}
53+
4754
type ResolveOCILayoutOpt struct {
4855
Store ResolveImageConfigOptStore
4956
}

frontend/gateway/gateway.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,13 @@ func (lbf *llbBridgeForwarder) ResolveSourceMeta(ctx context.Context, req *pb.Re
650650
Config: resp.Image.Config,
651651
}
652652
}
653+
if resp.Git != nil {
654+
r.Git = &pb.ResolveSourceGitResponse{
655+
Checksum: resp.Git.Checksum,
656+
Ref: resp.Git.Ref,
657+
CommitChecksum: resp.Git.CommitChecksum,
658+
}
659+
}
653660
return r, nil
654661
}
655662

frontend/gateway/grpcclient/client.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,13 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
528528
Config: resp.Image.Config,
529529
}
530530
}
531+
if resp.Git != nil {
532+
r.Git = &sourceresolver.ResolveGitResponse{
533+
Checksum: resp.Git.Checksum,
534+
Ref: resp.Git.Ref,
535+
CommitChecksum: resp.Git.CommitChecksum,
536+
}
537+
}
531538
return r, nil
532539
}
533540

0 commit comments

Comments
 (0)