Skip to content

Commit 56a9447

Browse files
committed
feature: supports to move selected submodule (#1507)
Signed-off-by: leo <[email protected]>
1 parent 6290378 commit 56a9447

File tree

10 files changed

+150
-2
lines changed

10 files changed

+150
-2
lines changed

src/Commands/Move.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Text;
2+
3+
namespace SourceGit.Commands
4+
{
5+
public class Move : Command
6+
{
7+
public Move(string repo, string oldPath, string newPath, bool force)
8+
{
9+
WorkingDirectory = repo;
10+
Context = repo;
11+
12+
var builder = new StringBuilder();
13+
builder.Append("mv -v ");
14+
if (force)
15+
builder.Append("-f ");
16+
builder.Append('"');
17+
builder.Append(oldPath);
18+
builder.Append("\" \"");
19+
builder.Append(newPath);
20+
builder.Append('"');
21+
22+
Args = builder.ToString();
23+
}
24+
}
25+
}

src/Resources/Icons.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<StreamGeometry x:Key="Icons.Modified">M896 64H128C96 64 64 96 64 128v768c0 32 32 64 64 64h768c32 0 64-32 64-64V128c0-32-32-64-64-64z m-64 736c0 16-17 32-32 32H224c-18 0-32-12-32-32V224c0-16 16-32 32-32h576c15 0 32 16 32 32v576zM512 384c-71 0-128 57-128 128s57 128 128 128 128-57 128-128-57-128-128-128z</StreamGeometry>
9090
<StreamGeometry x:Key="Icons.More">M0 512M1024 512M512 0M512 1024M813 448c-46 0-83 37-83 83 0 46 37 83 83 83 46 0 83-37 83-83 0-46-37-83-83-83zM211 448C165 448 128 485 128 531c0 46 37 83 83 83 46 0 83-37 83-83 0-46-37-83-83-83zM512 448c-46 0-83 37-83 83 0 46 37 83 83 83 46 0 83-37 83-83C595 485 558 448 512 448z</StreamGeometry>
9191
<StreamGeometry x:Key="Icons.Move">M299 811 299 725 384 725 384 811 299 811M469 811 469 725 555 725 555 811 469 811M640 811 640 725 725 725 725 811 640 811M299 640 299 555 384 555 384 640 299 640M469 640 469 555 555 555 555 640 469 640M640 640 640 555 725 555 725 640 640 640M299 469 299 384 384 384 384 469 299 469M469 469 469 384 555 384 555 469 469 469M640 469 640 384 725 384 725 469 640 469M299 299 299 213 384 213 384 299 299 299M469 299 469 213 555 213 555 299 469 299M640 299 640 213 725 213 725 299 640 299Z</StreamGeometry>
92-
<StreamGeometry x:Key="Icons.MoveToAnotherGroup">M64 363l0 204 265 0L329 460c0-11 6-18 14-20C349 437 355 437 362 441c93 60 226 149 226 149 33 22 34 60 0 82 0 0-133 89-226 149-14 9-32-3-32-18l-1-110L64 693l0 117c0 41 34 75 75 75l746 0c41 0 75-34 75-74L960 364c0-0 0-1 0-1L64 363zM64 214l0 75 650 0-33-80c-16-38-62-69-103-69l-440 0C97 139 64 173 64 214z</StreamGeometry>
92+
<StreamGeometry x:Key="Icons.MoveTo">M64 363l0 204 265 0L329 460c0-11 6-18 14-20C349 437 355 437 362 441c93 60 226 149 226 149 33 22 34 60 0 82 0 0-133 89-226 149-14 9-32-3-32-18l-1-110L64 693l0 117c0 41 34 75 75 75l746 0c41 0 75-34 75-74L960 364c0-0 0-1 0-1L64 363zM64 214l0 75 650 0-33-80c-16-38-62-69-103-69l-440 0C97 139 64 173 64 214z</StreamGeometry>
9393
<StreamGeometry x:Key="Icons.OpenWith">M683 409v204L1024 308 683 0v191c-413 0-427 526-427 526c117-229 203-307 427-307zm85 492H102V327h153s38-63 114-122H51c-28 0-51 27-51 61v697c0 34 23 61 51 61h768c28 0 51-27 51-61V614l-102 100v187z</StreamGeometry>
9494
<StreamGeometry x:Key="Icons.OrderByName">M841 627A43 43 0 00811 555h-299v85h196l-183 183A43 43 0 00555 896h299v-85h-196l183-183zM299 170H213v512H85l171 171 171-171H299zM725 128h-85c-18 0-34 11-40 28l-117 313h91L606 384h154l32 85h91l-117-313A43 43 0 00725 128zm-88 171 32-85h26l32 85h-90z</StreamGeometry>
9595
<StreamGeometry x:Key="Icons.OrderByTime">M512 0a512 512 0 01512 512 57 57 0 01-114 0 398 398 0 10-398 398 57 57 0 010 114A512 512 0 01512 0zm367 600 121 120a57 57 0 01-80 81l-40-40V967a57 57 0 01-50 57l-7 0a57 57 0 01-57-57v-205l-40 40a57 57 0 01-75 5l-5-5a57 57 0 01-0-80l120-121a80 80 0 01113-0zM512 272a57 57 0 0157 57V499h114a57 57 0 0156 50L740 556a57 57 0 01-57 57H512a57 57 0 01-57-57v-228a57 57 0 0150-57L512 272z</StreamGeometry>

src/Resources/Locales/en_US.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,9 @@
470470
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">Commit all changes</x:String>
471471
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">Strategy:</x:String>
472472
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">Targets:</x:String>
473+
<x:String x:Key="Text.MoveSubmodule" xml:space="preserve">Move Submodule</x:String>
474+
<x:String x:Key="Text.MoveSubmodule.MoveTo" xml:space="preserve">Move To:</x:String>
475+
<x:String x:Key="Text.MoveSubmodule.Submodule" xml:space="preserve">Submodule:</x:String>
473476
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">Move Repository Node</x:String>
474477
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">Select parent node for:</x:String>
475478
<x:String x:Key="Text.Name" xml:space="preserve">Name:</x:String>
@@ -740,6 +743,7 @@
740743
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">Copy Relative Path</x:String>
741744
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">De-initialize Submodule</x:String>
742745
<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>
743747
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">Open Submodule Repository</x:String>
744748
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">Relative Path:</x:String>
745749
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">Relative folder to store this module.</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,9 @@
474474
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">提交变化</x:String>
475475
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">合并策略 :</x:String>
476476
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">目标列表 :</x:String>
477+
<x:String x:Key="Text.MoveSubmodule" xml:space="preserve">移动子模块</x:String>
478+
<x:String x:Key="Text.MoveSubmodule.MoveTo" xml:space="preserve">移动到 :</x:String>
479+
<x:String x:Key="Text.MoveSubmodule.Submodule" xml:space="preserve">子模块 :</x:String>
477480
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">调整仓库分组</x:String>
478481
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">请选择目标分组:</x:String>
479482
<x:String x:Key="Text.Name" xml:space="preserve">名称 :</x:String>
@@ -744,6 +747,7 @@
744747
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">复制路径</x:String>
745748
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">取消初始化</x:String>
746749
<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>
747751
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">打开仓库</x:String>
748752
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">相对仓库路径 :</x:String>
749753
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">本地存放的相对路径。</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,9 @@
474474
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">提交變更</x:String>
475475
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">合併策略:</x:String>
476476
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">目標列表:</x:String>
477+
<x:String x:Key="Text.MoveSubmodule" xml:space="preserve">移動子模組</x:String>
478+
<x:String x:Key="Text.MoveSubmodule.MoveTo" xml:space="preserve">移動到:</x:String>
479+
<x:String x:Key="Text.MoveSubmodule.Submodule" xml:space="preserve">子模組:</x:String>
477480
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">調整存放庫分組</x:String>
478481
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">請選擇目標分組:</x:String>
479482
<x:String x:Key="Text.Name" xml:space="preserve">名稱:</x:String>
@@ -744,6 +747,7 @@
744747
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">複製路徑</x:String>
745748
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">取消初始化</x:String>
746749
<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>
747751
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">開啟存放庫</x:String>
748752
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">相對存放庫路徑:</x:String>
749753
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">本機存放的相對路徑。</x:String>

src/ViewModels/MoveSubmodule.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations;
3+
using System.Threading.Tasks;
4+
5+
namespace SourceGit.ViewModels
6+
{
7+
public class MoveSubmodule : Popup
8+
{
9+
public Models.Submodule Submodule
10+
{
11+
get;
12+
}
13+
14+
[Required(ErrorMessage = "Path is required!!!")]
15+
public string MoveTo
16+
{
17+
get => _moveTo;
18+
set => SetProperty(ref _moveTo, value, true);
19+
}
20+
21+
public MoveSubmodule(Repository repo, Models.Submodule submodule)
22+
{
23+
_repo = repo;
24+
_moveTo = submodule.Path;
25+
Submodule = submodule;
26+
}
27+
28+
public override async Task<bool> Sure()
29+
{
30+
ProgressDescription = "Moving submodule ...";
31+
32+
var oldPath = Native.OS.GetAbsPath(_repo.FullPath, Submodule.Path);
33+
var newPath = Native.OS.GetAbsPath(_repo.FullPath, _moveTo);
34+
if (oldPath.Equals(newPath, StringComparison.Ordinal))
35+
return true;
36+
37+
var log = _repo.CreateLog("Move Submodule");
38+
_repo.SetWatcherEnabled(false);
39+
Use(log);
40+
41+
var succ = await new Commands.Move(_repo.FullPath, oldPath, newPath, false)
42+
.Use(log)
43+
.ExecAsync();
44+
45+
log.Complete();
46+
_repo.SetWatcherEnabled(true);
47+
return succ;
48+
}
49+
50+
private Repository _repo;
51+
private string _moveTo;
52+
}
53+
}

src/ViewModels/Repository.cs

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

2559+
var move = new MenuItem();
2560+
move.Header = App.Text("Submodule.Move");
2561+
move.Icon = App.CreateMenuIcon("Icons.MoveTo");
2562+
move.Click += (_, ev) =>
2563+
{
2564+
if (CanCreatePopup())
2565+
ShowPopup(new MoveSubmodule(this, submodule));
2566+
ev.Handled = true;
2567+
};
2568+
25592569
var deinit = new MenuItem();
25602570
deinit.Header = App.Text("Submodule.Deinit");
25612571
deinit.Icon = App.CreateMenuIcon("Icons.Undo");
@@ -2589,6 +2599,7 @@ public ContextMenu CreateContextMenuForSubmodule(Models.Submodule submodule)
25892599
var menu = new ContextMenu();
25902600
menu.Items.Add(open);
25912601
menu.Items.Add(new MenuItem() { Header = "-" });
2602+
menu.Items.Add(move);
25922603
menu.Items.Add(deinit);
25932604
menu.Items.Add(rm);
25942605
menu.Items.Add(new MenuItem() { Header = "-" });

src/ViewModels/Welcome.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public ContextMenu CreateContextMenu(RepositoryNode node)
276276

277277
var move = new MenuItem();
278278
move.Header = App.Text("Welcome.Move");
279-
move.Icon = App.CreateMenuIcon("Icons.MoveToAnotherGroup");
279+
move.Icon = App.CreateMenuIcon("Icons.MoveTo");
280280
move.Click += (_, e) =>
281281
{
282282
var activePage = App.GetLauncher().ActivePage;

src/Views/MoveSubmodule.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.MoveSubmodule"
8+
x:DataType="vm:MoveSubmodule">
9+
<StackPanel Orientation="Vertical" Margin="8,0">
10+
<TextBlock FontSize="18"
11+
Classes="bold"
12+
Text="{DynamicResource Text.MoveSubmodule}"/>
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.MoveSubmodule.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.MoveSubmodule.MoveTo}"/>
27+
<TextBox Grid.Row="1" Grid.Column="1"
28+
Height="26"
29+
VerticalAlignment="Center"
30+
CornerRadius="2"
31+
Watermark="{DynamicResource Text.Submodule.RelativePath.Placeholder}"
32+
Text="{Binding MoveTo, Mode=TwoWay}"/>
33+
</Grid>
34+
</StackPanel>
35+
</UserControl>

src/Views/MoveSubmodule.axaml.cs

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 MoveSubmodule : UserControl
6+
{
7+
public MoveSubmodule()
8+
{
9+
InitializeComponent();
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)