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) {