func()

in docbot/action.go [71:187]


func (a *Action) checkLabels() error {
	pr, _, err := a.client.PullRequests.Get(a.globalContext, a.config.GetOwner(), a.config.GetRepo(), a.prNumber)
	if err != nil {
		return fmt.Errorf("get PR: %v", err)
	}

	var bodyLabels map[string]bool
	if pr.Body != nil {
		bodyLabels = a.extractLabels(*pr.Body)
	}

	logger.Infof("PR description: %v\n", *pr.Body)

	logger.Infoln("@List repo labels")
	repoLabels, err := a.getRepoLabels()
	if err != nil {
		return fmt.Errorf("list repo labels: %v", err)
	}
	logger.Infof("Repo labels: %v\n", repoLabels)

	prLabels := a.labelsToMap(pr.Labels)
	logger.Infof("PR labels: %v\n", prLabels)

	// Get expected labels
	// Only handle labels already exist in repo
	expectedLabelsMap := make(map[string]bool)
	checkedCount := 0
	for label, checked := range bodyLabels {
		if _, exist := repoLabels[label]; !exist {
			logger.Infof("Found label %v not exist int repo\n", label)
			continue
		}
		expectedLabelsMap[label] = checked
		if checked {
			checkedCount++
		}
	}
	logger.Infof("Expected labels: %v\n", expectedLabelsMap)

	labelsToRemove := make(map[string]struct{}, 0)
	labelsToAdd := make(map[string]struct{}, 0)

	if checkedCount == 0 {
		logger.Infoln("Label missing")
		for label := range a.config.labelWatchSet {
			_, found := prLabels[label]
			if found {
				labelsToRemove[label] = struct{}{}
			}
		}
		_, found := prLabels[a.config.GetLabelMissing()]
		if !found {
			labelsToAdd[a.config.GetLabelMissing()] = struct{}{}
		} else {
			logger.Infoln("Already added missing label.")
			return errors.New(a.getLabelMissingMessage())
		}
	} else {
		if !a.config.GetEnableLabelMultiple() && checkedCount > 1 {
			logger.Infoln("Multiple labels not enabled")
			err = a.addAndCleanupHelpComment(pr.User.GetLogin(), MessageLabelMultiple)
			if err != nil {
				return err
			}
			return errors.New(MessageLabelMultiple)
		}

		_, found := prLabels[a.config.GetLabelMissing()]
		if found {
			labelsToRemove[a.config.GetLabelMissing()] = struct{}{}
		}

		for label, checked := range expectedLabelsMap {
			if _, found := prLabels[label]; found && !checked {
				labelsToRemove[label] = struct{}{}
			} else if !found && checked {
				labelsToAdd[label] = struct{}{}
			}
		}
	}

	if len(labelsToAdd) == 0 {
		logger.Infoln("No labels to add.")
	} else {
		labels := a.labelsSetToString(labelsToAdd)
		logger.Infof("Labels to add: %v\n", labels)
		err = a.addLabels(labels)
		if err != nil {
			logger.Errorf("Failed add labels %v: %v\n", labelsToAdd, err)
			return err
		}
	}

	if len(labelsToRemove) == 0 {
		logger.Infoln("No labels to remove.")
	} else {
		labels := a.labelsSetToString(labelsToRemove)
		logger.Infof("Labels to remove: %v\n", labels)
		for _, label := range labels {
			err = a.removeLabel(label)
			if err != nil {
				logger.Errorf("Failed remove labels %v: %v\n", labelsToRemove, err)
				return err
			}
		}
	}

	if checkedCount == 0 {
		err := a.addAndCleanupHelpComment(pr.User.GetLogin(), a.getLabelMissingMessage())
		if err != nil {
			return err
		}
		return errors.New(a.getLabelMissingMessage())
	}

	return nil
}