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
}