func GetIndex()

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
}