mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-14 11:23:09 +02:00
1dd7307fde
more and more move rebase commit refreshing into existing abstraction and more and more WIP and more handling clicks properly fix merge conflicts update cheatsheet lots more preparation to start moving things into controllers WIP better typing expand on remotes controller moving more code into controllers
123 lines
3.0 KiB
Go
123 lines
3.0 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-errors/errors"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
)
|
|
|
|
type SyncCommands struct {
|
|
*GitCommon
|
|
}
|
|
|
|
func NewSyncCommands(gitCommon *GitCommon) *SyncCommands {
|
|
return &SyncCommands{
|
|
GitCommon: gitCommon,
|
|
}
|
|
}
|
|
|
|
// Push pushes to a branch
|
|
type PushOpts struct {
|
|
Force bool
|
|
UpstreamRemote string
|
|
UpstreamBranch string
|
|
SetUpstream bool
|
|
}
|
|
|
|
func (self *SyncCommands) PushCmdObj(opts PushOpts) (oscommands.ICmdObj, error) {
|
|
cmdStr := "git push"
|
|
|
|
if opts.Force {
|
|
cmdStr += " --force-with-lease"
|
|
}
|
|
|
|
if opts.SetUpstream {
|
|
cmdStr += " --set-upstream"
|
|
}
|
|
|
|
if opts.UpstreamRemote != "" {
|
|
cmdStr += " " + self.cmd.Quote(opts.UpstreamRemote)
|
|
}
|
|
|
|
if opts.UpstreamBranch != "" {
|
|
if opts.UpstreamRemote == "" {
|
|
return nil, errors.New(self.Tr.MustSpecifyOriginError)
|
|
}
|
|
cmdStr += " " + self.cmd.Quote(opts.UpstreamBranch)
|
|
}
|
|
|
|
cmdObj := self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex)
|
|
return cmdObj, nil
|
|
}
|
|
|
|
func (self *SyncCommands) Push(opts PushOpts) error {
|
|
cmdObj, err := self.PushCmdObj(opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return cmdObj.Run()
|
|
}
|
|
|
|
type FetchOptions struct {
|
|
Background bool
|
|
RemoteName string
|
|
BranchName string
|
|
}
|
|
|
|
// Fetch fetch git repo
|
|
func (self *SyncCommands) Fetch(opts FetchOptions) error {
|
|
cmdStr := "git fetch"
|
|
|
|
if opts.RemoteName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, self.cmd.Quote(opts.RemoteName))
|
|
}
|
|
if opts.BranchName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, self.cmd.Quote(opts.BranchName))
|
|
}
|
|
|
|
cmdObj := self.cmd.New(cmdStr)
|
|
if opts.Background {
|
|
cmdObj.DontLog().FailOnCredentialRequest()
|
|
} else {
|
|
cmdObj.PromptOnCredentialRequest()
|
|
}
|
|
return cmdObj.WithMutex(self.syncMutex).Run()
|
|
}
|
|
|
|
type PullOptions struct {
|
|
RemoteName string
|
|
BranchName string
|
|
FastForwardOnly bool
|
|
}
|
|
|
|
func (self *SyncCommands) Pull(opts PullOptions) error {
|
|
cmdStr := "git pull --no-edit"
|
|
|
|
if opts.FastForwardOnly {
|
|
cmdStr += " --ff-only"
|
|
}
|
|
|
|
if opts.RemoteName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, self.cmd.Quote(opts.RemoteName))
|
|
}
|
|
if opts.BranchName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, self.cmd.Quote(opts.BranchName))
|
|
}
|
|
|
|
// setting GIT_SEQUENCE_EDITOR to ':' as a way of skipping it, in case the user
|
|
// has 'pull.rebase = interactive' configured.
|
|
return self.cmd.New(cmdStr).AddEnvVars("GIT_SEQUENCE_EDITOR=:").PromptOnCredentialRequest().WithMutex(self.syncMutex).Run()
|
|
}
|
|
|
|
func (self *SyncCommands) FastForward(branchName string, remoteName string, remoteBranchName string) error {
|
|
cmdStr := fmt.Sprintf("git fetch %s %s:%s", self.cmd.Quote(remoteName), self.cmd.Quote(remoteBranchName), self.cmd.Quote(branchName))
|
|
return self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run()
|
|
}
|
|
|
|
func (self *SyncCommands) FetchRemote(remoteName string) error {
|
|
cmdStr := fmt.Sprintf("git fetch %s", self.cmd.Quote(remoteName))
|
|
return self.cmd.New(cmdStr).PromptOnCredentialRequest().WithMutex(self.syncMutex).Run()
|
|
}
|