mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-14 11:23:09 +02:00
7b302d8c29
Afero is a package that lets you mock out a filesystem with an in-memory filesystem. It allows us to easily create the files required for a given test without worrying about a cleanup step or different tests tripping on eachother when run in parallel. Later on I'll standardise on using afero over the vanilla os package
187 lines
5.0 KiB
Go
187 lines
5.0 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/go-errors/errors"
|
|
gogit "github.com/jesseduffield/go-git/v5"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/git_config"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/patch"
|
|
"github.com/jesseduffield/lazygit/pkg/common"
|
|
"github.com/jesseduffield/lazygit/pkg/config"
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
"github.com/spf13/afero"
|
|
)
|
|
|
|
type commonDeps struct {
|
|
runner *oscommands.FakeCmdObjRunner
|
|
userConfig *config.UserConfig
|
|
gitVersion *GitVersion
|
|
gitConfig *git_config.FakeGitConfig
|
|
getenv func(string) string
|
|
removeFile func(string) error
|
|
common *common.Common
|
|
cmd *oscommands.CmdObjBuilder
|
|
fs afero.Fs
|
|
repoPaths *RepoPaths
|
|
}
|
|
|
|
func buildGitCommon(deps commonDeps) *GitCommon {
|
|
gitCommon := &GitCommon{}
|
|
|
|
gitCommon.Common = deps.common
|
|
if gitCommon.Common == nil {
|
|
gitCommon.Common = utils.NewDummyCommonWithUserConfig(deps.userConfig)
|
|
}
|
|
|
|
if deps.fs != nil {
|
|
gitCommon.Fs = deps.fs
|
|
}
|
|
|
|
if deps.repoPaths != nil {
|
|
gitCommon.repoPaths = deps.repoPaths
|
|
} else {
|
|
gitCommon.repoPaths = MockRepoPaths(".git")
|
|
}
|
|
|
|
runner := deps.runner
|
|
if runner == nil {
|
|
runner = oscommands.NewFakeRunner(nil)
|
|
}
|
|
|
|
cmd := deps.cmd
|
|
// gotta check deps.cmd because it's not an interface type and an interface value of nil is not considered to be nil
|
|
if cmd == nil {
|
|
cmd = oscommands.NewDummyCmdObjBuilder(runner)
|
|
}
|
|
gitCommon.cmd = cmd
|
|
|
|
gitCommon.Common.UserConfig = deps.userConfig
|
|
if gitCommon.Common.UserConfig == nil {
|
|
gitCommon.Common.UserConfig = config.GetDefaultConfig()
|
|
}
|
|
|
|
gitCommon.version = deps.gitVersion
|
|
if gitCommon.version == nil {
|
|
gitCommon.version = &GitVersion{2, 0, 0, ""}
|
|
}
|
|
|
|
gitConfig := deps.gitConfig
|
|
if gitConfig == nil {
|
|
gitConfig = git_config.NewFakeGitConfig(nil)
|
|
}
|
|
|
|
gitCommon.repo = buildRepo()
|
|
gitCommon.config = NewConfigCommands(gitCommon.Common, gitConfig, gitCommon.repo)
|
|
|
|
getenv := deps.getenv
|
|
if getenv == nil {
|
|
getenv = func(string) string { return "" }
|
|
}
|
|
|
|
removeFile := deps.removeFile
|
|
if removeFile == nil {
|
|
removeFile = func(string) error { return errors.New("unexpected call to removeFile") }
|
|
}
|
|
|
|
gitCommon.os = oscommands.NewDummyOSCommandWithDeps(oscommands.OSCommandDeps{
|
|
Common: gitCommon.Common,
|
|
GetenvFn: getenv,
|
|
Cmd: cmd,
|
|
RemoveFileFn: removeFile,
|
|
TempDir: os.TempDir(),
|
|
})
|
|
|
|
return gitCommon
|
|
}
|
|
|
|
func buildRepo() *gogit.Repository {
|
|
// TODO: think of a way to actually mock this out
|
|
var repo *gogit.Repository = nil
|
|
return repo
|
|
}
|
|
|
|
func buildFileLoader(gitCommon *GitCommon) *FileLoader {
|
|
return NewFileLoader(gitCommon, gitCommon.cmd, gitCommon.config)
|
|
}
|
|
|
|
func buildSubmoduleCommands(deps commonDeps) *SubmoduleCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewSubmoduleCommands(gitCommon)
|
|
}
|
|
|
|
func buildCommitCommands(deps commonDeps) *CommitCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
return NewCommitCommands(gitCommon)
|
|
}
|
|
|
|
func buildWorkingTreeCommands(deps commonDeps) *WorkingTreeCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
submoduleCommands := buildSubmoduleCommands(deps)
|
|
fileLoader := buildFileLoader(gitCommon)
|
|
|
|
return NewWorkingTreeCommands(gitCommon, submoduleCommands, fileLoader)
|
|
}
|
|
|
|
func buildPatchCommands(deps commonDeps) *PatchCommands { //nolint:golint,unused
|
|
gitCommon := buildGitCommon(deps)
|
|
rebaseCommands := buildRebaseCommands(deps)
|
|
commitCommands := buildCommitCommands(deps)
|
|
statusCommands := buildStatusCommands(deps)
|
|
stashCommands := buildStashCommands(deps)
|
|
loadFileFn := func(from string, to string, reverse bool, filename string, plain bool) (string, error) {
|
|
return "", nil
|
|
}
|
|
patchBuilder := patch.NewPatchBuilder(gitCommon.Log, loadFileFn)
|
|
|
|
return NewPatchCommands(gitCommon, rebaseCommands, commitCommands, statusCommands, stashCommands, patchBuilder)
|
|
}
|
|
|
|
func buildStatusCommands(deps commonDeps) *StatusCommands { //nolint:golint,unused
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewStatusCommands(gitCommon)
|
|
}
|
|
|
|
func buildStashCommands(deps commonDeps) *StashCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
fileLoader := buildFileLoader(gitCommon)
|
|
workingTreeCommands := buildWorkingTreeCommands(deps)
|
|
|
|
return NewStashCommands(gitCommon, fileLoader, workingTreeCommands)
|
|
}
|
|
|
|
func buildRebaseCommands(deps commonDeps) *RebaseCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
workingTreeCommands := buildWorkingTreeCommands(deps)
|
|
commitCommands := buildCommitCommands(deps)
|
|
|
|
return NewRebaseCommands(gitCommon, commitCommands, workingTreeCommands)
|
|
}
|
|
|
|
func buildSyncCommands(deps commonDeps) *SyncCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewSyncCommands(gitCommon)
|
|
}
|
|
|
|
func buildFileCommands(deps commonDeps) *FileCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewFileCommands(gitCommon)
|
|
}
|
|
|
|
func buildBranchCommands(deps commonDeps) *BranchCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewBranchCommands(gitCommon)
|
|
}
|
|
|
|
func buildFlowCommands(deps commonDeps) *FlowCommands {
|
|
gitCommon := buildGitCommon(deps)
|
|
|
|
return NewFlowCommands(gitCommon)
|
|
}
|