Try a new approach to deletion
Dependencies
- [2]
OMRSTWPYUpdate edges instead of replacing them - [3]
7VXK6DMJRefine definition of deleted vertexes - [4]
KMLCXD5DHandle both types of root directory - [5]
FWGMIVUZAdd tijo-cat command - [6]
XJAW762UAdd tijo-export command - [7]
7D7CMNN3Handle Edit hunks - [8]
DF5RFSLHRead directory entries - [9]
YGCYIX6CHandle Replacement hunks - [10]
AYLFNM5CAdd the ability to output the contents of a file. - [11]
EYPCPIP7Apply changes and build a graph
Change contents
- edit in pristine.go at line 18
DeletedBy []Hash - edit in pristine.go at line 114
if len(oldBlock.DeletedBy) > 0 {newBlock.DeletedBy = make([]Hash, len(oldBlock.DeletedBy))copy(newBlock.DeletedBy, oldBlock.DeletedBy)} - edit in pristine.go at line 148
var deletions []NewEdge - replacement in pristine.go at line 180
if e.Flag&EdgeFlagsDeleted == EdgeFlagsDeleted {deletions = append(deletions, e)} else {err := g.putNewEdge(h, e)if err != nil {return err}err := g.putNewEdge(h, e)if err != nil {return err - edit in pristine.go at line 189
for _, e := range deletions {err := g.putNewEdge(h, e)if err != nil {return err}} - edit in pristine.go at line 193
source := g.blockEnding(coalesceHash(ne.From.Change, change), ne.From.Pos)if source == nil {return fmt.Errorf("not found: block ending at %v:%d", coalesceHash(ne.From.Change, change), ne.From.Pos)} - edit in pristine.go at line 196
}if target.End > ne.To.End {g.splitBlock(target, ne.To.End) - replacement in pristine.go at line 200[5.1282]→[2.0:106](∅→∅),[2.106]→[5.1360:1430](∅→∅),[5.1360]→[5.1360:1430](∅→∅),[5.1430]→[2.107:164](∅→∅)
found := false// Look for the old edge and update it if it is found.for _, e := range source.Edges {if e.Change == introducedBy && e.From == source && e.To == target {found = truee.Change = changee.Flag = ne.Flagfor {if target.End > ne.To.End {g.splitBlock(target, ne.To.End)}if ne.Flag&EdgeFlagsDeleted != 0 {// This is a deletion, so we'll add this change to the DeletedBy list if it// isn't there already.found := falsefor _, h := range target.DeletedBy {if h == change {found = truebreak}}if !found {target.DeletedBy = append(target.DeletedBy, change)}} else {// This is an undeletion, so we'll remove the change that did the deletion// from the DeletedBy list.for i, h := range target.DeletedBy {if h == introducedBy {target.DeletedBy = append(target.DeletedBy[:i], target.DeletedBy[i+1:]...)break}}}if target.End == ne.To.End { - edit in pristine.go at line 232
} - replacement in pristine.go at line 233
if !found {makeEdge(change, ne.Flag, source, target)newTarget := g.blockStarting(target.Change, target.End)if newTarget == nil {return fmt.Errorf("not found: block to follow %v:%d:%d", target.Change, target.Start, target.End)}target = newTarget - replacement in pristine.go at line 273
if e.Flag&EdgeFlagsDeleted != 0 {if len(e.To.DeletedBy) > 0 { - replacement in pristine.go at line 285
if f.Flag&EdgeFlagsDeleted != 0 {if len(f.To.DeletedBy) > 0 { - edit in output.go at line 46
deleted := make([]bool, len(blocks)) - edit in output.go at line 48[5.1010]→[3.0:185](∅→∅),[3.185]→[3.185:215](∅→∅),[3.215]→[5.1062:1087](∅→∅),[5.1062]→[5.1062:1087](∅→∅)
var dead, alive intfor _, e := range b.ReverseEdges {if e.Flag&EdgeFlagsBlock != 0 {if e.Flag&EdgeFlagsDeleted != 0 {dead++} else {alive++}}}if dead > 0 && alive == 0 {deleted[i] = true} - replacement in output.go at line 94
if !deleted[j] {if len(blocks[j].DeletedBy) == 0 { - replacement in output.go at line 101
if !deleted[j] {if len(blocks[j].DeletedBy) == 0 { - replacement in output.go at line 126
if deleted[i] {if len(b.DeletedBy) > 0 { - edit in output.go at line 136
for j := 0; j < conflictEnd[len(blocks)]; j++ {fmt.Fprintf(dest, ">>>>>>>\n")} - replacement in output.go at line 180
if e.Flag&EdgeFlagsDeleted != 0 {if len(e.To.DeletedBy) > 0 { - replacement in output.go at line 192
if inodeEdge.Flag&EdgeFlagsDeleted != 0 {if len(inodeEdge.To.DeletedBy) > 0 { - edit in output.go at line 200
}if entry.Inode == nil && len(b.Edges) > 0 {// All the potential inodes are deleted.// But there has to be one.// So we'll just pick the first one.entry.Inode = b.Edges[0].To