mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-03 00:57:52 +02:00
standardize commit hash commit sha (#3398)
Standardise on use of 'commit hash' rather than 'commit SHA' Close: https://github.com/jesseduffield/lazygit/issues/3208
This commit is contained in:
@ -6,7 +6,7 @@ You can add custom command keybindings in your config.yml (accessible by pressin
|
|||||||
customCommands:
|
customCommands:
|
||||||
- key: '<c-r>'
|
- key: '<c-r>'
|
||||||
context: 'commits'
|
context: 'commits'
|
||||||
command: 'hub browse -- "commit/{{.SelectedLocalCommit.Sha}}"'
|
command: 'hub browse -- "commit/{{.SelectedLocalCommit.Hash}}"'
|
||||||
- key: 'a'
|
- key: 'a'
|
||||||
context: 'files'
|
context: 'files'
|
||||||
command: "git {{if .SelectedFile.HasUnstagedChanges}} add {{else}} reset {{end}} {{.SelectedFile.Name | quote}}"
|
command: "git {{if .SelectedFile.HasUnstagedChanges}} add {{else}} reset {{end}} {{.SelectedFile.Name | quote}}"
|
||||||
@ -305,7 +305,7 @@ SelectedWorktree
|
|||||||
CheckedOutBranch
|
CheckedOutBranch
|
||||||
```
|
```
|
||||||
|
|
||||||
To see what fields are available on e.g. the `SelectedFile`, see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/commands/models/file.go) (all the modelling lives in the same directory). Note that the custom commands feature does not guarantee backwards compatibility (until we hit Lazygit version 1.0 of course) which means a field you're accessing on an object may no longer be available from one release to the next. Typically however, all you'll need is `{{.SelectedFile.Name}}`, `{{.SelectedLocalCommit.Sha}}` and `{{.SelectedLocalBranch.Name}}`. In the future we will likely introduce a tighter interface that exposes a limited set of fields for each model.
|
To see what fields are available on e.g. the `SelectedFile`, see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/commands/models/file.go) (all the modelling lives in the same directory). Note that the custom commands feature does not guarantee backwards compatibility (until we hit Lazygit version 1.0 of course) which means a field you're accessing on an object may no longer be available from one release to the next. Typically however, all you'll need is `{{.SelectedFile.Name}}`, `{{.SelectedLocalCommit.Hash}}` and `{{.SelectedLocalBranch.Name}}`. In the future we will likely introduce a tighter interface that exposes a limited set of fields for each model.
|
||||||
|
|
||||||
## Keybinding collisions
|
## Keybinding collisions
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Copy commit SHA to clipboard | |
|
| `` <c-o> `` | Copy commit hash to clipboard | |
|
||||||
| `` <c-r> `` | Reset copied (cherry-picked) commits selection | |
|
| `` <c-r> `` | Reset copied (cherry-picked) commits selection | |
|
||||||
| `` b `` | View bisect options | |
|
| `` b `` | View bisect options | |
|
||||||
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
@ -245,7 +245,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Copy commit SHA to clipboard | |
|
| `` <c-o> `` | Copy commit hash to clipboard | |
|
||||||
| `` <space> `` | Checkout | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Checkout | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Open commit in browser | |
|
| `` o `` | Open commit in browser | |
|
||||||
@ -313,7 +313,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Copy commit SHA to clipboard | |
|
| `` <c-o> `` | Copy commit hash to clipboard | |
|
||||||
| `` <space> `` | Checkout | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Checkout | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Open commit in browser | |
|
| `` o `` | Open commit in browser | |
|
||||||
|
@ -66,7 +66,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | コミットのSHAをクリップボードにコピー | |
|
| `` <c-o> `` | コミットのhashをクリップボードにコピー | |
|
||||||
| `` <space> `` | チェックアウト | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | チェックアウト | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | コミットの情報をコピー | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | コミットの情報をコピー | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | ブラウザでコミットを開く | |
|
| `` o `` | ブラウザでコミットを開く | |
|
||||||
@ -93,7 +93,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | コミットのSHAをクリップボードにコピー | |
|
| `` <c-o> `` | コミットのhashをクリップボードにコピー | |
|
||||||
| `` <c-r> `` | Reset copied (cherry-picked) commits selection | |
|
| `` <c-r> `` | Reset copied (cherry-picked) commits selection | |
|
||||||
| `` b `` | View bisect options | |
|
| `` b `` | View bisect options | |
|
||||||
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
@ -343,7 +343,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | コミットのSHAをクリップボードにコピー | |
|
| `` <c-o> `` | コミットのhashをクリップボードにコピー | |
|
||||||
| `` <space> `` | チェックアウト | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | チェックアウト | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | コミットの情報をコピー | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | コミットの情報をコピー | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | ブラウザでコミットを開く | |
|
| `` o `` | ブラウザでコミットを開く | |
|
||||||
|
@ -53,7 +53,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 커밋 SHA를 클립보드에 복사 | |
|
| `` <c-o> `` | 커밋 해시를 클립보드에 복사 | |
|
||||||
| `` <space> `` | 체크아웃 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 체크아웃 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | 커밋 attribute 복사 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | 커밋 attribute 복사 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 브라우저에서 커밋 열기 | |
|
| `` o `` | 브라우저에서 커밋 열기 | |
|
||||||
@ -83,7 +83,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 커밋 SHA를 클립보드에 복사 | |
|
| `` <c-o> `` | 커밋 해시를 클립보드에 복사 | |
|
||||||
| `` <space> `` | 체크아웃 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 체크아웃 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | 커밋 attribute 복사 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | 커밋 attribute 복사 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 브라우저에서 커밋 열기 | |
|
| `` o `` | 브라우저에서 커밋 열기 | |
|
||||||
@ -256,7 +256,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 커밋 SHA를 클립보드에 복사 | |
|
| `` <c-o> `` | 커밋 해시를 클립보드에 복사 | |
|
||||||
| `` <c-r> `` | Reset cherry-picked (copied) commits selection | |
|
| `` <c-r> `` | Reset cherry-picked (copied) commits selection | |
|
||||||
| `` b `` | Bisect 옵션 보기 | |
|
| `` b `` | Bisect 옵션 보기 | |
|
||||||
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
|
@ -139,7 +139,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopieer commit SHA naar klembord | |
|
| `` <c-o> `` | Kopieer commit hash naar klembord | |
|
||||||
| `` <c-r> `` | Reset cherry-picked (gekopieerde) commits selectie | |
|
| `` <c-r> `` | Reset cherry-picked (gekopieerde) commits selectie | |
|
||||||
| `` b `` | View bisect options | |
|
| `` b `` | View bisect options | |
|
||||||
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | Squash | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
@ -223,7 +223,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopieer commit SHA naar klembord | |
|
| `` <c-o> `` | Kopieer commit hash naar klembord | |
|
||||||
| `` <space> `` | Uitchecken | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Uitchecken | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Open commit in browser | |
|
| `` o `` | Open commit in browser | |
|
||||||
@ -313,7 +313,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopieer commit SHA naar klembord | |
|
| `` <c-o> `` | Kopieer commit hash naar klembord | |
|
||||||
| `` <space> `` | Uitchecken | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Uitchecken | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Open commit in browser | |
|
| `` o `` | Open commit in browser | |
|
||||||
|
@ -53,7 +53,7 @@ _Legenda: `<c-b>` oznacza ctrl+b, `<a-b>` oznacza alt+b, `B` oznacza shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopiuj SHA commita do schowka | |
|
| `` <c-o> `` | Kopiuj hash commita do schowka | |
|
||||||
| `` <c-r> `` | Resetuj wybrane (cherry-picked) commity | |
|
| `` <c-r> `` | Resetuj wybrane (cherry-picked) commity | |
|
||||||
| `` b `` | Zobacz opcje bisect | |
|
| `` b `` | Zobacz opcje bisect | |
|
||||||
| `` s `` | Scal | Scal wybrany commit z commitami poniżej. Wiadomość wybranego commita zostanie dołączona do commita poniżej. |
|
| `` s `` | Scal | Scal wybrany commit z commitami poniżej. Wiadomość wybranego commita zostanie dołączona do commita poniżej. |
|
||||||
@ -255,7 +255,7 @@ Jeśli chcesz zamiast tego rozpocząć interaktywny rebase od wybranego commita,
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopiuj SHA commita do schowka | |
|
| `` <c-o> `` | Kopiuj hash commita do schowka | |
|
||||||
| `` <space> `` | Przełącz | Przełącz wybrany commit jako odłączoną HEAD. |
|
| `` <space> `` | Przełącz | Przełącz wybrany commit jako odłączoną HEAD. |
|
||||||
| `` y `` | Kopiuj atrybut commita do schowka | Kopiuj atrybut commita do schowka (np. hash, URL, różnice, wiadomość, autor). |
|
| `` y `` | Kopiuj atrybut commita do schowka | Kopiuj atrybut commita do schowka (np. hash, URL, różnice, wiadomość, autor). |
|
||||||
| `` o `` | Otwórz commit w przeglądarce | |
|
| `` o `` | Otwórz commit w przeglądarce | |
|
||||||
@ -295,7 +295,7 @@ Jeśli chcesz zamiast tego rozpocząć interaktywny rebase od wybranego commita,
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Kopiuj SHA commita do schowka | |
|
| `` <c-o> `` | Kopiuj hash commita do schowka | |
|
||||||
| `` <space> `` | Przełącz | Przełącz wybrany commit jako odłączoną HEAD. |
|
| `` <space> `` | Przełącz | Przełącz wybrany commit jako odłączoną HEAD. |
|
||||||
| `` y `` | Kopiuj atrybut commita do schowka | Kopiuj atrybut commita do schowka (np. hash, URL, różnice, wiadomość, autor). |
|
| `` y `` | Kopiuj atrybut commita do schowka | Kopiuj atrybut commita do schowka (np. hash, URL, różnice, wiadomość, autor). |
|
||||||
| `` o `` | Otwórz commit w przeglądarce | |
|
| `` o `` | Otwórz commit w przeglądarce | |
|
||||||
|
@ -123,7 +123,7 @@ _Связки клавиш_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Скопировать SHA коммита в буфер обмена | |
|
| `` <c-o> `` | Скопировать hash коммита в буфер обмена | |
|
||||||
| `` <space> `` | Переключить | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Переключить | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Скопировать атрибут коммита | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Скопировать атрибут коммита | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Открыть коммит в браузере | |
|
| `` o `` | Открыть коммит в браузере | |
|
||||||
@ -140,7 +140,7 @@ _Связки клавиш_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Скопировать SHA коммита в буфер обмена | |
|
| `` <c-o> `` | Скопировать hash коммита в буфер обмена | |
|
||||||
| `` <c-r> `` | Сбросить отобранную (скопированную | cherry-picked) выборку коммитов | |
|
| `` <c-r> `` | Сбросить отобранную (скопированную | cherry-picked) выборку коммитов | |
|
||||||
| `` b `` | Просмотреть параметры бинарного поиска | |
|
| `` b `` | Просмотреть параметры бинарного поиска | |
|
||||||
| `` s `` | Объединить коммиты (Squash) | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | Объединить коммиты (Squash) | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
@ -219,7 +219,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | Скопировать SHA коммита в буфер обмена | |
|
| `` <c-o> `` | Скопировать hash коммита в буфер обмена | |
|
||||||
| `` <space> `` | Переключить | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | Переключить | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Скопировать атрибут коммита | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Скопировать атрибут коммита | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | Открыть коммит в браузере | |
|
| `` o `` | Открыть коммит в браузере | |
|
||||||
|
@ -53,7 +53,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 将提交的 SHA 复制到剪贴板 | |
|
| `` <c-o> `` | 将提交的 hash 复制到剪贴板 | |
|
||||||
| `` <space> `` | 检出 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 检出 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 在浏览器中打开提交 | |
|
| `` o `` | 在浏览器中打开提交 | |
|
||||||
@ -106,7 +106,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 将提交的 SHA 复制到剪贴板 | |
|
| `` <c-o> `` | 将提交的 hash 复制到剪贴板 | |
|
||||||
| `` <space> `` | 检出 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 检出 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | Copy commit attribute to clipboard | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 在浏览器中打开提交 | |
|
| `` o `` | 在浏览器中打开提交 | |
|
||||||
@ -137,7 +137,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 将提交的 SHA 复制到剪贴板 | |
|
| `` <c-o> `` | 将提交的 hash 复制到剪贴板 | |
|
||||||
| `` <c-r> `` | 重置已拣选(复制)的提交 | |
|
| `` <c-r> `` | 重置已拣选(复制)的提交 | |
|
||||||
| `` b `` | 查看二分查找选项 | |
|
| `` b `` | 查看二分查找选项 | |
|
||||||
| `` s `` | 压缩 | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | 压缩 | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
|
@ -121,7 +121,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 複製提交 SHA 到剪貼簿 | |
|
| `` <c-o> `` | 複製提交 hash 到剪貼簿 | |
|
||||||
| `` <space> `` | 檢出 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 檢出 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | 複製提交屬性 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | 複製提交屬性 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 在瀏覽器中開啟提交 | |
|
| `` o `` | 在瀏覽器中開啟提交 | |
|
||||||
@ -162,7 +162,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 複製提交 SHA 到剪貼簿 | |
|
| `` <c-o> `` | 複製提交 hash 到剪貼簿 | |
|
||||||
| `` <c-r> `` | 重設選定的揀選 (複製) 提交 | |
|
| `` <c-r> `` | 重設選定的揀選 (複製) 提交 | |
|
||||||
| `` b `` | 查看二分選項 | |
|
| `` b `` | 查看二分選項 | |
|
||||||
| `` s `` | 壓縮 (Squash) | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
| `` s `` | 壓縮 (Squash) | Squash the selected commit into the commit below it. The selected commit's message will be appended to the commit below it. |
|
||||||
@ -236,7 +236,7 @@ If you would instead like to start an interactive rebase from the selected commi
|
|||||||
|
|
||||||
| Key | Action | Info |
|
| Key | Action | Info |
|
||||||
|-----|--------|-------------|
|
|-----|--------|-------------|
|
||||||
| `` <c-o> `` | 複製提交 SHA 到剪貼簿 | |
|
| `` <c-o> `` | 複製提交 hash 到剪貼簿 | |
|
||||||
| `` <space> `` | 檢出 | Checkout the selected commit as a detached HEAD. |
|
| `` <space> `` | 檢出 | Checkout the selected commit as a detached HEAD. |
|
||||||
| `` y `` | 複製提交屬性 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
| `` y `` | 複製提交屬性 | Copy commit attribute to clipboard (e.g. hash, URL, diff, message, author). |
|
||||||
| `` o `` | 在瀏覽器中開啟提交 | |
|
| `` o `` | 在瀏覽器中開啟提交 | |
|
||||||
|
@ -212,7 +212,7 @@ func (self *ChangeTodoActionsInstruction) run(common *common.Common) error {
|
|||||||
return handleInteractiveRebase(common, func(path string) error {
|
return handleInteractiveRebase(common, func(path string) error {
|
||||||
changes := lo.Map(self.Changes, func(c ChangeTodoAction, _ int) utils.TodoChange {
|
changes := lo.Map(self.Changes, func(c ChangeTodoAction, _ int) utils.TodoChange {
|
||||||
return utils.TodoChange{
|
return utils.TodoChange{
|
||||||
Sha: c.Sha,
|
Hash: c.Hash,
|
||||||
OldAction: todo.Pick,
|
OldAction: todo.Pick,
|
||||||
NewAction: c.NewAction,
|
NewAction: c.NewAction,
|
||||||
}
|
}
|
||||||
@ -222,18 +222,18 @@ func (self *ChangeTodoActionsInstruction) run(common *common.Common) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Takes the sha of some commit, and the sha of a fixup commit that was created
|
// Takes the hash of some commit, and the hash of a fixup commit that was created
|
||||||
// at the end of the branch, then moves the fixup commit down to right after the
|
// at the end of the branch, then moves the fixup commit down to right after the
|
||||||
// original commit, changing its type to "fixup"
|
// original commit, changing its type to "fixup"
|
||||||
type MoveFixupCommitDownInstruction struct {
|
type MoveFixupCommitDownInstruction struct {
|
||||||
OriginalSha string
|
OriginalHash string
|
||||||
FixupSha string
|
FixupHash string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMoveFixupCommitDownInstruction(originalSha string, fixupSha string) Instruction {
|
func NewMoveFixupCommitDownInstruction(originalHash string, fixupHash string) Instruction {
|
||||||
return &MoveFixupCommitDownInstruction{
|
return &MoveFixupCommitDownInstruction{
|
||||||
OriginalSha: originalSha,
|
OriginalHash: originalHash,
|
||||||
FixupSha: fixupSha,
|
FixupHash: fixupHash,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,17 +247,17 @@ func (self *MoveFixupCommitDownInstruction) SerializedInstructions() string {
|
|||||||
|
|
||||||
func (self *MoveFixupCommitDownInstruction) run(common *common.Common) error {
|
func (self *MoveFixupCommitDownInstruction) run(common *common.Common) error {
|
||||||
return handleInteractiveRebase(common, func(path string) error {
|
return handleInteractiveRebase(common, func(path string) error {
|
||||||
return utils.MoveFixupCommitDown(path, self.OriginalSha, self.FixupSha, getCommentChar())
|
return utils.MoveFixupCommitDown(path, self.OriginalHash, self.FixupHash, getCommentChar())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type MoveTodosUpInstruction struct {
|
type MoveTodosUpInstruction struct {
|
||||||
Shas []string
|
Hashes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMoveTodosUpInstruction(shas []string) Instruction {
|
func NewMoveTodosUpInstruction(hashes []string) Instruction {
|
||||||
return &MoveTodosUpInstruction{
|
return &MoveTodosUpInstruction{
|
||||||
Shas: shas,
|
Hashes: hashes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,9 +270,9 @@ func (self *MoveTodosUpInstruction) SerializedInstructions() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *MoveTodosUpInstruction) run(common *common.Common) error {
|
func (self *MoveTodosUpInstruction) run(common *common.Common) error {
|
||||||
todosToMove := lo.Map(self.Shas, func(sha string, _ int) utils.Todo {
|
todosToMove := lo.Map(self.Hashes, func(hash string, _ int) utils.Todo {
|
||||||
return utils.Todo{
|
return utils.Todo{
|
||||||
Sha: sha,
|
Hash: hash,
|
||||||
Action: todo.Pick,
|
Action: todo.Pick,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -283,12 +283,12 @@ func (self *MoveTodosUpInstruction) run(common *common.Common) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MoveTodosDownInstruction struct {
|
type MoveTodosDownInstruction struct {
|
||||||
Shas []string
|
Hashes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMoveTodosDownInstruction(shas []string) Instruction {
|
func NewMoveTodosDownInstruction(hashes []string) Instruction {
|
||||||
return &MoveTodosDownInstruction{
|
return &MoveTodosDownInstruction{
|
||||||
Shas: shas,
|
Hashes: hashes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,9 +301,9 @@ func (self *MoveTodosDownInstruction) SerializedInstructions() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *MoveTodosDownInstruction) run(common *common.Common) error {
|
func (self *MoveTodosDownInstruction) run(common *common.Common) error {
|
||||||
todosToMove := lo.Map(self.Shas, func(sha string, _ int) utils.Todo {
|
todosToMove := lo.Map(self.Hashes, func(hash string, _ int) utils.Todo {
|
||||||
return utils.Todo{
|
return utils.Todo{
|
||||||
Sha: sha,
|
Hash: hash,
|
||||||
Action: todo.Pick,
|
Action: todo.Pick,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -21,7 +21,7 @@ func (self *TodoLine) ToString() string {
|
|||||||
if self.Action == "break" {
|
if self.Action == "break" {
|
||||||
return self.Action + "\n"
|
return self.Action + "\n"
|
||||||
} else {
|
} else {
|
||||||
return self.Action + " " + self.Commit.Sha + " " + self.Commit.Name + "\n"
|
return self.Action + " " + self.Commit.Hash + " " + self.Commit.Name + "\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ func TodoLinesToString(todoLines []TodoLine) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ChangeTodoAction struct {
|
type ChangeTodoAction struct {
|
||||||
Sha string
|
Hash string
|
||||||
NewAction todo.TodoCommand
|
NewAction todo.TodoCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ func mergeBuildInfo(buildInfo *BuildInfo) {
|
|||||||
buildInfo.Commit = revision.Value
|
buildInfo.Commit = revision.Value
|
||||||
// if lazygit was built from source we'll show the version as the
|
// if lazygit was built from source we'll show the version as the
|
||||||
// abbreviated commit hash
|
// abbreviated commit hash
|
||||||
buildInfo.Version = utils.ShortSha(revision.Value)
|
buildInfo.Version = utils.ShortHash(revision.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if version hasn't been set we assume that neither has the date
|
// if version hasn't been set we assume that neither has the date
|
||||||
|
@ -76,7 +76,7 @@ func (self *BisectCommands) GetInfoForGitDir(gitDir string) *BisectInfo {
|
|||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|
||||||
sha := strings.TrimSpace(string(fileContent))
|
hash := strings.TrimSpace(string(fileContent))
|
||||||
|
|
||||||
if name == info.newTerm {
|
if name == info.newTerm {
|
||||||
status = BisectStatusNew
|
status = BisectStatusNew
|
||||||
@ -86,7 +86,7 @@ func (self *BisectCommands) GetInfoForGitDir(gitDir string) *BisectInfo {
|
|||||||
status = BisectStatusSkipped
|
status = BisectStatusSkipped
|
||||||
}
|
}
|
||||||
|
|
||||||
info.statusMap[sha] = status
|
info.statusMap[hash] = status
|
||||||
}
|
}
|
||||||
|
|
||||||
currentContent, err := os.ReadFile(filepath.Join(gitDir, "BISECT_EXPECTED_REV"))
|
currentContent, err := os.ReadFile(filepath.Join(gitDir, "BISECT_EXPECTED_REV"))
|
||||||
@ -94,8 +94,8 @@ func (self *BisectCommands) GetInfoForGitDir(gitDir string) *BisectInfo {
|
|||||||
self.Log.Infof("error getting git bisect info: %s", err.Error())
|
self.Log.Infof("error getting git bisect info: %s", err.Error())
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
currentSha := strings.TrimSpace(string(currentContent))
|
currentHash := strings.TrimSpace(string(currentContent))
|
||||||
info.current = currentSha
|
info.current = currentHash
|
||||||
|
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
@ -135,7 +135,7 @@ func (self *BisectCommands) StartWithTerms(oldTerm string, newTerm string) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// tells us whether we've found our problem commit(s). We return a string slice of
|
// tells us whether we've found our problem commit(s). We return a string slice of
|
||||||
// commit sha's if we're done, and that slice may have more that one item if
|
// commit hashes if we're done, and that slice may have more that one item if
|
||||||
// skipped commits are involved.
|
// skipped commits are involved.
|
||||||
func (self *BisectCommands) IsDone() (bool, []string, error) {
|
func (self *BisectCommands) IsDone() (bool, []string, error) {
|
||||||
info := self.GetInfo()
|
info := self.GetInfo()
|
||||||
@ -143,8 +143,8 @@ func (self *BisectCommands) IsDone() (bool, []string, error) {
|
|||||||
return false, nil, nil
|
return false, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
newSha := info.GetNewSha()
|
newHash := info.GetNewHash()
|
||||||
if newSha == "" {
|
if newHash == "" {
|
||||||
return false, nil, nil
|
return false, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,14 +153,14 @@ func (self *BisectCommands) IsDone() (bool, []string, error) {
|
|||||||
done := false
|
done := false
|
||||||
candidates := []string{}
|
candidates := []string{}
|
||||||
|
|
||||||
cmdArgs := NewGitCmd("rev-list").Arg(newSha).ToArgv()
|
cmdArgs := NewGitCmd("rev-list").Arg(newHash).ToArgv()
|
||||||
err := self.cmd.New(cmdArgs).RunAndProcessLines(func(line string) (bool, error) {
|
err := self.cmd.New(cmdArgs).RunAndProcessLines(func(line string) (bool, error) {
|
||||||
sha := strings.TrimSpace(line)
|
hash := strings.TrimSpace(line)
|
||||||
|
|
||||||
if status, ok := info.statusMap[sha]; ok {
|
if status, ok := info.statusMap[hash]; ok {
|
||||||
switch status {
|
switch status {
|
||||||
case BisectStatusSkipped, BisectStatusNew:
|
case BisectStatusSkipped, BisectStatusNew:
|
||||||
candidates = append(candidates, sha)
|
candidates = append(candidates, hash)
|
||||||
return false, nil
|
return false, nil
|
||||||
case BisectStatusOld:
|
case BisectStatusOld:
|
||||||
done = true
|
done = true
|
||||||
@ -185,7 +185,7 @@ func (self *BisectCommands) IsDone() (bool, []string, error) {
|
|||||||
// render the commits from the bad commit.
|
// render the commits from the bad commit.
|
||||||
func (self *BisectCommands) ReachableFromStart(bisectInfo *BisectInfo) bool {
|
func (self *BisectCommands) ReachableFromStart(bisectInfo *BisectInfo) bool {
|
||||||
cmdArgs := NewGitCmd("merge-base").
|
cmdArgs := NewGitCmd("merge-base").
|
||||||
Arg("--is-ancestor", bisectInfo.GetNewSha(), bisectInfo.GetStartSha()).
|
Arg("--is-ancestor", bisectInfo.GetNewHash(), bisectInfo.GetStartHash()).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
err := self.cmd.New(cmdArgs).DontLog().Run()
|
err := self.cmd.New(cmdArgs).DontLog().Run()
|
||||||
|
@ -29,10 +29,10 @@ type BisectInfo struct {
|
|||||||
newTerm string // 'bad' by default
|
newTerm string // 'bad' by default
|
||||||
oldTerm string // 'good' by default
|
oldTerm string // 'good' by default
|
||||||
|
|
||||||
// map of commit sha's to their status
|
// map of commit hashes to their status
|
||||||
statusMap map[string]BisectStatus
|
statusMap map[string]BisectStatus
|
||||||
|
|
||||||
// the sha of the commit that's under test
|
// the hash of the commit that's under test
|
||||||
current string
|
current string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,26 +49,26 @@ func NewNullBisectInfo() *BisectInfo {
|
|||||||
return &BisectInfo{started: false}
|
return &BisectInfo{started: false}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectInfo) GetNewSha() string {
|
func (self *BisectInfo) GetNewHash() string {
|
||||||
for sha, status := range self.statusMap {
|
for hash, status := range self.statusMap {
|
||||||
if status == BisectStatusNew {
|
if status == BisectStatusNew {
|
||||||
return sha
|
return hash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectInfo) GetCurrentSha() string {
|
func (self *BisectInfo) GetCurrentHash() string {
|
||||||
return self.current
|
return self.current
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectInfo) GetStartSha() string {
|
func (self *BisectInfo) GetStartHash() string {
|
||||||
return self.start
|
return self.start
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectInfo) Status(commitSha string) (BisectStatus, bool) {
|
func (self *BisectInfo) Status(commitHash string) (BisectStatus, bool) {
|
||||||
status, ok := self.statusMap[commitSha]
|
status, ok := self.statusMap[commitHash]
|
||||||
return status, ok
|
return status, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ func (self *BisectInfo) Bisecting() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.GetNewSha() == "" {
|
if self.GetNewHash() == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,10 +65,10 @@ func (self *BranchCommands) CurrentBranchInfo() (BranchInfo, error) {
|
|||||||
for _, line := range utils.SplitLines(output) {
|
for _, line := range utils.SplitLines(output) {
|
||||||
split := strings.Split(strings.TrimRight(line, "\r\n"), "\x00")
|
split := strings.Split(strings.TrimRight(line, "\r\n"), "\x00")
|
||||||
if len(split) == 3 && split[0] == "*" {
|
if len(split) == 3 && split[0] == "*" {
|
||||||
sha := split[1]
|
hash := split[1]
|
||||||
displayName := split[2]
|
displayName := split[2]
|
||||||
return BranchInfo{
|
return BranchInfo{
|
||||||
RefName: sha,
|
RefName: hash,
|
||||||
DisplayName: displayName,
|
DisplayName: displayName,
|
||||||
DetachedHead: true,
|
DetachedHead: true,
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -39,8 +39,8 @@ func (self *CommitCommands) SetAuthor(value string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add a commit's coauthor using Github/Gitlab Co-authored-by metadata. Value is expected to be of the form 'Name <Email>'
|
// Add a commit's coauthor using Github/Gitlab Co-authored-by metadata. Value is expected to be of the form 'Name <Email>'
|
||||||
func (self *CommitCommands) AddCoAuthor(sha string, author string) error {
|
func (self *CommitCommands) AddCoAuthor(hash string, author string) error {
|
||||||
message, err := self.GetCommitMessage(sha)
|
message, err := self.GetCommitMessage(hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -74,8 +74,8 @@ func AddCoAuthorToDescription(description string, author string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ResetToCommit reset to commit
|
// ResetToCommit reset to commit
|
||||||
func (self *CommitCommands) ResetToCommit(sha string, strength string, envVars []string) error {
|
func (self *CommitCommands) ResetToCommit(hash string, strength string, envVars []string) error {
|
||||||
cmdArgs := NewGitCmd("reset").Arg("--"+strength, sha).ToArgv()
|
cmdArgs := NewGitCmd("reset").Arg("--"+strength, hash).ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).
|
return self.cmd.New(cmdArgs).
|
||||||
// prevents git from prompting us for input which would freeze the program
|
// prevents git from prompting us for input which would freeze the program
|
||||||
@ -155,9 +155,9 @@ func (self *CommitCommands) signoffFlag() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitMessage(commitSha string) (string, error) {
|
func (self *CommitCommands) GetCommitMessage(commitHash string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("log").
|
cmdArgs := NewGitCmd("log").
|
||||||
Arg("--format=%B", "--max-count=1", commitSha).
|
Arg("--format=%B", "--max-count=1", commitHash).
|
||||||
Config("log.showsignature=false").
|
Config("log.showsignature=false").
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
@ -165,9 +165,9 @@ func (self *CommitCommands) GetCommitMessage(commitSha string) (string, error) {
|
|||||||
return strings.ReplaceAll(strings.TrimSpace(message), "\r\n", "\n"), err
|
return strings.ReplaceAll(strings.TrimSpace(message), "\r\n", "\n"), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitSubject(commitSha string) (string, error) {
|
func (self *CommitCommands) GetCommitSubject(commitHash string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("log").
|
cmdArgs := NewGitCmd("log").
|
||||||
Arg("--format=%s", "--max-count=1", commitSha).
|
Arg("--format=%s", "--max-count=1", commitHash).
|
||||||
Config("log.showsignature=false").
|
Config("log.showsignature=false").
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
@ -175,8 +175,8 @@ func (self *CommitCommands) GetCommitSubject(commitSha string) (string, error) {
|
|||||||
return strings.TrimSpace(subject), err
|
return strings.TrimSpace(subject), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitDiff(commitSha string) (string, error) {
|
func (self *CommitCommands) GetCommitDiff(commitHash string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("show").Arg("--no-color", commitSha).ToArgv()
|
cmdArgs := NewGitCmd("show").Arg("--no-color", commitHash).ToArgv()
|
||||||
|
|
||||||
diff, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
diff, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||||
return diff, err
|
return diff, err
|
||||||
@ -187,9 +187,9 @@ type Author struct {
|
|||||||
Email string
|
Email string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitAuthor(commitSha string) (Author, error) {
|
func (self *CommitCommands) GetCommitAuthor(commitHash string) (Author, error) {
|
||||||
cmdArgs := NewGitCmd("show").
|
cmdArgs := NewGitCmd("show").
|
||||||
Arg("--no-patch", "--pretty=format:'%an%x00%ae'", commitSha).
|
Arg("--no-patch", "--pretty=format:'%an%x00%ae'", commitHash).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
output, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
output, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||||
@ -206,14 +206,14 @@ func (self *CommitCommands) GetCommitAuthor(commitSha string) (Author, error) {
|
|||||||
return author, err
|
return author, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitMessageFirstLine(sha string) (string, error) {
|
func (self *CommitCommands) GetCommitMessageFirstLine(hash string) (string, error) {
|
||||||
return self.GetCommitMessagesFirstLine([]string{sha})
|
return self.GetCommitMessagesFirstLine([]string{hash})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitMessagesFirstLine(shas []string) (string, error) {
|
func (self *CommitCommands) GetCommitMessagesFirstLine(hashes []string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("show").
|
cmdArgs := NewGitCmd("show").
|
||||||
Arg("--no-patch", "--pretty=format:%s").
|
Arg("--no-patch", "--pretty=format:%s").
|
||||||
Arg(shas...).
|
Arg(hashes...).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||||
@ -224,19 +224,19 @@ func (self *CommitCommands) GetCommitMessagesFirstLine(shas []string) (string, e
|
|||||||
// cd50c79ae Preserve the commit message correctly even if the description has blank lines
|
// cd50c79ae Preserve the commit message correctly even if the description has blank lines
|
||||||
// 3ebba5f32 Add test demonstrating a bug with preserving the commit message
|
// 3ebba5f32 Add test demonstrating a bug with preserving the commit message
|
||||||
// 9a423c388 Remove unused function
|
// 9a423c388 Remove unused function
|
||||||
func (self *CommitCommands) GetShasAndCommitMessagesFirstLine(shas []string) (string, error) {
|
func (self *CommitCommands) GetHashesAndCommitMessagesFirstLine(hashes []string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("show").
|
cmdArgs := NewGitCmd("show").
|
||||||
Arg("--no-patch", "--pretty=format:%h %s").
|
Arg("--no-patch", "--pretty=format:%h %s").
|
||||||
Arg(shas...).
|
Arg(hashes...).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) GetCommitsOneline(shas []string) (string, error) {
|
func (self *CommitCommands) GetCommitsOneline(hashes []string) (string, error) {
|
||||||
cmdArgs := NewGitCmd("show").
|
cmdArgs := NewGitCmd("show").
|
||||||
Arg("--no-patch", "--oneline").
|
Arg("--no-patch", "--oneline").
|
||||||
Arg(shas...).
|
Arg(hashes...).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
return self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||||
@ -255,7 +255,7 @@ func (self *CommitCommands) AmendHeadCmdObj() oscommands.ICmdObj {
|
|||||||
return self.cmd.New(cmdArgs)
|
return self.cmd.New(cmdArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) ShowCmdObj(sha string, filterPath string) oscommands.ICmdObj {
|
func (self *CommitCommands) ShowCmdObj(hash string, filterPath string) oscommands.ICmdObj {
|
||||||
contextSize := self.AppState.DiffContextSize
|
contextSize := self.AppState.DiffContextSize
|
||||||
|
|
||||||
extDiffCmd := self.UserConfig.Git.Paging.ExternalDiffCommand
|
extDiffCmd := self.UserConfig.Git.Paging.ExternalDiffCommand
|
||||||
@ -269,7 +269,7 @@ func (self *CommitCommands) ShowCmdObj(sha string, filterPath string) oscommands
|
|||||||
Arg("--stat").
|
Arg("--stat").
|
||||||
Arg("--decorate").
|
Arg("--decorate").
|
||||||
Arg("-p").
|
Arg("-p").
|
||||||
Arg(sha).
|
Arg(hash).
|
||||||
ArgIf(self.AppState.IgnoreWhitespaceInDiffView, "--ignore-all-space").
|
ArgIf(self.AppState.IgnoreWhitespaceInDiffView, "--ignore-all-space").
|
||||||
ArgIf(filterPath != "", "--", filterPath).
|
ArgIf(filterPath != "", "--", filterPath).
|
||||||
Dir(self.repoPaths.worktreePath).
|
Dir(self.repoPaths.worktreePath).
|
||||||
@ -278,23 +278,23 @@ func (self *CommitCommands) ShowCmdObj(sha string, filterPath string) oscommands
|
|||||||
return self.cmd.New(cmdArgs).DontLog()
|
return self.cmd.New(cmdArgs).DontLog()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Revert reverts the selected commit by sha
|
// Revert reverts the selected commit by hash
|
||||||
func (self *CommitCommands) Revert(sha string) error {
|
func (self *CommitCommands) Revert(hash string) error {
|
||||||
cmdArgs := NewGitCmd("revert").Arg(sha).ToArgv()
|
cmdArgs := NewGitCmd("revert").Arg(hash).ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CommitCommands) RevertMerge(sha string, parentNumber int) error {
|
func (self *CommitCommands) RevertMerge(hash string, parentNumber int) error {
|
||||||
cmdArgs := NewGitCmd("revert").Arg(sha, "-m", fmt.Sprintf("%d", parentNumber)).
|
cmdArgs := NewGitCmd("revert").Arg(hash, "-m", fmt.Sprintf("%d", parentNumber)).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateFixupCommit creates a commit that fixes up a previous commit
|
// CreateFixupCommit creates a commit that fixes up a previous commit
|
||||||
func (self *CommitCommands) CreateFixupCommit(sha string) error {
|
func (self *CommitCommands) CreateFixupCommit(hash string) error {
|
||||||
cmdArgs := NewGitCmd("commit").Arg("--fixup=" + sha).ToArgv()
|
cmdArgs := NewGitCmd("commit").Arg("--fixup=" + hash).ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ func (self *CommitLoader) GetCommits(opts GetCommitsOptions) ([]*models.Commit,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, commit := range commits {
|
for _, commit := range commits {
|
||||||
if commit.Sha == firstPushedCommit {
|
if commit.Hash == firstPushedCommit {
|
||||||
passedFirstPushedCommit = true
|
passedFirstPushedCommit = true
|
||||||
}
|
}
|
||||||
if commit.Status != models.StatusRebasing {
|
if commit.Status != models.StatusRebasing {
|
||||||
@ -198,14 +198,14 @@ func (self *CommitLoader) MergeRebasingCommits(commits []*models.Commit) ([]*mod
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// extractCommitFromLine takes a line from a git log and extracts the sha, message, date, and tag if present
|
// extractCommitFromLine takes a line from a git log and extracts the hash, message, date, and tag if present
|
||||||
// then puts them into a commit object
|
// then puts them into a commit object
|
||||||
// example input:
|
// example input:
|
||||||
// 8ad01fe32fcc20f07bc6693f87aa4977c327f1e1|10 hours ago|Jesse Duffield| (HEAD -> master, tag: v0.15.2)|refresh commits when adding a tag
|
// 8ad01fe32fcc20f07bc6693f87aa4977c327f1e1|10 hours ago|Jesse Duffield| (HEAD -> master, tag: v0.15.2)|refresh commits when adding a tag
|
||||||
func (self *CommitLoader) extractCommitFromLine(line string, showDivergence bool) *models.Commit {
|
func (self *CommitLoader) extractCommitFromLine(line string, showDivergence bool) *models.Commit {
|
||||||
split := strings.SplitN(line, "\x00", 8)
|
split := strings.SplitN(line, "\x00", 8)
|
||||||
|
|
||||||
sha := split[0]
|
hash := split[0]
|
||||||
unixTimestamp := split[1]
|
unixTimestamp := split[1]
|
||||||
authorName := split[2]
|
authorName := split[2]
|
||||||
authorEmail := split[3]
|
authorEmail := split[3]
|
||||||
@ -241,7 +241,7 @@ func (self *CommitLoader) extractCommitFromLine(line string, showDivergence bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &models.Commit{
|
return &models.Commit{
|
||||||
Sha: sha,
|
Hash: hash,
|
||||||
Name: message,
|
Name: message,
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
ExtraInfo: extraInfo,
|
ExtraInfo: extraInfo,
|
||||||
@ -260,8 +260,8 @@ func (self *CommitLoader) getHydratedRebasingCommits(rebaseMode enums.RebaseMode
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
commitShas := lo.FilterMap(commits, func(commit *models.Commit, _ int) (string, bool) {
|
commitHashes := lo.FilterMap(commits, func(commit *models.Commit, _ int) (string, bool) {
|
||||||
return commit.Sha, commit.Sha != ""
|
return commit.Hash, commit.Hash != ""
|
||||||
})
|
})
|
||||||
|
|
||||||
// note that we're not filtering these as we do non-rebasing commits just because
|
// note that we're not filtering these as we do non-rebasing commits just because
|
||||||
@ -270,14 +270,14 @@ func (self *CommitLoader) getHydratedRebasingCommits(rebaseMode enums.RebaseMode
|
|||||||
NewGitCmd("show").
|
NewGitCmd("show").
|
||||||
Config("log.showSignature=false").
|
Config("log.showSignature=false").
|
||||||
Arg("--no-patch", "--oneline", "--abbrev=20", prettyFormat).
|
Arg("--no-patch", "--oneline", "--abbrev=20", prettyFormat).
|
||||||
Arg(commitShas...).
|
Arg(commitHashes...).
|
||||||
ToArgv(),
|
ToArgv(),
|
||||||
).DontLog()
|
).DontLog()
|
||||||
|
|
||||||
fullCommits := map[string]*models.Commit{}
|
fullCommits := map[string]*models.Commit{}
|
||||||
err := cmdObj.RunAndProcessLines(func(line string) (bool, error) {
|
err := cmdObj.RunAndProcessLines(func(line string) (bool, error) {
|
||||||
commit := self.extractCommitFromLine(line, false)
|
commit := self.extractCommitFromLine(line, false)
|
||||||
fullCommits[commit.Sha] = commit
|
fullCommits[commit.Hash] = commit
|
||||||
return false, nil
|
return false, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -285,23 +285,23 @@ func (self *CommitLoader) getHydratedRebasingCommits(rebaseMode enums.RebaseMode
|
|||||||
}
|
}
|
||||||
|
|
||||||
findFullCommit := lo.Ternary(self.version.IsOlderThan(2, 25, 2),
|
findFullCommit := lo.Ternary(self.version.IsOlderThan(2, 25, 2),
|
||||||
func(sha string) *models.Commit {
|
func(hash string) *models.Commit {
|
||||||
for s, c := range fullCommits {
|
for s, c := range fullCommits {
|
||||||
if strings.HasPrefix(s, sha) {
|
if strings.HasPrefix(s, hash) {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
func(sha string) *models.Commit {
|
func(hash string) *models.Commit {
|
||||||
return fullCommits[sha]
|
return fullCommits[hash]
|
||||||
})
|
})
|
||||||
|
|
||||||
hydratedCommits := make([]*models.Commit, 0, len(commits))
|
hydratedCommits := make([]*models.Commit, 0, len(commits))
|
||||||
for _, rebasingCommit := range commits {
|
for _, rebasingCommit := range commits {
|
||||||
if rebasingCommit.Sha == "" {
|
if rebasingCommit.Hash == "" {
|
||||||
hydratedCommits = append(hydratedCommits, rebasingCommit)
|
hydratedCommits = append(hydratedCommits, rebasingCommit)
|
||||||
} else if commit := findFullCommit(rebasingCommit.Sha); commit != nil {
|
} else if commit := findFullCommit(rebasingCommit.Hash); commit != nil {
|
||||||
commit.Action = rebasingCommit.Action
|
commit.Action = rebasingCommit.Action
|
||||||
commit.Status = rebasingCommit.Status
|
commit.Status = rebasingCommit.Status
|
||||||
hydratedCommits = append(hydratedCommits, commit)
|
hydratedCommits = append(hydratedCommits, commit)
|
||||||
@ -337,9 +337,9 @@ func (self *CommitLoader) getRebasingCommits(rebaseMode enums.RebaseMode) []*mod
|
|||||||
|
|
||||||
// See if the current commit couldn't be applied because it conflicted; if
|
// See if the current commit couldn't be applied because it conflicted; if
|
||||||
// so, add a fake entry for it
|
// so, add a fake entry for it
|
||||||
if conflictedCommitSha := self.getConflictedCommit(todos); conflictedCommitSha != "" {
|
if conflictedCommitHash := self.getConflictedCommit(todos); conflictedCommitHash != "" {
|
||||||
commits = append(commits, &models.Commit{
|
commits = append(commits, &models.Commit{
|
||||||
Sha: conflictedCommitSha,
|
Hash: conflictedCommitHash,
|
||||||
Name: "",
|
Name: "",
|
||||||
Status: models.StatusRebasing,
|
Status: models.StatusRebasing,
|
||||||
Action: models.ActionConflict,
|
Action: models.ActionConflict,
|
||||||
@ -354,7 +354,7 @@ func (self *CommitLoader) getRebasingCommits(rebaseMode enums.RebaseMode) []*mod
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
commits = utils.Prepend(commits, &models.Commit{
|
commits = utils.Prepend(commits, &models.Commit{
|
||||||
Sha: t.Commit,
|
Hash: t.Commit,
|
||||||
Name: t.Msg,
|
Name: t.Msg,
|
||||||
Status: models.StatusRebasing,
|
Status: models.StatusRebasing,
|
||||||
Action: t.Command,
|
Action: t.Command,
|
||||||
@ -458,8 +458,8 @@ func setCommitMergedStatuses(ancestor string, commits []*models.Commit) {
|
|||||||
|
|
||||||
passedAncestor := false
|
passedAncestor := false
|
||||||
for i, commit := range commits {
|
for i, commit := range commits {
|
||||||
// some commits aren't really commits and don't have sha's, such as the update-ref todo
|
// some commits aren't really commits and don't have hashes, such as the update-ref todo
|
||||||
if commit.Sha != "" && strings.HasPrefix(ancestor, commit.Sha) {
|
if commit.Hash != "" && strings.HasPrefix(ancestor, commit.Hash) {
|
||||||
passedAncestor = true
|
passedAncestor = true
|
||||||
}
|
}
|
||||||
if commit.Status != models.StatusPushed && commit.Status != models.StatusUnpushed {
|
if commit.Status != models.StatusPushed && commit.Status != models.StatusUnpushed {
|
||||||
@ -559,7 +559,7 @@ func ignoringWarnings(commandOutput string) string {
|
|||||||
return lastLine
|
return lastLine
|
||||||
}
|
}
|
||||||
|
|
||||||
// getFirstPushedCommit returns the first commit SHA which has been pushed to the ref's upstream.
|
// getFirstPushedCommit returns the first commit hash which has been pushed to the ref's upstream.
|
||||||
// all commits above this are deemed unpushed and marked as such.
|
// all commits above this are deemed unpushed and marked as such.
|
||||||
func (self *CommitLoader) getFirstPushedCommit(refName string) (string, error) {
|
func (self *CommitLoader) getFirstPushedCommit(refName string) (string, error) {
|
||||||
output, err := self.cmd.New(
|
output, err := self.cmd.New(
|
||||||
|
@ -86,7 +86,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
|
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
Hash: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
||||||
Name: "better typing for rebase mode",
|
Name: "better typing for rebase mode",
|
||||||
Status: models.StatusUnpushed,
|
Status: models.StatusUnpushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -100,7 +100,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164",
|
Hash: "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164",
|
||||||
Name: "fix logging",
|
Name: "fix logging",
|
||||||
Status: models.StatusPushed,
|
Status: models.StatusPushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -114,7 +114,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c",
|
Hash: "e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c",
|
||||||
Name: "refactor",
|
Name: "refactor",
|
||||||
Status: models.StatusPushed,
|
Status: models.StatusPushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -128,7 +128,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "d8084cd558925eb7c9c38afeed5725c21653ab90",
|
Hash: "d8084cd558925eb7c9c38afeed5725c21653ab90",
|
||||||
Name: "WIP",
|
Name: "WIP",
|
||||||
Status: models.StatusPushed,
|
Status: models.StatusPushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -142,7 +142,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "65f910ebd85283b5cce9bf67d03d3f1a9ea3813a",
|
Hash: "65f910ebd85283b5cce9bf67d03d3f1a9ea3813a",
|
||||||
Name: "WIP",
|
Name: "WIP",
|
||||||
Status: models.StatusPushed,
|
Status: models.StatusPushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -156,7 +156,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "26c07b1ab33860a1a7591a0638f9925ccf497ffa",
|
Hash: "26c07b1ab33860a1a7591a0638f9925ccf497ffa",
|
||||||
Name: "WIP",
|
Name: "WIP",
|
||||||
Status: models.StatusMerged,
|
Status: models.StatusMerged,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -170,7 +170,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "3d4470a6c072208722e5ae9a54bcb9634959a1c5",
|
Hash: "3d4470a6c072208722e5ae9a54bcb9634959a1c5",
|
||||||
Name: "WIP",
|
Name: "WIP",
|
||||||
Status: models.StatusMerged,
|
Status: models.StatusMerged,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -184,7 +184,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "053a66a7be3da43aacdc7aa78e1fe757b82c4dd2",
|
Hash: "053a66a7be3da43aacdc7aa78e1fe757b82c4dd2",
|
||||||
Name: "refactoring the config struct",
|
Name: "refactoring the config struct",
|
||||||
Status: models.StatusMerged,
|
Status: models.StatusMerged,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -221,7 +221,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
|
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
Hash: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
||||||
Name: "better typing for rebase mode",
|
Name: "better typing for rebase mode",
|
||||||
Status: models.StatusUnpushed,
|
Status: models.StatusUnpushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -260,7 +260,7 @@ func TestGetCommits(t *testing.T) {
|
|||||||
|
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
Hash: "0eea75e8c631fba6b58135697835d58ba4c18dbc",
|
||||||
Name: "better typing for rebase mode",
|
Name: "better typing for rebase mode",
|
||||||
Status: models.StatusUnpushed,
|
Status: models.StatusUnpushed,
|
||||||
Action: models.ActionNone,
|
Action: models.ActionNone,
|
||||||
@ -339,14 +339,14 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
todos []todo.Todo
|
todos []todo.Todo
|
||||||
doneTodos []todo.Todo
|
doneTodos []todo.Todo
|
||||||
amendFileExists bool
|
amendFileExists bool
|
||||||
expectedSha string
|
expectedHash string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
testName: "no done todos",
|
testName: "no done todos",
|
||||||
todos: []todo.Todo{},
|
todos: []todo.Todo{},
|
||||||
doneTodos: []todo.Todo{},
|
doneTodos: []todo.Todo{},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "common case (conflict)",
|
testName: "common case (conflict)",
|
||||||
@ -362,7 +362,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "fa1afe1",
|
expectedHash: "fa1afe1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "last command was 'break'",
|
testName: "last command was 'break'",
|
||||||
@ -371,7 +371,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
{Command: todo.Break},
|
{Command: todo.Break},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "last command was 'exec'",
|
testName: "last command was 'exec'",
|
||||||
@ -383,7 +383,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "last command was 'reword'",
|
testName: "last command was 'reword'",
|
||||||
@ -392,7 +392,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
{Command: todo.Reword},
|
{Command: todo.Reword},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "'pick' was rescheduled",
|
testName: "'pick' was rescheduled",
|
||||||
@ -409,7 +409,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "'pick' was rescheduled, buggy git version",
|
testName: "'pick' was rescheduled, buggy git version",
|
||||||
@ -434,7 +434,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "conflicting 'pick' after 'exec'",
|
testName: "conflicting 'pick' after 'exec'",
|
||||||
@ -459,7 +459,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "fa1afe1",
|
expectedHash: "fa1afe1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "'edit' with amend file",
|
testName: "'edit' with amend file",
|
||||||
@ -471,7 +471,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: true,
|
amendFileExists: true,
|
||||||
expectedSha: "",
|
expectedHash: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "'edit' without amend file",
|
testName: "'edit' without amend file",
|
||||||
@ -483,7 +483,7 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
amendFileExists: false,
|
amendFileExists: false,
|
||||||
expectedSha: "fa1afe1",
|
expectedHash: "fa1afe1",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
@ -503,8 +503,8 @@ func TestCommitLoader_getConflictedCommitImpl(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sha := builder.getConflictedCommitImpl(scenario.todos, scenario.doneTodos, scenario.amendFileExists)
|
hash := builder.getConflictedCommitImpl(scenario.todos, scenario.doneTodos, scenario.amendFileExists)
|
||||||
assert.Equal(t, scenario.expectedSha, sha)
|
assert.Equal(t, scenario.expectedHash, hash)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -521,29 +521,29 @@ func TestCommitLoader_setCommitMergedStatuses(t *testing.T) {
|
|||||||
{
|
{
|
||||||
testName: "basic",
|
testName: "basic",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
{Hash: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
||||||
{Sha: "67890", Name: "2", Action: models.ActionNone, Status: models.StatusPushed},
|
{Hash: "67890", Name: "2", Action: models.ActionNone, Status: models.StatusPushed},
|
||||||
{Sha: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
{Hash: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
||||||
},
|
},
|
||||||
ancestor: "67890",
|
ancestor: "67890",
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{Sha: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
{Hash: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
||||||
{Sha: "67890", Name: "2", Action: models.ActionNone, Status: models.StatusMerged},
|
{Hash: "67890", Name: "2", Action: models.ActionNone, Status: models.StatusMerged},
|
||||||
{Sha: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusMerged},
|
{Hash: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusMerged},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "with update-ref",
|
testName: "with update-ref",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
{Hash: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
||||||
{Sha: "", Name: "", Action: todo.UpdateRef, Status: models.StatusNone},
|
{Hash: "", Name: "", Action: todo.UpdateRef, Status: models.StatusNone},
|
||||||
{Sha: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
{Hash: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
||||||
},
|
},
|
||||||
ancestor: "deadbeef",
|
ancestor: "deadbeef",
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{Sha: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
{Hash: "12345", Name: "1", Action: models.ActionNone, Status: models.StatusUnpushed},
|
||||||
{Sha: "", Name: "", Action: todo.UpdateRef, Status: models.StatusNone},
|
{Hash: "", Name: "", Action: todo.UpdateRef, Status: models.StatusNone},
|
||||||
{Sha: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
{Hash: "abcde", Name: "3", Action: models.ActionNone, Status: models.StatusPushed},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ func TestCommitCommitEditorCmdObj(t *testing.T) {
|
|||||||
func TestCommitCreateFixupCommit(t *testing.T) {
|
func TestCommitCreateFixupCommit(t *testing.T) {
|
||||||
type scenario struct {
|
type scenario struct {
|
||||||
testName string
|
testName string
|
||||||
sha string
|
hash string
|
||||||
runner *oscommands.FakeCmdObjRunner
|
runner *oscommands.FakeCmdObjRunner
|
||||||
test func(error)
|
test func(error)
|
||||||
}
|
}
|
||||||
@ -161,7 +161,7 @@ func TestCommitCreateFixupCommit(t *testing.T) {
|
|||||||
scenarios := []scenario{
|
scenarios := []scenario{
|
||||||
{
|
{
|
||||||
testName: "valid case",
|
testName: "valid case",
|
||||||
sha: "12345",
|
hash: "12345",
|
||||||
runner: oscommands.NewFakeRunner(t).
|
runner: oscommands.NewFakeRunner(t).
|
||||||
ExpectGitArgs([]string{"commit", "--fixup=12345"}, "", nil),
|
ExpectGitArgs([]string{"commit", "--fixup=12345"}, "", nil),
|
||||||
test: func(err error) {
|
test: func(err error) {
|
||||||
@ -174,7 +174,7 @@ func TestCommitCreateFixupCommit(t *testing.T) {
|
|||||||
s := s
|
s := s
|
||||||
t.Run(s.testName, func(t *testing.T) {
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
instance := buildCommitCommands(commonDeps{runner: s.runner})
|
instance := buildCommitCommands(commonDeps{runner: s.runner})
|
||||||
s.test(instance.CreateFixupCommit(s.sha))
|
s.test(instance.CreateFixupCommit(s.hash))
|
||||||
s.runner.CheckForMissingCalls()
|
s.runner.CheckForMissingCalls()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -365,7 +365,7 @@ func TestGetCommitMessageFromHistory(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Default case to retrieve a commit in history",
|
"Default case to retrieve a commit in history",
|
||||||
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"log", "-1", "--skip=2", "--pretty=%H"}, "sha3 \n", nil).ExpectGitArgs([]string{"-c", "log.showsignature=false", "log", "--format=%B", "--max-count=1", "sha3"}, `use generics to DRY up context code`, nil),
|
oscommands.NewFakeRunner(t).ExpectGitArgs([]string{"log", "-1", "--skip=2", "--pretty=%H"}, "hash3 \n", nil).ExpectGitArgs([]string{"-c", "log.showsignature=false", "log", "--format=%B", "--max-count=1", "hash3"}, `use generics to DRY up context code`, nil),
|
||||||
func(output string, err error) {
|
func(output string, err error) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "use generics to DRY up context code", output)
|
assert.Equal(t, "use generics to DRY up context code", output)
|
||||||
|
@ -157,13 +157,13 @@ func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, s
|
|||||||
baseIndex := sourceCommitIdx + 1
|
baseIndex := sourceCommitIdx + 1
|
||||||
|
|
||||||
changes := []daemon.ChangeTodoAction{
|
changes := []daemon.ChangeTodoAction{
|
||||||
{Sha: commits[sourceCommitIdx].Sha, NewAction: todo.Edit},
|
{Hash: commits[sourceCommitIdx].Hash, NewAction: todo.Edit},
|
||||||
{Sha: commits[destinationCommitIdx].Sha, NewAction: todo.Edit},
|
{Hash: commits[destinationCommitIdx].Hash, NewAction: todo.Edit},
|
||||||
}
|
}
|
||||||
self.os.LogCommand(logTodoChanges(changes), false)
|
self.os.LogCommand(logTodoChanges(changes), false)
|
||||||
|
|
||||||
err := self.rebase.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
err := self.rebase.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: commits[baseIndex].Sha,
|
baseHashOrRoot: commits[baseIndex].Hash,
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
||||||
}).Run()
|
}).Run()
|
||||||
@ -219,7 +219,7 @@ func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, s
|
|||||||
|
|
||||||
func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitIdx int, stash bool) error {
|
func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitIdx int, stash bool) error {
|
||||||
if stash {
|
if stash {
|
||||||
if err := self.stash.Push(self.Tr.StashPrefix + commits[commitIdx].Sha); err != nil {
|
if err := self.stash.Push(self.Tr.StashPrefix + commits[commitIdx].Hash); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -324,7 +324,7 @@ func (self *PatchCommands) diffHeadAgainstCommit(commit *models.Commit) (string,
|
|||||||
cmdArgs := NewGitCmd("diff").
|
cmdArgs := NewGitCmd("diff").
|
||||||
Config("diff.noprefix=false").
|
Config("diff.noprefix=false").
|
||||||
Arg("--no-ext-diff").
|
Arg("--no-ext-diff").
|
||||||
Arg("HEAD.." + commit.Sha).
|
Arg("HEAD.." + commit.Hash).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).RunWithOutput()
|
return self.cmd.New(cmdArgs).RunWithOutput()
|
||||||
|
@ -56,13 +56,13 @@ func (self *RebaseCommands) RewordCommit(commits []*models.Commit, index int, su
|
|||||||
|
|
||||||
func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index int) (oscommands.ICmdObj, error) {
|
func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index int) (oscommands.ICmdObj, error) {
|
||||||
changes := []daemon.ChangeTodoAction{{
|
changes := []daemon.ChangeTodoAction{{
|
||||||
Sha: commits[index].Sha,
|
Hash: commits[index].Hash,
|
||||||
NewAction: todo.Reword,
|
NewAction: todo.Reword,
|
||||||
}}
|
}}
|
||||||
self.os.LogCommand(logTodoChanges(changes), false)
|
self.os.LogCommand(logTodoChanges(changes), false)
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: getBaseShaOrRoot(commits, index+1),
|
baseHashOrRoot: getBaseHashOrRoot(commits, index+1),
|
||||||
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ func (self *RebaseCommands) SetCommitAuthor(commits []*models.Commit, index int,
|
|||||||
|
|
||||||
func (self *RebaseCommands) AddCommitCoAuthor(commits []*models.Commit, index int, value string) error {
|
func (self *RebaseCommands) AddCommitCoAuthor(commits []*models.Commit, index int, value string) error {
|
||||||
return self.GenericAmend(commits, index, func() error {
|
return self.GenericAmend(commits, index, func() error {
|
||||||
return self.commit.AddCoAuthor(commits[index].Sha, value)
|
return self.commit.AddCoAuthor(commits[index].Hash, value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,29 +106,29 @@ func (self *RebaseCommands) GenericAmend(commits []*models.Commit, index int, f
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *RebaseCommands) MoveCommitsDown(commits []*models.Commit, startIdx int, endIdx int) error {
|
func (self *RebaseCommands) MoveCommitsDown(commits []*models.Commit, startIdx int, endIdx int) error {
|
||||||
baseShaOrRoot := getBaseShaOrRoot(commits, endIdx+2)
|
baseHashOrRoot := getBaseHashOrRoot(commits, endIdx+2)
|
||||||
|
|
||||||
shas := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) string {
|
hashes := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) string {
|
||||||
return commit.Sha
|
return commit.Hash
|
||||||
})
|
})
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: baseShaOrRoot,
|
baseHashOrRoot: baseHashOrRoot,
|
||||||
instruction: daemon.NewMoveTodosDownInstruction(shas),
|
instruction: daemon.NewMoveTodosDownInstruction(hashes),
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RebaseCommands) MoveCommitsUp(commits []*models.Commit, startIdx int, endIdx int) error {
|
func (self *RebaseCommands) MoveCommitsUp(commits []*models.Commit, startIdx int, endIdx int) error {
|
||||||
baseShaOrRoot := getBaseShaOrRoot(commits, endIdx+1)
|
baseHashOrRoot := getBaseHashOrRoot(commits, endIdx+1)
|
||||||
|
|
||||||
shas := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) string {
|
hashes := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) string {
|
||||||
return commit.Sha
|
return commit.Hash
|
||||||
})
|
})
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: baseShaOrRoot,
|
baseHashOrRoot: baseHashOrRoot,
|
||||||
instruction: daemon.NewMoveTodosUpInstruction(shas),
|
instruction: daemon.NewMoveTodosUpInstruction(hashes),
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
@ -139,11 +139,11 @@ func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, startIdx
|
|||||||
baseIndex++
|
baseIndex++
|
||||||
}
|
}
|
||||||
|
|
||||||
baseShaOrRoot := getBaseShaOrRoot(commits, baseIndex)
|
baseHashOrRoot := getBaseHashOrRoot(commits, baseIndex)
|
||||||
|
|
||||||
changes := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) daemon.ChangeTodoAction {
|
changes := lo.Map(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) daemon.ChangeTodoAction {
|
||||||
return daemon.ChangeTodoAction{
|
return daemon.ChangeTodoAction{
|
||||||
Sha: commit.Sha,
|
Hash: commit.Hash,
|
||||||
NewAction: action,
|
NewAction: action,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -151,7 +151,7 @@ func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, startIdx
|
|||||||
self.os.LogCommand(logTodoChanges(changes), false)
|
self.os.LogCommand(logTodoChanges(changes), false)
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: baseShaOrRoot,
|
baseHashOrRoot: baseHashOrRoot,
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
||||||
}).Run()
|
}).Run()
|
||||||
@ -166,7 +166,7 @@ func (self *RebaseCommands) EditRebase(branchRef string) error {
|
|||||||
)
|
)
|
||||||
self.os.LogCommand(msg, false)
|
self.os.LogCommand(msg, false)
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: branchRef,
|
baseHashOrRoot: branchRef,
|
||||||
instruction: daemon.NewInsertBreakInstruction(),
|
instruction: daemon.NewInsertBreakInstruction(),
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
@ -181,7 +181,7 @@ func (self *RebaseCommands) EditRebaseFromBaseCommit(targetBranchName string, ba
|
|||||||
)
|
)
|
||||||
self.os.LogCommand(msg, false)
|
self.os.LogCommand(msg, false)
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: baseCommit,
|
baseHashOrRoot: baseCommit,
|
||||||
onto: targetBranchName,
|
onto: targetBranchName,
|
||||||
instruction: daemon.NewInsertBreakInstruction(),
|
instruction: daemon.NewInsertBreakInstruction(),
|
||||||
}).Run()
|
}).Run()
|
||||||
@ -189,13 +189,13 @@ func (self *RebaseCommands) EditRebaseFromBaseCommit(targetBranchName string, ba
|
|||||||
|
|
||||||
func logTodoChanges(changes []daemon.ChangeTodoAction) string {
|
func logTodoChanges(changes []daemon.ChangeTodoAction) string {
|
||||||
changeTodoStr := strings.Join(lo.Map(changes, func(c daemon.ChangeTodoAction, _ int) string {
|
changeTodoStr := strings.Join(lo.Map(changes, func(c daemon.ChangeTodoAction, _ int) string {
|
||||||
return fmt.Sprintf("%s:%s", c.Sha, c.NewAction)
|
return fmt.Sprintf("%s:%s", c.Hash, c.NewAction)
|
||||||
}), "\n")
|
}), "\n")
|
||||||
return fmt.Sprintf("Changing TODO actions:\n%s", changeTodoStr)
|
return fmt.Sprintf("Changing TODO actions:\n%s", changeTodoStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
type PrepareInteractiveRebaseCommandOpts struct {
|
type PrepareInteractiveRebaseCommandOpts struct {
|
||||||
baseShaOrRoot string
|
baseHashOrRoot string
|
||||||
onto string
|
onto string
|
||||||
instruction daemon.Instruction
|
instruction daemon.Instruction
|
||||||
overrideEditor bool
|
overrideEditor bool
|
||||||
@ -216,7 +216,7 @@ func (self *RebaseCommands) PrepareInteractiveRebaseCommand(opts PrepareInteract
|
|||||||
Arg("--no-autosquash").
|
Arg("--no-autosquash").
|
||||||
ArgIf(self.version.IsAtLeast(2, 22, 0), "--rebase-merges").
|
ArgIf(self.version.IsAtLeast(2, 22, 0), "--rebase-merges").
|
||||||
ArgIf(opts.onto != "", "--onto", opts.onto).
|
ArgIf(opts.onto != "", "--onto", opts.onto).
|
||||||
Arg(opts.baseShaOrRoot).
|
Arg(opts.baseHashOrRoot).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
debug := "FALSE"
|
debug := "FALSE"
|
||||||
@ -284,21 +284,21 @@ func (self *RebaseCommands) GitRebaseEditTodo(todosFileContent []byte) error {
|
|||||||
func (self *RebaseCommands) AmendTo(commits []*models.Commit, commitIndex int) error {
|
func (self *RebaseCommands) AmendTo(commits []*models.Commit, commitIndex int) error {
|
||||||
commit := commits[commitIndex]
|
commit := commits[commitIndex]
|
||||||
|
|
||||||
if err := self.commit.CreateFixupCommit(commit.Sha); err != nil {
|
if err := self.commit.CreateFixupCommit(commit.Hash); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the sha of the commit we just created
|
// Get the hash of the commit we just created
|
||||||
cmdArgs := NewGitCmd("rev-parse").Arg("--verify", "HEAD").ToArgv()
|
cmdArgs := NewGitCmd("rev-parse").Arg("--verify", "HEAD").ToArgv()
|
||||||
fixupSha, err := self.cmd.New(cmdArgs).RunWithOutput()
|
fixupHash, err := self.cmd.New(cmdArgs).RunWithOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: getBaseShaOrRoot(commits, commitIndex+1),
|
baseHashOrRoot: getBaseHashOrRoot(commits, commitIndex+1),
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
instruction: daemon.NewMoveFixupCommitDownInstruction(commit.Sha, fixupSha),
|
instruction: daemon.NewMoveFixupCommitDownInstruction(commit.Hash, fixupHash),
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +306,7 @@ func todoFromCommit(commit *models.Commit) utils.Todo {
|
|||||||
if commit.Action == todo.UpdateRef {
|
if commit.Action == todo.UpdateRef {
|
||||||
return utils.Todo{Ref: commit.Name, Action: commit.Action}
|
return utils.Todo{Ref: commit.Name, Action: commit.Action}
|
||||||
} else {
|
} else {
|
||||||
return utils.Todo{Sha: commit.Sha, Action: commit.Action}
|
return utils.Todo{Hash: commit.Hash, Action: commit.Action}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +314,7 @@ func todoFromCommit(commit *models.Commit) utils.Todo {
|
|||||||
func (self *RebaseCommands) EditRebaseTodo(commits []*models.Commit, action todo.TodoCommand) error {
|
func (self *RebaseCommands) EditRebaseTodo(commits []*models.Commit, action todo.TodoCommand) error {
|
||||||
commitsWithAction := lo.Map(commits, func(commit *models.Commit, _ int) utils.TodoChange {
|
commitsWithAction := lo.Map(commits, func(commit *models.Commit, _ int) utils.TodoChange {
|
||||||
return utils.TodoChange{
|
return utils.TodoChange{
|
||||||
Sha: commit.Sha,
|
Hash: commit.Hash,
|
||||||
OldAction: commit.Action,
|
OldAction: commit.Action,
|
||||||
NewAction: action,
|
NewAction: action,
|
||||||
}
|
}
|
||||||
@ -364,13 +364,13 @@ func (self *RebaseCommands) MoveTodosUp(commits []*models.Commit) error {
|
|||||||
|
|
||||||
// SquashAllAboveFixupCommits squashes all fixup! commits above the given one
|
// SquashAllAboveFixupCommits squashes all fixup! commits above the given one
|
||||||
func (self *RebaseCommands) SquashAllAboveFixupCommits(commit *models.Commit) error {
|
func (self *RebaseCommands) SquashAllAboveFixupCommits(commit *models.Commit) error {
|
||||||
shaOrRoot := commit.Sha + "^"
|
hashOrRoot := commit.Hash + "^"
|
||||||
if commit.IsFirstCommit() {
|
if commit.IsFirstCommit() {
|
||||||
shaOrRoot = "--root"
|
hashOrRoot = "--root"
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdArgs := NewGitCmd("rebase").
|
cmdArgs := NewGitCmd("rebase").
|
||||||
Arg("--interactive", "--rebase-merges", "--autostash", "--autosquash", shaOrRoot).
|
Arg("--interactive", "--rebase-merges", "--autostash", "--autosquash", hashOrRoot).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.runSkipEditorCommand(self.cmd.New(cmdArgs))
|
return self.runSkipEditorCommand(self.cmd.New(cmdArgs))
|
||||||
@ -393,13 +393,13 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommit(
|
|||||||
}
|
}
|
||||||
|
|
||||||
changes := []daemon.ChangeTodoAction{{
|
changes := []daemon.ChangeTodoAction{{
|
||||||
Sha: commits[commitIndex].Sha,
|
Hash: commits[commitIndex].Hash,
|
||||||
NewAction: todo.Edit,
|
NewAction: todo.Edit,
|
||||||
}}
|
}}
|
||||||
self.os.LogCommand(logTodoChanges(changes), false)
|
self.os.LogCommand(logTodoChanges(changes), false)
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: getBaseShaOrRoot(commits, commitIndex+1),
|
baseHashOrRoot: getBaseHashOrRoot(commits, commitIndex+1),
|
||||||
overrideEditor: true,
|
overrideEditor: true,
|
||||||
keepCommitsThatBecomeEmpty: keepCommitsThatBecomeEmpty,
|
keepCommitsThatBecomeEmpty: keepCommitsThatBecomeEmpty,
|
||||||
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
instruction: daemon.NewChangeTodoActionsInstruction(changes),
|
||||||
@ -408,12 +408,12 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommit(
|
|||||||
|
|
||||||
// RebaseBranch interactive rebases onto a branch
|
// RebaseBranch interactive rebases onto a branch
|
||||||
func (self *RebaseCommands) RebaseBranch(branchName string) error {
|
func (self *RebaseCommands) RebaseBranch(branchName string) error {
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{baseShaOrRoot: branchName}).Run()
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{baseHashOrRoot: branchName}).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RebaseCommands) RebaseBranchFromBaseCommit(targetBranchName string, baseCommit string) error {
|
func (self *RebaseCommands) RebaseBranchFromBaseCommit(targetBranchName string, baseCommit string) error {
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: baseCommit,
|
baseHashOrRoot: baseCommit,
|
||||||
onto: targetBranchName,
|
onto: targetBranchName,
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
@ -503,10 +503,10 @@ func (self *RebaseCommands) DiscardOldFileChanges(commits []*models.Commit, comm
|
|||||||
return self.ContinueRebase()
|
return self.ContinueRebase()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CherryPickCommits begins an interactive rebase with the given shas being cherry picked onto HEAD
|
// CherryPickCommits begins an interactive rebase with the given hashes being cherry picked onto HEAD
|
||||||
func (self *RebaseCommands) CherryPickCommits(commits []*models.Commit) error {
|
func (self *RebaseCommands) CherryPickCommits(commits []*models.Commit) error {
|
||||||
commitLines := lo.Map(commits, func(commit *models.Commit, _ int) string {
|
commitLines := lo.Map(commits, func(commit *models.Commit, _ int) string {
|
||||||
return fmt.Sprintf("%s %s", utils.ShortSha(commit.Sha), commit.Name)
|
return fmt.Sprintf("%s %s", utils.ShortHash(commit.Hash), commit.Name)
|
||||||
})
|
})
|
||||||
msg := utils.ResolvePlaceholderString(
|
msg := utils.ResolvePlaceholderString(
|
||||||
self.Tr.Log.CherryPickCommits,
|
self.Tr.Log.CherryPickCommits,
|
||||||
@ -517,7 +517,7 @@ func (self *RebaseCommands) CherryPickCommits(commits []*models.Commit) error {
|
|||||||
self.os.LogCommand(msg, false)
|
self.os.LogCommand(msg, false)
|
||||||
|
|
||||||
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{
|
||||||
baseShaOrRoot: "HEAD",
|
baseHashOrRoot: "HEAD",
|
||||||
instruction: daemon.NewCherryPickCommitsInstruction(commits),
|
instruction: daemon.NewCherryPickCommitsInstruction(commits),
|
||||||
}).Run()
|
}).Run()
|
||||||
}
|
}
|
||||||
@ -538,13 +538,13 @@ func (self *RebaseCommands) CherryPickCommitsDuringRebase(commits []*models.Comm
|
|||||||
|
|
||||||
// we can't start an interactive rebase from the first commit without passing the
|
// we can't start an interactive rebase from the first commit without passing the
|
||||||
// '--root' arg
|
// '--root' arg
|
||||||
func getBaseShaOrRoot(commits []*models.Commit, index int) string {
|
func getBaseHashOrRoot(commits []*models.Commit, index int) string {
|
||||||
// We assume that the commits slice contains the initial commit of the repo.
|
// We assume that the commits slice contains the initial commit of the repo.
|
||||||
// Technically this assumption could prove false, but it's unlikely you'll
|
// Technically this assumption could prove false, but it's unlikely you'll
|
||||||
// be starting a rebase from 300 commits ago (which is the original commit limit
|
// be starting a rebase from 300 commits ago (which is the original commit limit
|
||||||
// at time of writing)
|
// at time of writing)
|
||||||
if index < len(commits) {
|
if index < len(commits) {
|
||||||
return commits[index].Sha
|
return commits[index].Hash
|
||||||
} else {
|
} else {
|
||||||
return "--root"
|
return "--root"
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) {
|
|||||||
{
|
{
|
||||||
testName: "returns error when using gpg",
|
testName: "returns error when using gpg",
|
||||||
gitConfigMockResponses: map[string]string{"commit.gpgsign": "true"},
|
gitConfigMockResponses: map[string]string{"commit.gpgsign": "true"},
|
||||||
commits: []*models.Commit{{Name: "commit", Sha: "123456"}},
|
commits: []*models.Commit{{Name: "commit", Hash: "123456"}},
|
||||||
commitIndex: 0,
|
commitIndex: 0,
|
||||||
fileName: []string{"test999.txt"},
|
fileName: []string{"test999.txt"},
|
||||||
runner: oscommands.NewFakeRunner(t),
|
runner: oscommands.NewFakeRunner(t),
|
||||||
@ -143,8 +143,8 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) {
|
|||||||
testName: "checks out file if it already existed",
|
testName: "checks out file if it already existed",
|
||||||
gitConfigMockResponses: nil,
|
gitConfigMockResponses: nil,
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit", Sha: "123456"},
|
{Name: "commit", Hash: "123456"},
|
||||||
{Name: "commit2", Sha: "abcdef"},
|
{Name: "commit2", Hash: "abcdef"},
|
||||||
},
|
},
|
||||||
commitIndex: 0,
|
commitIndex: 0,
|
||||||
fileName: []string{"test999.txt"},
|
fileName: []string{"test999.txt"},
|
||||||
|
@ -45,7 +45,7 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit
|
|||||||
}
|
}
|
||||||
|
|
||||||
// note that the unix timestamp here is the timestamp of the COMMIT, not the reflog entry itself,
|
// note that the unix timestamp here is the timestamp of the COMMIT, not the reflog entry itself,
|
||||||
// so two consecutive reflog entries may have both the same SHA and therefore same timestamp.
|
// so two consecutive reflog entries may have both the same hash and therefore same timestamp.
|
||||||
// We use the reflog message to disambiguate, and fingers crossed that we never see the same of those
|
// We use the reflog message to disambiguate, and fingers crossed that we never see the same of those
|
||||||
// twice in a row. Reason being that it would mean we'd be erroneously exiting early.
|
// twice in a row. Reason being that it would mean we'd be erroneously exiting early.
|
||||||
if lastReflogCommit != nil && self.sameReflogCommit(commit, lastReflogCommit) {
|
if lastReflogCommit != nil && self.sameReflogCommit(commit, lastReflogCommit) {
|
||||||
@ -65,7 +65,7 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *ReflogCommitLoader) sameReflogCommit(a *models.Commit, b *models.Commit) bool {
|
func (self *ReflogCommitLoader) sameReflogCommit(a *models.Commit, b *models.Commit) bool {
|
||||||
return a.Sha == b.Sha && a.UnixTimestamp == b.UnixTimestamp && a.Name == b.Name
|
return a.Hash == b.Hash && a.UnixTimestamp == b.UnixTimestamp && a.Name == b.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *ReflogCommitLoader) parseLine(line string) (*models.Commit, bool) {
|
func (self *ReflogCommitLoader) parseLine(line string) (*models.Commit, bool) {
|
||||||
@ -83,7 +83,7 @@ func (self *ReflogCommitLoader) parseLine(line string) (*models.Commit, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &models.Commit{
|
return &models.Commit{
|
||||||
Sha: fields[0],
|
Hash: fields[0],
|
||||||
Name: fields[2],
|
Name: fields[2],
|
||||||
UnixTimestamp: int64(unixTimestamp),
|
UnixTimestamp: int64(unixTimestamp),
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
|
@ -50,35 +50,35 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
lastReflogCommit: nil,
|
lastReflogCommit: nil,
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from A to B",
|
Name: "checkout: moving from A to B",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
Parents: []string{"51baa8c1"},
|
Parents: []string{"51baa8c1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from B to A",
|
Name: "checkout: moving from B to A",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
Parents: []string{"51baa8c1"},
|
Parents: []string{"51baa8c1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from A to B",
|
Name: "checkout: moving from A to B",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
Parents: []string{"51baa8c1"},
|
Parents: []string{"51baa8c1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from master to A",
|
Name: "checkout: moving from master to A",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
Parents: []string{"51baa8c1"},
|
Parents: []string{"51baa8c1"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Sha: "f4ddf2f0d4be4ccc7efa",
|
Hash: "f4ddf2f0d4be4ccc7efa",
|
||||||
Name: "checkout: moving from A to master",
|
Name: "checkout: moving from A to master",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643149435,
|
UnixTimestamp: 1643149435,
|
||||||
@ -94,7 +94,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, reflogOutput, nil),
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p"}, reflogOutput, nil),
|
||||||
|
|
||||||
lastReflogCommit: &models.Commit{
|
lastReflogCommit: &models.Commit{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from B to A",
|
Name: "checkout: moving from B to A",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
@ -102,7 +102,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from A to B",
|
Name: "checkout: moving from A to B",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
@ -118,7 +118,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--follow", "--", "path"}, reflogOutput, nil),
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--follow", "--", "path"}, reflogOutput, nil),
|
||||||
|
|
||||||
lastReflogCommit: &models.Commit{
|
lastReflogCommit: &models.Commit{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from B to A",
|
Name: "checkout: moving from B to A",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
@ -127,7 +127,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
filterPath: "path",
|
filterPath: "path",
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from A to B",
|
Name: "checkout: moving from A to B",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
@ -143,7 +143,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--author=John Doe <john@doe.com>"}, reflogOutput, nil),
|
ExpectGitArgs([]string{"-c", "log.showSignature=false", "log", "-g", "--abbrev=40", "--format=%h%x00%ct%x00%gs%x00%p", "--author=John Doe <john@doe.com>"}, reflogOutput, nil),
|
||||||
|
|
||||||
lastReflogCommit: &models.Commit{
|
lastReflogCommit: &models.Commit{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from B to A",
|
Name: "checkout: moving from B to A",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
@ -152,7 +152,7 @@ func TestGetReflogCommits(t *testing.T) {
|
|||||||
filterAuthor: "John Doe <john@doe.com>",
|
filterAuthor: "John Doe <john@doe.com>",
|
||||||
expectedCommits: []*models.Commit{
|
expectedCommits: []*models.Commit{
|
||||||
{
|
{
|
||||||
Sha: "c3c4b66b64c97ffeecde",
|
Hash: "c3c4b66b64c97ffeecde",
|
||||||
Name: "checkout: moving from A to B",
|
Name: "checkout: moving from A to B",
|
||||||
Status: models.StatusReflog,
|
Status: models.StatusReflog,
|
||||||
UnixTimestamp: 1643150483,
|
UnixTimestamp: 1643150483,
|
||||||
|
@ -60,24 +60,24 @@ func (self *StashCommands) Push(message string) error {
|
|||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StashCommands) Store(sha string, message string) error {
|
func (self *StashCommands) Store(hash string, message string) error {
|
||||||
trimmedMessage := strings.Trim(message, " \t")
|
trimmedMessage := strings.Trim(message, " \t")
|
||||||
|
|
||||||
cmdArgs := NewGitCmd("stash").Arg("store").
|
cmdArgs := NewGitCmd("stash").Arg("store").
|
||||||
ArgIf(trimmedMessage != "", "-m", trimmedMessage).
|
ArgIf(trimmedMessage != "", "-m", trimmedMessage).
|
||||||
Arg(sha).
|
Arg(hash).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StashCommands) Sha(index int) (string, error) {
|
func (self *StashCommands) Hash(index int) (string, error) {
|
||||||
cmdArgs := NewGitCmd("rev-parse").
|
cmdArgs := NewGitCmd("rev-parse").
|
||||||
Arg(fmt.Sprintf("refs/stash@{%d}", index)).
|
Arg(fmt.Sprintf("refs/stash@{%d}", index)).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
sha, _, err := self.cmd.New(cmdArgs).DontLog().RunWithOutputs()
|
hash, _, err := self.cmd.New(cmdArgs).DontLog().RunWithOutputs()
|
||||||
return strings.Trim(sha, "\r\n"), err
|
return strings.Trim(hash, "\r\n"), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StashCommands) ShowStashEntryCmdObj(index int) oscommands.ICmdObj {
|
func (self *StashCommands) ShowStashEntryCmdObj(index int) oscommands.ICmdObj {
|
||||||
@ -179,7 +179,7 @@ func (self *StashCommands) StashIncludeUntrackedChanges(message string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *StashCommands) Rename(index int, message string) error {
|
func (self *StashCommands) Rename(index int, message string) error {
|
||||||
sha, err := self.Sha(index)
|
hash, err := self.Hash(index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -188,7 +188,7 @@ func (self *StashCommands) Rename(index int, message string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = self.Store(sha, message)
|
err = self.Store(hash, message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func TestStashSave(t *testing.T) {
|
|||||||
func TestStashStore(t *testing.T) {
|
func TestStashStore(t *testing.T) {
|
||||||
type scenario struct {
|
type scenario struct {
|
||||||
testName string
|
testName string
|
||||||
sha string
|
hash string
|
||||||
message string
|
message string
|
||||||
expected []string
|
expected []string
|
||||||
}
|
}
|
||||||
@ -55,19 +55,19 @@ func TestStashStore(t *testing.T) {
|
|||||||
scenarios := []scenario{
|
scenarios := []scenario{
|
||||||
{
|
{
|
||||||
testName: "Non-empty message",
|
testName: "Non-empty message",
|
||||||
sha: "0123456789abcdef",
|
hash: "0123456789abcdef",
|
||||||
message: "New stash name",
|
message: "New stash name",
|
||||||
expected: []string{"stash", "store", "-m", "New stash name", "0123456789abcdef"},
|
expected: []string{"stash", "store", "-m", "New stash name", "0123456789abcdef"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "Empty message",
|
testName: "Empty message",
|
||||||
sha: "0123456789abcdef",
|
hash: "0123456789abcdef",
|
||||||
message: "",
|
message: "",
|
||||||
expected: []string{"stash", "store", "0123456789abcdef"},
|
expected: []string{"stash", "store", "0123456789abcdef"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "Space message",
|
testName: "Space message",
|
||||||
sha: "0123456789abcdef",
|
hash: "0123456789abcdef",
|
||||||
message: " ",
|
message: " ",
|
||||||
expected: []string{"stash", "store", "0123456789abcdef"},
|
expected: []string{"stash", "store", "0123456789abcdef"},
|
||||||
},
|
},
|
||||||
@ -80,20 +80,20 @@ func TestStashStore(t *testing.T) {
|
|||||||
ExpectGitArgs(s.expected, "", nil)
|
ExpectGitArgs(s.expected, "", nil)
|
||||||
instance := buildStashCommands(commonDeps{runner: runner})
|
instance := buildStashCommands(commonDeps{runner: runner})
|
||||||
|
|
||||||
assert.NoError(t, instance.Store(s.sha, s.message))
|
assert.NoError(t, instance.Store(s.hash, s.message))
|
||||||
runner.CheckForMissingCalls()
|
runner.CheckForMissingCalls()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStashSha(t *testing.T) {
|
func TestStashHash(t *testing.T) {
|
||||||
runner := oscommands.NewFakeRunner(t).
|
runner := oscommands.NewFakeRunner(t).
|
||||||
ExpectGitArgs([]string{"rev-parse", "refs/stash@{5}"}, "14d94495194651adfd5f070590df566c11d28243\n", nil)
|
ExpectGitArgs([]string{"rev-parse", "refs/stash@{5}"}, "14d94495194651adfd5f070590df566c11d28243\n", nil)
|
||||||
instance := buildStashCommands(commonDeps{runner: runner})
|
instance := buildStashCommands(commonDeps{runner: runner})
|
||||||
|
|
||||||
sha, err := instance.Sha(5)
|
hash, err := instance.Hash(5)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "14d94495194651adfd5f070590df566c11d28243", sha)
|
assert.Equal(t, "14d94495194651adfd5f070590df566c11d28243", hash)
|
||||||
runner.CheckForMissingCalls()
|
runner.CheckForMissingCalls()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,8 +153,8 @@ func TestStashRename(t *testing.T) {
|
|||||||
testName string
|
testName string
|
||||||
index int
|
index int
|
||||||
message string
|
message string
|
||||||
expectedShaCmd []string
|
expectedHashCmd []string
|
||||||
shaResult string
|
hashResult string
|
||||||
expectedDropCmd []string
|
expectedDropCmd []string
|
||||||
expectedStoreCmd []string
|
expectedStoreCmd []string
|
||||||
}
|
}
|
||||||
@ -164,8 +164,8 @@ func TestStashRename(t *testing.T) {
|
|||||||
testName: "Default case",
|
testName: "Default case",
|
||||||
index: 3,
|
index: 3,
|
||||||
message: "New message",
|
message: "New message",
|
||||||
expectedShaCmd: []string{"rev-parse", "refs/stash@{3}"},
|
expectedHashCmd: []string{"rev-parse", "refs/stash@{3}"},
|
||||||
shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
hashResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
||||||
expectedDropCmd: []string{"stash", "drop", "stash@{3}"},
|
expectedDropCmd: []string{"stash", "drop", "stash@{3}"},
|
||||||
expectedStoreCmd: []string{"stash", "store", "-m", "New message", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
expectedStoreCmd: []string{"stash", "store", "-m", "New message", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
||||||
},
|
},
|
||||||
@ -173,8 +173,8 @@ func TestStashRename(t *testing.T) {
|
|||||||
testName: "Empty message",
|
testName: "Empty message",
|
||||||
index: 4,
|
index: 4,
|
||||||
message: "",
|
message: "",
|
||||||
expectedShaCmd: []string{"rev-parse", "refs/stash@{4}"},
|
expectedHashCmd: []string{"rev-parse", "refs/stash@{4}"},
|
||||||
shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
hashResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
||||||
expectedDropCmd: []string{"stash", "drop", "stash@{4}"},
|
expectedDropCmd: []string{"stash", "drop", "stash@{4}"},
|
||||||
expectedStoreCmd: []string{"stash", "store", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
expectedStoreCmd: []string{"stash", "store", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
||||||
},
|
},
|
||||||
@ -184,7 +184,7 @@ func TestStashRename(t *testing.T) {
|
|||||||
s := s
|
s := s
|
||||||
t.Run(s.testName, func(t *testing.T) {
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
runner := oscommands.NewFakeRunner(t).
|
runner := oscommands.NewFakeRunner(t).
|
||||||
ExpectGitArgs(s.expectedShaCmd, s.shaResult, nil).
|
ExpectGitArgs(s.expectedHashCmd, s.hashResult, nil).
|
||||||
ExpectGitArgs(s.expectedDropCmd, "", nil).
|
ExpectGitArgs(s.expectedDropCmd, "", nil).
|
||||||
ExpectGitArgs(s.expectedStoreCmd, "", nil)
|
ExpectGitArgs(s.expectedStoreCmd, "", nil)
|
||||||
instance := buildStashCommands(commonDeps{runner: runner})
|
instance := buildStashCommands(commonDeps{runner: runner})
|
||||||
|
@ -313,8 +313,8 @@ func (self *WorkingTreeCommands) ShowFileDiffCmdObj(from string, to string, reve
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CheckoutFile checks out the file for the given commit
|
// CheckoutFile checks out the file for the given commit
|
||||||
func (self *WorkingTreeCommands) CheckoutFile(commitSha, fileName string) error {
|
func (self *WorkingTreeCommands) CheckoutFile(commitHash, fileName string) error {
|
||||||
cmdArgs := NewGitCmd("checkout").Arg(commitSha, "--", fileName).
|
cmdArgs := NewGitCmd("checkout").Arg(commitHash, "--", fileName).
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
|
@ -398,7 +398,7 @@ func TestWorkingTreeShowFileDiff(t *testing.T) {
|
|||||||
func TestWorkingTreeCheckoutFile(t *testing.T) {
|
func TestWorkingTreeCheckoutFile(t *testing.T) {
|
||||||
type scenario struct {
|
type scenario struct {
|
||||||
testName string
|
testName string
|
||||||
commitSha string
|
commitHash string
|
||||||
fileName string
|
fileName string
|
||||||
runner *oscommands.FakeCmdObjRunner
|
runner *oscommands.FakeCmdObjRunner
|
||||||
test func(error)
|
test func(error)
|
||||||
@ -407,7 +407,7 @@ func TestWorkingTreeCheckoutFile(t *testing.T) {
|
|||||||
scenarios := []scenario{
|
scenarios := []scenario{
|
||||||
{
|
{
|
||||||
testName: "typical case",
|
testName: "typical case",
|
||||||
commitSha: "11af912",
|
commitHash: "11af912",
|
||||||
fileName: "test999.txt",
|
fileName: "test999.txt",
|
||||||
runner: oscommands.NewFakeRunner(t).
|
runner: oscommands.NewFakeRunner(t).
|
||||||
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", nil),
|
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", nil),
|
||||||
@ -417,7 +417,7 @@ func TestWorkingTreeCheckoutFile(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "returns error if there is one",
|
testName: "returns error if there is one",
|
||||||
commitSha: "11af912",
|
commitHash: "11af912",
|
||||||
fileName: "test999.txt",
|
fileName: "test999.txt",
|
||||||
runner: oscommands.NewFakeRunner(t).
|
runner: oscommands.NewFakeRunner(t).
|
||||||
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", errors.New("error")),
|
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", errors.New("error")),
|
||||||
@ -432,7 +432,7 @@ func TestWorkingTreeCheckoutFile(t *testing.T) {
|
|||||||
t.Run(s.testName, func(t *testing.T) {
|
t.Run(s.testName, func(t *testing.T) {
|
||||||
instance := buildWorkingTreeCommands(commonDeps{runner: s.runner})
|
instance := buildWorkingTreeCommands(commonDeps{runner: s.runner})
|
||||||
|
|
||||||
s.test(instance.CheckoutFile(s.commitSha, s.fileName))
|
s.test(instance.CheckoutFile(s.commitHash, s.fileName))
|
||||||
s.runner.CheckForMissingCalls()
|
s.runner.CheckForMissingCalls()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ var githubServiceDef = ServiceDefinition{
|
|||||||
provider: "github",
|
provider: "github",
|
||||||
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}?expand=1",
|
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}?expand=1",
|
||||||
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}?expand=1",
|
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}?expand=1",
|
||||||
commitURL: "/commit/{{.CommitSha}}",
|
commitURL: "/commit/{{.CommitHash}}",
|
||||||
regexStrings: defaultUrlRegexStrings,
|
regexStrings: defaultUrlRegexStrings,
|
||||||
repoURLTemplate: defaultRepoURLTemplate,
|
repoURLTemplate: defaultRepoURLTemplate,
|
||||||
}
|
}
|
||||||
@ -23,7 +23,7 @@ var bitbucketServiceDef = ServiceDefinition{
|
|||||||
provider: "bitbucket",
|
provider: "bitbucket",
|
||||||
pullRequestURLIntoDefaultBranch: "/pull-requests/new?source={{.From}}&t=1",
|
pullRequestURLIntoDefaultBranch: "/pull-requests/new?source={{.From}}&t=1",
|
||||||
pullRequestURLIntoTargetBranch: "/pull-requests/new?source={{.From}}&dest={{.To}}&t=1",
|
pullRequestURLIntoTargetBranch: "/pull-requests/new?source={{.From}}&dest={{.To}}&t=1",
|
||||||
commitURL: "/commits/{{.CommitSha}}",
|
commitURL: "/commits/{{.CommitHash}}",
|
||||||
regexStrings: []string{
|
regexStrings: []string{
|
||||||
`^(?:https?|ssh)://.*/(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
`^(?:https?|ssh)://.*/(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
`^.*@.*:(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
`^.*@.*:(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
@ -35,7 +35,7 @@ var gitLabServiceDef = ServiceDefinition{
|
|||||||
provider: "gitlab",
|
provider: "gitlab",
|
||||||
pullRequestURLIntoDefaultBranch: "/-/merge_requests/new?merge_request[source_branch]={{.From}}",
|
pullRequestURLIntoDefaultBranch: "/-/merge_requests/new?merge_request[source_branch]={{.From}}",
|
||||||
pullRequestURLIntoTargetBranch: "/-/merge_requests/new?merge_request[source_branch]={{.From}}&merge_request[target_branch]={{.To}}",
|
pullRequestURLIntoTargetBranch: "/-/merge_requests/new?merge_request[source_branch]={{.From}}&merge_request[target_branch]={{.To}}",
|
||||||
commitURL: "/-/commit/{{.CommitSha}}",
|
commitURL: "/-/commit/{{.CommitHash}}",
|
||||||
regexStrings: defaultUrlRegexStrings,
|
regexStrings: defaultUrlRegexStrings,
|
||||||
repoURLTemplate: defaultRepoURLTemplate,
|
repoURLTemplate: defaultRepoURLTemplate,
|
||||||
}
|
}
|
||||||
@ -44,7 +44,7 @@ var azdoServiceDef = ServiceDefinition{
|
|||||||
provider: "azuredevops",
|
provider: "azuredevops",
|
||||||
pullRequestURLIntoDefaultBranch: "/pullrequestcreate?sourceRef={{.From}}",
|
pullRequestURLIntoDefaultBranch: "/pullrequestcreate?sourceRef={{.From}}",
|
||||||
pullRequestURLIntoTargetBranch: "/pullrequestcreate?sourceRef={{.From}}&targetRef={{.To}}",
|
pullRequestURLIntoTargetBranch: "/pullrequestcreate?sourceRef={{.From}}&targetRef={{.To}}",
|
||||||
commitURL: "/commit/{{.CommitSha}}",
|
commitURL: "/commit/{{.CommitHash}}",
|
||||||
regexStrings: []string{
|
regexStrings: []string{
|
||||||
`^git@ssh.dev.azure.com.*/(?P<org>.*)/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
`^git@ssh.dev.azure.com.*/(?P<org>.*)/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
`^https://.*@dev.azure.com/(?P<org>.*?)/(?P<project>.*?)/_git/(?P<repo>.*?)(?:\.git)?$`,
|
`^https://.*@dev.azure.com/(?P<org>.*?)/(?P<project>.*?)/_git/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
@ -56,7 +56,7 @@ var bitbucketServerServiceDef = ServiceDefinition{
|
|||||||
provider: "bitbucketServer",
|
provider: "bitbucketServer",
|
||||||
pullRequestURLIntoDefaultBranch: "/pull-requests?create&sourceBranch={{.From}}",
|
pullRequestURLIntoDefaultBranch: "/pull-requests?create&sourceBranch={{.From}}",
|
||||||
pullRequestURLIntoTargetBranch: "/pull-requests?create&targetBranch={{.To}}&sourceBranch={{.From}}",
|
pullRequestURLIntoTargetBranch: "/pull-requests?create&targetBranch={{.To}}&sourceBranch={{.From}}",
|
||||||
commitURL: "/commits/{{.CommitSha}}",
|
commitURL: "/commits/{{.CommitHash}}",
|
||||||
regexStrings: []string{
|
regexStrings: []string{
|
||||||
`^ssh://git@.*/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
`^ssh://git@.*/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
`^https://.*/scm/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
`^https://.*/scm/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`,
|
||||||
@ -68,7 +68,7 @@ var giteaServiceDef = ServiceDefinition{
|
|||||||
provider: "gitea",
|
provider: "gitea",
|
||||||
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}",
|
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}",
|
||||||
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}",
|
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}",
|
||||||
commitURL: "/commit/{{.CommitSha}}",
|
commitURL: "/commit/{{.CommitHash}}",
|
||||||
regexStrings: defaultUrlRegexStrings,
|
regexStrings: defaultUrlRegexStrings,
|
||||||
repoURLTemplate: defaultRepoURLTemplate,
|
repoURLTemplate: defaultRepoURLTemplate,
|
||||||
}
|
}
|
||||||
|
@ -51,13 +51,13 @@ func (self *HostingServiceMgr) GetPullRequestURL(from string, to string) (string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *HostingServiceMgr) GetCommitURL(commitSha string) (string, error) {
|
func (self *HostingServiceMgr) GetCommitURL(commitHash string) (string, error) {
|
||||||
gitService, err := self.getService()
|
gitService, err := self.getService()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
pullRequestURL := gitService.getCommitURL(commitSha)
|
pullRequestURL := gitService.getCommitURL(commitHash)
|
||||||
|
|
||||||
return pullRequestURL, nil
|
return pullRequestURL, nil
|
||||||
}
|
}
|
||||||
@ -174,8 +174,8 @@ func (self *Service) getPullRequestURLIntoTargetBranch(from string, to string) s
|
|||||||
return self.resolveUrl(self.pullRequestURLIntoTargetBranch, map[string]string{"From": from, "To": to})
|
return self.resolveUrl(self.pullRequestURLIntoTargetBranch, map[string]string{"From": from, "To": to})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Service) getCommitURL(commitSha string) string {
|
func (self *Service) getCommitURL(commitHash string) string {
|
||||||
return self.resolveUrl(self.commitURL, map[string]string{"CommitSha": commitSha})
|
return self.resolveUrl(self.commitURL, map[string]string{"CommitHash": commitHash})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Service) resolveUrl(templateString string, args map[string]string) string {
|
func (self *Service) resolveUrl(templateString string, args map[string]string) string {
|
||||||
|
@ -43,7 +43,7 @@ const (
|
|||||||
|
|
||||||
// Commit : A git commit
|
// Commit : A git commit
|
||||||
type Commit struct {
|
type Commit struct {
|
||||||
Sha string
|
Hash string
|
||||||
Name string
|
Name string
|
||||||
Status CommitStatus
|
Status CommitStatus
|
||||||
Action todo.TodoCommand
|
Action todo.TodoCommand
|
||||||
@ -54,20 +54,20 @@ type Commit struct {
|
|||||||
UnixTimestamp int64
|
UnixTimestamp int64
|
||||||
Divergence Divergence // set to DivergenceNone unless we are showing the divergence view
|
Divergence Divergence // set to DivergenceNone unless we are showing the divergence view
|
||||||
|
|
||||||
// SHAs of parent commits (will be multiple if it's a merge commit)
|
// Hashes of parent commits (will be multiple if it's a merge commit)
|
||||||
Parents []string
|
Parents []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) ShortSha() string {
|
func (c *Commit) ShortHash() string {
|
||||||
return utils.ShortSha(c.Sha)
|
return utils.ShortHash(c.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) FullRefName() string {
|
func (c *Commit) FullRefName() string {
|
||||||
return c.Sha
|
return c.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) RefName() string {
|
func (c *Commit) RefName() string {
|
||||||
return c.Sha
|
return c.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) ParentRefName() string {
|
func (c *Commit) ParentRefName() string {
|
||||||
@ -86,7 +86,7 @@ func (c *Commit) ID() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) Description() string {
|
func (c *Commit) Description() string {
|
||||||
return fmt.Sprintf("%s %s", c.Sha[:7], c.Name)
|
return fmt.Sprintf("%s %s", c.Hash[:7], c.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Commit) IsMerge() bool {
|
func (c *Commit) IsMerge() bool {
|
||||||
|
@ -33,7 +33,7 @@ type (
|
|||||||
|
|
||||||
// PatchBuilder manages the building of a patch for a commit to be applied to another commit (or the working tree, or removed from the current commit). We also support building patches from things like stashes, for which there is less flexibility
|
// PatchBuilder manages the building of a patch for a commit to be applied to another commit (or the working tree, or removed from the current commit). We also support building patches from things like stashes, for which there is less flexibility
|
||||||
type PatchBuilder struct {
|
type PatchBuilder struct {
|
||||||
// To is the commit sha if we're dealing with files of a commit, or a stash ref for a stash
|
// To is the commit hash if we're dealing with files of a commit, or a stash ref for a stash
|
||||||
To string
|
To string
|
||||||
From string
|
From string
|
||||||
reverse bool
|
reverse bool
|
||||||
@ -46,7 +46,7 @@ type PatchBuilder struct {
|
|||||||
fileInfoMap map[string]*fileInfo
|
fileInfoMap map[string]*fileInfo
|
||||||
Log *logrus.Entry
|
Log *logrus.Entry
|
||||||
|
|
||||||
// loadFileDiff loads the diff of a file, for a given to (typically a commit SHA)
|
// loadFileDiff loads the diff of a file, for a given to (typically a commit hash)
|
||||||
loadFileDiff loadFileDiffFunc
|
loadFileDiff loadFileDiffFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,12 +29,12 @@ func NewLocalCommitsContext(c *ContextCommon) *LocalCommitsContext {
|
|||||||
)
|
)
|
||||||
|
|
||||||
getDisplayStrings := func(startIdx int, endIdx int) [][]string {
|
getDisplayStrings := func(startIdx int, endIdx int) [][]string {
|
||||||
selectedCommitSha := ""
|
selectedCommitHash := ""
|
||||||
|
|
||||||
if c.CurrentContext().GetKey() == LOCAL_COMMITS_CONTEXT_KEY {
|
if c.CurrentContext().GetKey() == LOCAL_COMMITS_CONTEXT_KEY {
|
||||||
selectedCommit := viewModel.GetSelected()
|
selectedCommit := viewModel.GetSelected()
|
||||||
if selectedCommit != nil {
|
if selectedCommit != nil {
|
||||||
selectedCommitSha = selectedCommit.Sha
|
selectedCommitHash = selectedCommit.Hash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,14 +48,14 @@ func NewLocalCommitsContext(c *ContextCommon) *LocalCommitsContext {
|
|||||||
c.Model().CheckedOutBranch,
|
c.Model().CheckedOutBranch,
|
||||||
hasRebaseUpdateRefsConfig,
|
hasRebaseUpdateRefsConfig,
|
||||||
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
||||||
c.Modes().CherryPicking.SelectedShaSet(),
|
c.Modes().CherryPicking.SelectedHashSet(),
|
||||||
c.Modes().Diffing.Ref,
|
c.Modes().Diffing.Ref,
|
||||||
c.Modes().MarkedBaseCommit.GetSha(),
|
c.Modes().MarkedBaseCommit.GetHash(),
|
||||||
c.UserConfig.Gui.TimeFormat,
|
c.UserConfig.Gui.TimeFormat,
|
||||||
c.UserConfig.Gui.ShortTimeFormat,
|
c.UserConfig.Gui.ShortTimeFormat,
|
||||||
time.Now(),
|
time.Now(),
|
||||||
c.UserConfig.Git.ParseEmoji,
|
c.UserConfig.Git.ParseEmoji,
|
||||||
selectedCommitSha,
|
selectedCommitHash,
|
||||||
startIdx,
|
startIdx,
|
||||||
endIdx,
|
endIdx,
|
||||||
shouldShowGraph(c),
|
shouldShowGraph(c),
|
||||||
@ -133,7 +133,7 @@ func (self *LocalCommitsContext) GetSelectedCommitHash() string {
|
|||||||
if commit == nil {
|
if commit == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return commit.Sha
|
return commit.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsContext) SelectCommitByHash(hash string) bool {
|
func (self *LocalCommitsContext) SelectCommitByHash(hash string) bool {
|
||||||
@ -141,7 +141,7 @@ func (self *LocalCommitsContext) SelectCommitByHash(hash string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, idx, found := lo.FindIndexOf(self.GetItems(), func(c *models.Commit) bool { return c.Sha == hash }); found {
|
if _, idx, found := lo.FindIndexOf(self.GetItems(), func(c *models.Commit) bool { return c.Hash == hash }); found {
|
||||||
self.SetSelection(idx)
|
self.SetSelection(idx)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ func NewReflogCommitsContext(c *ContextCommon) *ReflogCommitsContext {
|
|||||||
viewModel := NewFilteredListViewModel(
|
viewModel := NewFilteredListViewModel(
|
||||||
func() []*models.Commit { return c.Model().FilteredReflogCommits },
|
func() []*models.Commit { return c.Model().FilteredReflogCommits },
|
||||||
func(commit *models.Commit) []string {
|
func(commit *models.Commit) []string {
|
||||||
return []string{commit.ShortSha(), commit.Name}
|
return []string{commit.ShortHash(), commit.Name}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ func NewReflogCommitsContext(c *ContextCommon) *ReflogCommitsContext {
|
|||||||
return presentation.GetReflogCommitListDisplayStrings(
|
return presentation.GetReflogCommitListDisplayStrings(
|
||||||
viewModel.GetItems(),
|
viewModel.GetItems(),
|
||||||
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
||||||
c.Modes().CherryPicking.SelectedShaSet(),
|
c.Modes().CherryPicking.SelectedHashSet(),
|
||||||
c.Modes().Diffing.Ref,
|
c.Modes().Diffing.Ref,
|
||||||
time.Now(),
|
time.Now(),
|
||||||
c.UserConfig.Gui.TimeFormat,
|
c.UserConfig.Gui.TimeFormat,
|
||||||
|
@ -44,11 +44,11 @@ func NewSubCommitsContext(
|
|||||||
return [][]string{}
|
return [][]string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedCommitSha := ""
|
selectedCommitHash := ""
|
||||||
if c.CurrentContext().GetKey() == SUB_COMMITS_CONTEXT_KEY {
|
if c.CurrentContext().GetKey() == SUB_COMMITS_CONTEXT_KEY {
|
||||||
selectedCommit := viewModel.GetSelected()
|
selectedCommit := viewModel.GetSelected()
|
||||||
if selectedCommit != nil {
|
if selectedCommit != nil {
|
||||||
selectedCommitSha = selectedCommit.Sha
|
selectedCommitHash = selectedCommit.Hash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
branches := []*models.Branch{}
|
branches := []*models.Branch{}
|
||||||
@ -63,14 +63,14 @@ func NewSubCommitsContext(
|
|||||||
viewModel.GetRef().RefName(),
|
viewModel.GetRef().RefName(),
|
||||||
hasRebaseUpdateRefsConfig,
|
hasRebaseUpdateRefsConfig,
|
||||||
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
c.State().GetRepoState().GetScreenMode() != types.SCREEN_NORMAL,
|
||||||
c.Modes().CherryPicking.SelectedShaSet(),
|
c.Modes().CherryPicking.SelectedHashSet(),
|
||||||
c.Modes().Diffing.Ref,
|
c.Modes().Diffing.Ref,
|
||||||
"",
|
"",
|
||||||
c.UserConfig.Gui.TimeFormat,
|
c.UserConfig.Gui.TimeFormat,
|
||||||
c.UserConfig.Gui.ShortTimeFormat,
|
c.UserConfig.Gui.ShortTimeFormat,
|
||||||
time.Now(),
|
time.Now(),
|
||||||
c.UserConfig.Git.ParseEmoji,
|
c.UserConfig.Git.ParseEmoji,
|
||||||
selectedCommitSha,
|
selectedCommitHash,
|
||||||
startIdx,
|
startIdx,
|
||||||
endIdx,
|
endIdx,
|
||||||
// Don't show the graph in the left/right view; we'd like to, but
|
// Don't show the graph in the left/right view; we'd like to, but
|
||||||
|
@ -125,9 +125,9 @@ func (self *BasicCommitsController) copyCommitAttribute(commit *models.Commit) e
|
|||||||
Title: self.c.Tr.Actions.CopyCommitAttributeToClipboard,
|
Title: self.c.Tr.Actions.CopyCommitAttributeToClipboard,
|
||||||
Items: []*types.MenuItem{
|
Items: []*types.MenuItem{
|
||||||
{
|
{
|
||||||
Label: self.c.Tr.CommitSha,
|
Label: self.c.Tr.CommitHash,
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
return self.copyCommitSHAToClipboard(commit)
|
return self.copyCommitHashToClipboard(commit)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -169,18 +169,18 @@ func (self *BasicCommitsController) copyCommitAttribute(commit *models.Commit) e
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyCommitSHAToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyCommitHashToClipboard(commit *models.Commit) error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.CopyCommitSHAToClipboard)
|
self.c.LogAction(self.c.Tr.Actions.CopyCommitHashToClipboard)
|
||||||
if err := self.c.OS().CopyToClipboard(commit.Sha); err != nil {
|
if err := self.c.OS().CopyToClipboard(commit.Hash); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.c.Toast(fmt.Sprintf("'%s' %s", commit.Sha, self.c.Tr.CopiedToClipboard))
|
self.c.Toast(fmt.Sprintf("'%s' %s", commit.Hash, self.c.Tr.CopiedToClipboard))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyCommitURLToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyCommitURLToClipboard(commit *models.Commit) error {
|
||||||
url, err := self.c.Helpers().Host.GetCommitURL(commit.Sha)
|
url, err := self.c.Helpers().Host.GetCommitURL(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -195,7 +195,7 @@ func (self *BasicCommitsController) copyCommitURLToClipboard(commit *models.Comm
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyCommitDiffToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyCommitDiffToClipboard(commit *models.Commit) error {
|
||||||
diff, err := self.c.Git().Commit.GetCommitDiff(commit.Sha)
|
diff, err := self.c.Git().Commit.GetCommitDiff(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -210,7 +210,7 @@ func (self *BasicCommitsController) copyCommitDiffToClipboard(commit *models.Com
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyAuthorToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyAuthorToClipboard(commit *models.Commit) error {
|
||||||
author, err := self.c.Git().Commit.GetCommitAuthor(commit.Sha)
|
author, err := self.c.Git().Commit.GetCommitAuthor(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -227,7 +227,7 @@ func (self *BasicCommitsController) copyAuthorToClipboard(commit *models.Commit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyCommitMessageToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyCommitMessageToClipboard(commit *models.Commit) error {
|
||||||
message, err := self.c.Git().Commit.GetCommitMessage(commit.Sha)
|
message, err := self.c.Git().Commit.GetCommitMessage(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -242,7 +242,7 @@ func (self *BasicCommitsController) copyCommitMessageToClipboard(commit *models.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) copyCommitSubjectToClipboard(commit *models.Commit) error {
|
func (self *BasicCommitsController) copyCommitSubjectToClipboard(commit *models.Commit) error {
|
||||||
message, err := self.c.Git().Commit.GetCommitSubject(commit.Sha)
|
message, err := self.c.Git().Commit.GetCommitSubject(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ func (self *BasicCommitsController) copyCommitSubjectToClipboard(commit *models.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) openInBrowser(commit *models.Commit) error {
|
func (self *BasicCommitsController) openInBrowser(commit *models.Commit) error {
|
||||||
url, err := self.c.Helpers().Host.GetCommitURL(commit.Sha)
|
url, err := self.c.Helpers().Host.GetCommitURL(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -275,7 +275,7 @@ func (self *BasicCommitsController) newBranch(commit *models.Commit) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) createResetMenu(commit *models.Commit) error {
|
func (self *BasicCommitsController) createResetMenu(commit *models.Commit) error {
|
||||||
return self.c.Helpers().Refs.CreateGitResetMenu(commit.Sha)
|
return self.c.Helpers().Refs.CreateGitResetMenu(commit.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BasicCommitsController) checkout(commit *models.Commit) error {
|
func (self *BasicCommitsController) checkout(commit *models.Commit) error {
|
||||||
@ -284,7 +284,7 @@ func (self *BasicCommitsController) checkout(commit *models.Commit) error {
|
|||||||
Prompt: self.c.Tr.SureCheckoutThisCommit,
|
Prompt: self.c.Tr.SureCheckoutThisCommit,
|
||||||
HandleConfirm: func() error {
|
HandleConfirm: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.CheckoutCommit)
|
self.c.LogAction(self.c.Tr.Actions.CheckoutCommit)
|
||||||
return self.c.Helpers().Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{})
|
return self.c.Helpers().Refs.CheckoutRef(commit.Hash, types.CheckoutRefOptions{})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -295,7 +295,7 @@ func (self *BasicCommitsController) copyRange(*models.Commit) error {
|
|||||||
|
|
||||||
func (self *BasicCommitsController) canCopyCommits(selectedCommits []*models.Commit, startIdx int, endIdx int) *types.DisabledReason {
|
func (self *BasicCommitsController) canCopyCommits(selectedCommits []*models.Commit, startIdx int, endIdx int) *types.DisabledReason {
|
||||||
for _, commit := range selectedCommits {
|
for _, commit := range selectedCommits {
|
||||||
if commit.Sha == "" {
|
if commit.Hash == "" {
|
||||||
return &types.DisabledReason{Text: self.c.Tr.CannotCherryPickNonCommit, ShowErrorInPanel: true}
|
return &types.DisabledReason{Text: self.c.Tr.CannotCherryPickNonCommit, ShowErrorInPanel: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,18 +69,18 @@ func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, c
|
|||||||
// Originally we were allowing the user to, from the bisect menu, select whether
|
// Originally we were allowing the user to, from the bisect menu, select whether
|
||||||
// they were talking about the selected commit or the current bisect commit,
|
// they were talking about the selected commit or the current bisect commit,
|
||||||
// and that was a bit confusing (and required extra keypresses).
|
// and that was a bit confusing (and required extra keypresses).
|
||||||
selectCurrentAfter := info.GetCurrentSha() == "" || info.GetCurrentSha() == commit.Sha
|
selectCurrentAfter := info.GetCurrentHash() == "" || info.GetCurrentHash() == commit.Hash
|
||||||
// we need to wait to reselect if our bisect commits aren't ancestors of our 'start'
|
// we need to wait to reselect if our bisect commits aren't ancestors of our 'start'
|
||||||
// ref, because we'll be reloading our commits in that case.
|
// ref, because we'll be reloading our commits in that case.
|
||||||
waitToReselect := selectCurrentAfter && !self.c.Git().Bisect.ReachableFromStart(info)
|
waitToReselect := selectCurrentAfter && !self.c.Git().Bisect.ReachableFromStart(info)
|
||||||
|
|
||||||
// If we have a current sha already, then we always want to use that one. If
|
// If we have a current hash already, then we always want to use that one. If
|
||||||
// not, we're still picking the initial commits before we really start, so
|
// not, we're still picking the initial commits before we really start, so
|
||||||
// use the selected commit in that case.
|
// use the selected commit in that case.
|
||||||
|
|
||||||
bisecting := info.GetCurrentSha() != ""
|
bisecting := info.GetCurrentHash() != ""
|
||||||
shaToMark := lo.Ternary(bisecting, info.GetCurrentSha(), commit.Sha)
|
hashToMark := lo.Ternary(bisecting, info.GetCurrentHash(), commit.Hash)
|
||||||
shortShaToMark := utils.ShortSha(shaToMark)
|
shortHashToMark := utils.ShortHash(hashToMark)
|
||||||
|
|
||||||
// For marking a commit as bad, when we're not already bisecting, we require
|
// For marking a commit as bad, when we're not already bisecting, we require
|
||||||
// a single item selected, but once we are bisecting, it doesn't matter because
|
// a single item selected, but once we are bisecting, it doesn't matter because
|
||||||
@ -92,10 +92,10 @@ func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, c
|
|||||||
|
|
||||||
menuItems := []*types.MenuItem{
|
menuItems := []*types.MenuItem{
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, shortShaToMark, info.NewTerm()),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, shortHashToMark, info.NewTerm()),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.BisectMark)
|
self.c.LogAction(self.c.Tr.Actions.BisectMark)
|
||||||
if err := self.c.Git().Bisect.Mark(shaToMark, info.NewTerm()); err != nil {
|
if err := self.c.Git().Bisect.Mark(hashToMark, info.NewTerm()); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,10 +105,10 @@ func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, c
|
|||||||
Key: 'b',
|
Key: 'b',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, shortShaToMark, info.OldTerm()),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.Mark, shortHashToMark, info.OldTerm()),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.BisectMark)
|
self.c.LogAction(self.c.Tr.Actions.BisectMark)
|
||||||
if err := self.c.Git().Bisect.Mark(shaToMark, info.OldTerm()); err != nil {
|
if err := self.c.Git().Bisect.Mark(hashToMark, info.OldTerm()); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,10 +118,10 @@ func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, c
|
|||||||
Key: 'g',
|
Key: 'g',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.SkipCurrent, shortShaToMark),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.SkipCurrent, shortHashToMark),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.BisectSkip)
|
self.c.LogAction(self.c.Tr.Actions.BisectSkip)
|
||||||
if err := self.c.Git().Bisect.Skip(shaToMark); err != nil {
|
if err := self.c.Git().Bisect.Skip(hashToMark); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,12 +131,12 @@ func (self *BisectController) openMidBisectMenu(info *git_commands.BisectInfo, c
|
|||||||
Key: 's',
|
Key: 's',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if info.GetCurrentSha() != "" && info.GetCurrentSha() != commit.Sha {
|
if info.GetCurrentHash() != "" && info.GetCurrentHash() != commit.Hash {
|
||||||
menuItems = append(menuItems, lo.ToPtr(types.MenuItem{
|
menuItems = append(menuItems, lo.ToPtr(types.MenuItem{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.SkipSelected, commit.ShortSha()),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.SkipSelected, commit.ShortHash()),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.BisectSkip)
|
self.c.LogAction(self.c.Tr.Actions.BisectSkip)
|
||||||
if err := self.c.Git().Bisect.Skip(commit.Sha); err != nil {
|
if err := self.c.Git().Bisect.Skip(commit.Hash); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,14 +165,14 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
|
|||||||
Title: self.c.Tr.Bisect.BisectMenuTitle,
|
Title: self.c.Tr.Bisect.BisectMenuTitle,
|
||||||
Items: []*types.MenuItem{
|
Items: []*types.MenuItem{
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortSha(), info.NewTerm()),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortHash(), info.NewTerm()),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.StartBisect)
|
self.c.LogAction(self.c.Tr.Actions.StartBisect)
|
||||||
if err := self.c.Git().Bisect.Start(); err != nil {
|
if err := self.c.Git().Bisect.Start(); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.Git().Bisect.Mark(commit.Sha, info.NewTerm()); err != nil {
|
if err := self.c.Git().Bisect.Mark(commit.Hash, info.NewTerm()); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,14 +182,14 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
|
|||||||
Key: 'b',
|
Key: 'b',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortSha(), info.OldTerm()),
|
Label: fmt.Sprintf(self.c.Tr.Bisect.MarkStart, commit.ShortHash(), info.OldTerm()),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.StartBisect)
|
self.c.LogAction(self.c.Tr.Actions.StartBisect)
|
||||||
if err := self.c.Git().Bisect.Start(); err != nil {
|
if err := self.c.Git().Bisect.Start(); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.c.Git().Bisect.Mark(commit.Sha, info.OldTerm()); err != nil {
|
if err := self.c.Git().Bisect.Mark(commit.Hash, info.OldTerm()); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,13 +224,13 @@ func (self *BisectController) openStartBisectMenu(info *git_commands.BisectInfo,
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectController) showBisectCompleteMessage(candidateShas []string) error {
|
func (self *BisectController) showBisectCompleteMessage(candidateHashes []string) error {
|
||||||
prompt := self.c.Tr.Bisect.CompletePrompt
|
prompt := self.c.Tr.Bisect.CompletePrompt
|
||||||
if len(candidateShas) > 1 {
|
if len(candidateHashes) > 1 {
|
||||||
prompt = self.c.Tr.Bisect.CompletePromptIndeterminate
|
prompt = self.c.Tr.Bisect.CompletePromptIndeterminate
|
||||||
}
|
}
|
||||||
|
|
||||||
formattedCommits, err := self.c.Git().Commit.GetCommitsOneline(candidateShas)
|
formattedCommits, err := self.c.Git().Commit.GetCommitsOneline(candidateHashes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -250,7 +250,7 @@ func (self *BisectController) showBisectCompleteMessage(candidateShas []string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool) error {
|
func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool) error {
|
||||||
done, candidateShas, err := self.c.Git().Bisect.IsDone()
|
done, candidateHashes, err := self.c.Git().Bisect.IsDone()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -260,7 +260,7 @@ func (self *BisectController) afterMark(selectCurrent bool, waitToReselect bool)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if done {
|
if done {
|
||||||
return self.showBisectCompleteMessage(candidateShas)
|
return self.showBisectCompleteMessage(candidateHashes)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -284,10 +284,10 @@ func (self *BisectController) afterBisectMarkRefresh(selectCurrent bool, waitToR
|
|||||||
|
|
||||||
func (self *BisectController) selectCurrentBisectCommit() {
|
func (self *BisectController) selectCurrentBisectCommit() {
|
||||||
info := self.c.Git().Bisect.GetInfo()
|
info := self.c.Git().Bisect.GetInfo()
|
||||||
if info.GetCurrentSha() != "" {
|
if info.GetCurrentHash() != "" {
|
||||||
// find index of commit with that sha, move cursor to that.
|
// find index of commit with that hash, move cursor to that.
|
||||||
for i, commit := range self.c.Model().Commits {
|
for i, commit := range self.c.Model().Commits {
|
||||||
if commit.Sha == info.GetCurrentSha() {
|
if commit.Hash == info.GetCurrentHash() {
|
||||||
self.context().SetSelection(i)
|
self.context().SetSelection(i)
|
||||||
_ = self.context().HandleFocus(types.OnFocusOpts{})
|
_ = self.context().HandleFocus(types.OnFocusOpts{})
|
||||||
break
|
break
|
||||||
|
@ -67,7 +67,7 @@ func (self *CustomPatchOptionsMenuAction) Call() error {
|
|||||||
|
|
||||||
if self.c.CurrentContext().GetKey() == self.c.Contexts().LocalCommits.GetKey() {
|
if self.c.CurrentContext().GetKey() == self.c.Contexts().LocalCommits.GetKey() {
|
||||||
selectedCommit := self.c.Contexts().LocalCommits.GetSelected()
|
selectedCommit := self.c.Contexts().LocalCommits.GetSelected()
|
||||||
if selectedCommit != nil && self.c.Git().Patch.PatchBuilder.To != selectedCommit.Sha {
|
if selectedCommit != nil && self.c.Git().Patch.PatchBuilder.To != selectedCommit.Hash {
|
||||||
|
|
||||||
var disabledReason *types.DisabledReason
|
var disabledReason *types.DisabledReason
|
||||||
if self.c.Contexts().LocalCommits.AreMultipleItemsSelected() {
|
if self.c.Contexts().LocalCommits.AreMultipleItemsSelected() {
|
||||||
@ -80,7 +80,7 @@ func (self *CustomPatchOptionsMenuAction) Call() error {
|
|||||||
append(
|
append(
|
||||||
[]*types.MenuItem{
|
[]*types.MenuItem{
|
||||||
{
|
{
|
||||||
Label: fmt.Sprintf(self.c.Tr.MovePatchToSelectedCommit, selectedCommit.Sha),
|
Label: fmt.Sprintf(self.c.Tr.MovePatchToSelectedCommit, selectedCommit.Hash),
|
||||||
Tooltip: self.c.Tr.MovePatchToSelectedCommitTooltip,
|
Tooltip: self.c.Tr.MovePatchToSelectedCommitTooltip,
|
||||||
OnPress: self.handleMovePatchToSelectedCommit,
|
OnPress: self.handleMovePatchToSelectedCommit,
|
||||||
Key: 'm',
|
Key: 'm',
|
||||||
@ -106,7 +106,7 @@ func (self *CustomPatchOptionsMenuAction) Call() error {
|
|||||||
|
|
||||||
func (self *CustomPatchOptionsMenuAction) getPatchCommitIndex() int {
|
func (self *CustomPatchOptionsMenuAction) getPatchCommitIndex() int {
|
||||||
for index, commit := range self.c.Model().Commits {
|
for index, commit := range self.c.Model().Commits {
|
||||||
if commit.Sha == self.c.Git().Patch.PatchBuilder.To {
|
if commit.Hash == self.c.Git().Patch.PatchBuilder.To {
|
||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,10 +38,10 @@ func (self *CherryPickHelper) CopyRange(commitsList []*models.Commit, context ty
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
commitSet := self.getData().SelectedShaSet()
|
commitSet := self.getData().SelectedHashSet()
|
||||||
|
|
||||||
allCommitsCopied := lo.EveryBy(commitsList[startIdx:endIdx+1], func(commit *models.Commit) bool {
|
allCommitsCopied := lo.EveryBy(commitsList[startIdx:endIdx+1], func(commit *models.Commit) bool {
|
||||||
return commitSet.Includes(commit.Sha)
|
return commitSet.Includes(commit.Hash)
|
||||||
})
|
})
|
||||||
|
|
||||||
// if all selected commits are already copied, we'll uncopy them
|
// if all selected commits are already copied, we'll uncopy them
|
||||||
|
@ -44,14 +44,14 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error {
|
|||||||
return self.c.ErrorMsg(self.c.Tr.NoDeletedLinesInDiff)
|
return self.c.ErrorMsg(self.c.Tr.NoDeletedLinesInDiff)
|
||||||
}
|
}
|
||||||
|
|
||||||
shas := self.blameDeletedLines(deletedLineInfos)
|
hashes := self.blameDeletedLines(deletedLineInfos)
|
||||||
|
|
||||||
if len(shas) == 0 {
|
if len(hashes) == 0 {
|
||||||
// This should never happen
|
// This should never happen
|
||||||
return self.c.ErrorMsg(self.c.Tr.NoBaseCommitsFound)
|
return self.c.ErrorMsg(self.c.Tr.NoBaseCommitsFound)
|
||||||
}
|
}
|
||||||
if len(shas) > 1 {
|
if len(hashes) > 1 {
|
||||||
subjects, err := self.c.Git().Commit.GetShasAndCommitMessagesFirstLine(shas)
|
subjects, err := self.c.Git().Commit.GetHashesAndCommitMessagesFirstLine(hashes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
commit, index, ok := lo.FindIndexOf(self.c.Model().Commits, func(commit *models.Commit) bool {
|
commit, index, ok := lo.FindIndexOf(self.c.Model().Commits, func(commit *models.Commit) bool {
|
||||||
return commit.Sha == shas[0]
|
return commit.Hash == hashes[0]
|
||||||
})
|
})
|
||||||
if !ok {
|
if !ok {
|
||||||
commits := self.c.Model().Commits
|
commits := self.c.Model().Commits
|
||||||
@ -164,7 +164,7 @@ func (self *FixupHelper) parseDiff(diff string) ([]*deletedLineInfo, bool) {
|
|||||||
// returns the list of commit hashes that introduced the lines which have now been deleted
|
// returns the list of commit hashes that introduced the lines which have now been deleted
|
||||||
func (self *FixupHelper) blameDeletedLines(deletedLineInfos []*deletedLineInfo) []string {
|
func (self *FixupHelper) blameDeletedLines(deletedLineInfos []*deletedLineInfo) []string {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
shaChan := make(chan string)
|
hashChan := make(chan string)
|
||||||
|
|
||||||
for _, info := range deletedLineInfos {
|
for _, info := range deletedLineInfos {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
@ -178,19 +178,19 @@ func (self *FixupHelper) blameDeletedLines(deletedLineInfos []*deletedLineInfo)
|
|||||||
}
|
}
|
||||||
blameLines := strings.Split(strings.TrimSuffix(blameOutput, "\n"), "\n")
|
blameLines := strings.Split(strings.TrimSuffix(blameOutput, "\n"), "\n")
|
||||||
for _, line := range blameLines {
|
for _, line := range blameLines {
|
||||||
shaChan <- strings.Split(line, " ")[0]
|
hashChan <- strings.Split(line, " ")[0]
|
||||||
}
|
}
|
||||||
}(info)
|
}(info)
|
||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
close(shaChan)
|
close(hashChan)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
result := set.New[string]()
|
result := set.New[string]()
|
||||||
for sha := range shaChan {
|
for hash := range hashChan {
|
||||||
result.Add(sha)
|
result.Add(hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.ToSlice()
|
return result.ToSlice()
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
type IHostHelper interface {
|
type IHostHelper interface {
|
||||||
GetPullRequestURL(from string, to string) (string, error)
|
GetPullRequestURL(from string, to string) (string, error)
|
||||||
GetCommitURL(commitSha string) (string, error)
|
GetCommitURL(commitHash string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type HostHelper struct {
|
type HostHelper struct {
|
||||||
@ -31,12 +31,12 @@ func (self *HostHelper) GetPullRequestURL(from string, to string) (string, error
|
|||||||
return mgr.GetPullRequestURL(from, to)
|
return mgr.GetPullRequestURL(from, to)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *HostHelper) GetCommitURL(commitSha string) (string, error) {
|
func (self *HostHelper) GetCommitURL(commitHash string) (string, error) {
|
||||||
mgr, err := self.getHostingServiceMgr()
|
mgr, err := self.getHostingServiceMgr()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return mgr.GetCommitURL(commitSha)
|
return mgr.GetCommitURL(commitHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getting this on every request rather than storing it in state in case our remoteURL changes
|
// getting this on every request rather than storing it in state in case our remoteURL changes
|
||||||
|
@ -241,7 +241,7 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
|
|||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
|
self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
|
||||||
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(task gocui.Task) error {
|
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(task gocui.Task) error {
|
||||||
baseCommit := self.c.Modes().MarkedBaseCommit.GetSha()
|
baseCommit := self.c.Modes().MarkedBaseCommit.GetHash()
|
||||||
var err error
|
var err error
|
||||||
if baseCommit != "" {
|
if baseCommit != "" {
|
||||||
err = self.c.Git().Rebase.RebaseBranchFromBaseCommit(ref, baseCommit)
|
err = self.c.Git().Rebase.RebaseBranchFromBaseCommit(ref, baseCommit)
|
||||||
@ -262,7 +262,7 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
|
|||||||
Tooltip: self.c.Tr.InteractiveRebaseTooltip,
|
Tooltip: self.c.Tr.InteractiveRebaseTooltip,
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
|
self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
|
||||||
baseCommit := self.c.Modes().MarkedBaseCommit.GetSha()
|
baseCommit := self.c.Modes().MarkedBaseCommit.GetHash()
|
||||||
var err error
|
var err error
|
||||||
if baseCommit != "" {
|
if baseCommit != "" {
|
||||||
err = self.c.Git().Rebase.EditRebaseFromBaseCommit(ref, baseCommit)
|
err = self.c.Git().Rebase.EditRebaseFromBaseCommit(ref, baseCommit)
|
||||||
@ -281,7 +281,7 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
title := utils.ResolvePlaceholderString(
|
title := utils.ResolvePlaceholderString(
|
||||||
lo.Ternary(self.c.Modes().MarkedBaseCommit.GetSha() != "",
|
lo.Ternary(self.c.Modes().MarkedBaseCommit.GetHash() != "",
|
||||||
self.c.Tr.RebasingFromBaseCommitTitle,
|
self.c.Tr.RebasingFromBaseCommitTitle,
|
||||||
self.c.Tr.RebasingTitle),
|
self.c.Tr.RebasingTitle),
|
||||||
map[string]string{
|
map[string]string{
|
||||||
|
@ -267,7 +267,7 @@ func (self *RefreshHelper) refreshCommitsAndCommitFiles() {
|
|||||||
_ = self.refreshCommitsWithLimit()
|
_ = self.refreshCommitsWithLimit()
|
||||||
ctx, ok := self.c.Contexts().CommitFiles.GetParentContext()
|
ctx, ok := self.c.Contexts().CommitFiles.GetParentContext()
|
||||||
if ok && ctx.GetKey() == context.LOCAL_COMMITS_CONTEXT_KEY {
|
if ok && ctx.GetKey() == context.LOCAL_COMMITS_CONTEXT_KEY {
|
||||||
// This makes sense when we've e.g. just amended a commit, meaning we get a new commit SHA at the same position.
|
// This makes sense when we've e.g. just amended a commit, meaning we get a new commit hash at the same position.
|
||||||
// However if we've just added a brand new commit, it pushes the list down by one and so we would end up
|
// However if we've just added a brand new commit, it pushes the list down by one and so we would end up
|
||||||
// showing the contents of a different commit than the one we initially entered.
|
// showing the contents of a different commit than the one we initially entered.
|
||||||
// Ideally we would know when to refresh the commit files context and when not to,
|
// Ideally we would know when to refresh the commit files context and when not to,
|
||||||
@ -290,16 +290,16 @@ func (self *RefreshHelper) determineCheckedOutBranchName() string {
|
|||||||
return strings.TrimPrefix(rebasedBranch, "refs/heads/")
|
return strings.TrimPrefix(rebasedBranch, "refs/heads/")
|
||||||
}
|
}
|
||||||
|
|
||||||
if bisectInfo := self.c.Git().Bisect.GetInfo(); bisectInfo.Bisecting() && bisectInfo.GetStartSha() != "" {
|
if bisectInfo := self.c.Git().Bisect.GetInfo(); bisectInfo.Bisecting() && bisectInfo.GetStartHash() != "" {
|
||||||
// Likewise, when we're bisecting we're on a detached head as well. In
|
// Likewise, when we're bisecting we're on a detached head as well. In
|
||||||
// this case we read the branch name from the ".git/BISECT_START" file.
|
// this case we read the branch name from the ".git/BISECT_START" file.
|
||||||
return bisectInfo.GetStartSha()
|
return bisectInfo.GetStartHash()
|
||||||
}
|
}
|
||||||
|
|
||||||
// In all other cases, get the branch name by asking git what branch is
|
// In all other cases, get the branch name by asking git what branch is
|
||||||
// checked out. Note that if we're on a detached head (for reasons other
|
// checked out. Note that if we're on a detached head (for reasons other
|
||||||
// than rebasing or bisecting, i.e. it was explicitly checked out), then
|
// than rebasing or bisecting, i.e. it was explicitly checked out), then
|
||||||
// this will return its sha.
|
// this will return its hash.
|
||||||
if branchName, err := self.c.Git().Branch.CurrentBranchName(); err == nil {
|
if branchName, err := self.c.Git().Branch.CurrentBranchName(); err == nil {
|
||||||
return branchName
|
return branchName
|
||||||
}
|
}
|
||||||
@ -721,10 +721,10 @@ func (self *RefreshHelper) refForLog() string {
|
|||||||
|
|
||||||
// need to see if our bisect's current commit is reachable from our 'new' ref.
|
// need to see if our bisect's current commit is reachable from our 'new' ref.
|
||||||
if bisectInfo.Bisecting() && !self.c.Git().Bisect.ReachableFromStart(bisectInfo) {
|
if bisectInfo.Bisecting() && !self.c.Git().Bisect.ReachableFromStart(bisectInfo) {
|
||||||
return bisectInfo.GetNewSha()
|
return bisectInfo.GetNewHash()
|
||||||
}
|
}
|
||||||
|
|
||||||
return bisectInfo.GetStartSha()
|
return bisectInfo.GetStartHash()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *RefreshHelper) refreshView(context types.Context) error {
|
func (self *RefreshHelper) refreshView(context types.Context) error {
|
||||||
|
@ -62,8 +62,8 @@ func (self *ReposHelper) getCurrentBranch(path string) string {
|
|||||||
// is a branch
|
// is a branch
|
||||||
branchDisplay = strings.TrimPrefix(content, refsPrefix)
|
branchDisplay = strings.TrimPrefix(content, refsPrefix)
|
||||||
} else {
|
} else {
|
||||||
// detached HEAD state, displaying short SHA
|
// detached HEAD state, displaying short hash
|
||||||
branchDisplay = utils.ShortSha(content)
|
branchDisplay = utils.ShortHash(content)
|
||||||
}
|
}
|
||||||
return branchDisplay, nil
|
return branchDisplay, nil
|
||||||
}
|
}
|
||||||
|
@ -285,7 +285,7 @@ func (self *LocalCommitsController) GetOnRenderToMain() func() error {
|
|||||||
"ref": strings.TrimPrefix(commit.Name, "refs/heads/"),
|
"ref": strings.TrimPrefix(commit.Name, "refs/heads/"),
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Sha, self.c.Modes().Filtering.GetPath())
|
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Hash, self.c.Modes().Filtering.GetPath())
|
||||||
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,7 +350,7 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsController) reword(commit *models.Commit) error {
|
func (self *LocalCommitsController) reword(commit *models.Commit) error {
|
||||||
commitMessage, err := self.c.Git().Commit.GetCommitMessage(commit.Sha)
|
commitMessage, err := self.c.Git().Commit.GetCommitMessage(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -508,9 +508,9 @@ func (self *LocalCommitsController) startInteractiveRebaseWithEdit(
|
|||||||
self.c.LogAction(self.c.Tr.Actions.EditCommit)
|
self.c.LogAction(self.c.Tr.Actions.EditCommit)
|
||||||
selectedIdx, rangeStartIdx, rangeSelectMode := self.context().GetSelectionRangeAndMode()
|
selectedIdx, rangeStartIdx, rangeSelectMode := self.context().GetSelectionRangeAndMode()
|
||||||
commits := self.c.Model().Commits
|
commits := self.c.Model().Commits
|
||||||
selectedSha := commits[selectedIdx].Sha
|
selectedHash := commits[selectedIdx].Hash
|
||||||
rangeStartSha := commits[rangeStartIdx].Sha
|
rangeStartHash := commits[rangeStartIdx].Hash
|
||||||
err := self.c.Git().Rebase.EditRebase(commitsToEdit[len(commitsToEdit)-1].Sha)
|
err := self.c.Git().Rebase.EditRebase(commitsToEdit[len(commitsToEdit)-1].Hash)
|
||||||
return self.c.Helpers().MergeAndRebase.CheckMergeOrRebaseWithRefreshOptions(
|
return self.c.Helpers().MergeAndRebase.CheckMergeOrRebaseWithRefreshOptions(
|
||||||
err,
|
err,
|
||||||
types.RefreshOptions{Mode: types.BLOCK_UI, Then: func() {
|
types.RefreshOptions{Mode: types.BLOCK_UI, Then: func() {
|
||||||
@ -518,7 +518,7 @@ func (self *LocalCommitsController) startInteractiveRebaseWithEdit(
|
|||||||
for _, c := range commitsToEdit[:len(commitsToEdit)-1] {
|
for _, c := range commitsToEdit[:len(commitsToEdit)-1] {
|
||||||
// Merge commits can't be set to "edit", so just skip them
|
// Merge commits can't be set to "edit", so just skip them
|
||||||
if !c.IsMerge() {
|
if !c.IsMerge() {
|
||||||
todos = append(todos, &models.Commit{Sha: c.Sha, Action: todo.Pick})
|
todos = append(todos, &models.Commit{Hash: c.Hash, Action: todo.Pick})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(todos) > 0 {
|
if len(todos) > 0 {
|
||||||
@ -532,10 +532,10 @@ func (self *LocalCommitsController) startInteractiveRebaseWithEdit(
|
|||||||
// new lines can be added for update-ref commands in the TODO file, due to
|
// new lines can be added for update-ref commands in the TODO file, due to
|
||||||
// stacked branches. So the selected commits may be in different positions in the list.
|
// stacked branches. So the selected commits may be in different positions in the list.
|
||||||
_, newSelectedIdx, ok1 := lo.FindIndexOf(self.c.Model().Commits, func(c *models.Commit) bool {
|
_, newSelectedIdx, ok1 := lo.FindIndexOf(self.c.Model().Commits, func(c *models.Commit) bool {
|
||||||
return c.Sha == selectedSha
|
return c.Hash == selectedHash
|
||||||
})
|
})
|
||||||
_, newRangeStartIdx, ok2 := lo.FindIndexOf(self.c.Model().Commits, func(c *models.Commit) bool {
|
_, newRangeStartIdx, ok2 := lo.FindIndexOf(self.c.Model().Commits, func(c *models.Commit) bool {
|
||||||
return c.Sha == rangeStartSha
|
return c.Hash == rangeStartHash
|
||||||
})
|
})
|
||||||
if ok1 && ok2 {
|
if ok1 && ok2 {
|
||||||
self.context().SetSelectionRangeAndMode(newSelectedIdx, newRangeStartIdx, rangeSelectMode)
|
self.context().SetSelectionRangeAndMode(newSelectedIdx, newRangeStartIdx, rangeSelectMode)
|
||||||
@ -782,12 +782,12 @@ func (self *LocalCommitsController) revert(commit *models.Commit) error {
|
|||||||
Prompt: utils.ResolvePlaceholderString(
|
Prompt: utils.ResolvePlaceholderString(
|
||||||
self.c.Tr.ConfirmRevertCommit,
|
self.c.Tr.ConfirmRevertCommit,
|
||||||
map[string]string{
|
map[string]string{
|
||||||
"selectedCommit": commit.ShortSha(),
|
"selectedCommit": commit.ShortHash(),
|
||||||
}),
|
}),
|
||||||
HandleConfirm: func() error {
|
HandleConfirm: func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
|
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
|
||||||
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
|
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
|
||||||
if err := self.c.Git().Commit.Revert(commit.Sha); err != nil {
|
if err := self.c.Git().Commit.Revert(commit.Hash); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return self.afterRevertCommit()
|
return self.afterRevertCommit()
|
||||||
@ -799,20 +799,20 @@ func (self *LocalCommitsController) revert(commit *models.Commit) error {
|
|||||||
|
|
||||||
func (self *LocalCommitsController) createRevertMergeCommitMenu(commit *models.Commit) error {
|
func (self *LocalCommitsController) createRevertMergeCommitMenu(commit *models.Commit) error {
|
||||||
menuItems := make([]*types.MenuItem, len(commit.Parents))
|
menuItems := make([]*types.MenuItem, len(commit.Parents))
|
||||||
for i, parentSha := range commit.Parents {
|
for i, parentHash := range commit.Parents {
|
||||||
i := i
|
i := i
|
||||||
message, err := self.c.Git().Commit.GetCommitMessageFirstLine(parentSha)
|
message, err := self.c.Git().Commit.GetCommitMessageFirstLine(parentHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
menuItems[i] = &types.MenuItem{
|
menuItems[i] = &types.MenuItem{
|
||||||
Label: fmt.Sprintf("%s: %s", utils.SafeTruncate(parentSha, 8), message),
|
Label: fmt.Sprintf("%s: %s", utils.SafeTruncate(parentHash, 8), message),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
parentNumber := i + 1
|
parentNumber := i + 1
|
||||||
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
|
self.c.LogAction(self.c.Tr.Actions.RevertCommit)
|
||||||
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
|
return self.c.WithWaitingStatusSync(self.c.Tr.RevertingStatus, func() error {
|
||||||
if err := self.c.Git().Commit.RevertMerge(commit.Sha, parentNumber); err != nil {
|
if err := self.c.Git().Commit.RevertMerge(commit.Hash, parentNumber); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return self.afterRevertCommit()
|
return self.afterRevertCommit()
|
||||||
@ -850,7 +850,7 @@ func (self *LocalCommitsController) createFixupCommit(commit *models.Commit) err
|
|||||||
return self.c.Helpers().WorkingTree.WithEnsureCommitableFiles(func() error {
|
return self.c.Helpers().WorkingTree.WithEnsureCommitableFiles(func() error {
|
||||||
self.c.LogAction(self.c.Tr.Actions.CreateFixupCommit)
|
self.c.LogAction(self.c.Tr.Actions.CreateFixupCommit)
|
||||||
return self.c.WithWaitingStatusSync(self.c.Tr.CreatingFixupCommitStatus, func() error {
|
return self.c.WithWaitingStatusSync(self.c.Tr.CreatingFixupCommitStatus, func() error {
|
||||||
if err := self.c.Git().Commit.CreateFixupCommit(commit.Sha); err != nil {
|
if err := self.c.Git().Commit.CreateFixupCommit(commit.Hash); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -884,7 +884,7 @@ func (self *LocalCommitsController) createFixupCommit(commit *models.Commit) err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsController) createAmendCommit(commit *models.Commit, includeFileChanges bool) error {
|
func (self *LocalCommitsController) createAmendCommit(commit *models.Commit, includeFileChanges bool) error {
|
||||||
commitMessage, err := self.c.Git().Commit.GetCommitMessage(commit.Sha)
|
commitMessage, err := self.c.Git().Commit.GetCommitMessage(commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
@ -1024,7 +1024,7 @@ func isFixupCommit(subject string) (string, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsController) createTag(commit *models.Commit) error {
|
func (self *LocalCommitsController) createTag(commit *models.Commit) error {
|
||||||
return self.c.Helpers().Tags.OpenCreateTagPrompt(commit.Sha, func() {})
|
return self.c.Helpers().Tags.OpenCreateTagPrompt(commit.Hash, func() {})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsController) openSearch() error {
|
func (self *LocalCommitsController) openSearch() error {
|
||||||
@ -1181,11 +1181,11 @@ func (self *LocalCommitsController) canPaste() *types.DisabledReason {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *LocalCommitsController) markAsBaseCommit(commit *models.Commit) error {
|
func (self *LocalCommitsController) markAsBaseCommit(commit *models.Commit) error {
|
||||||
if commit.Sha == self.c.Modes().MarkedBaseCommit.GetSha() {
|
if commit.Hash == self.c.Modes().MarkedBaseCommit.GetHash() {
|
||||||
// Reset when invoking it again on the marked commit
|
// Reset when invoking it again on the marked commit
|
||||||
self.c.Modes().MarkedBaseCommit.SetSha("")
|
self.c.Modes().MarkedBaseCommit.SetHash("")
|
||||||
} else {
|
} else {
|
||||||
self.c.Modes().MarkedBaseCommit.SetSha(commit.Sha)
|
self.c.Modes().MarkedBaseCommit.SetHash(commit.Hash)
|
||||||
}
|
}
|
||||||
return self.c.PostRefreshUpdate(self.c.Contexts().LocalCommits)
|
return self.c.PostRefreshUpdate(self.c.Contexts().LocalCommits)
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func (self *ReflogCommitsController) GetOnRenderToMain() func() error {
|
|||||||
if commit == nil {
|
if commit == nil {
|
||||||
task = types.NewRenderStringTask("No reflog history")
|
task = types.NewRenderStringTask("No reflog history")
|
||||||
} else {
|
} else {
|
||||||
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Sha, self.c.Modes().Filtering.GetPath())
|
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Hash, self.c.Modes().Filtering.GetPath())
|
||||||
|
|
||||||
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ func (self *SubCommitsController) GetOnRenderToMain() func() error {
|
|||||||
if commit == nil {
|
if commit == nil {
|
||||||
task = types.NewRenderStringTask("No commits")
|
task = types.NewRenderStringTask("No commits")
|
||||||
} else {
|
} else {
|
||||||
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Sha, self.c.Modes().Filtering.GetPath())
|
cmdObj := self.c.Git().Commit.ShowCmdObj(commit.Hash, self.c.Modes().Filtering.GetPath())
|
||||||
|
|
||||||
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
task = types.NewRunPtyTask(cmdObj.GetCmd())
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ func (self *TagsController) createResetMenu(tag *models.Tag) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *TagsController) create() error {
|
func (self *TagsController) create() error {
|
||||||
// leaving commit SHA blank so that we're just creating the tag for the current commit
|
// leaving commit hash blank so that we're just creating the tag for the current commit
|
||||||
return self.c.Helpers().Tags.OpenCreateTagPrompt("", func() {
|
return self.c.Helpers().Tags.OpenCreateTagPrompt("", func() {
|
||||||
self.context().SetSelection(0)
|
self.context().SetSelection(0)
|
||||||
})
|
})
|
||||||
|
@ -181,34 +181,34 @@ func (self *UndoController) reflogRedo() error {
|
|||||||
func (self *UndoController) parseReflogForActions(onUserAction func(counter int, action reflogAction) (bool, error)) error {
|
func (self *UndoController) parseReflogForActions(onUserAction func(counter int, action reflogAction) (bool, error)) error {
|
||||||
counter := 0
|
counter := 0
|
||||||
reflogCommits := self.c.Model().FilteredReflogCommits
|
reflogCommits := self.c.Model().FilteredReflogCommits
|
||||||
rebaseFinishCommitSha := ""
|
rebaseFinishCommitHash := ""
|
||||||
var action *reflogAction
|
var action *reflogAction
|
||||||
for reflogCommitIdx, reflogCommit := range reflogCommits {
|
for reflogCommitIdx, reflogCommit := range reflogCommits {
|
||||||
action = nil
|
action = nil
|
||||||
|
|
||||||
prevCommitSha := ""
|
prevCommitHash := ""
|
||||||
if len(reflogCommits)-1 >= reflogCommitIdx+1 {
|
if len(reflogCommits)-1 >= reflogCommitIdx+1 {
|
||||||
prevCommitSha = reflogCommits[reflogCommitIdx+1].Sha
|
prevCommitHash = reflogCommits[reflogCommitIdx+1].Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
if rebaseFinishCommitSha == "" {
|
if rebaseFinishCommitHash == "" {
|
||||||
if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit undo\]`); ok {
|
if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit undo\]`); ok {
|
||||||
counter++
|
counter++
|
||||||
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit redo\]`); ok {
|
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^\[lazygit redo\]`); ok {
|
||||||
counter--
|
counter--
|
||||||
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(abort\)|^rebase (-i )?\(finish\)`); ok {
|
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(abort\)|^rebase (-i )?\(finish\)`); ok {
|
||||||
rebaseFinishCommitSha = reflogCommit.Sha
|
rebaseFinishCommitHash = reflogCommit.Hash
|
||||||
} else if ok, match := utils.FindStringSubmatch(reflogCommit.Name, `^checkout: moving from ([\S]+) to ([\S]+)`); ok {
|
} else if ok, match := utils.FindStringSubmatch(reflogCommit.Name, `^checkout: moving from ([\S]+) to ([\S]+)`); ok {
|
||||||
action = &reflogAction{kind: CHECKOUT, from: match[1], to: match[2]}
|
action = &reflogAction{kind: CHECKOUT, from: match[1], to: match[2]}
|
||||||
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^commit|^reset: moving to|^pull`); ok {
|
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^commit|^reset: moving to|^pull`); ok {
|
||||||
action = &reflogAction{kind: COMMIT, from: prevCommitSha, to: reflogCommit.Sha}
|
action = &reflogAction{kind: COMMIT, from: prevCommitHash, to: reflogCommit.Hash}
|
||||||
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(start\)`); ok {
|
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(start\)`); ok {
|
||||||
// if we're here then we must be currently inside an interactive rebase
|
// if we're here then we must be currently inside an interactive rebase
|
||||||
action = &reflogAction{kind: CURRENT_REBASE, from: prevCommitSha}
|
action = &reflogAction{kind: CURRENT_REBASE, from: prevCommitHash}
|
||||||
}
|
}
|
||||||
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(start\)`); ok {
|
} else if ok, _ := utils.FindStringSubmatch(reflogCommit.Name, `^rebase (-i )?\(start\)`); ok {
|
||||||
action = &reflogAction{kind: REBASE, from: prevCommitSha, to: rebaseFinishCommitSha}
|
action = &reflogAction{kind: REBASE, from: prevCommitHash, to: rebaseFinishCommitHash}
|
||||||
rebaseFinishCommitSha = ""
|
rebaseFinishCommitHash = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if action != nil {
|
if action != nil {
|
||||||
@ -232,9 +232,9 @@ type hardResetOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// only to be used in the undo flow for now (does an autostash)
|
// only to be used in the undo flow for now (does an autostash)
|
||||||
func (self *UndoController) hardResetWithAutoStash(commitSha string, options hardResetOptions) error {
|
func (self *UndoController) hardResetWithAutoStash(commitHash string, options hardResetOptions) error {
|
||||||
reset := func() error {
|
reset := func() error {
|
||||||
if err := self.c.Helpers().Refs.ResetToRef(commitSha, "hard", options.EnvVars); err != nil {
|
if err := self.c.Helpers().Refs.ResetToRef(commitHash, "hard", options.EnvVars); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -249,7 +249,7 @@ func (self *UndoController) hardResetWithAutoStash(commitSha string, options har
|
|||||||
Prompt: self.c.Tr.AutoStashPrompt,
|
Prompt: self.c.Tr.AutoStashPrompt,
|
||||||
HandleConfirm: func() error {
|
HandleConfirm: func() error {
|
||||||
return self.c.WithWaitingStatus(options.WaitingStatus, func(gocui.Task) error {
|
return self.c.WithWaitingStatus(options.WaitingStatus, func(gocui.Task) error {
|
||||||
if err := self.c.Git().Stash.Push(self.c.Tr.StashPrefix + commitSha); err != nil {
|
if err := self.c.Git().Stash.Push(self.c.Tr.StashPrefix + commitHash); err != nil {
|
||||||
return self.c.Error(err)
|
return self.c.Error(err)
|
||||||
}
|
}
|
||||||
if err := reset(); err != nil {
|
if err := reset(); err != nil {
|
||||||
|
@ -148,7 +148,7 @@ func (self *Gui) GetInitialKeybindings() ([]*types.Binding, []*gocui.ViewMouseBi
|
|||||||
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
||||||
Handler: self.handleCopySelectedSideContextItemCommitHashToClipboard,
|
Handler: self.handleCopySelectedSideContextItemCommitHashToClipboard,
|
||||||
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
||||||
Description: self.c.Tr.CopyCommitShaToClipboard,
|
Description: self.c.Tr.CopyCommitHashToClipboard,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ViewName: "commits",
|
ViewName: "commits",
|
||||||
@ -161,14 +161,14 @@ func (self *Gui) GetInitialKeybindings() ([]*types.Binding, []*gocui.ViewMouseBi
|
|||||||
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
||||||
Handler: self.handleCopySelectedSideContextItemToClipboard,
|
Handler: self.handleCopySelectedSideContextItemToClipboard,
|
||||||
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
||||||
Description: self.c.Tr.CopyCommitShaToClipboard,
|
Description: self.c.Tr.CopyCommitHashToClipboard,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ViewName: "subCommits",
|
ViewName: "subCommits",
|
||||||
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
Key: opts.GetKey(opts.Config.Universal.CopyToClipboard),
|
||||||
Handler: self.handleCopySelectedSideContextItemCommitHashToClipboard,
|
Handler: self.handleCopySelectedSideContextItemCommitHashToClipboard,
|
||||||
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
GetDisabledReason: self.getCopySelectedSideContextItemToClipboardDisabledReason,
|
||||||
Description: self.c.Tr.CopyCommitShaToClipboard,
|
Description: self.c.Tr.CopyCommitHashToClipboard,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ViewName: "information",
|
ViewName: "information",
|
||||||
|
@ -24,33 +24,33 @@ func (self *CherryPicking) Active() bool {
|
|||||||
return len(self.CherryPickedCommits) > 0
|
return len(self.CherryPickedCommits) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CherryPicking) SelectedShaSet() *set.Set[string] {
|
func (self *CherryPicking) SelectedHashSet() *set.Set[string] {
|
||||||
shas := lo.Map(self.CherryPickedCommits, func(commit *models.Commit, _ int) string {
|
hashes := lo.Map(self.CherryPickedCommits, func(commit *models.Commit, _ int) string {
|
||||||
return commit.Sha
|
return commit.Hash
|
||||||
})
|
})
|
||||||
return set.NewFromSlice(shas)
|
return set.NewFromSlice(hashes)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CherryPicking) Add(selectedCommit *models.Commit, commitsList []*models.Commit) {
|
func (self *CherryPicking) Add(selectedCommit *models.Commit, commitsList []*models.Commit) {
|
||||||
commitSet := self.SelectedShaSet()
|
commitSet := self.SelectedHashSet()
|
||||||
commitSet.Add(selectedCommit.Sha)
|
commitSet.Add(selectedCommit.Hash)
|
||||||
|
|
||||||
self.update(commitSet, commitsList)
|
self.update(commitSet, commitsList)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CherryPicking) Remove(selectedCommit *models.Commit, commitsList []*models.Commit) {
|
func (self *CherryPicking) Remove(selectedCommit *models.Commit, commitsList []*models.Commit) {
|
||||||
commitSet := self.SelectedShaSet()
|
commitSet := self.SelectedHashSet()
|
||||||
commitSet.Remove(selectedCommit.Sha)
|
commitSet.Remove(selectedCommit.Hash)
|
||||||
|
|
||||||
self.update(commitSet, commitsList)
|
self.update(commitSet, commitsList)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *CherryPicking) update(selectedShaSet *set.Set[string], commitsList []*models.Commit) {
|
func (self *CherryPicking) update(selectedHashSet *set.Set[string], commitsList []*models.Commit) {
|
||||||
cherryPickedCommits := lo.Filter(commitsList, func(commit *models.Commit, _ int) bool {
|
cherryPickedCommits := lo.Filter(commitsList, func(commit *models.Commit, _ int) bool {
|
||||||
return selectedShaSet.Includes(commit.Sha)
|
return selectedHashSet.Includes(commit.Hash)
|
||||||
})
|
})
|
||||||
|
|
||||||
self.CherryPickedCommits = lo.Map(cherryPickedCommits, func(commit *models.Commit, _ int) *models.Commit {
|
self.CherryPickedCommits = lo.Map(cherryPickedCommits, func(commit *models.Commit, _ int) *models.Commit {
|
||||||
return &models.Commit{Name: commit.Name, Sha: commit.Sha}
|
return &models.Commit{Name: commit.Name, Hash: commit.Hash}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package marked_base_commit
|
package marked_base_commit
|
||||||
|
|
||||||
type MarkedBaseCommit struct {
|
type MarkedBaseCommit struct {
|
||||||
sha string // the sha of the commit used as a rebase base commit; empty string when unset
|
hash string // the hash of the commit used as a rebase base commit; empty string when unset
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() MarkedBaseCommit {
|
func New() MarkedBaseCommit {
|
||||||
@ -9,17 +9,17 @@ func New() MarkedBaseCommit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MarkedBaseCommit) Active() bool {
|
func (m *MarkedBaseCommit) Active() bool {
|
||||||
return m.sha != ""
|
return m.hash != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MarkedBaseCommit) Reset() {
|
func (m *MarkedBaseCommit) Reset() {
|
||||||
m.sha = ""
|
m.hash = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MarkedBaseCommit) SetSha(sha string) {
|
func (m *MarkedBaseCommit) SetHash(hash string) {
|
||||||
m.sha = sha
|
m.hash = hash
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MarkedBaseCommit) GetSha() string {
|
func (m *MarkedBaseCommit) GetHash() string {
|
||||||
return m.sha
|
return m.hash
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ func getBranchDisplayStrings(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if showCommitHash {
|
if showCommitHash {
|
||||||
res = append(res, utils.ShortSha(b.CommitHash))
|
res = append(res, utils.ShortHash(b.CommitHash))
|
||||||
}
|
}
|
||||||
|
|
||||||
res = append(res, coloredName)
|
res = append(res, coloredName)
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type pipeSetCacheKey struct {
|
type pipeSetCacheKey struct {
|
||||||
commitSha string
|
commitHash string
|
||||||
commitCount int
|
commitCount int
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,14 +43,14 @@ func GetCommitListDisplayStrings(
|
|||||||
currentBranchName string,
|
currentBranchName string,
|
||||||
hasRebaseUpdateRefsConfig bool,
|
hasRebaseUpdateRefsConfig bool,
|
||||||
fullDescription bool,
|
fullDescription bool,
|
||||||
cherryPickedCommitShaSet *set.Set[string],
|
cherryPickedCommitHashSet *set.Set[string],
|
||||||
diffName string,
|
diffName string,
|
||||||
markedBaseCommit string,
|
markedBaseCommit string,
|
||||||
timeFormat string,
|
timeFormat string,
|
||||||
shortTimeFormat string,
|
shortTimeFormat string,
|
||||||
now time.Time,
|
now time.Time,
|
||||||
parseEmoji bool,
|
parseEmoji bool,
|
||||||
selectedCommitSha string,
|
selectedCommitHash string,
|
||||||
startIdx int,
|
startIdx int,
|
||||||
endIdx int,
|
endIdx int,
|
||||||
showGraph bool,
|
showGraph bool,
|
||||||
@ -89,7 +89,7 @@ func GetCommitListDisplayStrings(
|
|||||||
graphLines := graph.RenderAux(
|
graphLines := graph.RenderAux(
|
||||||
graphPipeSets,
|
graphPipeSets,
|
||||||
graphCommits,
|
graphCommits,
|
||||||
selectedCommitSha,
|
selectedCommitHash,
|
||||||
)
|
)
|
||||||
getGraphLine = func(idx int) string {
|
getGraphLine = func(idx int) string {
|
||||||
if idx >= graphOffset {
|
if idx >= graphOffset {
|
||||||
@ -123,7 +123,7 @@ func GetCommitListDisplayStrings(
|
|||||||
!lo.Contains(common.UserConfig.Git.MainBranches, b.Name) &&
|
!lo.Contains(common.UserConfig.Git.MainBranches, b.Name) &&
|
||||||
// Don't show a marker for the head commit unless the
|
// Don't show a marker for the head commit unless the
|
||||||
// rebase.updateRefs config is on
|
// rebase.updateRefs config is on
|
||||||
(hasRebaseUpdateRefsConfig || b.CommitHash != commits[0].Sha)
|
(hasRebaseUpdateRefsConfig || b.CommitHash != commits[0].Hash)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
lines := make([][]string, 0, len(filteredCommits))
|
lines := make([][]string, 0, len(filteredCommits))
|
||||||
@ -131,13 +131,13 @@ func GetCommitListDisplayStrings(
|
|||||||
willBeRebased := markedBaseCommit == ""
|
willBeRebased := markedBaseCommit == ""
|
||||||
for i, commit := range filteredCommits {
|
for i, commit := range filteredCommits {
|
||||||
unfilteredIdx := i + startIdx
|
unfilteredIdx := i + startIdx
|
||||||
bisectStatus = getBisectStatus(unfilteredIdx, commit.Sha, bisectInfo, bisectBounds)
|
bisectStatus = getBisectStatus(unfilteredIdx, commit.Hash, bisectInfo, bisectBounds)
|
||||||
isYouAreHereCommit := false
|
isYouAreHereCommit := false
|
||||||
if showYouAreHereLabel && (commit.Action == models.ActionConflict || unfilteredIdx == rebaseOffset) {
|
if showYouAreHereLabel && (commit.Action == models.ActionConflict || unfilteredIdx == rebaseOffset) {
|
||||||
isYouAreHereCommit = true
|
isYouAreHereCommit = true
|
||||||
showYouAreHereLabel = false
|
showYouAreHereLabel = false
|
||||||
}
|
}
|
||||||
isMarkedBaseCommit := commit.Sha != "" && commit.Sha == markedBaseCommit
|
isMarkedBaseCommit := commit.Hash != "" && commit.Hash == markedBaseCommit
|
||||||
if isMarkedBaseCommit {
|
if isMarkedBaseCommit {
|
||||||
willBeRebased = true
|
willBeRebased = true
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ func GetCommitListDisplayStrings(
|
|||||||
commit,
|
commit,
|
||||||
branchHeadsToVisualize,
|
branchHeadsToVisualize,
|
||||||
hasRebaseUpdateRefsConfig,
|
hasRebaseUpdateRefsConfig,
|
||||||
cherryPickedCommitShaSet,
|
cherryPickedCommitHashSet,
|
||||||
isMarkedBaseCommit,
|
isMarkedBaseCommit,
|
||||||
willBeRebased,
|
willBeRebased,
|
||||||
diffName,
|
diffName,
|
||||||
@ -172,11 +172,11 @@ func getbisectBounds(commits []*models.Commit, bisectInfo *git_commands.BisectIn
|
|||||||
bisectBounds := &bisectBounds{}
|
bisectBounds := &bisectBounds{}
|
||||||
|
|
||||||
for i, commit := range commits {
|
for i, commit := range commits {
|
||||||
if commit.Sha == bisectInfo.GetNewSha() {
|
if commit.Hash == bisectInfo.GetNewHash() {
|
||||||
bisectBounds.newIndex = i
|
bisectBounds.newIndex = i
|
||||||
}
|
}
|
||||||
|
|
||||||
status, ok := bisectInfo.Status(commit.Sha)
|
status, ok := bisectInfo.Status(commit.Hash)
|
||||||
if ok && status == git_commands.BisectStatusOld {
|
if ok && status == git_commands.BisectStatusOld {
|
||||||
bisectBounds.oldIndex = i
|
bisectBounds.oldIndex = i
|
||||||
return bisectBounds
|
return bisectBounds
|
||||||
@ -200,10 +200,10 @@ func indexOfFirstNonTODOCommit(commits []*models.Commit) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func loadPipesets(commits []*models.Commit) [][]*graph.Pipe {
|
func loadPipesets(commits []*models.Commit) [][]*graph.Pipe {
|
||||||
// given that our cache key is a commit sha and a commit count, it's very important that we don't actually try to render pipes
|
// given that our cache key is a commit hash and a commit count, it's very important that we don't actually try to render pipes
|
||||||
// when dealing with things like filtered commits.
|
// when dealing with things like filtered commits.
|
||||||
cacheKey := pipeSetCacheKey{
|
cacheKey := pipeSetCacheKey{
|
||||||
commitSha: commits[0].Sha,
|
commitHash: commits[0].Hash,
|
||||||
commitCount: len(commits),
|
commitCount: len(commits),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,16 +236,16 @@ const (
|
|||||||
BisectStatusCurrent
|
BisectStatusCurrent
|
||||||
)
|
)
|
||||||
|
|
||||||
func getBisectStatus(index int, commitSha string, bisectInfo *git_commands.BisectInfo, bisectBounds *bisectBounds) BisectStatus {
|
func getBisectStatus(index int, commitHash string, bisectInfo *git_commands.BisectInfo, bisectBounds *bisectBounds) BisectStatus {
|
||||||
if !bisectInfo.Started() {
|
if !bisectInfo.Started() {
|
||||||
return BisectStatusNone
|
return BisectStatusNone
|
||||||
}
|
}
|
||||||
|
|
||||||
if bisectInfo.GetCurrentSha() == commitSha {
|
if bisectInfo.GetCurrentHash() == commitHash {
|
||||||
return BisectStatusCurrent
|
return BisectStatusCurrent
|
||||||
}
|
}
|
||||||
|
|
||||||
status, ok := bisectInfo.Status(commitSha)
|
status, ok := bisectInfo.Status(commitHash)
|
||||||
if ok {
|
if ok {
|
||||||
switch status {
|
switch status {
|
||||||
case git_commands.BisectStatusNew:
|
case git_commands.BisectStatusNew:
|
||||||
@ -298,7 +298,7 @@ func displayCommit(
|
|||||||
commit *models.Commit,
|
commit *models.Commit,
|
||||||
branchHeadsToVisualize *set.Set[string],
|
branchHeadsToVisualize *set.Set[string],
|
||||||
hasRebaseUpdateRefsConfig bool,
|
hasRebaseUpdateRefsConfig bool,
|
||||||
cherryPickedCommitShaSet *set.Set[string],
|
cherryPickedCommitHashSet *set.Set[string],
|
||||||
isMarkedBaseCommit bool,
|
isMarkedBaseCommit bool,
|
||||||
willBeRebased bool,
|
willBeRebased bool,
|
||||||
diffName string,
|
diffName string,
|
||||||
@ -312,7 +312,7 @@ func displayCommit(
|
|||||||
bisectInfo *git_commands.BisectInfo,
|
bisectInfo *git_commands.BisectInfo,
|
||||||
isYouAreHereCommit bool,
|
isYouAreHereCommit bool,
|
||||||
) []string {
|
) []string {
|
||||||
shaColor := getShaColor(commit, diffName, cherryPickedCommitShaSet, bisectStatus, bisectInfo)
|
hashColor := getHashColor(commit, diffName, cherryPickedCommitHashSet, bisectStatus, bisectInfo)
|
||||||
bisectString := getBisectStatusText(bisectStatus, bisectInfo)
|
bisectString := getBisectStatusText(bisectStatus, bisectInfo)
|
||||||
|
|
||||||
actionString := ""
|
actionString := ""
|
||||||
@ -331,7 +331,7 @@ func displayCommit(
|
|||||||
tagString = theme.DiffTerminalColor.SetBold().Sprint(strings.Join(commit.Tags, " ")) + " "
|
tagString = theme.DiffTerminalColor.SetBold().Sprint(strings.Join(commit.Tags, " ")) + " "
|
||||||
}
|
}
|
||||||
|
|
||||||
if branchHeadsToVisualize.Includes(commit.Sha) &&
|
if branchHeadsToVisualize.Includes(commit.Hash) &&
|
||||||
// Don't show branch head on commits that are already merged to a main branch
|
// Don't show branch head on commits that are already merged to a main branch
|
||||||
commit.Status != models.StatusMerged &&
|
commit.Status != models.StatusMerged &&
|
||||||
// Don't show branch head on a "pick" todo if the rebase.updateRefs config is on
|
// Don't show branch head on a "pick" todo if the rebase.updateRefs config is on
|
||||||
@ -369,11 +369,11 @@ func displayCommit(
|
|||||||
|
|
||||||
cols := make([]string, 0, 7)
|
cols := make([]string, 0, 7)
|
||||||
if commit.Divergence != models.DivergenceNone {
|
if commit.Divergence != models.DivergenceNone {
|
||||||
cols = append(cols, shaColor.Sprint(lo.Ternary(commit.Divergence == models.DivergenceLeft, "↑", "↓")))
|
cols = append(cols, hashColor.Sprint(lo.Ternary(commit.Divergence == models.DivergenceLeft, "↑", "↓")))
|
||||||
} else if icons.IsIconEnabled() {
|
} else if icons.IsIconEnabled() {
|
||||||
cols = append(cols, shaColor.Sprint(icons.IconForCommit(commit)))
|
cols = append(cols, hashColor.Sprint(icons.IconForCommit(commit)))
|
||||||
}
|
}
|
||||||
cols = append(cols, shaColor.Sprint(commit.ShortSha()))
|
cols = append(cols, hashColor.Sprint(commit.ShortHash()))
|
||||||
cols = append(cols, bisectString)
|
cols = append(cols, bisectString)
|
||||||
if fullDescription {
|
if fullDescription {
|
||||||
cols = append(cols, style.FgBlue.Sprint(
|
cols = append(cols, style.FgBlue.Sprint(
|
||||||
@ -410,10 +410,10 @@ func getBisectStatusColor(status BisectStatus) style.TextStyle {
|
|||||||
return style.FgWhite
|
return style.FgWhite
|
||||||
}
|
}
|
||||||
|
|
||||||
func getShaColor(
|
func getHashColor(
|
||||||
commit *models.Commit,
|
commit *models.Commit,
|
||||||
diffName string,
|
diffName string,
|
||||||
cherryPickedCommitShaSet *set.Set[string],
|
cherryPickedCommitHashSet *set.Set[string],
|
||||||
bisectStatus BisectStatus,
|
bisectStatus BisectStatus,
|
||||||
bisectInfo *git_commands.BisectInfo,
|
bisectInfo *git_commands.BisectInfo,
|
||||||
) style.TextStyle {
|
) style.TextStyle {
|
||||||
@ -421,31 +421,31 @@ func getShaColor(
|
|||||||
return getBisectStatusColor(bisectStatus)
|
return getBisectStatusColor(bisectStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
diffed := commit.Sha != "" && commit.Sha == diffName
|
diffed := commit.Hash != "" && commit.Hash == diffName
|
||||||
shaColor := theme.DefaultTextColor
|
hashColor := theme.DefaultTextColor
|
||||||
switch commit.Status {
|
switch commit.Status {
|
||||||
case models.StatusUnpushed:
|
case models.StatusUnpushed:
|
||||||
shaColor = style.FgRed
|
hashColor = style.FgRed
|
||||||
case models.StatusPushed:
|
case models.StatusPushed:
|
||||||
shaColor = style.FgYellow
|
hashColor = style.FgYellow
|
||||||
case models.StatusMerged:
|
case models.StatusMerged:
|
||||||
shaColor = style.FgGreen
|
hashColor = style.FgGreen
|
||||||
case models.StatusRebasing:
|
case models.StatusRebasing:
|
||||||
shaColor = style.FgBlue
|
hashColor = style.FgBlue
|
||||||
case models.StatusReflog:
|
case models.StatusReflog:
|
||||||
shaColor = style.FgBlue
|
hashColor = style.FgBlue
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
if diffed {
|
if diffed {
|
||||||
shaColor = theme.DiffTerminalColor
|
hashColor = theme.DiffTerminalColor
|
||||||
} else if cherryPickedCommitShaSet.Includes(commit.Sha) {
|
} else if cherryPickedCommitHashSet.Includes(commit.Hash) {
|
||||||
shaColor = theme.CherryPickedCommitTextStyle
|
hashColor = theme.CherryPickedCommitTextStyle
|
||||||
} else if commit.Divergence == models.DivergenceRight && commit.Status != models.StatusMerged {
|
} else if commit.Divergence == models.DivergenceRight && commit.Status != models.StatusMerged {
|
||||||
shaColor = style.FgBlue
|
hashColor = style.FgBlue
|
||||||
}
|
}
|
||||||
|
|
||||||
return shaColor
|
return hashColor
|
||||||
}
|
}
|
||||||
|
|
||||||
func actionColorMap(action todo.TodoCommand) style.TextStyle {
|
func actionColorMap(action todo.TodoCommand) style.TextStyle {
|
||||||
|
@ -28,14 +28,14 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
currentBranchName string
|
currentBranchName string
|
||||||
hasUpdateRefConfig bool
|
hasUpdateRefConfig bool
|
||||||
fullDescription bool
|
fullDescription bool
|
||||||
cherryPickedCommitShaSet *set.Set[string]
|
cherryPickedCommitHashSet *set.Set[string]
|
||||||
markedBaseCommit string
|
markedBaseCommit string
|
||||||
diffName string
|
diffName string
|
||||||
timeFormat string
|
timeFormat string
|
||||||
shortTimeFormat string
|
shortTimeFormat string
|
||||||
now time.Time
|
now time.Time
|
||||||
parseEmoji bool
|
parseEmoji bool
|
||||||
selectedCommitSha string
|
selectedCommitHash string
|
||||||
startIdx int
|
startIdx int
|
||||||
endIdx int
|
endIdx int
|
||||||
showGraph bool
|
showGraph bool
|
||||||
@ -51,57 +51,57 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
endIdx: 1,
|
endIdx: 1,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: "",
|
expected: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "some commits",
|
testName: "some commits",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1"},
|
{Name: "commit1", Hash: "hash1"},
|
||||||
{Name: "commit2", Sha: "sha2"},
|
{Name: "commit2", Hash: "hash2"},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 commit1
|
hash1 commit1
|
||||||
sha2 commit2
|
hash2 commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "commit with tags",
|
testName: "commit with tags",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Tags: []string{"tag1", "tag2"}},
|
{Name: "commit1", Hash: "hash1", Tags: []string{"tag1", "tag2"}},
|
||||||
{Name: "commit2", Sha: "sha2"},
|
{Name: "commit2", Hash: "hash2"},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 tag1 tag2 commit1
|
hash1 tag1 tag2 commit1
|
||||||
sha2 commit2
|
hash2 commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "show local branch head, except the current branch, main branches, or merged branches",
|
testName: "show local branch head, except the current branch, main branches, or merged branches",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1"},
|
{Name: "commit1", Hash: "hash1"},
|
||||||
{Name: "commit2", Sha: "sha2"},
|
{Name: "commit2", Hash: "hash2"},
|
||||||
{Name: "commit3", Sha: "sha3"},
|
{Name: "commit3", Hash: "hash3"},
|
||||||
{Name: "commit4", Sha: "sha4", Status: models.StatusMerged},
|
{Name: "commit4", Hash: "hash4", Status: models.StatusMerged},
|
||||||
},
|
},
|
||||||
branches: []*models.Branch{
|
branches: []*models.Branch{
|
||||||
{Name: "current-branch", CommitHash: "sha1", Head: true},
|
{Name: "current-branch", CommitHash: "hash1", Head: true},
|
||||||
{Name: "other-branch", CommitHash: "sha2", Head: false},
|
{Name: "other-branch", CommitHash: "hash2", Head: false},
|
||||||
{Name: "master", CommitHash: "sha3", Head: false},
|
{Name: "master", CommitHash: "hash3", Head: false},
|
||||||
{Name: "old-branch", CommitHash: "sha4", Head: false},
|
{Name: "old-branch", CommitHash: "hash4", Head: false},
|
||||||
},
|
},
|
||||||
currentBranchName: "current-branch",
|
currentBranchName: "current-branch",
|
||||||
hasUpdateRefConfig: true,
|
hasUpdateRefConfig: true,
|
||||||
@ -109,24 +109,24 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
endIdx: 4,
|
endIdx: 4,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 commit1
|
hash1 commit1
|
||||||
sha2 * commit2
|
hash2 * commit2
|
||||||
sha3 commit3
|
hash3 commit3
|
||||||
sha4 commit4
|
hash4 commit4
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "show local branch head for head commit if updateRefs is on",
|
testName: "show local branch head for head commit if updateRefs is on",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1"},
|
{Name: "commit1", Hash: "hash1"},
|
||||||
{Name: "commit2", Sha: "sha2"},
|
{Name: "commit2", Hash: "hash2"},
|
||||||
},
|
},
|
||||||
branches: []*models.Branch{
|
branches: []*models.Branch{
|
||||||
{Name: "current-branch", CommitHash: "sha1", Head: true},
|
{Name: "current-branch", CommitHash: "hash1", Head: true},
|
||||||
{Name: "other-branch", CommitHash: "sha1", Head: false},
|
{Name: "other-branch", CommitHash: "hash1", Head: false},
|
||||||
},
|
},
|
||||||
currentBranchName: "current-branch",
|
currentBranchName: "current-branch",
|
||||||
hasUpdateRefConfig: true,
|
hasUpdateRefConfig: true,
|
||||||
@ -134,22 +134,22 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 * commit1
|
hash1 * commit1
|
||||||
sha2 commit2
|
hash2 commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "don't show local branch head for head commit if updateRefs is off",
|
testName: "don't show local branch head for head commit if updateRefs is off",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1"},
|
{Name: "commit1", Hash: "hash1"},
|
||||||
{Name: "commit2", Sha: "sha2"},
|
{Name: "commit2", Hash: "hash2"},
|
||||||
},
|
},
|
||||||
branches: []*models.Branch{
|
branches: []*models.Branch{
|
||||||
{Name: "current-branch", CommitHash: "sha1", Head: true},
|
{Name: "current-branch", CommitHash: "hash1", Head: true},
|
||||||
{Name: "other-branch", CommitHash: "sha1", Head: false},
|
{Name: "other-branch", CommitHash: "hash1", Head: false},
|
||||||
},
|
},
|
||||||
currentBranchName: "current-branch",
|
currentBranchName: "current-branch",
|
||||||
hasUpdateRefConfig: false,
|
hasUpdateRefConfig: false,
|
||||||
@ -157,213 +157,213 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 commit1
|
hash1 commit1
|
||||||
sha2 commit2
|
hash2 commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "show local branch head and tag if both exist",
|
testName: "show local branch head and tag if both exist",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1"},
|
{Name: "commit1", Hash: "hash1"},
|
||||||
{Name: "commit2", Sha: "sha2", Tags: []string{"some-tag"}},
|
{Name: "commit2", Hash: "hash2", Tags: []string{"some-tag"}},
|
||||||
{Name: "commit3", Sha: "sha3"},
|
{Name: "commit3", Hash: "hash3"},
|
||||||
},
|
},
|
||||||
branches: []*models.Branch{
|
branches: []*models.Branch{
|
||||||
{Name: "some-branch", CommitHash: "sha2"},
|
{Name: "some-branch", CommitHash: "hash2"},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 3,
|
endIdx: 3,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 commit1
|
hash1 commit1
|
||||||
sha2 * some-tag commit2
|
hash2 * some-tag commit2
|
||||||
sha3 commit3
|
hash3 commit3
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "showing graph",
|
testName: "showing graph",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 5,
|
endIdx: 5,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 ⏣─╮ commit1
|
hash1 ⏣─╮ commit1
|
||||||
sha2 ◯ │ commit2
|
hash2 ◯ │ commit2
|
||||||
sha3 ◯─╯ commit3
|
hash3 ◯─╯ commit3
|
||||||
sha4 ◯ commit4
|
hash4 ◯ commit4
|
||||||
sha5 ◯ commit5
|
hash5 ◯ commit5
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "showing graph, including rebase commits",
|
testName: "showing graph, including rebase commits",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}, Action: todo.Pick},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 5,
|
endIdx: 5,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 pick commit1
|
hash1 pick commit1
|
||||||
sha2 pick commit2
|
hash2 pick commit2
|
||||||
sha3 ◯ <-- YOU ARE HERE --- commit3
|
hash3 ◯ <-- YOU ARE HERE --- commit3
|
||||||
sha4 ◯ commit4
|
hash4 ◯ commit4
|
||||||
sha5 ◯ commit5
|
hash5 ◯ commit5
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "showing graph, including rebase commits, with offset",
|
testName: "showing graph, including rebase commits, with offset",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}, Action: todo.Pick},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 1,
|
startIdx: 1,
|
||||||
endIdx: 5,
|
endIdx: 5,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha2 pick commit2
|
hash2 pick commit2
|
||||||
sha3 ◯ <-- YOU ARE HERE --- commit3
|
hash3 ◯ <-- YOU ARE HERE --- commit3
|
||||||
sha4 ◯ commit4
|
hash4 ◯ commit4
|
||||||
sha5 ◯ commit5
|
hash5 ◯ commit5
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "startIdx is past TODO commits",
|
testName: "startIdx is past TODO commits",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}, Action: todo.Pick},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 3,
|
startIdx: 3,
|
||||||
endIdx: 5,
|
endIdx: 5,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha4 ◯ commit4
|
hash4 ◯ commit4
|
||||||
sha5 ◯ commit5
|
hash5 ◯ commit5
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "only showing TODO commits",
|
testName: "only showing TODO commits",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}, Action: todo.Pick},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 pick commit1
|
hash1 pick commit1
|
||||||
sha2 pick commit2
|
hash2 pick commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "no TODO commits, towards bottom",
|
testName: "no TODO commits, towards bottom",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 4,
|
startIdx: 4,
|
||||||
endIdx: 5,
|
endIdx: 5,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha5 ◯ commit5
|
hash5 ◯ commit5
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "only TODO commits except last",
|
testName: "only TODO commits except last",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2", "sha3"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2", "hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}, Action: todo.Pick},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}, Action: todo.Pick},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}, Action: todo.Pick},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}, Action: todo.Pick},
|
||||||
{Name: "commit4", Sha: "sha4", Parents: []string{"sha5"}, Action: todo.Pick},
|
{Name: "commit4", Hash: "hash4", Parents: []string{"hash5"}, Action: todo.Pick},
|
||||||
{Name: "commit5", Sha: "sha5", Parents: []string{"sha7"}},
|
{Name: "commit5", Hash: "hash5", Parents: []string{"hash7"}},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: true,
|
showYouAreHereLabel: true,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 pick commit1
|
hash1 pick commit1
|
||||||
sha2 pick commit2
|
hash2 pick commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "don't show YOU ARE HERE label when not asked for (e.g. in branches panel)",
|
testName: "don't show YOU ARE HERE label when not asked for (e.g. in branches panel)",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", Parents: []string{"sha2"}, Action: todo.Pick},
|
{Name: "commit1", Hash: "hash1", Parents: []string{"hash2"}, Action: todo.Pick},
|
||||||
{Name: "commit2", Sha: "sha2", Parents: []string{"sha3"}},
|
{Name: "commit2", Hash: "hash2", Parents: []string{"hash3"}},
|
||||||
{Name: "commit3", Sha: "sha3", Parents: []string{"sha4"}},
|
{Name: "commit3", Hash: "hash3", Parents: []string{"hash4"}},
|
||||||
},
|
},
|
||||||
startIdx: 0,
|
startIdx: 0,
|
||||||
endIdx: 3,
|
endIdx: 3,
|
||||||
showGraph: true,
|
showGraph: true,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
showYouAreHereLabel: false,
|
showYouAreHereLabel: false,
|
||||||
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 pick commit1
|
hash1 pick commit1
|
||||||
sha2 ◯ commit2
|
hash2 ◯ commit2
|
||||||
sha3 ◯ commit3
|
hash3 ◯ commit3
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
testName: "custom time format",
|
testName: "custom time format",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Name: "commit1", Sha: "sha1", UnixTimestamp: 1577844184, AuthorName: "Jesse Duffield"},
|
{Name: "commit1", Hash: "hash1", UnixTimestamp: 1577844184, AuthorName: "Jesse Duffield"},
|
||||||
{Name: "commit2", Sha: "sha2", UnixTimestamp: 1576844184, AuthorName: "Jesse Duffield"},
|
{Name: "commit2", Hash: "hash2", UnixTimestamp: 1576844184, AuthorName: "Jesse Duffield"},
|
||||||
},
|
},
|
||||||
fullDescription: true,
|
fullDescription: true,
|
||||||
timeFormat: "2006-01-02",
|
timeFormat: "2006-01-02",
|
||||||
@ -372,11 +372,11 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
endIdx: 2,
|
endIdx: 2,
|
||||||
showGraph: false,
|
showGraph: false,
|
||||||
bisectInfo: git_commands.NewNullBisectInfo(),
|
bisectInfo: git_commands.NewNullBisectInfo(),
|
||||||
cherryPickedCommitShaSet: set.New[string](),
|
cherryPickedCommitHashSet: set.New[string](),
|
||||||
now: time.Date(2020, 1, 1, 5, 3, 4, 0, time.UTC),
|
now: time.Date(2020, 1, 1, 5, 3, 4, 0, time.UTC),
|
||||||
expected: formatExpected(`
|
expected: formatExpected(`
|
||||||
sha1 2:03AM Jesse Duffield commit1
|
hash1 2:03AM Jesse Duffield commit1
|
||||||
sha2 2019-12-20 Jesse Duffield commit2
|
hash2 2019-12-20 Jesse Duffield commit2
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -406,14 +406,14 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
|
|||||||
s.currentBranchName,
|
s.currentBranchName,
|
||||||
s.hasUpdateRefConfig,
|
s.hasUpdateRefConfig,
|
||||||
s.fullDescription,
|
s.fullDescription,
|
||||||
s.cherryPickedCommitShaSet,
|
s.cherryPickedCommitHashSet,
|
||||||
s.diffName,
|
s.diffName,
|
||||||
s.markedBaseCommit,
|
s.markedBaseCommit,
|
||||||
s.timeFormat,
|
s.timeFormat,
|
||||||
s.shortTimeFormat,
|
s.shortTimeFormat,
|
||||||
s.now,
|
s.now,
|
||||||
s.parseEmoji,
|
s.parseEmoji,
|
||||||
s.selectedCommitSha,
|
s.selectedCommitHash,
|
||||||
s.startIdx,
|
s.startIdx,
|
||||||
s.endIdx,
|
s.endIdx,
|
||||||
s.showGraph,
|
s.showGraph,
|
||||||
|
@ -24,17 +24,17 @@ const (
|
|||||||
type Pipe struct {
|
type Pipe struct {
|
||||||
fromPos int
|
fromPos int
|
||||||
toPos int
|
toPos int
|
||||||
fromSha string
|
fromHash string
|
||||||
toSha string
|
toHash string
|
||||||
kind PipeKind
|
kind PipeKind
|
||||||
style style.TextStyle
|
style style.TextStyle
|
||||||
}
|
}
|
||||||
|
|
||||||
var highlightStyle = style.FgLightWhite.SetBold()
|
var highlightStyle = style.FgLightWhite.SetBold()
|
||||||
|
|
||||||
func ContainsCommitSha(pipes []*Pipe, sha string) bool {
|
func ContainsCommitHash(pipes []*Pipe, hash string) bool {
|
||||||
for _, pipe := range pipes {
|
for _, pipe := range pipes {
|
||||||
if equalHashes(pipe.fromSha, sha) {
|
if equalHashes(pipe.fromHash, hash) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,13 +49,13 @@ func (self Pipe) right() int {
|
|||||||
return max(self.fromPos, self.toPos)
|
return max(self.fromPos, self.toPos)
|
||||||
}
|
}
|
||||||
|
|
||||||
func RenderCommitGraph(commits []*models.Commit, selectedCommitSha string, getStyle func(c *models.Commit) style.TextStyle) []string {
|
func RenderCommitGraph(commits []*models.Commit, selectedCommitHash string, getStyle func(c *models.Commit) style.TextStyle) []string {
|
||||||
pipeSets := GetPipeSets(commits, getStyle)
|
pipeSets := GetPipeSets(commits, getStyle)
|
||||||
if len(pipeSets) == 0 {
|
if len(pipeSets) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
lines := RenderAux(pipeSets, commits, selectedCommitSha)
|
lines := RenderAux(pipeSets, commits, selectedCommitHash)
|
||||||
|
|
||||||
return lines
|
return lines
|
||||||
}
|
}
|
||||||
@ -65,7 +65,7 @@ func GetPipeSets(commits []*models.Commit, getStyle func(c *models.Commit) style
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pipes := []*Pipe{{fromPos: 0, toPos: 0, fromSha: "START", toSha: commits[0].Sha, kind: STARTS, style: style.FgDefault}}
|
pipes := []*Pipe{{fromPos: 0, toPos: 0, fromHash: "START", toHash: commits[0].Hash, kind: STARTS, style: style.FgDefault}}
|
||||||
|
|
||||||
return lo.Map(commits, func(commit *models.Commit, _ int) []*Pipe {
|
return lo.Map(commits, func(commit *models.Commit, _ int) []*Pipe {
|
||||||
pipes = getNextPipes(pipes, commit, getStyle)
|
pipes = getNextPipes(pipes, commit, getStyle)
|
||||||
@ -73,7 +73,7 @@ func GetPipeSets(commits []*models.Commit, getStyle func(c *models.Commit) style
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func RenderAux(pipeSets [][]*Pipe, commits []*models.Commit, selectedCommitSha string) []string {
|
func RenderAux(pipeSets [][]*Pipe, commits []*models.Commit, selectedCommitHash string) []string {
|
||||||
maxProcs := runtime.GOMAXPROCS(0)
|
maxProcs := runtime.GOMAXPROCS(0)
|
||||||
|
|
||||||
// splitting up the rendering of the graph into multiple goroutines allows us to render the graph in parallel
|
// splitting up the rendering of the graph into multiple goroutines allows us to render the graph in parallel
|
||||||
@ -98,7 +98,7 @@ func RenderAux(pipeSets [][]*Pipe, commits []*models.Commit, selectedCommitSha s
|
|||||||
if k > 0 {
|
if k > 0 {
|
||||||
prevCommit = commits[k-1]
|
prevCommit = commits[k-1]
|
||||||
}
|
}
|
||||||
line := renderPipeSet(pipeSet, selectedCommitSha, prevCommit)
|
line := renderPipeSet(pipeSet, selectedCommitHash, prevCommit)
|
||||||
innerLines = append(innerLines, line)
|
innerLines = append(innerLines, line)
|
||||||
}
|
}
|
||||||
chunks[i] = innerLines
|
chunks[i] = innerLines
|
||||||
@ -130,7 +130,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
// (this only happens when we're doing `git log --all`). These will be tacked onto the far end.
|
// (this only happens when we're doing `git log --all`). These will be tacked onto the far end.
|
||||||
pos := maxPos + 1
|
pos := maxPos + 1
|
||||||
for _, pipe := range currentPipes {
|
for _, pipe := range currentPipes {
|
||||||
if equalHashes(pipe.toSha, commit.Sha) {
|
if equalHashes(pipe.toHash, commit.Hash) {
|
||||||
// turns out this commit does have a descendant so we'll place it right under the first instance
|
// turns out this commit does have a descendant so we'll place it right under the first instance
|
||||||
pos = pipe.toPos
|
pos = pipe.toPos
|
||||||
break
|
break
|
||||||
@ -146,8 +146,8 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pos,
|
fromPos: pos,
|
||||||
toPos: pos,
|
toPos: pos,
|
||||||
fromSha: commit.Sha,
|
fromHash: commit.Hash,
|
||||||
toSha: commit.Parents[0],
|
toHash: commit.Parents[0],
|
||||||
kind: STARTS,
|
kind: STARTS,
|
||||||
style: getStyle(commit),
|
style: getStyle(commit),
|
||||||
})
|
})
|
||||||
@ -155,8 +155,8 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pos,
|
fromPos: pos,
|
||||||
toPos: pos,
|
toPos: pos,
|
||||||
fromSha: commit.Sha,
|
fromHash: commit.Hash,
|
||||||
toSha: models.EmptyTreeCommitHash,
|
toHash: models.EmptyTreeCommitHash,
|
||||||
kind: STARTS,
|
kind: STARTS,
|
||||||
style: getStyle(commit),
|
style: getStyle(commit),
|
||||||
})
|
})
|
||||||
@ -164,7 +164,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
|
|
||||||
traversedSpotsForContinuingPipes := set.New[int]()
|
traversedSpotsForContinuingPipes := set.New[int]()
|
||||||
for _, pipe := range currentPipes {
|
for _, pipe := range currentPipes {
|
||||||
if !equalHashes(pipe.toSha, commit.Sha) {
|
if !equalHashes(pipe.toHash, commit.Hash) {
|
||||||
traversedSpotsForContinuingPipes.Add(pipe.toPos)
|
traversedSpotsForContinuingPipes.Add(pipe.toPos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,13 +203,13 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, pipe := range currentPipes {
|
for _, pipe := range currentPipes {
|
||||||
if equalHashes(pipe.toSha, commit.Sha) {
|
if equalHashes(pipe.toHash, commit.Hash) {
|
||||||
// terminating here
|
// terminating here
|
||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pipe.toPos,
|
fromPos: pipe.toPos,
|
||||||
toPos: pos,
|
toPos: pos,
|
||||||
fromSha: pipe.fromSha,
|
fromHash: pipe.fromHash,
|
||||||
toSha: pipe.toSha,
|
toHash: pipe.toHash,
|
||||||
kind: TERMINATES,
|
kind: TERMINATES,
|
||||||
style: pipe.style,
|
style: pipe.style,
|
||||||
})
|
})
|
||||||
@ -220,8 +220,8 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pipe.toPos,
|
fromPos: pipe.toPos,
|
||||||
toPos: availablePos,
|
toPos: availablePos,
|
||||||
fromSha: pipe.fromSha,
|
fromHash: pipe.fromHash,
|
||||||
toSha: pipe.toSha,
|
toHash: pipe.toHash,
|
||||||
kind: CONTINUES,
|
kind: CONTINUES,
|
||||||
style: pipe.style,
|
style: pipe.style,
|
||||||
})
|
})
|
||||||
@ -236,8 +236,8 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pos,
|
fromPos: pos,
|
||||||
toPos: availablePos,
|
toPos: availablePos,
|
||||||
fromSha: commit.Sha,
|
fromHash: commit.Hash,
|
||||||
toSha: parent,
|
toHash: parent,
|
||||||
kind: STARTS,
|
kind: STARTS,
|
||||||
style: getStyle(commit),
|
style: getStyle(commit),
|
||||||
})
|
})
|
||||||
@ -247,7 +247,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, pipe := range currentPipes {
|
for _, pipe := range currentPipes {
|
||||||
if !equalHashes(pipe.toSha, commit.Sha) && pipe.toPos > pos {
|
if !equalHashes(pipe.toHash, commit.Hash) && pipe.toPos > pos {
|
||||||
// continuing on, potentially moving left to fill in a blank spot
|
// continuing on, potentially moving left to fill in a blank spot
|
||||||
last := pipe.toPos
|
last := pipe.toPos
|
||||||
for i := pipe.toPos; i > pos; i-- {
|
for i := pipe.toPos; i > pos; i-- {
|
||||||
@ -260,8 +260,8 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
newPipes = append(newPipes, &Pipe{
|
newPipes = append(newPipes, &Pipe{
|
||||||
fromPos: pipe.toPos,
|
fromPos: pipe.toPos,
|
||||||
toPos: last,
|
toPos: last,
|
||||||
fromSha: pipe.fromSha,
|
fromHash: pipe.fromHash,
|
||||||
toSha: pipe.toSha,
|
toHash: pipe.toHash,
|
||||||
kind: CONTINUES,
|
kind: CONTINUES,
|
||||||
style: pipe.style,
|
style: pipe.style,
|
||||||
})
|
})
|
||||||
@ -282,7 +282,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
|
|||||||
|
|
||||||
func renderPipeSet(
|
func renderPipeSet(
|
||||||
pipes []*Pipe,
|
pipes []*Pipe,
|
||||||
selectedCommitSha string,
|
selectedCommitHash string,
|
||||||
prevCommit *models.Commit,
|
prevCommit *models.Commit,
|
||||||
) string {
|
) string {
|
||||||
maxPos := 0
|
maxPos := 0
|
||||||
@ -329,10 +329,10 @@ func renderPipeSet(
|
|||||||
// we don't want to highlight two commits if they're contiguous. We only want
|
// we don't want to highlight two commits if they're contiguous. We only want
|
||||||
// to highlight multiple things if there's an actual visible pipe involved.
|
// to highlight multiple things if there's an actual visible pipe involved.
|
||||||
highlight := true
|
highlight := true
|
||||||
if prevCommit != nil && equalHashes(prevCommit.Sha, selectedCommitSha) {
|
if prevCommit != nil && equalHashes(prevCommit.Hash, selectedCommitHash) {
|
||||||
highlight = false
|
highlight = false
|
||||||
for _, pipe := range pipes {
|
for _, pipe := range pipes {
|
||||||
if equalHashes(pipe.fromSha, selectedCommitSha) && (pipe.kind != TERMINATES || pipe.fromPos != pipe.toPos) {
|
if equalHashes(pipe.fromHash, selectedCommitHash) && (pipe.kind != TERMINATES || pipe.fromPos != pipe.toPos) {
|
||||||
highlight = true
|
highlight = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,7 +341,7 @@ func renderPipeSet(
|
|||||||
// so we have our commit pos again, now it's time to build the cells.
|
// so we have our commit pos again, now it's time to build the cells.
|
||||||
// we'll handle the one that's sourced from our selected commit last so that it can override the other cells.
|
// we'll handle the one that's sourced from our selected commit last so that it can override the other cells.
|
||||||
selectedPipes, nonSelectedPipes := utils.Partition(pipes, func(pipe *Pipe) bool {
|
selectedPipes, nonSelectedPipes := utils.Partition(pipes, func(pipe *Pipe) bool {
|
||||||
return highlight && equalHashes(pipe.fromSha, selectedCommitSha)
|
return highlight && equalHashes(pipe.fromHash, selectedCommitHash)
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, pipe := range nonSelectedPipes {
|
for _, pipe := range nonSelectedPipes {
|
||||||
@ -385,7 +385,7 @@ func renderPipeSet(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func equalHashes(a, b string) bool {
|
func equalHashes(a, b string) bool {
|
||||||
// if our selectedCommitSha is an empty string we treat that as meaning there is no selected commit sha
|
// if our selectedCommitHash is an empty string we treat that as meaning there is no selected commit hash
|
||||||
if a == "" || b == "" {
|
if a == "" || b == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -24,20 +24,20 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with some merges",
|
name: "with some merges",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3"}},
|
{Hash: "2", Parents: []string{"3"}},
|
||||||
{Sha: "3", Parents: []string{"4"}},
|
{Hash: "3", Parents: []string{"4"}},
|
||||||
{Sha: "4", Parents: []string{"5", "7"}},
|
{Hash: "4", Parents: []string{"5", "7"}},
|
||||||
{Sha: "7", Parents: []string{"5"}},
|
{Hash: "7", Parents: []string{"5"}},
|
||||||
{Sha: "5", Parents: []string{"8"}},
|
{Hash: "5", Parents: []string{"8"}},
|
||||||
{Sha: "8", Parents: []string{"9"}},
|
{Hash: "8", Parents: []string{"9"}},
|
||||||
{Sha: "9", Parents: []string{"A", "B"}},
|
{Hash: "9", Parents: []string{"A", "B"}},
|
||||||
{Sha: "B", Parents: []string{"D"}},
|
{Hash: "B", Parents: []string{"D"}},
|
||||||
{Sha: "D", Parents: []string{"D"}},
|
{Hash: "D", Parents: []string{"D"}},
|
||||||
{Sha: "A", Parents: []string{"E"}},
|
{Hash: "A", Parents: []string{"E"}},
|
||||||
{Sha: "E", Parents: []string{"F"}},
|
{Hash: "E", Parents: []string{"F"}},
|
||||||
{Sha: "F", Parents: []string{"D"}},
|
{Hash: "F", Parents: []string{"D"}},
|
||||||
{Sha: "D", Parents: []string{"G"}},
|
{Hash: "D", Parents: []string{"G"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -58,12 +58,12 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left",
|
name: "with a path that has room to move to the left",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "4", Parents: []string{"3", "5"}},
|
{Hash: "4", Parents: []string{"3", "5"}},
|
||||||
{Sha: "3", Parents: []string{"5"}},
|
{Hash: "3", Parents: []string{"5"}},
|
||||||
{Sha: "5", Parents: []string{"6"}},
|
{Hash: "5", Parents: []string{"6"}},
|
||||||
{Sha: "6", Parents: []string{"7"}},
|
{Hash: "6", Parents: []string{"7"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -76,13 +76,13 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a new commit",
|
name: "with a new commit",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "4", Parents: []string{"3", "5"}},
|
{Hash: "4", Parents: []string{"3", "5"}},
|
||||||
{Sha: "Z", Parents: []string{"Z"}},
|
{Hash: "Z", Parents: []string{"Z"}},
|
||||||
{Sha: "3", Parents: []string{"5"}},
|
{Hash: "3", Parents: []string{"5"}},
|
||||||
{Sha: "5", Parents: []string{"6"}},
|
{Hash: "5", Parents: []string{"6"}},
|
||||||
{Sha: "6", Parents: []string{"7"}},
|
{Hash: "6", Parents: []string{"7"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -96,12 +96,12 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left and continues",
|
name: "with a path that has room to move to the left and continues",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "3", Parents: []string{"5", "4"}},
|
{Hash: "3", Parents: []string{"5", "4"}},
|
||||||
{Sha: "5", Parents: []string{"7", "8"}},
|
{Hash: "5", Parents: []string{"7", "8"}},
|
||||||
{Sha: "4", Parents: []string{"7"}},
|
{Hash: "4", Parents: []string{"7"}},
|
||||||
{Sha: "7", Parents: []string{"11"}},
|
{Hash: "7", Parents: []string{"11"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -114,13 +114,13 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left and continues",
|
name: "with a path that has room to move to the left and continues",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "3", Parents: []string{"5", "4"}},
|
{Hash: "3", Parents: []string{"5", "4"}},
|
||||||
{Sha: "5", Parents: []string{"7", "8"}},
|
{Hash: "5", Parents: []string{"7", "8"}},
|
||||||
{Sha: "7", Parents: []string{"4", "A"}},
|
{Hash: "7", Parents: []string{"4", "A"}},
|
||||||
{Sha: "4", Parents: []string{"B"}},
|
{Hash: "4", Parents: []string{"B"}},
|
||||||
{Sha: "B", Parents: []string{"C"}},
|
{Hash: "B", Parents: []string{"C"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -134,11 +134,11 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left and continues",
|
name: "with a path that has room to move to the left and continues",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2", "3"}},
|
{Hash: "1", Parents: []string{"2", "3"}},
|
||||||
{Sha: "3", Parents: []string{"2"}},
|
{Hash: "3", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"4", "5"}},
|
{Hash: "2", Parents: []string{"4", "5"}},
|
||||||
{Sha: "4", Parents: []string{"6", "7"}},
|
{Hash: "4", Parents: []string{"6", "7"}},
|
||||||
{Sha: "6", Parents: []string{"8"}},
|
{Hash: "6", Parents: []string{"8"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ⏣─╮
|
1 ⏣─╮
|
||||||
@ -150,11 +150,11 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "new merge path fills gap before continuing path on right",
|
name: "new merge path fills gap before continuing path on right",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2", "3", "4", "5"}},
|
{Hash: "1", Parents: []string{"2", "3", "4", "5"}},
|
||||||
{Sha: "4", Parents: []string{"2"}},
|
{Hash: "4", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"A"}},
|
{Hash: "2", Parents: []string{"A"}},
|
||||||
{Sha: "A", Parents: []string{"6", "B"}},
|
{Hash: "A", Parents: []string{"6", "B"}},
|
||||||
{Sha: "B", Parents: []string{"C"}},
|
{Hash: "B", Parents: []string{"C"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ⏣─┬─┬─╮
|
1 ⏣─┬─┬─╮
|
||||||
@ -166,14 +166,14 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left and continues",
|
name: "with a path that has room to move to the left and continues",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "3", Parents: []string{"5", "4"}},
|
{Hash: "3", Parents: []string{"5", "4"}},
|
||||||
{Sha: "5", Parents: []string{"7", "8"}},
|
{Hash: "5", Parents: []string{"7", "8"}},
|
||||||
{Sha: "7", Parents: []string{"4", "A"}},
|
{Hash: "7", Parents: []string{"4", "A"}},
|
||||||
{Sha: "4", Parents: []string{"B"}},
|
{Hash: "4", Parents: []string{"B"}},
|
||||||
{Sha: "B", Parents: []string{"C"}},
|
{Hash: "B", Parents: []string{"C"}},
|
||||||
{Sha: "C", Parents: []string{"D"}},
|
{Hash: "C", Parents: []string{"D"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -188,16 +188,16 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "with a path that has room to move to the left and continues",
|
name: "with a path that has room to move to the left and continues",
|
||||||
commits: []*models.Commit{
|
commits: []*models.Commit{
|
||||||
{Sha: "1", Parents: []string{"2"}},
|
{Hash: "1", Parents: []string{"2"}},
|
||||||
{Sha: "2", Parents: []string{"3", "4"}},
|
{Hash: "2", Parents: []string{"3", "4"}},
|
||||||
{Sha: "3", Parents: []string{"5", "4"}},
|
{Hash: "3", Parents: []string{"5", "4"}},
|
||||||
{Sha: "5", Parents: []string{"7", "G"}},
|
{Hash: "5", Parents: []string{"7", "G"}},
|
||||||
{Sha: "7", Parents: []string{"8", "A"}},
|
{Hash: "7", Parents: []string{"8", "A"}},
|
||||||
{Sha: "8", Parents: []string{"4", "E"}},
|
{Hash: "8", Parents: []string{"4", "E"}},
|
||||||
{Sha: "4", Parents: []string{"B"}},
|
{Hash: "4", Parents: []string{"B"}},
|
||||||
{Sha: "B", Parents: []string{"C"}},
|
{Hash: "B", Parents: []string{"C"}},
|
||||||
{Sha: "C", Parents: []string{"D"}},
|
{Hash: "C", Parents: []string{"D"}},
|
||||||
{Sha: "D", Parents: []string{"F"}},
|
{Hash: "D", Parents: []string{"F"}},
|
||||||
},
|
},
|
||||||
expectedOutput: `
|
expectedOutput: `
|
||||||
1 ◯
|
1 ◯
|
||||||
@ -231,7 +231,7 @@ func TestRenderCommitGraph(t *testing.T) {
|
|||||||
|
|
||||||
output := ""
|
output := ""
|
||||||
for i, line := range lines {
|
for i, line := range lines {
|
||||||
description := test.commits[i].Sha
|
description := test.commits[i].Hash
|
||||||
output += strings.TrimSpace(description+" "+utils.Decolorise(line)) + "\n"
|
output += strings.TrimSpace(description+" "+utils.Decolorise(line)) + "\n"
|
||||||
}
|
}
|
||||||
t.Log("\nactual: \n" + output)
|
t.Log("\nactual: \n" + output)
|
||||||
@ -263,32 +263,32 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "single cell",
|
name: "single cell",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "b", kind: TERMINATES, style: cyan},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: TERMINATES, style: cyan},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "b", toSha: "c", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: STARTS, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a"},
|
prevCommit: &models.Commit{Hash: "a"},
|
||||||
expectedStr: "◯",
|
expectedStr: "◯",
|
||||||
expectedStyles: []style.TextStyle{green},
|
expectedStyles: []style.TextStyle{green},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "single cell, selected",
|
name: "single cell, selected",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "selected", kind: TERMINATES, style: cyan},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "selected", kind: TERMINATES, style: cyan},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "c", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "c", kind: STARTS, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a"},
|
prevCommit: &models.Commit{Hash: "a"},
|
||||||
expectedStr: "◯",
|
expectedStr: "◯",
|
||||||
expectedStyles: []style.TextStyle{highlightStyle},
|
expectedStyles: []style.TextStyle{highlightStyle},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "terminating hook and starting hook, selected",
|
name: "terminating hook and starting hook, selected",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "selected", kind: TERMINATES, style: cyan},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "selected", kind: TERMINATES, style: cyan},
|
||||||
{fromPos: 1, toPos: 0, fromSha: "c", toSha: "selected", kind: TERMINATES, style: yellow},
|
{fromPos: 1, toPos: 0, fromHash: "c", toHash: "selected", kind: TERMINATES, style: yellow},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "d", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "d", kind: STARTS, style: green},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "selected", toSha: "e", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 1, fromHash: "selected", toHash: "e", kind: STARTS, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a"},
|
prevCommit: &models.Commit{Hash: "a"},
|
||||||
expectedStr: "⏣─╮",
|
expectedStr: "⏣─╮",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
highlightStyle, highlightStyle, highlightStyle,
|
highlightStyle, highlightStyle, highlightStyle,
|
||||||
@ -297,12 +297,12 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "terminating hook and starting hook, prioritise the terminating one",
|
name: "terminating hook and starting hook, prioritise the terminating one",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "b", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: TERMINATES, style: red},
|
||||||
{fromPos: 1, toPos: 0, fromSha: "c", toSha: "b", kind: TERMINATES, style: magenta},
|
{fromPos: 1, toPos: 0, fromHash: "c", toHash: "b", kind: TERMINATES, style: magenta},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "b", toSha: "d", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "d", kind: STARTS, style: green},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "b", toSha: "e", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 1, fromHash: "b", toHash: "e", kind: STARTS, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a"},
|
prevCommit: &models.Commit{Hash: "a"},
|
||||||
expectedStr: "⏣─│",
|
expectedStr: "⏣─│",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
green, green, magenta,
|
green, green, magenta,
|
||||||
@ -311,13 +311,13 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "starting and terminating pipe sharing some space",
|
name: "starting and terminating pipe sharing some space",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "b1", toSha: "b2", kind: CONTINUES, style: magenta},
|
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "b2", kind: CONTINUES, style: magenta},
|
||||||
{fromPos: 3, toPos: 0, fromSha: "e1", toSha: "a2", kind: TERMINATES, style: green},
|
{fromPos: 3, toPos: 0, fromHash: "e1", toHash: "a2", kind: TERMINATES, style: green},
|
||||||
{fromPos: 0, toPos: 2, fromSha: "a2", toSha: "c3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 2, fromHash: "a2", toHash: "c3", kind: STARTS, style: yellow},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "⏣─│─┬─╯",
|
expectedStr: "⏣─│─┬─╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow, yellow, magenta, yellow, yellow, green, green,
|
yellow, yellow, magenta, yellow, yellow, green, green,
|
||||||
@ -326,13 +326,13 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "starting and terminating pipe sharing some space, with selection",
|
name: "starting and terminating pipe sharing some space, with selection",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "selected", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "selected", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "b1", toSha: "b2", kind: CONTINUES, style: magenta},
|
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "b2", kind: CONTINUES, style: magenta},
|
||||||
{fromPos: 3, toPos: 0, fromSha: "e1", toSha: "selected", kind: TERMINATES, style: green},
|
{fromPos: 3, toPos: 0, fromHash: "e1", toHash: "selected", kind: TERMINATES, style: green},
|
||||||
{fromPos: 0, toPos: 2, fromSha: "selected", toSha: "c3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 2, fromHash: "selected", toHash: "c3", kind: STARTS, style: yellow},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "⏣───╮ ╯",
|
expectedStr: "⏣───╮ ╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
highlightStyle, highlightStyle, highlightStyle, highlightStyle, highlightStyle, nothing, green,
|
highlightStyle, highlightStyle, highlightStyle, highlightStyle, highlightStyle, nothing, green,
|
||||||
@ -341,12 +341,12 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "many terminating pipes",
|
name: "many terminating pipes",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 1, toPos: 0, fromSha: "b1", toSha: "a2", kind: TERMINATES, style: magenta},
|
{fromPos: 1, toPos: 0, fromHash: "b1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||||
{fromPos: 2, toPos: 0, fromSha: "c1", toSha: "a2", kind: TERMINATES, style: green},
|
{fromPos: 2, toPos: 0, fromHash: "c1", toHash: "a2", kind: TERMINATES, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "◯─┴─╯",
|
expectedStr: "◯─┴─╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow, magenta, magenta, green, green,
|
yellow, magenta, magenta, green, green,
|
||||||
@ -355,13 +355,13 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "starting pipe passing through",
|
name: "starting pipe passing through",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 0, toPos: 3, fromSha: "a2", toSha: "d3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 3, fromHash: "a2", toHash: "d3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "b1", toSha: "b3", kind: CONTINUES, style: magenta},
|
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "b3", kind: CONTINUES, style: magenta},
|
||||||
{fromPos: 2, toPos: 2, fromSha: "c1", toSha: "c3", kind: CONTINUES, style: green},
|
{fromPos: 2, toPos: 2, fromHash: "c1", toHash: "c3", kind: CONTINUES, style: green},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "⏣─│─│─╮",
|
expectedStr: "⏣─│─│─╮",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow, yellow, magenta, yellow, green, yellow, yellow,
|
yellow, yellow, magenta, yellow, green, yellow, yellow,
|
||||||
@ -370,13 +370,13 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "starting and terminating path crossing continuing path",
|
name: "starting and terminating path crossing continuing path",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "a2", toSha: "b3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 1, fromHash: "a2", toHash: "b3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "b1", toSha: "a2", kind: CONTINUES, style: green},
|
{fromPos: 1, toPos: 1, fromHash: "b1", toHash: "a2", kind: CONTINUES, style: green},
|
||||||
{fromPos: 2, toPos: 0, fromSha: "c1", toSha: "a2", kind: TERMINATES, style: magenta},
|
{fromPos: 2, toPos: 0, fromHash: "c1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "⏣─│─╯",
|
expectedStr: "⏣─│─╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow, yellow, green, magenta, magenta,
|
yellow, yellow, green, magenta, magenta,
|
||||||
@ -385,13 +385,13 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "another clash of starting and terminating paths",
|
name: "another clash of starting and terminating paths",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "a2", toSha: "b3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 1, fromHash: "a2", toHash: "b3", kind: STARTS, style: yellow},
|
||||||
{fromPos: 2, toPos: 2, fromSha: "c1", toSha: "c3", kind: CONTINUES, style: green},
|
{fromPos: 2, toPos: 2, fromHash: "c1", toHash: "c3", kind: CONTINUES, style: green},
|
||||||
{fromPos: 3, toPos: 0, fromSha: "d1", toSha: "a2", kind: TERMINATES, style: magenta},
|
{fromPos: 3, toPos: 0, fromHash: "d1", toHash: "a2", kind: TERMINATES, style: magenta},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "a1"},
|
prevCommit: &models.Commit{Hash: "a1"},
|
||||||
expectedStr: "⏣─┬─│─╯",
|
expectedStr: "⏣─┬─│─╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow, yellow, yellow, magenta, green, magenta, magenta,
|
yellow, yellow, yellow, magenta, green, magenta, magenta,
|
||||||
@ -400,10 +400,10 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "commit whose previous commit is selected",
|
name: "commit whose previous commit is selected",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: yellow},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: yellow},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "selected"},
|
prevCommit: &models.Commit{Hash: "selected"},
|
||||||
expectedStr: "◯",
|
expectedStr: "◯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
yellow,
|
yellow,
|
||||||
@ -412,10 +412,10 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "commit whose previous commit is selected and is a merge commit",
|
name: "commit whose previous commit is selected and is a merge commit",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "selected", toSha: "b3", kind: CONTINUES, style: red},
|
{fromPos: 1, toPos: 1, fromHash: "selected", toHash: "b3", kind: CONTINUES, style: red},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "selected"},
|
prevCommit: &models.Commit{Hash: "selected"},
|
||||||
expectedStr: "◯ │",
|
expectedStr: "◯ │",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
highlightStyle, nothing, highlightStyle,
|
highlightStyle, nothing, highlightStyle,
|
||||||
@ -424,11 +424,11 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "commit whose previous commit is selected and is a merge commit, with continuing pipe inbetween",
|
name: "commit whose previous commit is selected and is a merge commit, with continuing pipe inbetween",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "selected", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "z1", toSha: "z3", kind: CONTINUES, style: green},
|
{fromPos: 1, toPos: 1, fromHash: "z1", toHash: "z3", kind: CONTINUES, style: green},
|
||||||
{fromPos: 2, toPos: 2, fromSha: "selected", toSha: "b3", kind: CONTINUES, style: red},
|
{fromPos: 2, toPos: 2, fromHash: "selected", toHash: "b3", kind: CONTINUES, style: red},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "selected"},
|
prevCommit: &models.Commit{Hash: "selected"},
|
||||||
expectedStr: "◯ │ │",
|
expectedStr: "◯ │ │",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
highlightStyle, nothing, green, nothing, highlightStyle,
|
highlightStyle, nothing, green, nothing, highlightStyle,
|
||||||
@ -437,12 +437,12 @@ func TestRenderPipeSet(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "when previous commit is selected, not a merge commit, and spawns a continuing pipe",
|
name: "when previous commit is selected, not a merge commit, and spawns a continuing pipe",
|
||||||
pipes: []*Pipe{
|
pipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a1", toSha: "a2", kind: TERMINATES, style: red},
|
{fromPos: 0, toPos: 0, fromHash: "a1", toHash: "a2", kind: TERMINATES, style: red},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a2", toSha: "a3", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 0, fromHash: "a2", toHash: "a3", kind: STARTS, style: green},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "a2", toSha: "b3", kind: STARTS, style: green},
|
{fromPos: 0, toPos: 1, fromHash: "a2", toHash: "b3", kind: STARTS, style: green},
|
||||||
{fromPos: 1, toPos: 0, fromSha: "selected", toSha: "a2", kind: TERMINATES, style: yellow},
|
{fromPos: 1, toPos: 0, fromHash: "selected", toHash: "a2", kind: TERMINATES, style: yellow},
|
||||||
},
|
},
|
||||||
prevCommit: &models.Commit{Sha: "selected"},
|
prevCommit: &models.Commit{Hash: "selected"},
|
||||||
expectedStr: "⏣─╯",
|
expectedStr: "⏣─╯",
|
||||||
expectedStyles: []style.TextStyle{
|
expectedStyles: []style.TextStyle{
|
||||||
highlightStyle, highlightStyle, highlightStyle,
|
highlightStyle, highlightStyle, highlightStyle,
|
||||||
@ -483,43 +483,43 @@ func TestGetNextPipes(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
prevPipes: []*Pipe{
|
prevPipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "b", kind: STARTS, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: STARTS, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
commit: &models.Commit{
|
commit: &models.Commit{
|
||||||
Sha: "b",
|
Hash: "b",
|
||||||
Parents: []string{"c"},
|
Parents: []string{"c"},
|
||||||
},
|
},
|
||||||
expected: []*Pipe{
|
expected: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "b", kind: TERMINATES, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: TERMINATES, style: style.FgDefault},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "b", toSha: "c", kind: STARTS, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: STARTS, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prevPipes: []*Pipe{
|
prevPipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "b", kind: TERMINATES, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "b", kind: TERMINATES, style: style.FgDefault},
|
||||||
{fromPos: 0, toPos: 0, fromSha: "b", toSha: "c", kind: STARTS, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: STARTS, style: style.FgDefault},
|
||||||
{fromPos: 0, toPos: 1, fromSha: "b", toSha: "d", kind: STARTS, style: style.FgDefault},
|
{fromPos: 0, toPos: 1, fromHash: "b", toHash: "d", kind: STARTS, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
commit: &models.Commit{
|
commit: &models.Commit{
|
||||||
Sha: "d",
|
Hash: "d",
|
||||||
Parents: []string{"e"},
|
Parents: []string{"e"},
|
||||||
},
|
},
|
||||||
expected: []*Pipe{
|
expected: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "b", toSha: "c", kind: CONTINUES, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "b", toHash: "c", kind: CONTINUES, style: style.FgDefault},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "b", toSha: "d", kind: TERMINATES, style: style.FgDefault},
|
{fromPos: 1, toPos: 1, fromHash: "b", toHash: "d", kind: TERMINATES, style: style.FgDefault},
|
||||||
{fromPos: 1, toPos: 1, fromSha: "d", toSha: "e", kind: STARTS, style: style.FgDefault},
|
{fromPos: 1, toPos: 1, fromHash: "d", toHash: "e", kind: STARTS, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prevPipes: []*Pipe{
|
prevPipes: []*Pipe{
|
||||||
{fromPos: 0, toPos: 0, fromSha: "a", toSha: "root", kind: TERMINATES, style: style.FgDefault},
|
{fromPos: 0, toPos: 0, fromHash: "a", toHash: "root", kind: TERMINATES, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
commit: &models.Commit{
|
commit: &models.Commit{
|
||||||
Sha: "root",
|
Hash: "root",
|
||||||
Parents: []string{},
|
Parents: []string{},
|
||||||
},
|
},
|
||||||
expected: []*Pipe{
|
expected: []*Pipe{
|
||||||
{fromPos: 1, toPos: 1, fromSha: "root", toSha: models.EmptyTreeCommitHash, kind: STARTS, style: style.FgDefault},
|
{fromPos: 1, toPos: 1, fromHash: "root", toHash: models.EmptyTreeCommitHash, kind: STARTS, style: style.FgDefault},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -557,7 +557,7 @@ func BenchmarkRenderCommitGraph(b *testing.B) {
|
|||||||
|
|
||||||
func generateCommits(count int) []*models.Commit {
|
func generateCommits(count int) []*models.Commit {
|
||||||
rnd := rand.New(rand.NewSource(1234))
|
rnd := rand.New(rand.NewSource(1234))
|
||||||
pool := []*models.Commit{{Sha: "a", AuthorName: "A"}}
|
pool := []*models.Commit{{Hash: "a", AuthorName: "A"}}
|
||||||
commits := make([]*models.Commit, 0, count)
|
commits := make([]*models.Commit, 0, count)
|
||||||
authorPool := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
|
authorPool := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
|
||||||
for len(commits) < count {
|
for len(commits) < count {
|
||||||
@ -574,12 +574,12 @@ func generateCommits(count int) []*models.Commit {
|
|||||||
newParent = pool[j]
|
newParent = pool[j]
|
||||||
} else {
|
} else {
|
||||||
newParent = &models.Commit{
|
newParent = &models.Commit{
|
||||||
Sha: fmt.Sprintf("%s%d", currentCommit.Sha, j),
|
Hash: fmt.Sprintf("%s%d", currentCommit.Hash, j),
|
||||||
AuthorName: authorPool[rnd.Intn(len(authorPool))],
|
AuthorName: authorPool[rnd.Intn(len(authorPool))],
|
||||||
}
|
}
|
||||||
pool = append(pool, newParent)
|
pool = append(pool, newParent)
|
||||||
}
|
}
|
||||||
currentCommit.Parents = append(currentCommit.Parents, newParent.Sha)
|
currentCommit.Parents = append(currentCommit.Parents, newParent.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
commits = append(commits, currentCommit)
|
commits = append(commits, currentCommit)
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription bool, cherryPickedCommitShaSet *set.Set[string], diffName string, now time.Time, timeFormat string, shortTimeFormat string, parseEmoji bool) [][]string {
|
func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription bool, cherryPickedCommitHashSet *set.Set[string], diffName string, now time.Time, timeFormat string, shortTimeFormat string, parseEmoji bool) [][]string {
|
||||||
var displayFunc func(*models.Commit, reflogCommitDisplayAttributes) []string
|
var displayFunc func(*models.Commit, reflogCommitDisplayAttributes) []string
|
||||||
if fullDescription {
|
if fullDescription {
|
||||||
displayFunc = getFullDescriptionDisplayStringsForReflogCommit
|
displayFunc = getFullDescriptionDisplayStringsForReflogCommit
|
||||||
@ -21,8 +21,8 @@ func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription
|
|||||||
}
|
}
|
||||||
|
|
||||||
return lo.Map(commits, func(commit *models.Commit, _ int) []string {
|
return lo.Map(commits, func(commit *models.Commit, _ int) []string {
|
||||||
diffed := commit.Sha == diffName
|
diffed := commit.Hash == diffName
|
||||||
cherryPicked := cherryPickedCommitShaSet.Includes(commit.Sha)
|
cherryPicked := cherryPickedCommitHashSet.Includes(commit.Hash)
|
||||||
return displayFunc(commit,
|
return displayFunc(commit,
|
||||||
reflogCommitDisplayAttributes{
|
reflogCommitDisplayAttributes{
|
||||||
cherryPicked: cherryPicked,
|
cherryPicked: cherryPicked,
|
||||||
@ -35,17 +35,17 @@ func GetReflogCommitListDisplayStrings(commits []*models.Commit, fullDescription
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func reflogShaColor(cherryPicked, diffed bool) style.TextStyle {
|
func reflogHashColor(cherryPicked, diffed bool) style.TextStyle {
|
||||||
if diffed {
|
if diffed {
|
||||||
return theme.DiffTerminalColor
|
return theme.DiffTerminalColor
|
||||||
}
|
}
|
||||||
|
|
||||||
shaColor := style.FgBlue
|
hashColor := style.FgBlue
|
||||||
if cherryPicked {
|
if cherryPicked {
|
||||||
shaColor = theme.CherryPickedCommitTextStyle
|
hashColor = theme.CherryPickedCommitTextStyle
|
||||||
}
|
}
|
||||||
|
|
||||||
return shaColor
|
return hashColor
|
||||||
}
|
}
|
||||||
|
|
||||||
type reflogCommitDisplayAttributes struct {
|
type reflogCommitDisplayAttributes struct {
|
||||||
@ -64,7 +64,7 @@ func getFullDescriptionDisplayStringsForReflogCommit(c *models.Commit, attrs ref
|
|||||||
}
|
}
|
||||||
|
|
||||||
return []string{
|
return []string{
|
||||||
reflogShaColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortSha()),
|
reflogHashColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortHash()),
|
||||||
style.FgMagenta.Sprint(utils.UnixToDateSmart(attrs.now, c.UnixTimestamp, attrs.timeFormat, attrs.shortTimeFormat)),
|
style.FgMagenta.Sprint(utils.UnixToDateSmart(attrs.now, c.UnixTimestamp, attrs.timeFormat, attrs.shortTimeFormat)),
|
||||||
theme.DefaultTextColor.Sprint(name),
|
theme.DefaultTextColor.Sprint(name),
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ func getDisplayStringsForReflogCommit(c *models.Commit, attrs reflogCommitDispla
|
|||||||
}
|
}
|
||||||
|
|
||||||
return []string{
|
return []string{
|
||||||
reflogShaColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortSha()),
|
reflogHashColor(attrs.cherryPicked, attrs.diffed).Sprint(c.ShortHash()),
|
||||||
theme.DefaultTextColor.Sprint(name),
|
theme.DefaultTextColor.Sprint(name),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package custom_commands
|
package custom_commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/fsmiamoto/git-todo-parser/todo"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
|
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
|
||||||
)
|
)
|
||||||
@ -19,11 +20,47 @@ func NewSessionStateLoader(c *helpers.HelperCommon, refsHelper *helpers.RefsHelp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Commit struct {
|
||||||
|
Hash string
|
||||||
|
Sha string
|
||||||
|
Name string
|
||||||
|
Status models.CommitStatus
|
||||||
|
Action todo.TodoCommand
|
||||||
|
Tags []string
|
||||||
|
ExtraInfo string
|
||||||
|
AuthorName string
|
||||||
|
AuthorEmail string
|
||||||
|
UnixTimestamp int64
|
||||||
|
Divergence models.Divergence
|
||||||
|
Parents []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func commitWrapperFromModelCommit(commit *models.Commit) *Commit {
|
||||||
|
if commit == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Commit{
|
||||||
|
Hash: commit.Hash,
|
||||||
|
Sha: commit.Hash,
|
||||||
|
Name: commit.Name,
|
||||||
|
Status: commit.Status,
|
||||||
|
Action: commit.Action,
|
||||||
|
Tags: commit.Tags,
|
||||||
|
ExtraInfo: commit.ExtraInfo,
|
||||||
|
AuthorName: commit.AuthorName,
|
||||||
|
AuthorEmail: commit.AuthorEmail,
|
||||||
|
UnixTimestamp: commit.UnixTimestamp,
|
||||||
|
Divergence: commit.Divergence,
|
||||||
|
Parents: commit.Parents,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SessionState captures the current state of the application for use in custom commands
|
// SessionState captures the current state of the application for use in custom commands
|
||||||
type SessionState struct {
|
type SessionState struct {
|
||||||
SelectedLocalCommit *models.Commit
|
SelectedLocalCommit *Commit
|
||||||
SelectedReflogCommit *models.Commit
|
SelectedReflogCommit *Commit
|
||||||
SelectedSubCommit *models.Commit
|
SelectedSubCommit *Commit
|
||||||
SelectedFile *models.File
|
SelectedFile *models.File
|
||||||
SelectedPath string
|
SelectedPath string
|
||||||
SelectedLocalBranch *models.Branch
|
SelectedLocalBranch *models.Branch
|
||||||
@ -41,8 +78,8 @@ func (self *SessionStateLoader) call() *SessionState {
|
|||||||
return &SessionState{
|
return &SessionState{
|
||||||
SelectedFile: self.c.Contexts().Files.GetSelectedFile(),
|
SelectedFile: self.c.Contexts().Files.GetSelectedFile(),
|
||||||
SelectedPath: self.c.Contexts().Files.GetSelectedPath(),
|
SelectedPath: self.c.Contexts().Files.GetSelectedPath(),
|
||||||
SelectedLocalCommit: self.c.Contexts().LocalCommits.GetSelected(),
|
SelectedLocalCommit: commitWrapperFromModelCommit(self.c.Contexts().LocalCommits.GetSelected()),
|
||||||
SelectedReflogCommit: self.c.Contexts().ReflogCommits.GetSelected(),
|
SelectedReflogCommit: commitWrapperFromModelCommit(self.c.Contexts().ReflogCommits.GetSelected()),
|
||||||
SelectedLocalBranch: self.c.Contexts().Branches.GetSelected(),
|
SelectedLocalBranch: self.c.Contexts().Branches.GetSelected(),
|
||||||
SelectedRemoteBranch: self.c.Contexts().RemoteBranches.GetSelected(),
|
SelectedRemoteBranch: self.c.Contexts().RemoteBranches.GetSelected(),
|
||||||
SelectedRemote: self.c.Contexts().Remotes.GetSelected(),
|
SelectedRemote: self.c.Contexts().Remotes.GetSelected(),
|
||||||
@ -50,7 +87,7 @@ func (self *SessionStateLoader) call() *SessionState {
|
|||||||
SelectedStashEntry: self.c.Contexts().Stash.GetSelected(),
|
SelectedStashEntry: self.c.Contexts().Stash.GetSelected(),
|
||||||
SelectedCommitFile: self.c.Contexts().CommitFiles.GetSelectedFile(),
|
SelectedCommitFile: self.c.Contexts().CommitFiles.GetSelectedFile(),
|
||||||
SelectedCommitFilePath: self.c.Contexts().CommitFiles.GetSelectedPath(),
|
SelectedCommitFilePath: self.c.Contexts().CommitFiles.GetSelectedPath(),
|
||||||
SelectedSubCommit: self.c.Contexts().SubCommits.GetSelected(),
|
SelectedSubCommit: commitWrapperFromModelCommit(self.c.Contexts().SubCommits.GetSelected()),
|
||||||
SelectedWorktree: self.c.Contexts().Worktrees.GetSelected(),
|
SelectedWorktree: self.c.Contexts().Worktrees.GetSelected(),
|
||||||
CheckedOutBranch: self.refsHelper.GetCheckedOutRef(),
|
CheckedOutBranch: self.refsHelper.GetCheckedOutRef(),
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,7 @@ type IListPanelState interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ListItem interface {
|
type ListItem interface {
|
||||||
// ID is a SHA when the item is a commit, a filename when the item is a file, 'stash@{4}' when it's a stash entry, 'my_branch' when it's a branch
|
// ID is a hash when the item is a commit, a filename when the item is a file, 'stash@{4}' when it's a stash entry, 'my_branch' when it's a branch
|
||||||
ID() string
|
ID() string
|
||||||
|
|
||||||
// Description is something we would show in a message e.g. '123as14: push blah' for a commit
|
// Description is something we would show in a message e.g. '123as14: push blah' for a commit
|
||||||
|
@ -355,7 +355,7 @@ func chineseTranslationSet() TranslationSet {
|
|||||||
// 实际视图 (actual view) 是附加视图 (extras view),未来,我打算为附加视图提供更多选项卡,但现在,上面的文本只需要提及“命令日志”这个部分
|
// 实际视图 (actual view) 是附加视图 (extras view),未来,我打算为附加视图提供更多选项卡,但现在,上面的文本只需要提及“命令日志”这个部分
|
||||||
OpenCommandLogMenu: "打开命令日志菜单",
|
OpenCommandLogMenu: "打开命令日志菜单",
|
||||||
ShowingGitDiff: "显示输出:",
|
ShowingGitDiff: "显示输出:",
|
||||||
CopyCommitShaToClipboard: "将提交的 SHA 复制到剪贴板",
|
CopyCommitHashToClipboard: "将提交的 hash 复制到剪贴板",
|
||||||
CopyCommitMessageToClipboard: "将提交消息复制到剪贴板",
|
CopyCommitMessageToClipboard: "将提交消息复制到剪贴板",
|
||||||
CopyBranchNameToClipboard: "将分支名称复制到剪贴板",
|
CopyBranchNameToClipboard: "将分支名称复制到剪贴板",
|
||||||
CopyPathToClipboard: "将文件名复制到剪贴板",
|
CopyPathToClipboard: "将文件名复制到剪贴板",
|
||||||
|
@ -308,7 +308,7 @@ func dutchTranslationSet() TranslationSet {
|
|||||||
SwapDiff: "Keer diff richting om",
|
SwapDiff: "Keer diff richting om",
|
||||||
ViewDiffingOptions: "Open diff menu",
|
ViewDiffingOptions: "Open diff menu",
|
||||||
ShowingGitDiff: "Laat output zien voor:",
|
ShowingGitDiff: "Laat output zien voor:",
|
||||||
CopyCommitShaToClipboard: "Kopieer commit SHA naar klembord",
|
CopyCommitHashToClipboard: "Kopieer commit hash naar klembord",
|
||||||
CopyCommitMessageToClipboard: "Kopieer commit bericht naar klembord",
|
CopyCommitMessageToClipboard: "Kopieer commit bericht naar klembord",
|
||||||
CopyBranchNameToClipboard: "Kopieer branch name naar klembord",
|
CopyBranchNameToClipboard: "Kopieer branch name naar klembord",
|
||||||
CopyPathToClipboard: "Kopieer de bestandsnaam naar het klembord",
|
CopyPathToClipboard: "Kopieer de bestandsnaam naar het klembord",
|
||||||
|
@ -571,8 +571,8 @@ type TranslationSet struct {
|
|||||||
OpenCommandLogMenuTooltip string
|
OpenCommandLogMenuTooltip string
|
||||||
ShowingGitDiff string
|
ShowingGitDiff string
|
||||||
CommitDiff string
|
CommitDiff string
|
||||||
CopyCommitShaToClipboard string
|
CopyCommitHashToClipboard string
|
||||||
CommitSha string
|
CommitHash string
|
||||||
CommitURL string
|
CommitURL string
|
||||||
CopyCommitMessageToClipboard string
|
CopyCommitMessageToClipboard string
|
||||||
CommitMessage string
|
CommitMessage string
|
||||||
@ -855,7 +855,7 @@ type Actions struct {
|
|||||||
CopyCommitMessageToClipboard string
|
CopyCommitMessageToClipboard string
|
||||||
CopyCommitSubjectToClipboard string
|
CopyCommitSubjectToClipboard string
|
||||||
CopyCommitDiffToClipboard string
|
CopyCommitDiffToClipboard string
|
||||||
CopyCommitSHAToClipboard string
|
CopyCommitHashToClipboard string
|
||||||
CopyCommitURLToClipboard string
|
CopyCommitURLToClipboard string
|
||||||
CopyCommitAuthorToClipboard string
|
CopyCommitAuthorToClipboard string
|
||||||
CopyCommitAttributeToClipboard string
|
CopyCommitAttributeToClipboard string
|
||||||
@ -1534,8 +1534,8 @@ func EnglishTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenuTooltip: "View options for the command log e.g. show/hide the command log and focus the command log.",
|
OpenCommandLogMenuTooltip: "View options for the command log e.g. show/hide the command log and focus the command log.",
|
||||||
ShowingGitDiff: "Showing output for:",
|
ShowingGitDiff: "Showing output for:",
|
||||||
CommitDiff: "Commit diff",
|
CommitDiff: "Commit diff",
|
||||||
CopyCommitShaToClipboard: "Copy commit SHA to clipboard",
|
CopyCommitHashToClipboard: "Copy commit hash to clipboard",
|
||||||
CommitSha: "Commit SHA",
|
CommitHash: "Commit hash",
|
||||||
CommitURL: "Commit URL",
|
CommitURL: "Commit URL",
|
||||||
CopyCommitMessageToClipboard: "Copy commit message to clipboard",
|
CopyCommitMessageToClipboard: "Copy commit message to clipboard",
|
||||||
CommitMessage: "Commit message",
|
CommitMessage: "Commit message",
|
||||||
@ -1772,7 +1772,7 @@ func EnglishTranslationSet() TranslationSet {
|
|||||||
CopyCommitMessageToClipboard: "Copy commit message to clipboard",
|
CopyCommitMessageToClipboard: "Copy commit message to clipboard",
|
||||||
CopyCommitSubjectToClipboard: "Copy commit subject to clipboard",
|
CopyCommitSubjectToClipboard: "Copy commit subject to clipboard",
|
||||||
CopyCommitDiffToClipboard: "Copy commit diff to clipboard",
|
CopyCommitDiffToClipboard: "Copy commit diff to clipboard",
|
||||||
CopyCommitSHAToClipboard: "Copy full commit SHA to clipboard",
|
CopyCommitHashToClipboard: "Copy full commit hash to clipboard",
|
||||||
CopyCommitURLToClipboard: "Copy commit URL to clipboard",
|
CopyCommitURLToClipboard: "Copy commit URL to clipboard",
|
||||||
CopyCommitAuthorToClipboard: "Copy commit author to clipboard",
|
CopyCommitAuthorToClipboard: "Copy commit author to clipboard",
|
||||||
CopyCommitAttributeToClipboard: "Copy to clipboard",
|
CopyCommitAttributeToClipboard: "Copy to clipboard",
|
||||||
@ -1875,11 +1875,11 @@ func EnglishTranslationSet() TranslationSet {
|
|||||||
},
|
},
|
||||||
Log: Log{
|
Log: Log{
|
||||||
EditRebase: "Beginning interactive rebase at '{{.ref}}'",
|
EditRebase: "Beginning interactive rebase at '{{.ref}}'",
|
||||||
MoveCommitUp: "Moving TODO down: '{{.shortSha}}'",
|
MoveCommitUp: "Moving TODO down: '{{.shortHash}}'",
|
||||||
MoveCommitDown: "Moving TODO down: '{{.shortSha}}'",
|
MoveCommitDown: "Moving TODO down: '{{.shortHash}}'",
|
||||||
CherryPickCommits: "Cherry-picking commits:\n'{{.commitLines}}'",
|
CherryPickCommits: "Cherry-picking commits:\n'{{.commitLines}}'",
|
||||||
HandleUndo: "Undoing last conflict resolution",
|
HandleUndo: "Undoing last conflict resolution",
|
||||||
HandleMidRebaseCommand: "Updating rebase action of commit {{.shortSha}} to '{{.action}}'",
|
HandleMidRebaseCommand: "Updating rebase action of commit {{.shortHash}} to '{{.action}}'",
|
||||||
RemoveFile: "Deleting path '{{.path}}'",
|
RemoveFile: "Deleting path '{{.path}}'",
|
||||||
CopyToClipboard: "Copying '{{.str}}' to clipboard",
|
CopyToClipboard: "Copying '{{.str}}' to clipboard",
|
||||||
Remove: "Removing '{{.filename}}'",
|
Remove: "Removing '{{.filename}}'",
|
||||||
|
@ -367,8 +367,8 @@ func japaneseTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenu: "コマンドログメニューを開く",
|
OpenCommandLogMenu: "コマンドログメニューを開く",
|
||||||
// LcShowingGitDiff: "Showing output for:",
|
// LcShowingGitDiff: "Showing output for:",
|
||||||
CommitDiff: "コミットの差分",
|
CommitDiff: "コミットの差分",
|
||||||
CopyCommitShaToClipboard: "コミットのSHAをクリップボードにコピー",
|
CopyCommitHashToClipboard: "コミットのhashをクリップボードにコピー",
|
||||||
CommitSha: "コミットのSHA",
|
CommitHash: "コミットのhash",
|
||||||
CommitURL: "コミットのURL",
|
CommitURL: "コミットのURL",
|
||||||
CopyCommitMessageToClipboard: "コミットメッセージをクリップボードにコピー",
|
CopyCommitMessageToClipboard: "コミットメッセージをクリップボードにコピー",
|
||||||
CommitMessage: "コミットメッセージ",
|
CommitMessage: "コミットメッセージ",
|
||||||
@ -496,7 +496,7 @@ func japaneseTranslationSet() TranslationSet {
|
|||||||
CreateAnnotatedTag: "注釈付きタグを作成",
|
CreateAnnotatedTag: "注釈付きタグを作成",
|
||||||
CopyCommitMessageToClipboard: "コミットメッセージをクリップボードにコピー",
|
CopyCommitMessageToClipboard: "コミットメッセージをクリップボードにコピー",
|
||||||
CopyCommitDiffToClipboard: "コミットの差分をクリップボードにコピー",
|
CopyCommitDiffToClipboard: "コミットの差分をクリップボードにコピー",
|
||||||
CopyCommitSHAToClipboard: "コミットSHAをクリップボードにコピー",
|
CopyCommitHashToClipboard: "コミットhashをクリップボードにコピー",
|
||||||
CopyCommitURLToClipboard: "コミットのURLをクリップボードにコピー",
|
CopyCommitURLToClipboard: "コミットのURLをクリップボードにコピー",
|
||||||
CopyCommitAuthorToClipboard: "コミットの作成者名をクリップボードにコピー",
|
CopyCommitAuthorToClipboard: "コミットの作成者名をクリップボードにコピー",
|
||||||
CopyCommitAttributeToClipboard: "クリップボードにコピー",
|
CopyCommitAttributeToClipboard: "クリップボードにコピー",
|
||||||
|
@ -361,8 +361,8 @@ func koreanTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenu: "명령어 로그 메뉴 열기",
|
OpenCommandLogMenu: "명령어 로그 메뉴 열기",
|
||||||
ShowingGitDiff: "Showing output for:",
|
ShowingGitDiff: "Showing output for:",
|
||||||
CommitDiff: "커밋의 iff",
|
CommitDiff: "커밋의 iff",
|
||||||
CopyCommitShaToClipboard: "커밋 SHA를 클립보드에 복사",
|
CopyCommitHashToClipboard: "커밋 해시를 클립보드에 복사",
|
||||||
CommitSha: "커밋 SHA",
|
CommitHash: "커밋 해시",
|
||||||
CommitURL: "커밋 URL",
|
CommitURL: "커밋 URL",
|
||||||
CopyCommitMessageToClipboard: "커밋 메시지를 클립보드에 복사",
|
CopyCommitMessageToClipboard: "커밋 메시지를 클립보드에 복사",
|
||||||
CommitMessage: "커밋 메시지",
|
CommitMessage: "커밋 메시지",
|
||||||
@ -486,7 +486,7 @@ func koreanTranslationSet() TranslationSet {
|
|||||||
CreateAnnotatedTag: "Create annotated tag",
|
CreateAnnotatedTag: "Create annotated tag",
|
||||||
CopyCommitMessageToClipboard: "커밋 메시지를 클립보드에 복사",
|
CopyCommitMessageToClipboard: "커밋 메시지를 클립보드에 복사",
|
||||||
CopyCommitDiffToClipboard: "커밋 diff를 클립보드에 복사",
|
CopyCommitDiffToClipboard: "커밋 diff를 클립보드에 복사",
|
||||||
CopyCommitSHAToClipboard: "커밋 SHA를 클립보드에 복사",
|
CopyCommitHashToClipboard: "커밋 해시를 클립보드에 복사",
|
||||||
CopyCommitURLToClipboard: "커밋 URL를 클립보드에 복사",
|
CopyCommitURLToClipboard: "커밋 URL를 클립보드에 복사",
|
||||||
CopyCommitAuthorToClipboard: "커밋 작성자를 클립보드에 복사",
|
CopyCommitAuthorToClipboard: "커밋 작성자를 클립보드에 복사",
|
||||||
CopyCommitAttributeToClipboard: "클립보드에 복사",
|
CopyCommitAttributeToClipboard: "클립보드에 복사",
|
||||||
|
@ -548,8 +548,8 @@ func polishTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenuTooltip: "Pokaż opcje dla dziennika poleceń, np. pokazywanie/ukrywanie dziennika poleceń i skupienie na dzienniku poleceń.",
|
OpenCommandLogMenuTooltip: "Pokaż opcje dla dziennika poleceń, np. pokazywanie/ukrywanie dziennika poleceń i skupienie na dzienniku poleceń.",
|
||||||
ShowingGitDiff: "Pokazuje wynik dla:",
|
ShowingGitDiff: "Pokazuje wynik dla:",
|
||||||
CommitDiff: "Różnice commita",
|
CommitDiff: "Różnice commita",
|
||||||
CopyCommitShaToClipboard: "Kopiuj SHA commita do schowka",
|
CopyCommitHashToClipboard: "Kopiuj hash commita do schowka",
|
||||||
CommitSha: "SHA commita",
|
CommitHash: "hash commita",
|
||||||
CommitURL: "URL commita",
|
CommitURL: "URL commita",
|
||||||
CopyCommitMessageToClipboard: "Kopiuj wiadomość commita do schowka",
|
CopyCommitMessageToClipboard: "Kopiuj wiadomość commita do schowka",
|
||||||
CommitMessage: "Wiadomość commita",
|
CommitMessage: "Wiadomość commita",
|
||||||
@ -784,7 +784,7 @@ func polishTranslationSet() TranslationSet {
|
|||||||
CopyCommitMessageToClipboard: "Kopiuj wiadomość commita do schowka",
|
CopyCommitMessageToClipboard: "Kopiuj wiadomość commita do schowka",
|
||||||
CopyCommitSubjectToClipboard: "Kopiuj temat commita do schowka",
|
CopyCommitSubjectToClipboard: "Kopiuj temat commita do schowka",
|
||||||
CopyCommitDiffToClipboard: "Kopiuj różnice commita do schowka",
|
CopyCommitDiffToClipboard: "Kopiuj różnice commita do schowka",
|
||||||
CopyCommitSHAToClipboard: "Kopiuj SHA commita do schowka",
|
CopyCommitHashToClipboard: "Kopiuj hash commita do schowka",
|
||||||
CopyCommitURLToClipboard: "Kopiuj URL commita do schowka",
|
CopyCommitURLToClipboard: "Kopiuj URL commita do schowka",
|
||||||
CopyCommitAuthorToClipboard: "Kopiuj autora commita do schowka",
|
CopyCommitAuthorToClipboard: "Kopiuj autora commita do schowka",
|
||||||
CopyCommitAttributeToClipboard: "Kopiuj do schowka",
|
CopyCommitAttributeToClipboard: "Kopiuj do schowka",
|
||||||
@ -887,11 +887,11 @@ func polishTranslationSet() TranslationSet {
|
|||||||
},
|
},
|
||||||
Log: Log{
|
Log: Log{
|
||||||
EditRebase: "Rozpoczynanie interaktywnego rebazowania od '{{.ref}}'",
|
EditRebase: "Rozpoczynanie interaktywnego rebazowania od '{{.ref}}'",
|
||||||
MoveCommitUp: "Przenoszenie TODO w dół: '{{.shortSha}}'",
|
MoveCommitUp: "Przenoszenie TODO w dół: '{{.shortHash}}'",
|
||||||
MoveCommitDown: "Przenoszenie TODO w dół: '{{.shortSha}}'",
|
MoveCommitDown: "Przenoszenie TODO w dół: '{{.shortHash}}'",
|
||||||
CherryPickCommits: "Cherry-picking commitów:\n'{{.commitLines}}'",
|
CherryPickCommits: "Cherry-picking commitów:\n'{{.commitLines}}'",
|
||||||
HandleUndo: "Cofanie ostatniego rozwiązania konfliktu",
|
HandleUndo: "Cofanie ostatniego rozwiązania konfliktu",
|
||||||
HandleMidRebaseCommand: "Aktualizacja akcji rebazowania commita {{.shortSha}} na '{{.action}}'",
|
HandleMidRebaseCommand: "Aktualizacja akcji rebazowania commita {{.shortHash}} na '{{.action}}'",
|
||||||
RemoveFile: "Usuwanie ścieżki '{{.path}}'",
|
RemoveFile: "Usuwanie ścieżki '{{.path}}'",
|
||||||
CopyToClipboard: "Kopiowanie '{{.str}}' do schowka",
|
CopyToClipboard: "Kopiowanie '{{.str}}' do schowka",
|
||||||
Remove: "Usuwanie '{{.filename}}'",
|
Remove: "Usuwanie '{{.filename}}'",
|
||||||
|
@ -422,8 +422,8 @@ func RussianTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenu: "Открыть меню журнала команд",
|
OpenCommandLogMenu: "Открыть меню журнала команд",
|
||||||
ShowingGitDiff: "Показывает вывод для:",
|
ShowingGitDiff: "Показывает вывод для:",
|
||||||
CommitDiff: "Разница коммита",
|
CommitDiff: "Разница коммита",
|
||||||
CopyCommitShaToClipboard: "Скопировать SHA коммита в буфер обмена",
|
CopyCommitHashToClipboard: "Скопировать hash коммита в буфер обмена",
|
||||||
CommitSha: "SHA коммита",
|
CommitHash: "hash коммита",
|
||||||
CommitURL: "URL коммита",
|
CommitURL: "URL коммита",
|
||||||
CopyCommitMessageToClipboard: "Скопировать сообщение коммита в буфер обмена",
|
CopyCommitMessageToClipboard: "Скопировать сообщение коммита в буфер обмена",
|
||||||
CommitMessage: "Полное сообщение коммита",
|
CommitMessage: "Полное сообщение коммита",
|
||||||
@ -579,7 +579,7 @@ func RussianTranslationSet() TranslationSet {
|
|||||||
CopyCommitMessageToClipboard: "Скопировать сообщение коммита в буфер обмена",
|
CopyCommitMessageToClipboard: "Скопировать сообщение коммита в буфер обмена",
|
||||||
CopyCommitSubjectToClipboard: "Скопировать тему коммита в буфер обмена",
|
CopyCommitSubjectToClipboard: "Скопировать тему коммита в буфер обмена",
|
||||||
CopyCommitDiffToClipboard: "Скопировать сравнения коммита в буфер обмена",
|
CopyCommitDiffToClipboard: "Скопировать сравнения коммита в буфер обмена",
|
||||||
CopyCommitSHAToClipboard: "Скопировать SHA коммита в буфер обмена",
|
CopyCommitHashToClipboard: "Скопировать hash коммита в буфер обмена",
|
||||||
CopyCommitURLToClipboard: "Скопировать URL коммита в буфер обмена",
|
CopyCommitURLToClipboard: "Скопировать URL коммита в буфер обмена",
|
||||||
CopyCommitAuthorToClipboard: "Скопировать автора коммита в буфер обмена",
|
CopyCommitAuthorToClipboard: "Скопировать автора коммита в буфер обмена",
|
||||||
CopyCommitAttributeToClipboard: "Скопировать в буфер обмена",
|
CopyCommitAttributeToClipboard: "Скопировать в буфер обмена",
|
||||||
|
@ -454,8 +454,8 @@ func traditionalChineseTranslationSet() TranslationSet {
|
|||||||
OpenCommandLogMenu: "開啟命令記錄選單",
|
OpenCommandLogMenu: "開啟命令記錄選單",
|
||||||
ShowingGitDiff: "顯示輸出:",
|
ShowingGitDiff: "顯示輸出:",
|
||||||
CommitDiff: "提交差異",
|
CommitDiff: "提交差異",
|
||||||
CopyCommitShaToClipboard: "複製提交 SHA 到剪貼簿",
|
CopyCommitHashToClipboard: "複製提交 hash 到剪貼簿",
|
||||||
CommitSha: "提交 SHA",
|
CommitHash: "提交 hash",
|
||||||
CommitURL: "提交 URL",
|
CommitURL: "提交 URL",
|
||||||
CopyCommitMessageToClipboard: "複製提交訊息到剪貼簿",
|
CopyCommitMessageToClipboard: "複製提交訊息到剪貼簿",
|
||||||
CommitMessage: "提交訊息",
|
CommitMessage: "提交訊息",
|
||||||
@ -647,7 +647,7 @@ func traditionalChineseTranslationSet() TranslationSet {
|
|||||||
CreateAnnotatedTag: "建立附註標籤",
|
CreateAnnotatedTag: "建立附註標籤",
|
||||||
CopyCommitMessageToClipboard: "將提交訊息複製到剪貼簿",
|
CopyCommitMessageToClipboard: "將提交訊息複製到剪貼簿",
|
||||||
CopyCommitDiffToClipboard: "將提交差異複製到剪貼簿",
|
CopyCommitDiffToClipboard: "將提交差異複製到剪貼簿",
|
||||||
CopyCommitSHAToClipboard: "將提交 SHA 複製到剪貼簿",
|
CopyCommitHashToClipboard: "將提交 hash 複製到剪貼簿",
|
||||||
CopyCommitURLToClipboard: "將提交 URL 複製到剪貼簿",
|
CopyCommitURLToClipboard: "將提交 URL 複製到剪貼簿",
|
||||||
CopyCommitAuthorToClipboard: "將提交作者複製到剪貼簿",
|
CopyCommitAuthorToClipboard: "將提交作者複製到剪貼簿",
|
||||||
CopyCommitAttributeToClipboard: "複製到剪貼簿",
|
CopyCommitAttributeToClipboard: "複製到剪貼簿",
|
||||||
|
@ -55,3 +55,11 @@ func (self *Git) Version() *git_commands.GitVersion {
|
|||||||
}
|
}
|
||||||
return version
|
return version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Git) GetCommitHash(ref string) string {
|
||||||
|
output, err := self.shell.runCommandWithOutput([]string{"git", "rev-parse", ref})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not get commit hash: %v", err)
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(output)
|
||||||
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package custom_commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
var AccessCommitProperties = NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: "Run a command that accesses properties of a commit",
|
||||||
|
ExtraCmdArgs: []string{},
|
||||||
|
Skip: false,
|
||||||
|
SetupRepo: func(shell *Shell) {
|
||||||
|
shell.EmptyCommit("my change")
|
||||||
|
},
|
||||||
|
SetupConfig: func(cfg *config.AppConfig) {
|
||||||
|
cfg.UserConfig.CustomCommands = []config.CustomCommand{
|
||||||
|
{
|
||||||
|
Key: "X",
|
||||||
|
Context: "commits",
|
||||||
|
Command: "printf '%s\n%s\n%s' '{{ .SelectedLocalCommit.Name }}' '{{ .SelectedLocalCommit.Hash }}' '{{ .SelectedLocalCommit.Sha }}' > file.txt",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
||||||
|
t.Views().Commits().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("my change").IsSelected(),
|
||||||
|
).
|
||||||
|
Press("X")
|
||||||
|
|
||||||
|
hash := t.Git().GetCommitHash("HEAD")
|
||||||
|
t.FileSystem().FileContent("file.txt", Equals(fmt.Sprintf("my change\n%s\n%s", hash, hash)))
|
||||||
|
},
|
||||||
|
})
|
@ -97,6 +97,7 @@ var tests = []*components.IntegrationTest{
|
|||||||
conflicts.ResolveExternally,
|
conflicts.ResolveExternally,
|
||||||
conflicts.ResolveMultipleFiles,
|
conflicts.ResolveMultipleFiles,
|
||||||
conflicts.UndoChooseHunk,
|
conflicts.UndoChooseHunk,
|
||||||
|
custom_commands.AccessCommitProperties,
|
||||||
custom_commands.BasicCmdAtRuntime,
|
custom_commands.BasicCmdAtRuntime,
|
||||||
custom_commands.BasicCmdFromConfig,
|
custom_commands.BasicCmdFromConfig,
|
||||||
custom_commands.CheckForConflicts,
|
custom_commands.CheckForConflicts,
|
||||||
|
@ -177,11 +177,11 @@ func SafeTruncate(str string, limit int) string {
|
|||||||
|
|
||||||
const COMMIT_HASH_SHORT_SIZE = 8
|
const COMMIT_HASH_SHORT_SIZE = 8
|
||||||
|
|
||||||
func ShortSha(sha string) string {
|
func ShortHash(hash string) string {
|
||||||
if len(sha) < COMMIT_HASH_SHORT_SIZE {
|
if len(hash) < COMMIT_HASH_SHORT_SIZE {
|
||||||
return sha
|
return hash
|
||||||
}
|
}
|
||||||
return sha[:COMMIT_HASH_SHORT_SIZE]
|
return hash[:COMMIT_HASH_SHORT_SIZE]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns comma-separated list of paths, with ellipsis if there are more than 3
|
// Returns comma-separated list of paths, with ellipsis if there are more than 3
|
||||||
|
@ -11,16 +11,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Todo struct {
|
type Todo struct {
|
||||||
Sha string // for todos that have one, e.g. pick, drop, fixup, etc.
|
Hash string // for todos that have one, e.g. pick, drop, fixup, etc.
|
||||||
Ref string // for update-ref todos
|
Ref string // for update-ref todos
|
||||||
Action todo.TodoCommand
|
Action todo.TodoCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
// In order to change a TODO in git-rebase-todo, we need to specify the old action,
|
// In order to change a TODO in git-rebase-todo, we need to specify the old action,
|
||||||
// because sometimes the same sha appears multiple times in the file (e.g. in a pick
|
// because sometimes the same hash appears multiple times in the file (e.g. in a pick
|
||||||
// and later in a merge)
|
// and later in a merge)
|
||||||
type TodoChange struct {
|
type TodoChange struct {
|
||||||
Sha string
|
Hash string
|
||||||
OldAction todo.TodoCommand
|
OldAction todo.TodoCommand
|
||||||
NewAction todo.TodoCommand
|
NewAction todo.TodoCommand
|
||||||
}
|
}
|
||||||
@ -38,7 +38,7 @@ func EditRebaseTodo(filePath string, changes []TodoChange, commentChar byte) err
|
|||||||
t := &todos[i]
|
t := &todos[i]
|
||||||
// This is a nested loop, but it's ok because the number of todos should be small
|
// This is a nested loop, but it's ok because the number of todos should be small
|
||||||
for _, change := range changes {
|
for _, change := range changes {
|
||||||
if t.Command == change.OldAction && equalShas(t.Commit, change.Sha) {
|
if t.Command == change.OldAction && equalHash(t.Commit, change.Hash) {
|
||||||
matchCount++
|
matchCount++
|
||||||
t.Command = change.NewAction
|
t.Command = change.NewAction
|
||||||
}
|
}
|
||||||
@ -53,18 +53,18 @@ func EditRebaseTodo(filePath string, changes []TodoChange, commentChar byte) err
|
|||||||
return WriteRebaseTodoFile(filePath, todos, commentChar)
|
return WriteRebaseTodoFile(filePath, todos, commentChar)
|
||||||
}
|
}
|
||||||
|
|
||||||
func equalShas(a, b string) bool {
|
func equalHash(a, b string) bool {
|
||||||
return strings.HasPrefix(a, b) || strings.HasPrefix(b, a)
|
return strings.HasPrefix(a, b) || strings.HasPrefix(b, a)
|
||||||
}
|
}
|
||||||
|
|
||||||
func findTodo(todos []todo.Todo, todoToFind Todo) (int, bool) {
|
func findTodo(todos []todo.Todo, todoToFind Todo) (int, bool) {
|
||||||
_, idx, ok := lo.FindIndexOf(todos, func(t todo.Todo) bool {
|
_, idx, ok := lo.FindIndexOf(todos, func(t todo.Todo) bool {
|
||||||
// Comparing just the sha is not enough; we need to compare both the
|
// Comparing just the hash is not enough; we need to compare both the
|
||||||
// action and the sha, as the sha could appear multiple times (e.g. in a
|
// action and the hash, as the hash could appear multiple times (e.g. in a
|
||||||
// pick and later in a merge). For update-ref todos we also must compare
|
// pick and later in a merge). For update-ref todos we also must compare
|
||||||
// the Ref.
|
// the Ref.
|
||||||
return t.Command == todoToFind.Action &&
|
return t.Command == todoToFind.Action &&
|
||||||
equalShas(t.Commit, todoToFind.Sha) &&
|
equalHash(t.Commit, todoToFind.Hash) &&
|
||||||
t.Ref == todoToFind.Ref
|
t.Ref == todoToFind.Ref
|
||||||
})
|
})
|
||||||
return idx, ok
|
return idx, ok
|
||||||
@ -136,7 +136,7 @@ func deleteTodos(todos []todo.Todo, todosToDelete []Todo) ([]todo.Todo, error) {
|
|||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
// Should never happen
|
// Should never happen
|
||||||
return []todo.Todo{}, fmt.Errorf("Todo %s not found in git-rebase-todo", todoToDelete.Sha)
|
return []todo.Todo{}, fmt.Errorf("Todo %s not found in git-rebase-todo", todoToDelete.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
todos = Remove(todos, idx)
|
todos = Remove(todos, idx)
|
||||||
@ -184,7 +184,7 @@ func moveTodoUp(todos []todo.Todo, todoToMove Todo) ([]todo.Todo, error) {
|
|||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
// Should never happen
|
// Should never happen
|
||||||
return []todo.Todo{}, fmt.Errorf("Todo %s not found in git-rebase-todo", todoToMove.Sha)
|
return []todo.Todo{}, fmt.Errorf("Todo %s not found in git-rebase-todo", todoToMove.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The todos are ordered backwards compared to our model commits, so
|
// The todos are ordered backwards compared to our model commits, so
|
||||||
@ -219,13 +219,13 @@ func moveTodosUp(todos []todo.Todo, todosToMove []Todo) ([]todo.Todo, error) {
|
|||||||
return todos, nil
|
return todos, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func MoveFixupCommitDown(fileName string, originalSha string, fixupSha string, commentChar byte) error {
|
func MoveFixupCommitDown(fileName string, originalHash string, fixupHash string, commentChar byte) error {
|
||||||
todos, err := ReadRebaseTodoFile(fileName, commentChar)
|
todos, err := ReadRebaseTodoFile(fileName, commentChar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
newTodos, err := moveFixupCommitDown(todos, originalSha, fixupSha)
|
newTodos, err := moveFixupCommitDown(todos, originalHash, fixupHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -233,23 +233,23 @@ func MoveFixupCommitDown(fileName string, originalSha string, fixupSha string, c
|
|||||||
return WriteRebaseTodoFile(fileName, newTodos, commentChar)
|
return WriteRebaseTodoFile(fileName, newTodos, commentChar)
|
||||||
}
|
}
|
||||||
|
|
||||||
func moveFixupCommitDown(todos []todo.Todo, originalSha string, fixupSha string) ([]todo.Todo, error) {
|
func moveFixupCommitDown(todos []todo.Todo, originalHash string, fixupHash string) ([]todo.Todo, error) {
|
||||||
isOriginal := func(t todo.Todo) bool {
|
isOriginal := func(t todo.Todo) bool {
|
||||||
return t.Command == todo.Pick && equalShas(t.Commit, originalSha)
|
return t.Command == todo.Pick && equalHash(t.Commit, originalHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
isFixup := func(t todo.Todo) bool {
|
isFixup := func(t todo.Todo) bool {
|
||||||
return t.Command == todo.Pick && equalShas(t.Commit, fixupSha)
|
return t.Command == todo.Pick && equalHash(t.Commit, fixupHash)
|
||||||
}
|
}
|
||||||
|
|
||||||
originalShaCount := lo.CountBy(todos, isOriginal)
|
originalHashCount := lo.CountBy(todos, isOriginal)
|
||||||
if originalShaCount != 1 {
|
if originalHashCount != 1 {
|
||||||
return nil, fmt.Errorf("Expected exactly one original SHA, found %d", originalShaCount)
|
return nil, fmt.Errorf("Expected exactly one original hash, found %d", originalHashCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
fixupShaCount := lo.CountBy(todos, isFixup)
|
fixupHashCount := lo.CountBy(todos, isFixup)
|
||||||
if fixupShaCount != 1 {
|
if fixupHashCount != 1 {
|
||||||
return nil, fmt.Errorf("Expected exactly one fixup SHA, found %d", fixupShaCount)
|
return nil, fmt.Errorf("Expected exactly one fixup hash, found %d", fixupHashCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, fixupIndex, _ := lo.FindIndexOf(todos, isFixup)
|
_, fixupIndex, _ := lo.FindIndexOf(todos, isFixup)
|
||||||
|
@ -25,7 +25,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "5678", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "5678", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
@ -40,7 +40,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "abcd", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "abcd", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
@ -72,7 +72,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "def0"},
|
{Command: todo.Pick, Commit: "def0"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "5678", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "5678", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
@ -91,7 +91,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "def0", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "def0", Action: todo.Pick},
|
||||||
expectedErr: "Todo def0 not found in git-rebase-todo",
|
expectedErr: "Todo def0 not found in git-rebase-todo",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -102,7 +102,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "1234", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "1234", Action: todo.Pick},
|
||||||
expectedErr: "Destination position for moving todo is out of range",
|
expectedErr: "Destination position for moving todo is out of range",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -114,7 +114,7 @@ func TestRebaseCommands_moveTodoDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
},
|
},
|
||||||
todoToMoveDown: Todo{Sha: "1234", Action: todo.Pick},
|
todoToMoveDown: Todo{Hash: "1234", Action: todo.Pick},
|
||||||
expectedErr: "Destination position for moving todo is out of range",
|
expectedErr: "Destination position for moving todo is out of range",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -151,7 +151,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "5678", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "5678", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
@ -166,7 +166,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "1234", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "1234", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
@ -198,7 +198,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "def0"},
|
{Command: todo.Pick, Commit: "def0"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "abcd", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "abcd", Action: todo.Pick},
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
@ -217,7 +217,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "def0", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "def0", Action: todo.Pick},
|
||||||
expectedErr: "Todo def0 not found in git-rebase-todo",
|
expectedErr: "Todo def0 not found in git-rebase-todo",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -228,7 +228,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
{Command: todo.Pick, Commit: "abcd"},
|
{Command: todo.Pick, Commit: "abcd"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "abcd", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "abcd", Action: todo.Pick},
|
||||||
expectedErr: "Destination position for moving todo is out of range",
|
expectedErr: "Destination position for moving todo is out of range",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -240,7 +240,7 @@ func TestRebaseCommands_moveTodoUp(t *testing.T) {
|
|||||||
{Command: todo.Label, Label: "myLabel"},
|
{Command: todo.Label, Label: "myLabel"},
|
||||||
{Command: todo.Reset, Label: "otherlabel"},
|
{Command: todo.Reset, Label: "otherlabel"},
|
||||||
},
|
},
|
||||||
todoToMoveUp: Todo{Sha: "5678", Action: todo.Pick},
|
todoToMoveUp: Todo{Hash: "5678", Action: todo.Pick},
|
||||||
expectedErr: "Destination position for moving todo is out of range",
|
expectedErr: "Destination position for moving todo is out of range",
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
},
|
},
|
||||||
@ -264,8 +264,8 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
|
|||||||
scenarios := []struct {
|
scenarios := []struct {
|
||||||
name string
|
name string
|
||||||
todos []todo.Todo
|
todos []todo.Todo
|
||||||
originalSha string
|
originalHash string
|
||||||
fixupSha string
|
fixupHash string
|
||||||
expectedTodos []todo.Todo
|
expectedTodos []todo.Todo
|
||||||
expectedErr error
|
expectedErr error
|
||||||
}{
|
}{
|
||||||
@ -275,8 +275,8 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Fixup, Commit: "fixup"},
|
{Command: todo.Fixup, Commit: "fixup"},
|
||||||
@ -291,8 +291,8 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "other"},
|
{Command: todo.Pick, Commit: "other"},
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Fixup, Commit: "fixup"},
|
{Command: todo.Fixup, Commit: "fixup"},
|
||||||
@ -301,54 +301,54 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
|
|||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "More original SHAs than expected",
|
name: "More original hashes than expected",
|
||||||
todos: []todo.Todo{
|
todos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: nil,
|
expectedTodos: nil,
|
||||||
expectedErr: errors.New("Expected exactly one original SHA, found 2"),
|
expectedErr: errors.New("Expected exactly one original hash, found 2"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "More fixup SHAs than expected",
|
name: "More fixup hashes than expected",
|
||||||
todos: []todo.Todo{
|
todos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: nil,
|
expectedTodos: nil,
|
||||||
expectedErr: errors.New("Expected exactly one fixup SHA, found 2"),
|
expectedErr: errors.New("Expected exactly one fixup hash, found 2"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "No fixup SHAs found",
|
name: "No fixup hashes found",
|
||||||
todos: []todo.Todo{
|
todos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "original"},
|
{Command: todo.Pick, Commit: "original"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: nil,
|
expectedTodos: nil,
|
||||||
expectedErr: errors.New("Expected exactly one fixup SHA, found 0"),
|
expectedErr: errors.New("Expected exactly one fixup hash, found 0"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "No original SHAs found",
|
name: "No original hashes found",
|
||||||
todos: []todo.Todo{
|
todos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "fixup"},
|
{Command: todo.Pick, Commit: "fixup"},
|
||||||
},
|
},
|
||||||
originalSha: "original",
|
originalHash: "original",
|
||||||
fixupSha: "fixup",
|
fixupHash: "fixup",
|
||||||
expectedTodos: nil,
|
expectedTodos: nil,
|
||||||
expectedErr: errors.New("Expected exactly one original SHA, found 0"),
|
expectedErr: errors.New("Expected exactly one original hash, found 0"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
t.Run(scenario.name, func(t *testing.T) {
|
t.Run(scenario.name, func(t *testing.T) {
|
||||||
actualTodos, actualErr := moveFixupCommitDown(scenario.todos, scenario.originalSha, scenario.fixupSha)
|
actualTodos, actualErr := moveFixupCommitDown(scenario.todos, scenario.originalHash, scenario.fixupHash)
|
||||||
|
|
||||||
if scenario.expectedErr == nil {
|
if scenario.expectedErr == nil {
|
||||||
assert.NoError(t, actualErr)
|
assert.NoError(t, actualErr)
|
||||||
@ -379,7 +379,7 @@ func TestRebaseCommands_deleteTodos(t *testing.T) {
|
|||||||
},
|
},
|
||||||
todosToDelete: []Todo{
|
todosToDelete: []Todo{
|
||||||
{Ref: "refs/heads/some_branch", Action: todo.UpdateRef},
|
{Ref: "refs/heads/some_branch", Action: todo.UpdateRef},
|
||||||
{Sha: "abcd", Action: todo.Pick},
|
{Hash: "abcd", Action: todo.Pick},
|
||||||
},
|
},
|
||||||
expectedTodos: []todo.Todo{
|
expectedTodos: []todo.Todo{
|
||||||
{Command: todo.Pick, Commit: "1234"},
|
{Command: todo.Pick, Commit: "1234"},
|
||||||
@ -394,7 +394,7 @@ func TestRebaseCommands_deleteTodos(t *testing.T) {
|
|||||||
{Command: todo.Pick, Commit: "5678"},
|
{Command: todo.Pick, Commit: "5678"},
|
||||||
},
|
},
|
||||||
todosToDelete: []Todo{
|
todosToDelete: []Todo{
|
||||||
{Sha: "abcd", Action: todo.Pick},
|
{Hash: "abcd", Action: todo.Pick},
|
||||||
},
|
},
|
||||||
expectedTodos: []todo.Todo{},
|
expectedTodos: []todo.Todo{},
|
||||||
expectedErr: errors.New("Todo abcd not found in git-rebase-todo"),
|
expectedErr: errors.New("Todo abcd not found in git-rebase-todo"),
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# 1) find a commit that is working fine.
|
# 1) find a commit that is working fine.
|
||||||
# 2) Create an integration test capturing the fact that it works (Don't commit it). See https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md
|
# 2) Create an integration test capturing the fact that it works (Don't commit it). See https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md
|
||||||
# 3) checkout the commit that's known to be failing
|
# 3) checkout the commit that's known to be failing
|
||||||
# 4) run this script supplying the commit sha / tag name that works and the name of the newly created test
|
# 4) run this script supplying the commit hash / tag name that works and the name of the newly created test
|
||||||
|
|
||||||
# usage: scripts/bisect.sh <ref that's broken> <ref that's working> <integration test name>
|
# usage: scripts/bisect.sh <ref that's broken> <ref that's working> <integration test name>
|
||||||
# e.g. scripts/bisect.sh v0.32.1 mergeConflictsResolvedExternally
|
# e.g. scripts/bisect.sh v0.32.1 mergeConflictsResolvedExternally
|
||||||
|
Reference in New Issue
Block a user