Skip to content

Commit 3c048c9

Browse files
committed
Deploy RepositoryActions.json on first run
1 parent 6c478a5 commit 3c048c9

File tree

10 files changed

+108
-12
lines changed

10 files changed

+108
-12
lines changed

Diff for: RepoZ.Api.Common/Git/RepositoryActions/DefaultRepositoryActionConfigurationStore.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void Preload()
5252

5353
private bool TryCopyDefaultJsonFile()
5454
{
55-
var defaultFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "RepositoryActions.json");
55+
var defaultFile = Path.Combine(AppDataPathProvider.GetAppResourcesPath(), "RepositoryActions.json");
5656
var targetFile = GetFileName();
5757

5858
try

Diff for: RepoZ.Api.Common/IO/DefaultAppDataPathProvider.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace RepoZ.Api.Common.IO
66
{
77
public class DefaultAppDataPathProvider : IAppDataPathProvider
88
{
9-
public string GetAppDataPath() => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RepoZ");
9+
public virtual string GetAppDataPath() => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RepoZ");
10+
11+
public virtual string GetAppResourcesPath() => Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
1012
}
1113
}

Diff for: RepoZ.Api.Mac/IO/MacAppDataPathProvider.cs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.IO;
3+
using RepoZ.Api.Common.IO;
4+
5+
namespace RepoZ.Api.Mac.IO
6+
{
7+
public class MacAppDataPathProvider : DefaultAppDataPathProvider
8+
{
9+
public override string GetAppResourcesPath() => Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "..", "Resources");
10+
}
11+
}

Diff for: RepoZ.Api/IO/IAppDataPathProvider.cs

+2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
public interface IAppDataPathProvider
44
{
55
string GetAppDataPath();
6+
7+
string GetAppResourcesPath();
68
}
79
}

Diff for: RepoZ.App.Mac/AppDelegate.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private void RegisterServices(TinyIoCContainer container)
9999
container.Register<IRepositoryObserverFactory, MacRepositoryObserverFactory>().AsSingleton();
100100
container.Register<IPathCrawlerFactory, DefaultPathCrawlerFactory>().AsSingleton();
101101

102-
container.Register<IAppDataPathProvider, DefaultAppDataPathProvider>();
102+
container.Register<IAppDataPathProvider, MacAppDataPathProvider>();
103103
container.Register<IErrorHandler, UIErrorHandler>();
104104
container.Register<IRepositoryActionProvider, DefaultRepositoryActionProvider>();
105105
container.Register<IRepositoryReader, DefaultRepositoryReader>();

Diff for: RepoZ.App.Mac/PopupViewController.cs

+73-3
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@
66
using System.Diagnostics;
77
using RepoZ.Api.Common.Common;
88
using RepoZ.Api.Common.Git.AutoFetch;
9+
using RepoZ.Api.Common.Git;
10+
using System.IO;
911

