mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-29 23:17:32 +02:00
do dependency injection up front and in one place
This commit is contained in:
parent
2cb8aff940
commit
194ff1630c
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
gogit "github.com/jesseduffield/go-git/v5"
|
gogit "github.com/jesseduffield/go-git/v5"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/git_config"
|
"github.com/jesseduffield/lazygit/pkg/commands/git_config"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/patch"
|
"github.com/jesseduffield/lazygit/pkg/commands/patch"
|
||||||
"github.com/jesseduffield/lazygit/pkg/common"
|
"github.com/jesseduffield/lazygit/pkg/common"
|
||||||
@ -24,6 +25,17 @@ import (
|
|||||||
// and returns '264fc6f5' as the second match
|
// and returns '264fc6f5' as the second match
|
||||||
const CurrentBranchNameRegex = `(?m)^\*.*?([^ ]*?)\)?$`
|
const CurrentBranchNameRegex = `(?m)^\*.*?([^ ]*?)\)?$`
|
||||||
|
|
||||||
|
type Loaders struct {
|
||||||
|
Commits *loaders.CommitLoader
|
||||||
|
Branches *loaders.BranchLoader
|
||||||
|
Files *loaders.FileLoader
|
||||||
|
CommitFiles *loaders.CommitFileLoader
|
||||||
|
Remotes *loaders.RemoteLoader
|
||||||
|
ReflogCommits *loaders.ReflogCommitLoader
|
||||||
|
Stash *loaders.StashLoader
|
||||||
|
Tags *loaders.TagLoader
|
||||||
|
}
|
||||||
|
|
||||||
// GitCommand is our main git interface
|
// GitCommand is our main git interface
|
||||||
type GitCommand struct {
|
type GitCommand struct {
|
||||||
*common.Common
|
*common.Common
|
||||||
@ -33,6 +45,7 @@ type GitCommand struct {
|
|||||||
onSuccessfulContinue func() error
|
onSuccessfulContinue func() error
|
||||||
PatchManager *patch.PatchManager
|
PatchManager *patch.PatchManager
|
||||||
GitConfig git_config.IGitConfig
|
GitConfig git_config.IGitConfig
|
||||||
|
Loaders Loaders
|
||||||
|
|
||||||
// Push to current determines whether the user has configured to push to the remote branch of the same name as the current or not
|
// Push to current determines whether the user has configured to push to the remote branch of the same name as the current or not
|
||||||
PushToCurrent bool
|
PushToCurrent bool
|
||||||
@ -82,6 +95,17 @@ func NewGitCommand(
|
|||||||
Cmd: cmd,
|
Cmd: cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gitCommand.Loaders = Loaders{
|
||||||
|
Commits: loaders.NewCommitLoader(cmn, gitCommand),
|
||||||
|
Branches: loaders.NewBranchLoader(cmn, gitCommand),
|
||||||
|
Files: loaders.NewFileLoader(cmn, cmd, gitConfig),
|
||||||
|
CommitFiles: loaders.NewCommitFileLoader(cmn, cmd),
|
||||||
|
Remotes: loaders.NewRemoteLoader(cmn, cmd, gitCommand.Repo.Remotes),
|
||||||
|
ReflogCommits: loaders.NewReflogCommitLoader(cmn, cmd),
|
||||||
|
Stash: loaders.NewStashLoader(cmn, cmd),
|
||||||
|
Tags: loaders.NewTagLoader(cmn, cmd),
|
||||||
|
}
|
||||||
|
|
||||||
gitCommand.PatchManager = patch.NewPatchManager(gitCommand.Log, gitCommand.ApplyPatch, gitCommand.ShowFileDiff)
|
gitCommand.PatchManager = patch.NewPatchManager(gitCommand.Log, gitCommand.ApplyPatch, gitCommand.ShowFileDiff)
|
||||||
|
|
||||||
return gitCommand, nil
|
return gitCommand, nil
|
||||||
|
@ -25,7 +25,6 @@ type BranchLoader struct {
|
|||||||
*common.Common
|
*common.Common
|
||||||
getRawBranches func() (string, error)
|
getRawBranches func() (string, error)
|
||||||
getCurrentBranchName func() (string, string, error)
|
getCurrentBranchName func() (string, string, error)
|
||||||
reflogCommits []*models.Commit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type BranchLoaderGitCommand interface {
|
type BranchLoaderGitCommand interface {
|
||||||
@ -36,21 +35,19 @@ type BranchLoaderGitCommand interface {
|
|||||||
func NewBranchLoader(
|
func NewBranchLoader(
|
||||||
cmn *common.Common,
|
cmn *common.Common,
|
||||||
gitCommand BranchLoaderGitCommand,
|
gitCommand BranchLoaderGitCommand,
|
||||||
reflogCommits []*models.Commit,
|
|
||||||
) *BranchLoader {
|
) *BranchLoader {
|
||||||
return &BranchLoader{
|
return &BranchLoader{
|
||||||
Common: cmn,
|
Common: cmn,
|
||||||
getRawBranches: gitCommand.GetRawBranches,
|
getRawBranches: gitCommand.GetRawBranches,
|
||||||
getCurrentBranchName: gitCommand.CurrentBranchName,
|
getCurrentBranchName: gitCommand.CurrentBranchName,
|
||||||
reflogCommits: reflogCommits,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the list of branches for the current repo
|
// Load the list of branches for the current repo
|
||||||
func (self *BranchLoader) Load() []*models.Branch {
|
func (self *BranchLoader) Load(reflogCommits []*models.Commit) []*models.Branch {
|
||||||
branches := self.obtainBranches()
|
branches := self.obtainBranches()
|
||||||
|
|
||||||
reflogBranches := self.obtainReflogBranches()
|
reflogBranches := self.obtainReflogBranches(reflogCommits)
|
||||||
|
|
||||||
// loop through reflog branches. If there is a match, merge them, then remove it from the branches and keep it in the reflog branches
|
// loop through reflog branches. If there is a match, merge them, then remove it from the branches and keep it in the reflog branches
|
||||||
branchesWithRecency := make([]*models.Branch, 0)
|
branchesWithRecency := make([]*models.Branch, 0)
|
||||||
@ -154,11 +151,11 @@ func (self *BranchLoader) obtainBranches() []*models.Branch {
|
|||||||
|
|
||||||
// TODO: only look at the new reflog commits, and otherwise store the recencies in
|
// TODO: only look at the new reflog commits, and otherwise store the recencies in
|
||||||
// int form against the branch to recalculate the time ago
|
// int form against the branch to recalculate the time ago
|
||||||
func (self *BranchLoader) obtainReflogBranches() []*models.Branch {
|
func (self *BranchLoader) obtainReflogBranches(reflogCommits []*models.Commit) []*models.Branch {
|
||||||
foundBranchesMap := map[string]bool{}
|
foundBranchesMap := map[string]bool{}
|
||||||
re := regexp.MustCompile(`checkout: moving from ([\S]+) to ([\S]+)`)
|
re := regexp.MustCompile(`checkout: moving from ([\S]+) to ([\S]+)`)
|
||||||
reflogBranches := make([]*models.Branch, 0, len(self.reflogCommits))
|
reflogBranches := make([]*models.Branch, 0, len(reflogCommits))
|
||||||
for _, commit := range self.reflogCommits {
|
for _, commit := range reflogCommits {
|
||||||
if match := re.FindStringSubmatch(commit.Name); len(match) == 3 {
|
if match := re.FindStringSubmatch(commit.Name); len(match) == 3 {
|
||||||
recency := utils.UnixToTimeAgo(commit.UnixTimestamp)
|
recency := utils.UnixToTimeAgo(commit.UnixTimestamp)
|
||||||
for _, branchName := range match[1:] {
|
for _, branchName := range match[1:] {
|
||||||
|
@ -71,11 +71,11 @@ func (c *GitCommand) SubmoduleStash(submodule *models.SubmoduleConfig) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Cmd.New("git -C " + c.OSCommand.Quote(submodule.Path) + " stash --include-untracked").Run()
|
return c.Cmd.New("git -C " + c.Cmd.Quote(submodule.Path) + " stash --include-untracked").Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleReset(submodule *models.SubmoduleConfig) error {
|
func (c *GitCommand) SubmoduleReset(submodule *models.SubmoduleConfig) error {
|
||||||
return c.Cmd.New("git submodule update --init --force -- " + c.OSCommand.Quote(submodule.Path)).Run()
|
return c.Cmd.New("git submodule update --init --force -- " + c.Cmd.Quote(submodule.Path)).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleUpdateAll() error {
|
func (c *GitCommand) SubmoduleUpdateAll() error {
|
||||||
@ -86,13 +86,13 @@ func (c *GitCommand) SubmoduleUpdateAll() error {
|
|||||||
func (c *GitCommand) SubmoduleDelete(submodule *models.SubmoduleConfig) error {
|
func (c *GitCommand) SubmoduleDelete(submodule *models.SubmoduleConfig) error {
|
||||||
// based on https://gist.github.com/myusuf3/7f645819ded92bda6677
|
// based on https://gist.github.com/myusuf3/7f645819ded92bda6677
|
||||||
|
|
||||||
if err := c.Cmd.New("git submodule deinit --force -- " + c.OSCommand.Quote(submodule.Path)).Run(); err != nil {
|
if err := c.Cmd.New("git submodule deinit --force -- " + c.Cmd.Quote(submodule.Path)).Run(); err != nil {
|
||||||
if strings.Contains(err.Error(), "did not match any file(s) known to git") {
|
if strings.Contains(err.Error(), "did not match any file(s) known to git") {
|
||||||
if err := c.Cmd.New("git config --file .gitmodules --remove-section submodule." + c.OSCommand.Quote(submodule.Name)).Run(); err != nil {
|
if err := c.Cmd.New("git config --file .gitmodules --remove-section submodule." + c.Cmd.Quote(submodule.Name)).Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.Cmd.New("git config --remove-section submodule." + c.OSCommand.Quote(submodule.Name)).Run(); err != nil {
|
if err := c.Cmd.New("git config --remove-section submodule." + c.Cmd.Quote(submodule.Name)).Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,20 +115,20 @@ func (c *GitCommand) SubmoduleAdd(name string, path string, url string) error {
|
|||||||
New(
|
New(
|
||||||
fmt.Sprintf(
|
fmt.Sprintf(
|
||||||
"git submodule add --force --name %s -- %s %s ",
|
"git submodule add --force --name %s -- %s %s ",
|
||||||
c.OSCommand.Quote(name),
|
c.Cmd.Quote(name),
|
||||||
c.OSCommand.Quote(url),
|
c.Cmd.Quote(url),
|
||||||
c.OSCommand.Quote(path),
|
c.Cmd.Quote(path),
|
||||||
)).
|
)).
|
||||||
Run()
|
Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleUpdateUrl(name string, path string, newUrl string) error {
|
func (c *GitCommand) SubmoduleUpdateUrl(name string, path string, newUrl string) error {
|
||||||
// the set-url command is only for later git versions so we're doing it manually here
|
// the set-url command is only for later git versions so we're doing it manually here
|
||||||
if err := c.Cmd.New("git config --file .gitmodules submodule." + c.OSCommand.Quote(name) + ".url " + c.OSCommand.Quote(newUrl)).Run(); err != nil {
|
if err := c.Cmd.New("git config --file .gitmodules submodule." + c.Cmd.Quote(name) + ".url " + c.Cmd.Quote(newUrl)).Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.Cmd.New("git submodule sync -- " + c.OSCommand.Quote(path)).Run(); err != nil {
|
if err := c.Cmd.New("git submodule sync -- " + c.Cmd.Quote(path)).Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,11 +136,11 @@ func (c *GitCommand) SubmoduleUpdateUrl(name string, path string, newUrl string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleInit(path string) error {
|
func (c *GitCommand) SubmoduleInit(path string) error {
|
||||||
return c.Cmd.New("git submodule init -- " + c.OSCommand.Quote(path)).Run()
|
return c.Cmd.New("git submodule init -- " + c.Cmd.Quote(path)).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleUpdate(path string) error {
|
func (c *GitCommand) SubmoduleUpdate(path string) error {
|
||||||
return c.Cmd.New("git submodule update --init -- " + c.OSCommand.Quote(path)).Run()
|
return c.Cmd.New("git submodule update --init -- " + c.Cmd.Quote(path)).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GitCommand) SubmoduleBulkInitCmdObj() oscommands.ICmdObj {
|
func (c *GitCommand) SubmoduleBulkInitCmdObj() oscommands.ICmdObj {
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands"
|
"github.com/jesseduffield/lazygit/pkg/commands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
||||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||||
@ -56,18 +55,13 @@ func (gui *Gui) refreshBranches() {
|
|||||||
// which allows us to order them correctly. So if we're filtering we'll just
|
// which allows us to order them correctly. So if we're filtering we'll just
|
||||||
// manually load all the reflog commits here
|
// manually load all the reflog commits here
|
||||||
var err error
|
var err error
|
||||||
reflogCommits, _, err = loaders.NewReflogCommitLoader(gui.Common, gui.GitCommand.Cmd).GetReflogCommits(nil, "")
|
reflogCommits, _, err = gui.GitCommand.Loaders.ReflogCommits.GetReflogCommits(nil, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gui.Log.Error(err)
|
gui.Log.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loader := loaders.NewBranchLoader(
|
gui.State.Branches = gui.GitCommand.Loaders.Branches.Load(reflogCommits)
|
||||||
gui.Common,
|
|
||||||
gui.GitCommand,
|
|
||||||
reflogCommits,
|
|
||||||
)
|
|
||||||
gui.State.Branches = loader.Load()
|
|
||||||
|
|
||||||
if err := gui.postRefreshUpdate(gui.State.Contexts.Branches); err != nil {
|
if err := gui.postRefreshUpdate(gui.State.Contexts.Branches); err != nil {
|
||||||
gui.Log.Error(err)
|
gui.Log.Error(err)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package gui
|
package gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/patch"
|
"github.com/jesseduffield/lazygit/pkg/commands/patch"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/filetree"
|
"github.com/jesseduffield/lazygit/pkg/gui/filetree"
|
||||||
@ -106,7 +105,7 @@ func (gui *Gui) refreshCommitFilesView() error {
|
|||||||
to := gui.State.Panels.CommitFiles.refName
|
to := gui.State.Panels.CommitFiles.refName
|
||||||
from, reverse := gui.getFromAndReverseArgsForDiff(to)
|
from, reverse := gui.getFromAndReverseArgsForDiff(to)
|
||||||
|
|
||||||
files, err := loaders.NewCommitFileLoader(gui.Common, gui.GitCommand.Cmd).GetFilesInDiff(from, to, reverse)
|
files, err := gui.GitCommand.Loaders.CommitFiles.GetFilesInDiff(from, to, reverse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return gui.surfaceError(err)
|
return gui.surfaceError(err)
|
||||||
}
|
}
|
||||||
|
@ -119,9 +119,7 @@ func (gui *Gui) refreshCommitsWithLimit() error {
|
|||||||
gui.Mutexes.BranchCommitsMutex.Lock()
|
gui.Mutexes.BranchCommitsMutex.Lock()
|
||||||
defer gui.Mutexes.BranchCommitsMutex.Unlock()
|
defer gui.Mutexes.BranchCommitsMutex.Unlock()
|
||||||
|
|
||||||
loader := loaders.NewCommitLoader(gui.Common, gui.GitCommand)
|
commits, err := gui.GitCommand.Loaders.Commits.GetCommits(
|
||||||
|
|
||||||
commits, err := loader.GetCommits(
|
|
||||||
loaders.GetCommitsOptions{
|
loaders.GetCommitsOptions{
|
||||||
Limit: gui.State.Panels.Commits.LimitCommits,
|
Limit: gui.State.Panels.Commits.LimitCommits,
|
||||||
FilterPath: gui.State.Modes.Filtering.GetPath(),
|
FilterPath: gui.State.Modes.Filtering.GetPath(),
|
||||||
@ -142,9 +140,7 @@ func (gui *Gui) refreshRebaseCommits() error {
|
|||||||
gui.Mutexes.BranchCommitsMutex.Lock()
|
gui.Mutexes.BranchCommitsMutex.Lock()
|
||||||
defer gui.Mutexes.BranchCommitsMutex.Unlock()
|
defer gui.Mutexes.BranchCommitsMutex.Unlock()
|
||||||
|
|
||||||
loader := loaders.NewCommitLoader(gui.Common, gui.GitCommand)
|
updatedCommits, err := gui.GitCommand.Loaders.Commits.MergeRebasingCommits(gui.State.Commits)
|
||||||
|
|
||||||
updatedCommits, err := loader.MergeRebasingCommits(gui.State.Commits)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/style"
|
"github.com/jesseduffield/lazygit/pkg/gui/style"
|
||||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||||
@ -41,7 +40,7 @@ func (gui *Gui) remotesRenderToMain() error {
|
|||||||
func (gui *Gui) refreshRemotes() error {
|
func (gui *Gui) refreshRemotes() error {
|
||||||
prevSelectedRemote := gui.getSelectedRemote()
|
prevSelectedRemote := gui.getSelectedRemote()
|
||||||
|
|
||||||
remotes, err := loaders.NewRemoteLoader(gui.Common, gui.GitCommand.Cmd, gui.GitCommand.Repo.Remotes).GetRemotes()
|
remotes, err := gui.GitCommand.Loaders.Remotes.GetRemotes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return gui.surfaceError(err)
|
return gui.surfaceError(err)
|
||||||
}
|
}
|
||||||
|
@ -75,9 +75,7 @@ func (gui *Gui) handleViewSubCommitFiles() error {
|
|||||||
|
|
||||||
func (gui *Gui) switchToSubCommitsContext(refName string) error {
|
func (gui *Gui) switchToSubCommitsContext(refName string) error {
|
||||||
// need to populate my sub commits
|
// need to populate my sub commits
|
||||||
loader := loaders.NewCommitLoader(gui.Common, gui.GitCommand)
|
commits, err := gui.GitCommand.Loaders.Commits.GetCommits(
|
||||||
|
|
||||||
commits, err := loader.GetCommits(
|
|
||||||
loaders.GetCommitsOptions{
|
loaders.GetCommitsOptions{
|
||||||
Limit: gui.State.Panels.Commits.LimitCommits,
|
Limit: gui.State.Panels.Commits.LimitCommits,
|
||||||
FilterPath: gui.State.Modes.Filtering.GetPath(),
|
FilterPath: gui.State.Modes.Filtering.GetPath(),
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package gui
|
package gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
|
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||||
)
|
)
|
||||||
@ -40,7 +39,7 @@ func (gui *Gui) tagsRenderToMain() error {
|
|||||||
|
|
||||||
// this is a controller: it can't access tags directly. Or can it? It should be able to get but not set. But that's exactly what I'm doing here, setting it. but through a mutator which encapsulates the event.
|
// this is a controller: it can't access tags directly. Or can it? It should be able to get but not set. But that's exactly what I'm doing here, setting it. but through a mutator which encapsulates the event.
|
||||||
func (gui *Gui) refreshTags() error {
|
func (gui *Gui) refreshTags() error {
|
||||||
tags, err := loaders.NewTagLoader(gui.Common, gui.GitCommand.Cmd).GetTags()
|
tags, err := gui.GitCommand.Loaders.Tags.GetTags()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return gui.surfaceError(err)
|
return gui.surfaceError(err)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user