fork of go-git with some jj specific features

Merge pull request #1492 from onee-only/fix-sparse-checkout-status

utils: merkletrie, Fix diff on sparse-checkout index. Fixes #1406

authored by Paulo Gomes and committed by GitHub 93ed29d8 4437f06d

Changed files
+41 -24
utils
merkletrie
+3 -1
utils/merkletrie/change.go
··· 131 131 } 132 132 133 133 if !root.IsDir() { 134 - l.Add(ctor(root)) 134 + if !root.Skip() { 135 + l.Add(ctor(root)) 136 + } 135 137 return nil 136 138 } 137 139
+20 -23
utils/merkletrie/difftree.go
··· 297 297 case noMoreNoders: 298 298 return ret, nil 299 299 case onlyFromRemains: 300 - if err = ret.AddRecursiveDelete(from); err != nil { 301 - return nil, err 300 + if !from.Skip() { 301 + if err = ret.AddRecursiveDelete(from); err != nil { 302 + return nil, err 303 + } 302 304 } 303 305 if err = ii.nextFrom(); err != nil { 304 306 return nil, err 305 307 } 306 308 case onlyToRemains: 307 - if to.Skip() { 308 - if err = ret.AddRecursiveDelete(to); err != nil { 309 - return nil, err 310 - } 311 - } else { 309 + if !to.Skip() { 312 310 if err = ret.AddRecursiveInsert(to); err != nil { 313 311 return nil, err 314 312 } ··· 317 315 return nil, err 318 316 } 319 317 case bothHaveNodes: 320 - if from.Skip() { 321 - if err = ret.AddRecursiveDelete(from); err != nil { 322 - return nil, err 318 + var err error 319 + switch { 320 + case from.Skip(): 321 + if from.Name() == to.Name() { 322 + err = ii.nextBoth() 323 + } else { 324 + err = ii.nextFrom() 323 325 } 324 - if err := ii.nextBoth(); err != nil { 325 - return nil, err 326 + case to.Skip(): 327 + if from.Name() == to.Name() { 328 + err = ii.nextBoth() 329 + } else { 330 + err = ii.nextTo() 326 331 } 327 - break 328 - } 329 - if to.Skip() { 330 - if err = ret.AddRecursiveDelete(to); err != nil { 331 - return nil, err 332 - } 333 - if err := ii.nextBoth(); err != nil { 334 - return nil, err 335 - } 336 - break 332 + default: 333 + err = diffNodes(&ret, ii) 337 334 } 338 335 339 - if err = diffNodes(&ret, ii); err != nil { 336 + if err != nil { 340 337 return nil, err 341 338 } 342 339 default:
+18
worktree_test.go
··· 1373 1373 s.True(status.IsClean()) 1374 1374 } 1375 1375 1376 + func (s *WorktreeSuite) TestStatusAfterSparseCheckout() { 1377 + fs := memfs.New() 1378 + w := &Worktree{ 1379 + r: s.Repository, 1380 + Filesystem: fs, 1381 + } 1382 + 1383 + err := w.Checkout(&CheckoutOptions{ 1384 + SparseCheckoutDirectories: []string{"php"}, 1385 + Force: true, 1386 + }) 1387 + s.Require().NoError(err) 1388 + 1389 + status, err := w.Status() 1390 + s.Require().NoError(err) 1391 + s.True(status.IsClean(), status) 1392 + } 1393 + 1376 1394 func (s *WorktreeSuite) TestStatusModified() { 1377 1395 fs := s.TemporalFilesystem() 1378 1396