1012
namespace RepoZ.App.Mac
1113
{
1214
public partial class PopupViewController : AppKit.NSViewController
1315
{
1416
private const int MENU_MANAGE = 4711;
1517
private const int MENU_AUTOFETCH = 4712;
16-
private const int MENU_PINGBACK = 4713;
18+
private const int MENU_ADVANCED = 4713;
19+
private const int MENU_PINGBACK = 4714;
1720

1821
private IRepositoryInformationAggregator _aggregator;
1922
private IRepositoryMonitor _monitor;
2023
private IAppSettingsService _appSettingsService;
2124
private IRepositoryIgnoreStore _repositoryIgnoreStore;
2225
private ITranslationService _translationService;
26+
private IRepositoryActionConfigurationStore _actionConfigurationStore;
2327
private HeaderMetrics _initialHeaderMetrics;
2428

2529
#region Constructors
@@ -74,6 +78,7 @@ public override void ViewWillAppear()
7478
_appSettingsService = container.Resolve<IAppSettingsService>();
7579
_repositoryIgnoreStore = container.Resolve<IRepositoryIgnoreStore>();
7680
_translationService = container.Resolve<ITranslationService>();
81+
_actionConfigurationStore = container.Resolve<IRepositoryActionConfigurationStore>();
7782

7883
// Do any additional setup after loading the view.
7984
var datasource = new RepositoryTableDataSource(_aggregator.Repositories);
@@ -204,6 +209,7 @@ private void CreateMenu()
204209

205210
new NSMenuItem(_translationService.Translate("ManageRepos")) { Tag = MENU_MANAGE},
206211
new NSMenuItem(_translationService.Translate("AutoFetch")) { Tag = MENU_AUTOFETCH },
212+
new NSMenuItem(_translationService.Translate("Advanced")) { Tag = MENU_ADVANCED },
207213
NSMenuItem.SeparatorItem,
208214
new NSMenuItem(_translationService.Translate("PingBack")) { Tag = MENU_PINGBACK },
209215
NSMenuItem.SeparatorItem,
@@ -218,6 +224,8 @@ private void CreateMenu()
218224
new NSMenuItem(_translationService.Translate("ScanMac"), async (s, e) => await _monitor.ScanForLocalRepositoriesAsync()),
219225
new NSMenuItem(_translationService.Translate("Clear"), (s, e) => _monitor.Reset()),
220226
NSMenuItem.SeparatorItem,
227+
new NSMenuItem(_translationService.Translate("CustomizeRepositoryActions"), HandleCustomizeRepositoryAction),
228+
NSMenuItem.SeparatorItem,
221229
new NSMenuItem(_translationService.Translate("ResetIgnoreRules"), (s, e) => _repositoryIgnoreStore.Reset())
222230
};
223231

@@ -241,6 +249,16 @@ private void CreateMenu()
241249
foreach (var item in autoFetchItems)
242250
autoFetchItem.Submenu.AddItem(item);
243251

252+
var advancedItems = new NSMenuItem[] {
253+
new CheckableMenuItem(_translationService.Translate("PruneOnFetch"), value => _appSettingsService.PruneOnFetch = value, () => _appSettingsService.PruneOnFetch)
254+
};
255+
256+
var advancedItem = MenuButton.Menu.ItemWithTag(MENU_ADVANCED);
257+
advancedItem.Submenu = new NSMenu { AutoEnablesItems = false };
258+
259+
foreach (var item in advancedItems)
260+
advancedItem.Submenu.AddItem(item);
261+
244262
var pingbackItems = new NSMenuItem[] {
245263
new NSMenuItem(_translationService.Translate("Donate"), (s, e) => Navigate("https://github.com/sponsors/awaescher")),
246264
NSMenuItem.SeparatorItem,
@@ -257,8 +275,9 @@ private void CreateMenu()
257275

258276
partial void MenuButton_Click(NSObject sender)
259277
{
260-
var currentMode = _appSettingsService.AutoFetchMode;
278+
var currentAutoFetchMode = _appSettingsService.AutoFetchMode;
261279
var autoFetchItem = MenuButton.Menu.ItemWithTag(MENU_AUTOFETCH);
280+
var advancedItem = MenuButton.Menu.ItemWithTag(MENU_ADVANCED);
262281

263282
for (int i = 0; i < autoFetchItem.Submenu.Count; i++)
264283
{
@@ -268,18 +287,43 @@ partial void MenuButton_Click(NSObject sender)
268287
continue;
269288

270289
var itemMode = (AutoFetchMode)Enum.Parse(typeof(AutoFetchMode), item.Identifier);
271-
item.State = itemMode == currentMode ? NSCellStateValue.On : NSCellStateValue.Off;
290+
item.State = itemMode == currentAutoFetchMode ? NSCellStateValue.On : NSCellStateValue.Off;
272291
}
273292

293+
UpdateCheckableItems(MenuButton.Menu);
294+
274295
MenuButton.Menu.PopUpMenu(null, new CoreGraphics.CGPoint() { X = 0, Y = MenuButton.Frame.Height }, MenuButton);
275296
}
276297

298+
void UpdateCheckableItems(NSMenu menu)
299+
{
300+
if (menu is null)
301+
return;
302+
303+
foreach (var item in menu.Items)
304+
{
305+
(item as CheckableMenuItem)?.Update();
306+
UpdateCheckableItems(item.Submenu);
307+
}
308+
}
309+
277310
void HandleAutoFetchChange(object sender, EventArgs e)
278311
{
279312
var newMode = (AutoFetchMode)Enum.Parse(typeof(AutoFetchMode), (sender as NSMenuItem).Identifier);
280313
_appSettingsService.AutoFetchMode = newMode;
281314
}
282315

316+
void HandleCustomizeRepositoryAction(object sender, EventArgs e)
317+
{
318+
Navigate("https://github.com/awaescher/RepoZ-RepositoryActions");
319+
320+
var fileName = ((FileRepositoryStore)_actionConfigurationStore).GetFileName();
321+
var directoryName = Path.GetDirectoryName(fileName);
322+
323+
if (Directory.Exists(directoryName))
324+
Process.Start(directoryName);
325+
}
326+
283327
void Datasource_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
284328
{
285329
this.InvokeOnMainThread(SetControlVisibilityByRepositoryAvailability);
@@ -334,5 +378,31 @@ private class HeaderMetrics
334378
public nfloat MenuButtonLeft { get; set; }
335379
public nfloat SearchBoxWidth { get; set; }
336380
}
381+
382+
private class CheckableMenuItem : NSMenuItem
383+
{
384+
public CheckableMenuItem(string title, Action<bool> onChange, Func<bool> isChecked) : base(title)
385+
{
386+
OnChange = onChange ?? throw new ArgumentNullException(nameof(onChange));
387+
IsChecked = isChecked ?? throw new ArgumentNullException(nameof(isChecked));
388+
389+
base.Activated += CheckableMenuItem_Activated;
390+
}
391+
392+
private void CheckableMenuItem_Activated(object sender, EventArgs e)
393+
{
394+
State = (State == NSCellStateValue.On) ? NSCellStateValue.Off : NSCellStateValue.On;
395+
OnChange.Invoke(State == NSCellStateValue.On);
396+
}
397+
398+
public void Update()
399+
{
400+
State = IsChecked.Invoke() ? NSCellStateValue.On : NSCellStateValue.Off;
401+
}
402+
403+
public Action<bool> OnChange { get; }
404+
405+
public Func<bool> IsChecked { get; }
406+
}
337407
}
338408
}

