dsh-ide-git 0.18.4 → 0.18.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
- package/src/client.js +378 -39
- package/src/index.js +9 -2
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-external/dsh-ide-git",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.6",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"description": "IDE 级 Git 操作面板:分支树 + 提交图谱 + 变更/暂存/提交 + 提交详情。装了 dsh-better-sidebar 时挂成它的原生 tab(右侧栏 + 底部工作台);没装时直接挂 DSH 原生右侧栏,单独安装即可用。JetBrains 风格 Git 工具窗口 for DeepSeek Harness.",
|
|
6
6
|
"engines": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-ide-git",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.6",
|
|
4
4
|
"description": "DSH plugin: an IDE-grade Git tool window as a native dsh-better-sidebar tab — branch tree, commit graph, changes, commit details, JetBrains-style actions, in the right sidebar and the bottom panel. | DSH 插件:IDE 级 Git 工具窗口,以 dsh-better-sidebar 原生 Tab 挂载——分支树 / 提交图谱 / 变更与提交详情 / JetBrains 风格操作,右侧栏与底部面板双布局自适应。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
package/src/client.js
CHANGED
|
@@ -100,6 +100,7 @@ window.__ModuleLoader__.load({
|
|
|
100
100
|
'branches.tags': '标签',
|
|
101
101
|
'branches.head': 'HEAD(当前分支)',
|
|
102
102
|
'branches.favorites': '收藏',
|
|
103
|
+
'branches.starHint': "已收藏",
|
|
103
104
|
'branches.pickHint': '单击选中,双击签出',
|
|
104
105
|
'branches.worktree': '已在另一工作区检出',
|
|
105
106
|
'action.stash': '贮藏',
|
|
@@ -273,6 +274,11 @@ window.__ModuleLoader__.load({
|
|
|
273
274
|
'toolbar.newBranch': '新建分支',
|
|
274
275
|
'toolbar.fetch': '抓取(Fetch)',
|
|
275
276
|
'toolbar.pull': '拉取(Pull)',
|
|
277
|
+
'toolbar.pullPicked': "拉取选中的 {n} 个分支",
|
|
278
|
+
'toolbar.fetchPicked': "抓取选中的 {n} 个引用",
|
|
279
|
+
'toolbar.pushPicked': "推送选中的 {n} 个分支",
|
|
280
|
+
'toolbar.checkoutPicked': "签出选中的分支",
|
|
281
|
+
'toolbar.deletePicked': "删除选中的 {n} 个引用",
|
|
276
282
|
'toolbar.push': '推送(Push)',
|
|
277
283
|
'toolbar.tree': '分支栏',
|
|
278
284
|
'rail.more': '更多操作',
|
|
@@ -383,6 +389,7 @@ window.__ModuleLoader__.load({
|
|
|
383
389
|
'counts.untracked': '未跟踪 {n}',
|
|
384
390
|
'counts.conflicted': '冲突 {n}',
|
|
385
391
|
'push.confirm': '将 {branch} 推送到 {upstream}?',
|
|
392
|
+
'push.confirmMany': "将推送 {n} 个分支:{names}。确定?",
|
|
386
393
|
'delete.confirm': '删除分支 {name}?删除后浮窗里可以撤回(未合并的分支 git 会拒绝删除)。',
|
|
387
394
|
'discard.confirm': '丢弃 {path} 的更改?工作区内容会被覆盖,丢弃后浮窗里可以撤回。',
|
|
388
395
|
'resetHard.confirm': '硬重置到 {hash}?未提交的更改会丢失。',
|
|
@@ -408,6 +415,7 @@ window.__ModuleLoader__.load({
|
|
|
408
415
|
'branches.tags': 'Tags',
|
|
409
416
|
'branches.head': 'HEAD (current branch)',
|
|
410
417
|
'branches.favorites': 'Favorites',
|
|
418
|
+
'branches.starHint': "Favorited",
|
|
411
419
|
'branches.pickHint': 'Click to select, double-click to check out',
|
|
412
420
|
'branches.worktree': 'Checked out in another working tree',
|
|
413
421
|
'action.stash': 'Stash',
|
|
@@ -581,6 +589,11 @@ window.__ModuleLoader__.load({
|
|
|
581
589
|
'toolbar.newBranch': 'New branch',
|
|
582
590
|
'toolbar.fetch': 'Fetch',
|
|
583
591
|
'toolbar.pull': 'Pull',
|
|
592
|
+
'toolbar.pullPicked': "Pull {n} picked branch(es)",
|
|
593
|
+
'toolbar.fetchPicked': "Fetch {n} picked ref(s)",
|
|
594
|
+
'toolbar.pushPicked': "Push {n} picked branch(es)",
|
|
595
|
+
'toolbar.checkoutPicked': "Check out the picked branch",
|
|
596
|
+
'toolbar.deletePicked': "Delete {n} picked ref(s)",
|
|
584
597
|
'toolbar.push': 'Push',
|
|
585
598
|
'toolbar.tree': 'Branch pane',
|
|
586
599
|
'rail.more': 'More actions',
|
|
@@ -691,6 +704,7 @@ window.__ModuleLoader__.load({
|
|
|
691
704
|
'counts.untracked': 'Untracked {n}',
|
|
692
705
|
'counts.conflicted': 'Conflicts {n}',
|
|
693
706
|
'push.confirm': 'Push {branch} to {upstream}?',
|
|
707
|
+
'push.confirmMany': "Push {n} branch(es): {names}?",
|
|
694
708
|
'delete.confirm': 'Delete branch {name}? A toast will offer to bring it back (git still refuses unmerged branches).',
|
|
695
709
|
'discard.confirm': 'Discard changes in {path}? The working-tree content is overwritten — a toast will offer to bring it back.',
|
|
696
710
|
'resetHard.confirm': 'Hard reset to {hash}? Uncommitted changes are lost.',
|
|
@@ -724,6 +738,7 @@ window.__ModuleLoader__.load({
|
|
|
724
738
|
'branches.tags': '標籤',
|
|
725
739
|
'branches.head': 'HEAD(當前分支)',
|
|
726
740
|
'branches.favorites': '我的最愛',
|
|
741
|
+
'branches.starHint': "已收藏",
|
|
727
742
|
'branches.pickHint': '單擊選取,雙擊簽出',
|
|
728
743
|
'branches.worktree': '已喺另一個工作區簽出',
|
|
729
744
|
'action.stash': '貯藏',
|
|
@@ -897,6 +912,11 @@ window.__ModuleLoader__.load({
|
|
|
897
912
|
'toolbar.newBranch': '新建分支',
|
|
898
913
|
'toolbar.fetch': '抓取',
|
|
899
914
|
'toolbar.pull': '拉取',
|
|
915
|
+
'toolbar.pullPicked': "拉取選中的 {n} 個分支",
|
|
916
|
+
'toolbar.fetchPicked': "抓取選中的 {n} 個引用",
|
|
917
|
+
'toolbar.pushPicked': "推送選中的 {n} 個分支",
|
|
918
|
+
'toolbar.checkoutPicked': "簽出選中的分支",
|
|
919
|
+
'toolbar.deletePicked': "刪除選中的 {n} 個引用",
|
|
900
920
|
'toolbar.push': '推送',
|
|
901
921
|
'toolbar.tree': '分支面板',
|
|
902
922
|
'rail.more': '更多操作',
|
|
@@ -1007,6 +1027,7 @@ window.__ModuleLoader__.load({
|
|
|
1007
1027
|
'counts.untracked': '未追蹤 {n}',
|
|
1008
1028
|
'counts.conflicted': '衝突 {n}',
|
|
1009
1029
|
'push.confirm': '將 {branch} 推送到 {upstream}?',
|
|
1030
|
+
'push.confirmMany': "將推送 {n} 個分支:{names}。確定?",
|
|
1010
1031
|
'delete.confirm': '刪除分支 {name}?之後可以喺提示條撤回(git 仍然會拒絕未合併嘅分支)。',
|
|
1011
1032
|
'discard.confirm': '丟棄 {path} 嘅變更?工作區內容會被覆寫 —— 之後可以喺提示條撤回。',
|
|
1012
1033
|
'resetHard.confirm': '硬重置到 {hash}?未提交嘅變更會遺失。',
|
|
@@ -1032,6 +1053,7 @@ window.__ModuleLoader__.load({
|
|
|
1032
1053
|
'branches.tags': '標籤',
|
|
1033
1054
|
'branches.head': 'HEAD(目前分支)',
|
|
1034
1055
|
'branches.favorites': '我的最愛',
|
|
1056
|
+
'branches.starHint': "已收藏",
|
|
1035
1057
|
'branches.pickHint': '單擊選取,雙擊簽出',
|
|
1036
1058
|
'branches.worktree': '已在另一個工作區簽出',
|
|
1037
1059
|
'action.stash': '暫存擱置',
|
|
@@ -1205,6 +1227,11 @@ window.__ModuleLoader__.load({
|
|
|
1205
1227
|
'toolbar.newBranch': '新建分支',
|
|
1206
1228
|
'toolbar.fetch': '抓取',
|
|
1207
1229
|
'toolbar.pull': '拉取',
|
|
1230
|
+
'toolbar.pullPicked': "拉取選中的 {n} 個分支",
|
|
1231
|
+
'toolbar.fetchPicked': "抓取選中的 {n} 個引用",
|
|
1232
|
+
'toolbar.pushPicked': "推送選中的 {n} 個分支",
|
|
1233
|
+
'toolbar.checkoutPicked': "簽出選中的分支",
|
|
1234
|
+
'toolbar.deletePicked': "刪除選中的 {n} 個引用",
|
|
1208
1235
|
'toolbar.push': '推送',
|
|
1209
1236
|
'toolbar.tree': '分支面板',
|
|
1210
1237
|
'rail.more': '更多操作',
|
|
@@ -1315,6 +1342,7 @@ window.__ModuleLoader__.load({
|
|
|
1315
1342
|
'counts.untracked': '未追蹤 {n}',
|
|
1316
1343
|
'counts.conflicted': '衝突 {n}',
|
|
1317
1344
|
'push.confirm': '將 {branch} 推送到 {upstream}?',
|
|
1345
|
+
'push.confirmMany': "將推送 {n} 個分支:{names}。確定?",
|
|
1318
1346
|
'delete.confirm': '刪除分支 {name}?之後可從提示條撤回(git 仍會拒絕未合併的分支)。',
|
|
1319
1347
|
'discard.confirm': '丟棄 {path} 的變更?工作區內容會被覆寫 —— 之後可從提示條撤回。',
|
|
1320
1348
|
'resetHard.confirm': '硬重置到 {hash}?未提交的變更會遺失。',
|
|
@@ -1340,6 +1368,7 @@ window.__ModuleLoader__.load({
|
|
|
1340
1368
|
'branches.tags': '標籤',
|
|
1341
1369
|
'branches.head': 'HEAD(當前分支)',
|
|
1342
1370
|
'branches.favorites': '我的最愛',
|
|
1371
|
+
'branches.starHint': "已收藏",
|
|
1343
1372
|
'branches.pickHint': '單擊選取,雙擊簽出',
|
|
1344
1373
|
'branches.worktree': '已喺另一個工作區簽出',
|
|
1345
1374
|
'action.stash': '貯藏',
|
|
@@ -1513,6 +1542,11 @@ window.__ModuleLoader__.load({
|
|
|
1513
1542
|
'toolbar.newBranch': '新建分支',
|
|
1514
1543
|
'toolbar.fetch': '抓取',
|
|
1515
1544
|
'toolbar.pull': '拉取',
|
|
1545
|
+
'toolbar.pullPicked': "拉取選中的 {n} 個分支",
|
|
1546
|
+
'toolbar.fetchPicked': "抓取選中的 {n} 個引用",
|
|
1547
|
+
'toolbar.pushPicked': "推送選中的 {n} 個分支",
|
|
1548
|
+
'toolbar.checkoutPicked': "簽出選中的分支",
|
|
1549
|
+
'toolbar.deletePicked': "刪除選中的 {n} 個引用",
|
|
1516
1550
|
'toolbar.push': '推送',
|
|
1517
1551
|
'toolbar.tree': '分支面板',
|
|
1518
1552
|
'rail.more': '更多操作',
|
|
@@ -1623,6 +1657,7 @@ window.__ModuleLoader__.load({
|
|
|
1623
1657
|
'counts.untracked': '未追蹤 {n}',
|
|
1624
1658
|
'counts.conflicted': '衝突 {n}',
|
|
1625
1659
|
'push.confirm': '將 {branch} 推送到 {upstream}?',
|
|
1660
|
+
'push.confirmMany': "將推送 {n} 個分支:{names}。確定?",
|
|
1626
1661
|
'delete.confirm': '刪除分支 {name}?之後可以喺提示條撤回(git 仍然會拒絕未合併嘅分支)。',
|
|
1627
1662
|
'discard.confirm': '丟棄 {path} 嘅變更?工作區內容會被覆寫 —— 之後可以喺提示條撤回。',
|
|
1628
1663
|
'resetHard.confirm': '硬重置到 {hash}?未提交嘅變更會遺失。',
|
|
@@ -1648,6 +1683,7 @@ window.__ModuleLoader__.load({
|
|
|
1648
1683
|
'branches.tags': 'タグ',
|
|
1649
1684
|
'branches.head': 'HEAD(現在のブランチ)',
|
|
1650
1685
|
'branches.favorites': 'お気に入り',
|
|
1686
|
+
'branches.starHint': "お気に入り済み",
|
|
1651
1687
|
'branches.pickHint': 'クリックで選択、ダブルクリックでチェックアウト',
|
|
1652
1688
|
'branches.worktree': '別のワークツリーでチェックアウト済み',
|
|
1653
1689
|
'action.stash': 'スタッシュ',
|
|
@@ -1821,6 +1857,11 @@ window.__ModuleLoader__.load({
|
|
|
1821
1857
|
'toolbar.newBranch': '新しいブランチ',
|
|
1822
1858
|
'toolbar.fetch': 'フェッチ',
|
|
1823
1859
|
'toolbar.pull': 'プル',
|
|
1860
|
+
'toolbar.pullPicked': "選択した {n} 個のブランチをプル",
|
|
1861
|
+
'toolbar.fetchPicked': "選択した {n} 個の参照をフェッチ",
|
|
1862
|
+
'toolbar.pushPicked': "選択した {n} 個のブランチをプッシュ",
|
|
1863
|
+
'toolbar.checkoutPicked': "選択したブランチをチェックアウト",
|
|
1864
|
+
'toolbar.deletePicked': "選択した {n} 個の参照を削除",
|
|
1824
1865
|
'toolbar.push': 'プッシュ',
|
|
1825
1866
|
'toolbar.tree': 'ブランチペイン',
|
|
1826
1867
|
'rail.more': 'その他の操作',
|
|
@@ -1931,6 +1972,7 @@ window.__ModuleLoader__.load({
|
|
|
1931
1972
|
'counts.untracked': '未追跡 {n}',
|
|
1932
1973
|
'counts.conflicted': '競合 {n}',
|
|
1933
1974
|
'push.confirm': '{branch} を {upstream} にプッシュしますか?',
|
|
1975
|
+
'push.confirmMany': "{n} 個のブランチをプッシュします:{names}。よろしいですか?",
|
|
1934
1976
|
'delete.confirm': 'ブランチ {name} を削除しますか?その後トーストから復元できます(git は未マージのブランチを引き続き拒否します)。',
|
|
1935
1977
|
'discard.confirm': '{path} の変更を破棄しますか?ワークツリーの内容が上書きされます —— その後トーストから復元できます。',
|
|
1936
1978
|
'resetHard.confirm': '{hash} にハードリセットしますか?未コミットの変更は失われます。',
|
|
@@ -1956,6 +1998,7 @@ window.__ModuleLoader__.load({
|
|
|
1956
1998
|
'branches.tags': '태그',
|
|
1957
1999
|
'branches.head': 'HEAD(현재 브랜치)',
|
|
1958
2000
|
'branches.favorites': '즐겨찾기',
|
|
2001
|
+
'branches.starHint': "즐겨찾기",
|
|
1959
2002
|
'branches.pickHint': '클릭하여 선택, 더블클릭하여 체크아웃',
|
|
1960
2003
|
'branches.worktree': '다른 워크트리에서 체크아웃됨',
|
|
1961
2004
|
'action.stash': '스태시',
|
|
@@ -2129,6 +2172,11 @@ window.__ModuleLoader__.load({
|
|
|
2129
2172
|
'toolbar.newBranch': '새 브랜치',
|
|
2130
2173
|
'toolbar.fetch': '페치',
|
|
2131
2174
|
'toolbar.pull': '풀',
|
|
2175
|
+
'toolbar.pullPicked': "선택한 {n}개 브랜치 가져오기",
|
|
2176
|
+
'toolbar.fetchPicked': "선택한 {n}개 레퍼런스 페치",
|
|
2177
|
+
'toolbar.pushPicked': "선택한 {n}개 브랜치 푸시",
|
|
2178
|
+
'toolbar.checkoutPicked': "선택한 브랜치 체크아웃",
|
|
2179
|
+
'toolbar.deletePicked': "선택한 {n}개 레퍼런스 삭제",
|
|
2132
2180
|
'toolbar.push': '푸시',
|
|
2133
2181
|
'toolbar.tree': '브랜치 창',
|
|
2134
2182
|
'rail.more': '추가 작업',
|
|
@@ -2239,6 +2287,7 @@ window.__ModuleLoader__.load({
|
|
|
2239
2287
|
'counts.untracked': '추적되지 않음 {n}',
|
|
2240
2288
|
'counts.conflicted': '충돌 {n}',
|
|
2241
2289
|
'push.confirm': '{branch}을(를) {upstream}에 푸시할까요?',
|
|
2290
|
+
'push.confirmMany': "{n}개 브랜치를 푸시합니다: {names}. 확입니까?",
|
|
2242
2291
|
'delete.confirm': '브랜치 {name}을(를) 삭제할까요? 이후 토스트에서 복원할 수 있습니다(git은 병합되지 않은 브랜치를 계속 거부합니다).',
|
|
2243
2292
|
'discard.confirm': '{path}의 변경 사항을 버릴까요? 워크트리 내용이 덮어써집니다 —— 이후 토스트에서 복원할 수 있습니다.',
|
|
2244
2293
|
'resetHard.confirm': '{hash}로 하드 리셋할까요? 커밋하지 않은 변경 사항은 사라집니다.',
|
|
@@ -2264,6 +2313,7 @@ window.__ModuleLoader__.load({
|
|
|
2264
2313
|
'branches.tags': 'Tags',
|
|
2265
2314
|
'branches.head': 'HEAD (aktueller Branch)',
|
|
2266
2315
|
'branches.favorites': 'Favoriten',
|
|
2316
|
+
'branches.starHint': "Favorit",
|
|
2267
2317
|
'branches.pickHint': 'Klicken zum Auswählen, doppelklicken zum Auschecken',
|
|
2268
2318
|
'branches.worktree': 'In einem anderen Arbeitsbaum ausgecheckt',
|
|
2269
2319
|
'action.stash': 'Stash',
|
|
@@ -2437,6 +2487,11 @@ window.__ModuleLoader__.load({
|
|
|
2437
2487
|
'toolbar.newBranch': 'Neuer Branch',
|
|
2438
2488
|
'toolbar.fetch': 'Fetch',
|
|
2439
2489
|
'toolbar.pull': 'Pull',
|
|
2490
|
+
'toolbar.pullPicked': "{n} ausgewählte Branch(es) pullen",
|
|
2491
|
+
'toolbar.fetchPicked': "{n} ausgewählte Ref(s) fetchen",
|
|
2492
|
+
'toolbar.pushPicked': "{n} ausgewählte Branch(es) pushen",
|
|
2493
|
+
'toolbar.checkoutPicked': "Ausgewählten Branch auschecken",
|
|
2494
|
+
'toolbar.deletePicked': "{n} ausgewählte Ref(s) löschen",
|
|
2440
2495
|
'toolbar.push': 'Push',
|
|
2441
2496
|
'toolbar.tree': 'Branch-Bereich',
|
|
2442
2497
|
'rail.more': 'Weitere Aktionen',
|
|
@@ -2547,6 +2602,7 @@ window.__ModuleLoader__.load({
|
|
|
2547
2602
|
'counts.untracked': 'Nicht verfolgt {n}',
|
|
2548
2603
|
'counts.conflicted': 'Konflikte {n}',
|
|
2549
2604
|
'push.confirm': '{branch} nach {upstream} pushen?',
|
|
2605
|
+
'push.confirmMany': "{n} Branch(es) pushen: {names}?",
|
|
2550
2606
|
'delete.confirm': 'Branch {name} löschen? Ein Hinweis kann ihn danach zurückholen (git verweigert weiterhin nicht gemergte Branches).',
|
|
2551
2607
|
'discard.confirm': 'Änderungen in {path} verwerfen? Der Arbeitsbaum wird überschrieben —— ein Hinweis kann sie danach zurückholen.',
|
|
2552
2608
|
'resetHard.confirm': 'Hart auf {hash} zurücksetzen? Nicht committete Änderungen gehen verloren.',
|
|
@@ -2572,6 +2628,7 @@ window.__ModuleLoader__.load({
|
|
|
2572
2628
|
'branches.tags': 'Étiquettes',
|
|
2573
2629
|
'branches.head': 'HEAD (branche courante)',
|
|
2574
2630
|
'branches.favorites': 'Favoris',
|
|
2631
|
+
'branches.starHint': "Favori",
|
|
2575
2632
|
'branches.pickHint': 'Cliquer pour sélectionner, double-cliquer pour extraire',
|
|
2576
2633
|
'branches.worktree': 'Extraite dans un autre arbre de travail',
|
|
2577
2634
|
'action.stash': 'Remisage',
|
|
@@ -2745,6 +2802,11 @@ window.__ModuleLoader__.load({
|
|
|
2745
2802
|
'toolbar.newBranch': 'Nouvelle branche',
|
|
2746
2803
|
'toolbar.fetch': 'Récupérer',
|
|
2747
2804
|
'toolbar.pull': 'Tirer',
|
|
2805
|
+
'toolbar.pullPicked': "Tirer {n} branche(s) sélectionnée(s)",
|
|
2806
|
+
'toolbar.fetchPicked': "Récupérer {n} réf(s) sélectionnée(s)",
|
|
2807
|
+
'toolbar.pushPicked': "Pousser {n} branche(s) sélectionnée(s)",
|
|
2808
|
+
'toolbar.checkoutPicked': "Extraire la branche sélectionnée",
|
|
2809
|
+
'toolbar.deletePicked': "Supprimer {n} réf(s) sélectionnée(s)",
|
|
2748
2810
|
'toolbar.push': 'Pousser',
|
|
2749
2811
|
'toolbar.tree': 'Volet des branches',
|
|
2750
2812
|
'rail.more': 'Plus d\'actions',
|
|
@@ -2855,6 +2917,7 @@ window.__ModuleLoader__.load({
|
|
|
2855
2917
|
'counts.untracked': 'Non suivi {n}',
|
|
2856
2918
|
'counts.conflicted': 'Conflits {n}',
|
|
2857
2919
|
'push.confirm': 'Pousser {branch} vers {upstream} ?',
|
|
2920
|
+
'push.confirmMany': "Pousser {n} branche(s) : {names} ?",
|
|
2858
2921
|
'delete.confirm': 'Supprimer la branche {name} ? Une notification peut ensuite la rétablir (git refuse toujours les branches non fusionnées).',
|
|
2859
2922
|
'discard.confirm': 'Abandonner les modifications de {path} ? Le contenu de l’arbre de travail est écrasé —— une notification peut ensuite le rétablir.',
|
|
2860
2923
|
'resetHard.confirm': 'Réinitialisation dure sur {hash} ? Les modifications non validées sont perdues.',
|
|
@@ -2880,6 +2943,7 @@ window.__ModuleLoader__.load({
|
|
|
2880
2943
|
'branches.tags': 'Теги',
|
|
2881
2944
|
'branches.head': 'HEAD (текущая ветка)',
|
|
2882
2945
|
'branches.favorites': 'Избранное',
|
|
2946
|
+
'branches.starHint': "В избранном",
|
|
2883
2947
|
'branches.pickHint': 'Щёлкните для выбора, двойной щелчок — переключение',
|
|
2884
2948
|
'branches.worktree': 'Уже развёрнута в другом рабочем дереве',
|
|
2885
2949
|
'action.stash': 'Отложить',
|
|
@@ -3053,6 +3117,11 @@ window.__ModuleLoader__.load({
|
|
|
3053
3117
|
'toolbar.newBranch': 'Новая ветка',
|
|
3054
3118
|
'toolbar.fetch': 'Получить',
|
|
3055
3119
|
'toolbar.pull': 'Забрать',
|
|
3120
|
+
'toolbar.pullPicked': "Забрать выбранные ветки ({n})",
|
|
3121
|
+
'toolbar.fetchPicked': "Подтянуть выбранные ссылки ({n})",
|
|
3122
|
+
'toolbar.pushPicked': "Отправить выбранные ветки ({n})",
|
|
3123
|
+
'toolbar.checkoutPicked': "Перейти на выбранную ветку",
|
|
3124
|
+
'toolbar.deletePicked': "Удалить выбранные ссылки ({n})",
|
|
3056
3125
|
'toolbar.push': 'Отправить',
|
|
3057
3126
|
'toolbar.tree': 'Панель веток',
|
|
3058
3127
|
'rail.more': 'Другие действия',
|
|
@@ -3163,6 +3232,7 @@ window.__ModuleLoader__.load({
|
|
|
3163
3232
|
'counts.untracked': 'Не отслеживается {n}',
|
|
3164
3233
|
'counts.conflicted': 'Конфликты {n}',
|
|
3165
3234
|
'push.confirm': 'Отправить {branch} в {upstream}?',
|
|
3235
|
+
'push.confirmMany': "Отправить ветки ({n}): {names}?",
|
|
3166
3236
|
'delete.confirm': 'Удалить ветку {name}? Уведомление затем сможет её вернуть (git по-прежнему откажет для несмёрженных веток).',
|
|
3167
3237
|
'discard.confirm': 'Отменить изменения в {path}? Содержимое рабочего дерева будет перезаписано —— уведомление затем сможет его вернуть.',
|
|
3168
3238
|
'resetHard.confirm': 'Жёсткий сброс на {hash}? Незакоммиченные изменения будут потеряны.',
|
|
@@ -3188,6 +3258,7 @@ window.__ModuleLoader__.load({
|
|
|
3188
3258
|
'branches.tags': 'Tags',
|
|
3189
3259
|
'branches.head': 'HEAD (branch atual)',
|
|
3190
3260
|
'branches.favorites': 'Favoritas',
|
|
3261
|
+
'branches.starHint': "Favorito",
|
|
3191
3262
|
'branches.pickHint': 'Clique para selecionar, clique duplo para fazer checkout',
|
|
3192
3263
|
'branches.worktree': 'Já em checkout em outra árvore de trabalho',
|
|
3193
3264
|
'action.stash': 'Stash',
|
|
@@ -3361,6 +3432,11 @@ window.__ModuleLoader__.load({
|
|
|
3361
3432
|
'toolbar.newBranch': 'Nova branch',
|
|
3362
3433
|
'toolbar.fetch': 'Buscar',
|
|
3363
3434
|
'toolbar.pull': 'Puxar',
|
|
3435
|
+
'toolbar.pullPicked': "Puxar {n} branch(es) selecionado(s)",
|
|
3436
|
+
'toolbar.fetchPicked': "Buscar {n} ref(s) selecionada(s)",
|
|
3437
|
+
'toolbar.pushPicked': "Enviar {n} branch(es) selecionado(s)",
|
|
3438
|
+
'toolbar.checkoutPicked': "Checkout do branch selecionado",
|
|
3439
|
+
'toolbar.deletePicked': "Excluir {n} ref(s) selecionada(s)",
|
|
3364
3440
|
'toolbar.push': 'Enviar',
|
|
3365
3441
|
'toolbar.tree': 'Painel de branches',
|
|
3366
3442
|
'rail.more': 'Mais ações',
|
|
@@ -3471,6 +3547,7 @@ window.__ModuleLoader__.load({
|
|
|
3471
3547
|
'counts.untracked': 'Não rastreado {n}',
|
|
3472
3548
|
'counts.conflicted': 'Conflitos {n}',
|
|
3473
3549
|
'push.confirm': 'Enviar {branch} para {upstream}?',
|
|
3550
|
+
'push.confirmMany': "Enviar {n} branch(es): {names}?",
|
|
3474
3551
|
'delete.confirm': 'Excluir a branch {name}? Um aviso ainda poderá trazê-la de volta (o git continua recusando branches não mescladas).',
|
|
3475
3552
|
'discard.confirm': 'Descartar as alterações em {path}? O conteúdo da árvore de trabalho será sobrescrito —— um aviso ainda poderá trazê-lo de volta.',
|
|
3476
3553
|
'resetHard.confirm': 'Redefinição forçada para {hash}? Alterações não commitadas serão perdidas.',
|
|
@@ -3496,6 +3573,7 @@ window.__ModuleLoader__.load({
|
|
|
3496
3573
|
'branches.tags': 'Tag',
|
|
3497
3574
|
'branches.head': 'HEAD (branch corrente)',
|
|
3498
3575
|
'branches.favorites': 'Preferiti',
|
|
3576
|
+
'branches.starHint': "Preferito",
|
|
3499
3577
|
'branches.pickHint': 'Clic per selezionare, doppio clic per fare checkout',
|
|
3500
3578
|
'branches.worktree': 'Già in checkout in un altro albero di lavoro',
|
|
3501
3579
|
'action.stash': 'Stash',
|
|
@@ -3669,6 +3747,11 @@ window.__ModuleLoader__.load({
|
|
|
3669
3747
|
'toolbar.newBranch': 'Nuovo branch',
|
|
3670
3748
|
'toolbar.fetch': 'Fetch',
|
|
3671
3749
|
'toolbar.pull': 'Pull',
|
|
3750
|
+
'toolbar.pullPicked': "Esegui pull di {n} branch selezionati",
|
|
3751
|
+
'toolbar.fetchPicked': "Esegui fetch di {n} ref selezionati",
|
|
3752
|
+
'toolbar.pushPicked': "Esegui push di {n} branch selezionati",
|
|
3753
|
+
'toolbar.checkoutPicked': "Checkout del branch selezionato",
|
|
3754
|
+
'toolbar.deletePicked': "Elimina {n} ref selezionati",
|
|
3672
3755
|
'toolbar.push': 'Push',
|
|
3673
3756
|
'toolbar.tree': 'Riquadro dei branch',
|
|
3674
3757
|
'rail.more': 'Altre azioni',
|
|
@@ -3779,6 +3862,7 @@ window.__ModuleLoader__.load({
|
|
|
3779
3862
|
'counts.untracked': 'Non tracciati {n}',
|
|
3780
3863
|
'counts.conflicted': 'Conflitti {n}',
|
|
3781
3864
|
'push.confirm': 'Inviare {branch} a {upstream}?',
|
|
3865
|
+
'push.confirmMany': "Eseguire il push di {n} branch: {names}?",
|
|
3782
3866
|
'delete.confirm': 'Eliminare il branch {name}? Un avviso potrà comunque riportarlo indietro (git continua a rifiutare i branch non uniti).',
|
|
3783
3867
|
'discard.confirm': 'Scartare le modifiche in {path}? Il contenuto dell’albero di lavoro viene sovrascritto —— un avviso potrà comunque riportarlo indietro.',
|
|
3784
3868
|
'resetHard.confirm': 'Reset forzato a {hash}? Le modifiche non committate andranno perse.',
|
|
@@ -3804,6 +3888,7 @@ window.__ModuleLoader__.load({
|
|
|
3804
3888
|
'branches.tags': 'Tags',
|
|
3805
3889
|
'branches.head': 'HEAD (huidige branch)',
|
|
3806
3890
|
'branches.favorites': 'Favorieten',
|
|
3891
|
+
'branches.starHint': "Favoriet",
|
|
3807
3892
|
'branches.pickHint': 'Klik om te selecteren, dubbelklik om uit te checken',
|
|
3808
3893
|
'branches.worktree': 'Al uitgecheckt in een andere werkboom',
|
|
3809
3894
|
'action.stash': 'Stash',
|
|
@@ -3977,6 +4062,11 @@ window.__ModuleLoader__.load({
|
|
|
3977
4062
|
'toolbar.newBranch': 'Nieuwe branch',
|
|
3978
4063
|
'toolbar.fetch': 'Fetch',
|
|
3979
4064
|
'toolbar.pull': 'Pull',
|
|
4065
|
+
'toolbar.pullPicked': "{n} geselecteerde branch(es) pullen",
|
|
4066
|
+
'toolbar.fetchPicked': "{n} geselecteerde ref(s) fetchen",
|
|
4067
|
+
'toolbar.pushPicked': "{n} geselecteerde branch(es) pushen",
|
|
4068
|
+
'toolbar.checkoutPicked': "Geselecteerde branch uitchecken",
|
|
4069
|
+
'toolbar.deletePicked': "{n} geselecteerde ref(s) verwijderen",
|
|
3980
4070
|
'toolbar.push': 'Push',
|
|
3981
4071
|
'toolbar.tree': 'Branchpaneel',
|
|
3982
4072
|
'rail.more': 'Meer acties',
|
|
@@ -4087,6 +4177,7 @@ window.__ModuleLoader__.load({
|
|
|
4087
4177
|
'counts.untracked': 'Niet gevolgd {n}',
|
|
4088
4178
|
'counts.conflicted': 'Conflicten {n}',
|
|
4089
4179
|
'push.confirm': '{branch} naar {upstream} pushen?',
|
|
4180
|
+
'push.confirmMany': "{n} branch(es) pushen: {names}?",
|
|
4090
4181
|
'delete.confirm': 'Branch {name} verwijderen? Een melding kan hem daarna nog terugbrengen (git weigert nog steeds niet-samengevoegde branches).',
|
|
4091
4182
|
'discard.confirm': 'Wijzigingen in {path} weggooien? De inhoud van de werkboom wordt overschreven —— een melding kan die daarna nog terugbrengen.',
|
|
4092
4183
|
'resetHard.confirm': 'Hard resetten naar {hash}? Niet-gecommitte wijzigingen gaan verloren.',
|
|
@@ -4112,6 +4203,7 @@ window.__ModuleLoader__.load({
|
|
|
4112
4203
|
'branches.tags': 'Tagi',
|
|
4113
4204
|
'branches.head': 'HEAD (bieżąca gałąź)',
|
|
4114
4205
|
'branches.favorites': 'Ulubione',
|
|
4206
|
+
'branches.starHint': "Ulubione",
|
|
4115
4207
|
'branches.pickHint': 'Kliknij, aby wybrać; kliknij dwukrotnie, aby przełączyć',
|
|
4116
4208
|
'branches.worktree': 'Już wybrana w innym drzewie roboczym',
|
|
4117
4209
|
'action.stash': 'Schowek',
|
|
@@ -4285,6 +4377,11 @@ window.__ModuleLoader__.load({
|
|
|
4285
4377
|
'toolbar.newBranch': 'Nowa gałąź',
|
|
4286
4378
|
'toolbar.fetch': 'Pobierz',
|
|
4287
4379
|
'toolbar.pull': 'Ściągnij',
|
|
4380
|
+
'toolbar.pullPicked': "Pobierz wybrane gałęzie ({n})",
|
|
4381
|
+
'toolbar.fetchPicked': "Ściągnij wybrane referencje ({n})",
|
|
4382
|
+
'toolbar.pushPicked': "Wyślij wybrane gałęzie ({n})",
|
|
4383
|
+
'toolbar.checkoutPicked': "Przełącz na wybraną gałąź",
|
|
4384
|
+
'toolbar.deletePicked': "Usuń wybrane referencje ({n})",
|
|
4288
4385
|
'toolbar.push': 'Wypchnij',
|
|
4289
4386
|
'toolbar.tree': 'Panel gałęzi',
|
|
4290
4387
|
'rail.more': 'Więcej działań',
|
|
@@ -4395,6 +4492,7 @@ window.__ModuleLoader__.load({
|
|
|
4395
4492
|
'counts.untracked': 'Nieśledzone {n}',
|
|
4396
4493
|
'counts.conflicted': 'Konflikty {n}',
|
|
4397
4494
|
'push.confirm': 'Wypchnąć {branch} do {upstream}?',
|
|
4495
|
+
'push.confirmMany': "Wysłać gałęzie ({n}): {names}?",
|
|
4398
4496
|
'delete.confirm': 'Usunąć gałąź {name}? Powiadomienie może ją potem przywrócić (git nadal odmawia dla niescalonych gałęzi).',
|
|
4399
4497
|
'discard.confirm': 'Odrzucić zmiany w {path}? Zawartość drzewa roboczego zostanie nadpisana —— powiadomienie może ją potem przywrócić.',
|
|
4400
4498
|
'resetHard.confirm': 'Twarde przywrócenie do {hash}? Niezapisane zmiany przepadną.',
|
|
@@ -4420,6 +4518,7 @@ window.__ModuleLoader__.load({
|
|
|
4420
4518
|
'branches.tags': 'Taggar',
|
|
4421
4519
|
'branches.head': 'HEAD (aktuell gren)',
|
|
4422
4520
|
'branches.favorites': 'Favoriter',
|
|
4521
|
+
'branches.starHint': "Favorit",
|
|
4423
4522
|
'branches.pickHint': 'Klicka för att välja, dubbelklicka för att checka ut',
|
|
4424
4523
|
'branches.worktree': 'Redan utcheckad i ett annat arbetsträd',
|
|
4425
4524
|
'action.stash': 'Stash',
|
|
@@ -4593,6 +4692,11 @@ window.__ModuleLoader__.load({
|
|
|
4593
4692
|
'toolbar.newBranch': 'Ny gren',
|
|
4594
4693
|
'toolbar.fetch': 'Fetch',
|
|
4595
4694
|
'toolbar.pull': 'Pull',
|
|
4695
|
+
'toolbar.pullPicked': "Pulla {n} valda grenar",
|
|
4696
|
+
'toolbar.fetchPicked': "Fetcha {n} valda referenser",
|
|
4697
|
+
'toolbar.pushPicked': "Pusha {n} valda grenar",
|
|
4698
|
+
'toolbar.checkoutPicked': "Checka ut vald gren",
|
|
4699
|
+
'toolbar.deletePicked': "Ta bort {n} valda referenser",
|
|
4596
4700
|
'toolbar.push': 'Push',
|
|
4597
4701
|
'toolbar.tree': 'Grenpanel',
|
|
4598
4702
|
'rail.more': 'Fler åtgärder',
|
|
@@ -4703,6 +4807,7 @@ window.__ModuleLoader__.load({
|
|
|
4703
4807
|
'counts.untracked': 'Ospårade {n}',
|
|
4704
4808
|
'counts.conflicted': 'Konflikter {n}',
|
|
4705
4809
|
'push.confirm': 'Pusha {branch} till {upstream}?',
|
|
4810
|
+
'push.confirmMany': "Pusha {n} gren(ar): {names}?",
|
|
4706
4811
|
'delete.confirm': 'Ta bort grenen {name}? En avisering kan sedan fortfarande återställa den (git nekar fortfarande till ej sammanfogade grenar).',
|
|
4707
4812
|
'discard.confirm': 'Förkasta ändringar i {path}? Arbetsträdets innehåll skrivs över —— en avisering kan sedan fortfarande återställa det.',
|
|
4708
4813
|
'resetHard.confirm': 'Hård återställning till {hash}? Ej committade ändringar går förlorade.',
|
|
@@ -4728,6 +4833,7 @@ window.__ModuleLoader__.load({
|
|
|
4728
4833
|
'branches.tags': 'Etiketler',
|
|
4729
4834
|
'branches.head': 'HEAD (geçerli dal)',
|
|
4730
4835
|
'branches.favorites': 'Sık kullanılanlar',
|
|
4836
|
+
'branches.starHint': "Favori",
|
|
4731
4837
|
'branches.pickHint': 'Seçmek için tıklayın, çıkarmak için çift tıklayın',
|
|
4732
4838
|
'branches.worktree': 'Başka bir çalışma ağacında çıkarılmış',
|
|
4733
4839
|
'action.stash': 'Saklama',
|
|
@@ -4901,6 +5007,11 @@ window.__ModuleLoader__.load({
|
|
|
4901
5007
|
'toolbar.newBranch': 'Yeni dal',
|
|
4902
5008
|
'toolbar.fetch': 'Fetch',
|
|
4903
5009
|
'toolbar.pull': 'Pull',
|
|
5010
|
+
'toolbar.pullPicked': "Seçilen {n} dalı çek",
|
|
5011
|
+
'toolbar.fetchPicked': "Seçilen {n} referansı getir",
|
|
5012
|
+
'toolbar.pushPicked': "Seçilen {n} dalı gönder",
|
|
5013
|
+
'toolbar.checkoutPicked': "Seçilen dala geç",
|
|
5014
|
+
'toolbar.deletePicked': "Seçilen {n} referansı sil",
|
|
4904
5015
|
'toolbar.push': 'Push',
|
|
4905
5016
|
'toolbar.tree': 'Dal paneli',
|
|
4906
5017
|
'rail.more': 'Diğer eylemler',
|
|
@@ -5011,6 +5122,7 @@ window.__ModuleLoader__.load({
|
|
|
5011
5122
|
'counts.untracked': 'İzlenmeyen {n}',
|
|
5012
5123
|
'counts.conflicted': 'Çakışmalar {n}',
|
|
5013
5124
|
'push.confirm': '{branch} dalı {upstream} deposuna gönderilsin mi?',
|
|
5125
|
+
'push.confirmMany': "{n} dal gönderilecek: {names}. Emin misiniz?",
|
|
5014
5126
|
'delete.confirm': '{name} dalı silinsin mi? Ardından bir bildirim onu geri getirebilir (git birleştirilmemiş dalları yine de reddeder).',
|
|
5015
5127
|
'discard.confirm': '{path} içindeki değişiklikler atılsın mı? Çalışma ağacının içeriği üzerine yazılır —— ardından bir bildirim onu geri getirebilir.',
|
|
5016
5128
|
'resetHard.confirm': '{hash} sürümüne zorla sıfırlansın mı? Commit’lenmemiş değişiklikler kaybolur.',
|
|
@@ -5036,6 +5148,7 @@ window.__ModuleLoader__.load({
|
|
|
5036
5148
|
'branches.tags': 'Tag',
|
|
5037
5149
|
'branches.head': 'HEAD (branch saat ini)',
|
|
5038
5150
|
'branches.favorites': 'Favorit',
|
|
5151
|
+
'branches.starHint': "Favorit",
|
|
5039
5152
|
'branches.pickHint': 'Klik untuk memilih, klik ganda untuk checkout',
|
|
5040
5153
|
'branches.worktree': 'Sudah di-checkout di worktree lain',
|
|
5041
5154
|
'action.stash': 'Stash',
|
|
@@ -5209,6 +5322,11 @@ window.__ModuleLoader__.load({
|
|
|
5209
5322
|
'toolbar.newBranch': 'Branch baru',
|
|
5210
5323
|
'toolbar.fetch': 'Fetch',
|
|
5211
5324
|
'toolbar.pull': 'Pull',
|
|
5325
|
+
'toolbar.pullPicked': "Pull {n} branch terpilih",
|
|
5326
|
+
'toolbar.fetchPicked': "Fetch {n} referensi terpilih",
|
|
5327
|
+
'toolbar.pushPicked': "Push {n} branch terpilih",
|
|
5328
|
+
'toolbar.checkoutPicked': "Checkout branch terpilih",
|
|
5329
|
+
'toolbar.deletePicked': "Hapus {n} referensi terpilih",
|
|
5212
5330
|
'toolbar.push': 'Push',
|
|
5213
5331
|
'toolbar.tree': 'Panel branch',
|
|
5214
5332
|
'rail.more': 'Tindakan lain',
|
|
@@ -5319,6 +5437,7 @@ window.__ModuleLoader__.load({
|
|
|
5319
5437
|
'counts.untracked': 'Tidak terlacak {n}',
|
|
5320
5438
|
'counts.conflicted': 'Konflik {n}',
|
|
5321
5439
|
'push.confirm': 'Push {branch} ke {upstream}?',
|
|
5440
|
+
'push.confirmMany': "Push {n} branch: {names}?",
|
|
5322
5441
|
'delete.confirm': 'Hapus branch {name}? Notifikasi masih bisa mengembalikannya (git tetap menolak branch yang belum digabung).',
|
|
5323
5442
|
'discard.confirm': 'Buang perubahan di {path}? Isi worktree ditimpa —— notifikasi masih bisa mengembalikannya.',
|
|
5324
5443
|
'resetHard.confirm': 'Reset keras ke {hash}? Perubahan yang belum di-commit akan hilang.',
|
|
@@ -5344,6 +5463,7 @@ window.__ModuleLoader__.load({
|
|
|
5344
5463
|
'branches.tags': 'Thẻ',
|
|
5345
5464
|
'branches.head': 'HEAD (nhánh hiện tại)',
|
|
5346
5465
|
'branches.favorites': 'Yêu thích',
|
|
5466
|
+
'branches.starHint': "Đã yêu thích",
|
|
5347
5467
|
'branches.pickHint': 'Nhấp để chọn, nhấp đôi để checkout',
|
|
5348
5468
|
'branches.worktree': 'Đã được checkout ở một worktree khác',
|
|
5349
5469
|
'action.stash': 'Tạm cất',
|
|
@@ -5517,6 +5637,11 @@ window.__ModuleLoader__.load({
|
|
|
5517
5637
|
'toolbar.newBranch': 'Nhánh mới',
|
|
5518
5638
|
'toolbar.fetch': 'Fetch',
|
|
5519
5639
|
'toolbar.pull': 'Pull',
|
|
5640
|
+
'toolbar.pullPicked': "Pull {n} nhánh đã chọn",
|
|
5641
|
+
'toolbar.fetchPicked': "Fetch {n} tham chiếu đã chọn",
|
|
5642
|
+
'toolbar.pushPicked': "Push {n} nhánh đã chọn",
|
|
5643
|
+
'toolbar.checkoutPicked': "Checkout nhánh đã chọn",
|
|
5644
|
+
'toolbar.deletePicked': "Xóa {n} tham chiếu đã chọn",
|
|
5520
5645
|
'toolbar.push': 'Push',
|
|
5521
5646
|
'toolbar.tree': 'Bảng nhánh',
|
|
5522
5647
|
'rail.more': 'Thao tác khác',
|
|
@@ -5627,6 +5752,7 @@ window.__ModuleLoader__.load({
|
|
|
5627
5752
|
'counts.untracked': 'Chưa theo dõi {n}',
|
|
5628
5753
|
'counts.conflicted': 'Xung đột {n}',
|
|
5629
5754
|
'push.confirm': 'Push {branch} lên {upstream}?',
|
|
5755
|
+
'push.confirmMany': "Push {n} nhánh: {names}?",
|
|
5630
5756
|
'delete.confirm': 'Xoá nhánh {name}? Thông báo sau đó vẫn có thể khôi phục (git vẫn từ chối nhánh chưa hợp nhất).',
|
|
5631
5757
|
'discard.confirm': 'Bỏ thay đổi trong {path}? Nội dung worktree sẽ bị ghi đè —— thông báo sau đó vẫn có thể khôi phục.',
|
|
5632
5758
|
'resetHard.confirm': 'Đặt lại cứng về {hash}? Thay đổi chưa commit sẽ mất.',
|
|
@@ -5652,6 +5778,7 @@ window.__ModuleLoader__.load({
|
|
|
5652
5778
|
'branches.tags': 'الوسوم',
|
|
5653
5779
|
'branches.head': 'HEAD (الفرع الحالي)',
|
|
5654
5780
|
'branches.favorites': 'المفضلة',
|
|
5781
|
+
'branches.starHint': "مفضل",
|
|
5655
5782
|
'branches.pickHint': 'انقر للتحديد، وانقر نقرًا مزدوجًا للتبديل',
|
|
5656
5783
|
'branches.worktree': 'مُستخرَج بالفعل في شجرة عمل أخرى',
|
|
5657
5784
|
'action.stash': 'التخزين المؤقت',
|
|
@@ -5825,6 +5952,11 @@ window.__ModuleLoader__.load({
|
|
|
5825
5952
|
'toolbar.newBranch': 'فرع جديد',
|
|
5826
5953
|
'toolbar.fetch': 'جلب',
|
|
5827
5954
|
'toolbar.pull': 'سحب',
|
|
5955
|
+
'toolbar.pullPicked': "سحب {n} فروع مختارة",
|
|
5956
|
+
'toolbar.fetchPicked': "جلب {n} مراجع مختارة",
|
|
5957
|
+
'toolbar.pushPicked': "دفع {n} فروع مختارة",
|
|
5958
|
+
'toolbar.checkoutPicked': "التبديل إلى الفرع المختار",
|
|
5959
|
+
'toolbar.deletePicked': "حذف {n} مراجع مختارة",
|
|
5828
5960
|
'toolbar.push': 'دفع',
|
|
5829
5961
|
'toolbar.tree': 'لوحة الفروع',
|
|
5830
5962
|
'rail.more': 'مزيد من الإجراءات',
|
|
@@ -5935,6 +6067,7 @@ window.__ModuleLoader__.load({
|
|
|
5935
6067
|
'counts.untracked': 'غير متعقَّب {n}',
|
|
5936
6068
|
'counts.conflicted': 'التعارضات {n}',
|
|
5937
6069
|
'push.confirm': 'دفع {branch} إلى {upstream}?',
|
|
6070
|
+
'push.confirmMany': "دفع {n} فروع: {names}؟",
|
|
5938
6071
|
'delete.confirm': 'حذف الفرع {name}? يمكن لإشعار بعد ذلك أن يعيده (سيظل git يرفض الفروع غير المدمجة).',
|
|
5939
6072
|
'discard.confirm': 'تجاهل التغييرات في {path}? سيُستبدل محتوى شجرة العمل —— ويمكن لإشعار بعد ذلك أن يعيده.',
|
|
5940
6073
|
'resetHard.confirm': 'إعادة تعيين قسرية إلى {hash}? ستفقد التغييرات غير الملتزَم بها.',
|
|
@@ -5960,6 +6093,7 @@ window.__ModuleLoader__.load({
|
|
|
5960
6093
|
'branches.tags': 'टैग',
|
|
5961
6094
|
'branches.head': 'HEAD (वर्तमान शाखा)',
|
|
5962
6095
|
'branches.favorites': 'पसंदीदा',
|
|
6096
|
+
'branches.starHint': "पसंदीदा",
|
|
5963
6097
|
'branches.pickHint': 'चुनने के लिए क्लिक करें, चेकआउट के लिए डबल-क्लिक करें',
|
|
5964
6098
|
'branches.worktree': 'पहले से किसी अन्य वर्कट्री में चेकआउट है',
|
|
5965
6099
|
'action.stash': 'स्टैश',
|
|
@@ -6133,6 +6267,11 @@ window.__ModuleLoader__.load({
|
|
|
6133
6267
|
'toolbar.newBranch': 'नई शाखा',
|
|
6134
6268
|
'toolbar.fetch': 'फ़ेच',
|
|
6135
6269
|
'toolbar.pull': 'पुल',
|
|
6270
|
+
'toolbar.pullPicked': "{n} चुनी हुई शाखाएँ पुल करें",
|
|
6271
|
+
'toolbar.fetchPicked': "{n} चुने हुए रेफ़रेंस फ़ेच करें",
|
|
6272
|
+
'toolbar.pushPicked': "{n} चुनी हुई शाखाएँ पुश करें",
|
|
6273
|
+
'toolbar.checkoutPicked': "चुनी हुई शाखा पर स्विच करें",
|
|
6274
|
+
'toolbar.deletePicked': "{n} चुने हुए रेफ़रेंस हटाएँ",
|
|
6136
6275
|
'toolbar.push': 'पुश',
|
|
6137
6276
|
'toolbar.tree': 'शाखा पैनल',
|
|
6138
6277
|
'rail.more': 'अधिक क्रियाएँ',
|
|
@@ -6243,6 +6382,7 @@ window.__ModuleLoader__.load({
|
|
|
6243
6382
|
'counts.untracked': 'अनट्रैक्ड {n}',
|
|
6244
6383
|
'counts.conflicted': 'टकराव {n}',
|
|
6245
6384
|
'push.confirm': '{branch} को {upstream} पर पुश करें?',
|
|
6385
|
+
'push.confirmMany': "{n} शाखाएँ पुश करें: {names}?",
|
|
6246
6386
|
'delete.confirm': 'शाखा {name} हटाएँ? बाद में एक सूचना इसे वापस ला सकती है (git अब भी अनमर्ज्ड शाखाओं से इनकार करता है)।',
|
|
6247
6387
|
'discard.confirm': '{path} में परिवर्तन छोड़ें? वर्कट्री की सामग्री अधिलेखित हो जाएगी —— बाद में एक सूचना इसे वापस ला सकती है।',
|
|
6248
6388
|
'resetHard.confirm': '{hash} पर हार्ड रीसेट करें? बिना कमिट किए परिवर्तन खो जाएँगे।',
|
|
@@ -6268,6 +6408,7 @@ window.__ModuleLoader__.load({
|
|
|
6268
6408
|
'branches.tags': 'แท็ก',
|
|
6269
6409
|
'branches.head': 'HEAD (แบรนช์ปัจจุบัน)',
|
|
6270
6410
|
'branches.favorites': 'รายการโปรด',
|
|
6411
|
+
'branches.starHint': "รายการโปรด",
|
|
6271
6412
|
'branches.pickHint': 'คลิกเพื่อเลือก ดับเบิลคลิกเพื่อเช็กเอาต์',
|
|
6272
6413
|
'branches.worktree': 'เช็กเอาต์อยู่ในเวิร์กทรีอื่นแล้ว',
|
|
6273
6414
|
'action.stash': 'สแตช',
|
|
@@ -6441,6 +6582,11 @@ window.__ModuleLoader__.load({
|
|
|
6441
6582
|
'toolbar.newBranch': 'แบรนช์ใหม่',
|
|
6442
6583
|
'toolbar.fetch': 'Fetch',
|
|
6443
6584
|
'toolbar.pull': 'Pull',
|
|
6585
|
+
'toolbar.pullPicked': "Pull {n} สาขาที่เลือก",
|
|
6586
|
+
'toolbar.fetchPicked': "Fetch {n} รีเฟอเรนซ์ที่เลือก",
|
|
6587
|
+
'toolbar.pushPicked': "Push {n} สาขาที่เลือก",
|
|
6588
|
+
'toolbar.checkoutPicked': "เปลี่ยนไปยังสาขาที่เลือก",
|
|
6589
|
+
'toolbar.deletePicked': "ลบ {n} รีเฟอเรนซ์ที่เลือก",
|
|
6444
6590
|
'toolbar.push': 'Push',
|
|
6445
6591
|
'toolbar.tree': 'แผงแบรนช์',
|
|
6446
6592
|
'rail.more': 'การทำงานเพิ่มเติม',
|
|
@@ -6551,6 +6697,7 @@ window.__ModuleLoader__.load({
|
|
|
6551
6697
|
'counts.untracked': 'ไม่ถูกติดตาม {n}',
|
|
6552
6698
|
'counts.conflicted': 'ความขัดแย้ง {n}',
|
|
6553
6699
|
'push.confirm': 'พุช {branch} ไปที่ {upstream}?',
|
|
6700
|
+
'push.confirmMany': "จะ Push {n} สาขา: {names} ใช่หรือไม่?",
|
|
6554
6701
|
'delete.confirm': 'ลบแบรนช์ {name}? จากนั้นยังกู้คืนได้ผ่านการแจ้งเตือน (git ยังคงปฏิเสธแบรนช์ที่ยังไม่รวม)',
|
|
6555
6702
|
'discard.confirm': 'ทิ้งการเปลี่ยนแปลงใน {path}? เนื้อหาของเวิร์กทรีจะถูกเขียนทับ —— จากนั้นยังกู้คืนได้ผ่านการแจ้งเตือน',
|
|
6556
6703
|
'resetHard.confirm': 'ฮาร์ดรีเซ็ตไปที่ {hash}? การเปลี่ยนแปลงที่ยังไม่คอมมิตจะหายไป',
|
|
@@ -7615,6 +7762,55 @@ window.__ModuleLoader__.load({
|
|
|
7615
7762
|
return index < 0 ? '' : filePath.slice(0, index)
|
|
7616
7763
|
}
|
|
7617
7764
|
|
|
7765
|
+
/* A REAL directory tree for the "by directory" grouping (v0.18.6): files
|
|
7766
|
+
are inserted by path segments, then a folder that has no direct files
|
|
7767
|
+
and exactly one child is COMPRESSED into that child ("a/b/c" as one
|
|
7768
|
+
node, VS Code source-control style) — the flat per-directory heads the
|
|
7769
|
+
user rejected rendered every folder of a chain side by side, so
|
|
7770
|
+
`pkg/service` and `pkg/service/impl` looked like unrelated siblings.
|
|
7771
|
+
Returns the compressed roots (sorted), every foldable node id (for
|
|
7772
|
+
fold-all), the files sitting at the group root, and the two recursive
|
|
7773
|
+
helpers the renderer needs. */
|
|
7774
|
+
function buildDirForest(items, groupKey) {
|
|
7775
|
+
const root = { dirs: new Map(), files: [], path: [] }
|
|
7776
|
+
for (const item of items) {
|
|
7777
|
+
const dir = dirName(item.path)
|
|
7778
|
+
const parts = dir === '' ? [] : dir.split('/')
|
|
7779
|
+
let node = root
|
|
7780
|
+
for (const part of parts) {
|
|
7781
|
+
let child = node.dirs.get(part)
|
|
7782
|
+
if (child === undefined) {
|
|
7783
|
+
child = { dirs: new Map(), files: [], path: node.path.concat([part]) }
|
|
7784
|
+
node.dirs.set(part, child)
|
|
7785
|
+
}
|
|
7786
|
+
node = child
|
|
7787
|
+
}
|
|
7788
|
+
node.files.push(item)
|
|
7789
|
+
}
|
|
7790
|
+
const compress = (node) => {
|
|
7791
|
+
let merged = node
|
|
7792
|
+
while (merged.files.length === 0 && merged.dirs.size === 1) {
|
|
7793
|
+
const only = merged.dirs.values().next().value
|
|
7794
|
+
merged = { dirs: only.dirs, files: only.files, path: only.path }
|
|
7795
|
+
}
|
|
7796
|
+
return merged
|
|
7797
|
+
}
|
|
7798
|
+
const countOf = (node) => {
|
|
7799
|
+
let total = node.files.length
|
|
7800
|
+
for (const child of node.dirs.values()) total += countOf(child)
|
|
7801
|
+
return total
|
|
7802
|
+
}
|
|
7803
|
+
const sortedChildren = (node) => Array.from(node.dirs.values()).sort((a, b) => a.path[a.path.length - 1].localeCompare(b.path[b.path.length - 1]))
|
|
7804
|
+
const ids = []
|
|
7805
|
+
const collect = (node) => {
|
|
7806
|
+
ids.push(groupKey + '|' + node.path.join('/'))
|
|
7807
|
+
for (const child of sortedChildren(node)) collect(child)
|
|
7808
|
+
}
|
|
7809
|
+
const roots = sortedChildren(root).map((child) => compress(child))
|
|
7810
|
+
for (const node of roots) collect(node)
|
|
7811
|
+
return { roots: roots, rootFiles: root.files, ids: ids, countOf: countOf, sortedChildren: sortedChildren }
|
|
7812
|
+
}
|
|
7813
|
+
|
|
7618
7814
|
/* ============================== commit graph ============================== */
|
|
7619
7815
|
|
|
7620
7816
|
function buildRows(commits) {
|
|
@@ -9720,7 +9916,11 @@ window.__ModuleLoader__.load({
|
|
|
9720
9916
|
const entry = props.entry
|
|
9721
9917
|
const isHead = entry.head === true
|
|
9722
9918
|
const kind = entry.tag === true ? 'tag' : entry.remote === true ? 'remote' : isHead ? 'head' : 'local'
|
|
9723
|
-
|
|
9919
|
+
// A favorited branch wears a SOLID amber star everywhere it appears
|
|
9920
|
+
// (favorites section AND its home section) — before this the row kept
|
|
9921
|
+
// its plain kind glyph, so a starred branch read as "not favorited".
|
|
9922
|
+
const starred = props.starred === true
|
|
9923
|
+
const tone = starred ? 'warn' : kind === 'tag' ? 'warn' : kind === 'remote' ? 'violet' : kind === 'head' ? 'success' : 'accent'
|
|
9724
9924
|
const glyph = kind === 'tag' ? 'tag' : kind === 'remote' ? 'fetch' : kind === 'head' ? 'star' : 'branch'
|
|
9725
9925
|
const where = entry.upstream === null || entry.upstream === undefined ? entry.name : entry.name + ' → ' + entry.upstream
|
|
9726
9926
|
// A single click only SELECTS (now with Shift/Ctrl+click multi-select —
|
|
@@ -9736,7 +9936,7 @@ window.__ModuleLoader__.load({
|
|
|
9736
9936
|
onDoubleClick: () => props.onCheckout(entry),
|
|
9737
9937
|
onContextMenu: (event) => { event.preventDefault(); props.onMenu(event, entry) },
|
|
9738
9938
|
},
|
|
9739
|
-
E('span', { className: 'dig-row-icon dig-tone-' + tone }, E(Icon, { name: glyph, size: 12 })),
|
|
9939
|
+
E('span', { className: 'dig-row-icon dig-tone-' + tone + (starred === true ? ' dig-star-filled' : '') }, E(Icon, { name: glyph, size: 12 })),
|
|
9740
9940
|
E('span', { className: 'dig-row-label' }, props.label === undefined ? entry.name : props.label),
|
|
9741
9941
|
// A bare 'W' told nobody anything (reported right after the section counts):
|
|
9742
9942
|
// it means this branch is checked out in ANOTHER working tree, which is why
|
|
@@ -9777,10 +9977,14 @@ window.__ModuleLoader__.load({
|
|
|
9777
9977
|
const branches = props.branches
|
|
9778
9978
|
const needle = filter.trim().toLowerCase()
|
|
9779
9979
|
const match = (name) => needle === '' || String(name).toLowerCase().indexOf(needle) >= 0
|
|
9780
|
-
const locals = (branches === null ? [] : branches.local).filter((entry) => match(entry.name))
|
|
9781
9980
|
const remotes = (branches === null ? [] : branches.remote).filter((entry) => match(entry.name))
|
|
9782
9981
|
const tags = (branches === null ? [] : branches.tags).filter((entry) => match(entry.name))
|
|
9783
9982
|
const favorites = Array.isArray(props.favorites) ? props.favorites : []
|
|
9983
|
+
// Favorited branches float to the top of the local list; the stable sort
|
|
9984
|
+
// keeps the alphabetical order inside each of the two groups, so both the
|
|
9985
|
+
// favorites section and the local tree show the starred rows first.
|
|
9986
|
+
const locals = (branches === null ? [] : branches.local).filter((entry) => match(entry.name))
|
|
9987
|
+
.sort((a, b) => (favorites.indexOf(a.name) >= 0 ? 0 : 1) - (favorites.indexOf(b.name) >= 0 ? 0 : 1))
|
|
9784
9988
|
/* A refresh that makes a picked ref disappear must not keep it selected. */
|
|
9785
9989
|
useEffect(() => {
|
|
9786
9990
|
setPicks((previous) => {
|
|
@@ -9796,6 +10000,12 @@ window.__ModuleLoader__.load({
|
|
|
9796
10000
|
return next.size === previous.size ? previous : next
|
|
9797
10001
|
})
|
|
9798
10002
|
}, [branches])
|
|
10003
|
+
/* Report the picks up to the Panel on every change (a plain effect — a
|
|
10004
|
+
render-time call would trip the hooks rules): the rail reads them so
|
|
10005
|
+
its buttons can act on the selection instead of only on HEAD. */
|
|
10006
|
+
useEffect(() => {
|
|
10007
|
+
if (props.onPicksChange !== undefined) props.onPicksChange(picks)
|
|
10008
|
+
}, [picks])
|
|
9799
10009
|
/**
|
|
9800
10010
|
* Branch names nest on '/', the way an IDE shows a branch namespace: clicking a
|
|
9801
10011
|
* row only SELECTS it (checking out rewrites the working tree), so the row
|
|
@@ -9860,6 +10070,7 @@ window.__ModuleLoader__.load({
|
|
|
9860
10070
|
key: 'row:' + branchSelKeyOf(entry), entry: entry, label: label, depth: depth, t: t,
|
|
9861
10071
|
selKey: branchSelKeyOf(entry),
|
|
9862
10072
|
selected: picks.has(branchSelKeyOf(entry)) === true,
|
|
10073
|
+
starred: entry.tag !== true && entry.remote !== true && favorites.indexOf(entry.name) >= 0,
|
|
9863
10074
|
onPick: handlePick,
|
|
9864
10075
|
onCheckout: props.onCheckout, onMenu: onRowMenu,
|
|
9865
10076
|
})
|
|
@@ -9993,8 +10204,12 @@ window.__ModuleLoader__.load({
|
|
|
9993
10204
|
// stage/discard buttons below would silently do nothing (git needs -f).
|
|
9994
10205
|
const readOnly = props.group === 'ignored'
|
|
9995
10206
|
const status = readOnly ? 'I' : (raw === '' ? 'M' : raw.charAt(0))
|
|
10207
|
+
/* Tree depth in dir-grouped mode (-1 = flat): every level under a
|
|
10208
|
+
folder head indents one 12px step past the base 26px. */
|
|
10209
|
+
const depth = typeof props.depth === 'number' ? props.depth : -1
|
|
9996
10210
|
return E('div', {
|
|
9997
|
-
className: 'dig-row dig-row-file' + (props.selected === true ? ' dig-row-selected' : ''),
|
|
10211
|
+
className: 'dig-row dig-row-file' + (props.selected === true ? ' dig-row-selected' : '') + (depth >= 0 ? ' dig-row-nested' : ''),
|
|
10212
|
+
style: depth >= 0 ? { paddingLeft: (26 + depth * 12) + 'px' } : undefined,
|
|
9998
10213
|
title: item.origPath === undefined ? item.path : item.origPath + ' → ' + item.path,
|
|
9999
10214
|
/* The click is handled ONE level up (ChangesPanel): plain click only
|
|
10000
10215
|
selects, DOUBLE-click opens the diff (v0.18.3 — one interaction model
|
|
@@ -10008,14 +10223,17 @@ window.__ModuleLoader__.load({
|
|
|
10008
10223
|
// An ignored DIRECTORY comes back as "dist/" (ls-files --directory), whose
|
|
10009
10224
|
// basename is empty — show the whole path instead of a blank label.
|
|
10010
10225
|
E('span', { className: 'dig-row-label' }, item.path.slice(-1) === '/' ? item.path : baseName(item.path)),
|
|
10011
|
-
|
|
10226
|
+
// In dir-grouped mode the folder head already names the directory —
|
|
10227
|
+
// repeating the full path at the end of every nested row is what made
|
|
10228
|
+
// the tree read as a flat list (v0.18.5). Flat modes keep it.
|
|
10229
|
+
depth >= 0 ? null : E('span', { className: 'dig-row-sub dig-row-dir' }, item.path.slice(-1) === '/' ? '' : dirName(item.path)),
|
|
10012
10230
|
item.additions > 0 ? E('span', { className: 'dig-stat-add' }, '+' + item.additions) : null,
|
|
10013
10231
|
item.deletions > 0 ? E('span', { className: 'dig-stat-del' }, '-' + item.deletions) : null,
|
|
10014
10232
|
readOnly ? null : (props.group === 'staged'
|
|
10015
10233
|
? E('button', { type: 'button', className: 'dig-mini', title: t('action.unstage'), onClick: (event) => { event.stopPropagation(); props.onUnstage(item) } }, E(Icon, { name: 'minus', size: 12 }))
|
|
10016
10234
|
: E('button', { type: 'button', className: 'dig-mini', title: t('action.stage'), onClick: (event) => { event.stopPropagation(); props.onStage(item) } }, E(Icon, { name: 'plus', size: 12 }))),
|
|
10017
10235
|
readOnly ? null : E('button', { type: 'button', className: 'dig-mini', title: t('action.discard'), onClick: (event) => { event.stopPropagation(); props.onDiscard(item, props.group) } }, E(Icon, { name: 'undo', size: 12 })))
|
|
10018
|
-
}, (prev, next) => prev.item === next.item && prev.group === next.group && prev.t === next.t && prev.selected === next.selected)
|
|
10236
|
+
}, (prev, next) => prev.item === next.item && prev.group === next.group && prev.t === next.t && prev.selected === next.selected && prev.depth === next.depth)
|
|
10019
10237
|
|
|
10020
10238
|
function ChangesPanel(props) {
|
|
10021
10239
|
const t = props.t
|
|
@@ -10251,17 +10469,14 @@ window.__ModuleLoader__.load({
|
|
|
10251
10469
|
setAmend(false)
|
|
10252
10470
|
return true
|
|
10253
10471
|
}
|
|
10254
|
-
const entryRow = (key, item) => E(ChangeRow, {
|
|
10472
|
+
const entryRow = (key, item, depth) => E(ChangeRow, {
|
|
10255
10473
|
key: key + ':' + item.path, item: item, group: key, t: t,
|
|
10474
|
+
depth: typeof depth === 'number' ? depth : -1,
|
|
10256
10475
|
selected: selection.has(key + ':' + item.path) === true,
|
|
10257
10476
|
onRowClick: handleRowClick,
|
|
10258
10477
|
onDblClick: props.onDiff,
|
|
10259
10478
|
onStage: props.onStage, onUnstage: props.onUnstage, onDiscard: props.onDiscard, onDiff: props.onDiff, onMenu: props.onChangeMenu,
|
|
10260
10479
|
})
|
|
10261
|
-
const folderOf = (item) => {
|
|
10262
|
-
const dir = dirName(item.path)
|
|
10263
|
-
return dir === '' ? t('changes.rootDir') : dir
|
|
10264
|
-
}
|
|
10265
10480
|
/* The "..." menu's sort orders (v0.15). 'git' keeps git's own status
|
|
10266
10481
|
order; the others are pure client-side sorts of already-loaded
|
|
10267
10482
|
entries — no extra git calls, no re-fetch. */
|
|
@@ -10289,28 +10504,48 @@ window.__ModuleLoader__.load({
|
|
|
10289
10504
|
for (const item of sorted) out.push({ kind: 'row', key: key + ':' + item.path, h: ITEM_HEIGHTS.row, node: entryRow(key, item) })
|
|
10290
10505
|
return
|
|
10291
10506
|
}
|
|
10292
|
-
const
|
|
10293
|
-
|
|
10294
|
-
const
|
|
10295
|
-
if (folders.has(name) === false) folders.set(name, [])
|
|
10296
|
-
folders.get(name).push(item)
|
|
10297
|
-
}
|
|
10298
|
-
for (const name of Array.from(folders.keys()).sort()) {
|
|
10299
|
-
const id = key + '|' + name
|
|
10507
|
+
const forest = buildDirForest(sorted, key)
|
|
10508
|
+
const renderFolder = (node, depth) => {
|
|
10509
|
+
const id = key + '|' + node.path.join('/')
|
|
10300
10510
|
const open = foldedDirs[id] !== true
|
|
10301
|
-
const list = folders.get(name)
|
|
10302
10511
|
out.push({
|
|
10303
10512
|
kind: 'folder', key: 'folder:' + id, h: ITEM_HEIGHTS.folder,
|
|
10304
10513
|
node: E('button', {
|
|
10305
10514
|
type: 'button', className: 'dig-folder-head',
|
|
10515
|
+
style: { paddingLeft: (4 + depth * 12) + 'px' },
|
|
10306
10516
|
onClick: () => setFoldedDirs((previous) => Object.assign({}, previous, { [id]: previous[id] !== true })),
|
|
10307
10517
|
},
|
|
10308
10518
|
E('span', { className: 'dig-chevron' + (open ? ' dig-chevron-open' : '') }, E(Icon, { name: 'chevron', size: 10 })),
|
|
10309
|
-
E('span', { className: 'dig-
|
|
10310
|
-
E('span', { className: 'dig-
|
|
10519
|
+
E('span', { className: 'dig-row-icon dig-tone-accent' }, E(Icon, { name: 'folder', size: 10 })),
|
|
10520
|
+
E('span', { className: 'dig-folder-name' }, node.path.join('/')),
|
|
10521
|
+
E('span', { className: 'dig-count' }, String(forest.countOf(node)))),
|
|
10522
|
+
})
|
|
10523
|
+
if (open === true) {
|
|
10524
|
+
/* VS Code order inside a folder: subfolders first (recursively,
|
|
10525
|
+
each indented one more level), then this folder's own files. */
|
|
10526
|
+
for (const child of forest.sortedChildren(node)) renderFolder(child, depth + 1)
|
|
10527
|
+
for (const item of sortedOf(node.files)) out.push({ kind: 'row', key: key + ':' + item.path, h: ITEM_HEIGHTS.row, node: entryRow(key, item, depth) })
|
|
10528
|
+
}
|
|
10529
|
+
}
|
|
10530
|
+
/* Files sitting at the group ROOT get their own (root) head, sorted
|
|
10531
|
+
first — the flat grouping used to give them a localized head too. */
|
|
10532
|
+
if (forest.rootFiles.length > 0) {
|
|
10533
|
+
const rootId = key + '|/'
|
|
10534
|
+
const rootOpen = foldedDirs[rootId] !== true
|
|
10535
|
+
out.push({
|
|
10536
|
+
kind: 'folder', key: 'folder:' + rootId, h: ITEM_HEIGHTS.folder,
|
|
10537
|
+
node: E('button', {
|
|
10538
|
+
type: 'button', className: 'dig-folder-head',
|
|
10539
|
+
onClick: () => setFoldedDirs((previous) => Object.assign({}, previous, { [rootId]: previous[rootId] !== true })),
|
|
10540
|
+
},
|
|
10541
|
+
E('span', { className: 'dig-chevron' + (rootOpen ? ' dig-chevron-open' : '') }, E(Icon, { name: 'chevron', size: 10 })),
|
|
10542
|
+
E('span', { className: 'dig-row-icon dig-tone-accent' }, E(Icon, { name: 'folder', size: 10 })),
|
|
10543
|
+
E('span', { className: 'dig-folder-name' }, t('changes.rootDir')),
|
|
10544
|
+
E('span', { className: 'dig-count' }, String(forest.rootFiles.length))),
|
|
10311
10545
|
})
|
|
10312
|
-
if (
|
|
10546
|
+
if (rootOpen === true) for (const item of sortedOf(forest.rootFiles)) out.push({ kind: 'row', key: key + ':' + item.path, h: ITEM_HEIGHTS.row, node: entryRow(key, item, 0) })
|
|
10313
10547
|
}
|
|
10548
|
+
for (const node of forest.roots) renderFolder(node, 0)
|
|
10314
10549
|
}
|
|
10315
10550
|
const emitGroup = (key, title, entries) => {
|
|
10316
10551
|
if (entries.length === 0) return
|
|
@@ -10964,6 +11199,9 @@ window.__ModuleLoader__.load({
|
|
|
10964
11199
|
const [changeSelection, setChangeSelection] = useState(() => new Set())
|
|
10965
11200
|
const changeAnchor = useRef(null)
|
|
10966
11201
|
const [pickedCommits, setPickedCommits] = useState(() => new Set())
|
|
11202
|
+
/* The branch tree reports its picks up (onPicksChange) so the rail can act
|
|
11203
|
+
on the selection: "select main, press pull" must pull main, not HEAD. */
|
|
11204
|
+
const [branchPicks, setBranchPicks] = useState(() => new Set())
|
|
10967
11205
|
const [menu, setMenu] = useState(null)
|
|
10968
11206
|
const [dialog, setDialog] = useState(null)
|
|
10969
11207
|
const [tick, setTick] = useState(0)
|
|
@@ -12430,10 +12668,12 @@ window.__ModuleLoader__.load({
|
|
|
12430
12668
|
if (changes !== null) {
|
|
12431
12669
|
const groups = [['conflicted', changes.conflicted], ['staged', changes.staged], ['unstaged', changes.unstaged], ['untracked', changes.untracked], ['ignored', changes.ignored === undefined ? [] : changes.ignored]]
|
|
12432
12670
|
for (const pair of groups) {
|
|
12433
|
-
|
|
12434
|
-
|
|
12435
|
-
|
|
12436
|
-
|
|
12671
|
+
/* Fold every node of the compressed tree — the ids come from
|
|
12672
|
+
the same builder the renderer uses, so single-chain nodes
|
|
12673
|
+
("a/b/c") fold exactly where they render (v0.18.6). */
|
|
12674
|
+
const forest = buildDirForest(pair[1], pair[0])
|
|
12675
|
+
if (forest.rootFiles.length > 0) next[pair[0] + '|/'] = true
|
|
12676
|
+
for (const id of forest.ids) next[id] = true
|
|
12437
12677
|
}
|
|
12438
12678
|
}
|
|
12439
12679
|
setFoldedDirs(next)
|
|
@@ -12567,6 +12807,53 @@ window.__ModuleLoader__.load({
|
|
|
12567
12807
|
onKeyDown: onChangesKeyDown,
|
|
12568
12808
|
})
|
|
12569
12809
|
|
|
12810
|
+
/* --- Rail acts on the branch-tree selection (v0.18.5) -------------------
|
|
12811
|
+
The tree reports its picks up; the rail resolves them back to live
|
|
12812
|
+
entries so "select main, press pull" pulls MAIN, not HEAD. With no
|
|
12813
|
+
selection every button keeps its old HEAD-oriented behaviour. */
|
|
12814
|
+
const pickedBranchEntries = () => {
|
|
12815
|
+
const out = []
|
|
12816
|
+
if (branches === null || branchPicks.size === 0) return out
|
|
12817
|
+
for (const key of branchPicks) {
|
|
12818
|
+
const colon = key.indexOf(':')
|
|
12819
|
+
const kind = key.slice(0, colon)
|
|
12820
|
+
const name = key.slice(colon + 1)
|
|
12821
|
+
if (kind === 'local') { const entry = branches.local.find((x) => x.name === name); if (entry !== undefined) out.push({ kind: 'local', name: name, entry: entry }) }
|
|
12822
|
+
else if (kind === 'remote') { const entry = branches.remote.find((x) => x.name === name); if (entry !== undefined) out.push({ kind: 'remote', name: name, entry: entry }) }
|
|
12823
|
+
else { const entry = branches.tags.find((x) => x.name === name); if (entry !== undefined) out.push({ kind: 'tag', name: name, entry: entry }) }
|
|
12824
|
+
}
|
|
12825
|
+
return out
|
|
12826
|
+
}
|
|
12827
|
+
/* "Pull" a branch that is NOT checked out: git pull would merge into
|
|
12828
|
+
HEAD, so a non-HEAD branch is fast-forwarded in place via a refspec
|
|
12829
|
+
fetch (`git fetch origin name:name` — git refuses a non-ff update,
|
|
12830
|
+
which is exactly the safety we want). run() never throws (the guard
|
|
12831
|
+
turns failures into the error banner), so one bad branch does not
|
|
12832
|
+
abort the rest of the batch. */
|
|
12833
|
+
const pullPickedBranches = async (picked) => {
|
|
12834
|
+
for (const item of picked) {
|
|
12835
|
+
if (item.kind !== 'local') continue
|
|
12836
|
+
if (item.entry.head === true) { await run('pull', { mode: 'ff-only' }); continue }
|
|
12837
|
+
const upstream = item.entry.upstream
|
|
12838
|
+
if (upstream === null || upstream === undefined || upstream === '') continue
|
|
12839
|
+
const slash = upstream.indexOf('/')
|
|
12840
|
+
const remote = slash >= 0 ? upstream.slice(0, slash) : upstream
|
|
12841
|
+
await run('fetch', { remote: remote, branch: item.name + ':' + item.name })
|
|
12842
|
+
}
|
|
12843
|
+
}
|
|
12844
|
+
const fetchPickedRefs = async (picked) => {
|
|
12845
|
+
for (const item of picked) {
|
|
12846
|
+
if (item.kind === 'remote') { await run('fetch', { remote: item.name, prune: true }); continue }
|
|
12847
|
+
if (item.kind !== 'local') continue
|
|
12848
|
+
const upstream = item.entry.upstream
|
|
12849
|
+
if (upstream === null || upstream === undefined || upstream === '') continue
|
|
12850
|
+
const slash = upstream.indexOf('/')
|
|
12851
|
+
const remote = slash >= 0 ? upstream.slice(0, slash) : upstream
|
|
12852
|
+
await run('fetch', { remote: remote, branch: item.name + ':' + item.name })
|
|
12853
|
+
}
|
|
12854
|
+
}
|
|
12855
|
+
const railPicked = pickedBranchEntries()
|
|
12856
|
+
const railPickedLocals = railPicked.filter((item) => item.kind === 'local')
|
|
12570
12857
|
|
|
12571
12858
|
/* One descriptor per action, with the availability IDEA would use: delete /
|
|
12572
12859
|
checkout / compare need another local branch, fetch and push need a remote,
|
|
@@ -12576,16 +12863,41 @@ window.__ModuleLoader__.load({
|
|
|
12576
12863
|
const entry = { id: spec.id, icon: spec.icon, tone: spec.tone, label: t(spec.key), disabled: false, active: false, run: () => {} }
|
|
12577
12864
|
if (spec.id === 'refresh') { entry.disabled = refreshSpinning === true; entry.spinning = refreshSpinning === true; entry.run = () => { void refresh({ fetchRemote: true }) } }
|
|
12578
12865
|
else if (spec.id === 'newBranch') entry.run = () => setDialog({ kind: 'newBranch' })
|
|
12579
|
-
else if (spec.id === 'checkout') {
|
|
12580
|
-
|
|
12866
|
+
else if (spec.id === 'checkout') {
|
|
12867
|
+
// Exactly one picked ref → check THAT out directly (same call the
|
|
12868
|
+
// double-click uses); otherwise keep the picker menu.
|
|
12869
|
+
if (railPicked.length === 1) { entry.label = t('toolbar.checkoutPicked'); entry.disabled = blocked; entry.run = () => checkout(railPicked[0].entry) }
|
|
12870
|
+
else { entry.disabled = otherBranches.length === 0 || blocked; entry.run = (event) => pickBranchMenu(event, 'checkout') }
|
|
12871
|
+
}
|
|
12872
|
+
else if (spec.id === 'delete') {
|
|
12873
|
+
if (railPicked.length > 0) { entry.label = fill(t('toolbar.deletePicked'), { n: railPicked.length }); entry.disabled = blocked; entry.run = () => deleteBranchEntries(railPicked) }
|
|
12874
|
+
else { entry.disabled = otherBranches.length === 0; entry.run = (event) => pickBranchMenu(event, 'delete') }
|
|
12875
|
+
}
|
|
12581
12876
|
else if (spec.id === 'compare') { entry.disabled = otherBranches.length === 0; entry.run = (event) => pickBranchMenu(event, 'compare') }
|
|
12582
12877
|
else if (spec.id === 'diff') { entry.disabled = dirty === 0; entry.run = () => showWorkingDiff() }
|
|
12583
12878
|
else if (spec.id === 'stash') { entry.disabled = dirty === 0 && stashCount === 0; entry.run = (event) => stashMenu(event) }
|
|
12584
12879
|
else if (spec.id === 'tag') { entry.disabled = commits.length === 0; entry.run = () => setDialog({ kind: 'newTag' }) }
|
|
12585
|
-
else if (spec.id === 'favorite') {
|
|
12586
|
-
|
|
12587
|
-
|
|
12588
|
-
|
|
12880
|
+
else if (spec.id === 'favorite') {
|
|
12881
|
+
// One picked LOCAL branch stars/unstars THAT branch; with no selection
|
|
12882
|
+
// it keeps starring the current one. Multi-select stays disabled —
|
|
12883
|
+
// favorites are per-branch and the toggle model does not batch well.
|
|
12884
|
+
const target = railPickedLocals.length === 1 ? railPickedLocals[0].name : headBranch
|
|
12885
|
+
entry.disabled = target === ''
|
|
12886
|
+
entry.active = favorites.indexOf(target) >= 0
|
|
12887
|
+
entry.run = () => toggleFavoriteBranch(target)
|
|
12888
|
+
}
|
|
12889
|
+
else if (spec.id === 'fetch') {
|
|
12890
|
+
if (railPicked.length > 0) { entry.label = fill(t('toolbar.fetchPicked'), { n: railPicked.length }); entry.disabled = blocked; entry.run = () => { void fetchPickedRefs(railPicked) } }
|
|
12891
|
+
else { entry.disabled = remoteReady !== true; entry.run = () => { void run('fetch', { prune: true }) } }
|
|
12892
|
+
}
|
|
12893
|
+
else if (spec.id === 'pull') {
|
|
12894
|
+
if (railPickedLocals.length > 0) { entry.label = fill(t('toolbar.pullPicked'), { n: railPickedLocals.length }); entry.disabled = blocked; entry.run = () => { void pullPickedBranches(railPickedLocals) } }
|
|
12895
|
+
else { entry.disabled = remoteReady !== true || tracked !== true || blocked; entry.run = () => { void run('pull', { mode: 'ff-only' }) } }
|
|
12896
|
+
}
|
|
12897
|
+
else if (spec.id === 'push') {
|
|
12898
|
+
if (railPickedLocals.length > 0) { entry.label = fill(t('toolbar.pushPicked'), { n: railPickedLocals.length }); entry.disabled = blocked; entry.run = () => setDialog({ kind: 'pushMany', items: railPickedLocals.map((item) => ({ name: item.name, upstream: item.entry.upstream })) }) }
|
|
12899
|
+
else { entry.disabled = remoteReady !== true || blocked; entry.run = () => setDialog({ kind: 'push' }) }
|
|
12900
|
+
}
|
|
12589
12901
|
else if (spec.id === 'tree') { entry.active = treeOpen; entry.run = () => foldTree(!treeOpen) }
|
|
12590
12902
|
else if (spec.id === 'float') {
|
|
12591
12903
|
// Label AND icon follow where the panel actually is: floating panels get
|
|
@@ -12767,19 +13079,19 @@ window.__ModuleLoader__.load({
|
|
|
12767
13079
|
title: t('toolbar.tree'),
|
|
12768
13080
|
onClick: () => foldTree(!treeOpen),
|
|
12769
13081
|
}, E(Icon, { name: treeOpen ? 'eye' : 'eyeOff' }))),
|
|
12770
|
-
treeOpen ? E('div', { className: 'dig-compact-tree', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues })) : null,
|
|
13082
|
+
treeOpen ? E('div', { className: 'dig-compact-tree', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues, onPicksChange: setBranchPicks })) : null,
|
|
12771
13083
|
treeOpen ? gutter('tree', 'prev') : null,
|
|
12772
13084
|
view === 'changes' ? changesPane : E('div', { className: 'dig-pane dig-pane-main' }, historyPane, diffGutter, diffPane))
|
|
12773
13085
|
} else if (columns) {
|
|
12774
13086
|
body = E('div', { className: 'dig-body dig-body-columns', ref: bodyRef },
|
|
12775
|
-
treeOpen ? E('div', { className: 'dig-pane dig-pane-tree', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues })) : null,
|
|
13087
|
+
treeOpen ? E('div', { className: 'dig-pane dig-pane-tree', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues, onPicksChange: setBranchPicks })) : null,
|
|
12776
13088
|
treeOpen ? gutter('tree', 'prev') : null,
|
|
12777
13089
|
E('div', { className: 'dig-pane dig-pane-main' }, historyPane, diffGutter, diffPane),
|
|
12778
13090
|
gutter('changes', 'next'),
|
|
12779
13091
|
E('div', { className: 'dig-pane dig-pane-changes', 'data-pane': 'changes', style: paneStyle('changes') }, changesPane))
|
|
12780
13092
|
} else {
|
|
12781
13093
|
body = E('div', { className: 'dig-body dig-body-stack', ref: bodyRef },
|
|
12782
|
-
treeOpen ? E('div', { className: 'dig-pane dig-pane-tree-stack', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues })) : null,
|
|
13094
|
+
treeOpen ? E('div', { className: 'dig-pane dig-pane-tree-stack', 'data-pane': 'tree', style: paneStyle('tree') }, E(BranchTree, { t: t, branches: branches, favorites: favorites, onCheckout: checkout, onBranchMenu: branchMenu, onDeleteEntries: deleteBranchEntries, onCopyValues: copyValues, onPicksChange: setBranchPicks })) : null,
|
|
12783
13095
|
treeOpen ? gutter('tree', 'prev') : null,
|
|
12784
13096
|
E('div', { className: 'dig-pane dig-pane-changes-stack', 'data-pane': 'changes', style: paneStyle('changes') }, changesPane),
|
|
12785
13097
|
gutter('changes', 'prev'),
|
|
@@ -13064,6 +13376,25 @@ window.__ModuleLoader__.load({
|
|
|
13064
13376
|
},
|
|
13065
13377
|
}))
|
|
13066
13378
|
}
|
|
13379
|
+
// Batch push of the picked local branches — one confirmation naming every
|
|
13380
|
+
// branch, then a plain `git push origin name` per branch (each sets its
|
|
13381
|
+
// own upstream when it does not track one yet).
|
|
13382
|
+
if (dialog !== null && dialog.kind === 'pushMany') {
|
|
13383
|
+
overlays.push(E(ConfirmDialog, {
|
|
13384
|
+
key: 'pushMany', t: t,
|
|
13385
|
+
title: t('confirm.title'), text: fill(t('push.confirmMany'), { n: dialog.items.length, names: dialog.items.map((item) => item.name).join(', ') }),
|
|
13386
|
+
okLabel: t('confirm.ok'), cancelLabel: t('confirm.cancel'),
|
|
13387
|
+
onCancel: () => setDialog(null),
|
|
13388
|
+
onConfirm: () => {
|
|
13389
|
+
setDialog(null)
|
|
13390
|
+
void (async () => {
|
|
13391
|
+
for (const item of dialog.items) {
|
|
13392
|
+
await run('push', { branch: item.name, confirm: true, setUpstream: item.upstream === null || item.upstream === undefined })
|
|
13393
|
+
}
|
|
13394
|
+
})()
|
|
13395
|
+
},
|
|
13396
|
+
}))
|
|
13397
|
+
}
|
|
13067
13398
|
|
|
13068
13399
|
// Wide chromes (the bottom workbench) get the vertical IDE rail on the left;
|
|
13069
13400
|
// narrow ones (the native right sidebar) get the same actions as one
|
|
@@ -13299,7 +13630,7 @@ window.__ModuleLoader__.load({
|
|
|
13299
13630
|
'.dig-section-toggle{display:flex;align-items:center;gap:4px;flex:1;min-width:0;padding:0;border:none;background:transparent;color:inherit;font:inherit;font-weight:600;cursor:pointer;text-align:left}',
|
|
13300
13631
|
'.dig-folder{display:flex;flex-direction:column}',
|
|
13301
13632
|
'.dig-branch-folder{display:flex;flex-direction:column}',
|
|
13302
|
-
'.dig-row-picked{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary)}',
|
|
13633
|
+
'.dig-row-picked{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary);box-shadow:inset 2px 0 0 var(--dsw-alias-brand-primary)}',
|
|
13303
13634
|
'.dig-folder-head{display:flex;align-items:center;gap:6px;width:100%;padding:1px 8px 1px 4px;height:14px;border:none;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:11px;cursor:pointer;text-align:left}',
|
|
13304
13635
|
'.dig-folder-head:hover{color:var(--dsw-alias-label-primary)}',
|
|
13305
13636
|
'.dig-folder-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',
|
|
@@ -13309,7 +13640,7 @@ window.__ModuleLoader__.load({
|
|
|
13309
13640
|
'.dig-row{display:flex;align-items:center;gap:5px;padding:2px 8px;cursor:pointer;white-space:nowrap;overflow:hidden}',
|
|
13310
13641
|
'.dig-row:hover{background:var(--dsw-alias-interactive-bg-hover)}',
|
|
13311
13642
|
'.dig-row-head{color:var(--dsw-alias-state-warn-primary,var(--dsw-alias-brand-primary))}',
|
|
13312
|
-
'.dig-row-selected{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary)}',
|
|
13643
|
+
'.dig-row-selected{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary);box-shadow:inset 2px 0 0 var(--dsw-alias-brand-primary)}',
|
|
13313
13644
|
'.dig-row-remote .dig-row-label{color:var(--dsw-alias-label-secondary);font-weight:500}',
|
|
13314
13645
|
'.dig-row-tag .dig-row-label{color:var(--dsw-alias-state-warn-primary,var(--dsw-alias-brand-primary));font-weight:500}',
|
|
13315
13646
|
'.dig-row-head .dig-row-label{font-weight:600}',
|
|
@@ -13330,7 +13661,15 @@ window.__ModuleLoader__.load({
|
|
|
13330
13661
|
'.dig-history-scroll{flex:1;overflow:auto}',
|
|
13331
13662
|
'.dig-commit{display:flex;align-items:center;gap:6px;padding:1px 8px 1px 0;cursor:pointer;height:26px;overflow:hidden}',
|
|
13332
13663
|
'.dig-commit:hover{background:var(--dsw-alias-interactive-bg-hover)}',
|
|
13333
|
-
'.dig-commit-selected{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover))}',
|
|
13664
|
+
'.dig-commit-selected{background:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));color:var(--dsw-alias-label-primary);box-shadow:inset 2px 0 0 var(--dsw-alias-brand-primary)}',
|
|
13665
|
+
// A favorited branch renders its star SOLID (BranchRow adds this class
|
|
13666
|
+
// and flips the tone to warn) — the hollow green HEAD star read as
|
|
13667
|
+
// "not favorited" (v0.18.5).
|
|
13668
|
+
'.dig-star-filled svg path{fill:currentColor}',
|
|
13669
|
+
// Rows nested under a dir-group folder head are indented and drop the
|
|
13670
|
+
// trailing directory repeat, so the grouping reads as a tree.
|
|
13671
|
+
/* Nested rows indent inline (26px base + 12px per tree depth) — the CSS
|
|
13672
|
+
class only marks them for tests/probes. */
|
|
13334
13673
|
'.dig-graph{flex:none}',
|
|
13335
13674
|
'.dig-commit-date{color:var(--dsw-alias-label-tertiary);flex:none;width:54px;font-variant-numeric:tabular-nums;font-weight:500}',
|
|
13336
13675
|
'.dig-commit-author{color:var(--dsw-alias-label-secondary);flex:none;width:96px;overflow:hidden;text-overflow:ellipsis;font-weight:500}',
|
package/src/index.js
CHANGED
|
@@ -1130,9 +1130,16 @@ async function fetch(payload) {
|
|
|
1130
1130
|
const root = await repoRootOf(cwd, payload)
|
|
1131
1131
|
const args = ['fetch']
|
|
1132
1132
|
if (typeof payload.remote === 'string' && payload.remote.trim() !== '') args.push(requireRef(payload.remote, 'remote'))
|
|
1133
|
+
// A refspec (`main:main`) fast-forwards a NON-checked-out branch in place —
|
|
1134
|
+
// this is how "pull a branch that is not HEAD" works without switching to
|
|
1135
|
+
// it (git pull would merge into HEAD instead). git refuses a non-ff update
|
|
1136
|
+
// here, which is exactly the safety we want.
|
|
1137
|
+
if (typeof payload.branch === 'string' && payload.branch.trim() !== '') args.push(requireRef(payload.branch, 'refspec'))
|
|
1133
1138
|
if (payload.all === true) args.push('--all')
|
|
1134
|
-
|
|
1135
|
-
|
|
1139
|
+
// prune/--tags serve the repo-wide fetch; a refspec fetch is deliberately
|
|
1140
|
+
// narrow and must not drag every tag over the wire.
|
|
1141
|
+
if (payload.branch === undefined && payload.prune !== false) args.push('--prune')
|
|
1142
|
+
if (payload.branch === undefined) args.push('--tags')
|
|
1136
1143
|
const out = await git(root, args, { timeoutMs: NETWORK_TIMEOUT_MS })
|
|
1137
1144
|
return { output: (out + '\n').trim() }
|
|
1138
1145
|
}
|