Skip to content

Commit be8a38c

Browse files
committed
feat: add "fetch all repositories" action in workspace menu
1 parent 6f670b1 commit be8a38c

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
@@ -1025,6 +1025,7 @@
10251025
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">Template: ${0}$</x:String>
10261026
<x:String x:Key="Text.Workspace" xml:space="preserve">WORKSPACE: </x:String>
10271027
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">Configure Workspaces...</x:String>
1028+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">Fetch All Repositories</x:String>
10281029
<x:String x:Key="Text.Worktree" xml:space="preserve">WORKTREE</x:String>
10291030
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">BRANCH</x:String>
10301031
<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
@@ -1029,6 +1029,7 @@
10291029
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">模板:${0}$</x:String>
10301030
<x:String x:Key="Text.Workspace" xml:space="preserve">工作区:</x:String>
10311031
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">配置工作区...</x:String>
1032+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">拉取工作区所有仓库</x:String>
10321033
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作树</x:String>
10331034
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">連結分支</x:String>
10341035
<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
@@ -1029,6 +1029,7 @@
10291029
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">範本: ${0}$</x:String>
10301030
<x:String x:Key="Text.Workspace" xml:space="preserve">工作區: </x:String>
10311031
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">設定工作區...</x:String>
1032+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">提取工作區所有存放庫</x:String>
10321033
<x:String x:Key="Text.Worktree" xml:space="preserve">本機工作區</x:String>
10331034
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">分支</x:String>
10341035
<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;
@@ -122,6 +124,26 @@ public void CloseAll()
122124
_ignoreIndexChange = false;
123125
}
124126

127+
public async Task FetchAllRepositoriesAsync()
128+
{
129+
// avoid collection was modified while enumerating.
130+
var pages = new List<LauncherPage>();
131+
pages.AddRange(Pages);
132+
133+
var count = 0;
134+
foreach (var page in pages)
135+
{
136+
if (page.Data is Repository repo)
137+
{
138+
if (await repo.FetchAllRemotesAsync())
139+
count++;
140+
}
141+
}
142+
143+
if (count > 0)
144+
Models.Notification.Send(null, $"Fetched {count} repositories");
145+
}
146+
125147
public void SwitchWorkspace(Workspace to)
126148
{
127149
if (to == null || to.IsActive)

src/ViewModels/Repository.cs

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

691+
public async Task<bool> FetchAllRemotesAsync()
692+
{
693+
if (IsAutoFetching)
694+
return false;
695+
696+
CommandLog log = null;
697+
698+
try
699+
{
700+
var lockFile = Path.Combine(GitDir, "index.lock");
701+
if (File.Exists(lockFile))
702+
return false;
703+
704+
if (_remotes.Count == 0)
705+
return false;
706+
707+
IsAutoFetching = true;
708+
log = CreateLog("Fetch");
709+
710+
foreach (var remote in _remotes)
711+
await new Commands.Fetch(FullPath, remote.Name).Use(log).RunAsync();
712+
713+
_lastFetchTime = DateTime.Now;
714+
}
715+
catch
716+
{
717+
// Ignore all exceptions.
718+
}
719+
720+
IsAutoFetching = false;
721+
log?.Complete();
722+
return true;
723+
}
724+
691725
public async Task PullAsync(bool autoStart)
692726
{
693727
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)