mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-07 07:19:57 +02:00
always specify upstream when pushing/pulling
This commit is contained in:
parent
8d8bdb948b
commit
1c84f77319
@ -136,7 +136,7 @@ func NewGitCommandAux(
|
||||
Tag: tagCommands,
|
||||
WorkingTree: workingTreeCommands,
|
||||
Loaders: Loaders{
|
||||
Branches: loaders.NewBranchLoader(cmn, branchCommands.GetRawBranches, branchCommands.CurrentBranchName),
|
||||
Branches: loaders.NewBranchLoader(cmn, branchCommands.GetRawBranches, branchCommands.CurrentBranchName, configCommands),
|
||||
CommitFiles: loaders.NewCommitFileLoader(cmn, cmd),
|
||||
Commits: loaders.NewCommitLoader(cmn, cmd, dotGitDir, branchCommands.CurrentBranchName, statusCommands.RebaseMode),
|
||||
Files: fileLoader,
|
||||
|
@ -108,13 +108,8 @@ func (self *BranchCommands) GetGraphCmdObj(branchName string) oscommands.ICmdObj
|
||||
return self.cmd.New(utils.ResolvePlaceholderString(branchLogCmdTemplate, templateValues)).DontLog()
|
||||
}
|
||||
|
||||
func (self *BranchCommands) SetCurrentBranchUpstream(upstream string) error {
|
||||
return self.cmd.New("git branch --set-upstream-to=" + self.cmd.Quote(upstream)).Run()
|
||||
}
|
||||
|
||||
func (self *BranchCommands) GetUpstream(branchName string) (string, error) {
|
||||
output, err := self.cmd.New(fmt.Sprintf("git rev-parse --abbrev-ref --symbolic-full-name %s@{u}", self.cmd.Quote(branchName))).DontLog().RunWithOutput()
|
||||
return strings.TrimSpace(output), err
|
||||
func (self *BranchCommands) SetCurrentBranchUpstream(remoteName string, remoteBranchName string) error {
|
||||
return self.cmd.New(fmt.Sprintf("git branch --set-upstream-to=%s/%s", self.cmd.Quote(remoteName), self.cmd.Quote(remoteBranchName))).Run()
|
||||
}
|
||||
|
||||
func (self *BranchCommands) SetUpstream(remoteName string, remoteBranchName string, branchName string) error {
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/jesseduffield/go-git/v5/config"
|
||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||
"github.com/jesseduffield/lazygit/pkg/common"
|
||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||
@ -20,27 +21,34 @@ import (
|
||||
// if we find out we need to use one of these functions in the git.go file, we
|
||||
// can just pull them out of here and put them there and then call them from in here
|
||||
|
||||
type BranchLoaderConfigCommands interface {
|
||||
Branches() (map[string]*config.Branch, error)
|
||||
}
|
||||
|
||||
// BranchLoader returns a list of Branch objects for the current repo
|
||||
type BranchLoader struct {
|
||||
*common.Common
|
||||
getRawBranches func() (string, error)
|
||||
getCurrentBranchName func() (string, string, error)
|
||||
config BranchLoaderConfigCommands
|
||||
}
|
||||
|
||||
func NewBranchLoader(
|
||||
cmn *common.Common,
|
||||
getRawBranches func() (string, error),
|
||||
getCurrentBranchName func() (string, string, error),
|
||||
config BranchLoaderConfigCommands,
|
||||
) *BranchLoader {
|
||||
return &BranchLoader{
|
||||
Common: cmn,
|
||||
getRawBranches: getRawBranches,
|
||||
getCurrentBranchName: getCurrentBranchName,
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
// Load the list of branches for the current repo
|
||||
func (self *BranchLoader) Load(reflogCommits []*models.Commit) []*models.Branch {
|
||||
func (self *BranchLoader) Load(reflogCommits []*models.Commit) ([]*models.Branch, error) {
|
||||
branches := self.obtainBranches()
|
||||
|
||||
reflogBranches := self.obtainReflogBranches(reflogCommits)
|
||||
@ -77,11 +85,25 @@ outer:
|
||||
if !foundHead {
|
||||
currentBranchName, currentBranchDisplayName, err := self.getCurrentBranchName()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
branches = append([]*models.Branch{{Name: currentBranchName, DisplayName: currentBranchDisplayName, Head: true, Recency: " *"}}, branches...)
|
||||
}
|
||||
return branches
|
||||
|
||||
configBranches, err := self.config.Branches()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, branch := range branches {
|
||||
match := configBranches[branch.Name]
|
||||
if match != nil {
|
||||
branch.UpstreamRemote = match.Remote
|
||||
branch.UpstreamBranch = match.Merge.Short()
|
||||
}
|
||||
}
|
||||
|
||||
return branches, nil
|
||||
}
|
||||
|
||||
func (self *BranchLoader) obtainBranches() []*models.Branch {
|
||||
@ -116,12 +138,13 @@ func (self *BranchLoader) obtainBranches() []*models.Branch {
|
||||
|
||||
upstreamName := split[2]
|
||||
if upstreamName == "" {
|
||||
// if we're here then it means we do not have a local version of the remote.
|
||||
// The branch might still be tracking a remote though, we just don't know
|
||||
// how many commits ahead/behind it is
|
||||
branches = append(branches, branch)
|
||||
continue
|
||||
}
|
||||
|
||||
branch.UpstreamName = upstreamName
|
||||
|
||||
track := split[3]
|
||||
re := regexp.MustCompile(`ahead (\d+)`)
|
||||
match := re.FindStringSubmatch(track)
|
||||
|
@ -5,12 +5,16 @@ package models
|
||||
type Branch struct {
|
||||
Name string
|
||||
// the displayname is something like '(HEAD detached at 123asdf)', whereas in that case the name would be '123asdf'
|
||||
DisplayName string
|
||||
Recency string
|
||||
Pushables string
|
||||
Pullables string
|
||||
UpstreamName string
|
||||
Head bool
|
||||
DisplayName string
|
||||
Recency string
|
||||
Pushables string
|
||||
Pullables string
|
||||
Head bool
|
||||
// if we have a named remote locally this will be the name of that remote e.g.
|
||||
// 'origin' or 'tiwood'. If we don't have the remote locally it'll look like
|
||||
// 'git@github.com:tiwood/lazygit.git'
|
||||
UpstreamRemote string
|
||||
UpstreamBranch string
|
||||
}
|
||||
|
||||
func (b *Branch) RefName() string {
|
||||
@ -25,22 +29,26 @@ func (b *Branch) Description() string {
|
||||
return b.RefName()
|
||||
}
|
||||
|
||||
// this method does not consider the case where the git config states that a branch is tracking the config.
|
||||
// The Pullables value here is based on whether or not we saw an upstream when doing `git branch`
|
||||
func (b *Branch) IsTrackingRemote() bool {
|
||||
return b.IsRealBranch() && b.Pullables != "?"
|
||||
return b.UpstreamRemote != ""
|
||||
}
|
||||
|
||||
// we know that the remote branch is not stored locally based on our pushable/pullable
|
||||
// count being question marks.
|
||||
func (b *Branch) RemoteBranchStoredLocally() bool {
|
||||
return b.IsTrackingRemote() && b.Pushables != "?" && b.Pullables != "?"
|
||||
}
|
||||
|
||||
func (b *Branch) MatchesUpstream() bool {
|
||||
return b.IsRealBranch() && b.Pushables == "0" && b.Pullables == "0"
|
||||
return b.RemoteBranchStoredLocally() && b.Pushables == "0" && b.Pullables == "0"
|
||||
}
|
||||
|
||||
func (b *Branch) HasCommitsToPush() bool {
|
||||
return b.IsRealBranch() && b.Pushables != "0"
|
||||
return b.RemoteBranchStoredLocally() && b.Pushables != "0"
|
||||
}
|
||||
|
||||
func (b *Branch) HasCommitsToPull() bool {
|
||||
return b.IsRealBranch() && b.Pullables != "0"
|
||||
return b.RemoteBranchStoredLocally() && b.Pullables != "0"
|
||||
}
|
||||
|
||||
// for when we're in a detached head state
|
||||
|
@ -60,7 +60,12 @@ func (gui *Gui) refreshBranches() {
|
||||
}
|
||||
}
|
||||
|
||||
gui.State.Branches = gui.Git.Loaders.Branches.Load(reflogCommits)
|
||||
branches, err := gui.Git.Loaders.Branches.Load(reflogCommits)
|
||||
if err != nil {
|
||||
_ = gui.surfaceError(err)
|
||||
}
|
||||
|
||||
gui.State.Branches = branches
|
||||
|
||||
if err := gui.postRefreshUpdate(gui.State.Contexts.Branches); err != nil {
|
||||
gui.Log.Error(err)
|
||||
@ -392,25 +397,19 @@ func (gui *Gui) handleFastForward() error {
|
||||
if !branch.IsTrackingRemote() {
|
||||
return gui.createErrorPanel(gui.Tr.FwdNoUpstream)
|
||||
}
|
||||
if !branch.RemoteBranchStoredLocally() {
|
||||
return gui.createErrorPanel(gui.Tr.FwdNoLocalUpstream)
|
||||
}
|
||||
if branch.HasCommitsToPush() {
|
||||
return gui.createErrorPanel(gui.Tr.FwdCommitsToPush)
|
||||
}
|
||||
|
||||
upstream, err := gui.Git.Branch.GetUpstream(branch.Name)
|
||||
if err != nil {
|
||||
return gui.surfaceError(err)
|
||||
}
|
||||
|
||||
action := gui.Tr.Actions.FastForwardBranch
|
||||
|
||||
split := strings.Split(upstream, "/")
|
||||
remoteName := split[0]
|
||||
remoteBranchName := strings.Join(split[1:], "/")
|
||||
|
||||
message := utils.ResolvePlaceholderString(
|
||||
gui.Tr.Fetching,
|
||||
map[string]string{
|
||||
"from": fmt.Sprintf("%s/%s", remoteName, remoteBranchName),
|
||||
"from": fmt.Sprintf("%s/%s", branch.UpstreamRemote, branch.UpstreamBranch),
|
||||
"to": branch.Name,
|
||||
},
|
||||
)
|
||||
@ -421,7 +420,7 @@ func (gui *Gui) handleFastForward() error {
|
||||
_ = gui.pullWithLock(PullFilesOptions{action: action, FastForwardOnly: true})
|
||||
} else {
|
||||
gui.logAction(action)
|
||||
err := gui.Git.Sync.FastForward(branch.Name, remoteName, remoteBranchName)
|
||||
err := gui.Git.Sync.FastForward(branch.Name, branch.UpstreamRemote, branch.UpstreamBranch)
|
||||
gui.handleCredentialsPopup(err)
|
||||
_ = gui.refreshSidePanels(refreshOptions{mode: ASYNC, scope: []RefreshableView{BRANCHES}})
|
||||
}
|
||||
|
@ -36,8 +36,8 @@ type askOpts struct {
|
||||
type promptOpts struct {
|
||||
title string
|
||||
initialContent string
|
||||
handleConfirm func(string) error
|
||||
findSuggestionsFunc func(string) []*types.Suggestion
|
||||
handleConfirm func(string) error
|
||||
}
|
||||
|
||||
func (gui *Gui) ask(opts askOpts) error {
|
||||
|
@ -44,8 +44,8 @@ func (gui *Gui) currentDiffTerminals() []string {
|
||||
branch := gui.getSelectedBranch()
|
||||
if branch != nil {
|
||||
names := []string{branch.ID()}
|
||||
if branch.UpstreamName != "" {
|
||||
names = append(names, branch.UpstreamName)
|
||||
if branch.IsTrackingRemote() {
|
||||
names = append(names, branch.ID()+"@{u}")
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
@ -655,42 +655,40 @@ func (gui *Gui) handlePullFiles() error {
|
||||
|
||||
// if we have no upstream branch we need to set that first
|
||||
if !currentBranch.IsTrackingRemote() {
|
||||
// see if we have this branch in our config with an upstream
|
||||
branches, err := gui.Git.Config.Branches()
|
||||
if err != nil {
|
||||
return gui.surfaceError(err)
|
||||
}
|
||||
for branchName, branch := range branches {
|
||||
if branchName == currentBranch.Name {
|
||||
return gui.pullFiles(PullFilesOptions{RemoteName: branch.Remote, BranchName: branch.Name, action: action})
|
||||
}
|
||||
}
|
||||
|
||||
suggestedRemote := getSuggestedRemote(gui.State.Remotes)
|
||||
|
||||
return gui.prompt(promptOpts{
|
||||
title: gui.Tr.EnterUpstream,
|
||||
initialContent: suggestedRemote + "/" + currentBranch.Name,
|
||||
findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc("/"),
|
||||
initialContent: suggestedRemote + " " + currentBranch.Name,
|
||||
findSuggestionsFunc: gui.getRemoteBranchesSuggestionsFunc(" "),
|
||||
handleConfirm: func(upstream string) error {
|
||||
if err := gui.Git.Branch.SetCurrentBranchUpstream(upstream); err != nil {
|
||||
var upstreamBranch, upstreamRemote string
|
||||
split := strings.Split(upstream, " ")
|
||||
if len(split) != 2 {
|
||||
return gui.createErrorPanel(gui.Tr.InvalidUpstream)
|
||||
}
|
||||
|
||||
upstreamRemote = split[0]
|
||||
upstreamBranch = split[1]
|
||||
|
||||
if err := gui.Git.Branch.SetCurrentBranchUpstream(upstreamRemote, upstreamBranch); err != nil {
|
||||
errorMessage := err.Error()
|
||||
if strings.Contains(errorMessage, "does not exist") {
|
||||
errorMessage = fmt.Sprintf("upstream branch %s not found.\nIf you expect it to exist, you should fetch (with 'f').\nOtherwise, you should push (with 'shift+P')", upstream)
|
||||
}
|
||||
return gui.createErrorPanel(errorMessage)
|
||||
}
|
||||
return gui.pullFiles(PullFilesOptions{action: action})
|
||||
return gui.pullFiles(PullFilesOptions{UpstreamRemote: upstreamRemote, UpstreamBranch: upstreamBranch, action: action})
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
return gui.pullFiles(PullFilesOptions{action: action})
|
||||
return gui.pullFiles(PullFilesOptions{UpstreamRemote: currentBranch.UpstreamRemote, UpstreamBranch: currentBranch.UpstreamBranch, action: action})
|
||||
}
|
||||
|
||||
type PullFilesOptions struct {
|
||||
RemoteName string
|
||||
BranchName string
|
||||
UpstreamRemote string
|
||||
UpstreamBranch string
|
||||
FastForwardOnly bool
|
||||
action string
|
||||
}
|
||||
@ -714,8 +712,8 @@ func (gui *Gui) pullWithLock(opts PullFilesOptions) error {
|
||||
|
||||
err := gui.Git.Sync.Pull(
|
||||
git_commands.PullOptions{
|
||||
RemoteName: opts.RemoteName,
|
||||
BranchName: opts.BranchName,
|
||||
RemoteName: opts.UpstreamRemote,
|
||||
BranchName: opts.UpstreamBranch,
|
||||
FastForwardOnly: opts.FastForwardOnly,
|
||||
},
|
||||
)
|
||||
@ -782,28 +780,18 @@ func (gui *Gui) pushFiles() error {
|
||||
}
|
||||
|
||||
if currentBranch.IsTrackingRemote() {
|
||||
opts := pushOpts{
|
||||
force: false,
|
||||
upstreamRemote: currentBranch.UpstreamRemote,
|
||||
upstreamBranch: currentBranch.UpstreamBranch,
|
||||
}
|
||||
if currentBranch.HasCommitsToPull() {
|
||||
return gui.requestToForcePush()
|
||||
opts.force = true
|
||||
return gui.requestToForcePush(opts)
|
||||
} else {
|
||||
return gui.push(pushOpts{})
|
||||
return gui.push(opts)
|
||||
}
|
||||
} else {
|
||||
// see if we have an upstream for this branch in our config
|
||||
upstreamRemote, upstreamBranch, err := gui.upstreamForBranchInConfig(currentBranch.Name)
|
||||
if err != nil {
|
||||
return gui.surfaceError(err)
|
||||
}
|
||||
|
||||
if upstreamBranch != "" {
|
||||
return gui.push(
|
||||
pushOpts{
|
||||
force: false,
|
||||
upstreamRemote: upstreamRemote,
|
||||
upstreamBranch: upstreamBranch,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
suggestedRemote := getSuggestedRemote(gui.State.Remotes)
|
||||
|
||||
if gui.Git.Config.GetPushToCurrent() {
|
||||
@ -850,7 +838,7 @@ func getSuggestedRemote(remotes []*models.Remote) string {
|
||||
return remotes[0].Name
|
||||
}
|
||||
|
||||
func (gui *Gui) requestToForcePush() error {
|
||||
func (gui *Gui) requestToForcePush(opts pushOpts) error {
|
||||
forcePushDisabled := gui.UserConfig.Git.DisableForcePushing
|
||||
if forcePushDisabled {
|
||||
return gui.createErrorPanel(gui.Tr.ForcePushDisabled)
|
||||
@ -860,26 +848,11 @@ func (gui *Gui) requestToForcePush() error {
|
||||
title: gui.Tr.ForcePush,
|
||||
prompt: gui.Tr.ForcePushPrompt,
|
||||
handleConfirm: func() error {
|
||||
return gui.push(pushOpts{force: true})
|
||||
return gui.push(opts)
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func (gui *Gui) upstreamForBranchInConfig(branchName string) (string, string, error) {
|
||||
branches, err := gui.Git.Config.Branches()
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
for configBranchName, configBranch := range branches {
|
||||
if configBranchName == branchName {
|
||||
return configBranch.Remote, configBranchName, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", "", nil
|
||||
}
|
||||
|
||||
func (gui *Gui) switchToMerge() error {
|
||||
file := gui.getSelectedFile()
|
||||
if file == nil {
|
||||
|
@ -43,7 +43,13 @@ func getBranchDisplayStrings(b *models.Branch, fullDescription bool, diffed bool
|
||||
|
||||
res := []string{recencyColor.Sprint(b.Recency), coloredName}
|
||||
if fullDescription {
|
||||
return append(res, style.FgYellow.Sprint(b.UpstreamName))
|
||||
return append(
|
||||
res,
|
||||
fmt.Sprintf("%s %s",
|
||||
style.FgYellow.Sprint(b.UpstreamRemote),
|
||||
style.FgYellow.Sprint(b.UpstreamBranch),
|
||||
),
|
||||
)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
@ -188,6 +188,7 @@ type TranslationSet struct {
|
||||
ConfirmRebase string
|
||||
ConfirmMerge string
|
||||
FwdNoUpstream string
|
||||
FwdNoLocalUpstream string
|
||||
FwdCommitsToPush string
|
||||
ErrorOccurred string
|
||||
NoRoom string
|
||||
@ -281,6 +282,7 @@ type TranslationSet struct {
|
||||
LcEnterFile string
|
||||
ExitLineByLineMode string
|
||||
EnterUpstream string
|
||||
InvalidUpstream string
|
||||
ReturnToRemotesList string
|
||||
LcAddNewRemote string
|
||||
LcNewRemoteName string
|
||||
@ -738,6 +740,7 @@ func EnglishTranslationSet() TranslationSet {
|
||||
ConfirmRebase: "Are you sure you want to rebase '{{.checkedOutBranch}}' onto '{{.selectedBranch}}'?",
|
||||
ConfirmMerge: "Are you sure you want to merge '{{.selectedBranch}}' into '{{.checkedOutBranch}}'?",
|
||||
FwdNoUpstream: "Cannot fast-forward a branch with no upstream",
|
||||
FwdNoLocalUpstream: "Cannot fast-forward a branch whose remote is not registered locally",
|
||||
FwdCommitsToPush: "Cannot fast-forward a branch with commits to push",
|
||||
ErrorOccurred: "An error occurred! Please create an issue at",
|
||||
NoRoom: "Not enough room",
|
||||
@ -831,6 +834,7 @@ func EnglishTranslationSet() TranslationSet {
|
||||
LcEnterFile: "enter file to add selected lines to the patch (or toggle directory collapsed)",
|
||||
ExitLineByLineMode: `exit line-by-line mode`,
|
||||
EnterUpstream: `Enter upstream as '<remote> <branchname>'`,
|
||||
InvalidUpstream: "Invalid upstream. Must be in the format '<remote> <branchname>'",
|
||||
ReturnToRemotesList: `Return to remotes list`,
|
||||
LcAddNewRemote: `add new remote`,
|
||||
LcNewRemoteName: `New remote name:`,
|
||||
|
Binary file not shown.
@ -0,0 +1 @@
|
||||
myfile4
|
@ -0,0 +1 @@
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5 branch 'master' of ../actual_remote
|
@ -0,0 +1 @@
|
||||
ref: refs/heads/master
|
@ -0,0 +1 @@
|
||||
c9fd61f40de25556977e063683d1de612f931ccb
|
@ -0,0 +1,16 @@
|
||||
[core]
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
bare = false
|
||||
logallrefupdates = true
|
||||
ignorecase = true
|
||||
precomposeunicode = true
|
||||
[user]
|
||||
email = CI@example.com
|
||||
name = CI
|
||||
[remote "origin"]
|
||||
url = ../actual_remote
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
[branch "master"]
|
||||
remote = origin
|
||||
merge = refs/heads/master
|
@ -0,0 +1 @@
|
||||
Unnamed repository; edit this file 'description' to name the repository.
|
BIN
test/integration/pullAndSetUpstream/expected/.git_keep/index
Normal file
BIN
test/integration/pullAndSetUpstream/expected/.git_keep/index
Normal file
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
# git ls-files --others --exclude-from=.git/info/exclude
|
||||
# Lines that start with '#' are comments.
|
||||
# For a project mostly in C, the following would be a good set of
|
||||
# exclude patterns (uncomment them if you want to use them):
|
||||
# *.[oa]
|
||||
# *~
|
||||
.DS_Store
|
@ -0,0 +1,7 @@
|
||||
0000000000000000000000000000000000000000 972fb9caab8b8536ae38687fec98304b76748b9d CI <CI@example.com> 1642217132 +1100 commit (initial): myfile1
|
||||
972fb9caab8b8536ae38687fec98304b76748b9d c9fd61f40de25556977e063683d1de612f931ccb CI <CI@example.com> 1642217132 +1100 commit: myfile2
|
||||
c9fd61f40de25556977e063683d1de612f931ccb 06d3929607b7519beb45ca67165a1f2b5c0e578b CI <CI@example.com> 1642217132 +1100 commit: myfile3
|
||||
06d3929607b7519beb45ca67165a1f2b5c0e578b 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217132 +1100 commit: myfile4
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5 c9fd61f40de25556977e063683d1de612f931ccb CI <CI@example.com> 1642217132 +1100 reset: moving to HEAD~2
|
||||
c9fd61f40de25556977e063683d1de612f931ccb 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217139 +1100 rebase -i (start): checkout 766e681a51daa75233c1c4ae8845be2c893577d5
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217139 +1100 rebase -i (finish): returning to refs/heads/master
|
@ -0,0 +1,6 @@
|
||||
0000000000000000000000000000000000000000 972fb9caab8b8536ae38687fec98304b76748b9d CI <CI@example.com> 1642217132 +1100 commit (initial): myfile1
|
||||
972fb9caab8b8536ae38687fec98304b76748b9d c9fd61f40de25556977e063683d1de612f931ccb CI <CI@example.com> 1642217132 +1100 commit: myfile2
|
||||
c9fd61f40de25556977e063683d1de612f931ccb 06d3929607b7519beb45ca67165a1f2b5c0e578b CI <CI@example.com> 1642217132 +1100 commit: myfile3
|
||||
06d3929607b7519beb45ca67165a1f2b5c0e578b 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217132 +1100 commit: myfile4
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5 c9fd61f40de25556977e063683d1de612f931ccb CI <CI@example.com> 1642217132 +1100 reset: moving to HEAD~2
|
||||
c9fd61f40de25556977e063683d1de612f931ccb 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217139 +1100 rebase -i (finish): refs/heads/master onto 766e681a51daa75233c1c4ae8845be2c893577d5
|
@ -0,0 +1 @@
|
||||
0000000000000000000000000000000000000000 766e681a51daa75233c1c4ae8845be2c893577d5 CI <CI@example.com> 1642217132 +1100 fetch origin: storing head
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5
|
@ -0,0 +1 @@
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5
|
1
test/integration/pullAndSetUpstream/expected/myfile1
Normal file
1
test/integration/pullAndSetUpstream/expected/myfile1
Normal file
@ -0,0 +1 @@
|
||||
test1
|
1
test/integration/pullAndSetUpstream/expected/myfile2
Normal file
1
test/integration/pullAndSetUpstream/expected/myfile2
Normal file
@ -0,0 +1 @@
|
||||
test2
|
1
test/integration/pullAndSetUpstream/expected/myfile3
Normal file
1
test/integration/pullAndSetUpstream/expected/myfile3
Normal file
@ -0,0 +1 @@
|
||||
test3
|
1
test/integration/pullAndSetUpstream/expected/myfile4
Normal file
1
test/integration/pullAndSetUpstream/expected/myfile4
Normal file
@ -0,0 +1 @@
|
||||
test4
|
1
test/integration/pullAndSetUpstream/expected_remote/HEAD
Normal file
1
test/integration/pullAndSetUpstream/expected_remote/HEAD
Normal file
@ -0,0 +1 @@
|
||||
ref: refs/heads/master
|
@ -0,0 +1,8 @@
|
||||
[core]
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
bare = true
|
||||
ignorecase = true
|
||||
precomposeunicode = true
|
||||
[remote "origin"]
|
||||
url = /Users/jesseduffieldduffield/go/src/github.com/jesseduffield/lazygit/test/integration/pullAndSetUpstream/./actual
|
@ -0,0 +1 @@
|
||||
Unnamed repository; edit this file 'description' to name the repository.
|
@ -0,0 +1,7 @@
|
||||
# git ls-files --others --exclude-from=.git/info/exclude
|
||||
# Lines that start with '#' are comments.
|
||||
# For a project mostly in C, the following would be a good set of
|
||||
# exclude patterns (uncomment them if you want to use them):
|
||||
# *.[oa]
|
||||
# *~
|
||||
.DS_Store
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
|
||||
# pack-refs with: peeled fully-peeled sorted
|
||||
766e681a51daa75233c1c4ae8845be2c893577d5 refs/heads/master
|
1
test/integration/pullAndSetUpstream/recording.json
Normal file
1
test/integration/pullAndSetUpstream/recording.json
Normal file
@ -0,0 +1 @@
|
||||
{"KeyEvents":[{"Timestamp":423,"Mod":0,"Key":256,"Ch":112},{"Timestamp":1032,"Mod":0,"Key":127,"Ch":127},{"Timestamp":1216,"Mod":0,"Key":127,"Ch":127},{"Timestamp":1376,"Mod":0,"Key":127,"Ch":127},{"Timestamp":1536,"Mod":0,"Key":127,"Ch":127},{"Timestamp":1687,"Mod":0,"Key":127,"Ch":127},{"Timestamp":1847,"Mod":0,"Key":127,"Ch":127},{"Timestamp":2016,"Mod":0,"Key":127,"Ch":127},{"Timestamp":2240,"Mod":0,"Key":13,"Ch":13},{"Timestamp":3044,"Mod":0,"Key":27,"Ch":0},{"Timestamp":3768,"Mod":0,"Key":256,"Ch":112},{"Timestamp":4184,"Mod":0,"Key":256,"Ch":97},{"Timestamp":4232,"Mod":0,"Key":256,"Ch":115},{"Timestamp":4288,"Mod":0,"Key":256,"Ch":100},{"Timestamp":4728,"Mod":0,"Key":13,"Ch":13},{"Timestamp":5488,"Mod":0,"Key":27,"Ch":0},{"Timestamp":5799,"Mod":0,"Key":256,"Ch":112},{"Timestamp":6273,"Mod":0,"Key":13,"Ch":13},{"Timestamp":7207,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]}
|
33
test/integration/pullAndSetUpstream/setup.sh
Normal file
33
test/integration/pullAndSetUpstream/setup.sh
Normal file
@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
cd $1
|
||||
|
||||
git init
|
||||
|
||||
git config user.email "CI@example.com"
|
||||
git config user.name "CI"
|
||||
|
||||
echo test1 > myfile1
|
||||
git add .
|
||||
git commit -am "myfile1"
|
||||
echo test2 > myfile2
|
||||
git add .
|
||||
git commit -am "myfile2"
|
||||
echo test3 > myfile3
|
||||
git add .
|
||||
git commit -am "myfile3"
|
||||
echo test4 > myfile4
|
||||
git add .
|
||||
git commit -am "myfile4"
|
||||
|
||||
cd ..
|
||||
git clone --bare ./actual actual_remote
|
||||
|
||||
cd actual
|
||||
|
||||
# the test is to ensure that we actually can pull these two commits back from the origin
|
||||
git reset --hard HEAD~2
|
||||
git remote add origin ../actual_remote
|
||||
git fetch origin
|
4
test/integration/pullAndSetUpstream/test.json
Normal file
4
test/integration/pullAndSetUpstream/test.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"description": "pull changes from the remote, setting upstream",
|
||||
"speed": 10
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user