feat: add git stash management

Add a Stashes dialog with create, apply, pop, and drop actions
Include untracked files automatically when stashing
Show file counts for current changes and stash entries
This commit is contained in:
Bohdan Triapitsyn
2026-05-05 23:39:20 +03:00
parent c80c2b62a8
commit 93267927ff
19 changed files with 754 additions and 109 deletions
+28
View File
@@ -517,6 +517,34 @@ export const dict = {
'gitView.stash.stepStash': 'Stash your uncommitted changes',
'gitView.stash.thisWill': 'This will:',
'gitView.stash.title': 'Uncommitted Changes',
'gitView.stashes.actions.apply': 'Apply',
'gitView.stashes.actions.drop': 'Drop',
'gitView.stashes.actions.pop': 'Pop',
'gitView.stashes.actions.stashCurrent': 'Stash current changes',
'gitView.stashes.actions.stashCurrentWithCount': 'Stash {count} files',
'gitView.stashes.confirm.drop': 'Drop {ref}?',
'gitView.stashes.description': 'Save, restore, and clean up Git stashes for this repository.',
'gitView.stashes.empty.list': 'No stashes yet.',
'gitView.stashes.empty.search': 'No matching stashes.',
'gitView.stashes.includeUntrackedHint': 'Untracked files are included automatically.',
'gitView.stashes.fileCount': '{count} files',
'gitView.stashes.fileCountLoading': 'counting files...',
'gitView.stashes.itemNumber': '#{number}',
'gitView.stashes.latestLabel': 'Latest',
'gitView.stashes.messagePlaceholder': 'Stash name',
'gitView.stashes.searchPlaceholder': 'Search stashes',
'gitView.stashes.title': 'Stashes',
'gitView.stashes.toast.applyFailed': 'Failed to apply stash',
'gitView.stashes.toast.applySuccess': 'Stash applied',
'gitView.stashes.toast.createFailed': 'Failed to stash changes',
'gitView.stashes.toast.created': 'Changes stashed',
'gitView.stashes.toast.dropFailed': 'Failed to drop stash',
'gitView.stashes.toast.dropSuccess': 'Stash dropped',
'gitView.stashes.toast.loadFailed': 'Failed to load stashes',
'gitView.stashes.toast.noChanges': 'No local changes to stash',
'gitView.stashes.toast.popFailed': 'Failed to pop stash',
'gitView.stashes.toast.popSuccess': 'Stash popped',
'gitView.stashes.untitled': 'Untitled stash',
'gitView.sync.fetch': 'Fetch',
'gitView.sync.fetchFromRemote': 'Fetch from {name}',
'gitView.sync.fetchTooltip': 'Fetch from remote',
+28
View File
@@ -518,6 +518,34 @@ export const dict: Record<I18nKey, string> = {
"gitView.stash.stepStash": "Guarda tus cambios sin commit",
"gitView.stash.thisWill": "Esto hará:",
"gitView.stash.title": "Cambios sin commit",
"gitView.stashes.actions.apply": "Apply",
"gitView.stashes.actions.drop": "Drop",
"gitView.stashes.actions.pop": "Pop",
"gitView.stashes.actions.stashCurrent": "Stash current changes",
"gitView.stashes.actions.stashCurrentWithCount": "Stash {count} files",
"gitView.stashes.confirm.drop": "Drop {ref}?",
"gitView.stashes.description": "Save, restore, and clean up Git stashes for this repository.",
"gitView.stashes.empty.list": "No stashes yet.",
"gitView.stashes.empty.search": "No matching stashes.",
"gitView.stashes.includeUntrackedHint": "Untracked files are included automatically.",
"gitView.stashes.fileCount": "{count} files",
"gitView.stashes.fileCountLoading": "counting files...",
"gitView.stashes.itemNumber": "#{number}",
"gitView.stashes.latestLabel": "Latest",
"gitView.stashes.messagePlaceholder": "Stash name",
"gitView.stashes.searchPlaceholder": "Search stashes",
"gitView.stashes.title": "Stashes",
"gitView.stashes.toast.applyFailed": "Failed to apply stash",
"gitView.stashes.toast.applySuccess": "Stash applied",
"gitView.stashes.toast.createFailed": "Failed to stash changes",
"gitView.stashes.toast.created": "Changes stashed",
"gitView.stashes.toast.dropFailed": "Failed to drop stash",
"gitView.stashes.toast.dropSuccess": "Stash dropped",
"gitView.stashes.toast.loadFailed": "Failed to load stashes",
"gitView.stashes.toast.noChanges": "No local changes to stash",
"gitView.stashes.toast.popFailed": "Failed to pop stash",
"gitView.stashes.toast.popSuccess": "Stash popped",
"gitView.stashes.untitled": "Untitled stash",
"gitView.sync.fetch": "Fetch",
"gitView.sync.fetchFromRemote": "Fetch de {name}",
"gitView.sync.fetchTooltip": "Fetch del remoto",
+28
View File
@@ -518,6 +518,34 @@ export const dict: Record<I18nKey, string> = {
'gitView.stash.stepStash': '커밋하지 않은 변경 사항 stash',
'gitView.stash.thisWill': '다음 작업을 수행합니다:',
'gitView.stash.title': '커밋하지 않은 변경 사항',
'gitView.stashes.actions.apply': 'Apply',
'gitView.stashes.actions.drop': 'Drop',
'gitView.stashes.actions.pop': 'Pop',
'gitView.stashes.actions.stashCurrent': 'Stash current changes',
'gitView.stashes.actions.stashCurrentWithCount': 'Stash {count} files',
'gitView.stashes.confirm.drop': 'Drop {ref}?',
'gitView.stashes.description': 'Save, restore, and clean up Git stashes for this repository.',
'gitView.stashes.empty.list': 'No stashes yet.',
'gitView.stashes.empty.search': 'No matching stashes.',
'gitView.stashes.includeUntrackedHint': 'Untracked files are included automatically.',
'gitView.stashes.fileCount': '{count} files',
'gitView.stashes.fileCountLoading': 'counting files...',
'gitView.stashes.itemNumber': '#{number}',
'gitView.stashes.latestLabel': 'Latest',
'gitView.stashes.messagePlaceholder': 'Stash name',
'gitView.stashes.searchPlaceholder': 'Search stashes',
'gitView.stashes.title': 'Stashes',
'gitView.stashes.toast.applyFailed': 'Failed to apply stash',
'gitView.stashes.toast.applySuccess': 'Stash applied',
'gitView.stashes.toast.createFailed': 'Failed to stash changes',
'gitView.stashes.toast.created': 'Changes stashed',
'gitView.stashes.toast.dropFailed': 'Failed to drop stash',
'gitView.stashes.toast.dropSuccess': 'Stash dropped',
'gitView.stashes.toast.loadFailed': 'Failed to load stashes',
'gitView.stashes.toast.noChanges': 'No local changes to stash',
'gitView.stashes.toast.popFailed': 'Failed to pop stash',
'gitView.stashes.toast.popSuccess': 'Stash popped',
'gitView.stashes.untitled': 'Untitled stash',
'gitView.sync.fetch': '가져오기',
'gitView.sync.fetchFromRemote': '{name}에서 가져오기',
'gitView.sync.fetchTooltip': '리모트에서 가져오기',
@@ -518,6 +518,34 @@ export const dict: Record<I18nKey, string> = {
"gitView.stash.stepStash": "Salva suas alterações sem commit",
"gitView.stash.thisWill": "Isso fará:",
"gitView.stash.title": "Alterações sem commit",
"gitView.stashes.actions.apply": "Apply",
"gitView.stashes.actions.drop": "Drop",
"gitView.stashes.actions.pop": "Pop",
"gitView.stashes.actions.stashCurrent": "Stash current changes",
"gitView.stashes.actions.stashCurrentWithCount": "Stash {count} files",
"gitView.stashes.confirm.drop": "Drop {ref}?",
"gitView.stashes.description": "Save, restore, and clean up Git stashes for this repository.",
"gitView.stashes.empty.list": "No stashes yet.",
"gitView.stashes.empty.search": "No matching stashes.",
"gitView.stashes.includeUntrackedHint": "Untracked files are included automatically.",
"gitView.stashes.fileCount": "{count} files",
"gitView.stashes.fileCountLoading": "counting files...",
"gitView.stashes.itemNumber": "#{number}",
"gitView.stashes.latestLabel": "Latest",
"gitView.stashes.messagePlaceholder": "Stash name",
"gitView.stashes.searchPlaceholder": "Search stashes",
"gitView.stashes.title": "Stashes",
"gitView.stashes.toast.applyFailed": "Failed to apply stash",
"gitView.stashes.toast.applySuccess": "Stash applied",
"gitView.stashes.toast.createFailed": "Failed to stash changes",
"gitView.stashes.toast.created": "Changes stashed",
"gitView.stashes.toast.dropFailed": "Failed to drop stash",
"gitView.stashes.toast.dropSuccess": "Stash dropped",
"gitView.stashes.toast.loadFailed": "Failed to load stashes",
"gitView.stashes.toast.noChanges": "No local changes to stash",
"gitView.stashes.toast.popFailed": "Failed to pop stash",
"gitView.stashes.toast.popSuccess": "Stash popped",
"gitView.stashes.untitled": "Untitled stash",
"gitView.sync.fetch": "Fetch",
"gitView.sync.fetchFromRemote": "Fetch de {name}",
"gitView.sync.fetchTooltip": "Fetch do remoto",
+28
View File
@@ -518,6 +518,34 @@ export const dict: Record<I18nKey, string> = {
"gitView.stash.stepStash": "Сховати незакомічені зміни",
"gitView.stash.thisWill": "Це:",
"gitView.stash.title": "Незакомічені зміни",
"gitView.stashes.actions.apply": "Apply",
"gitView.stashes.actions.drop": "Drop",
"gitView.stashes.actions.pop": "Pop",
"gitView.stashes.actions.stashCurrent": "Сховати поточні зміни",
"gitView.stashes.actions.stashCurrentWithCount": "Сховати файлів: {count}",
"gitView.stashes.confirm.drop": "Видалити {ref}?",
"gitView.stashes.description": "Зберігайте, відновлюйте й очищайте Git stashes для цього репозиторію.",
"gitView.stashes.empty.list": "Stashes ще немає.",
"gitView.stashes.empty.search": "Збігів не знайдено.",
"gitView.stashes.includeUntrackedHint": "Untracked файли додаються автоматично.",
"gitView.stashes.fileCount": "Файлів: {count}",
"gitView.stashes.fileCountLoading": "рахуємо файли...",
"gitView.stashes.itemNumber": "#{number}",
"gitView.stashes.latestLabel": "Останній",
"gitView.stashes.messagePlaceholder": "Назва stash",
"gitView.stashes.searchPlaceholder": "Пошук stashes",
"gitView.stashes.title": "Stashes",
"gitView.stashes.toast.applyFailed": "Не вдалося застосувати stash",
"gitView.stashes.toast.applySuccess": "Stash застосовано",
"gitView.stashes.toast.createFailed": "Не вдалося сховати зміни",
"gitView.stashes.toast.created": "Зміни сховано",
"gitView.stashes.toast.dropFailed": "Не вдалося видалити stash",
"gitView.stashes.toast.dropSuccess": "Stash видалено",
"gitView.stashes.toast.loadFailed": "Не вдалося завантажити stashes",
"gitView.stashes.toast.noChanges": "Немає локальних змін для stash",
"gitView.stashes.toast.popFailed": "Не вдалося pop stash",
"gitView.stashes.toast.popSuccess": "Stash popped",
"gitView.stashes.untitled": "Stash без назви",
"gitView.sync.fetch": "Fetch",
"gitView.sync.fetchFromRemote": "Fetch з {name}",
"gitView.sync.fetchTooltip": "Отримати з віддаленого",
@@ -518,6 +518,34 @@ export const dict: Record<I18nKey, string> = {
'gitView.stash.stepStash': '储藏未提交的更改',
'gitView.stash.thisWill': '这将会:',
'gitView.stash.title': '未提交的更改',
'gitView.stashes.actions.apply': 'Apply',
'gitView.stashes.actions.drop': 'Drop',
'gitView.stashes.actions.pop': 'Pop',
'gitView.stashes.actions.stashCurrent': 'Stash current changes',
'gitView.stashes.actions.stashCurrentWithCount': 'Stash {count} files',
'gitView.stashes.confirm.drop': 'Drop {ref}?',
'gitView.stashes.description': 'Save, restore, and clean up Git stashes for this repository.',
'gitView.stashes.empty.list': 'No stashes yet.',
'gitView.stashes.empty.search': 'No matching stashes.',
'gitView.stashes.includeUntrackedHint': 'Untracked files are included automatically.',
'gitView.stashes.fileCount': '{count} files',
'gitView.stashes.fileCountLoading': 'counting files...',
'gitView.stashes.itemNumber': '#{number}',
'gitView.stashes.latestLabel': 'Latest',
'gitView.stashes.messagePlaceholder': 'Stash name',
'gitView.stashes.searchPlaceholder': 'Search stashes',
'gitView.stashes.title': 'Stashes',
'gitView.stashes.toast.applyFailed': 'Failed to apply stash',
'gitView.stashes.toast.applySuccess': 'Stash applied',
'gitView.stashes.toast.createFailed': 'Failed to stash changes',
'gitView.stashes.toast.created': 'Changes stashed',
'gitView.stashes.toast.dropFailed': 'Failed to drop stash',
'gitView.stashes.toast.dropSuccess': 'Stash dropped',
'gitView.stashes.toast.loadFailed': 'Failed to load stashes',
'gitView.stashes.toast.noChanges': 'No local changes to stash',
'gitView.stashes.toast.popFailed': 'Failed to pop stash',
'gitView.stashes.toast.popSuccess': 'Stash popped',
'gitView.stashes.untitled': 'Untitled stash',
'gitView.sync.fetch': '获取',
'gitView.sync.fetchFromRemote': '从 {name} 获取',
'gitView.sync.fetchTooltip': '从远程获取',