in coverage/index.go [77:157]
func GetIndex(indexFilePath string) (*azidx.Index, error) {
if indexCache != nil {
return indexCache, nil
}
if indexFilePath != "" {
if _, err := os.Stat(indexFilePath); err == nil {
byteValue, _ := os.ReadFile(indexFilePath)
var index azidx.Index
if err := json.Unmarshal(byteValue, &index); err != nil {
return nil, fmt.Errorf("unmarshal index file: %+v", err)
}
indexCache = &index
logrus.Infof("load index from cache file %s", indexFilePath)
return indexCache, nil
}
}
resp, err := http.Get(indexFileURL)
if err != nil {
return nil, fmt.Errorf("get index file from %v: %+v", indexFileURL, err)
}
logrus.Infof("downloading index file from %s", indexFileURL)
defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("download index file zip: %+v", err)
}
zipReader, err := zip.NewReader(bytes.NewReader(b), int64(len(b)))
if err != nil {
return nil, fmt.Errorf("read index file zip: %+v", err)
}
var unzippedIndexBytes []byte
for _, zipFile := range zipReader.File {
if strings.EqualFold(zipFile.Name, "index.json") {
unzippedIndexBytes, err = readZipFile(zipFile)
if err != nil {
return nil, fmt.Errorf("unzip index file: %+v", err)
}
break
}
}
if len(unzippedIndexBytes) == 0 {
return nil, fmt.Errorf("index file not found in zip")
}
var index azidx.Index
if err := json.Unmarshal(unzippedIndexBytes, &index); err != nil {
return nil, fmt.Errorf("unmarshal index file: %+v", err)
}
indexCache = &index
logrus.Infof("load index based commit: https://github.com/Azure/azure-rest-api-specs/tree/%s", index.Commit)
if indexFilePath != "" {
jsonBytes, err := json.Marshal(&index)
if err != nil {
logrus.Warningf("failed to marshal index: %+v", err)
return indexCache, nil
}
err = os.WriteFile(indexFilePath, jsonBytes, 0644)
if err != nil {
logrus.Warningf("failed to write index cache file %s: %+v", indexFilePath, err)
return indexCache, nil
}
logrus.Infof("index successfully saved to cache file %s", indexFilePath)
}
return indexCache, nil
}