NextEntry returns either the next entry in a Git tree, or a `false` boolean value if there are no more entries.
()
| 49 | // NextEntry returns either the next entry in a Git tree, or a `false` |
| 50 | // boolean value if there are no more entries. |
| 51 | func (iter *TreeIter) NextEntry() (TreeEntry, bool, error) { |
| 52 | var entry TreeEntry |
| 53 | |
| 54 | if len(iter.data) == 0 { |
| 55 | return TreeEntry{}, false, nil |
| 56 | } |
| 57 | |
| 58 | spAt := strings.IndexByte(iter.data, ' ') |
| 59 | if spAt < 0 { |
| 60 | return TreeEntry{}, false, errors.New("failed to find SP after mode") |
| 61 | } |
| 62 | mode, err := strconv.ParseUint(iter.data[:spAt], 8, 32) |
| 63 | if err != nil { |
| 64 | return TreeEntry{}, false, err |
| 65 | } |
| 66 | entry.Filemode = uint(mode) |
| 67 | |
| 68 | iter.data = iter.data[spAt+1:] |
| 69 | nulAt := strings.IndexByte(iter.data, 0) |
| 70 | if nulAt < 0 { |
| 71 | return TreeEntry{}, false, errors.New("failed to find NUL after filename") |
| 72 | } |
| 73 | |
| 74 | entry.Name = iter.data[:nulAt] |
| 75 | |
| 76 | iter.data = iter.data[nulAt+1:] |
| 77 | if len(iter.data) < 20 { |
| 78 | return TreeEntry{}, false, errors.New("tree entry ends unexpectedly") |
| 79 | } |
| 80 | |
| 81 | copy(entry.OID.v[0:20], iter.data[0:20]) |
| 82 | iter.data = iter.data[20:] |
| 83 | |
| 84 | return entry, true, nil |
| 85 | } |