Compare commits

...

3 commits

Author SHA1 Message Date
leo
3dcb32aec9
ux: new style for discard confirm popup
Some checks failed
Continuous Integration / Build (push) Has been cancelled
Continuous Integration / Prepare version string (push) Has been cancelled
Continuous Integration / Package (push) Has been cancelled
2024-10-06 22:38:13 +08:00
leo
029f56cb28
feature: the default merge option supports reading branch.<name>.mergeoptions configuration (#540) 2024-10-06 22:21:18 +08:00
leo
7262437385
ux: new style for pushing a new branch to remote 2024-10-06 21:48:26 +08:00
4 changed files with 50 additions and 38 deletions

View file

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System;
using System.Threading.Tasks;
namespace SourceGit.ViewModels namespace SourceGit.ViewModels
{ {
@ -7,13 +8,11 @@ namespace SourceGit.ViewModels
public string Source public string Source
{ {
get; get;
private set;
} }
public string Into public string Into
{ {
get; get;
private set;
} }
public Models.MergeMode SelectedMode public Models.MergeMode SelectedMode
@ -27,7 +26,7 @@ namespace SourceGit.ViewModels
_repo = repo; _repo = repo;
Source = source; Source = source;
Into = into; Into = into;
SelectedMode = Models.MergeMode.Supported[0]; SelectedMode = AutoSelectMergeMode();
View = new Views.Merge() { DataContext = this }; View = new Views.Merge() { DataContext = this };
} }
@ -44,6 +43,21 @@ namespace SourceGit.ViewModels
}); });
} }
private Models.MergeMode AutoSelectMergeMode()
{
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
if (string.IsNullOrEmpty(config))
return Models.MergeMode.Supported[0];
if (config.Equals("--no-ff", StringComparison.Ordinal))
return Models.MergeMode.Supported[1];
if (config.Equals("--squash", StringComparison.Ordinal))
return Models.MergeMode.Supported[2];
if (config.Equals("--no-commit", StringComparison.Ordinal) || config.Equals("--no-ff --no-commit", StringComparison.Ordinal))
return Models.MergeMode.Supported[3];
return Models.MergeMode.Supported[0];
}
private readonly Repository _repo = null; private readonly Repository _repo = null;
} }
} }

View file

@ -26,7 +26,6 @@ namespace SourceGit.ViewModels
public List<Models.Branch> LocalBranches public List<Models.Branch> LocalBranches
{ {
get; get;
private set;
} }
public List<Models.Remote> Remotes public List<Models.Remote> Remotes
@ -157,7 +156,7 @@ namespace SourceGit.ViewModels
{ {
_repo.SetWatcherEnabled(false); _repo.SetWatcherEnabled(false);
var remoteBranchName = _selectedRemoteBranch.Name.Replace(" (new)", ""); var remoteBranchName = _selectedRemoteBranch.Name;
ProgressDescription = $"Push {_selectedLocalBranch.Name} -> {_selectedRemote.Name}/{remoteBranchName} ..."; ProgressDescription = $"Push {_selectedLocalBranch.Name} -> {_selectedRemote.Name}/{remoteBranchName} ...";
return Task.Run(() => return Task.Run(() =>
@ -187,7 +186,7 @@ namespace SourceGit.ViewModels
branches.Add(branch); branches.Add(branch);
} }
// If selected local branch has upstream branch. Try to find it in current remote branches. // If selected local branch has upstream. Try to find it in current remote branches.
if (!string.IsNullOrEmpty(_selectedLocalBranch.Upstream)) if (!string.IsNullOrEmpty(_selectedLocalBranch.Upstream))
{ {
foreach (var branch in branches) foreach (var branch in branches)
@ -201,7 +200,7 @@ namespace SourceGit.ViewModels
} }
} }
// Find best remote branch by name. // Try to find a remote branch with the same name of selected local branch.
foreach (var branch in branches) foreach (var branch in branches)
{ {
if (_selectedLocalBranch.Name == branch.Name) if (_selectedLocalBranch.Name == branch.Name)
@ -215,7 +214,7 @@ namespace SourceGit.ViewModels
// Add a fake new branch. // Add a fake new branch.
var fake = new Models.Branch() var fake = new Models.Branch()
{ {
Name = $"{_selectedLocalBranch.Name} (new)", Name = _selectedLocalBranch.Name,
Remote = _selectedRemote.Name, Remote = _selectedRemote.Name,
}; };
branches.Add(fake); branches.Add(fake);
@ -226,7 +225,7 @@ namespace SourceGit.ViewModels
private readonly Repository _repo = null; private readonly Repository _repo = null;
private Models.Branch _selectedLocalBranch = null; private Models.Branch _selectedLocalBranch = null;
private Models.Remote _selectedRemote = null; private Models.Remote _selectedRemote = null;
private List<Models.Branch> _remoteBranches = new List<Models.Branch>(); private List<Models.Branch> _remoteBranches = [];
private Models.Branch _selectedRemoteBranch = null; private Models.Branch _selectedRemoteBranch = null;
private bool _isSetTrackOptionVisible = false; private bool _isSetTrackOptionVisible = false;
} }

View file

