Skip to content

Commit e8e5acf

Browse files
authored
Merge branch 'master' into fix/skip-recent-repositories
2 parents 96edb8a + 91d8c25 commit e8e5acf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+541
-257
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ Say you're on a feature branch that was itself branched off of the develop branc
194194

195195
### Undo
196196

197-
You can undo the last action by pressing 'z' and redo with `ctrl+z`. Here we drop a couple of commits and then undo the actions.
197+
You can undo the last action by pressing `z` and redo with `ctrl+z`. Here we drop a couple of commits and then undo the actions.
198198
Undo uses the reflog which is specific to commits and branches so we can't undo changes to the working tree or stash.
199199

200200
[More info](/docs/Undoing.md)

pkg/commands/git_commands/patch.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitId
259259
}
260260

261261
if stash {
262-
if err := self.stash.Apply(0); err != nil {
262+
if err := self.stash.Pop(0); err != nil {
263263
return err
264264
}
265265
}

pkg/commands/patch/patch_builder.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,5 @@ func (p *PatchBuilder) NewPatchRequired(from string, to string, reverse bool) bo
286286
}
287287

288288
func (p *PatchBuilder) AllFilesInPatch() []string {
289-
files := make([]string, 0, len(p.fileInfoMap))
290-
291-
for filename := range p.fileInfoMap {
292-
files = append(files, filename)
293-
}
294-
295-
return files
289+
return lo.Keys(p.fileInfoMap)
296290
}

pkg/gui/background.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ func (self *BackgroundRoutineMgr) startBackgroundFilesRefresh(refreshInterval in
9393
self.gui.waitForIntro.Wait()
9494

9595
self.goEvery(time.Second*time.Duration(refreshInterval), self.gui.stopChan, func() error {
96-
return self.gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}})
96+
self.gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.FILES}})
97+
return nil
9798
})
9899
}
99100

@@ -125,7 +126,7 @@ func (self *BackgroundRoutineMgr) goEvery(interval time.Duration, stop chan stru
125126
func (self *BackgroundRoutineMgr) backgroundFetch() (err error) {
126127
err = self.gui.git.Sync.FetchBackground()
127128

128-
_ = self.gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS}, Mode: types.SYNC})
129+
self.gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS}, Mode: types.SYNC})
129130

130131
if err == nil {
131132
err = self.gui.helpers.BranchesHelper.AutoForwardBranches()

pkg/gui/controllers/bisect_controller.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
175175
return err
176176
}
177177

178-
return self.c.Helpers().Bisect.PostBisectCommandRefresh()
178+
self.c.Helpers().Bisect.PostBisectCommandRefresh()
179+
return nil
179180
},
180181
DisabledReason: self.require(self.singleItemSelected())(),
181182
Key: 'b',
@@ -192,7 +193,8 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
192193
return err
193194
}
194195

195-
return self.c.Helpers().Bisect.PostBisectCommandRefresh()
196+
self.c.Helpers().Bisect.PostBisectCommandRefresh()
197+
return nil
196198
},
197199
DisabledReason: self.require(self.singleItemSelected())(),
198200
Key: 'g',
@@ -211,7 +213,8 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
211213
return err
212214
}
213215

214-
return self.c.Helpers().Bisect.PostBisectCommandRefresh()
216+
self.c.Helpers().Bisect.PostBisectCommandRefresh()
217+
return nil
215218
},
216219
})
217220
return nil
@@ -245,7 +248,8 @@ func (self *BisectController) showBisectCompleteMessage(candidateHashes []string
245248
return err
246249
}
247250

248-
return self.c.Helpers().Bisect.PostBisectCommandRefresh()
251+
self.c.Helpers().Bisect.PostBisectCommandRefresh()
252+
return nil
249253
},
250254
})
251255

@@ -270,20 +274,21 @@ func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool)
270274
}
271275

272276
func (self *BisectController) afterBisectMarkRefresh(selectCurrent bool, waitToReselect bool) error {
273-
selectFn := func() error {
277+
selectFn := func() {
274278
if selectCurrent {
275279
self.selectCurrentBisectCommit()
276280
}
277-
return nil
278281
}
279282

280283
if waitToReselect {
281-
return self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{}, Then: selectFn})
284+
self.c.Refresh(types.RefreshOptions{Mode: types.SYNC, Scope: []types.RefreshableView{}, Then: selectFn})
285+
return nil
282286
}
283287

284-
_ = selectFn()
288+
selectFn()
285289

286-
return self.c.Helpers().Bisect.PostBisectCommandRefresh()
290+
self.c.Helpers().Bisect.PostBisectCommandRefresh()
291+
return nil
287292
}
288293

