1package cmd
2
3import (
4 "fmt"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9
10 "github.com/spf13/cobra"
11)
12
13func NewCmdGitReceivePack() *cobra.Command {
14 cmd := &cobra.Command{
15 Use: "git-receive-pack <git-dir>",
16 Hidden: true,
17 Short: "Git receive-pack",
18 Args: cobra.ExactArgs(1),
19 RunE: func(cmd *cobra.Command, args []string) error {
20 if !strings.HasSuffix(args[0], ".git") {
21 return fmt.Errorf("invalid path")
22 }
23
24 reposDir := filepath.Join(k.String("dir"), ".smallweb", "repos")
25 if err := os.MkdirAll(reposDir, 0755); err != nil {
26 return err
27 }
28
29 repoDir := filepath.Join(reposDir, args[0])
30 if filepath.Dir(repoDir) != reposDir {
31 return fmt.Errorf("invalid path")
32 }
33
34 if _, err := os.Stat(repoDir); os.IsNotExist(err) {
35 initCmd := exec.Command("git", "init", repoDir, "--bare", "--initial-branch=main")
36 if err := initCmd.Run(); err != nil {
37 return err
38 }
39 } else if err != nil {
40 return err
41 }
42
43 gitReceiveCmd := exec.Command("git-receive-pack", repoDir)
44
45 gitReceiveCmd.Stdin = cmd.InOrStdin()
46 gitReceiveCmd.Stdout = cmd.OutOrStdout()
47 gitReceiveCmd.Stderr = cmd.ErrOrStderr()
48
49 if err := gitReceiveCmd.Run(); err != nil {
50 return err
51 }
52
53 appName := strings.TrimSuffix(filepath.Base(repoDir), ".git")
54 appDir := filepath.Join(k.String("dir"), appName)
55 if _, err := os.Stat(appDir); os.IsNotExist(err) {
56 if err := os.MkdirAll(appDir, 0755); err != nil {
57 fmt.Fprintln(cmd.ErrOrStderr(), err)
58 return err
59 }
60 } else if err != nil {
61 fmt.Fprintln(cmd.ErrOrStderr(), err)
62 return err
63 }
64
65 gitCheckOutCmd := exec.Command("git", "--git-dir", repoDir, "--work-tree", appDir, "checkout", "HEAD", "--", ".")
66 gitCheckOutCmd.Stderr = cmd.ErrOrStderr()
67 if err := gitCheckOutCmd.Run(); err != nil {
68 return err
69 }
70
71 cmd.PrintErrf("\nYour app is available at https://%s.%s\n\n", filepath.Base(appDir), k.String("domain"))
72
73 return nil
74 },
75 }
76
77 return cmd
78}
79
80func NewCmdGitUploadPack() *cobra.Command {
81 cmd := &cobra.Command{
82 Use: "git-upload-pack <git-dir>",
83 Hidden: true,
84 Short: "Git upload-pack",
85 Args: cobra.ExactArgs(1),
86 RunE: func(cmd *cobra.Command, args []string) error {
87 repoDir := filepath.Join(k.String("dir"), ".smallweb", "repos", args[0])
88 uploadCmd := exec.Command("git-upload-pack", repoDir)
89
90 uploadCmd.Stdin = cmd.InOrStdin()
91 uploadCmd.Stdout = cmd.OutOrStdout()
92 uploadCmd.Stderr = cmd.ErrOrStderr()
93
94 if err := uploadCmd.Run(); err != nil {
95 return err
96 }
97
98 return nil
99 },
100 }
101
102 return cmd
103}