github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/modules/git.go (about) 1 package modules 2 3 import ( 4 "errors" 5 "os/exec" 6 "regexp" 7 "strings" 8 9 "github.com/lmorg/murex/utils/ansi" 10 11 "github.com/lmorg/murex/config/profile" 12 "github.com/lmorg/murex/lang" 13 "github.com/lmorg/murex/utils/which" 14 ) 15 16 func gitSupported() error { 17 if which.Which("git") == "" { 18 return errors.New("`git` was not found in your $PATH") 19 } 20 21 return nil 22 } 23 24 func gitUpdate(p *lang.Process, pack *packageDb) error { 25 if err := gitSupported(); err != nil { 26 return err 27 } 28 29 return gitExec(p, "-C", profile.ModulePath()+pack.Package, "pull", "-q") 30 } 31 32 func gitStatus(p *lang.Process, pack *packageDb) error { 33 if err := gitSupported(); err != nil { 34 return err 35 } 36 37 // git fetch 38 39 params := []string{"-C", profile.ModulePath() + pack.Package, "fetch"} 40 41 if ansi.IsAllowed() { 42 params = append([]string{"-c", "color.status=always"}, params...) 43 } 44 45 if err := gitExec(p, params...); err != nil { 46 return err 47 } 48 49 // git status 50 51 params = []string{"-C", profile.ModulePath() + pack.Package, "status", "-sb"} 52 53 if ansi.IsAllowed() { 54 params = append([]string{"-c", "color.status=always"}, params...) 55 } 56 57 return gitExec(p, params...) 58 } 59 60 var ( 61 gitRxPath = regexp.MustCompile(`^.*/(.*?)(\.git)?$`) 62 errCannotParseGitURI = errors.New("cannot parse git URI to extract clone destination") 63 ) 64 65 func gitGetPath(uri string) (string, error) { 66 match := gitRxPath.FindAllStringSubmatch(uri, -1) 67 if len(match) == 0 || len(match[0]) < 2 { 68 return "", errCannotParseGitURI 69 } 70 71 if match[0][1] == "" { 72 return "", errCannotParseGitURI 73 } 74 75 return match[0][1], nil 76 } 77 78 func gitGet(p *lang.Process, uri string) (string, error) { 79 modulePath := profile.ModulePath() 80 81 if err := gitSupported(); err != nil { 82 return "", err 83 } 84 85 path, err := gitGetPath(uri) 86 if err != nil { 87 return "", err 88 } 89 90 err = gitExec(p, "clone", uri, modulePath+path) 91 if err != nil { 92 return "", err 93 } 94 95 return mvPackagePath(modulePath + path) 96 } 97 98 func gitExec(p *lang.Process, args ...string) error { 99 cmd := exec.Command("git", args...) 100 cmd.Stdout = p.Stdout 101 cmd.Stderr = p.Stderr 102 103 if err := cmd.Start(); err != nil { 104 if !strings.HasPrefix(err.Error(), "signal:") { 105 return err 106 } 107 } 108 109 if err := cmd.Wait(); err != nil { 110 if !strings.HasPrefix(err.Error(), "signal:") { 111 return err 112 } 113 } 114 115 return nil 116 } 117