Skip to content

Commit 035930b

Browse files
committed
feat: add "fetch all repositories" action in workspace menu
1 parent 7f1688b commit 035930b

6 files changed

Lines changed: 73 additions & 0 deletions

File tree

‎src/Resources/Locales/en_US.axaml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,7 @@
10231023
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">Template: ${0}$</x:String>
10241024
<x:String x:Key="Text.Workspace" xml:space="preserve">WORKSPACE: </x:String>
10251025
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">Configure Workspaces...</x:String>
1026+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">Fetch All Repositories</x:String>
10261027
<x:String x:Key="Text.Worktree" xml:space="preserve">WORKTREE</x:String>
10271028
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">BRANCH</x:String>
10281029
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">Copy Path</x:String>

‎src/Resources/Locales/zh_CN.axaml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,7 @@
10271027
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">模板:${0}$</x:String>
10281028
<x:String x:Key="Text.Workspace" xml:space="preserve">工作区:</x:String>
10291029
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">配置工作区...</x:String>
1030+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">拉取工作区所有仓库</x:String>
10301031
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作树</x:String>
10311032
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">連結分支</x:String>
10321033
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">复制工作树路径</x:String>

‎src/Resources/Locales/zh_TW.axaml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,7 @@
10271027
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">範本: ${0}$</x:String>
10281028
<x:String x:Key="Text.Workspace" xml:space="preserve">工作區: </x:String>
10291029
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">設定工作區...</x:String>
1030+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">提取工作區所有存放庫</x:String>
10301031
<x:String x:Key="Text.Worktree" xml:space="preserve">本機工作區</x:String>
10311032
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">分支</x:String>
10321033
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">複製工作區路徑</x:String>

‎src/ViewModels/Launcher.cs‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.Text;
5+
using System.Threading.Tasks;
46

57
using Avalonia.Collections;
68
using Avalonia.Threading;
@@ -116,6 +118,26 @@ public void CloseAll()
116118
_ignoreIndexChange = false;
117119
}
118120

121+
public async Task FetchAllRepositoriesAsync()
122+
{
123+
// avoid collection was modified while enumerating.
124+
var pages = new List<LauncherPage>();
125+
pages.AddRange(Pages);
126+
127+
var count = 0;
128+
foreach (var page in pages)
129+
{
130+
if (page.Data is Repository repo)
131+
{
132+
if (await repo.FetchAllRemotesAsync())
133+
count++;
134+
}
135+
}
136+
137+
if (count > 0)
138+
Models.Notification.Send(null, $"Fetched {count} repositories");
139+
}
140+
119141
public void SwitchWorkspace(Workspace to)
120142
{
121143
if (to == null || to.IsActive)

‎src/ViewModels/Repository.cs‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,40 @@ public async Task FetchAsync(bool autoStart)
675675
ShowPopup(new Fetch(this));
676676
}
677677

678+
public async Task<bool> FetchAllRemotesAsync()
679+
{
680+
if (IsAutoFetching)
681+
return false;
682+
683+
CommandLog log = null;
684+
685+
try
686+
{
687+
var lockFile = Path.Combine(GitDir, "index.lock");
688+
if (File.Exists(lockFile))
689+
return false;
690+
691+
if (_remotes.Count == 0)
692+
return false;
693+
694+
IsAutoFetching = true;
695+
log = CreateLog("Fetch");
696+
697+
foreach (var remote in _remotes)
698+
await new Commands.Fetch(FullPath, remote.Name).Use(log).RunAsync();
699+
700+
_lastFetchTime = DateTime.Now;
701+
}
702+
catch
703+
{
704+
// Ignore all exceptions.
705+
}
706+
707+
IsAutoFetching = false;
708+
log?.Complete();
709+
return true;
710+
}
711+
678712
public async Task PullAsync(bool autoStart)
679713
{
680714
if (IsBare || !CanCreatePopup())

‎src/Views/Launcher.axaml.cs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23

34
using Avalonia;
45
using Avalonia.Controls;
@@ -395,6 +396,19 @@ private void OnOpenWorkspaceMenu(object sender, RoutedEventArgs e)
395396

396397
menu.Items.Add(new MenuItem() { Header = "-" });
397398

399+
var hasRepos = launcher.Pages.Any(p => p.Data is ViewModels.Repository);
400+
401+
var fetchAll = new MenuItem();
402+
fetchAll.Header = App.Text("Workspace.FetchAllRepositories");
403+
fetchAll.Icon = this.CreateMenuIcon("Icons.Fetch");
404+
fetchAll.IsEnabled = hasRepos;
405+
fetchAll.Click += async (_, ev) =>
406+
{
407+
await launcher.FetchAllRepositoriesAsync();
408+
ev.Handled = true;
409+
};
410+
menu.Items.Add(fetchAll);
411+
398412
var configure = new MenuItem();
399413
configure.Header = App.Text("Workspace.Configure");
400414
configure.Click += async (_, ev) =>

0 commit comments

Comments
 (0)