You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ly...@apache.org on 2024/05/23 11:30:08 UTC
(incubator-devlake) branch dev-1 updated: feat(linker): fix compile errors
This is an automated email from the ASF dual-hosted git repository.
lynwee pushed a commit to branch dev-1
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/dev-1 by this push:
new c75b50317 feat(linker): fix compile errors
c75b50317 is described below
commit c75b503175178821f4f37df60b93ffd8b3a26d20
Author: d4x1 <15...@qq.com>
AuthorDate: Thu May 23 19:29:59 2024 +0800
feat(linker): fix compile errors
---
backend/plugins/linker/impl/impl.go | 13 ++-
.../linker/{tasks/task_data.go => linker.go} | 38 +++----
backend/plugins/linker/tasks/link_pr_and_issue.go | 112 +++------------------
backend/plugins/linker/tasks/task_data.go | 16 ++-
4 files changed, 50 insertions(+), 129 deletions(-)
diff --git a/backend/plugins/linker/impl/impl.go b/backend/plugins/linker/impl/impl.go
index fdd315d29..338239f0d 100644
--- a/backend/plugins/linker/impl/impl.go
+++ b/backend/plugins/linker/impl/impl.go
@@ -19,6 +19,7 @@ package impl
import (
"encoding/json"
+ "regexp"
"github.com/apache/incubator-devlake/core/dal"
"github.com/apache/incubator-devlake/core/errors"
@@ -80,9 +81,17 @@ func (p Linker) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]i
if err != nil {
return nil, err
}
- return &tasks.LinkerTaskData{
+ taskData := &tasks.LinkerTaskData{
Options: op,
- }, nil
+ }
+ if op.PrToIssueRegexp != "" {
+ re, err := regexp.Compile(op.PrToIssueRegexp)
+ if err != nil {
+ return taskData, errors.Convert(err)
+ }
+ taskData.PrToIssueRegexp = re
+ }
+ return taskData, nil
}
// RootPkgPath information lost when compiled as plugin(.so)
diff --git a/backend/plugins/linker/tasks/task_data.go b/backend/plugins/linker/linker.go
similarity index 51%
copy from backend/plugins/linker/tasks/task_data.go
copy to backend/plugins/linker/linker.go
index 4a875bed0..30b72fa1d 100644
--- a/backend/plugins/linker/tasks/task_data.go
+++ b/backend/plugins/linker/linker.go
@@ -15,34 +15,28 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-package tasks
+package main
import (
- "github.com/apache/incubator-devlake/core/errors"
- helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "github.com/apache/incubator-devlake/core/runner"
+ "github.com/apache/incubator-devlake/plugins/linker/impl"
+ "github.com/spf13/cobra"
)
-type LinkerApiParams struct {
- ProjectName string
-}
+// PluginEntry exports for Framework to search and load
+var PluginEntry impl.Linker //nolint
-type LinkerOptions struct {
- Tasks []string `json:"tasks,omitempty"`
- Since string
- ProjectName string `json:"projectName"`
- ScopeId *string `json:"scopeId,omitempty"`
-}
+// standalone mode for debugging
+func main() {
+ cmd := &cobra.Command{Use: "dora"}
-type LinkerTaskData struct {
- Options *LinkerOptions
-}
+ projectName := cmd.Flags().StringP("projectName", "p", "", "project name")
+ timeAfter := cmd.Flags().StringP("timeAfter", "a", "", "collect data that are created after specified time, ie 2006-01-02T15:04:05Z")
-func DecodeAndValidateTaskOptions(options map[string]interface{}) (*LinkerOptions, errors.Error) {
- var op LinkerOptions
- err := helper.Decode(options, &op, nil)
- if err != nil {
- return nil, errors.Default.Wrap(err, "error decoding Linker task options")
+ cmd.Run = func(cmd *cobra.Command, args []string) {
+ runner.DirectRun(cmd, args, PluginEntry, map[string]interface{}{
+ "projectName": *projectName,
+ }, *timeAfter)
}
-
- return &op, nil
+ runner.RunCmd(cmd)
}
diff --git a/backend/plugins/linker/tasks/link_pr_and_issue.go b/backend/plugins/linker/tasks/link_pr_and_issue.go
index 50466782e..4456f1947 100644
--- a/backend/plugins/linker/tasks/link_pr_and_issue.go
+++ b/backend/plugins/linker/tasks/link_pr_and_issue.go
@@ -21,9 +21,6 @@ import (
"github.com/apache/incubator-devlake/core/models/domainlayer/code"
"github.com/apache/incubator-devlake/core/models/domainlayer/crossdomain"
"github.com/apache/incubator-devlake/core/models/domainlayer/ticket"
- "reflect"
- "regexp"
- "strconv"
"strings"
"github.com/apache/incubator-devlake/core/dal"
@@ -42,32 +39,21 @@ var LinkPrToIssueMeta = plugin.SubTaskMeta{
ProductTables: []string{crossdomain.PullRequestIssue{}.TableName()},
}
-func normalizeIssueKey(issueNumberStr string) string {
- issueNumberStr = strings.ReplaceAll(issueNumberStr, "#", "")
- issueNumberStr = strings.TrimSpace(issueNumberStr)
- return issueNumberStr
+func normalizeIssueKey(issueKey string) string {
+ issueKey = strings.ReplaceAll(issueKey, "#", "")
+ issueKey = strings.TrimSpace(issueKey)
+ return issueKey
}
func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error {
-
db := taskCtx.GetDal()
data := taskCtx.GetData().(*LinkerTaskData)
-
- rawDataSubTaskArgs := &api.RawDataSubTaskArgs{
- Ctx: taskCtx,
- Params: data,
- //Options:Link
- Table: code.PullRequest{}.TableName(),
- }
-
- //issuePattern := data.Options.ScopeConfig.IssueRegex
- issuePattern := ""
- issueRegex, err := errors.Convert01(regexp.Compile(issuePattern))
- if err != nil {
- return errors.Default.Wrap(err, "regexp compile failed")
+ var clauses = []dal.Clause{
+ dal.From(&code.PullRequest{}),
+ dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = pull_requests.base_repo_id)"),
+ dal.Where("pm.project_name = ?", data.Options.ProjectName),
}
-
- cursor, err := db.Cursor(dal.From(&code.PullRequest{}))
+ cursor, err := db.Cursor(clauses...)
if err != nil {
return err
}
@@ -81,29 +67,20 @@ func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error {
Input: cursor,
Enrich: func(pullRequest *code.PullRequest) ([]interface{}, errors.Error) {
- issueNumberStr := ""
+ issueKey := ""
for _, text := range []string{pullRequest.Title, pullRequest.Description} {
- issueNumberStr = issueRegex.FindString(text)
- if issueNumberStr != "" {
+ issueKey = data.PrToIssueRegexp.FindString(text)
+ if issueKey != "" {
break
}
}
- issueNumberStr = normalizeIssueKey(issueNumberStr)
- if issueNumberStr == "" {
+ issueKey = normalizeIssueKey(issueKey)
+ if issueKey == "" {
return nil, nil
}
issue := &ticket.Issue{}
-
- db.F
-
- err = db.All(
- issue,
- dal.Where("issue_key = ?",
- issueNumber),
- dal.Limit(1),
- )
- if err != nil {
+ if err := db.First(issue, dal.Where("issue_key = ?", issueKey)); err != nil {
return nil, err
}
@@ -111,7 +88,7 @@ func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error {
PullRequestId: pullRequest.Id,
IssueId: issue.Id,
PullRequestKey: pullRequest.PullRequestKey,
- IssueKey: issueNumber,
+ IssueKey: issueKey,
}
return []interface{}{pullRequestIssue}, nil
@@ -122,61 +99,4 @@ func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error {
}
return enricher.Execute()
- converter, err := api.NewDataConverter(api.DataConverterArgs{
- InputRowType: reflect.TypeOf(code.PullRequest{}),
- Input: cursor,
- RawDataSubTaskArgs: *rawDataSubTaskArgs,
- Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
- pullRequest := inputRow.(*code.PullRequest)
-
- //find the issue in the body
- issueNumberStr := ""
-
- if issueRegex != nil {
- issueNumberStr = issueRegex.FindString(pullRequest.Description)
- }
- //find the issue in the title
- if issueNumberStr == "" {
- issueNumberStr = issueRegex.FindString(pullRequest.Title)
- }
-
- if issueNumberStr == "" {
- return nil, nil
- }
-
- issueNumberStr = strings.ReplaceAll(issueNumberStr, "#", "")
- issueNumberStr = strings.TrimSpace(issueNumberStr)
-
- issue := &ticket.Issue{}
-
- //change the issueNumberStr to int, if cannot be changed, just continue
- issueNumber, numFormatErr := strconv.Atoi(issueNumberStr)
- if numFormatErr != nil {
- return nil, nil
- }
- err = db.All(
- issue,
- dal.Where("issue_key = ?",
- issueNumber),
- dal.Limit(1),
- )
- if err != nil {
- return nil, err
- }
-
- pullRequestIssue := &crossdomain.PullRequestIssue{
- PullRequestId: pullRequest.Id,
- IssueId: issue.Id,
- PullRequestKey: pullRequest.PullRequestKey,
- IssueKey: issueNumber,
- }
-
- return []interface{}{pullRequestIssue}, nil
- },
- })
- if err != nil {
- return err
- }
-
- return converter.Execute()
}
diff --git a/backend/plugins/linker/tasks/task_data.go b/backend/plugins/linker/tasks/task_data.go
index 4a875bed0..f22fae3af 100644
--- a/backend/plugins/linker/tasks/task_data.go
+++ b/backend/plugins/linker/tasks/task_data.go
@@ -20,21 +20,19 @@ package tasks
import (
"github.com/apache/incubator-devlake/core/errors"
helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+ "regexp"
)
-type LinkerApiParams struct {
- ProjectName string
-}
-
type LinkerOptions struct {
- Tasks []string `json:"tasks,omitempty"`
- Since string
- ProjectName string `json:"projectName"`
- ScopeId *string `json:"scopeId,omitempty"`
+ PrToIssueRegexp string `json:"prToIssueRegexp"`
+
+ ProjectName string `json:"projectName"` // how to get it ?
+ Since string `json:"since"` // how to get and use it ?
}
type LinkerTaskData struct {
- Options *LinkerOptions
+ Options *LinkerOptions
+ PrToIssueRegexp *regexp.Regexp
}
func DecodeAndValidateTaskOptions(options map[string]interface{}) (*LinkerOptions, errors.Error) {