289294
func (self *BisectController) selectCurrentBisectCommit() {

pkg/gui/controllers/branches_controller.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,13 @@ func (self *BranchesController) viewUpstreamOptions(selectedBranch *models.Branc
263263
if err := self.c.Git().Branch.UnsetUpstream(selectedBranch.Name); err != nil {
264264
return err
265265
}
266-
if err := self.c.Refresh(types.RefreshOptions{
266+
self.c.Refresh(types.RefreshOptions{
267267
Mode: types.SYNC,
268268
Scope: []types.RefreshableView{
269269
types.BRANCHES,
270270
types.COMMITS,
271271
},
272-
}); err != nil {
273-
return err
274-
}
272+
})
275273
return nil
276274
},
277275
Key: 'u',
@@ -289,15 +287,13 @@ func (self *BranchesController) viewUpstreamOptions(selectedBranch *models.Branc
289287
if err := self.c.Git().Branch.SetUpstream(upstreamRemote, upstreamBranch, selectedBranch.Name); err != nil {
290288
return err
291289
}
292-
if err := self.c.Refresh(types.RefreshOptions{
290+
self.c.Refresh(types.RefreshOptions{
293291
Mode: types.SYNC,
294292
Scope: []types.RefreshableView{
295293
types.BRANCHES,
296294
types.COMMITS,
297295
},
298-
}); err != nil {
299-
return err
300-
}
296+
})
301297
return nil
302298
})
303299
},
@@ -478,7 +474,8 @@ func (self *BranchesController) forceCheckout() error {
478474
if err := self.c.Git().Branch.Checkout(branch.Name, git_commands.CheckoutOptions{Force: true}); err != nil {
479475
return err
480476
}
481-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
477+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
478+
return nil
482479
},
483480
})
484481

@@ -526,7 +523,8 @@ func (self *BranchesController) createNewBranchWithName(newBranchName string) er
526523
}
527524

528525
self.context().SetSelection(0)
529-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, KeepBranchSelectionIndex: true})
526+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, KeepBranchSelectionIndex: true})
527+
return nil
530528
}
531529

532530
func (self *BranchesController) localDelete(branches []*models.Branch) error {
@@ -655,7 +653,7 @@ func (self *BranchesController) fastForward(branch *models.Branch) error {
655653
WorktreePath: worktreePath,
656654
},
657655
)
658-
_ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
656+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
659657
return err
660658
}
661659

@@ -664,7 +662,7 @@ func (self *BranchesController) fastForward(branch *models.Branch) error {
664662
err := self.c.Git().Sync.FastForward(
665663
task, branch.Name, branch.UpstreamRemote, branch.UpstreamBranch,
666664
)
667-
_ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
665+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
668666
return err
669667
})
670668
}
@@ -679,7 +677,8 @@ func (self *BranchesController) createSortMenu() error {
679677
self.c.GetAppState().LocalBranchSortOrder = sortOrder
680678
self.c.SaveAppStateAndLogError()
681679
self.c.Contexts().Branches.SetSelection(0)
682-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
680+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
681+
return nil
683682
}
684683
return nil
685684
},
@@ -702,7 +701,7 @@ func (self *BranchesController) rename(branch *models.Branch) error {
702701
}
703702

704703
// need to find where the branch is now so that we can re-select it. That means we need to refetch the branches synchronously and then find our branch
705-
_ = self.c.Refresh(types.RefreshOptions{
704+
self.c.Refresh(types.RefreshOptions{
706705
Mode: types.SYNC,
707706
Scope: []types.RefreshableView{types.BRANCHES, types.WORKTREES},
708707
})

pkg/gui/controllers/commits_files_controller.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,8 @@ func (self *CommitFilesController) checkout(node *filetree.CommitFileNode) error
289289
return err
290290
}
291291

292-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
292+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
293+
return nil
293294
}
294295

295296
func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileNode) error {
@@ -313,19 +314,13 @@ func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileN
313314
// Reset the current patch if there is one.
314315
if self.c.Git().Patch.PatchBuilder.Active() {
315316
self.c.Git().Patch.PatchBuilder.Reset()
316-
if err := self.c.Refresh(types.RefreshOptions{Mode: types.BLOCK_UI}); err != nil {
317-
return err
318-
}
319317
}
320318

321319
for _, node := range selectedNodes {
322-
err := node.ForEachFile(func(file *models.CommitFile) error {
320+
_ = node.ForEachFile(func(file *models.CommitFile) error {
323321
filePaths = append(filePaths, file.GetPath())
324322
return nil
325323
})
326-
if err != nil {
327-
return err
328-
}
329324
}
330325

331326
err := self.c.Git().Rebase.DiscardOldFileChanges(self.c.Model().Commits, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), filePaths)
@@ -336,7 +331,8 @@ func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileN
336331
if self.context().RangeSelectEnabled() {
337332
self.context().GetList().CancelRangeSelect()
338333
}
339-
return self.c.Refresh(types.RefreshOptions{Mode: types.SYNC})
334+
335+
return nil
340336
})
341337
},
342338
})

