A small menubar app that allows you to switch between R versions quickly (if you have multiple versions of R framework installed).
https://rud.is/rswitch
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.3 KiB
95 lines
3.3 KiB
5 years ago
|
//
|
||
|
// 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.")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|