in read.go [208:331]
func (r *reader) readIndexData(toc *indexTOC) (*indexData, error) {
d := indexData{
file: r.r,
ngrams: map[ngram]simpleSection{},
fileNameNgrams: map[ngram][]uint32{},
branchIDs: map[string]uint{},
branchNames: map[uint]string{},
}
blob, err := d.readSectionBlob(toc.metaData)
if err != nil {
return nil, err
}
if err := json.Unmarshal(blob, &d.metaData); err != nil {
return nil, err
}
if d.metaData.IndexFormatVersion != IndexFormatVersion {
return nil, fmt.Errorf("file is v%d, want v%d", d.metaData.IndexFormatVersion, IndexFormatVersion)
}
if d.metaData.IndexFeatureVersion < ReadMinFeatureVersion {
return nil, fmt.Errorf("file is feature version %d, want feature version >= %d", d.metaData.IndexFeatureVersion, ReadMinFeatureVersion)
}
if d.metaData.IndexMinReaderVersion > FeatureVersion {
return nil, fmt.Errorf("file needs read feature version >= %d, have read feature version %d", d.metaData.IndexMinReaderVersion, FeatureVersion)
}
blob, err = d.readSectionBlob(toc.repoMetaData)
if err != nil {
return nil, err
}
if err := json.Unmarshal(blob, &d.repoMetaData); err != nil {
return nil, err
}
d.boundariesStart = toc.fileContents.data.off
d.boundaries = toc.fileContents.relativeIndex()
d.newlinesStart = toc.newlines.data.off
d.newlinesIndex = toc.newlines.relativeIndex()
d.docSectionsStart = toc.fileSections.data.off
d.docSectionsIndex = toc.fileSections.relativeIndex()
d.checksums, err = d.readSectionBlob(toc.contentChecksums)
if err != nil {
return nil, err
}
d.languages, err = d.readSectionBlob(toc.languages)
if err != nil {
return nil, err
}
d.ngrams, err = d.readNgrams(toc)
if err != nil {
return nil, err
}
d.fileBranchMasks, err = readSectionU64(d.file, toc.branchMasks)
if err != nil {
return nil, err
}
d.fileNameContent, err = d.readSectionBlob(toc.fileNames.data)
if err != nil {
return nil, err
}
d.fileNameIndex = toc.fileNames.relativeIndex()
d.fileNameNgrams, err = d.readFileNameNgrams(toc)
if err != nil {
return nil, err
}
for j, br := range d.repoMetaData.Branches {
id := uint(1) << uint(j)
d.branchIDs[br.Name] = id
d.branchNames[id] = br.Name
}
blob, err = d.readSectionBlob(toc.runeDocSections)
if err != nil {
return nil, err
}
d.runeDocSections = unmarshalDocSections(blob, nil)
for sect, dest := range map[simpleSection]*[]uint32{
toc.subRepos: &d.subRepos,
toc.runeOffsets: &d.runeOffsets,
toc.nameRuneOffsets: &d.fileNameRuneOffsets,
toc.nameEndRunes: &d.fileNameEndRunes,
toc.fileEndRunes: &d.fileEndRunes,
} {
if blob, err := d.readSectionBlob(sect); err != nil {
return nil, err
} else {
*dest = fromSizedDeltas(blob, nil)
}
}
keys := []string{""}
for k := range d.repoMetaData.SubRepoMap {
if k != "" { // we used to marshal "" in SubRepoMap. Prevent adding twice.
keys = append(keys, k)
}
}
sort.Strings(keys)
d.subRepoPaths = keys
d.languageMap = map[byte]string{}
for k, v := range d.metaData.LanguageMap {
d.languageMap[v] = k
}
if err := d.verify(); err != nil {
return nil, err
}
d.calculateStats()
return &d, nil
}