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