mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
package oscommands
|
|
|
|
import (
|
|
"os/exec"
|
|
)
|
|
|
|
// A command object is a general way to represent a command to be run on the
|
|
// command line.
|
|
type ICmdObj interface {
|
|
GetCmd() *exec.Cmd
|
|
// outputs string representation of command. Note that if the command was built
|
|
// using NewFromArgs, the output won't be quite the same as what you would type
|
|
// into a terminal e.g. 'sh -c git commit' as opposed to 'sh -c "git commit"'
|
|
ToString() string
|
|
|
|
AddEnvVars(...string) ICmdObj
|
|
GetEnvVars() []string
|
|
|
|
// runs the command and returns an error if any
|
|
Run() error
|
|
// runs the command and returns the output as a string, and an error if any
|
|
RunWithOutput() (string, error)
|
|
// runs the command and runs a callback function on each line of the output. If the callback returns true for the boolean value, we kill the process and return.
|
|
RunAndProcessLines(onLine func(line string) (bool, error)) error
|
|
|
|
// Be calling DontLog(), we're saying that once we call Run(), we don't want to
|
|
// log the command in the UI (it'll still be logged in the log file). The general rule
|
|
// is that if a command doesn't change the git state (e.g. read commands like `git diff`)
|
|
// then we don't want to log it. If we are changing something (e.g. `git add .`) then
|
|
// we do. The only exception is if we're running a command in the background periodically
|
|
// like `git fetch`, which technically does mutate stuff but isn't something we need
|
|
// to notify the user about.
|
|
DontLog() ICmdObj
|
|
|
|
// This returns false if DontLog() was called
|
|
ShouldLog() bool
|
|
|
|
PromptOnCredentialRequest() ICmdObj
|
|
FailOnCredentialRequest() ICmdObj
|
|
|
|
GetCredentialStrategy() CredentialStrategy
|
|
}
|
|
|
|
type CmdObj struct {
|
|
cmdStr string
|
|
cmd *exec.Cmd
|
|
|
|
runner ICmdObjRunner
|
|
|
|
// if set to true, we don't want to log the command to the user.
|
|
dontLog bool
|
|
|
|
// if set to true, it means we might be asked to enter a username/password by this command.
|
|
credentialStrategy CredentialStrategy
|
|
}
|
|
|
|
type CredentialStrategy int
|
|
|
|
const (
|
|
// do not expect a credential request. If we end up getting one
|
|
// we'll be in trouble because the command will hang indefinitely
|
|
NONE CredentialStrategy = iota
|
|
// expect a credential request and if we get one, prompt the user to enter their username/password
|
|
PROMPT
|
|
// in this case we will check for a credential request (i.e. the command pauses to ask for
|
|
// username/password) and if we get one, we just submit a newline, forcing the
|
|
// command to fail. We use this e.g. for a background `git fetch` to prevent it
|
|
// from hanging indefinitely.
|
|
FAIL
|
|
)
|
|
|
|
var _ ICmdObj = &CmdObj{}
|
|
|
|
func (self *CmdObj) GetCmd() *exec.Cmd {
|
|
return self.cmd
|
|
}
|
|
|
|
func (self *CmdObj) ToString() string {
|
|
return self.cmdStr
|
|
}
|
|
|
|
func (self *CmdObj) AddEnvVars(vars ...string) ICmdObj {
|
|
self.cmd.Env = append(self.cmd.Env, vars...)
|
|
|
|
return self
|
|
}
|
|
|
|
func (self *CmdObj) GetEnvVars() []string {
|
|
return self.cmd.Env
|
|
}
|
|
|
|
func (self *CmdObj) DontLog() ICmdObj {
|
|
self.dontLog = true
|
|
return self
|
|
}
|
|
|
|
func (self *CmdObj) ShouldLog() bool {
|
|
return !self.dontLog
|
|
}
|
|
|
|
func (self *CmdObj) Run() error {
|
|
return self.runner.Run(self)
|
|
}
|
|
|
|
func (self *CmdObj) RunWithOutput() (string, error) {
|
|
return self.runner.RunWithOutput(self)
|
|
}
|
|
|
|
func (self *CmdObj) RunAndProcessLines(onLine func(line string) (bool, error)) error {
|
|
return self.runner.RunAndProcessLines(self, onLine)
|
|
}
|
|
|
|
func (self *CmdObj) PromptOnCredentialRequest() ICmdObj {
|
|
self.credentialStrategy = PROMPT
|
|
|
|
return self
|
|
}
|
|
|
|
func (self *CmdObj) FailOnCredentialRequest() ICmdObj {
|
|
self.credentialStrategy = FAIL
|
|
|
|
return self
|
|
}
|
|
|
|
func (self *CmdObj) GetCredentialStrategy() CredentialStrategy {
|
|
return self.credentialStrategy
|
|
}
|