add create Gitee group feature

This commit is contained in:
Zoker 2020-07-11 08:26:11 +08:00
parent 657f09c93d
commit 249e90e00c
2 changed files with 84 additions and 12 deletions

View File

@ -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), &paramsJson)
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: ",

View File

@ -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