From dab5f160339afd3d525016efb0edbd3a35eab3a8 Mon Sep 17 00:00:00 2001 From: hrbrmstr Date: Fri, 30 Aug 2019 12:41:36 -0400 Subject: [PATCH] code reorg --- Podfile | 2 + RSwitch.xcodeproj/project.pbxproj | 106 ++++++++--- RSwitch/Info.plist | 2 +- RSwitch/ObjC/ProcInfo/libprocInfo.a | Bin 0 -> 205640 bytes RSwitch/ObjC/ProcInfo/procHelper.h | 19 ++ RSwitch/ObjC/ProcInfo/procHelper.m | 18 ++ RSwitch/ObjC/ProcInfo/procInfo.h | 205 ++++++++++++++++++++++ RSwitch/ObjC/RSwitch-Bridging-Header.h | 7 + RSwitch/c/RSwitch-Bridging-Header.h | 7 - RSwitch/c/libprocInfo.a | Bin 205640 -> 0 bytes RSwitch/c/procHelper.h | 19 -- RSwitch/c/procHelper.m | 18 -- RSwitch/c/procInfo.h | 205 ---------------------- RSwitch/c/swift/AboutViewController.swift | 10 -- RSwitch/c/swift/Alerts.swift | 25 --- RSwitch/c/swift/AppDelegate.swift | 40 ----- RSwitch/c/swift/Bundle.swift | 21 --- RSwitch/c/swift/DownloadRStudio.swift | 94 ---------- RSwitch/c/swift/DownloadTarball.swift | 74 -------- RSwitch/c/swift/HandleSwitch.swift | 43 ----- RSwitch/c/swift/HandleSwitchTo.swift | 25 --- RSwitch/c/swift/HandleUpdate.swift | 34 ---- RSwitch/c/swift/Menu.swift | 157 ----------------- RSwitch/c/swift/Notify.swift | 33 ---- RSwitch/c/swift/String+Version.swift | 42 ----- RSwitch/c/swift/Utils.swift | 66 ------- RSwitch/c/swift/ViewController.swift | 27 --- RSwitch/swift/AboutViewController.swift | 17 ++ RSwitch/swift/AppAlerts/AppAlerts.swift | 27 +++ RSwitch/swift/AppDelegate.swift | 39 ++++ RSwitch/swift/Downloaders/DownloadRStudio.swift | 94 ++++++++++ RSwitch/swift/Downloaders/DownloadTarball.swift | 74 ++++++++ RSwitch/swift/HandleRSwitch.swift | 43 +++++ RSwitch/swift/HandleSwitchTo.swift | 25 +++ RSwitch/swift/HandleUpdate.swift | 34 ++++ RSwitch/swift/Menu.swift | 64 +++++++ RSwitch/swift/MenuActions/BrowseMenuAction.swift | 74 ++++++++ RSwitch/swift/Notify.swift | 33 ++++ RSwitch/swift/String+Version/Bundle.swift | 21 +++ RSwitch/swift/String+Version/String+Version.swift | 42 +++++ RSwitch/swift/Utils/LaunchUtils.swift | 51 ++++++ RSwitch/swift/Utils/Utils.swift | 22 +++ RSwitch/swift/Utils/Versions+RunningUtils.swift | 106 +++++++++++ RSwitch/swift/ViewController.swift | 27 +++ guide/.Rhistory | 6 + 45 files changed, 1135 insertions(+), 963 deletions(-) create mode 100644 RSwitch/ObjC/ProcInfo/libprocInfo.a create mode 100644 RSwitch/ObjC/ProcInfo/procHelper.h create mode 100644 RSwitch/ObjC/ProcInfo/procHelper.m create mode 100644 RSwitch/ObjC/ProcInfo/procInfo.h create mode 100644 RSwitch/ObjC/RSwitch-Bridging-Header.h delete mode 100644 RSwitch/c/RSwitch-Bridging-Header.h delete mode 100644 RSwitch/c/libprocInfo.a delete mode 100644 RSwitch/c/procHelper.h delete mode 100644 RSwitch/c/procHelper.m delete mode 100644 RSwitch/c/procInfo.h delete mode 100644 RSwitch/c/swift/AboutViewController.swift delete mode 100644 RSwitch/c/swift/Alerts.swift delete mode 100644 RSwitch/c/swift/AppDelegate.swift delete mode 100644 RSwitch/c/swift/Bundle.swift delete mode 100644 RSwitch/c/swift/DownloadRStudio.swift delete mode 100644 RSwitch/c/swift/DownloadTarball.swift delete mode 100644 RSwitch/c/swift/HandleSwitch.swift delete mode 100644 RSwitch/c/swift/HandleSwitchTo.swift delete mode 100644 RSwitch/c/swift/HandleUpdate.swift delete mode 100644 RSwitch/c/swift/Menu.swift delete mode 100644 RSwitch/c/swift/Notify.swift delete mode 100644 RSwitch/c/swift/String+Version.swift delete mode 100644 RSwitch/c/swift/Utils.swift delete mode 100644 RSwitch/c/swift/ViewController.swift create mode 100644 RSwitch/swift/AboutViewController.swift create mode 100644 RSwitch/swift/AppAlerts/AppAlerts.swift create mode 100644 RSwitch/swift/AppDelegate.swift create mode 100644 RSwitch/swift/Downloaders/DownloadRStudio.swift create mode 100644 RSwitch/swift/Downloaders/DownloadTarball.swift create mode 100644 RSwitch/swift/HandleRSwitch.swift create mode 100644 RSwitch/swift/HandleSwitchTo.swift create mode 100644 RSwitch/swift/HandleUpdate.swift create mode 100644 RSwitch/swift/Menu.swift create mode 100644 RSwitch/swift/MenuActions/BrowseMenuAction.swift create mode 100644 RSwitch/swift/Notify.swift create mode 100644 RSwitch/swift/String+Version/Bundle.swift create mode 100644 RSwitch/swift/String+Version/String+Version.swift create mode 100644 RSwitch/swift/Utils/LaunchUtils.swift create mode 100644 RSwitch/swift/Utils/Utils.swift create mode 100644 RSwitch/swift/Utils/Versions+RunningUtils.swift create mode 100644 RSwitch/swift/ViewController.swift diff --git a/Podfile b/Podfile index 1cd04fe..f260a1c 100644 --- a/Podfile +++ b/Podfile @@ -1,5 +1,7 @@ platform :osx, '10.14' +source 'https://cdn.cocoapods.org/' + target 'RSwitch' do use_frameworks! diff --git a/RSwitch.xcodeproj/project.pbxproj b/RSwitch.xcodeproj/project.pbxproj index 1cc08f5..77a7e6c 100644 --- a/RSwitch.xcodeproj/project.pbxproj +++ b/RSwitch.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 01073F0F2311AE2E007162C9 /* String+Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F0E2311AE2E007162C9 /* String+Version.swift */; }; - 01073F112311E0F7007162C9 /* Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F102311E0F7007162C9 /* Alerts.swift */; }; 01073F132311E1CF007162C9 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F122311E1CF007162C9 /* Utils.swift */; }; 01073F152311E370007162C9 /* Notify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F142311E370007162C9 /* Notify.swift */; }; 01073F172311E397007162C9 /* Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F162311E397007162C9 /* Menu.swift */; }; @@ -16,11 +15,15 @@ 01073F1B2311E613007162C9 /* DownloadTarball.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F1A2311E613007162C9 /* DownloadTarball.swift */; }; 01073F1D2311E64E007162C9 /* DownloadRStudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F1C2311E64E007162C9 /* DownloadRStudio.swift */; }; 01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F1E2311E67D007162C9 /* HandleUpdate.swift */; }; - 01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F202311E6BD007162C9 /* HandleSwitch.swift */; }; + 01073F212311E6BD007162C9 /* HandleRSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F202311E6BD007162C9 /* HandleRSwitch.swift */; }; 0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0178970C230ED25100F8F5BC /* AboutViewController.swift */; }; 018A8C3B2312C7BC0006E87D /* libprocInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 018A8C3A2312C7BC0006E87D /* libprocInfo.a */; }; 018A8C3F2312CB480006E87D /* procHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 018A8C3E2312CB480006E87D /* procHelper.m */; }; 018A8C412312F4940006E87D /* HandleSwitchTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018A8C402312F4940006E87D /* HandleSwitchTo.swift */; }; + 0198B99E23196689003F7578 /* BrowseMenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198B99D23196689003F7578 /* BrowseMenuAction.swift */; }; + 0198B9A0231970ED003F7578 /* AppAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198B99F231970ED003F7578 /* AppAlerts.swift */; }; + 0198B9A823197CBA003F7578 /* LaunchUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198B9A723197CBA003F7578 /* LaunchUtils.swift */; }; + 0198B9AA23197D3A003F7578 /* Versions+RunningUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198B9A923197D3A003F7578 /* Versions+RunningUtils.swift */; }; 01F3EF0C230E635300DF5DF9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */; }; 01F3EF0E230E635300DF5DF9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0D230E635300DF5DF9 /* ViewController.swift */; }; 01F3EF10230E635500DF5DF9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 01F3EF0F230E635500DF5DF9 /* Assets.xcassets */; }; @@ -30,7 +33,6 @@ /* Begin PBXFileReference section */ 01073F0E2311AE2E007162C9 /* String+Version.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Version.swift"; sourceTree = ""; }; - 01073F102311E0F7007162C9 /* Alerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alerts.swift; sourceTree = ""; }; 01073F122311E1CF007162C9 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 01073F142311E370007162C9 /* Notify.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notify.swift; sourceTree = ""; }; 01073F162311E397007162C9 /* Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menu.swift; sourceTree = ""; }; @@ -38,7 +40,7 @@ 01073F1A2311E613007162C9 /* DownloadTarball.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadTarball.swift; sourceTree = ""; }; 01073F1C2311E64E007162C9 /* DownloadRStudio.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadRStudio.swift; sourceTree = ""; }; 01073F1E2311E67D007162C9 /* HandleUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleUpdate.swift; sourceTree = ""; }; - 01073F202311E6BD007162C9 /* HandleSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleSwitch.swift; sourceTree = ""; }; + 01073F202311E6BD007162C9 /* HandleRSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleRSwitch.swift; sourceTree = ""; }; 0178970C230ED25100F8F5BC /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; 018A8C392312C7BC0006E87D /* procInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = procInfo.h; sourceTree = ""; }; 018A8C3A2312C7BC0006E87D /* libprocInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libprocInfo.a; sourceTree = ""; }; @@ -46,6 +48,10 @@ 018A8C3D2312CB480006E87D /* procHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = procHelper.h; sourceTree = ""; }; 018A8C3E2312CB480006E87D /* procHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = procHelper.m; sourceTree = ""; }; 018A8C402312F4940006E87D /* HandleSwitchTo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleSwitchTo.swift; sourceTree = ""; }; + 0198B99D23196689003F7578 /* BrowseMenuAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseMenuAction.swift; sourceTree = ""; }; + 0198B99F231970ED003F7578 /* AppAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAlerts.swift; sourceTree = ""; }; + 0198B9A723197CBA003F7578 /* LaunchUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchUtils.swift; sourceTree = ""; }; + 0198B9A923197D3A003F7578 /* Versions+RunningUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Versions+RunningUtils.swift"; sourceTree = ""; }; 01F3EF08230E635300DF5DF9 /* RSwitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RSwitch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 01F3EF0D230E635300DF5DF9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -73,35 +79,85 @@ 01073F232311E859007162C9 /* swift */ = { isa = PBXGroup; children = ( + 0198B9A1231970F5003F7578 /* AppAlerts */, + 0198B9A323197301003F7578 /* Downloaders */, + 0198B99C23196666003F7578 /* MenuActions */, + 0198B9A2231971D1003F7578 /* String+Version */, + 0198B9A623197C8E003F7578 /* Utils */, + 0178970C230ED25100F8F5BC /* AboutViewController.swift */, 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */, - 01073F102311E0F7007162C9 /* Alerts.swift */, - 01073F202311E6BD007162C9 /* HandleSwitch.swift */, + 01073F202311E6BD007162C9 /* HandleRSwitch.swift */, 01073F1E2311E67D007162C9 /* HandleUpdate.swift */, - 01073F1C2311E64E007162C9 /* DownloadRStudio.swift */, - 01073F1A2311E613007162C9 /* DownloadTarball.swift */, 018A8C402312F4940006E87D /* HandleSwitchTo.swift */, - 01073F182311E3B8007162C9 /* Bundle.swift */, 01073F162311E397007162C9 /* Menu.swift */, 01073F142311E370007162C9 /* Notify.swift */, - 01073F0E2311AE2E007162C9 /* String+Version.swift */, - 01073F122311E1CF007162C9 /* Utils.swift */, 01F3EF0D230E635300DF5DF9 /* ViewController.swift */, - 0178970C230ED25100F8F5BC /* AboutViewController.swift */, ); path = swift; sourceTree = ""; }; - 018A8C342312C6510006E87D /* c */ = { + 018A8C342312C6510006E87D /* ObjC */ = { isa = PBXGroup; children = ( + 0198B99B23196479003F7578 /* ProcInfo */, 018A8C3C2312C8380006E87D /* RSwitch-Bridging-Header.h */, + ); + path = ObjC; + sourceTree = ""; + }; + 0198B99B23196479003F7578 /* ProcInfo */ = { + isa = PBXGroup; + children = ( 018A8C3A2312C7BC0006E87D /* libprocInfo.a */, 018A8C392312C7BC0006E87D /* procInfo.h */, 018A8C3D2312CB480006E87D /* procHelper.h */, 018A8C3E2312CB480006E87D /* procHelper.m */, - 01073F232311E859007162C9 /* swift */, ); - path = c; + path = ProcInfo; + sourceTree = ""; + }; + 0198B99C23196666003F7578 /* MenuActions */ = { + isa = PBXGroup; + children = ( + 0198B99D23196689003F7578 /* BrowseMenuAction.swift */, + ); + path = MenuActions; + sourceTree = ""; + }; + 0198B9A1231970F5003F7578 /* AppAlerts */ = { + isa = PBXGroup; + children = ( + 0198B99F231970ED003F7578 /* AppAlerts.swift */, + ); + path = AppAlerts; + sourceTree = ""; + }; + 0198B9A2231971D1003F7578 /* String+Version */ = { + isa = PBXGroup; + children = ( + 01073F182311E3B8007162C9 /* Bundle.swift */, + 01073F0E2311AE2E007162C9 /* String+Version.swift */, + ); + path = "String+Version"; + sourceTree = ""; + }; + 0198B9A323197301003F7578 /* Downloaders */ = { + isa = PBXGroup; + children = ( + 01073F1A2311E613007162C9 /* DownloadTarball.swift */, + 01073F1C2311E64E007162C9 /* DownloadRStudio.swift */, + ); + path = Downloaders; + sourceTree = ""; + }; + 0198B9A623197C8E003F7578 /* Utils */ = { + isa = PBXGroup; + children = ( + 01073F122311E1CF007162C9 /* Utils.swift */, + 0198B9A723197CBA003F7578 /* LaunchUtils.swift */, + 0198B9A923197D3A003F7578 /* Versions+RunningUtils.swift */, + ); + path = Utils; sourceTree = ""; }; 01F3EEFF230E635300DF5DF9 = { @@ -125,7 +181,8 @@ 01F3EF0A230E635300DF5DF9 /* RSwitch */ = { isa = PBXGroup; children = ( - 018A8C342312C6510006E87D /* c */, + 018A8C342312C6510006E87D /* ObjC */, + 01073F232311E859007162C9 /* swift */, 01F3EF0F230E635500DF5DF9 /* Assets.xcassets */, 01F3EF11230E635500DF5DF9 /* Main.storyboard */, 01F3EF14230E635500DF5DF9 /* Info.plist */, @@ -265,20 +322,23 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */, + 01073F212311E6BD007162C9 /* HandleRSwitch.swift in Sources */, + 0198B9A0231970ED003F7578 /* AppAlerts.swift in Sources */, 018A8C3F2312CB480006E87D /* procHelper.m in Sources */, 01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */, 01073F1B2311E613007162C9 /* DownloadTarball.swift in Sources */, 018A8C412312F4940006E87D /* HandleSwitchTo.swift in Sources */, + 0198B9AA23197D3A003F7578 /* Versions+RunningUtils.swift in Sources */, 0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */, 01073F192311E3B8007162C9 /* Bundle.swift in Sources */, 01073F152311E370007162C9 /* Notify.swift in Sources */, 01073F1D2311E64E007162C9 /* DownloadRStudio.swift in Sources */, 01073F172311E397007162C9 /* Menu.swift in Sources */, - 01073F112311E0F7007162C9 /* Alerts.swift in Sources */, 01F3EF0E230E635300DF5DF9 /* ViewController.swift in Sources */, 01F3EF0C230E635300DF5DF9 /* AppDelegate.swift in Sources */, 01073F0F2311AE2E007162C9 /* String+Version.swift in Sources */, + 0198B9A823197CBA003F7578 /* LaunchUtils.swift in Sources */, + 0198B99E23196689003F7578 /* BrowseMenuAction.swift in Sources */, 01073F132311E1CF007162C9 /* Utils.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -431,14 +491,15 @@ ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/RSwitch/c", + "$(PROJECT_DIR)/RSwitch/ObjC", + "$(PROJECT_DIR)/RSwitch/ObjC/ProcInfo", ); MACOSX_DEPLOYMENT_TARGET = 10.14; MARKETING_VERSION = 1.4.0; PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/c/RSwitch-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/ObjC/RSwitch-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; @@ -462,14 +523,15 @@ ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/RSwitch/c", + "$(PROJECT_DIR)/RSwitch/ObjC", + "$(PROJECT_DIR)/RSwitch/ObjC/ProcInfo", ); MACOSX_DEPLOYMENT_TARGET = 10.14; MARKETING_VERSION = 1.4.0; PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/c/RSwitch-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/ObjC/RSwitch-Bridging-Header.h"; SWIFT_VERSION = 5.0; }; name = Release; diff --git a/RSwitch/Info.plist b/RSwitch/Info.plist index a258524..628a752 100644 --- a/RSwitch/Info.plist +++ b/RSwitch/Info.plist @@ -21,7 +21,7 @@ CFBundleVersion 1 LSApplicationCategoryType - public.app-category.utilities + public.app-category.developer-tools LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/RSwitch/ObjC/ProcInfo/libprocInfo.a b/RSwitch/ObjC/ProcInfo/libprocInfo.a new file mode 100644 index 0000000000000000000000000000000000000000..5e2607e529eb50d31142a802b0610a8cc5d65870 GIT binary patch literal 205640 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 An*aa+ literal 0 HcmV?d00001 diff --git a/RSwitch/ObjC/ProcInfo/procHelper.h b/RSwitch/ObjC/ProcInfo/procHelper.h new file mode 100644 index 0000000..b39a741 --- /dev/null +++ b/RSwitch/ObjC/ProcInfo/procHelper.h @@ -0,0 +1,19 @@ +// +// procHelper.h +// RSwitch +// +// Created by hrbrmstr on 8/25/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +#ifndef procHelper_h +#define procHelper_h + +#include +#include "procHelper.h" +#include "procInfo.h" +#import + +NSMutableArray *getArgs(pid_t pid); + +#endif /* procHelper_h */ diff --git a/RSwitch/ObjC/ProcInfo/procHelper.m b/RSwitch/ObjC/ProcInfo/procHelper.m new file mode 100644 index 0000000..72034b6 --- /dev/null +++ b/RSwitch/ObjC/ProcInfo/procHelper.m @@ -0,0 +1,18 @@ +// +// procHelper.c +// RSwitch +// +// Created by hrbrmstr on 8/25/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +#include "procHelper.h" +#include "procInfo.h" +#import + +NSMutableArray *getArgs(pid_t pid) { + + Process* process = [[Process alloc] init:pid]; + return(process.arguments); + +} diff --git a/RSwitch/ObjC/ProcInfo/procInfo.h b/RSwitch/ObjC/ProcInfo/procInfo.h new file mode 100644 index 0000000..2d22215 --- /dev/null +++ b/RSwitch/ObjC/ProcInfo/procInfo.h @@ -0,0 +1,205 @@ +// +// File: procInfo.h +// Project: Proc Info +// +// Created by: Patrick Wardle +// Copyright: 2017 Objective-See +// License: Creative Commons Attribution-NonCommercial 4.0 International License +// + +#ifndef procInfo_h +#define procInfo_h + +#import +#import +#import + +/* CLASSES */#import + + +@class Binary; +@class Process; + +/* DEFINES */ + +//from audit_kevents.h +#define EVENT_EXIT 1 +#define EVENT_FORK 2 +#define EVENT_EXECVE 23 +#define EVENT_EXEC 27 +#define EVENT_SPAWN 43190 + +//signers +enum Signer{None, Apple, AppStore, DevID, AdHoc}; + +//signature status +#define KEY_SIGNATURE_STATUS @"signatureStatus" + +//signer +#define KEY_SIGNATURE_SIGNER @"signatureSigner" + +//signing auths +#define KEY_SIGNATURE_AUTHORITIES @"signatureAuthorities" + +//code signing id +#define KEY_SIGNATURE_IDENTIFIER @"signatureIdentifier" + +//entitlements +#define KEY_SIGNATURE_ENTITLEMENTS @"signatureEntitlements" + +/* TYPEDEFS */ + +//block for library +typedef void (^ProcessCallbackBlock)(Process* _Nonnull); + +/* OBJECT: PROCESS INFO */ + +@interface ProcInfo : NSObject + +//init w/ flag +// flag dictates if CPU-intensive logic (code signing, etc) should be preformed +-(id _Nullable)init:(BOOL)goEasy; + +//start monitoring +-(void)start:(ProcessCallbackBlock _Nonnull )callback; + +//stop monitoring +-(void)stop; + +//get list of running processes +-(NSMutableArray* _Nonnull)currentProcesses; + +@end + +/* OBJECT: PROCESS */ + +@interface Process : NSObject + +/* PROPERTIES */ + +//pid +@property pid_t pid; + +//ppid +@property pid_t ppid; + +//user id +@property uid_t uid; + +//type +// used by process mon +@property u_int16_t type; + +//exit code +@property u_int32_t exit; + +//path +@property(nonatomic, retain)NSString* _Nullable path; + +//args +@property(nonatomic, retain)NSMutableArray* _Nonnull arguments; + +//ancestors +@property(nonatomic, retain)NSMutableArray* _Nonnull ancestors; + +//signing info +@property(nonatomic, retain)NSMutableDictionary* _Nonnull signingInfo; + +//Binary object +// has path, hash, etc +@property(nonatomic, retain)Binary* _Nonnull binary; + +//timestamp +@property(nonatomic, retain)NSDate* _Nonnull timestamp; + +/* METHODS */ + +//init with a pid +// method will then (try) fill out rest of object +-(id _Nullable)init:(pid_t)processID; + +//generate signing info +// also classifies if Apple/from App Store/etc. +-(void)generateSigningInfo:(SecCSFlags)flags; + +//set process's path +-(void)pathFromPid; + +//generate list of ancestors +-(void)enumerateAncestors; + +//class method +// get's parent of arbitrary process ++(pid_t)getParentID:(pid_t)child; + +@end + +/* OBJECT: BINARY */ + +@interface Binary : NSObject +{ + +} + +/* PROPERTIES */ + +//path +@property(nonatomic, retain)NSString* _Nonnull path; + +//name +@property(nonatomic, retain)NSString* _Nonnull name; + +//icon +@property(nonatomic, retain)NSImage* _Nonnull icon; + +//file attributes +@property(nonatomic, retain)NSDictionary* _Nullable attributes; + +//spotlight meta data +@property(nonatomic, retain)NSDictionary* _Nullable metadata; + +//bundle +// nil for non-apps +@property(nonatomic, retain)NSBundle* _Nullable bundle; + +//signing info +@property(nonatomic, retain)NSDictionary* _Nonnull signingInfo; + +//hash +@property(nonatomic, retain)NSMutableString* _Nonnull sha256; + +//identifier +// either signing id or sha256 hash +@property(nonatomic, retain)NSString* _Nonnull identifier; + +/* METHODS */ + +//init w/ a path +-(id _Nonnull)init:(NSString* _Nonnull)path; + +/* the following methods are rather CPU-intensive + as such, if the proc monitoring is run with the 'goEasy' option, they aren't automatically invoked +*/ + +//get an icon for a process +// for apps, this will be app's icon, otherwise just a standard system one +-(void)getIcon; + +//generate signing info (statically) +-(void)generateSigningInfo:(SecCSFlags)flags; + +/* the following methods are not invoked automatically + as such, if you code has to manually invoke them if you want this info + */ + +//generate hash +// algo: sha256 +-(void)generateHash; + +//generate id +// either signing id, or sha256 hash +-(void)generateIdentifier; + +@end + +#endif diff --git a/RSwitch/ObjC/RSwitch-Bridging-Header.h b/RSwitch/ObjC/RSwitch-Bridging-Header.h new file mode 100644 index 0000000..c9f1c45 --- /dev/null +++ b/RSwitch/ObjC/RSwitch-Bridging-Header.h @@ -0,0 +1,7 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import +#include "procInfo.h" +#include "procHelper.h" diff --git a/RSwitch/c/RSwitch-Bridging-Header.h b/RSwitch/c/RSwitch-Bridging-Header.h deleted file mode 100644 index c9f1c45..0000000 --- a/RSwitch/c/RSwitch-Bridging-Header.h +++ /dev/null @@ -1,7 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import -#include "procInfo.h" -#include "procHelper.h" diff --git a/RSwitch/c/libprocInfo.a b/RSwitch/c/libprocInfo.a deleted file mode 100644 index 5e2607e529eb50d31142a802b0610a8cc5d65870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205640 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 An*aa+ diff --git a/RSwitch/c/procHelper.h b/RSwitch/c/procHelper.h deleted file mode 100644 index b39a741..0000000 --- a/RSwitch/c/procHelper.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// procHelper.h -// RSwitch -// -// Created by hrbrmstr on 8/25/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -#ifndef procHelper_h -#define procHelper_h - -#include -#include "procHelper.h" -#include "procInfo.h" -#import - -NSMutableArray *getArgs(pid_t pid); - -#endif /* procHelper_h */ diff --git a/RSwitch/c/procHelper.m b/RSwitch/c/procHelper.m deleted file mode 100644 index 72034b6..0000000 --- a/RSwitch/c/procHelper.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// procHelper.c -// RSwitch -// -// Created by hrbrmstr on 8/25/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -#include "procHelper.h" -#include "procInfo.h" -#import - -NSMutableArray *getArgs(pid_t pid) { - - Process* process = [[Process alloc] init:pid]; - return(process.arguments); - -} diff --git a/RSwitch/c/procInfo.h b/RSwitch/c/procInfo.h deleted file mode 100644 index 2d22215..0000000 --- a/RSwitch/c/procInfo.h +++ /dev/null @@ -1,205 +0,0 @@ -// -// File: procInfo.h -// Project: Proc Info -// -// Created by: Patrick Wardle -// Copyright: 2017 Objective-See -// License: Creative Commons Attribution-NonCommercial 4.0 International License -// - -#ifndef procInfo_h -#define procInfo_h - -#import -#import -#import - -/* CLASSES */#import - - -@class Binary; -@class Process; - -/* DEFINES */ - -//from audit_kevents.h -#define EVENT_EXIT 1 -#define EVENT_FORK 2 -#define EVENT_EXECVE 23 -#define EVENT_EXEC 27 -#define EVENT_SPAWN 43190 - -//signers -enum Signer{None, Apple, AppStore, DevID, AdHoc}; - -//signature status -#define KEY_SIGNATURE_STATUS @"signatureStatus" - -//signer -#define KEY_SIGNATURE_SIGNER @"signatureSigner" - -//signing auths -#define KEY_SIGNATURE_AUTHORITIES @"signatureAuthorities" - -//code signing id -#define KEY_SIGNATURE_IDENTIFIER @"signatureIdentifier" - -//entitlements -#define KEY_SIGNATURE_ENTITLEMENTS @"signatureEntitlements" - -/* TYPEDEFS */ - -//block for library -typedef void (^ProcessCallbackBlock)(Process* _Nonnull); - -/* OBJECT: PROCESS INFO */ - -@interface ProcInfo : NSObject - -//init w/ flag -// flag dictates if CPU-intensive logic (code signing, etc) should be preformed --(id _Nullable)init:(BOOL)goEasy; - -//start monitoring --(void)start:(ProcessCallbackBlock _Nonnull )callback; - -//stop monitoring --(void)stop; - -//get list of running processes --(NSMutableArray* _Nonnull)currentProcesses; - -@end - -/* OBJECT: PROCESS */ - -@interface Process : NSObject - -/* PROPERTIES */ - -//pid -@property pid_t pid; - -//ppid -@property pid_t ppid; - -//user id -@property uid_t uid; - -//type -// used by process mon -@property u_int16_t type; - -//exit code -@property u_int32_t exit; - -//path -@property(nonatomic, retain)NSString* _Nullable path; - -//args -@property(nonatomic, retain)NSMutableArray* _Nonnull arguments; - -//ancestors -@property(nonatomic, retain)NSMutableArray* _Nonnull ancestors; - -//signing info -@property(nonatomic, retain)NSMutableDictionary* _Nonnull signingInfo; - -//Binary object -// has path, hash, etc -@property(nonatomic, retain)Binary* _Nonnull binary; - -//timestamp -@property(nonatomic, retain)NSDate* _Nonnull timestamp; - -/* METHODS */ - -//init with a pid -// method will then (try) fill out rest of object --(id _Nullable)init:(pid_t)processID; - -//generate signing info -// also classifies if Apple/from App Store/etc. --(void)generateSigningInfo:(SecCSFlags)flags; - -//set process's path --(void)pathFromPid; - -//generate list of ancestors --(void)enumerateAncestors; - -//class method -// get's parent of arbitrary process -+(pid_t)getParentID:(pid_t)child; - -@end - -/* OBJECT: BINARY */ - -@interface Binary : NSObject -{ - -} - -/* PROPERTIES */ - -//path -@property(nonatomic, retain)NSString* _Nonnull path; - -//name -@property(nonatomic, retain)NSString* _Nonnull name; - -//icon -@property(nonatomic, retain)NSImage* _Nonnull icon; - -//file attributes -@property(nonatomic, retain)NSDictionary* _Nullable attributes; - -//spotlight meta data -@property(nonatomic, retain)NSDictionary* _Nullable metadata; - -//bundle -// nil for non-apps -@property(nonatomic, retain)NSBundle* _Nullable bundle; - -//signing info -@property(nonatomic, retain)NSDictionary* _Nonnull signingInfo; - -//hash -@property(nonatomic, retain)NSMutableString* _Nonnull sha256; - -//identifier -// either signing id or sha256 hash -@property(nonatomic, retain)NSString* _Nonnull identifier; - -/* METHODS */ - -//init w/ a path --(id _Nonnull)init:(NSString* _Nonnull)path; - -/* the following methods are rather CPU-intensive - as such, if the proc monitoring is run with the 'goEasy' option, they aren't automatically invoked -*/ - -//get an icon for a process -// for apps, this will be app's icon, otherwise just a standard system one --(void)getIcon; - -//generate signing info (statically) --(void)generateSigningInfo:(SecCSFlags)flags; - -/* the following methods are not invoked automatically - as such, if you code has to manually invoke them if you want this info - */ - -//generate hash -// algo: sha256 --(void)generateHash; - -//generate id -// either signing id, or sha256 hash --(void)generateIdentifier; - -@end - -#endif diff --git a/RSwitch/c/swift/AboutViewController.swift b/RSwitch/c/swift/AboutViewController.swift deleted file mode 100644 index d228d54..0000000 --- a/RSwitch/c/swift/AboutViewController.swift +++ /dev/null @@ -1,10 +0,0 @@ - -import Cocoa - -class AboutViewController: NSViewController { - - override func viewDidLoad() { - super.viewDidLoad() - } - -} diff --git a/RSwitch/c/swift/Alerts.swift b/RSwitch/c/swift/Alerts.swift deleted file mode 100644 index 48a8936..0000000 --- a/RSwitch/c/swift/Alerts.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// Alerts.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -// Show an informational alert -public func infoAlert(_ message: String, _ extra: String? = nil, style: NSAlert.Style = NSAlert.Style.informational) { - let alert = NSAlert() - alert.messageText = message - if extra != nil { alert.informativeText = extra! } - alert.alertStyle = style - alert.runModal() -} - -// Show an informational alert and then quit -public func quitAlert(_ message: String, _ extra: String? = nil) { - infoAlert(message, "The application will now quit.", style: NSAlert.Style.critical) - NSApp.terminate(nil) -} diff --git a/RSwitch/c/swift/AppDelegate.swift b/RSwitch/c/swift/AppDelegate.swift deleted file mode 100644 index 49a2b09..0000000 --- a/RSwitch/c/swift/AppDelegate.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Cocoa - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - - var mainStoryboard: NSStoryboard! - var abtController: NSWindowController! - - let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - let statusMenu = NSMenu() - let quitItem = NSMenuItem(title: NSLocalizedString("Quit", comment: "Quit menu item"), action: #selector(NSApp.terminate), keyEquivalent: "q") - - var rdevel_enabled: Bool! - var rstudio_enabled: Bool! - - override init() { - - super.init() - - statusMenu.delegate = self - - // dial by IconMark from the Noun Project - statusItem.button?.image = #imageLiteral(resourceName: "RSwitch") - statusItem.menu = statusMenu - - mainStoryboard = NSStoryboard(name: "Main", bundle: nil) - abtController = (mainStoryboard.instantiateController(withIdentifier: "aboutPanelController") as! NSWindowController) - - rdevel_enabled = true - rstudio_enabled = true - - URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) - - } - - func applicationDidFinishLaunching(_ aNotification: Notification) { } - - func applicationWillTerminate(_ aNotification: Notification) { } - -} diff --git a/RSwitch/c/swift/Bundle.swift b/RSwitch/c/swift/Bundle.swift deleted file mode 100644 index 8d2c31d..0000000 --- a/RSwitch/c/swift/Bundle.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// Bundle.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation - -extension Bundle { - var releaseVersionNumber: String? { - return infoDictionary?["CFBundleShortVersionString"] as? String - } - var buildVersionNumber: String? { - return infoDictionary?["CFBundleVersion"] as? String - } - var releaseVersionNumberPretty: String { - return "v\(releaseVersionNumber ?? "1.0.0")" - } -} diff --git a/RSwitch/c/swift/DownloadRStudio.swift b/RSwitch/c/swift/DownloadRStudio.swift deleted file mode 100644 index ffa7c43..0000000 --- a/RSwitch/c/swift/DownloadRStudio.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// DownloadRStudio.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa -import SwiftSoup - -extension AppDelegate { - - // Download latest rstudio daily build - @objc func download_latest_rstudio(_ sender: NSMenuItem?) { - - self.rstudio_enabled = false - - let url = URL(string: app_urls.rstudio_dailies) - - do { - - let html = try String.init(contentsOf: url!) - let document = try SwiftSoup.parse(html) - - let link = try document.select("td > a").first! - let href = try link.attr("href") - let dlurl = URL(string: href)! - let dldir = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! - var dlfile = dldir - - dlfile.appendPathComponent(dlurl.lastPathComponent) - - print("RStudio href: " + href) - - if (FileManager.default.fileExists(atPath: dlfile.relativePath)) { - - self.notifyUser(title: "Action required", subtitle: "RStudio Download", text: "A local copy of the latest RStudio daily already exists. Please remove or rename it if you wish to re-download it.") - - NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") - NSWorkspace.shared.activateFileViewerSelecting([dlfile]) - - self.rstudio_enabled = true - - } else { - - print("Timeout value: ", URLSession.shared.configuration.timeoutIntervalForRequest) - - let task = URLSession.shared.downloadTask(with: dlurl) { - tempURL, response, error in - - if (error != nil) { - self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error: " + error!.localizedDescription) - } else if (response != nil) { - - let status = (response as? HTTPURLResponse)!.statusCode - if (status < 300) { - - guard let fileURL = tempURL else { - DispatchQueue.main.async { [weak self] in self?.rstudio_enabled = true } - return - } - - do { - try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) - try FileManager.default.moveItem(at: fileURL, to: dlfile) - self.notifyUser(title: "Success", subtitle: "RStudio Download", text: "Download of latest RStudio daily (" + dlurl.lastPathComponent + ") successful.") - NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") - NSWorkspace.shared.activateFileViewerSelecting([dlfile]) - } catch { - self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error: \(error)") - } - - } else { - self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error downloading latest RStudio daily. Status code: " + String(status)) - - } - } - - DispatchQueue.main.async { [weak self] in self?.rstudio_enabled = true } - - } - - task.resume() - } - - } catch { - self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error downloading and saving latest RStudio daily.") - } - - } - -} diff --git a/RSwitch/c/swift/DownloadTarball.swift b/RSwitch/c/swift/DownloadTarball.swift deleted file mode 100644 index 8cbda4b..0000000 --- a/RSwitch/c/swift/DownloadTarball.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// DownloadTarball.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -extension AppDelegate { - - // Download latest r-devel tarball - @objc func download_latest_tarball(_ sender: NSMenuItem?) { - - self.rdevel_enabled = false - - let dlurl = URL(string: "https://mac.r-project.org/el-capitan/R-devel/R-devel-el-capitan-sa-x86_64.tar.gz")! - let dldir = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! - var dlfile = dldir - - dlfile.appendPathComponent("R-devel-el-capitan-sa-x86_64.tar.gz") - - if (FileManager.default.fileExists(atPath: dlfile.relativePath)) { - - self.notifyUser(title: "Action required", subtitle: "r-devel Download", text: "R-devel tarball already exists. Please remove or rename it before downloading.") - - NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") - NSWorkspace.shared.activateFileViewerSelecting([dlfile]) - - self.rdevel_enabled = true - } else { - - let task = URLSession.shared.downloadTask(with: dlurl) { - tempURL, response, error in - - if (error != nil) { - self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error: " + error!.localizedDescription) - } else if (response != nil) { - - let status = (response as? HTTPURLResponse)!.statusCode - if (status < 300) { - - guard let fileURL = tempURL else { - DispatchQueue.main.async { [weak self] in self?.rdevel_enabled = true } - return - } - - do { - try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) - try FileManager.default.moveItem(at: fileURL, to: dlfile) - self.notifyUser(title: "Success", subtitle: "r-devel Download", text: "Download of latest r-devel (" + dlurl.lastPathComponent + ") successful.") - NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") - NSWorkspace.shared.activateFileViewerSelecting([dlfile]) - } catch { - self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error: \(error)") - } - - } else { - self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error downloading latest r-devel. Status code: " + String(status)) - } - } - - DispatchQueue.main.async { [weak self] in self?.rdevel_enabled = true } - - } - - task.resume() - } - - } - -} diff --git a/RSwitch/c/swift/HandleSwitch.swift b/RSwitch/c/swift/HandleSwitch.swift deleted file mode 100644 index 63ac002..0000000 --- a/RSwitch/c/swift/HandleSwitch.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// HandleSwitch.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -extension AppDelegate { - - struct app_dirs { - static let macos_r_framework = "/Library/Frameworks/R.framework/Versions" // Where the official R installs go - } - - // The core worker function. Receives the basename of the selected directory - // then removes the current alias and creates the new one. - @objc func handleSwitch(_ sender: NSMenuItem?) { - - let fm = FileManager.default; - let title = sender?.title - - do { - try fm.removeItem(atPath: app_dirs.macos_r_framework + "/" + "Current") - } catch { - self.notifyUser(title: "Action failed", text: "Failed to remove 'Current' alias" + app_dirs.macos_r_framework + "/" + "Current") - } - - do { - try fm.createSymbolicLink( - at: NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + "Current") as URL, - withDestinationURL: NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + title!) as URL - ) - self.notifyUser(title: "Success", text: "Current R version switched to " + title!) - } catch { - self.notifyUser(title: "Action failed", text: "Failed to create alias for " + app_dirs.macos_r_framework + "/" + title!) - } - - } - -} diff --git a/RSwitch/c/swift/HandleSwitchTo.swift b/RSwitch/c/swift/HandleSwitchTo.swift deleted file mode 100644 index 88bbf1a..0000000 --- a/RSwitch/c/swift/HandleSwitchTo.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// HandleSwitchTo.swift -// RSwitch -// -// Created by hrbrmstr on 8/25/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation - - -import Foundation -import Cocoa - -extension AppDelegate { - - @objc func switch_to(_ sender: NSMenuItem?) { - - let app = sender!.representedObject as! NSRunningApplication - - app.activate(options: NSApplication.ActivationOptions.activateIgnoringOtherApps) - - } - -} diff --git a/RSwitch/c/swift/HandleUpdate.swift b/RSwitch/c/swift/HandleUpdate.swift deleted file mode 100644 index 3063d6e..0000000 --- a/RSwitch/c/swift/HandleUpdate.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// HandleUpdate.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -extension AppDelegate { - - @objc func checkForUpdate(_ sender: NSMenuItem?) { - - let url = URL(string: app_urls.version_check) - - do { - URLCache.shared.removeAllCachedResponses() - var version = try String.init(contentsOf: url!) - version = version.trimmingCharacters(in: .whitespacesAndNewlines) - if (version.isVersion(greaterThan: Bundle.main.releaseVersionNumber!)) { - let url = URL(string: app_urls.releases) - NSWorkspace.shared.open(url!) - } else { - self.notifyUser(title: "RSwitch", text: "You are running the latest version of RSwitch.") - } - } catch { - self.notifyUser(title: "Action failed", subtitle: "Update check", text: "Error: \(error)") - } - - } - -} diff --git a/RSwitch/c/swift/Menu.swift b/RSwitch/c/swift/Menu.swift deleted file mode 100644 index 80ed839..0000000 --- a/RSwitch/c/swift/Menu.swift +++ /dev/null @@ -1,157 +0,0 @@ -// -// Menu.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -extension AppDelegate: NSMenuDelegate { - - func menuWillOpen(_ menu: NSMenu) { - - if (menu != self.statusMenu) { return } - - // clear the menu - menu.removeAllItems() - - // add selection to open frameworks dir in Finder - menu.addItem(NSMenuItem(title: "Open R Frameworks Directory", action: #selector(openFrameworksDir), keyEquivalent: "")) - menu.addItem(NSMenuItem.separator()) - - menu.addItem(NSMenuItem(title: "Current R Version:", action: nil, keyEquivalent: "")) - - // populate installed versions - let fm = FileManager.default - var targetPath:String? = nil - - do { - - // gets a directory listing - let entries = try fm.contentsOfDirectory(atPath: app_dirs.macos_r_framework) - - // retrieves all versions (excludes hidden files and the Current alias - let versions = entries.sorted().filter { !($0.hasPrefix(".")) && !($0 == "Current") } - let hasCurrent = entries.filter { $0 == "Current" } - - // if there was a Current alias (prbly shld alert if not) - if (hasCurrent.count > 0) { - - // get where Current points to - let furl = NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + "Current") - - if (furl.fileReferenceURL() != nil) { - do { - let fdat = try NSURL(resolvingAliasFileAt: furl as URL, options: []) - targetPath = fdat.lastPathComponent! - } catch { - targetPath = furl.path - } - } - - // populate menu items with all installed R versions, ensuring we - // put a checkbox next to the one that is Current - var i = 1 - for version in versions { - let keynum = (i < 10) ? String(i) : "" - let item = NSMenuItem(title: version, action: #selector(handleSwitch), keyEquivalent: keynum) - item.isEnabled = true - if (version == targetPath) { item.state = NSControl.StateValue.on } - item.representedObject = version - menu.addItem(item) - i = i + 1 - } - - } - - } catch { - quitAlert("Failed to list contents of R framework directory. You either do not have R installed or have incorrect permissions set on " + app_dirs.macos_r_framework) - } - - // Add items to download latest r-devel tarball and latest macOS daily - menu.addItem(NSMenuItem.separator()) - - let rdevelItem = NSMenuItem(title: NSLocalizedString("Download latest R-devel tarball", comment: "Download latest tarball item"), action: self.rdevel_enabled ? #selector(download_latest_tarball) : nil, keyEquivalent: "") - rdevelItem.isEnabled = self.rdevel_enabled - menu.addItem(rdevelItem) - - let rstudioItem = NSMenuItem(title: NSLocalizedString("Download latest RStudio daily build", comment: "Download latest RStudio item"), action: self.rstudio_enabled ? #selector(download_latest_rstudio) : nil, keyEquivalent: "") - rstudioItem.isEnabled = self.rstudio_enabled - menu.addItem(rstudioItem) - - // Add items to open variosu R for macOS pages - - menu.addItem(NSMenuItem.separator()) - - let webDropdown = NSMenuItem(title: "Web resources", action: nil, keyEquivalent: "") - let webSub = NSMenu() - - menu.addItem(webDropdown) - menu.setSubmenu(webSub, for: webDropdown) - - webSub.addItem(NSMenuItem(title: NSLocalizedString("R for macOS Developers…", comment: "macOS Dev Page item"), action: #selector(browse_r_macos_dev_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("R for macOS CRAN…", comment: "macOS CRAN Page item"), action: #selector(browse_r_macos_cran_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("R-SIG-Mac Archives…", comment: "R-SIG-Mac Page item"), action: #selector(browse_r_sig_mac_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("R-devel News…", comment: "R-devel News Page item"), action: #selector(browse_r_devel_news_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("R Installation/Admin macOS Section…", comment: "R Install Page item"), action: #selector(browse_r_admin_macos_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem.separator()) - webSub.addItem(NSMenuItem(title: NSLocalizedString("RStudio macOS Dailies…", comment: "RStudio macOS Dailies Page item"), action: #selector(browse_rstudio_mac_dailies_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("R StackOverflow…", comment: "R StackOverflow Page item"), action: #selector(browse_r_stackoverflow_page), keyEquivalent: "")) - webSub.addItem(NSMenuItem(title: NSLocalizedString("RStudio Community…", comment: "RStudio Community Page item"), action: #selector(browse_rstudio_community_page), keyEquivalent: "")) - - let running_rstudios = NSWorkspace.shared.runningApplications.filter { - $0.bundleIdentifier == "org.rstudio.RStudio" - } - - let running_rapps = NSWorkspace.shared.runningApplications.filter { - $0.bundleIdentifier == "org.R-project.R" - } - - if ((running_rstudios.count) + (running_rapps.count) > 0) { - - menu.addItem(NSMenuItem.separator()) - - let switchToDropdown = NSMenuItem(title: "Switch to", action: nil, keyEquivalent: "") - let switchToSub = NSMenu() - - menu.addItem(switchToDropdown) - menu.setSubmenu(switchToSub, for: switchToDropdown) - - for app in running_rstudios + running_rapps { - let args = getArgs(app.processIdentifier)! - let title = app.localizedName! + (args.count > 1 ? " : " + (args[1] as! NSString).lastPathComponent.replacingOccurrences(of: ".Rproj", with: "") : "") - let mi = NSMenuItem(title: title, action: #selector(switch_to), keyEquivalent: "") - - mi.representedObject = app - switchToSub.addItem(mi) - } - - } - - // Add launchers - menu.addItem(NSMenuItem.separator()) - - let launch_r = "Launch R GUI" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "") - let launch_rstudio = "Launch RStudio" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "") - - menu.addItem(NSMenuItem(title: NSLocalizedString(launch_r, comment: "Launch R GUI item"), action: #selector(launchRApp), keyEquivalent: "")) - menu.addItem(NSMenuItem(title: NSLocalizedString(launch_rstudio, comment: "Launch RStudio item"), action: #selector(launchRStudio), keyEquivalent: "")) - - // Add a About item - menu.addItem(NSMenuItem.separator()) - menu.addItem(NSMenuItem(title: NSLocalizedString("Check for update…", comment: "Check for update item"), action: #selector(checkForUpdate), keyEquivalent: "")) - - // Add a About item - menu.addItem(NSMenuItem.separator()) - menu.addItem(NSMenuItem(title: NSLocalizedString("About RSwitch…", comment: "About menu item"), action: #selector(about), keyEquivalent: "")) - - // Add a Quit item - menu.addItem(NSMenuItem.separator()) - menu.addItem(quitItem) - - } - -} diff --git a/RSwitch/c/swift/Notify.swift b/RSwitch/c/swift/Notify.swift deleted file mode 100644 index 08bc0a6..0000000 --- a/RSwitch/c/swift/Notify.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Notify.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -extension AppDelegate : NSUserNotificationCenterDelegate { - - func notifyUser(title: String? = nil, subtitle: String? = nil, text: String? = nil) -> Void { - - let notification = NSUserNotification() - - notification.title = title - notification.subtitle = subtitle - notification.informativeText = text - - notification.soundName = NSUserNotificationDefaultSoundName - - NSUserNotificationCenter.default.delegate = self - NSUserNotificationCenter.default.deliver(notification) - - } - - func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool { - return true - } - -} diff --git a/RSwitch/c/swift/String+Version.swift b/RSwitch/c/swift/String+Version.swift deleted file mode 100644 index 312bb6e..0000000 --- a/RSwitch/c/swift/String+Version.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// String+Version.swift -// Pods -// -// Created by DragonCherry on 5/11/17. -// -// - -import Foundation - -extension String { - - /// Inner comparison utility to handle same versions with different length. (Ex: "1.0.0" & "1.0") - private func compare(toVersion targetVersion: String) -> ComparisonResult { - - let versionDelimiter = "." - var result: ComparisonResult = .orderedSame - var versionComponents = components(separatedBy: versionDelimiter) - var targetComponents = targetVersion.components(separatedBy: versionDelimiter) - let spareCount = versionComponents.count - targetComponents.count - - if spareCount == 0 { - result = compare(targetVersion, options: .numeric) - } else { - let spareZeros = repeatElement("0", count: abs(spareCount)) - if spareCount > 0 { - targetComponents.append(contentsOf: spareZeros) - } else { - versionComponents.append(contentsOf: spareZeros) - } - result = versionComponents.joined(separator: versionDelimiter) - .compare(targetComponents.joined(separator: versionDelimiter), options: .numeric) - } - return result - } - - public func isVersion(equalTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedSame } - public func isVersion(greaterThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedDescending } - public func isVersion(greaterThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedAscending } - public func isVersion(lessThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedAscending } - public func isVersion(lessThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedDescending } -} diff --git a/RSwitch/c/swift/Utils.swift b/RSwitch/c/swift/Utils.swift deleted file mode 100644 index 35291f6..0000000 --- a/RSwitch/c/swift/Utils.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// Utils.swift -// RSwitch -// -// Created by hrbrmstr on 8/24/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Foundation -import Cocoa - -public func browse(_ urlString : String) { - let url = URL(string: urlString)! - NSWorkspace.shared.open(url) -} - -extension AppDelegate { - - struct app_urls { - static let mac_r_project = "https://mac.r-project.org/" - static let macos_cran = "https://cran.rstudio.org/bin/macosx/" - static let r_sig_mac = "https://stat.ethz.ch/pipermail/r-sig-mac/" - static let rstudio_dailies = "https://dailies.rstudio.com/rstudio/oss/mac/" - static let latest_rstudio_dailies = "https://www.rstudio.org/download/latest/daily/desktop/mac/RStudio-latest.dmg" - static let r_admin_macos = "https://cran.rstudio.org/doc/manuals/R-admin.html#Installing-R-under-macOS" - static let r_devel_news = "https://developer.r-project.org/blosxom.cgi/R-devel/NEWS" - static let r_stackoverflow = "https://stackoverflow.com/questions/tagged/r" - static let rstudio_community = "https://community.rstudio.com/" - static let version_check = "https://rud.is/rswitch/releases/current-version.txt" - static let releases = "https://git.rud.is/hrbrmstr/RSwitch/releases" - } - - @objc func browse_r_macos_dev_page(_ sender: NSMenuItem?) { browse(app_urls.mac_r_project) } - @objc func browse_r_macos_cran_page(_ sender: NSMenuItem?) { browse(app_urls.macos_cran) } - @objc func browse_r_sig_mac_page(_ sender: NSMenuItem?) { browse(app_urls.r_sig_mac) } - @objc func browse_rstudio_mac_dailies_page(_ sender: NSMenuItem?) { browse(app_urls.rstudio_dailies) } - @objc func browse_r_admin_macos_page(_ sender: NSMenuItem?) { browse(app_urls.r_admin_macos) } - @objc func browse_r_devel_news_page(_ sender: NSMenuItem?) { browse(app_urls.r_devel_news) } - @objc func browse_r_stackoverflow_page(_ sender: NSMenuItem?) { browse(app_urls.r_stackoverflow) } - @objc func browse_rstudio_community_page(_ sender: NSMenuItem?) { browse(app_urls.rstudio_community) } - - // Show about dialog - @objc func about(_ sender: NSMenuItem?) { abtController.showWindow(self) } - - // Show the framework dir in a new Finder window - @objc func openFrameworksDir(_ sender: NSMenuItem?) { NSWorkspace.shared.openFile(app_dirs.macos_r_framework, withApplication: "Finder") } - - // Launch RStudio - @objc func launchRStudio(_ sender: NSMenuItem?) { - if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) { - NSWorkspace.shared.launchApplication(withBundleIdentifier: "org.rstudio.RStudio", options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil) - } else { - NSWorkspace.shared.launchApplication("RStudio.app") - } - } - - // Launch R.app - @objc func launchRApp(_ sender: NSMenuItem?) { - if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) { - NSWorkspace.shared.launchApplication(withBundleIdentifier: "org.R-project.R", options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil) - } else { - NSWorkspace.shared.launchApplication("R.app") - } - } - -} diff --git a/RSwitch/c/swift/ViewController.swift b/RSwitch/c/swift/ViewController.swift deleted file mode 100644 index 43d1b53..0000000 --- a/RSwitch/c/swift/ViewController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// ViewController.swift -// RSwitch -// -// Created by hrbrmstr on 8/22/19. -// Copyright © 2019 Bob Rudis. All rights reserved. -// - -import Cocoa - -class ViewController: NSViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - override var representedObject: Any? { - didSet { - // Update the view, if already loaded. - } - } - - -} - diff --git a/RSwitch/swift/AboutViewController.swift b/RSwitch/swift/AboutViewController.swift new file mode 100644 index 0000000..862cc82 --- /dev/null +++ b/RSwitch/swift/AboutViewController.swift @@ -0,0 +1,17 @@ + +import Cocoa + +extension AppDelegate { + + // Show about dialog + @objc func about(_ sender: NSMenuItem?) { abtController.showWindow(self) } + +} + +class AboutViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + } + +} diff --git a/RSwitch/swift/AppAlerts/AppAlerts.swift b/RSwitch/swift/AppAlerts/AppAlerts.swift new file mode 100644 index 0000000..416e20a --- /dev/null +++ b/RSwitch/swift/AppAlerts/AppAlerts.swift @@ -0,0 +1,27 @@ +// +// AppAlerts.swift +// RSwitch +// +// Created by hrbrmstr on 8/30/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +public class AppAlerts { + // Show an informational alert + public static func infoAlert(_ message: String, _ extra: String? = nil, style: NSAlert.Style = NSAlert.Style.informational) { + let alert = NSAlert() + alert.messageText = message + if extra != nil { alert.informativeText = extra! } + alert.alertStyle = style + alert.runModal() + } + + // Show an informational alert and then quit + public static func quitAlert(_ message: String, _ extra: String? = nil) { + infoAlert(message, "The application will now quit.", style: NSAlert.Style.critical) + NSApp.terminate(nil) + } +} diff --git a/RSwitch/swift/AppDelegate.swift b/RSwitch/swift/AppDelegate.swift new file mode 100644 index 0000000..6a5015c --- /dev/null +++ b/RSwitch/swift/AppDelegate.swift @@ -0,0 +1,39 @@ +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + var mainStoryboard: NSStoryboard! + var abtController: NSWindowController! + + let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + let statusMenu = NSMenu(title: "RSwitch") + + var rdevel_enabled: Bool! + var rstudio_enabled: Bool! + + override init() { + + super.init() + + statusMenu.delegate = self + + // dial by IconMark from the Noun Project + statusItem.button?.image = #imageLiteral(resourceName: "RSwitch") + statusItem.menu = statusMenu + + mainStoryboard = NSStoryboard(name: "Main", bundle: nil) + abtController = (mainStoryboard.instantiateController(withIdentifier: "aboutPanelController") as! NSWindowController) + + rdevel_enabled = true + rstudio_enabled = true + + URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) + + } + + func applicationDidFinishLaunching(_ aNotification: Notification) { } + + func applicationWillTerminate(_ aNotification: Notification) { } + +} diff --git a/RSwitch/swift/Downloaders/DownloadRStudio.swift b/RSwitch/swift/Downloaders/DownloadRStudio.swift new file mode 100644 index 0000000..af912eb --- /dev/null +++ b/RSwitch/swift/Downloaders/DownloadRStudio.swift @@ -0,0 +1,94 @@ +// +// DownloadRStudio.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa +import SwiftSoup + +extension AppDelegate { + + // Download latest rstudio daily build + @objc func download_latest_rstudio(_ sender: NSMenuItem?) { + + self.rstudio_enabled = false + + let url = URL(string: app_urls.rstudio_dailies) + + do { + + let html = try String.init(contentsOf: url!) + let document = try SwiftSoup.parse(html) + + let link = try document.select("td > a").first! + let href = try link.attr("href") + let dlurl = URL(string: href)! + let dldir = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! + var dlfile = dldir + + dlfile.appendPathComponent(dlurl.lastPathComponent) + + print("RStudio href: " + href) + + if (FileManager.default.fileExists(atPath: dlfile.relativePath)) { + + self.notifyUser(title: "Action required", subtitle: "RStudio Download", text: "A local copy of the latest RStudio daily already exists. Please remove or rename it if you wish to re-download it.") + + NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") + NSWorkspace.shared.activateFileViewerSelecting([dlfile]) + + self.rstudio_enabled = true + + } else { + + print("Timeout value: ", URLSession.shared.configuration.timeoutIntervalForRequest) + + let task = URLSession.shared.downloadTask(with: dlurl) { + tempURL, response, error in + + if (error != nil) { + self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error: " + error!.localizedDescription) + } else if (response != nil) { + + let status = (response as? HTTPURLResponse)!.statusCode + if (status < 300) { + + guard let fileURL = tempURL else { + DispatchQueue.main.async { [weak self] in self?.rstudio_enabled = true } + return + } + + do { + try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) + try FileManager.default.moveItem(at: fileURL, to: dlfile) + self.notifyUser(title: "Success", subtitle: "RStudio Download", text: "Download of latest RStudio daily (" + dlurl.lastPathComponent + ") successful.") + NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") + NSWorkspace.shared.activateFileViewerSelecting([dlfile]) + } catch { + self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error: \(error)") + } + + } else { + self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error downloading latest RStudio daily. Status code: " + String(status)) + + } + } + + DispatchQueue.main.async { [weak self] in self?.rstudio_enabled = true } + + } + + task.resume() + } + + } catch { + self.notifyUser(title: "Action failed", subtitle: "RStudio Download", text: "Error downloading and saving latest RStudio daily.") + } + + } + +} diff --git a/RSwitch/swift/Downloaders/DownloadTarball.swift b/RSwitch/swift/Downloaders/DownloadTarball.swift new file mode 100644 index 0000000..9bc0c93 --- /dev/null +++ b/RSwitch/swift/Downloaders/DownloadTarball.swift @@ -0,0 +1,74 @@ +// +// DownloadTarball.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + // Download latest r-devel tarball + @objc func download_latest_tarball(_ sender: NSMenuItem?) { + + self.rdevel_enabled = false + + let dlurl = URL(string: "https://mac.r-project.org/el-capitan/R-devel/R-devel-el-capitan-sa-x86_64.tar.gz")! + let dldir = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! + var dlfile = dldir + + dlfile.appendPathComponent("R-devel-el-capitan-sa-x86_64.tar.gz") + + if (FileManager.default.fileExists(atPath: dlfile.relativePath)) { + + self.notifyUser(title: "Action required", subtitle: "r-devel Download", text: "R-devel tarball already exists. Please remove or rename it before downloading.") + + NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") + NSWorkspace.shared.activateFileViewerSelecting([dlfile]) + + self.rdevel_enabled = true + } else { + + let task = URLSession.shared.downloadTask(with: dlurl) { + tempURL, response, error in + + if (error != nil) { + self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error: " + error!.localizedDescription) + } else if (response != nil) { + + let status = (response as? HTTPURLResponse)!.statusCode + if (status < 300) { + + guard let fileURL = tempURL else { + DispatchQueue.main.async { [weak self] in self?.rdevel_enabled = true } + return + } + + do { + try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) + try FileManager.default.moveItem(at: fileURL, to: dlfile) + self.notifyUser(title: "Success", subtitle: "r-devel Download", text: "Download of latest r-devel (" + dlurl.lastPathComponent + ") successful.") + NSWorkspace.shared.openFile(dldir.path, withApplication: "Finder") + NSWorkspace.shared.activateFileViewerSelecting([dlfile]) + } catch { + self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error: \(error)") + } + + } else { + self.notifyUser(title: "Action failed", subtitle: "r-devel Download", text: "Error downloading latest r-devel. Status code: " + String(status)) + } + } + + DispatchQueue.main.async { [weak self] in self?.rdevel_enabled = true } + + } + + task.resume() + } + + } + +} diff --git a/RSwitch/swift/HandleRSwitch.swift b/RSwitch/swift/HandleRSwitch.swift new file mode 100644 index 0000000..c1546d7 --- /dev/null +++ b/RSwitch/swift/HandleRSwitch.swift @@ -0,0 +1,43 @@ +// +// HandleRSwitch.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + struct app_dirs { + static let macos_r_framework = "/Library/Frameworks/R.framework/Versions" // Where the official R installs go + } + + // The core worker function. Receives the basename of the selected directory + // then removes the current alias and creates the new one. + @objc func handleRSwitch(_ sender: NSMenuItem?) { + + let fm = FileManager.default; + let title = sender?.title + + do { + try fm.removeItem(atPath: app_dirs.macos_r_framework + "/" + "Current") + } catch { + self.notifyUser(title: "Action failed", text: "Failed to remove 'Current' alias" + app_dirs.macos_r_framework + "/" + "Current") + } + + do { + try fm.createSymbolicLink( + at: NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + "Current") as URL, + withDestinationURL: NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + title!) as URL + ) + self.notifyUser(title: "Success", text: "Current R version switched to " + title!) + } catch { + self.notifyUser(title: "Action failed", text: "Failed to create alias for " + app_dirs.macos_r_framework + "/" + title! + " (\(error))") + } + + } + +} diff --git a/RSwitch/swift/HandleSwitchTo.swift b/RSwitch/swift/HandleSwitchTo.swift new file mode 100644 index 0000000..88bbf1a --- /dev/null +++ b/RSwitch/swift/HandleSwitchTo.swift @@ -0,0 +1,25 @@ +// +// HandleSwitchTo.swift +// RSwitch +// +// Created by hrbrmstr on 8/25/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation + + +import Foundation +import Cocoa + +extension AppDelegate { + + @objc func switch_to(_ sender: NSMenuItem?) { + + let app = sender!.representedObject as! NSRunningApplication + + app.activate(options: NSApplication.ActivationOptions.activateIgnoringOtherApps) + + } + +} diff --git a/RSwitch/swift/HandleUpdate.swift b/RSwitch/swift/HandleUpdate.swift new file mode 100644 index 0000000..3063d6e --- /dev/null +++ b/RSwitch/swift/HandleUpdate.swift @@ -0,0 +1,34 @@ +// +// HandleUpdate.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + @objc func checkForUpdate(_ sender: NSMenuItem?) { + + let url = URL(string: app_urls.version_check) + + do { + URLCache.shared.removeAllCachedResponses() + var version = try String.init(contentsOf: url!) + version = version.trimmingCharacters(in: .whitespacesAndNewlines) + if (version.isVersion(greaterThan: Bundle.main.releaseVersionNumber!)) { + let url = URL(string: app_urls.releases) + NSWorkspace.shared.open(url!) + } else { + self.notifyUser(title: "RSwitch", text: "You are running the latest version of RSwitch.") + } + } catch { + self.notifyUser(title: "Action failed", subtitle: "Update check", text: "Error: \(error)") + } + + } + +} diff --git a/RSwitch/swift/Menu.swift b/RSwitch/swift/Menu.swift new file mode 100644 index 0000000..82b1f90 --- /dev/null +++ b/RSwitch/swift/Menu.swift @@ -0,0 +1,64 @@ +// +// Menu.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate: NSMenuDelegate { + + func menuWillOpen(_ menu: NSMenu) { + + if (menu != self.statusMenu) { return } + + // clear the menu + menu.removeAllItems() + + // add selection to open frameworks dir in Finder + menu.addItem(NSMenuItem(title: "Open R Frameworks Directory", action: #selector(openFrameworksDir), keyEquivalent: "")) + menu.addItem(NSMenuItem.separator()) + + menu.addItem(NSMenuItem(title: "Current R Version:", action: nil, keyEquivalent: "")) + + // populate installed versions + populateRVersionsMenu(menu: menu) + + // Add items to download latest r-devel tarball and latest macOS daily + menu.addItem(NSMenuItem.separator()) + + let rdevelItem = NSMenuItem(title: NSLocalizedString("Download latest R-devel tarball", comment: "Download latest tarball item"), action: self.rdevel_enabled ? #selector(download_latest_tarball) : nil, keyEquivalent: "") + rdevelItem.isEnabled = self.rdevel_enabled + menu.addItem(rdevelItem) + + let rstudioItem = NSMenuItem(title: NSLocalizedString("Download latest RStudio daily build", comment: "Download latest RStudio item"), action: self.rstudio_enabled ? #selector(download_latest_rstudio) : nil, keyEquivalent: "") + rstudioItem.isEnabled = self.rstudio_enabled + menu.addItem(rstudioItem) + + // Add items to open variosu R for macOS pages + BrowseMenuAction.populateWebItems(menu: menu) + + // Add running apps + populateRunningApps(menu: menu) + + // Add launchers + populateLaunchers(menu: menu) + + // Add a Check for update + menu.addItem(NSMenuItem.separator()) + menu.addItem(NSMenuItem(title: NSLocalizedString("Check for update…", comment: "Check for update item"), action: #selector(checkForUpdate), keyEquivalent: "")) + + // Add an About item + menu.addItem(NSMenuItem.separator()) + menu.addItem(NSMenuItem(title: NSLocalizedString("About RSwitch…", comment: "About menu item"), action: #selector(about), keyEquivalent: "")) + + // Add a Quit item + menu.addItem(NSMenuItem.separator()) + menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApp.terminate), keyEquivalent: "q")) + + } + +} diff --git a/RSwitch/swift/MenuActions/BrowseMenuAction.swift b/RSwitch/swift/MenuActions/BrowseMenuAction.swift new file mode 100644 index 0000000..2f97595 --- /dev/null +++ b/RSwitch/swift/MenuActions/BrowseMenuAction.swift @@ -0,0 +1,74 @@ +// +// MenuAction.swift +// RSwitch +// +// Created by hrbrmstr on 8/30/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + @objc func browseFromMenu(_ sender: NSMenuItem) { + let url = (sender.representedObject as! BrowseMenuAction).url + NSWorkspace.shared.open(url) + } + +} + +class BrowseMenuAction { + + public var title : String + public var selector : Selector + public var keyEquivalent : String + public var url : URL + + private static let webItemsR = [ + BrowseMenuAction(title: "R for macOS Developer's…", url: "https://mac.r-project.org/"), + BrowseMenuAction(title: "R for macOS CRAN…", url: "https://cran.rstudio.org/bin/macosx/"), + BrowseMenuAction(title: "R-SIG-Mac Archives…", url: "https://stat.ethz.ch/pipermail/r-sig-mac/"), + BrowseMenuAction(title: "R-devel News…", url: "https://developer.r-project.org/blosxom.cgi/R-devel/NEWS"), + BrowseMenuAction(title: "R Installation/Admin macOS Section…", url: "https://cran.rstudio.org/doc/manuals/R-admin.html#Installing-R-under-macOS"), + ] + + private static let webItemsExt = [ + BrowseMenuAction(title: "RStudio macOS Dailies…", url: "https://dailies.rstudio.com/rstudio/oss/mac/"), + BrowseMenuAction(title: "R StackOverflow…", url: "https://stackoverflow.com/questions/tagged/r"), + BrowseMenuAction(title: "RStudio Community…", url: "https://community.rstudio.com/") + ] + + init(title: String, url: String, selector: String = "browseFromMenu", keyEquivalent: String = "") { + self.title = title + self.url = URL(string: url)! + self.selector = Selector((selector+":")) + self.keyEquivalent = keyEquivalent + print(self.selector) + } + + public func asMenuItem() -> NSMenuItem { + let mi = NSMenuItem(title: title, action: selector, keyEquivalent: keyEquivalent) + mi.representedObject = self + return(mi) + } + + public static func populateWebItems(menu : NSMenu) { + + menu.addItem(NSMenuItem.separator()) + + let webDropdown = NSMenuItem(title: "Web resources", action: nil, keyEquivalent: "") + let webSub = NSMenu() + + menu.addItem(webDropdown) + menu.setSubmenu(webSub, for: webDropdown) + for item in webItemsR { webSub.addItem(item.asMenuItem()) } + + webSub.addItem(NSMenuItem.separator()) + for item in webItemsExt { webSub.addItem(item.asMenuItem()) } + + } + + +} + diff --git a/RSwitch/swift/Notify.swift b/RSwitch/swift/Notify.swift new file mode 100644 index 0000000..659d117 --- /dev/null +++ b/RSwitch/swift/Notify.swift @@ -0,0 +1,33 @@ +// +// Notify.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate : NSUserNotificationCenterDelegate { + + func notifyUser(title: String? = nil, subtitle: String? = nil, text: String? = nil) -> Void { + + let notification = NSUserNotification() + + notification.title = title + notification.subtitle = subtitle + notification.informativeText = text + + notification.soundName = NSUserNotificationDefaultSoundName + + NSUserNotificationCenter.default.delegate = self + NSUserNotificationCenter.default.deliver(notification) + + } + + func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool { + return(true) + } + +} diff --git a/RSwitch/swift/String+Version/Bundle.swift b/RSwitch/swift/String+Version/Bundle.swift new file mode 100644 index 0000000..8d2c31d --- /dev/null +++ b/RSwitch/swift/String+Version/Bundle.swift @@ -0,0 +1,21 @@ +// +// Bundle.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation + +extension Bundle { + var releaseVersionNumber: String? { + return infoDictionary?["CFBundleShortVersionString"] as? String + } + var buildVersionNumber: String? { + return infoDictionary?["CFBundleVersion"] as? String + } + var releaseVersionNumberPretty: String { + return "v\(releaseVersionNumber ?? "1.0.0")" + } +} diff --git a/RSwitch/swift/String+Version/String+Version.swift b/RSwitch/swift/String+Version/String+Version.swift new file mode 100644 index 0000000..312bb6e --- /dev/null +++ b/RSwitch/swift/String+Version/String+Version.swift @@ -0,0 +1,42 @@ +// +// String+Version.swift +// Pods +// +// Created by DragonCherry on 5/11/17. +// +// + +import Foundation + +extension String { + + /// Inner comparison utility to handle same versions with different length. (Ex: "1.0.0" & "1.0") + private func compare(toVersion targetVersion: String) -> ComparisonResult { + + let versionDelimiter = "." + var result: ComparisonResult = .orderedSame + var versionComponents = components(separatedBy: versionDelimiter) + var targetComponents = targetVersion.components(separatedBy: versionDelimiter) + let spareCount = versionComponents.count - targetComponents.count + + if spareCount == 0 { + result = compare(targetVersion, options: .numeric) + } else { + let spareZeros = repeatElement("0", count: abs(spareCount)) + if spareCount > 0 { + targetComponents.append(contentsOf: spareZeros) + } else { + versionComponents.append(contentsOf: spareZeros) + } + result = versionComponents.joined(separator: versionDelimiter) + .compare(targetComponents.joined(separator: versionDelimiter), options: .numeric) + } + return result + } + + public func isVersion(equalTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedSame } + public func isVersion(greaterThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedDescending } + public func isVersion(greaterThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedAscending } + public func isVersion(lessThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedAscending } + public func isVersion(lessThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedDescending } +} diff --git a/RSwitch/swift/Utils/LaunchUtils.swift b/RSwitch/swift/Utils/LaunchUtils.swift new file mode 100644 index 0000000..3605fd2 --- /dev/null +++ b/RSwitch/swift/Utils/LaunchUtils.swift @@ -0,0 +1,51 @@ +// +// LaunchUtils.swift +// RSwitch +// +// Created by hrbrmstr on 8/30/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + struct bundleIds { + static let rstudio = "org.rstudio.RStudio" + static let r_base = "org.R-project.R" + } + + struct appNames { + static let R = "R.app" + static let RStudio = "RStudio.app" + } + + // Launch R.app + @objc func launchRApp(_ sender: NSMenuItem?) { + if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) { + NSWorkspace.shared.launchApplication(withBundleIdentifier: bundleIds.r_base, options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil) + } else { + NSWorkspace.shared.launchApplication(appNames.R) + } + } + // Launch RStudio + @objc func launchRStudio(_ sender: NSMenuItem?) { + if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) { + NSWorkspace.shared.launchApplication(withBundleIdentifier: bundleIds.rstudio, options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil) + } else { + NSWorkspace.shared.launchApplication(appNames.RStudio) + } + } + + func populateLaunchers(menu : NSMenu) { + menu.addItem(NSMenuItem.separator()) + + let launch_r = "Launch R GUI" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "") + let launch_rstudio = "Launch RStudio" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "") + + menu.addItem(NSMenuItem(title: launch_r, action: #selector(launchRApp), keyEquivalent: "")) + menu.addItem(NSMenuItem(title: launch_rstudio, action: #selector(launchRStudio), keyEquivalent: "")) + } + +} diff --git a/RSwitch/swift/Utils/Utils.swift b/RSwitch/swift/Utils/Utils.swift new file mode 100644 index 0000000..19f895c --- /dev/null +++ b/RSwitch/swift/Utils/Utils.swift @@ -0,0 +1,22 @@ +// +// Utils.swift +// RSwitch +// +// Created by hrbrmstr on 8/24/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + + +extension AppDelegate { + + struct app_urls { + static let rstudio_dailies = "https://dailies.rstudio.com/rstudio/oss/mac/" + static let latest_rstudio_dailies = "https://www.rstudio.org/download/latest/daily/desktop/mac/RStudio-latest.dmg" + static let version_check = "https://rud.is/rswitch/releases/current-version.txt" + static let releases = "https://git.rud.is/hrbrmstr/RSwitch/releases" + } + +} diff --git a/RSwitch/swift/Utils/Versions+RunningUtils.swift b/RSwitch/swift/Utils/Versions+RunningUtils.swift new file mode 100644 index 0000000..59e0844 --- /dev/null +++ b/RSwitch/swift/Utils/Versions+RunningUtils.swift @@ -0,0 +1,106 @@ +// +// VersionsUtils.swift +// RSwitch +// +// Created by hrbrmstr on 8/30/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Foundation +import Cocoa + +extension AppDelegate { + + // Show the framework dir in a new Finder window + @objc func openFrameworksDir(_ sender: NSMenuItem?) { + NSWorkspace.shared.openFile(app_dirs.macos_r_framework, withApplication: "Finder") + } + + func populateRVersionsMenu(menu : NSMenu) { + + let fm = FileManager.default + var targetPath:String? = nil + + do { + + // gets a directory listing + let entries = try fm.contentsOfDirectory(atPath: app_dirs.macos_r_framework) + + // retrieves all versions (excludes hidden files and the Current alias + let versions = entries.sorted().filter { !($0.hasPrefix(".")) && !($0 == "Current") } + let hasCurrent = entries.filter { $0 == "Current" } + + // if there was a Current alias (prbly shld alert if not) + if (hasCurrent.count > 0) { + + // get where Current points to + let furl = NSURL(fileURLWithPath: app_dirs.macos_r_framework + "/" + "Current") + + if (furl.fileReferenceURL() != nil) { + do { + let fdat = try NSURL(resolvingAliasFileAt: furl as URL, options: []) + targetPath = fdat.lastPathComponent! + } catch { + targetPath = furl.path + } + } + + // populate menu items with all installed R versions, ensuring we + // put a checkbox next to the one that is Current + var i = 1 + for version in versions { + let keynum = (i < 10) ? String(i) : "" + let item = NSMenuItem(title: version, action: #selector(handleRSwitch), keyEquivalent: keynum) + item.isEnabled = true + if (version == targetPath) { item.state = NSControl.StateValue.on } + item.representedObject = version + menu.addItem(item) + i = i + 1 + } + + } + + } catch { + AppAlerts.quitAlert("Failed to list contents of R framework directory. You either do not have R installed or have incorrect permissions set on " + app_dirs.macos_r_framework) + } + + } + + func populateRunningApps(menu : NSMenu) { + + // gather running RStudio instances + let running_rstudios = NSWorkspace.shared.runningApplications.filter { + $0.bundleIdentifier == bundleIds.rstudio + } + + // gather running R GUI instances + let running_rapps = NSWorkspace.shared.runningApplications.filter { + $0.bundleIdentifier == bundleIds.r_base + } + + // if we have any running instances of anything + if ((running_rstudios.count) + (running_rapps.count) > 0) { + + menu.addItem(NSMenuItem.separator()) + + let switchToDropdown = NSMenuItem(title: "Switch to", action: nil, keyEquivalent: "") + let switchToSub = NSMenu() + + menu.addItem(switchToDropdown) + menu.setSubmenu(switchToSub, for: switchToDropdown) + + // populate RStudio first (it'll be in launch order) then R GUI + for app in running_rstudios + running_rapps { + let args = getArgs(app.processIdentifier)! + let title = app.localizedName! + (args.count > 1 ? " : " + (args[1] as! NSString).lastPathComponent.replacingOccurrences(of: ".Rproj", with: "") : "") + let mi = NSMenuItem(title: title, action: #selector(switch_to), keyEquivalent: "") + + mi.representedObject = app + switchToSub.addItem(mi) + } + + } + + } + +} diff --git a/RSwitch/swift/ViewController.swift b/RSwitch/swift/ViewController.swift new file mode 100644 index 0000000..43d1b53 --- /dev/null +++ b/RSwitch/swift/ViewController.swift @@ -0,0 +1,27 @@ +// +// ViewController.swift +// RSwitch +// +// Created by hrbrmstr on 8/22/19. +// Copyright © 2019 Bob Rudis. All rights reserved. +// + +import Cocoa + +class ViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override var representedObject: Any? { + didSet { + // Update the view, if already loaded. + } + } + + +} + diff --git a/guide/.Rhistory b/guide/.Rhistory index e69de29..ccbe5e9 100644 --- a/guide/.Rhistory +++ b/guide/.Rhistory @@ -0,0 +1,6 @@ +library(tree) +install.packages("tree") +library(tree) +tree +fs::dir_tree(path = "/Library/Frameworks/R.framework/Versions/3.5", recurse = 2) +fs::dir_tree(path = "/Library/Frameworks/R.framework/Versions/3.5", recurse = 1)