@@ -248,6 +248,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
248248 testHTTPPruneAfterResolveMeta ,
249249 testHTTPResolveMetaReuse ,
250250 testHTTPResolveMultiBuild ,
251+ testGitResolveMutatedSource ,
251252}
252253
253254func TestIntegration (t * testing.T ) {
@@ -12413,6 +12414,124 @@ func testHTTPResolveMultiBuild(t *testing.T, sb integration.Sandbox) {
1241312414 require .Equal (t , "content2" , string (dt ))
1241412415}
1241512416
12417+ func testGitResolveMutatedSource (t * testing.T , sb integration.Sandbox ) {
12418+ integration .SkipOnPlatform (t , "windows" )
12419+ ctx := sb .Context ()
12420+ c , err := New (ctx , sb .Address ())
12421+ require .NoError (t , err )
12422+ defer c .Close ()
12423+
12424+ gitDir := t .TempDir ()
12425+ gitCommands := []string {
12426+ "git init" ,
12427+ "git config --local user.email test" ,
12428+ "git config --local user.name test" ,
12429+ "echo a > a" ,
12430+ "git add a" ,
12431+ "git commit -m a" ,
12432+ "git tag -a v0.1 -m v0.1" ,
12433+ "echo b > b" ,
12434+ "git add b" ,
12435+ "git commit -m b" ,
12436+ "git checkout -B v2" ,
12437+ "git update-server-info" ,
12438+ }
12439+ err = runInDir (gitDir , gitCommands ... )
12440+ require .NoError (t , err )
12441+
12442+ // cmd := exec.Command("git", "rev-parse", "HEAD")
12443+ // cmd.Dir = gitDir
12444+ // out, err := cmd.Output()
12445+ // require.NoError(t, err)
12446+ // commitHEAD := strings.TrimSpace(string(out))
12447+
12448+ cmd := exec .Command ("git" , "rev-parse" , "v0.1" )
12449+ cmd .Dir = gitDir
12450+ out , err := cmd .Output ()
12451+ require .NoError (t , err )
12452+ commitTag := strings .TrimSpace (string (out ))
12453+
12454+ cmd = exec .Command ("git" , "rev-parse" , "v0.1^{commit}" )
12455+ cmd .Dir = gitDir
12456+ out , err = cmd .Output ()
12457+ require .NoError (t , err )
12458+ commitTagCommit := strings .TrimSpace (string (out ))
12459+
12460+ server := httptest .NewServer (http .FileServer (http .Dir (filepath .Clean (gitDir ))))
12461+ defer server .Close ()
12462+
12463+ dest := t .TempDir ()
12464+
12465+ _ , err = c .Build (ctx , SolveOpt {
12466+ Exports : []ExportEntry {
12467+ {
12468+ Type : ExporterLocal ,
12469+ OutputDir : dest ,
12470+ },
12471+ },
12472+ }, "test" , func (ctx context.Context , c gateway.Client ) (* gateway.Result , error ) {
12473+ id := "git://" + strings .TrimPrefix (server .URL , "http://" ) + "/.git#v0.1"
12474+ md , err := c .ResolveSourceMetadata (ctx , & pb.SourceOp {
12475+ Identifier : id ,
12476+ Attrs : map [string ]string {
12477+ "git.fullurl" : server .URL + "/.git" ,
12478+ },
12479+ }, sourceresolver.Opt {})
12480+ if err != nil {
12481+ return nil , err
12482+ }
12483+ require .NotNil (t , md .Git )
12484+ require .Equal (t , "refs/tags/v0.1" , md .Git .Ref )
12485+ require .Equal (t , commitTag , md .Git .Checksum )
12486+ require .Equal (t , commitTagCommit , md .Git .CommitChecksum )
12487+ require .Equal (t , id , md .Op .Identifier )
12488+ require .Equal (t , server .URL + "/.git" , md .Op .Attrs ["git.fullurl" ])
12489+
12490+ // update the tag to point to a different commit
12491+ err = runInDir (gitDir , []string {
12492+ "git tag -f v0.1" ,
12493+ "git update-server-info" ,
12494+ }... )
12495+ require .NoError (t , err )
12496+
12497+ md , err = c .ResolveSourceMetadata (ctx , & pb.SourceOp {
12498+ Identifier : id ,
12499+ Attrs : map [string ]string {
12500+ "git.fullurl" : server .URL + "/.git" ,
12501+ },
12502+ }, sourceresolver.Opt {})
12503+ if err != nil {
12504+ return nil , err
12505+ }
12506+ require .NotNil (t , md .Git )
12507+ require .Equal (t , "refs/tags/v0.1" , md .Git .Ref )
12508+ require .Equal (t , commitTag , md .Git .Checksum )
12509+ require .Equal (t , commitTagCommit , md .Git .CommitChecksum )
12510+ require .Equal (t , id , md .Op .Identifier )
12511+ require .Equal (t , server .URL + "/.git" , md .Op .Attrs ["git.fullurl" ])
12512+
12513+ st := llb .Git (server .URL + "/.git" , "" , llb .GitRef ("v0.1" ))
12514+ def , err := st .Marshal (sb .Context ())
12515+ if err != nil {
12516+ return nil , err
12517+ }
12518+ return c .Solve (ctx , gateway.SolveRequest {
12519+ Definition : def .ToPB (),
12520+ })
12521+ }, nil )
12522+ require .NoError (t , err )
12523+
12524+ _ , err = os .ReadFile (filepath .Join (dest , "b" ))
12525+ require .Error (t , err )
12526+ require .True (t , os .IsNotExist (err ), "expected file b to not exist" )
12527+
12528+ dt , err := os .ReadFile (filepath .Join (dest , "a" ))
12529+ require .NoError (t , err )
12530+ require .Equal (t , "a\n " , string (dt ))
12531+
12532+ checkAllReleasable (t , c , sb , false )
12533+ }
12534+
1241612535func runInDir (dir string , cmds ... string ) error {
1241712536 for _ , args := range cmds {
1241812537 var cmd * exec.Cmd
0 commit comments