Skip to content

Commit 5687265

Browse files
committed
feature: supports git submodule set-url -- <path> <new_url> (#1506)
Signed-off-by: leo <[email protected]>
1 parent cdb84c7 commit 5687265

File tree

8 files changed

+147
-11
lines changed

8 files changed

+147
-11
lines changed

src/Commands/Submodule.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ public async Task<bool> AddAsync(string url, string relativePath, bool recursive
3232
}
3333
}
3434

35+
public async Task<bool> SetURL(string path, string url)
36+
{
37+
Args = $"submodule set-url -- \"{path}\" \"{url}\"";
38+
return await ExecAsync().ConfigureAwait(false);
39+
}
40+
3541
public async Task<bool> UpdateAsync(List<string> modules, bool init, bool recursive, bool useRemote = false)
3642
{
3743
var builder = new StringBuilder();

src/Resources/Locales/en_US.axaml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@
8080
<x:String x:Key="Text.ChangeDisplayMode.Grid" xml:space="preserve">Show as File and Dir List</x:String>
8181
<x:String x:Key="Text.ChangeDisplayMode.List" xml:space="preserve">Show as Path List</x:String>
8282
<x:String x:Key="Text.ChangeDisplayMode.Tree" xml:space="preserve">Show as Filesystem Tree</x:String>
83+
<x:String x:Key="Text.ChangeSubmoduleUrl" xml:space="preserve">Change Submodule's URL</x:String>
84+
<x:String x:Key="Text.ChangeSubmoduleUrl.Submodule" xml:space="preserve">Submodule:</x:String>
85+
<x:String x:Key="Text.ChangeSubmoduleUrl.URL" xml:space="preserve">URL:</x:String>
8386
<x:String x:Key="Text.Checkout" xml:space="preserve">Checkout Branch</x:String>
8487
<x:String x:Key="Text.Checkout.Commit" xml:space="preserve">Checkout Commit</x:String>
8588
<x:String x:Key="Text.Checkout.Commit.Target" xml:space="preserve">Commit:</x:String>
@@ -741,19 +744,20 @@
741744
<x:String x:Key="Text.Submodule" xml:space="preserve">SUBMODULES</x:String>
742745
<x:String x:Key="Text.Submodule.Add" xml:space="preserve">Add Submodule</x:String>
743746
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">Copy Relative Path</x:String>
744-
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">De-initialize Submodule</x:String>
747+
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">De-initialize</x:String>
745748
<x:String x:Key="Text.Submodule.FetchNested" xml:space="preserve">Fetch nested submodules</x:String>
746-
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">Move Submodule</x:String>
747-
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">Open Submodule Repository</x:String>
749+
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">Move To</x:String>
750+
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">Open Repository</x:String>
748751
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">Relative Path:</x:String>
749752
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">Relative folder to store this module.</x:String>
750-
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">Delete Submodule</x:String>
753+
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">Delete</x:String>
754+
<x:String x:Key="Text.Submodule.SetURL" xml:space="preserve">Change URL</x:String>
751755
<x:String x:Key="Text.Submodule.Status" xml:space="preserve">STATUS</x:String>
752756
<x:String x:Key="Text.Submodule.Status.Modified" xml:space="preserve">modified</x:String>
753757
<x:String x:Key="Text.Submodule.Status.NotInited" xml:space="preserve">not initialized</x:String>
754758
<x:String x:Key="Text.Submodule.Status.RevisionChanged" xml:space="preserve">revision changed</x:String>
755759
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">unmerged</x:String>
756-
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">Update Submodule</x:String>
760+
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">Update</x:String>
757761
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">URL</x:String>
758762
<x:String x:Key="Text.Sure" xml:space="preserve">OK</x:String>
759763
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">Copy Tag Name</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@
8484
<x:String x:Key="Text.ChangeDisplayMode.Grid" xml:space="preserve">文件名+路径列表模式</x:String>
8585
<x:String x:Key="Text.ChangeDisplayMode.List" xml:space="preserve">全路径列表模式</x:String>
8686
<x:String x:Key="Text.ChangeDisplayMode.Tree" xml:space="preserve">文件目录树形结构模式</x:String>
87+
<x:String x:Key="Text.ChangeSubmoduleUrl" xml:space="preserve">修改子模块远程地址</x:String>
88+
<x:String x:Key="Text.ChangeSubmoduleUrl.Submodule" xml:space="preserve">子模块 :</x:String>
89+
<x:String x:Key="Text.ChangeSubmoduleUrl.URL" xml:space="preserve">远程地址 :</x:String>
8790
<x:String x:Key="Text.Checkout" xml:space="preserve">检出(checkout)分支</x:String>
8891
<x:String x:Key="Text.Checkout.Commit" xml:space="preserve">检出(checkout)提交</x:String>
8992
<x:String x:Key="Text.Checkout.Commit.Target" xml:space="preserve">提交 :</x:String>
@@ -747,17 +750,18 @@
747750
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">复制路径</x:String>
748751
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">取消初始化</x:String>
749752
<x:String x:Key="Text.Submodule.FetchNested" xml:space="preserve">拉取子孙模块</x:String>
750-
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">移动子模块</x:String>
753+
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">移动</x:String>
751754
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">打开仓库</x:String>
752755
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">相对仓库路径 :</x:String>
753756
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">本地存放的相对路径。</x:String>
754-
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">删除子模块</x:String>
757+
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">删除</x:String>
758+
<x:String x:Key="Text.Submodule.SetURL" xml:space="preserve">修改远程地址</x:String>
755759
<x:String x:Key="Text.Submodule.Status" xml:space="preserve">状态</x:String>
756760
<x:String x:Key="Text.Submodule.Status.Modified" xml:space="preserve">未提交修改</x:String>
757761
<x:String x:Key="Text.Submodule.Status.NotInited" xml:space="preserve">未初始化</x:String>
758762
<x:String x:Key="Text.Submodule.Status.RevisionChanged" xml:space="preserve">SHA变更</x:String>
759763
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">未解决冲突</x:String>
760-
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新子模块</x:String>
764+
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
761765
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">仓库</x:String>
762766
<x:String x:Key="Text.Sure" xml:space="preserve">确 定</x:String>
763767
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">复制标签名</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@
8484
<x:String x:Key="Text.ChangeDisplayMode.Grid" xml:space="preserve">檔案名稱 + 路徑列表模式</x:String>
8585
<x:String x:Key="Text.ChangeDisplayMode.List" xml:space="preserve">全路徑列表模式</x:String>
8686
<x:String x:Key="Text.ChangeDisplayMode.Tree" xml:space="preserve">檔案目錄樹狀結構模式</x:String>
87+
<x:String x:Key="Text.ChangeSubmoduleUrl" xml:space="preserve">修改子模組的遠端網址</x:String>
88+
<x:String x:Key="Text.ChangeSubmoduleUrl.Submodule" xml:space="preserve">子模組:</x:String>
89+
<x:String x:Key="Text.ChangeSubmoduleUrl.URL" xml:space="preserve">遠端網址:</x:String>
8790
<x:String x:Key="Text.Checkout" xml:space="preserve">簽出 (checkout) 分支</x:String>
8891
<x:String x:Key="Text.Checkout.Commit" xml:space="preserve">簽出 (checkout) 提交</x:String>
8992
<x:String x:Key="Text.Checkout.Commit.Target" xml:space="preserve">提交:</x:String>
@@ -747,17 +750,18 @@
747750
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">複製路徑</x:String>
748751
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">取消初始化</x:String>
749752
<x:String x:Key="Text.Submodule.FetchNested" xml:space="preserve">提取子模組</x:String>
750-
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">移動子模組</x:String>
753+
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">移動</x:String>
751754
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">開啟存放庫</x:String>
752755
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">相對存放庫路徑:</x:String>
753756
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">本機存放的相對路徑。</x:String>
754-
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">刪除子模組</x:String>
757+
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">刪除</x:String>
758+
<x:String x:Key="Text.Submodule.SetURL" xml:space="preserve">更改遠端網址</x:String>
755759
<x:String x:Key="Text.Submodule.Status" xml:space="preserve">狀態</x:String>
756760
<x:String x:Key="Text.Submodule.Status.Modified" xml:space="preserve">未提交變更</x:String>
757761
<x:String x:Key="Text.Submodule.Status.NotInited" xml:space="preserve">未初始化</x:String>
758762
<x:String x:Key="Text.Submodule.Status.RevisionChanged" xml:space="preserve">SHA 變更</x:String>
759763
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">未解決的衝突</x:String>
760-
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新子模組</x:String>
764+
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
761765
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">存放庫</x:String>
762766
<x:String x:Key="Text.Sure" xml:space="preserve">確 定</x:String>
763767
<x:String x:Key="Text.TagCM.Copy" xml:space="preserve">複製標籤名稱</x:String>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
using System.Threading.Tasks;
4+
5+
namespace SourceGit.ViewModels
6+
{
7+
public class ChangeSubmoduleUrl : Popup
8+
{
9+
public Models.Submodule Submodule
10+
{
11+
get;
12+
}
13+
14+
[Required(ErrorMessage = "Url is required!!!")]
15+
[CustomValidation(typeof(ChangeSubmoduleUrl), nameof(ValidateUrl))]
16+
public string Url
17+
{
18+
get => _url;
19+
set => SetProperty(ref _url, value, true);
20+
}
21+
22+
public ChangeSubmoduleUrl(Repository repo, Models.Submodule submodule)
23+
{
24+
_repo = repo;
25+
_url = submodule.URL;
26+
Submodule = submodule;
27+
}
28+
29+
public static ValidationResult ValidateUrl(string url, ValidationContext ctx)
30+
{
31+
if (!Models.Remote.IsValidURL(url))
32+
return new ValidationResult("Invalid repository URL format");
33+
34+
return ValidationResult.Success;
35+
}
36+
37+
public override async Task<bool> Sure()
38+
{
39+
if (_url.Equals(Submodule.URL, StringComparison.Ordinal))
40+
return true;
41+
42+
_repo.SetWatcherEnabled(false);
43+
ProgressDescription = "Change submodule's url...";
44+
45+
var log = _repo.CreateLog("Change Submodule's URL");
46+
Use(log);
47+
48+
var succ = await new Commands.Submodule(_repo.FullPath)
49+
.Use(log)
50+
.SetURL(Submodule.Path, _url);
51+
52+
log.Complete();
53+
_repo.SetWatcherEnabled(true);
54+
return succ;
55+
}
56+
57+
private readonly Repository _repo;
58+
private string _url;
59+
}
60+
}

src/ViewModels/Repository.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2576,6 +2576,16 @@ public ContextMenu CreateContextMenuForSubmodule(Models.Submodule submodule)
25762576
ev.Handled = true;
25772577
};
25782578