Diff for: RepoZ.App.Mac/RepoZ.App.Mac.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@
176176
<BundleResource Include="..\RepoZ.App.Win\i18n\en-us.xaml">
177177
<Link>i18n\en-us.xaml</Link>
178178
</BundleResource>
179+
<BundleResource Include="..\_ref\macOS\RepositoryActions.json">
180+
<Link>Resources\RepositoryActions.json</Link>
181+
</BundleResource>
179182
</ItemGroup>
180183
<ItemGroup>
181184
<NativeReference Include="..\_ref\libgit2-4aecb64.dylib">

Diff for: RepoZ.App.Win/MainWindow.xaml.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,13 @@ private void ResetIgnoreRulesButton_Click(object sender, RoutedEventArgs e)
213213

214214
private void CustomizeContextMenu_Click(object sender, RoutedEventArgs e)
215215
{
216+
Navigate("https://github.com/awaescher/RepoZ-RepositoryActions");
217+
216218
var fileName = ((FileRepositoryStore)_actionConfigurationStore).GetFileName();
217219
var directoryName = Path.GetDirectoryName(fileName);
218220

219221
if (Directory.Exists(directoryName))
220222
Process.Start(directoryName);
221-
222-
Navigate("https://github.com/awaescher/RepoZ-RepositoryActions");
223223
}
224224

225225
private void UpdateButton_Click(object sender, RoutedEventArgs e)

Diff for: _ref/macOS/RepositoryActions.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,9 @@
9898
[
9999
{
100100
"name": "{OpenIn} Finder",
101-
"command": '"{Repository.SafePath}"',
102-
"keys": "Command+Shift+E",
101+
"command": "open",
102+
"arguments": '"{Repository.SafePath}"',
103+
"keys": "Command+Shift+F",
103104
"active": "true"
104105
},
105106
{

Diff for: _setup/RepoZ.pkgproj

+9-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@
66
<array>
77
<dict>
88
<key>MUST-CLOSE-APPLICATION-ITEMS</key>
9-
<array/>
9+
<array>
10+
<dict>
11+
<key>APPLICATION_ID</key>
12+
<string>net.sodacore.RepoZ</string>
13+
<key>STATE</key>
14+
<true/>
15+
</dict>
16+
</array>
1017
<key>MUST-CLOSE-APPLICATIONS</key>
11-
<false/>
18+
<true/>
1219
<key>PACKAGE_FILES</key>
1320
<dict>
1421
<key>DEFAULT_INSTALL_LOCATION</key>

0 commit comments

Comments
 (0)