in backend/plugins/gitlab/tasks/mr_extractor.go [99:220]
func ExtractApiMergeRequests(subtaskCtx plugin.SubTaskContext) errors.Error {
subtaskCommonArgs, data := CreateSubtaskCommonArgs(subtaskCtx, RAW_MERGE_REQUEST_TABLE)
db := subtaskCtx.GetDal()
config := data.Options.ScopeConfig
var labelTypeRegex *regexp.Regexp
var labelComponentRegex *regexp.Regexp
var prType = config.PrType
var err1 error
if len(prType) > 0 {
labelTypeRegex, err1 = regexp.Compile(prType)
if err1 != nil {
return errors.Default.Wrap(err1, "regexp Compile prType failed")
}
}
var prComponent = config.PrComponent
if len(prComponent) > 0 {
labelComponentRegex, err1 = regexp.Compile(prComponent)
if err1 != nil {
return errors.Default.Wrap(err1, "regexp Compile prComponent failed")
}
}
subtaskCommonArgs.SubtaskConfig = map[string]any{
"prType": prType,
"prComponent": prComponent,
}
extractor, err := api.NewStatefulApiExtractor(&api.StatefulApiExtractorArgs[MergeRequestRes]{
SubtaskCommonArgs: subtaskCommonArgs,
BeforeExtract: beforeExtractMr(db, data),
Extract: func(mr *MergeRequestRes, row *api.RawData) ([]interface{}, errors.Error) {
gitlabMergeRequest, err := convertMergeRequest(mr)
if err != nil {
return nil, err
}
// if we can not find merged_at and closed_at info in the detail
// we need get detail for gitlab v11
s := string(row.Data)
if !strings.Contains(s, "\"merged_at\":") {
if !strings.Contains(s, "\"closed_at\":") {
gitlabMergeRequest.IsDetailRequired = true
}
}
results := make([]interface{}, 0, len(mr.Reviewers)+len(mr.Labels)+1)
gitlabMergeRequest.ConnectionId = data.Options.ConnectionId
results = append(results, gitlabMergeRequest)
err = db.Delete(
&models.GitlabMrLabel{},
dal.Where("connection_id = ? AND mr_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
)
if err != nil {
return nil, err
}
for _, label := range mr.Labels {
results = append(results, &models.GitlabMrLabel{
MrId: gitlabMergeRequest.GitlabId,
LabelName: label,
ConnectionId: data.Options.ConnectionId,
})
// if pr.Type has not been set and prType is set in .env, process the below
if labelTypeRegex != nil && labelTypeRegex.MatchString(label) {
gitlabMergeRequest.Type = label
}
// if pr.Component has not been set and prComponent is set in .env, process
if labelComponentRegex != nil && labelComponentRegex.MatchString(label) {
gitlabMergeRequest.Component = label
}
}
err = db.Delete(
&models.GitlabReviewer{},
dal.Where("connection_id = ? AND merge_request_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
)
if err != nil {
return nil, err
}
for _, reviewer := range mr.Reviewers {
gitlabReviewer := &models.GitlabReviewer{
ConnectionId: data.Options.ConnectionId,
ReviewerId: reviewer.ReviewerIdId,
MergeRequestId: mr.GitlabId,
ProjectId: data.Options.ProjectId,
Username: reviewer.Username,
Name: reviewer.Name,
State: reviewer.State,
AvatarUrl: reviewer.AvatarUrl,
WebUrl: reviewer.WebUrl,
}
results = append(results, gitlabReviewer)
}
err = db.Delete(
&models.GitlabAssignee{},
dal.Where("connection_id = ? AND merge_request_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
)
if err != nil {
return nil, err
}
for _, assignee := range mr.Assignees {
gitlabAssignee := &models.GitlabAssignee{
ConnectionId: data.Options.ConnectionId,
AssigneeId: assignee.AssigneeId,
MergeRequestId: mr.GitlabId,
ProjectId: data.Options.ProjectId,
Username: assignee.Username,
Name: assignee.Name,
State: assignee.State,
AvatarUrl: assignee.AvatarUrl,
WebUrl: assignee.WebUrl,
}
results = append(results, gitlabAssignee)
}
return results, nil
},
})
if err != nil {
return err
}
return extractor.Execute()
}