2579+
var setURL = new MenuItem();
2580+
setURL.Header = App.Text("Submodule.SetURL");
2581+
setURL.Icon = App.CreateMenuIcon("Icons.Edit");
2582+
setURL.Click += (_, ev) =>
2583+
{
2584+
if (CanCreatePopup())
2585+
ShowPopup(new ChangeSubmoduleUrl(this, submodule));
2586+
ev.Handled = true;
2587+
};
2588+
25792589
var deinit = new MenuItem();
25802590
deinit.Header = App.Text("Submodule.Deinit");
25812591
deinit.Icon = App.CreateMenuIcon("Icons.Undo");
@@ -2610,6 +2620,7 @@ public ContextMenu CreateContextMenuForSubmodule(Models.Submodule submodule)
26102620
menu.Items.Add(open);
26112621
menu.Items.Add(new MenuItem() { Header = "-" });
26122622
menu.Items.Add(update);
2623+
menu.Items.Add(setURL);
26132624
menu.Items.Add(move);
26142625
menu.Items.Add(deinit);
26152626
menu.Items.Add(rm);

src/Views/ChangeSubmoduleUrl.axaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<UserControl xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:vm="using:SourceGit.ViewModels"
6+
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
7+
x:Class="SourceGit.Views.ChangeSubmoduleUrl"
8+
x:DataType="vm:ChangeSubmoduleUrl">
9+
<StackPanel Orientation="Vertical" Margin="8,0">
10+
<TextBlock FontSize="18"
11+
Classes="bold"
12+
Text="{DynamicResource Text.ChangeSubmoduleUrl}"/>
13+
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
14+
<TextBlock Grid.Row="0" Grid.Column="0"
15+
HorizontalAlignment="Right" VerticalAlignment="Center"
16+
Margin="0,0,8,0"
17+
Text="{DynamicResource Text.ChangeSubmoduleUrl.Submodule}"/>
18+
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal">
19+
<Path Width="14" Height="14" Data="{StaticResource Icons.Submodule}"/>
20+
<TextBlock Margin="6,0,0,0" Text="{Binding Submodule.Path}"/>
21+
</StackPanel>
22+
23+
<TextBlock Grid.Row="1" Grid.Column="0"
24+
HorizontalAlignment="Right" VerticalAlignment="Center"
25+
Margin="0,0,8,0"
26+
Text="{DynamicResource Text.ChangeSubmoduleUrl.URL}"/>
27+
<TextBox Grid.Row="1" Grid.Column="1"
28+
Height="26"
29+
VerticalAlignment="Center"
30+
CornerRadius="2"
31+
Watermark="{DynamicResource Text.RepositoryURL}"
32+
Text="{Binding Url, Mode=TwoWay}"/>
33+
</Grid>
34+
</StackPanel>
35+
</UserControl>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Avalonia.Controls;
2+
3+
namespace SourceGit.Views
4+
{
5+
public partial class ChangeSubmoduleUrl : UserControl
6+
{
7+
public ChangeSubmoduleUrl()
8+
{
9+
InitializeComponent();
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)