pkg/gui/controllers/context_lines_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ func (self *ContextLinesController) applyChange() error {
103103
switch currentContext.GetKey() {
104104
// we make an exception for our staging and patch building contexts because they actually need to refresh their state afterwards.
105105
case context.PATCH_BUILDING_MAIN_CONTEXT_KEY:
106-
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.PATCH_BUILDING}})
106+
self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.PATCH_BUILDING}})
107107
case context.STAGING_MAIN_CONTEXT_KEY, context.STAGING_SECONDARY_CONTEXT_KEY:
108-
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}})
108+
self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}})
109109
default:
110110
currentContext.HandleRenderToMain()
111-
return nil
112111
}
112+
return nil
113113
}
114114

115115
func (self *ContextLinesController) checkCanChangeContext() error {

pkg/gui/controllers/custom_patch_options_menu_action.go

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import (
44
"errors"
55
"fmt"
66

7+
"github.com/jesseduffield/generics/set"
78
"github.com/jesseduffield/gocui"
9+
"github.com/jesseduffield/lazygit/pkg/commands/models"
810
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
911
"github.com/jesseduffield/lazygit/pkg/gui/types"
1012
"github.com/jesseduffield/lazygit/pkg/utils"
13+
"github.com/samber/lo"
1114
)
1215

1316
type CustomPatchOptionsMenuAction struct {
@@ -267,15 +270,42 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommitBefore() e
267270
func (self *CustomPatchOptionsMenuAction) handleApplyPatch(reverse bool) error {
268271
self.returnFocusFromPatchExplorerIfNecessary()
269272

270-
action := self.c.Tr.Actions.ApplyPatch
271-
if reverse {
272-
action = "Apply patch in reverse"
273+
affectedUnstagedFiles := self.getAffectedUnstagedFiles()
274+
275+
apply := func() error {
276+
action := self.c.Tr.Actions.ApplyPatch
277+
if reverse {
278+
action = "Apply patch in reverse"
279+
}
280+
self.c.LogAction(action)
281+
282+
if len(affectedUnstagedFiles) > 0 {
283+
if err := self.c.Git().WorkingTree.StageFiles(affectedUnstagedFiles, nil); err != nil {
284+
return err
285+
}
286+
}
287+
288+
if err := self.c.Git().Patch.ApplyCustomPatch(reverse, true); err != nil {
289+
return err
290+
}
291+
292+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
293+
return nil
273294
}
274-
self.c.LogAction(action)
275-
if err := self.c.Git().Patch.ApplyCustomPatch(reverse, true); err != nil {
276-
return err
295+
296+
if len(affectedUnstagedFiles) > 0 {
297+
self.c.Confirm(types.ConfirmOpts{
298+
Title: self.c.Tr.MustStageFilesAffectedByPatchTitle,
299+
Prompt: self.c.Tr.MustStageFilesAffectedByPatchWarning,
300+
HandleConfirm: func() error {
301+
return apply()
302+
},
303+
})
304+
305+
return nil
277306
}
278-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
307+
308+
return apply()
279309
}
280310

281311
func (self *CustomPatchOptionsMenuAction) copyPatchToClipboard() error {
@@ -290,3 +320,17 @@ func (self *CustomPatchOptionsMenuAction) copyPatchToClipboard() error {
290320

291321
return nil
292322
}
323+
324+
// Returns a list of files that have unstaged changes and are contained in the patch.
325+
func (self *CustomPatchOptionsMenuAction) getAffectedUnstagedFiles() []string {
326+
unstagedFiles := set.NewFromSlice(lo.FilterMap(self.c.Model().Files, func(f *models.File, _ int) (string, bool) {
327+
if f.GetHasUnstagedChanges() {
328+
return f.GetPath(), true
329+
}
330+
return "", false
331+
}))
332+
333+
return lo.Filter(self.c.Git().Patch.PatchBuilder.AllFilesInPatch(), func(patchFile string, _ int) bool {
334+
return unstagedFiles.Includes(patchFile)
335+
})
336+
}

pkg/gui/controllers/diffing_menu_action.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ func (self *DiffingMenuAction) Call() error {
2323
OnPress: func() error {
2424
self.c.Modes().Diffing.Ref = name
2525
// can scope this down based on current view but too lazy right now
26-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
26+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
27+
return nil
2728
},
2829
},
2930
}...)
@@ -38,7 +39,8 @@ func (self *DiffingMenuAction) Call() error {
3839
FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRefsSuggestionsFunc(),
3940
HandleConfirm: func(response string) error {
4041
self.c.Modes().Diffing.Ref = strings.TrimSpace(response)
41-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
42+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
43+
return nil
4244
},
4345
})
4446

@@ -53,14 +55,16 @@ func (self *DiffingMenuAction) Call() error {
5355
Label: self.c.Tr.SwapDiff,
5456
OnPress: func() error {
5557
self.c.Modes().Diffing.Reverse = !self.c.Modes().Diffing.Reverse
56-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
58+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
59+
return nil
5760
},
5861
},
5962
{
6063
Label: self.c.Tr.ExitDiffMode,
6164
OnPress: func() error {
6265
self.c.Modes().Diffing = diffing.New()
63-
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
66+
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
67+
return nil
6468
},
6569
},
6670
}...)

0 commit comments

Comments
 (0)