@@ -239,16 +239,16 @@ public ContextMenu MakeContextMenu(ListBox list)
239
239
}
240
240
}
241
241
242
+ // Sort selected commits in order.
243
+ selected . Sort ( ( l , r ) =>
244
+ {
245
+ return _commits . IndexOf ( r ) - _commits . IndexOf ( l ) ;
246
+ } ) ;
247
+
242
248
var multipleMenu = new ContextMenu ( ) ;
243
249
244
250
if ( canCherryPick )
245
251
{
246
- // Sort selected commits in order.
247
- selected . Sort ( ( l , r ) =>
248
- {
249
- return _commits . IndexOf ( r ) - _commits . IndexOf ( l ) ;
250
- } ) ;
251
-
252
252
var cherryPickMultiple = new MenuItem ( ) ;
253
253
cherryPickMultiple . Header = App . Text ( "CommitCM.CherryPickMultiple" ) ;
254
254
cherryPickMultiple . Icon = App . CreateMenuIcon ( "Icons.CherryPick" ) ;
@@ -277,11 +277,11 @@ public ContextMenu MakeContextMenu(ListBox list)
277
277
var picker = await storageProvider . OpenFolderPickerAsync ( options ) ;
278
278
if ( picker . Count == 1 )
279
279
{
280
- var saveTo = $ "{ picker [ 0 ] . Path . LocalPath } /patches";
281
280
var succ = false ;
282
- foreach ( var c in selected )
281
+ for ( var i = 0 ; i < selected . Count ; i ++ )
283
282
{
284
- succ = await Task . Run ( ( ) => new Commands . FormatPatch ( _repo . FullPath , c . SHA , saveTo ) . Exec ( ) ) ;
283
+ var saveTo = GetPatchFileName ( picker [ 0 ] . Path . LocalPath , selected [ i ] , i ) ;
284
+ succ = await Task . Run ( ( ) => new Commands . FormatPatch ( _repo . FullPath , selected [ i ] . SHA , saveTo ) . Exec ( ) ) ;
285
285
if ( ! succ )
286
286
break ;
287
287
}
@@ -621,7 +621,8 @@ public ContextMenu MakeContextMenu(ListBox list)
621
621
var selected = await storageProvider . OpenFolderPickerAsync ( options ) ;
622
622
if ( selected . Count == 1 )
623
623
{
624
- var succ = new Commands . FormatPatch ( _repo . FullPath , commit . SHA , selected [ 0 ] . Path . LocalPath ) . Exec ( ) ;
624
+ var saveTo = GetPatchFileName ( selected [ 0 ] . Path . LocalPath , commit ) ;
625
+ var succ = new Commands . FormatPatch ( _repo . FullPath , commit . SHA , saveTo ) . Exec ( ) ;
625
626
if ( succ )
626
627
App . SendNotification ( _repo . FullPath , App . Text ( "SaveAsPatchSuccess" ) ) ;
627
628
}
@@ -1053,6 +1054,35 @@ private void FillTagMenu(ContextMenu menu, Models.Tag tag, Models.Branch current
1053
1054
menu . Items . Add ( submenu ) ;
1054
1055
}
1055
1056
1057
+ private string GetPatchFileName ( string dir , Models . Commit commit , int index = 0 )
1058
+ {
1059
+ var ignore_chars = new HashSet < char > { '/' , '\\ ' , ':' , ',' , '*' , '?' , '\" ' , '<' , '>' , '|' , '`' , '$' , '^' , '%' , '[' , ']' , '+' , '-' } ;
1060
+ var builder = new StringBuilder ( ) ;
1061
+ builder . Append ( index . ToString ( "D4" ) ) ;
1062
+ builder . Append ( '-' ) ;
1063
+
1064
+ var chars = commit . Subject . ToCharArray ( ) ;
1065
+ var len = 0 ;
1066
+ foreach ( var c in chars )
1067
+ {
1068
+ if ( ! ignore_chars . Contains ( c ) )
1069
+ {
1070
+ if ( c == ' ' || c == '\t ' )
1071
+ builder . Append ( '-' ) ;
1072
+ else
1073
+ builder . Append ( c ) ;
1074
+
1075
+ len ++ ;
1076
+
1077
+ if ( len >= 48 )
1078
+ break ;
1079
+ }
1080
+ }
1081
+ builder . Append ( ".patch" ) ;
1082
+
1083
+ return System . IO . Path . Combine ( dir , builder . ToString ( ) ) ;
1084
+ }
1085
+
1056
1086
private Repository _repo = null ;
1057
1087
private bool _isLoading = true ;
1058
1088
private List < Models . Commit > _commits = new List < Models . Commit > ( ) ;
0 commit comments