You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by mr...@apache.org on 2017/09/05 03:04:15 UTC

[incubator-openwhisk-wskdeploy] branch master updated: Support sub folder in git repo as a dependency project (#436)

This is an automated email from the ASF dual-hosted git repository.

mrutkowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-wskdeploy.git


The following commit(s) were added to refs/heads/master by this push:
     new 8ca010e  Support sub folder in git repo as a dependency project (#436)
8ca010e is described below

commit 8ca010efdf46837901ed1443d5408ba96b293577
Author: Ying Chun Guo <gu...@cn.ibm.com>
AuthorDate: Tue Sep 5 11:04:13 2017 +0800

    Support sub folder in git repo as a dependency project (#436)
---
 deployers/servicedeployer.go            |  7 ++++--
 parsers/manifest_parser.go              |  2 +-
 tests/usecases/dependency/manifest.yaml |  4 +++-
 utils/dependencies.go                   | 40 +++++++++++++++++++++++++++++----
 utils/gitreader.go                      | 19 ++++++++++------
 utils/misc.go                           | 21 +++++++++++++++++
 utils/util_test.go                      | 14 ++++++++++++
 7 files changed, 92 insertions(+), 15 deletions(-)

diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index 3bd27ee..8a6cba7 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -839,8 +839,11 @@ func (deployer *ServiceDeployer) printDeploymentAssets(assets *DeploymentApplica
 func (deployer *ServiceDeployer) getDependentDeployer(depName string, depRecord utils.DependencyRecord) (*ServiceDeployer, error) {
 	depServiceDeployer := NewServiceDeployer()
 	projectPath := path.Join(depRecord.ProjectPath, depName+"-"+depRecord.Version)
-	manifestPath := path.Join(projectPath, utils.ManifestFileNameYml)
-	deploymentPath := path.Join(projectPath, utils.DeploymentFileNameYaml)
+	if len(depRecord.SubFolder)>0 {
+		projectPath = path.Join(projectPath,depRecord.SubFolder)
+	}
+	manifestPath := utils.GetManifestFilePath(projectPath)
+	deploymentPath := utils.GetDeploymentFilePath(projectPath)
 	depServiceDeployer.ProjectPath = projectPath
 	depServiceDeployer.ManifestPath = manifestPath
 	depServiceDeployer.DeploymentPath = deploymentPath
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index 3034e12..a0a3b3c 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -146,7 +146,7 @@ func (dm *YAMLParser) ComposeDependencies(mani *ManifestYAML, projectPath string
 		}
 
 		packDir := path.Join(projectPath, "Packages")
-		depMap[key] = utils.DependencyRecord{packDir, mani.Package.Packagename, location, version, keyValArrParams, keyValArrAnot, isBinding}
+		depMap[key] = utils.NewDependencyRecord(packDir, mani.Package.Packagename, location, version, keyValArrParams, keyValArrAnot, isBinding)
 	}
 
 	return depMap, nil
diff --git a/tests/usecases/dependency/manifest.yaml b/tests/usecases/dependency/manifest.yaml
index 5a39fd6..9b12035 100644
--- a/tests/usecases/dependency/manifest.yaml
+++ b/tests/usecases/dependency/manifest.yaml
@@ -3,6 +3,8 @@ package:
   dependencies:
     hellowhisk:
       location: github.com/paulcastro/hellowhisk
+    myhelloworld:
+      location: github.com/daisy-ycguo/wskdeploy-test/helloworld
     myCloudant:
       location: /whisk.system/cloudant
       inputs:
@@ -11,7 +13,7 @@ package:
         myAnnotation: Here it is
   sequences:
     mySequence:
-      actions: hellowhisk/greeting, hellowhisk/httpGet
+      actions: hellowhisk/greeting, hellowhisk/httpGet, myhelloworld/helloworld
   triggers:
     myTrigger:
   rules:
diff --git a/utils/dependencies.go b/utils/dependencies.go
index 524a705..ff569dc 100644
--- a/utils/dependencies.go
+++ b/utils/dependencies.go
@@ -24,13 +24,44 @@ import (
 )
 
 type DependencyRecord struct {
-	ProjectPath string
-	Packagename string
-	Location    string
-	Version     string
+	ProjectPath string	//root of the source codes of dependent projects, e.g. src_project_path/Packages
+	Packagename string	//name of the package
+	Location    string	//location
+	Version     string	//version
 	Parameters  whisk.KeyValueArr
 	Annotations whisk.KeyValueArr
 	IsBinding   bool
+	BaseRepo    string
+	SubFolder   string
+}
+
+func NewDependencyRecord(projectPath string,
+			packagename string,
+			location string,
+			version string,
+			parameters whisk.KeyValueArr,
+			annotations whisk.KeyValueArr,
+			isBinding bool) DependencyRecord {
+	var record DependencyRecord
+	record.ProjectPath = projectPath
+	record.Packagename = packagename
+	record.Location = location
+	record.Version = version
+	record.Parameters = parameters
+	record.Annotations = annotations
+	record.IsBinding = isBinding
+	//split url to BaseUrl and SubFolder
+	if !record.IsBinding {
+		paths := strings.Split(location, "/")
+		record.BaseRepo = strings.Join([]string{paths[0],paths[1],paths[2],paths[3],paths[4]},"/")
+		if len(paths)>5 {
+			record.SubFolder = strings.TrimPrefix(record.Location,record.BaseRepo)
+		} else {
+			record.SubFolder = ""
+		}
+	}
+
+	return record
 }
 
 func LocationIsBinding(location string) bool {
@@ -48,3 +79,4 @@ func LocationIsGithub(location string) bool {
 
 	return false
 }
+
diff --git a/utils/gitreader.go b/utils/gitreader.go
index 471a3dd..ca1dbce 100644
--- a/utils/gitreader.go
+++ b/utils/gitreader.go
@@ -29,19 +29,20 @@ import (
 )
 
 type GitReader struct {
-	Name        string
-	Url         string
+	Name        string	// the name of the dependency
+	Url         string	// pkg repo location, e.g. github.com/user/repo
+	//BaseRepo    string	// base url of the git repo, e.g. github.com/user/repo
+	//SubFolder   string	// subfolder of the package under BaseUrl
 	Version     string
-	ProjectPath string
+	ProjectPath string	// The root folder of all dependency packages, e.g. src_project_path/Packages
 }
 
 func NewGitReader(projectName string, record DependencyRecord) *GitReader {
 	var gitReader GitReader
 
 	gitReader.Name = projectName
-	gitReader.Url = record.Location
+	gitReader.Url = record.BaseRepo
 	gitReader.Version = record.Version
-
 	gitReader.ProjectPath = record.ProjectPath
 
 	return &gitReader
@@ -68,7 +69,7 @@ func (reader *GitReader) CloneDependency() error {
 	Check(err)
 
 	u, err := url.Parse(reader.Url)
-	team, project := path.Split(u.Path)
+	team, _ := path.Split(u.Path)
 
 	team = strings.TrimPrefix(team, "/")
 	team = strings.TrimSuffix(team, "/")
@@ -95,7 +96,11 @@ func (reader *GitReader) CloneDependency() error {
 	}
 
 	rootDir := filepath.Join(reader.ProjectPath, zipReader.File[0].Name)
-	depPath := filepath.Join(reader.ProjectPath, project+"-"+reader.Version)
+	depPath := filepath.Join(reader.ProjectPath, reader.Name+"-"+reader.Version)
+	//if the folder exists, remove it at first
+	if _, err := os.Stat(depPath); err == nil {
+		os.Remove(depPath)
+	}
 	os.Rename(rootDir, depPath)
 	os.Remove(filepath.Join(reader.ProjectPath, zipFileName))
 
diff --git a/utils/misc.go b/utils/misc.go
index 64a45cc..99396bd 100644
--- a/utils/misc.go
+++ b/utils/misc.go
@@ -38,6 +38,7 @@ import (
 	"github.com/hokaccha/go-prettyjson"
 	"io/ioutil"
 	"net/http"
+	"path"
 )
 
 // ActionRecord is a container to keep track of
@@ -591,6 +592,26 @@ func CheckExistRuntime(rtname string, rts map[string][]string) bool {
 	return false
 }
 
+func GetManifestFilePath(projectPath string) string {
+	if _, err := os.Stat(path.Join(projectPath, ManifestFileNameYaml)); err == nil {
+		return path.Join(projectPath, ManifestFileNameYaml)
+	} else if _, err := os.Stat(path.Join(projectPath, ManifestFileNameYml)); err == nil {
+		return path.Join(projectPath, ManifestFileNameYml)
+	} else {
+		return ""
+	}
+}
+
+func GetDeploymentFilePath(projectPath string) string {
+	if _, err := os.Stat(path.Join(projectPath, DeploymentFileNameYaml)); err == nil {
+		return path.Join(projectPath, DeploymentFileNameYaml)
+	} else if _, err := os.Stat(path.Join(projectPath, DeploymentFileNameYml)); err == nil {
+		return path.Join(projectPath, DeploymentFileNameYml)
+	} else {
+		return ""
+	}
+}
+
 // name of manifest and deployment files
 const ManifestFileNameYaml = "manifest.yaml"
 const ManifestFileNameYml = "manifest.yml"
diff --git a/utils/util_test.go b/utils/util_test.go
index 21c4b6a..12bfd22 100644
--- a/utils/util_test.go
+++ b/utils/util_test.go
@@ -60,3 +60,17 @@ func TestGetEnvVar(t *testing.T) {
 	assert.Equal(t, "5000", GetEnvVar("5000"), "Should be no difference between integer and string.")
 	assert.Equal(t, "", GetEnvVar("$WithDollarAgain"), "if not found in environemnt, return empty string.")
 }
+
+func TestDependencies(t *testing.T) {
+	var record = NewDependencyRecord("projectPath","packageName","http://github.com/user/repo","master",nil,nil,false)
+	assert.Equal(t, "projectPath", record.ProjectPath,"ProjectPath is wrong")
+	assert.Equal(t, "http://github.com/user/repo", record.Location, "URL is wrong")
+	assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
+	assert.Equal(t, "", record.SubFolder, "SubFolder is wrong")
+
+	record = NewDependencyRecord("projectPath","packageName","http://github.com/user/repo/subfolder1/subfolder2","master",nil,nil,false)
+	assert.Equal(t, "projectPath", record.ProjectPath,"ProjectPath is wrong")
+	assert.Equal(t, "http://github.com/user/repo/subfolder1/subfolder2", record.Location, "URL is wrong")
+	assert.Equal(t, "http://github.com/user/repo", record.BaseRepo, "BaseRepo is wrong")
+	assert.Equal(t, "/subfolder1/subfolder2", record.SubFolder, "SubFolder is wrong")
+}

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].