@ -12,10 +12,19 @@
Classes="bold" Classes="bold"
Text="{DynamicResource Text.Discard}"/> Text="{DynamicResource Text.Discard}"/>
<StackPanel Margin="0,6,0,0" Orientation="Horizontal">
<Path Width="14" Height="14"
Data="{StaticResource Icons.Error}"
Fill="DarkOrange"/>
<TextBlock Margin="4,0,0,0"
Text="{DynamicResource Text.Discard.Warning}"
Foreground="{DynamicResource Brush.FG2}"/>
</StackPanel>
<ContentControl Margin="0,16,0,8" Content="{Binding Mode}"> <ContentControl Margin="0,16,0,8" Content="{Binding Mode}">
<ContentControl.DataTemplates> <ContentControl.DataTemplates>
<DataTemplate DataType="vm:DiscardAllMode"> <DataTemplate DataType="vm:DiscardAllMode">
<Grid RowDefinitions="Auto,Auto,36" ColumnDefinitions="120,*"> <Grid RowDefinitions="32,32" ColumnDefinitions="120,*">
<TextBlock Grid.Row="0" Grid.Column="0" <TextBlock Grid.Row="0" Grid.Column="0"
Margin="0,0,8,0" Margin="0,0,8,0"
HorizontalAlignment="Right" HorizontalAlignment="Right"
@ -26,51 +35,33 @@
<CheckBox Grid.Row="1" Grid.Column="1" <CheckBox Grid.Row="1" Grid.Column="1"
Content="{DynamicResource Text.Discard.IncludeIgnored}" Content="{DynamicResource Text.Discard.IncludeIgnored}"
IsChecked="{Binding IncludeIgnored, Mode=TwoWay}"/> IsChecked="{Binding IncludeIgnored, Mode=TwoWay}"/>
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal">
<Path Width="14" Height="14"
Data="{StaticResource Icons.Error}"
Fill="DarkOrange"/>
<TextBlock Margin="4,0,0,0"
Text="{DynamicResource Text.Discard.Warning}"
Foreground="{DynamicResource Brush.FG2}"/>
</StackPanel>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
<DataTemplate DataType="vm:DiscardSingleFile"> <DataTemplate DataType="vm:DiscardSingleFile">
<Grid RowDefinitions="32,32" ColumnDefinitions="120,*"> <Grid Height="32" ColumnDefinitions="120,*">
<TextBlock Grid.Row="0" Grid.Column="0" <TextBlock Grid.Column="0"
Margin="0,0,8,0" Margin="0,0,8,0"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Text="{DynamicResource Text.Discard.Changes}"/> Text="{DynamicResource Text.Discard.Changes}"/>
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<Path Width="12" Height="12" Data="{StaticResource Icons.File}"/> <Path Width="12" Height="12" Data="{StaticResource Icons.File}"/>
<TextBlock Text="{Binding Path}" Margin="4,0,0,0"/> <TextBlock Text="{Binding Path}" Margin="4,0,0,0"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="1" Grid.Column="1"
VerticalAlignment="Center"
Text="{DynamicResource Text.Discard.Warning}"
Foreground="{DynamicResource Brush.FG2}"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
<DataTemplate DataType="vm:DiscardMultipleFiles"> <DataTemplate DataType="vm:DiscardMultipleFiles">
<Grid RowDefinitions="32,32" ColumnDefinitions="120,*"> <Grid Height="32" ColumnDefinitions="120,*">
<TextBlock Grid.Row="0" Grid.Column="0" <TextBlock Grid.Column="0"
Margin="0,0,8,0" Margin="0,0,8,0"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Text="{DynamicResource Text.Discard.Changes}"/> Text="{DynamicResource Text.Discard.Changes}"/>
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<Path Width="12" Height="12" Data="{StaticResource Icons.File}"/> <Path Width="12" Height="12" Data="{StaticResource Icons.File}"/>
<TextBlock Text="{Binding Count, Converter={x:Static c:StringConverters.FormatByResourceKey}, ConverterParameter='Discard.Total'}" Margin="4,0,0,0"/> <TextBlock Text="{Binding Count, Converter={x:Static c:StringConverters.FormatByResourceKey}, ConverterParameter='Discard.Total'}"
Margin="4,0,0,0"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="1" Grid.Column="1"
VerticalAlignment="Center"
Text="{DynamicResource Text.Discard.Warning}"
Foreground="{DynamicResource Brush.FG2}"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</ContentControl.DataTemplates> </ContentControl.DataTemplates>

View file

@ -65,7 +65,15 @@
<DataTemplate x:DataType="{x:Type m:Branch}"> <DataTemplate x:DataType="{x:Type m:Branch}">
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
<Path Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Branch}"/> <Path Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Branch}"/>
<TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
<Border Height="14"
CornerRadius="7"
Margin="4,0,0,0" Padding="6,0"
VerticalAlignment="Center"
Background="Green"
IsVisible="{Binding Head, Converter={x:Static StringConverters.IsNullOrEmpty}}">
<TextBlock Text="NEW" FontSize="9" FontFamily="{DynamicResource Fonts.Monospace}" Foreground="White" VerticalAlignment="Center"/>
</Border>
</StackPanel> </StackPanel>
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>