add create Gitee group feature
This commit is contained in:
parent
657f09c93d
commit
249e90e00c
|
@ -14,6 +14,7 @@ import (
|
||||||
"github.com/gookit/gcli/v2/interact"
|
"github.com/gookit/gcli/v2/interact"
|
||||||
"github.com/gookit/gcli/v2/progress"
|
"github.com/gookit/gcli/v2/progress"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
|
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
|
||||||
|
"github.com/bitly/go-simplejson"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RepoResult struct {
|
type RepoResult struct {
|
||||||
|
@ -55,9 +56,11 @@ func GiteeCommand() *gcli.Command {
|
||||||
/other/path/to/git-bare-repo3
|
/other/path/to/git-bare-repo3
|
||||||
...
|
...
|
||||||
|
|
||||||
<yellow>Using Source: </> <cyan>{$binName} {$cmd} github:zoker</>
|
<yellow>Using Source: </> <cyan>{$binName} {$cmd} github:zoker </><gray>YOUR_TOKEN_HERE(OPTIONAL)</>
|
||||||
Support import from Github source, replace {zoker} with your expected Github path
|
Support import from Github source, replace {zoker} with your expected Github path
|
||||||
|
<blue>It better to provide your own access_token to avoid api rate limit, eg on Github: https://github.com/settings/tokens</>
|
||||||
Alert: Only Github source and public project supported, other platform like Gitlab, Bitbucket will be added later
|
Alert: Only Github source and public project supported, other platform like Gitlab, Bitbucket will be added later
|
||||||
|
|
||||||
`}
|
`}
|
||||||
|
|
||||||
// bind args with names
|
// bind args with names
|
||||||
|
@ -97,7 +100,7 @@ func syncGitee(c *gcli.Command, args []string) error {
|
||||||
color.Green.Printf("\nHello, %s! \n\n", userInfo["name"])
|
color.Green.Printf("\nHello, %s! \n\n", userInfo["name"])
|
||||||
|
|
||||||
// get available namespace todo: enterprise and group
|
// get available namespace todo: enterprise and group
|
||||||
allNamespace := getNamespace(userInfo)
|
allNamespace := getNamespace(userInfo, accessToken)
|
||||||
namespace := make([]string, len(allNamespace))
|
namespace := make([]string, len(allNamespace))
|
||||||
for i, n := range allNamespace {
|
for i, n := range allNamespace {
|
||||||
namespace[i] = n[1]
|
namespace[i] = n[1]
|
||||||
|
@ -105,8 +108,17 @@ func syncGitee(c *gcli.Command, args []string) error {
|
||||||
selectedNumber := askNamespace(namespace)
|
selectedNumber := askNamespace(namespace)
|
||||||
numberD, _ := strconv.Atoi(selectedNumber)
|
numberD, _ := strconv.Atoi(selectedNumber)
|
||||||
|
|
||||||
|
var selectedNp []string
|
||||||
|
if numberD == 0 {
|
||||||
|
// create a new group
|
||||||
|
selectedNp = createGroup(accessToken)
|
||||||
|
if selectedNp == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// select namespace and ask for ensure
|
// select namespace and ask for ensure
|
||||||
selectedNp := allNamespace[numberD]
|
selectedNp = allNamespace[numberD]
|
||||||
|
}
|
||||||
color.Notice.Printf("\nSelected %s(https://gitee.com/%s) as namespace, Type: %s \n" +
|
color.Notice.Printf("\nSelected %s(https://gitee.com/%s) as namespace, Type: %s \n" +
|
||||||
"The following projects will be generated on Gitee: \n\n", selectedNp[0], selectedNp[1], selectedNp[2])
|
"The following projects will be generated on Gitee: \n\n", selectedNp[0], selectedNp[1], selectedNp[2])
|
||||||
|
|
||||||
|
@ -159,7 +171,7 @@ func syncGitee(c *gcli.Command, args []string) error {
|
||||||
color.Red.Println(err.Error())
|
color.Red.Println(err.Error())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fmt.Printf("\nA tmp repo dir `%s` created for tmp repositories, you can remove it after sync successed\n", tmpDir)
|
fmt.Printf("\nA tmp repo dir `%s` created for tmp repositories, you can remove it after sync successed\n\n", tmpDir)
|
||||||
fmt.Println("Cloning and Uploading Projects to Gitee, Please Wait...")
|
fmt.Println("Cloning and Uploading Projects to Gitee, Please Wait...")
|
||||||
}
|
}
|
||||||
syncRes := multiSync(avaiRepo, auth, asExi, tmpDir)
|
syncRes := multiSync(avaiRepo, auth, asExi, tmpDir)
|
||||||
|
@ -228,16 +240,57 @@ func filterResult(result map[string]interface{}, key string) (string, bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo enable select group and enterprise
|
// todo enable select group and enterprise
|
||||||
func getNamespace(userInfo map [string]string) [][]string {
|
func getNamespace(userInfo map [string]string, token string) [][]string {
|
||||||
namespace := make([][]string, 1)
|
var namespace [][]string
|
||||||
namespace[0] = make([]string, 4)
|
newOrg := []string{"Create a new Group", "Create a new Group", ""}
|
||||||
namespace[0][0] = userInfo["name"]
|
owner := []string{userInfo["name"], userInfo["username"], "Personal"}
|
||||||
namespace[0][1] = userInfo["username"]
|
namespace = append(namespace, newOrg, owner)
|
||||||
namespace[0][2] = "Personal"
|
|
||||||
namespace[0][3] = "0"
|
orgUrl := fmt.Sprintf("https://gitee.com/api/v5/user/orgs?access_token=%s&per_page=100", token)
|
||||||
|
if result, _, err := share.GetByte(orgUrl); err == nil {
|
||||||
|
orgRes, _ := simplejson.NewJson([]byte(result))
|
||||||
|
serOrg, _ := orgRes.Array()
|
||||||
|
for _, org := range serOrg {
|
||||||
|
orgA := org.(map[string]interface{})
|
||||||
|
orgName := orgA["login"].(string)
|
||||||
|
namespace = append(namespace, []string{orgName, orgName, "Group"})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return namespace
|
return namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createGroup(token string) []string {
|
||||||
|
orgPath, _ := interact.ReadLine("\nPlease enter your new Group path(eg: zoker, zoker123, osc123): ")
|
||||||
|
if len(orgPath) == 0 {
|
||||||
|
color.Red.Println("Group path must be provided!")
|
||||||
|
} else {
|
||||||
|
orgUrl := "https://gitee.com/api/v5/users/organization"
|
||||||
|
params := fmt.Sprintf(`{
|
||||||
|
"access_token": "%s",
|
||||||
|
"name": "%s",
|
||||||
|
"org": "%s"
|
||||||
|
}`, token, orgPath, orgPath)
|
||||||
|
var paramsJson map[string]interface{}
|
||||||
|
json.Unmarshal([]byte(params), ¶msJson)
|
||||||
|
|
||||||
|
if result, _, err := share.PostFormByte(orgUrl, paramsJson); err == nil {
|
||||||
|
orgRes, _ := simplejson.NewJson([]byte(result))
|
||||||
|
login, _ := orgRes.Get("login").String()
|
||||||
|
errorMsg, _ := orgRes.Get("message").String()
|
||||||
|
if login == orgPath {
|
||||||
|
color.Green.Printf("\nGroup https://gitee.com/%s has been successfully Created!\n", orgPath)
|
||||||
|
return []string{orgPath, orgPath, "Group"}
|
||||||
|
} else {
|
||||||
|
color.Red.Println(errorMsg)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
color.Red.Println(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func askNamespace(namespace []string) string {
|
func askNamespace(namespace []string) string {
|
||||||
np := interact.SelectOne(
|
np := interact.SelectOne(
|
||||||
"Please select which namespace you want to put this repositories: ",
|
"Please select which namespace you want to put this repositories: ",
|
||||||
|
|
|
@ -386,6 +386,25 @@ func PostForm(uri string, params map[string]interface{}) (map[string]interface{}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PostFormByte(uri string, params map[string]interface{}) ([]byte, NetHttp.Header, error) {
|
||||||
|
data := ""
|
||||||
|
for k, v := range params {
|
||||||
|
data += fmt.Sprintf("%s=%s&%s", k, v.(string), data)
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := NetHttp.Post(uri, "application/x-www-form-urlencoded", strings.NewReader(data))
|
||||||
|
if err != nil {
|
||||||
|
color.Red.Printf("Request failed, Error: %s \n", err.Error())
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(response.Body)
|
||||||
|
header := response.Header
|
||||||
|
|
||||||
|
return body, header, nil
|
||||||
|
}
|
||||||
|
|
||||||
func ShowProjectLists(host string, repos []string, path string) {
|
func ShowProjectLists(host string, repos []string, path string) {
|
||||||
for i, r := range repos {
|
for i, r := range repos {
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
Loading…
Reference in New Issue