func compareServices()

in tools/teamcity-diff-check/main.go [58:130]


func compareServices(teamcityServiceFile, providerServiceFile string) error {

	// Get array of services from the provider service list file
	file, err := os.Open(providerServiceFile)
	if err != nil {
		return fmt.Errorf("error opening provider service list file: %w", err)
	}
	defer file.Close()

	googleServices := []string{}
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		googleServices = append(googleServices, scanner.Text())
	}
	if len(googleServices) == 0 {
		return fmt.Errorf("could not find any services in the provider service list file %s", providerServiceFile)
	}

	// Get array of services from the TeamCity service list file
	f, err := os.Open(teamcityServiceFile)
	if err != nil {
		return fmt.Errorf("error opening TeamCity service list file: %w", err)
	}

	stat, err := f.Stat()
	if err != nil {
		return fmt.Errorf("error stating TeamCity service list file: %w", err)
	}

	bs := make([]byte, stat.Size())
	_, err = bufio.NewReader(f).Read(bs)
	if err != nil && err != io.EOF {
		return fmt.Errorf("error processing TeamCity service list file: %w", err)
	}

	// Regex pattern captures "services" from the Kotlin service list file.
	pattern := regexp.MustCompile(`(?m)"(?P<service>\w+)"\sto\s+mapOf`)

	template := []byte("$service")

	dst := []byte{}
	teamcityServices := []string{}

	for _, submatches := range pattern.FindAllSubmatchIndex(bs, -1) {
		service := pattern.Expand(dst, template, bs, submatches)
		teamcityServices = append(teamcityServices, string(service))
	}
	if len(teamcityServices) == 0 {
		return fmt.Errorf("could not find any services in the TeamCity service list file %s", teamcityServiceFile)
	}

	// Determine diffs
	errTeamCity := listDifference(teamcityServices, googleServices)
	errProvider := listDifference(googleServices, teamcityServices)

	switch {
	case errTeamCity != nil && errProvider != nil:
		return fmt.Errorf(`mismatches detected:
TeamCity service file is missing services present in the provider: %s
Provider codebase is missing services present in the TeamCity service file: %s`,
			errTeamCity, errProvider)
	case errTeamCity != nil:
		return fmt.Errorf(`mismatches detected:
TeamCity service file is missing services present in the provider: %s`,
			errTeamCity)
	case errProvider != nil:
		return fmt.Errorf(`mismatches detected:
Provider codebase is missing services present in the TeamCity service file: %s`,
			errProvider)
	}

	return nil
}