This is an automated email from the ASF dual-hosted git repository.
klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/main by this push:
new 700cce58a refactor(gitextractor): move "clone a repo" from
"PrePareTaskData" to a new subtask called "CloneGitRepo" (#5992)
700cce58a is described below
commit 700cce58a7f78a85ed69f87bd6c1134908f45e7f
Author: Lynwee <[email protected]>
AuthorDate: Mon Sep 4 13:56:50 2023 +0800
refactor(gitextractor): move "clone a repo" from "PrePareTaskData" to a new
subtask called "CloneGitRepo" (#5992)
---
backend/plugins/gitextractor/impl/impl.go | 34 ++--------
backend/plugins/gitextractor/main.go | 2 +-
.../gitextractor/{impl/impl.go => tasks/clone.go} | 76 ++++++----------------
.../gitextractor/tasks/git_repo_collector.go | 18 ++++-
4 files changed, 40 insertions(+), 90 deletions(-)
diff --git a/backend/plugins/gitextractor/impl/impl.go
b/backend/plugins/gitextractor/impl/impl.go
index 81fe8e134..b42c5d5bb 100644
--- a/backend/plugins/gitextractor/impl/impl.go
+++ b/backend/plugins/gitextractor/impl/impl.go
@@ -18,18 +18,12 @@ limitations under the License.
package impl
import (
- "context"
- "fmt"
"github.com/apache/incubator-devlake/core/dal"
"github.com/apache/incubator-devlake/core/errors"
- "github.com/apache/incubator-devlake/core/log"
"github.com/apache/incubator-devlake/core/plugin"
helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
- "github.com/apache/incubator-devlake/plugins/gitextractor/models"
"github.com/apache/incubator-devlake/plugins/gitextractor/parser"
- "github.com/apache/incubator-devlake/plugins/gitextractor/store"
"github.com/apache/incubator-devlake/plugins/gitextractor/tasks"
- "strings"
)
var _ interface {
@@ -55,6 +49,7 @@ func (p GitExtractor) Name() string {
// return all available subtasks, framework will run them for you in order
func (p GitExtractor) SubTaskMetas() []plugin.SubTaskMeta {
return []plugin.SubTaskMeta{
+ tasks.CloneGitRepoMeta,
tasks.CollectGitCommitMeta,
tasks.CollectGitBranchMeta,
tasks.CollectGitTagMeta,
@@ -62,7 +57,7 @@ func (p GitExtractor) SubTaskMetas() []plugin.SubTaskMeta {
}
}
-// based on task context and user input options, return data that shared among
all subtasks
+// PrepareTaskData based on task context and user input options, return data
that shared among all subtasks
func (p GitExtractor) PrepareTaskData(taskCtx plugin.TaskContext, options
map[string]interface{}) (interface{}, errors.Error) {
var op tasks.GitExtractorOptions
if err := helper.Decode(options, &op, nil); err != nil {
@@ -71,12 +66,10 @@ func (p GitExtractor) PrepareTaskData(taskCtx
plugin.TaskContext, options map[st
if err := op.Valid(); err != nil {
return nil, err
}
- storage := store.NewDatabase(taskCtx, op.RepoId)
- repo, err := NewGitRepo(taskCtx.GetContext(), taskCtx.GetLogger(),
storage, op)
- if err != nil {
- return nil, err
+ taskData := &tasks.GitExtractorTaskData{
+ Options: &op,
}
- return repo, nil
+ return taskData, nil
}
func (p GitExtractor) Close(taskCtx plugin.TaskContext) errors.Error {
@@ -91,20 +84,3 @@ func (p GitExtractor) Close(taskCtx plugin.TaskContext)
errors.Error {
func (p GitExtractor) RootPkgPath() string {
return "github.com/apache/incubator-devlake/plugins/gitextractor"
}
-
-// NewGitRepo create and return a new parser git repo
-func NewGitRepo(ctx context.Context, logger log.Logger, storage models.Store,
op tasks.GitExtractorOptions) (*parser.GitRepo, errors.Error) {
- var err errors.Error
- var repo *parser.GitRepo
- p := parser.NewGitRepoCreator(storage, logger)
- if strings.HasPrefix(op.Url, "http") {
- repo, err = p.CloneOverHTTP(ctx, op.RepoId, op.Url, op.User,
op.Password, op.Proxy)
- } else if url := strings.TrimPrefix(op.Url, "ssh://");
strings.HasPrefix(url, "git@") {
- repo, err = p.CloneOverSSH(ctx, op.RepoId, url, op.PrivateKey,
op.Passphrase)
- } else if strings.HasPrefix(op.Url, "/") {
- repo, err = p.LocalRepo(op.Url, op.RepoId)
- } else {
- return nil, errors.BadInput.New(fmt.Sprintf("unsupported url
[%s]", op.Url))
- }
- return repo, err
-}
diff --git a/backend/plugins/gitextractor/main.go
b/backend/plugins/gitextractor/main.go
index f1fb468d2..0224b0c97 100644
--- a/backend/plugins/gitextractor/main.go
+++ b/backend/plugins/gitextractor/main.go
@@ -78,7 +78,7 @@ func main() {
"git extractor",
nil,
)
- repo, err := impl.NewGitRepo(subTaskCtx.GetContext(), logger, storage,
tasks.GitExtractorOptions{
+ repo, err := tasks.NewGitRepo(subTaskCtx.GetContext(), logger, storage,
&tasks.GitExtractorOptions{
RepoId: *id,
Url: *url,
User: *user,
diff --git a/backend/plugins/gitextractor/impl/impl.go
b/backend/plugins/gitextractor/tasks/clone.go
similarity index 51%
copy from backend/plugins/gitextractor/impl/impl.go
copy to backend/plugins/gitextractor/tasks/clone.go
index 81fe8e134..88c769403 100644
--- a/backend/plugins/gitextractor/impl/impl.go
+++ b/backend/plugins/gitextractor/tasks/clone.go
@@ -15,85 +15,47 @@ See the License for the specific language governing
permissions and
limitations under the License.
*/
-package impl
+package tasks
import (
"context"
"fmt"
- "github.com/apache/incubator-devlake/core/dal"
"github.com/apache/incubator-devlake/core/errors"
"github.com/apache/incubator-devlake/core/log"
"github.com/apache/incubator-devlake/core/plugin"
- helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
"github.com/apache/incubator-devlake/plugins/gitextractor/models"
"github.com/apache/incubator-devlake/plugins/gitextractor/parser"
"github.com/apache/incubator-devlake/plugins/gitextractor/store"
- "github.com/apache/incubator-devlake/plugins/gitextractor/tasks"
"strings"
)
-var _ interface {
- plugin.PluginMeta
- plugin.PluginTask
- plugin.PluginModel
-} = (*GitExtractor)(nil)
-
-type GitExtractor struct{}
-
-func (p GitExtractor) GetTablesInfo() []dal.Tabler {
- return []dal.Tabler{}
-}
-
-func (p GitExtractor) Description() string {
- return "extract infos from git repository"
+var CloneGitRepoMeta = plugin.SubTaskMeta{
+ Name: "cloneGitRepo",
+ EntryPoint: CloneGitRepo,
+ EnabledByDefault: true,
+ Required: true,
+ Description: "clone a git repo, make it available to later tasks",
+ DomainTypes: []string{plugin.DOMAIN_TYPE_CODE},
}
-func (p GitExtractor) Name() string {
- return "gitextractor"
-}
-
-// return all available subtasks, framework will run them for you in order
-func (p GitExtractor) SubTaskMetas() []plugin.SubTaskMeta {
- return []plugin.SubTaskMeta{
- tasks.CollectGitCommitMeta,
- tasks.CollectGitBranchMeta,
- tasks.CollectGitTagMeta,
- tasks.CollectGitDiffLineMeta,
+func CloneGitRepo(subTaskCtx plugin.SubTaskContext) errors.Error {
+ taskData, ok := subTaskCtx.GetData().(*GitExtractorTaskData)
+ if !ok {
+ panic("git repo reference not found on context")
}
-}
-
-// based on task context and user input options, return data that shared among
all subtasks
-func (p GitExtractor) PrepareTaskData(taskCtx plugin.TaskContext, options
map[string]interface{}) (interface{}, errors.Error) {
- var op tasks.GitExtractorOptions
- if err := helper.Decode(options, &op, nil); err != nil {
- return nil, err
- }
- if err := op.Valid(); err != nil {
- return nil, err
- }
- storage := store.NewDatabase(taskCtx, op.RepoId)
- repo, err := NewGitRepo(taskCtx.GetContext(), taskCtx.GetLogger(),
storage, op)
+ op := taskData.Options
+ storage := store.NewDatabase(subTaskCtx, op.RepoId)
+ repo, err := NewGitRepo(subTaskCtx.GetContext(),
subTaskCtx.GetLogger(), storage, op)
if err != nil {
- return nil, err
- }
- return repo, nil
-}
-
-func (p GitExtractor) Close(taskCtx plugin.TaskContext) errors.Error {
- if repo, ok := taskCtx.GetData().(*parser.GitRepo); ok {
- if err := repo.Close(); err != nil {
- return errors.Convert(err)
- }
+ return err
}
+ taskData.GitRepo = repo
+ subTaskCtx.TaskContext().SetData(taskData)
return nil
}
-func (p GitExtractor) RootPkgPath() string {
- return "github.com/apache/incubator-devlake/plugins/gitextractor"
-}
-
// NewGitRepo create and return a new parser git repo
-func NewGitRepo(ctx context.Context, logger log.Logger, storage models.Store,
op tasks.GitExtractorOptions) (*parser.GitRepo, errors.Error) {
+func NewGitRepo(ctx context.Context, logger log.Logger, storage models.Store,
op *GitExtractorOptions) (*parser.GitRepo, errors.Error) {
var err errors.Error
var repo *parser.GitRepo
p := parser.NewGitRepoCreator(storage, logger)
diff --git a/backend/plugins/gitextractor/tasks/git_repo_collector.go
b/backend/plugins/gitextractor/tasks/git_repo_collector.go
index 45090f760..d5132fa6c 100644
--- a/backend/plugins/gitextractor/tasks/git_repo_collector.go
+++ b/backend/plugins/gitextractor/tasks/git_repo_collector.go
@@ -25,9 +25,14 @@ import (
"github.com/apache/incubator-devlake/plugins/gitextractor/parser"
)
+type GitExtractorTaskData struct {
+ Options *GitExtractorOptions
+ GitRepo *parser.GitRepo
+}
+
type GitExtractorOptions struct {
RepoId string `json:"repoId"`
- Name string `jsno:"name"`
+ Name string `json:"name"`
Url string `json:"url"`
User string `json:"user"`
Password string `json:"password"`
@@ -99,11 +104,14 @@ func CollectGitDiffLines(subTaskCtx plugin.SubTaskContext)
errors.Error {
}
func getGitRepo(subTaskCtx plugin.SubTaskContext) *parser.GitRepo {
- repo, ok := subTaskCtx.GetData().(*parser.GitRepo)
+ taskData, ok := subTaskCtx.GetData().(*GitExtractorTaskData)
if !ok {
panic("git repo reference not found on context")
}
- return repo
+ if taskData.GitRepo == nil {
+ panic("git repo is empty, please check subtask: clone repo")
+ }
+ return taskData.GitRepo
}
var CollectGitCommitMeta = plugin.SubTaskMeta{
@@ -112,6 +120,7 @@ var CollectGitCommitMeta = plugin.SubTaskMeta{
EnabledByDefault: true,
Description: "collect git commits into Domain Layer Tables",
DomainTypes: []string{plugin.DOMAIN_TYPE_CODE,
plugin.DOMAIN_TYPE_CROSS},
+ Dependencies: []*plugin.SubTaskMeta{&CloneGitRepoMeta},
}
var CollectGitBranchMeta = plugin.SubTaskMeta{
@@ -120,6 +129,7 @@ var CollectGitBranchMeta = plugin.SubTaskMeta{
EnabledByDefault: true,
Description: "collect git branch into Domain Layer Tables",
DomainTypes: []string{plugin.DOMAIN_TYPE_CODE},
+ Dependencies: []*plugin.SubTaskMeta{&CloneGitRepoMeta},
}
var CollectGitTagMeta = plugin.SubTaskMeta{
@@ -128,6 +138,7 @@ var CollectGitTagMeta = plugin.SubTaskMeta{
EnabledByDefault: true,
Description: "collect git tag into Domain Layer Tables",
DomainTypes: []string{plugin.DOMAIN_TYPE_CODE},
+ Dependencies: []*plugin.SubTaskMeta{&CloneGitRepoMeta},
}
var CollectGitDiffLineMeta = plugin.SubTaskMeta{
@@ -136,4 +147,5 @@ var CollectGitDiffLineMeta = plugin.SubTaskMeta{
EnabledByDefault: false,
Description: "collect git commit diff line into Domain Layer
Tables",
DomainTypes: []string{plugin.DOMAIN_TYPE_CODE},
+ Dependencies: []*plugin.SubTaskMeta{&CloneGitRepoMeta},
}