150 lines
4.1 KiB
Go
150 lines
4.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/gogits/go-gogs-client"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// Flags.
|
|
var repoName string
|
|
var repoDescription string
|
|
var repoIsPrivate bool
|
|
var orgName string
|
|
|
|
var repoRemoteName string
|
|
|
|
var createCmd = &cobra.Command{
|
|
Aliases: []string{"new", "n", "c"},
|
|
Use: "create <name>",
|
|
Short: "Create a repository",
|
|
Example: `
|
|
gogs repo create my-new-repo
|
|
gogs repo new my-new-repo
|
|
gogs repo create -n=my-new-repo
|
|
gogs repo create JustUsGuys/our-new-repo --desc="a thing with things" -p=true
|
|
gogs repo new my-new-repo --private
|
|
gogs repo create my-new-repo --add-remote=origin Will initialize git if not already, too.`,
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
|
if len(args) == 0 {
|
|
fmt.Println("Please argue me a name of a repo to create.")
|
|
return
|
|
}
|
|
// Moving to use MyCompany/new-project as way to specify organization instead of
|
|
// --org flag.
|
|
if len(args) == 1 {
|
|
splitter := strings.Split(args[0], "/")
|
|
if len(splitter) == 2 {
|
|
orgName = splitter[0]
|
|
repoName = splitter[1]
|
|
} else {
|
|
repoName = args[0]
|
|
}
|
|
} else {
|
|
// we got MyCompany new-project
|
|
orgName = args[0]
|
|
repoName = args[1] // this'll take 'cactus' of MyCompany cactus spikey --private; spikey will be igored... FIXME?
|
|
}
|
|
|
|
createRepoOpts := gogs.CreateRepoOption{
|
|
Name: repoName,
|
|
Description: repoDescription,
|
|
Private: repoIsPrivate,
|
|
}
|
|
|
|
var err error
|
|
var repo *gogs.Repository
|
|
|
|
if orgName == "" {
|
|
repo, err = GetClient().CreateRepo(createRepoOpts)
|
|
} else {
|
|
repo, err = GetClient().CreateOrgRepo(orgName, createRepoOpts)
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
fmt.Println("Repo created! Woohoo!")
|
|
printRepo(repo)
|
|
|
|
// add git url as remote to working dir
|
|
if repoRemoteName != "" {
|
|
// get git path
|
|
getGitComm := exec.Command("/usr/bin/which", "git")
|
|
whichGit, err := getGitComm.Output()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
fmt.Println("...You have git installed, right?")
|
|
return
|
|
}
|
|
|
|
whichGitClean := strings.Replace(string(whichGit), "\n", "", 1)
|
|
|
|
gitAddRemoteComm := exec.Command(whichGitClean, "remote", "add", repoRemoteName, repo.CloneURL)
|
|
_, err = gitAddRemoteComm.Output()
|
|
|
|
if err != nil {
|
|
// go a step further and let's try init-ing the repo
|
|
//
|
|
var gitInitDone = make(chan bool)
|
|
|
|
go func() {
|
|
gitInitComm := exec.Command(whichGitClean, "init")
|
|
gitInit, initErr := gitInitComm.Output()
|
|
if initErr != nil {
|
|
fmt.Println(initErr)
|
|
} else {
|
|
fmt.Println(string(gitInit))
|
|
}
|
|
gitInitDone <- true
|
|
}()
|
|
|
|
// wait for gitInitDone
|
|
<-gitInitDone
|
|
// Apparently exec can only call any given command once.
|
|
// https://github.com/golang/go/issues/10305
|
|
gitAddRemoteComm2 := exec.Command(whichGitClean, "remote", "add", repoRemoteName, repo.CloneURL)
|
|
_, err = gitAddRemoteComm2.Output()
|
|
if err != nil {
|
|
fmt.Println("error adding remote -- ", err.Error())
|
|
} else {
|
|
gitShowRemotesCommand := exec.Command(whichGitClean, "remote", "-v")
|
|
gitShowRemotes, err := gitShowRemotesCommand.Output()
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
fmt.Println(string(gitShowRemotes))
|
|
}
|
|
|
|
} else {
|
|
// else there was git already and remote was added
|
|
// fmt.Println(string(addRemote)) // gotcha: adding a remote success returns ""
|
|
// fmt.Println("Remote added as " + repoRemoteName)
|
|
gitShowRemotesCommand2 := exec.Command(whichGitClean, "remote", "-v")
|
|
gitShowRemotes2, err := gitShowRemotesCommand2.Output()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
fmt.Println(string(gitShowRemotes2))
|
|
}
|
|
}
|
|
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
repoCmd.AddCommand(createCmd)
|
|
|
|
// createCmd.Flags().StringVarP(&repoName, "name", "n", "", "repo name")
|
|
createCmd.Flags().StringVarP(&repoDescription, "desc", "d", "", "repo description")
|
|
createCmd.Flags().BoolVarP(&repoIsPrivate, "private", "p", false, "repo is private")
|
|
// createCmd.Flags().StringVarP(&orgName, "org", "o", "", "organization")
|
|
|
|
createCmd.Flags().StringVarP(&repoRemoteName, "add-remote", "r", "", "remote name")
|
|
}
|