1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-02-03 13:21:56 +02:00

honour push.default matching config value

This commit is contained in:
Jesse Duffield 2022-03-27 11:22:16 +11:00
parent ae10a5ea88
commit 2b3d457aa4
54 changed files with 196 additions and 32 deletions

View File

@ -1,6 +1,7 @@
package controllers
import (
"errors"
"fmt"
"strings"
@ -74,13 +75,8 @@ func (self *SyncController) branchCheckedOut(f func(*models.Branch) error) func(
func (self *SyncController) push(currentBranch *models.Branch) error {
// if we have pullables we'll ask if the user wants to force push
if currentBranch.IsTrackingRemote() {
opts := pushOpts{
force: false,
upstreamRemote: currentBranch.UpstreamRemote,
upstreamBranch: currentBranch.UpstreamBranch,
}
opts := pushOpts{}
if currentBranch.HasCommitsToPull() {
opts.force = true
return self.requestToForcePush(opts)
} else {
return self.pushAux(opts)
@ -90,21 +86,15 @@ func (self *SyncController) push(currentBranch *models.Branch) error {
return self.pushAux(pushOpts{setUpstream: true})
} else {
return self.promptForUpstream(currentBranch, func(upstream string) error {
var upstreamBranch, upstreamRemote string
split := strings.Split(upstream, " ")
if len(split) == 2 {
upstreamRemote = split[0]
upstreamBranch = split[1]
} else {
upstreamRemote = upstream
upstreamBranch = ""
upstreamRemote, upstreamBranch, err := self.parseUpstream(upstream)
if err != nil {
return self.c.Error(err)
}
return self.pushAux(pushOpts{
force: false,
setUpstream: true,
upstreamRemote: upstreamRemote,
upstreamBranch: upstreamBranch,
setUpstream: true,
})
})
}
@ -117,27 +107,46 @@ func (self *SyncController) pull(currentBranch *models.Branch) error {
// if we have no upstream branch we need to set that first
if !currentBranch.IsTrackingRemote() {
return self.promptForUpstream(currentBranch, func(upstream string) error {
var upstreamBranch, upstreamRemote string
split := strings.Split(upstream, " ")
if len(split) != 2 {
return self.c.ErrorMsg(self.c.Tr.InvalidUpstream)
if err := self.setCurrentBranchUpstream(upstream); err != nil {
return self.c.Error(err)
}
upstreamRemote = split[0]
upstreamBranch = split[1]
if err := self.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 self.c.ErrorMsg(errorMessage)
}
return self.PullAux(PullFilesOptions{UpstreamRemote: upstreamRemote, UpstreamBranch: upstreamBranch, Action: action})
return self.PullAux(PullFilesOptions{Action: action})
})
}
return self.PullAux(PullFilesOptions{UpstreamRemote: currentBranch.UpstreamRemote, UpstreamBranch: currentBranch.UpstreamBranch, Action: action})
return self.PullAux(PullFilesOptions{Action: action})
}
func (self *SyncController) setCurrentBranchUpstream(upstream string) error {
upstreamRemote, upstreamBranch, err := self.parseUpstream(upstream)
if err != nil {
return err
}
if err := self.git.Branch.SetCurrentBranchUpstream(upstreamRemote, upstreamBranch); err != nil {
if strings.Contains(err.Error(), "does not exist") {
return fmt.Errorf(
"upstream branch %s/%s not found.\nIf you expect it to exist, you should fetch (with 'f').\nOtherwise, you should push (with 'shift+P')",
upstreamRemote, upstreamBranch,
)
}
return err
}
return nil
}
func (self *SyncController) parseUpstream(upstream string) (string, string, error) {
var upstreamBranch, upstreamRemote string
split := strings.Split(upstream, " ")
if len(split) != 2 {
return "", "", errors.New(self.c.Tr.InvalidUpstream)
}
upstreamRemote = split[0]
upstreamBranch = split[1]
return upstreamRemote, upstreamBranch, nil
}
func (self *SyncController) promptForUpstream(currentBranch *models.Branch, onConfirm func(string) error) error {
@ -229,6 +238,7 @@ func (self *SyncController) requestToForcePush(opts pushOpts) error {
Title: self.c.Tr.ForcePush,
Prompt: self.c.Tr.ForcePushPrompt,
HandleConfirm: func() error {
opts.force = true
return self.pushAux(opts)
},
})

View File

@ -0,0 +1 @@
myfile4

View File

@ -0,0 +1,2 @@
b82ed4a67bef9ef50807adf409f103ef7b0832ab branch 'master' of ../actual_remote
d3708eeec2b9d69acbe87862330e844e85f77de1 not-for-merge branch 'other_branch' of ../actual_remote

View File

@ -0,0 +1 @@
ref: refs/heads/master

View File

@ -0,0 +1 @@
d3708eeec2b9d69acbe87862330e844e85f77de1

View File

@ -0,0 +1,21 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
email = CI@example.com
name = CI
[push]
default = matching
[remote "origin"]
url = ../actual_remote
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "other_branch"]
remote = origin
merge = refs/heads/other_branch

View File

@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.

View File

@ -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

View File

@ -0,0 +1,10 @@
0000000000000000000000000000000000000000 16d8875e19987b16f1991a41fd3f4536d16f7cb4 CI <CI@example.com> 1648340487 +1100 commit (initial): myfile1
16d8875e19987b16f1991a41fd3f4536d16f7cb4 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 commit: myfile2
42d408cffcc087da21115f9ebc29e9765a2beb83 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 checkout: moving from master to other_branch
42d408cffcc087da21115f9ebc29e9765a2beb83 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 checkout: moving from other_branch to master
42d408cffcc087da21115f9ebc29e9765a2beb83 b82ed4a67bef9ef50807adf409f103ef7b0832ab CI <CI@example.com> 1648340487 +1100 commit: myfile3
b82ed4a67bef9ef50807adf409f103ef7b0832ab 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 reset: moving to HEAD^
42d408cffcc087da21115f9ebc29e9765a2beb83 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 checkout: moving from master to other_branch
42d408cffcc087da21115f9ebc29e9765a2beb83 d3708eeec2b9d69acbe87862330e844e85f77de1 CI <CI@example.com> 1648340487 +1100 commit: myfile4
d3708eeec2b9d69acbe87862330e844e85f77de1 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 reset: moving to HEAD^
42d408cffcc087da21115f9ebc29e9765a2beb83 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 checkout: moving from other_branch to master

View File

@ -0,0 +1,4 @@
0000000000000000000000000000000000000000 16d8875e19987b16f1991a41fd3f4536d16f7cb4 CI <CI@example.com> 1648340487 +1100 commit (initial): myfile1
16d8875e19987b16f1991a41fd3f4536d16f7cb4 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 commit: myfile2
42d408cffcc087da21115f9ebc29e9765a2beb83 b82ed4a67bef9ef50807adf409f103ef7b0832ab CI <CI@example.com> 1648340487 +1100 commit: myfile3
b82ed4a67bef9ef50807adf409f103ef7b0832ab 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 reset: moving to HEAD^

View File

@ -0,0 +1,3 @@
0000000000000000000000000000000000000000 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 branch: Created from HEAD
42d408cffcc087da21115f9ebc29e9765a2beb83 d3708eeec2b9d69acbe87862330e844e85f77de1 CI <CI@example.com> 1648340487 +1100 commit: myfile4
d3708eeec2b9d69acbe87862330e844e85f77de1 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 reset: moving to HEAD^

View File

@ -0,0 +1,3 @@
0000000000000000000000000000000000000000 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 fetch origin: storing head
42d408cffcc087da21115f9ebc29e9765a2beb83 b82ed4a67bef9ef50807adf409f103ef7b0832ab CI <CI@example.com> 1648340487 +1100 update by push
b82ed4a67bef9ef50807adf409f103ef7b0832ab 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340489 +1100 update by push

View File

@ -0,0 +1,3 @@
0000000000000000000000000000000000000000 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340487 +1100 fetch origin: storing head
42d408cffcc087da21115f9ebc29e9765a2beb83 d3708eeec2b9d69acbe87862330e844e85f77de1 CI <CI@example.com> 1648340487 +1100 update by push
d3708eeec2b9d69acbe87862330e844e85f77de1 42d408cffcc087da21115f9ebc29e9765a2beb83 CI <CI@example.com> 1648340489 +1100 update by push

View File

@ -0,0 +1,2 @@
x�ÍA
ƒ0@Ñ®sŠÙÊŒN'))¸òc2¡‚!")ØÛ×#tûyðc-ei@,—¶›šÄŒ*³XHÌFAR N){ž¹OÂYã½súiïºÃ8Ásœ^vhÙV»ÅZ áÐ3rðp%Btg='Íþä®|ó²¹3,Ó

View File

@ -0,0 +1,3 @@
x�ŽA
à E»öî ÅÑɨJ!«Cã Ä& ííëºû<þûüe¯um"^Úɬ“wiˆbJa–H‘)J&GÁk³‹@êH'¿ºH%?0Ä|’ !Hq‚ƒ£Ò‘_2ªônÏýÔÓ¬Çi~ð'ÕcãÛ²×{ßÀàÐ`ðú
`Œê´Ÿjüg]Õ¯¬[õŒá9·

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
test1

View File

@ -0,0 +1 @@
test2

View File

@ -0,0 +1 @@
ref: refs/heads/master

View File

@ -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/forcePushMultiple/./actual

View File

@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.

View File

@ -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

View File

@ -0,0 +1,2 @@
x�ÍA
ƒ0@Ñ®sŠÙÊŒN'))¸òc2¡‚!")ØÛ×#tûyðc-ei@,—¶›šÄŒ*³XHÌFAR N){ž¹OÂYã½súiïºÃ8Ásœ^vhÙV»ÅZ áÐ3rðp%Btg='Íþä®|ó²¹3,Ó

View File

@ -0,0 +1,3 @@
x�ŽA
à E»öî ÅÑɨJ!«Cã Ä& ííëºû<þûüe¯um"^Úɬ“wiˆbJa–H‘)J&GÁk³‹@êH'¿ºH%?0Ä|’ !Hq‚ƒ£Ò‘_2ªônÏýÔÓ¬Çi~ð'ÕcãÛ²×{ßÀàÐ`ðú
`Œê´Ÿjüg]Õ¯¬[õŒá9·

View File

@ -0,0 +1,3 @@
# pack-refs with: peeled fully-peeled sorted
42d408cffcc087da21115f9ebc29e9765a2beb83 refs/heads/master
42d408cffcc087da21115f9ebc29e9765a2beb83 refs/heads/other_branch

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
42d408cffcc087da21115f9ebc29e9765a2beb83

View File

@ -0,0 +1 @@
{"KeyEvents":[{"Timestamp":591,"Mod":0,"Key":256,"Ch":80},{"Timestamp":1207,"Mod":0,"Key":13,"Ch":13},{"Timestamp":1990,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":272,"Height":74}]}

View File

@ -0,0 +1,54 @@
#!/bin/sh
set -e
set -e
cd $1
git init
git config user.email "CI@example.com"
git config user.name "CI"
git config push.default matching
echo test1 > myfile1
git add .
git commit -am "myfile1"
echo test2 > myfile2
git add .
git commit -am "myfile2"
git checkout -b other_branch
git checkout master
cd ..
git clone --bare ./actual actual_remote
cd actual
git remote add origin ../actual_remote
git fetch origin
git branch --set-upstream-to=origin/master master
git branch --set-upstream-to=origin/other_branch other_branch
echo test3 > myfile3
git add .
git commit -am "myfile3"
git push origin master
git reset --hard HEAD^
git checkout other_branch
echo test4 > myfile4
git add .
git commit -am "myfile4"
git push origin other_branch
git reset --hard HEAD^
git checkout master
# at this point, both branches have diverged from their remote counterparts, meaning if you
# attempt to push either, it'll ask if you want to force push.

View File

@ -0,0 +1,4 @@
{
"description": "Force push to multiple branches because the user hasn't configured git to do otherwise",
"speed": 10
}