Support the old change format (V4)
Dependencies
- [2]
HCMPNVNHHandle FileDel hunks - [3]
EVHNGDT7parse FileAdd hunk - [4]
TLR47XSAParse AddRoot hunk - [5]
4JWXOJIPParse dependencies - [6]
6GDPWAD2Parse Unhashed and Contents of Change - [7]
7VEHGTEYSwitch from reading text format to reading binary format. - [*]
7D7CMNN3Handle Edit hunks - [*]
A7XMU2A6Handle SolveOrderConflict hunks - [*]
YGCYIX6CHandle Replacement hunks - [*]
EKAB33DHStart using some parser combinators
Change contents
- edit in hunk.go at line 189
case 0:return fileMove(data) - edit in hunk.go at line 193
case 2:return fileUndel(data) - edit in hunk.go at line 197
case 4:return solveNameConflict(data) - edit in hunk.go at line 205
case 10:return resurrectZombies(data) - edit in hunk.go at line 211
}}func hunkV4(data []byte) ([]byte, Hunk, error) {data, tag, err := uint32LE(data)if err != nil {return data, nil, err}switch tag {case 0:return fileMove(data)case 1:return fileDelV4(data)case 2:return fileUndelV4(data)case 3:return fileAddV4(data)case 4:return solveNameConflict(data)case 6:return editV4(data)case 7:return replacementV4(data)case 8:return solveOrderConflict(data)case 10:return resurrectZombiesV4(data)default:return data, nil, fmt.Errorf("unknown tag for Hunk V4: %d", tag) - edit in hunk.go at line 280
func fileAddV4(data []byte) ([]byte, FileAdd, error) {var f FileAddf.Encoding = "UTF-8"data, _, err := tuple(assign(&f.AddName, atom),assign(&f.AddInode, atom),assign(&f.Contents, mapValue(option(atom), func(p *Atom) Atom {if p == nil {return nil}return *p})),assign(&f.Path, toString(lengthData(uint64LE))),)(data)return data, f, err} - edit in hunk.go at line 340
func editV4(data []byte) ([]byte, Edit, error) {var e Edite.Encoding = "UTF-8"data, _, err := tuple(assign(&e.Change, atom),assign(&e.Local, local),)(data)return data, e, err} - edit in hunk.go at line 391
)(data)return data, r, err}func replacementV4(data []byte) ([]byte, Replacement, error) {var r Replacementr.Encoding = "UTF-8"data, _, err := tuple(assign(&r.Change, atom),assign(&r.Replacement, atom),assign(&r.Local, local), - edit in hunk.go at line 440[2.719]
func fileDelV4(data []byte) ([]byte, FileDel, error) {var f FileDelf.Encoding = "UTF-8"data, _, err := tuple(assign(&f.Del, atom),assign(&f.Contents, mapValue(option(atom), func(p *Atom) Atom {if p == nil {return nil}return *p})),assign(&f.Path, toString(lengthData(uint64LE))),)(data)return data, f, err}type ResurrectZombies struct {Change AtomLocal LocalEncoding string}func (r ResurrectZombies) atoms() []Atom {return []Atom{r.Change}}func resurrectZombies(data []byte) ([]byte, ResurrectZombies, error) {var r ResurrectZombiesdata, _, err := tuple(assign(&r.Change, atom),assign(&r.Local, local),assign(&r.Encoding, optionalString),)(data)return data, r, err}func resurrectZombiesV4(data []byte) ([]byte, ResurrectZombies, error) {var r ResurrectZombiesr.Encoding = "UTF-8"data, _, err := tuple(assign(&r.Change, atom),assign(&r.Local, local),)(data)return data, r, err}type FileUndel struct {Undel AtomContents AtomPath stringEncoding string}func (f FileUndel) atoms() []Atom {if f.Contents == nil {return []Atom{f.Undel}}return []Atom{f.Undel, f.Contents}}func fileUndel(data []byte) ([]byte, FileUndel, error) {var f FileUndeldata, _, err := tuple(assign(&f.Undel, atom),assign(&f.Contents, mapValue(option(atom), func(p *Atom) Atom {if p == nil {return nil}return *p})),assign(&f.Path, toString(lengthData(uint64LE))),assign(&f.Encoding, optionalString),)(data)return data, f, err}func fileUndelV4(data []byte) ([]byte, FileUndel, error) {var f FileUndelf.Encoding = "UTF-8"data, _, err := tuple(assign(&f.Undel, atom),assign(&f.Contents, mapValue(option(atom), func(p *Atom) Atom {if p == nil {return nil}return *p})),assign(&f.Path, toString(lengthData(uint64LE))),)(data)return data, f, err}type FileMove struct {Del AtomAdd AtomPath string}func (f FileMove) atoms() []Atom {return []Atom{f.Del, f.Add}}func fileMove(data []byte) ([]byte, FileMove, error) {var f FileMovedata, _, err := tuple(assign(&f.Del, atom),assign(&f.Add, atom),assign(&f.Path, rustString),)(data)return data, f, err}type SolveNameConflict struct {Name AtomPath string}func (s SolveNameConflict) atoms() []Atom {return []Atom{s.Name}}func solveNameConflict(data []byte) ([]byte, SolveNameConflict, error) {var s SolveNameConflictdata, _, err := tuple(assign(&s.Name, atom),assign(&s.Path, rustString),)(data)return data, s, err} - edit in combinators.go at line 301
}func rustString(data []byte) ([]byte, string, error) {return toString(lengthData(uint64LE))(data) - edit in combinators.go at line 307
func optionalString(data []byte) ([]byte, string, error) {return mapValue(option(rustString), func(p *string) string {if p == nil {return ""}return *p})(data)} - replacement in change.go at line 107
return Change{}, fmt.Errorf("error parsing unhashed contents (%q): %w", unhashed, err)c.Unhashed = string(unhashed) - edit in change.go at line 130
}if c.Version != 6 && c.Version != 4 {return fmt.Errorf("unknown change file version: %d", c.Version) - replacement in change.go at line 155
data, c.Authors, err = vec(hashMap(toString(lengthData(uint64LE)), toString(lengthData(uint64LE))))(data)switch c.Version {case 6:data, c.Authors, err = vec(hashMap(toString(lengthData(uint64LE)), toString(lengthData(uint64LE))))(data)case 4:data, c.Authors, err = vec(authorV4)(data)} - replacement in change.go at line 180
data, c.Changes, err = vec(hunk)(data)switch c.Version {case 6:data, c.Changes, err = vec(hunk)(data)case 4:data, c.Changes, err = vec(hunkV4)(data)} - edit in change.go at line 196
}func authorV4(data []byte) ([]byte, map[string]string, error) {a := make(map[string]string, 3)data, name, err := rustString(data)if err != nil {return data, nil, err}a["name"] = namedata, fullName, err := option(rustString)(data)if err != nil {return data, nil, err}if fullName != nil {a["full_name"] = *fullName}data, email, err := option(rustString)(data)if err != nil {return data, nil, err}if email != nil {a["email"] = *email}return data, a, nil