mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-08-28 10:15:32 -05:00
I copied all files except dot files (.github and .gitignore), the _examples folder, and go.mod/go.sum. At some point we may want to copy the files back to the gocui repo when other clients (e.g. lazydocker) want to use the newer versions of them.
134 lines
3.6 KiB
Go
134 lines
3.6 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-errors/errors"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
"github.com/jesseduffield/lazygit/pkg/gocui"
|
|
)
|
|
|
|
type SyncCommands struct {
|
|
*GitCommon
|
|
}
|
|
|
|
func NewSyncCommands(gitCommon *GitCommon) *SyncCommands {
|
|
return &SyncCommands{
|
|
GitCommon: gitCommon,
|
|
}
|
|
}
|
|
|
|
// Push pushes to a branch
|
|
type PushOpts struct {
|
|
Force bool
|
|
ForceWithLease bool
|
|
CurrentBranch string
|
|
UpstreamRemote string
|
|
UpstreamBranch string
|
|
SetUpstream bool
|
|
}
|
|
|
|
func (self *SyncCommands) PushCmdObj(task gocui.Task, opts PushOpts) (*oscommands.CmdObj, error) {
|
|
if opts.UpstreamBranch != "" && opts.UpstreamRemote == "" {
|
|
return nil, errors.New(self.Tr.MustSpecifyOriginError)
|
|
}
|
|
|
|
cmdArgs := NewGitCmd("push").
|
|
ArgIf(opts.Force, "--force").
|
|
ArgIf(opts.ForceWithLease, "--force-with-lease").
|
|
ArgIf(opts.SetUpstream, "--set-upstream").
|
|
ArgIf(opts.UpstreamRemote != "", opts.UpstreamRemote).
|
|
ArgIf(opts.UpstreamBranch != "", fmt.Sprintf("refs/heads/%s:%s", opts.CurrentBranch, opts.UpstreamBranch)).
|
|
ToArgv()
|
|
|
|
cmdObj := self.cmd.New(cmdArgs).PromptOnCredentialRequest(task)
|
|
return cmdObj, nil
|
|
}
|
|
|
|
func (self *SyncCommands) Push(task gocui.Task, opts PushOpts) error {
|
|
cmdObj, err := self.PushCmdObj(task, opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return cmdObj.Run()
|
|
}
|
|
|
|
func (self *SyncCommands) fetchCommandBuilder(fetchAll bool) *GitCommandBuilder {
|
|
return NewGitCmd("fetch").
|
|
ArgIf(fetchAll, "--all").
|
|
// avoid writing to .git/FETCH_HEAD; this allows running a pull
|
|
// concurrently without getting errors
|
|
Arg("--no-write-fetch-head")
|
|
}
|
|
|
|
func (self *SyncCommands) FetchCmdObj(task gocui.Task) *oscommands.CmdObj {
|
|
cmdArgs := self.fetchCommandBuilder(self.UserConfig().Git.FetchAll).ToArgv()
|
|
|
|
cmdObj := self.cmd.New(cmdArgs)
|
|
cmdObj.PromptOnCredentialRequest(task)
|
|
return cmdObj
|
|
}
|
|
|
|
func (self *SyncCommands) Fetch(task gocui.Task) error {
|
|
return self.FetchCmdObj(task).Run()
|
|
}
|
|
|
|
func (self *SyncCommands) FetchBackgroundCmdObj() *oscommands.CmdObj {
|
|
cmdArgs := self.fetchCommandBuilder(self.UserConfig().Git.FetchAll).ToArgv()
|
|
|
|
cmdObj := self.cmd.New(cmdArgs)
|
|
cmdObj.DontLog().FailOnCredentialRequest()
|
|
cmdObj.SuppressOutputUnlessError()
|
|
return cmdObj
|
|
}
|
|
|
|
func (self *SyncCommands) FetchBackground() error {
|
|
return self.FetchBackgroundCmdObj().Run()
|
|
}
|
|
|
|
type PullOptions struct {
|
|
RemoteName string
|
|
BranchName string
|
|
FastForwardOnly bool
|
|
WorktreeGitDir string
|
|
WorktreePath string
|
|
}
|
|
|
|
func (self *SyncCommands) Pull(task gocui.Task, opts PullOptions) error {
|
|
cmdArgs := NewGitCmd("pull").
|
|
Arg("--no-edit").
|
|
ArgIf(opts.FastForwardOnly, "--ff-only").
|
|
ArgIf(opts.RemoteName != "", opts.RemoteName).
|
|
ArgIf(opts.BranchName != "", "refs/heads/"+opts.BranchName).
|
|
GitDirIf(opts.WorktreeGitDir != "", opts.WorktreeGitDir).
|
|
WorktreePathIf(opts.WorktreePath != "", opts.WorktreePath).
|
|
ToArgv()
|
|
|
|
// setting GIT_SEQUENCE_EDITOR to ':' as a way of skipping it, in case the user
|
|
// has 'pull.rebase = interactive' configured.
|
|
return self.cmd.New(cmdArgs).AddEnvVars("GIT_SEQUENCE_EDITOR=:").PromptOnCredentialRequest(task).Run()
|
|
}
|
|
|
|
func (self *SyncCommands) FastForward(
|
|
task gocui.Task,
|
|
branchName string,
|
|
remoteName string,
|
|
remoteBranchName string,
|
|
) error {
|
|
cmdArgs := self.fetchCommandBuilder(false).
|
|
Arg(remoteName).
|
|
Arg("refs/heads/" + remoteBranchName + ":" + branchName).
|
|
ToArgv()
|
|
|
|
return self.cmd.New(cmdArgs).PromptOnCredentialRequest(task).Run()
|
|
}
|
|
|
|
func (self *SyncCommands) FetchRemote(task gocui.Task, remoteName string) error {
|
|
cmdArgs := self.fetchCommandBuilder(false).
|
|
Arg(remoteName).
|
|
ToArgv()
|
|
|
|
return self.cmd.New(cmdArgs).PromptOnCredentialRequest(task).Run()
|
|
}
|