diff --git a/cmd/repo.go b/cmd/repo.go index 5122b64..2d51cb6 100644 --- a/cmd/repo.go +++ b/cmd/repo.go @@ -13,6 +13,9 @@ var Repo = cli.Command{ Name: "repo", Usage: "Commands for interacting with a Gitea repository", Action: doRepo, + Subcommands: []*cli.Command{ + &RepoCreate, + }, } func doRepo(ctx *cli.Context) error { diff --git a/cmd/repo_create.go b/cmd/repo_create.go new file mode 100644 index 0000000..aaeea0a --- /dev/null +++ b/cmd/repo_create.go @@ -0,0 +1,91 @@ +package cmd + +import ( + "code.gitea.io/sdk/gitea" + "github.com/AlecAivazis/survey/v2" + "github.com/urfave/cli/v2" + "go.jolheiser.com/beaver" + "go.jolheiser.com/beaver/color" + "strings" +) + +var RepoCreate = cli.Command{ + Name: "create", + Usage: "Create a new repository", + Action: doRepoCreate, +} + +func doRepoCreate(ctx *cli.Context) error { + token, err := requireToken(ctx) + if err != nil { + return err + } + + client := gitea.NewClient(ctx.String("url"), token) + + questions := []*survey.Question{ + { + Name: "name", + Prompt: &survey.Input{Message: "Name"}, + Validate: survey.Required, + }, + { + Name: "description", + Prompt: &survey.Input{Message: "Description"}, + }, + { + Name: "private", + Prompt: &survey.Confirm{Message: "Private", Default: true}, + Validate: survey.Required, + }, + { + Name: "auto", + Prompt: &survey.Confirm{Message: "Auto-initialize", Default: false}, + Validate: survey.Required, + }, + } + answers := struct { + Name string + Description string + Private bool + Auto bool + }{} + + if err := survey.Ask(questions, &answers); err != nil { + return err + } + + opts := gitea.CreateRepoOption{ + Name: answers.Name, + Description: answers.Description, + Private: answers.Private, + AutoInit: answers.Auto, + } + + if answers.Auto { + auto := autoOpts(client) + opts.Gitignores = strings.Join(auto.Gitignores, ",") + opts.License = auto.License + opts.Readme = auto.Readme + } + + repo, err := client.CreateRepo(opts) + if err != nil { + return err + } + + beaver.Infof("Created new repo at %s", color.FgMagenta.Format(repo.HTMLURL)) + return nil +} + +type autoInit struct { + Gitignores []string + License string + Readme string +} + +func autoOpts(client *gitea.Client) autoInit { + // FIXME query gitignores, licenses, and readme when available in SDK + _ = client + return autoInit{Readme: "Default"} +}