mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-errors/errors"
|
|
)
|
|
|
|
// Push pushes to a branch
|
|
type PushOpts struct {
|
|
Force bool
|
|
UpstreamRemote string
|
|
UpstreamBranch string
|
|
SetUpstream bool
|
|
PromptUserForCredential func(string) string
|
|
}
|
|
|
|
func (c *GitCommand) Push(opts PushOpts) error {
|
|
cmdStr := "git push"
|
|
|
|
if opts.Force {
|
|
cmdStr += " --force-with-lease"
|
|
}
|
|
|
|
if opts.SetUpstream {
|
|
cmdStr += " --set-upstream"
|
|
}
|
|
|
|
if opts.UpstreamRemote != "" {
|
|
cmdStr += " " + c.OSCommand.Quote(opts.UpstreamRemote)
|
|
}
|
|
|
|
if opts.UpstreamBranch != "" {
|
|
if opts.UpstreamRemote == "" {
|
|
return errors.New(c.Tr.MustSpecifyOriginError)
|
|
}
|
|
cmdStr += " " + c.OSCommand.Quote(opts.UpstreamBranch)
|
|
}
|
|
|
|
cmdObj := c.NewCmdObj(cmdStr)
|
|
return c.DetectUnamePass(cmdObj, opts.PromptUserForCredential)
|
|
}
|
|
|
|
type FetchOptions struct {
|
|
PromptUserForCredential func(string) string
|
|
RemoteName string
|
|
BranchName string
|
|
}
|
|
|
|
// Fetch fetch git repo
|
|
func (c *GitCommand) Fetch(opts FetchOptions) error {
|
|
cmdStr := "git fetch"
|
|
|
|
if opts.RemoteName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, c.OSCommand.Quote(opts.RemoteName))
|
|
}
|
|
if opts.BranchName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, c.OSCommand.Quote(opts.BranchName))
|
|
}
|
|
|
|
cmdObj := c.NewCmdObj(cmdStr)
|
|
return c.DetectUnamePass(cmdObj, func(question string) string {
|
|
if opts.PromptUserForCredential != nil {
|
|
return opts.PromptUserForCredential(question)
|
|
}
|
|
return "\n"
|
|
})
|
|
}
|
|
|
|
type PullOptions struct {
|
|
PromptUserForCredential func(string) string
|
|
RemoteName string
|
|
BranchName string
|
|
FastForwardOnly bool
|
|
}
|
|
|
|
func (c *GitCommand) Pull(opts PullOptions) error {
|
|
if opts.PromptUserForCredential == nil {
|
|
return errors.New("PromptUserForCredential is required")
|
|
}
|
|
|
|
cmdStr := "git pull --no-edit"
|
|
|
|
if opts.FastForwardOnly {
|
|
cmdStr += " --ff-only"
|
|
}
|
|
|
|
if opts.RemoteName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, c.OSCommand.Quote(opts.RemoteName))
|
|
}
|
|
if opts.BranchName != "" {
|
|
cmdStr = fmt.Sprintf("%s %s", cmdStr, c.OSCommand.Quote(opts.BranchName))
|
|
}
|
|
|
|
// setting GIT_SEQUENCE_EDITOR to ':' as a way of skipping it, in case the user
|
|
// has 'pull.rebase = interactive' configured.
|
|
cmdObj := c.NewCmdObj(cmdStr).AddEnvVars("GIT_SEQUENCE_EDITOR=:")
|
|
return c.DetectUnamePass(cmdObj, opts.PromptUserForCredential)
|
|
}
|
|
|
|
func (c *GitCommand) FastForward(branchName string, remoteName string, remoteBranchName string, promptUserForCredential func(string) string) error {
|
|
cmdStr := fmt.Sprintf("git fetch %s %s:%s", c.OSCommand.Quote(remoteName), c.OSCommand.Quote(remoteBranchName), c.OSCommand.Quote(branchName))
|
|
cmdObj := c.NewCmdObj(cmdStr)
|
|
return c.DetectUnamePass(cmdObj, promptUserForCredential)
|
|
}
|
|
|
|
func (c *GitCommand) FetchRemote(remoteName string, promptUserForCredential func(string) string) error {
|
|
cmdStr := fmt.Sprintf("git fetch %s", c.OSCommand.Quote(remoteName))
|
|
cmdObj := c.NewCmdObj(cmdStr)
|
|
return c.DetectUnamePass(cmdObj, promptUserForCredential)
|
|
}
|