@@ -527,6 +527,16 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
527527
528528 e . Handled = true ;
529529 } ;
530+
531+ var assumeUnchanged = new MenuItem ( ) ;
532+ assumeUnchanged . Header = App . Text ( "FileCM.AssumeUnchanged" ) ;
533+ assumeUnchanged . Icon = App . CreateMenuIcon ( "Icons.File.Ignore" ) ;
534+ assumeUnchanged . IsVisible = change . WorkTree != Models . ChangeState . Untracked ;
535+ assumeUnchanged . Click += ( _ , e ) =>
536+ {
537+ new Commands . AssumeUnchanged ( _repo . FullPath ) . Add ( change . Path ) ;
538+ e . Handled = true ;
539+ } ;
530540
531541 var history = new MenuItem ( ) ;
532542 history . Header = App . Text ( "FileHistory" ) ;
@@ -538,24 +548,67 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
538548 e . Handled = true ;
539549 } ;
540550
541- var assumeUnchanged = new MenuItem ( ) ;
542- assumeUnchanged . Header = App . Text ( "FileCM.AssumeUnchanged" ) ;
543- assumeUnchanged . Icon = App . CreateMenuIcon ( "Icons.File.Ignore" ) ;
544- assumeUnchanged . IsEnabled = change . WorkTree != Models . ChangeState . Untracked ;
545- assumeUnchanged . Click += ( _ , e ) =>
546- {
547- new Commands . AssumeUnchanged ( _repo . FullPath ) . Add ( change . Path ) ;
548- e . Handled = true ;
549- } ;
550-
551551 menu . Items . Add ( stage ) ;
552552 menu . Items . Add ( discard ) ;
553553 menu . Items . Add ( stash ) ;
554554 menu . Items . Add ( patch ) ;
555+ menu . Items . Add ( assumeUnchanged ) ;
555556 menu . Items . Add ( new MenuItem ( ) { Header = "-" } ) ;
556557 menu . Items . Add ( history ) ;
557- menu . Items . Add ( assumeUnchanged ) ;
558558 menu . Items . Add ( new MenuItem ( ) { Header = "-" } ) ;
559+
560+ if ( change . WorkTree == Models . ChangeState . Untracked )
561+ {
562+ var isRooted = change . Path . IndexOf ( '/' , StringComparison . Ordinal ) <= 0 ;
563+ var addToIgnore = new MenuItem ( ) ;
564+ addToIgnore . Header = App . Text ( "WorkingCopy.AddToGitIgnore" ) ;
565+ addToIgnore . Icon = App . CreateMenuIcon ( "Icons.GitIgnore" ) ;
566+
567+ var singleFile = new MenuItem ( ) ;
568+ singleFile . Header = App . Text ( "WorkingCopy.AddToGitIgnore.SingleFile" ) ;
569+ singleFile . Click += ( _ , e ) =>
570+ {
571+ Commands . GitIgnore . Add ( _repo . FullPath , change . Path ) ;
572+ e . Handled = true ;
573+ } ;
574+ addToIgnore . Items . Add ( singleFile ) ;
575+
576+ var byParentFolder = new MenuItem ( ) ;
577+ byParentFolder . Header = App . Text ( "WorkingCopy.AddToGitIgnore.InSameFolder" ) ;
578+ byParentFolder . IsVisible = ! isRooted ;
579+ byParentFolder . Click += ( _ , e ) =>
580+ {
581+ Commands . GitIgnore . Add ( _repo . FullPath , Path . GetDirectoryName ( change . Path ) + "/" ) ;
582+ e . Handled = true ;
583+ } ;
584+ addToIgnore . Items . Add ( byParentFolder ) ;
585+
586+ var extension = Path . GetExtension ( change . Path ) ;
587+ if ( ! string . IsNullOrEmpty ( extension ) )
588+ {
589+ var byExtension = new MenuItem ( ) ;
590+ byExtension . Header = App . Text ( "WorkingCopy.AddToGitIgnore.Extension" , extension ) ;
591+ byExtension . Click += ( _ , e ) =>
592+ {
593+ Commands . GitIgnore . Add ( _repo . FullPath , "*" + extension ) ;
594+ e . Handled = true ;
595+ } ;
596+ addToIgnore . Items . Add ( byExtension ) ;
597+
598+ var byExtensionInSameFolder = new MenuItem ( ) ;
599+ byExtensionInSameFolder . Header = App . Text ( "WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" , extension ) ;
600+ byExtensionInSameFolder . IsVisible = ! isRooted ;
601+ byExtensionInSameFolder . Click += ( _ , e ) =>
602+ {
603+ Commands . GitIgnore . Add ( _repo . FullPath , Path . GetDirectoryName ( change . Path ) + "/*" + extension ) ;
604+ e . Handled = true ;
605+ } ;
606+ addToIgnore . Items . Add ( byExtensionInSameFolder ) ;
607+ }
608+
609+ menu . Items . Add ( addToIgnore ) ;
610+ menu . Items . Add ( new MenuItem ( ) { Header = "-" } ) ;
611+ }
559612 }
560613
561614 var copy = new MenuItem ( ) ;
0 commit comments