func newPackagesMetadataFromCSV()

in contrib/go/cmd/packages_metadata/packages_metadata.go [55:88]


func newPackagesMetadataFromCSV(csvFile string) (*metadata.PackagesMetadata, error) {
	result := new(metadata.PackagesMetadata)
	f, err := os.Open(csvFile)
	if err != nil {
		return nil, errors.Wrapf(err, "unable to open %s for reading", csvFile)
	}
	r := csv.NewReader(f)
	header, err := r.Read()
	if err != nil {
		return nil, errors.Wrapf(err, "unable to read CSV header from %s", csvFile)
	}
	if len(header) != 2 || header[0] != "Name" || header[1] != "Version" {
		return nil, fmt.Errorf("unexpected CSV header in %s, got %s, want Name,Version", csvFile, strings.Join(header, ","))
	}
	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			return nil, errors.Wrapf(err, "error parsing record in CSV file %s", csvFile)
		}
		result.Packages = append(result.Packages, metadata.PackageMetadata{
			Name:    record[0],
			Version: record[1],
		})
	}
	// Sort the packages in alphabetical order of their names.
	sort.Slice(result.Packages, func(i, j int) bool {
		pi, pj := result.Packages[i], result.Packages[j]
		return strings.Compare(pi.Name, pj.Name) < 0
	})
	return result, nil
}