Skip to content

Commit caf746c

Browse files
committed
feat: add "fetch all repositories" action in workspace menu
1 parent a4f3fa7 commit caf746c

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
@@ -1051,6 +1051,7 @@
10511051
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">Template: ${0}$</x:String>
10521052
<x:String x:Key="Text.Workspace" xml:space="preserve">WORKSPACE: </x:String>
10531053
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">Configure Workspaces...</x:String>
1054+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">Fetch All Repositories</x:String>
10541055
<x:String x:Key="Text.Worktree" xml:space="preserve">WORKTREE</x:String>
10551056
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">BRANCH</x:String>
10561057
<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
@@ -1055,6 +1055,7 @@
10551055
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">模板:${0}$</x:String>
10561056
<x:String x:Key="Text.Workspace" xml:space="preserve">工作区:</x:String>
10571057
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">配置工作区...</x:String>
1058+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">拉取工作区所有仓库</x:String>
10581059
<x:String x:Key="Text.Worktree" xml:space="preserve">本地工作树</x:String>
10591060
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">連結分支</x:String>
10601061
<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
@@ -1039,6 +1039,7 @@
10391039
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">範本: ${0}$</x:String>
10401040
<x:String x:Key="Text.Workspace" xml:space="preserve">工作區: </x:String>
10411041
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">設定工作區...</x:String>
1042+
<x:String x:Key="Text.Workspace.FetchAllRepositories" xml:space="preserve">提取工作區所有存放庫</x:String>
10421043
<x:String x:Key="Text.Worktree" xml:space="preserve">本機工作樹</x:String>
10431044
<x:String x:Key="Text.Worktree.Branch" xml:space="preserve">分支</x:String>
10441045
<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
@@ -697,6 +697,40 @@ public async Task FetchAsync(bool autoStart)
697697
ShowPopup(new Fetch(this));
698698
}
699699

700+
public async Task<bool> FetchAllRemotesAsync()
701+
{
702+
if (IsAutoFetching)
703+
return false;
704+
705+
CommandLog log = null;
706+
707+
try
708+
{
709+
var lockFile = Path.Combine(GitDir, "index.lock");
710+
if (File.Exists(lockFile))
711+
return false;
712+
713+
if (_remotes.Count == 0)
714+
return false;
715+
716+
IsAutoFetching = true;
717+
log = CreateLog("Fetch");
718+
719+
foreach (var remote in _remotes)
720+
await new Commands.Fetch(FullPath, remote.Name).Use(log).RunAsync();
721+
722+
_lastFetchTime = DateTime.Now;
723+
}
724+
catch
725+
{
726+
// Ignore all exceptions.
727+
}
728+
729+
IsAutoFetching = false;
730+
log?.Complete();
731+
return true;
732+
}
733+
700734
public async Task PullAsync(bool autoStart)
701735
{
702736
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;
@@ -409,6 +410,19 @@ private void OnOpenWorkspaceMenu(object sender, RoutedEventArgs e)
409410

410411
menu.Items.Add(new MenuItem() { Header = "-" });
411412

413+
var hasRepos = launcher.Pages.Any(p => p.Data is ViewModels.Repository);
414+
415+
var fetchAll = new MenuItem();
416+
fetchAll.Header = App.Text("Workspace.FetchAllRepositories");
417+
fetchAll.Icon = this.CreateMenuIcon("Icons.Fetch");
418+
fetchAll.IsEnabled = hasRepos;
419+
fetchAll.Click += async (_, ev) =>
420+
{
421+
await launcher.FetchAllRepositoriesAsync();
422+
ev.Handled = true;
423+
};
424+
menu.Items.Add(fetchAll);
425+
412426
var configure = new MenuItem();
413427
configure.Header = App.Text("Workspace.Configure");
414428
configure.Click += async (_, ev) =>

0 commit comments

Comments
 (0)