Add gtea connect command for existing repos
Connects the current directory to a new Gitea repo — creates the remote, adds the origin, and pushes. Sanitizes the folder name to meet Gitea's AlphaDashDot naming rules. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
68
cmd/connect.go
Normal file
68
cmd/connect.go
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
gogitea "code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
var connectCmd = &cobra.Command{
|
||||||
|
Use: "connect",
|
||||||
|
Short: "Create a Gitea repo for the current directory and push",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
cfg, err := loadConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use current folder name as repo name
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("getting current directory: %w", err)
|
||||||
|
}
|
||||||
|
raw := filepath.Base(cwd)
|
||||||
|
// Gitea repo names: only alphanumeric, dash, dot — replace everything else with a dash
|
||||||
|
name := regexp.MustCompile(`[^a-zA-Z0-9.\-]`).ReplaceAllString(raw, "-")
|
||||||
|
name = strings.Trim(name, "-")
|
||||||
|
fmt.Printf("Using repo name: %s\n", name)
|
||||||
|
|
||||||
|
client, err := gogitea.NewClient(cfg.URL, gogitea.SetToken(cfg.Token))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("connecting to Gitea: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
repo, _, err := client.CreateRepo(gogitea.CreateRepoOption{
|
||||||
|
Name: name,
|
||||||
|
Description: repoDesc,
|
||||||
|
Private: repoPrivate,
|
||||||
|
AutoInit: false,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("creating Gitea repo: %w", err)
|
||||||
|
}
|
||||||
|
fmt.Println("Created Gitea repo:", repo.HTMLURL)
|
||||||
|
|
||||||
|
remote := authCloneURL(cfg, repo.CloneURL)
|
||||||
|
if err := runGit(".", "remote", "add", "origin", remote); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := runGit(".", "push", "-u", "origin", "main"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Pushed to:", repo.HTMLURL)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
connectCmd.Flags().BoolVarP(&repoPrivate, "private", "p", false, "Make the repo private")
|
||||||
|
connectCmd.Flags().StringVarP(&repoDesc, "desc", "d", "", "Repo description")
|
||||||
|
rootCmd.AddCommand(connectCmd)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user