@@ -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
244247func 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+
1197112076type warningsListOutput []* VertexWarning
1197212077
1197312078func (w warningsListOutput ) String () string {
0 commit comments