-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathPackage.swift
More file actions
134 lines (116 loc) · 3.88 KB
/
Package.swift
File metadata and controls
134 lines (116 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//
// PluginPackage.swift
// XcodeHelper
//
// Created by dhcdht on 2016/10/18.
// Copyright © 2016年 DXStudio All rights reserved.
//
import Cocoa
enum PackageWebsiteType {
case Github
case Bitbucket
case OtherGit
}
/// 一个 Xcode 扩展包的描述,可能是插件或其他
class Package: NSObject {
var name: String?
var summary: String?
var type: String?
var remotePath: String?
var revision: String?
var screenshotPath: String?
var website: String?
var extensionName: String?
var websiteType: PackageWebsiteType?
init(dict: Dictionary<String, AnyObject>) {
super.init()
for (key, value) in dict {
if let value = value as? String {
switch key {
case "name":
self.name = value
case "description":
self.summary = value
case "url":
self.remotePath = value
case "screenshot":
self.screenshotPath = value
default: break
}
} else {
// TODO:
}
}
self.revision = type(of: self).parseRevision(dict: dict)
self.websiteType = type(of: self).parseWebsiteType(url: dict["url"] as? String)
self.website = type(of: self).parseWebsite(remotePath: self.remotePath)
}
var isInstalled: Bool {
get {
return self.installer.isPackageInstalled(package: self)
}
}
// 暂时不实现和使用 blacklist 功能
// var isBlacklisted: Bool {
// get {
//// return [[ATZXcodePrefsManager sharedManager] isPackageBlacklisted:self];
// // TODO:
// return false
// }
// }
// MARK: - Abstract
var installer: PackageInstaller {
get {
return PackageInstaller.sharedInstance
}
}
var requiresRestart: Bool {
get {
return false
}
}
func installWithProgress(progress: @escaping PackageInstaller.InstallOrUpdateProgressBlock, completion: @escaping PackageInstaller.InstallOrUpdateCompletionBlock) -> Void {
self.installer.installPackage(package: self, progress: progress, completion: completion)
}
func removeWithCompletion(completion: @escaping PackageInstaller.InstallOrUpdateCompletionBlock) -> Void {
self.installer.removePackage(package: self, completion: completion)
}
// MARK: - Private
private class func parseRevision(dict: Dictionary<String, AnyObject>) -> String? {
var ret: String? = nil
if let branch = dict["branch"] as? String {
ret = "origin".appending(branch)
} else if let tag = dict["tag"] as? String {
ret = tag
} else if let commit = dict["commit"] as? String {
ret = commit
}
return ret
}
private class func parseWebsiteType(url: String?) -> PackageWebsiteType? {
if let url = url {
if (url.contains("github.com") || url.contains("githubusercontent.com")) {
return PackageWebsiteType.Github
} else if (url.contains("bitbucket.com") || url.contains("bitbucket.org")) {
return PackageWebsiteType.Bitbucket
} else {
return PackageWebsiteType.OtherGit
}
} else {
return nil
}
}
private class func parseWebsite(remotePath: String?) -> String? {
if let remotePath = remotePath {
if remotePath.contains("raw.github") {
let username = remotePath.pathComponents[2]
let repository = remotePath.pathComponents[3]
return String(format: "https://github.com/%@/%@", username, repository)
} else {
return remotePath
}
} else {
return nil
}
}
}