mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2024-12-28 04:19:41 -08:00
feat(git): display when in bare repo
This commit is contained in:
parent
5574ce374a
commit
e45cd7ea17
|
@ -110,6 +110,7 @@ type Git struct {
|
|||
WorktreeCount int
|
||||
IsWorkTree bool
|
||||
RepoName string
|
||||
IsBare bool
|
||||
}
|
||||
|
||||
func (g *Git) Template() string {
|
||||
|
@ -122,6 +123,17 @@ func (g *Git) Enabled() bool {
|
|||
}
|
||||
|
||||
g.RepoName = environment.Base(g.env, g.convertToLinuxPath(g.realDir))
|
||||
|
||||
if g.IsBare {
|
||||
head := g.FileContents(g.workingDir, "HEAD")
|
||||
branchIcon := g.props.GetString(BranchIcon, "\uE0A0")
|
||||
g.Ref = strings.Replace(head, "ref: refs/heads/", "", 1)
|
||||
g.HEAD = fmt.Sprintf("%s%s", branchIcon, g.Ref)
|
||||
g.Working = &GitStatus{}
|
||||
g.Staging = &GitStatus{}
|
||||
return true
|
||||
}
|
||||
|
||||
if g.props.GetBool(FetchWorktreeCount, false) {
|
||||
g.WorktreeCount = g.getWorktreeContext()
|
||||
}
|
||||
|
@ -170,6 +182,13 @@ func (g *Git) shouldDisplay() bool {
|
|||
|
||||
gitdir, err := g.env.HasParentFilePath(".git")
|
||||
if err != nil {
|
||||
g.realDir = g.env.Pwd()
|
||||
bare := g.getGitCommandOutput("rev-parse", "--is-bare-repository")
|
||||
if bare == "true" {
|
||||
g.IsBare = true
|
||||
g.workingDir = g.realDir
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package segments
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"oh-my-posh/environment"
|
||||
"oh-my-posh/mock"
|
||||
|
@ -144,6 +145,47 @@ func TestEnabledInWorktree(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestEnabledInBareRepo(t *testing.T) {
|
||||
cases := []struct {
|
||||
Case string
|
||||
HEAD string
|
||||
IsBare string
|
||||
ExpectedEnabled bool
|
||||
ExpectedHEAD string
|
||||
}{
|
||||
{
|
||||
Case: "Bare repo on main",
|
||||
IsBare: "true",
|
||||
HEAD: "ref: refs/heads/main",
|
||||
ExpectedEnabled: true,
|
||||
ExpectedHEAD: "main",
|
||||
},
|
||||
{
|
||||
Case: "Not a bare repo",
|
||||
IsBare: "false",
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
pwd := "/home/user/bare.git"
|
||||
env := new(mock.MockedEnvironment)
|
||||
env.On("InWSLSharedDrive").Return(false)
|
||||
env.On("GOOS").Return("")
|
||||
env.On("HasCommand", "git").Return(true)
|
||||
env.On("HasParentFilePath", ".git").Return(&environment.FileInfo{}, errors.New("nope"))
|
||||
env.MockGitCommand(pwd, tc.IsBare, "rev-parse", "--is-bare-repository")
|
||||
env.On("Pwd").Return(pwd)
|
||||
env.On("FileContent", "/home/user/bare.git/HEAD").Return(tc.HEAD)
|
||||
g := &Git{
|
||||
scm: scm{
|
||||
env: env,
|
||||
props: properties.Map{},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, g.Enabled(), tc.ExpectedEnabled, tc.Case)
|
||||
assert.Equal(t, g.Ref, tc.ExpectedHEAD, tc.Case)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetGitOutputForCommand(t *testing.T) {
|
||||
args := []string{"-C", "", "--no-optional-locks", "-c", "core.quotepath=false", "-c", "color.status=false"}
|
||||
commandArgs := []string{"symbolic-ref", "--short", "HEAD"}
|
||||
|
|
|
@ -30,6 +30,7 @@ You can then use the `POSH_GIT_STRING` environment variable in a [text segment][
|
|||
```json
|
||||
"template": "{{ if .Env.POSH_GIT_STRING }} {{ .Env.POSH_GIT_STRING }} {{ end }}"
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Sample Configuration
|
||||
|
@ -66,15 +67,15 @@ You can then use the `POSH_GIT_STRING` environment variable in a [text segment][
|
|||
As doing multiple git calls can slow down the prompt experience, we do not fetch information by default.
|
||||
You can set the following properties to `true` to enable fetching additional information (and populate the template).
|
||||
|
||||
| Name | Type | Description |
|
||||
| ---------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `fetch_status` | `boolean` | fetch the local changes - defaults to `false` |
|
||||
| `fetch_stash_count` | `boolean` | fetch stash count - defaults to `false` |
|
||||
| `fetch_worktree_count` | `boolean` | fetch worktree count - defaults to `false` |
|
||||
| `fetch_upstream_icon` | `boolean` | fetch upstream icon - defaults to `false` |
|
||||
| Name | Type | Description |
|
||||
| ---------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `fetch_status` | `boolean` | fetch the local changes - defaults to `false` |
|
||||
| `fetch_stash_count` | `boolean` | fetch stash count - defaults to `false` |
|
||||
| `fetch_worktree_count` | `boolean` | fetch worktree count - defaults to `false` |
|
||||
| `fetch_upstream_icon` | `boolean` | fetch upstream icon - defaults to `false` |
|
||||
| `untracked_modes` | `map[string]string` | map of repo's where to override the default [untracked files mode][untracked]:<ul><li>`no`</li><li>`normal`</li><li>`all`</li></ul>For example `"untracked_modes": { "/Users/me/repos/repo1": "no" }` - defaults to `normal` for all repo's. If you want to override for all repo's, use `*` to set the mode instead of the repo path |
|
||||
| `ignore_submodules` | `map[string]string` | map of repo's where to change the [--ignore-submodules][submodules] flag (`none`, `untracked`, `dirty` or `all`). For example `"ignore_submodules": { "/Users/me/repos/repo1": "all" }`. If you want to override for all repo's, use `*` to set the mode instead of the repo path |
|
||||
| `native_fallback` | `boolean` | when set to `true` and `git.exe` is not available when inside a WSL2 shared Windows drive, we will fallback to the native git executable to fetch data. Not all information can be displayed in this case. Defaults to `false` |
|
||||
| `ignore_submodules` | `map[string]string` | map of repo's where to change the [--ignore-submodules][submodules] flag (`none`, `untracked`, `dirty` or `all`). For example `"ignore_submodules": { "/Users/me/repos/repo1": "all" }`. If you want to override for all repo's, use `*` to set the mode instead of the repo path |
|
||||
| `native_fallback` | `boolean` | when set to `true` and `git.exe` is not available when inside a WSL2 shared Windows drive, we will fallback to the native git executable to fetch data. Not all information can be displayed in this case. Defaults to `false` |
|
||||
|
||||
### Icons
|
||||
|
||||
|
@ -141,6 +142,7 @@ You can set the following properties to `true` to enable fetching additional inf
|
|||
| `.StashCount` | `int` | the stash count |
|
||||
| `.WorktreeCount` | `int` | the worktree count |
|
||||
| `.IsWorkTree` | `boolean` | if in a worktree repo or not |
|
||||
| `.IsBare` | `boolean` | if in a bare repo or not |
|
||||
| `.Dir` | `string` | the repository's root directory |
|
||||
| `.Kraken` | `string` | a link to the current HEAD in [GitKraken][kraken-ref] for use in [hyperlinks][hyperlinks] in templates `{{ url .HEAD .Kraken }}` |
|
||||
|
||||
|
|
Loading…
Reference in a new issue