feat(hosts): add BSD detection and expand system icons
No files matched your search
@@ -62,7 +62,7 @@ struct HostIconTests {
|
||||
#expect(
|
||||
catalog.entry(matching: try #require(DetectedDistribution(id: "custom", likeIDs: ["debian"])))?.id
|
||||
== "debian")
|
||||
#expect(catalog.selectableEntries.prefix(2).map(\.id) == ["macos", "windows"])
|
||||
#expect(catalog.selectableEntries.map(\.id) == ["bsd", "debian", "linux", "macos", "ubuntu", "windows"])
|
||||
#expect(Set(catalog.entries.map(\.id)).count == catalog.entries.count)
|
||||
}
|
||||
|
||||
@@ -75,11 +75,45 @@ struct HostIconTests {
|
||||
{"id":"ubuntu","title":"Ubuntu","asset":"LinuxDistro-ubuntu","ids":["ubuntu"],"hex":"E95420"},
|
||||
{"id":"debian","title":"Debian","asset":"LinuxDistro-debian","ids":["debian"],"hex":"A81D33"},
|
||||
{"id":"macos","title":"macOS","asset":"HostOS-macos","ids":["macos"],"hex":"000000"},
|
||||
{"id":"windows","title":"Windows","asset":"HostOS-windows","ids":["windows"],"hex":"0078D4"}
|
||||
{"id":"windows","title":"Windows","asset":"HostOS-windows","ids":["windows"],"hex":"0078D4"},
|
||||
{"id":"linux","title":"Linux","asset":"HostOS-linux","ids":["linux"],"hex":"FCC624"},
|
||||
{"id":"bsd","title":"BSD","asset":"HostOS-bsd","ids":["bsd","dragonfly"],"hex":"AB2B28"}
|
||||
]}
|
||||
""".utf8))
|
||||
}
|
||||
|
||||
@Test func genericArtworkDoesNotReplaceExactMatchesOrManualChoices() throws {
|
||||
let catalog = try fixtureCatalog()
|
||||
let unknown = try #require(DetectedDistribution(id: "new-linux"))
|
||||
#expect(catalog.entry(matching: unknown)?.id == "linux")
|
||||
#expect(catalog.entry(matching: try #require(DetectedDistribution(id: "dragonfly")))?.id == "bsd")
|
||||
#expect(
|
||||
catalog.entry(
|
||||
matching: try #require(DetectedDistribution(id: "custom", likeIDs: ["missing", "debian", "ubuntu"])))?
|
||||
.id
|
||||
== "debian")
|
||||
#expect(
|
||||
catalog.entry(matching: try #require(DetectedDistribution(id: "ubuntu", likeIDs: ["debian"])))?.id
|
||||
== "ubuntu")
|
||||
#expect(catalog.resolvedEntry(overrideID: "server", distribution: unknown) == nil)
|
||||
#expect(catalog.resolvedEntry(overrideID: "future-icon", distribution: unknown) == nil)
|
||||
#expect(catalog.resolvedEntry(overrideID: nil, distribution: nil) == nil)
|
||||
}
|
||||
|
||||
@Test func alphabeticalOrderIgnoresCaseAndUsesStableIDsForTies() throws {
|
||||
var catalog = try fixtureCatalog()
|
||||
let template = try #require(catalog.entries.first)
|
||||
catalog.entries = [("z", "alpha"), ("b", "Beta"), ("a", "ALPHA"), ("w", "Windows")].map { id, title in
|
||||
var entry = template
|
||||
entry.id = id
|
||||
entry.title = title
|
||||
return entry
|
||||
}
|
||||
#expect(catalog.selectableEntries.map(\.id) == ["a", "z", "b", "w"])
|
||||
catalog.entries.reverse()
|
||||
#expect(catalog.selectableEntries.map(\.id) == ["a", "z", "b", "w"])
|
||||
}
|
||||
|
||||
@Test func legacyDomainJSONDefaultsToAutomaticAndUnknownIDsSurvive() throws {
|
||||
let host = Host(name: "Host", host: "example.invalid")
|
||||
let data = try JSONEncoder().encode(host)
|
||||
@@ -98,17 +132,19 @@ struct HostIconTests {
|
||||
let store = HostPersistence(context: source.mainContext)
|
||||
let remote = HostPersistence(context: destination.mainContext)
|
||||
let library = HostLibraryModel(persistence: store)
|
||||
var host = Host(name: "Host", host: "example.invalid")
|
||||
var host = Host(
|
||||
name: "Host", host: "example.invalid", detectedDistribution: DetectedDistribution(id: "dragonfly"))
|
||||
#expect(library.saveHost(host))
|
||||
host = try #require(library.host(host.id))
|
||||
let journal = VaultSyncJournal(context: source.mainContext)
|
||||
for choice: String? in ["windows", "macos", "future-icon", nil] {
|
||||
for choice: String? in ["windows", "macos", "freebsd", "bsd", "linux", "future-icon", nil] {
|
||||
host.iconOverrideID = choice
|
||||
#expect(library.saveHost(host))
|
||||
let envelope = try #require(try journal.envelope(for: .init(kind: .host, id: host.id)))
|
||||
#expect(envelope.formatVersion == SyncRecordFormats.vault.writingVersion(for: "host"))
|
||||
_ = try remote.applyRemote([VaultSyncCodec.decode(VaultSyncCodec.encode(envelope))])
|
||||
#expect(try remote.load().hosts.first?.iconOverrideID == choice)
|
||||
#expect(try remote.load().hosts.first?.detectedDistribution?.id == "dragonfly")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@ import Testing
|
||||
struct RemoteSystemInfoTests {
|
||||
@Test func distributionDetectionDistinguishesUnknownLinuxFromANonLinuxHost() throws {
|
||||
#expect(RemoteSystemInfo().distributionDetection == .unavailable)
|
||||
#expect(RemoteSystemInfo(kernelName: "Linux").distributionDetection == .unavailable)
|
||||
#expect(RemoteSystemInfo(kernelName: "FreeBSD").distributionDetection == .resolved(nil))
|
||||
#expect(
|
||||
RemoteSystemInfo(kernelName: "Linux").distributionDetection == .resolved(DetectedDistribution(id: "linux")))
|
||||
#expect(RemoteSystemInfo(kernelName: "SunOS").distributionDetection == .resolved(nil))
|
||||
|
||||
let detected = try #require(DetectedDistribution(id: "Ubuntu", likeIDs: ["Debian"]))
|
||||
#expect(
|
||||
@@ -17,4 +18,15 @@ struct RemoteSystemInfoTests {
|
||||
).distributionDetection == .resolved(detected)
|
||||
)
|
||||
}
|
||||
|
||||
@Test(arguments: ["FreeBSD", "OpenBSD", "NetBSD", "DragonFly"])
|
||||
func bsdDetectionUsesKernelRatherThanLinuxMetadata(kernel: String) {
|
||||
for spelling in [kernel, kernel.lowercased(), kernel.uppercased()] {
|
||||
let info = RemoteSystemInfo(distributionID: "ubuntu", kernelName: spelling)
|
||||
#expect(info.distributionDetection == .resolved(DetectedDistribution(id: kernel.lowercased())))
|
||||
#expect(info.distributionID == "ubuntu")
|
||||
}
|
||||
#expect(
|
||||
RemoteSystemInfo(kernelName: kernel).distributionDetection == .resolved(DetectedDistribution(id: kernel)))
|
||||
}
|
||||
}
|
||||
@@ -332,9 +332,13 @@ struct TailscaleIntegrationTests {
|
||||
#expect(destinationLibrary.group(group.id)?.tailscale?.exitNodeID == "exit-node-stable-id")
|
||||
#expect(discovered.name == "Renamed")
|
||||
destinationLibrary.recordRemoteSystemInfo(RemoteSystemInfo(kernelName: "Linux"), for: discovered.id)
|
||||
#expect(destinationLibrary.host(discovered.id)?.detectedDistribution?.id == "ubuntu")
|
||||
#expect(destinationLibrary.host(discovered.id)?.detectedDistribution?.id == "linux")
|
||||
destinationLibrary.recordRemoteSystemInfo(RemoteSystemInfo(kernelName: "FreeBSD"), for: discovered.id)
|
||||
destinationLibrary.replaceTailscalePeers([peer()], groupID: group.id)
|
||||
#expect(destinationLibrary.host(discovered.id)?.detectedDistribution?.id == "freebsd")
|
||||
destinationLibrary.recordRemoteSystemInfo(RemoteSystemInfo(), for: discovered.id)
|
||||
#expect(destinationLibrary.host(discovered.id)?.detectedDistribution?.id == "freebsd")
|
||||
destinationLibrary.recordRemoteSystemInfo(RemoteSystemInfo(kernelName: "SunOS"), for: discovered.id)
|
||||
#expect(destinationLibrary.host(discovered.id)?.detectedDistribution == nil)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "HostOS-bsd.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>BSD</title><path d="M4.725 6.664C5.6 6.91 6.353 7.684 6.6 8.556c.27.95-.032 1.905-.671 2.633.783.432 1.44 1.083 1.704 1.956.244.807.185 1.739-.224 2.483-.446.812-1.3 1.457-2.203 1.65-.496.106-1.02.07-1.524.07H.602c-.393 0-.602-.28-.602-.638V9.476C0 5.81 3.889 6.428 4.725 6.664zM1.051 9.63v1.367h3.228c1.258 0 1.461-1.761 1.285-2.272-.184-.533-.687-.893-1.2-1.056-.426-.097-3.313-.784-3.313 1.961zm0 2.357v4.297c0 .116-.006.099.116.099H3.57c.67 0 1.364.022 1.98-.284.782-.387 1.24-1.422 1.158-2.263-.084-.849-.667-1.43-1.44-1.72-.387-.147-.927-.129-1.339-.129H1.05zm14.791-4.77c0-.47.28-.706.854-.706h2.916c2.9 0 4.388 2.797 4.388 5.492 0 2.754-1.797 5.404-4.683 5.404h-2.856c-.471 0-.619-.088-.619-.603V7.218zm1.09.369v8.746h2.311c2.342 0 3.594-2.15 3.594-4.329 0-2.238-1.134-4.417-3.387-4.417h-2.518zm-5.506.017c-.948 0-1.824.776-1.824 1.796 0 .918 1.235 1.45 2.456 2.11 1.292.704 2.67 1.408 2.67 2.902 0 2.054-1.536 3.116-3.518 3.116a4.479 4.479 0 0 1-2.47-.718c-.258-.173-.388-.388-.388-.632 0-.33.159-.488.488-.488.159 0 .33.057.504.172.56.345 1.277.546 1.91.546 1.25 0 2.311-.546 2.311-1.925 0-.861-1.033-1.407-2.153-1.996-1.408-.732-2.988-1.536-2.988-3.03 0-1.882 1.436-2.973 3.232-2.973.775 0 1.622.215 2.441.66a.767.767 0 0 1 .402.661c0 .287-.201.56-.502.56-.173 0-.345-.129-.546-.258-.46-.287-1.279-.503-2.025-.503z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "HostOS-freebsd.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>FreeBSD</title><path d="M23.682 2.406c-.001-.149-.097-.187-.24-.189h-.25v.659h.108v-.282h.102l.17.282h.122l-.184-.29c.102-.012.175-.065.172-.18zm-.382.096v-.193h.13c.06-.002.145.011.143.089.005.09-.08.107-.153.103h-.12zM21.851 1.49c1.172 1.171-2.077 6.319-2.626 6.869-.549.548-1.944.044-3.115-1.128-1.172-1.171-1.676-2.566-1.127-3.115.549-.55 5.697-3.798 6.868-2.626zM1.652 6.61C.626 4.818-.544 2.215.276 1.395c.81-.81 3.355.319 5.144 1.334A11.003 11.003 0 0 0 1.652 6.61zm18.95.418a10.584 10.584 0 0 1 1.368 5.218c0 5.874-4.762 10.636-10.637 10.636C5.459 22.882.697 18.12.697 12.246.697 6.371 5.459 1.61 11.333 1.61c1.771 0 3.441.433 4.909 1.199-.361.201-.69.398-.969.574-.428-.077-.778-.017-.998.202-.402.402-.269 1.245.263 2.2.273.539.701 1.124 1.25 1.674.103.104.208.202.315.297 1.519 1.446 3.205 2.111 3.829 1.486.267-.267.297-.728.132-1.287.167-.27.35-.584.538-.927zm2.814-5.088c-.322 0-.584.266-.584.595s.261.595.584.595c.323 0 .584-.266.584-.595s-.261-.595-.584-.595zm0 1.087c-.252 0-.457-.22-.457-.492s.204-.492.457-.492c.252 0 .457.22.457.492s-.204.492-.457.492z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "HostOS-linux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Linux</title><path d="M12.504 0c-.155 0-.315.008-.48.021-4.226.333-3.105 4.807-3.17 6.298-.076 1.092-.3 1.953-1.05 3.02-.885 1.051-2.127 2.75-2.716 4.521-.278.832-.41 1.684-.287 2.489a.424.424 0 00-.11.135c-.26.268-.45.6-.663.839-.199.199-.485.267-.797.4-.313.136-.658.269-.864.68-.09.189-.136.394-.132.602 0 .199.027.4.055.536.058.399.116.728.04.97-.249.68-.28 1.145-.106 1.484.174.334.535.47.94.601.81.2 1.91.135 2.774.6.926.466 1.866.67 2.616.47.526-.116.97-.464 1.208-.946.587-.003 1.23-.269 2.26-.334.699-.058 1.574.267 2.577.2.025.134.063.198.114.333l.003.003c.391.778 1.113 1.132 1.884 1.071.771-.06 1.592-.536 2.257-1.306.631-.765 1.683-1.084 2.378-1.503.348-.199.629-.469.649-.853.023-.4-.2-.811-.714-1.376v-.097l-.003-.003c-.17-.2-.25-.535-.338-.926-.085-.401-.182-.786-.492-1.046h-.003c-.059-.054-.123-.067-.188-.135a.357.357 0 00-.19-.064c.431-1.278.264-2.55-.173-3.694-.533-1.41-1.465-2.638-2.175-3.483-.796-1.005-1.576-1.957-1.56-3.368.026-2.152.236-6.133-3.544-6.139zm.529 3.405h.013c.213 0 .396.062.584.198.19.135.33.332.438.533.105.259.158.459.166.724 0-.02.006-.04.006-.06v.105a.086.086 0 01-.004-.021l-.004-.024a1.807 1.807 0 01-.15.706.953.953 0 01-.213.335.71.71 0 00-.088-.042c-.104-.045-.198-.064-.284-.133a1.312 1.312 0 00-.22-.066c.05-.06.146-.133.183-.198.053-.128.082-.264.088-.402v-.02a1.21 1.21 0 00-.061-.4c-.045-.134-.101-.2-.183-.333-.084-.066-.167-.132-.267-.132h-.016c-.093 0-.176.03-.262.132a.8.8 0 00-.205.334 1.18 1.18 0 00-.09.4v.019c.002.089.008.179.02.267-.193-.067-.438-.135-.607-.202a1.635 1.635 0 01-.018-.2v-.02a1.772 1.772 0 01.15-.768c.082-.22.232-.406.43-.533a.985.985 0 01.594-.2zm-2.962.059h.036c.142 0 .27.048.399.135.146.129.264.288.344.465.09.199.14.4.153.667v.004c.007.134.006.2-.002.266v.08c-.03.007-.056.018-.083.024-.152.055-.274.135-.393.2.012-.09.013-.18.003-.267v-.015c-.012-.133-.04-.2-.082-.333a.613.613 0 00-.166-.267.248.248 0 00-.183-.064h-.021c-.071.006-.13.04-.186.132a.552.552 0 00-.12.27.944.944 0 00-.023.33v.015c.012.135.037.2.08.334.046.134.098.2.166.268.01.009.02.018.034.024-.07.057-.117.07-.176.136a.304.304 0 01-.131.068 2.62 2.62 0 01-.275-.402 1.772 1.772 0 01-.155-.667 1.759 1.759 0 01.08-.668 1.43 1.43 0 01.283-.535c.128-.133.26-.2.418-.2zm1.37 1.706c.332 0 .733.065 1.216.399.293.2.523.269 1.052.468h.003c.255.136.405.266.478.399v-.131a.571.571 0 01.016.47c-.123.31-.516.643-1.063.842v.002c-.268.135-.501.333-.775.465-.276.135-.588.292-1.012.267a1.139 1.139 0 01-.448-.067 3.566 3.566 0 01-.322-.198c-.195-.135-.363-.332-.612-.465v-.005h-.005c-.4-.246-.616-.512-.686-.71-.07-.268-.005-.47.193-.6.224-.135.38-.271.483-.336.104-.074.143-.102.176-.131h.002v-.003c.169-.202.436-.47.839-.601.139-.036.294-.065.466-.065zm2.8 2.142c.358 1.417 1.196 3.475 1.735 4.473.286.534.855 1.659 1.102 3.024.156-.005.33.018.513.064.646-1.671-.546-3.467-1.089-3.966-.22-.2-.232-.335-.123-.335.59.534 1.365 1.572 1.646 2.757.13.535.16 1.104.021 1.67.067.028.135.06.205.067 1.032.534 1.413.938 1.23 1.537v-.043c-.06-.003-.12 0-.18 0h-.016c.151-.467-.182-.825-1.065-1.224-.915-.4-1.646-.336-1.77.465-.008.043-.013.066-.018.135-.068.023-.139.053-.209.064-.43.268-.662.669-.793 1.187-.13.533-.17 1.156-.205 1.869v.003c-.02.334-.17.838-.319 1.35-1.5 1.072-3.58 1.538-5.348.334a2.645 2.645 0 00-.402-.533 1.45 1.45 0 00-.275-.333c.182 0 .338-.03.465-.067a.615.615 0 00.314-.334c.108-.267 0-.697-.345-1.163-.345-.467-.931-.995-1.788-1.521-.63-.4-.986-.87-1.15-1.396-.165-.534-.143-1.085-.015-1.645.245-1.07.873-2.11 1.274-2.763.107-.065.037.135-.408.974-.396.751-1.14 2.497-.122 3.854a8.123 8.123 0 01.647-2.876c.564-1.278 1.743-3.504 1.836-5.268.048.036.217.135.289.202.218.133.38.333.59.465.21.201.477.335.876.335.039.003.075.006.11.006.412 0 .73-.134.997-.268.29-.134.52-.334.74-.4h.005c.467-.135.835-.402 1.044-.7zm2.185 8.958c.037.6.343 1.245.882 1.377.588.134 1.434-.333 1.791-.765l.211-.01c.315-.007.577.01.847.268l.003.003c.208.199.305.53.391.876.085.4.154.78.409 1.066.486.527.645.906.636 1.14l.003-.007v.018l-.003-.012c-.015.262-.185.396-.498.595-.63.401-1.746.712-2.457 1.57-.618.737-1.37 1.14-2.036 1.191-.664.053-1.237-.2-1.574-.898l-.005-.003c-.21-.4-.12-1.025.056-1.69.176-.668.428-1.344.463-1.897.037-.714.076-1.335.195-1.814.12-.465.308-.797.641-.984l.045-.022zm-10.814.049h.01c.053 0 .105.005.157.014.376.055.706.333 1.023.752l.91 1.664.003.003c.243.533.754 1.064 1.189 1.637.434.598.77 1.131.729 1.57v.006c-.057.744-.48 1.148-1.125 1.294-.645.135-1.52.002-2.395-.464-.968-.536-2.118-.469-2.857-.602-.369-.066-.61-.2-.723-.4-.11-.2-.113-.602.123-1.23v-.004l.002-.003c.117-.334.03-.752-.027-1.118-.055-.401-.083-.71.043-.94.16-.334.396-.4.69-.533.294-.135.64-.202.915-.47h.002v-.002c.256-.268.445-.601.668-.838.19-.201.38-.336.663-.336zm7.159-9.074c-.435.201-.945.535-1.488.535-.542 0-.97-.267-1.28-.466-.154-.134-.28-.268-.373-.335-.164-.134-.144-.333-.074-.333.109.016.129.134.199.2.096.066.215.2.36.333.292.2.68.467 1.167.467.485 0 1.053-.267 1.3Line truncated
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "HostOS-netbsd.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NetBSD</title><path d="M22.686 10.681c0-.181.064-.336.193-.464a.634.634 0 0 1 .464-.193c.182 0 .336.065.465.193a.633.633 0 0 1 .192.464.635.635 0 0 1-.192.465.632.632 0 0 1-.465.193.634.634 0 0 1-.464-.193.634.634 0 0 1-.193-.465zm1.206 0a.53.53 0 0 0-.16-.388.53.53 0 0 0-.389-.16.53.53 0 0 0-.388.16.528.528 0 0 0-.161.388.53.53 0 0 0 .16.389.53.53 0 0 0 .39.161.529.529 0 0 0 .388-.161.53.53 0 0 0 .16-.389zm-.344.396-.207-.349h-.117v.349h-.114v-.808h.207c.194 0 .292.074.292.223 0 .104-.053.177-.157.22l.221.365zm-.324-.71v.27l.076.001c.075 0 .126-.01.151-.028.026-.02.04-.056.04-.11 0-.09-.059-.134-.175-.134h-.092m-3.892 3.28c0 .403.014.667.146.82.132.147.344.213.607.213 1.266 0 1.698-1.127 1.698-2.122 0-1.318-.695-2.1-2.02-2.1-.197 0-.336.036-.38.095-.044.058-.051.197-.051.424v2.67zm-1.046-2.319c0-.695-.015-.834-.352-.87l-.139-.015c-.073-.037-.073-.25.015-.257a30.521 30.521 0 0 1 1.96-.065c.6 0 1.2.059 1.706.241.958.344 1.485 1.208 1.485 2.122 0 .981-.468 1.771-1.31 2.188-.497.25-1.097.344-1.85.344-.345 0-.71-.044-.974-.044-.351 0-.724.008-1.141.022-.059-.044-.059-.22 0-.256l.226-.036c.33-.059.374-.11.374-.783v-2.59m-2.405 3.76c-.673 0-1.09-.19-1.244-.277-.139-.161-.234-.688-.234-1.186.051-.095.22-.102.278-.022.146.476.636 1.149 1.258 1.149.542 0 .79-.373.79-.74 0-.592-.555-.943-.994-1.163-.527-.263-1.098-.702-1.105-1.427 0-.827.636-1.398 1.697-1.398.242 0 .542.03.834.118.095.029.161.043.25.058.057.161.13.556.13 1.047-.036.087-.219.095-.285.022-.124-.374-.439-.908-.965-.908-.483 0-.747.315-.747.68 0 .337.3.645.666.835l.483.256c.454.242 1.032.666 1.032 1.471 0 .9-.74 1.486-1.844 1.486m-4.2-1.354c0 .57.072.93.643.93.542 0 .827-.418.827-1.01 0-.637-.366-1.084-1.068-1.084-.403 0-.403.007-.403.3v.864zm0-1.69c0 .19.007.204.387.204.63 0 .863-.402.863-.841 0-.637-.395-.952-.9-.952-.343 0-.35.06-.35.381zm-1.01-.71c0-.74-.015-.82-.322-.857l-.198-.03c-.066-.036-.08-.255.03-.263.555-.036 1.09-.065 1.821-.065.703 0 1.171.08 1.493.27.314.19.505.498.505.93 0 .615-.52.856-.747.915-.073.014-.146.044-.146.08 0 .022.037.044.103.059.578.124 1.068.504 1.075 1.214.007.673-.395 1.069-.856 1.23-.461.16-1.01.183-1.456.183-.263 0-.541-.03-.754-.03-.358 0-.717.008-1.134.022-.058-.044-.058-.234 0-.256l.213-.044c.329-.065.373-.117.373-.775v-2.584M9.038 12.44c-.095 0-.102.007-.102.168v1.097c0 .41 0 .864.512.864.102 0 .22-.051.307-.11.073.022.117.103.102.19-.204.22-.6.425-1.053.425-.607 0-.82-.351-.82-.834v-1.632c0-.154-.007-.168-.139-.168H7.62c-.08-.03-.103-.176-.044-.227.226-.08.431-.213.607-.33.132-.095.315-.248.541-.57.051-.03.183-.022.22.036v.549c0 .139.007.146.139.146h.651c.037.03.059.074.059.14 0 .08-.022.211-.095.256h-.66m-2.627.475c.103 0 .22-.015.3-.066.037-.022.051-.095.051-.168 0-.241-.139-.402-.388-.402-.307 0-.57.292-.57.526 0 .103.102.11.336.11zm-.483.322c-.168 0-.183.015-.183.132 0 .549.351 1.083 1.032 1.083.205 0 .483-.044.68-.38.08-.015.19.043.19.168-.3.622-.84.834-1.28.834-.988 0-1.522-.695-1.522-1.493 0-.922.666-1.64 1.58-1.64.762 0 1.171.491 1.171 1.055 0 .139-.036.241-.263.241H5.927m-1.255.49c0 .476 0 .937.014 1.179-.05.087-.256.168-.431.168-.008 0-.25-.373-.593-.798l-1.69-2.093c-.417-.527-.666-.826-.798-.936-.036.073-.036.197-.036.468v1.42c0 .593.029 1.141.11 1.339.065.154.234.198.424.234l.205.03c.058.058.044.212 0 .255a26.585 26.585 0 0 0-.98-.022c-.271 0-.542.008-.82.022-.044-.043-.059-.197 0-.256l.124-.022c.198-.044.337-.087.403-.241.073-.198.102-.746.102-1.34v-1.858c0-.402 0-.52-.051-.622-.051-.124-.161-.198-.417-.249l-.205-.029c-.051-.059-.044-.234.03-.256.343.014.709.022 1.009.022.249 0 .46-.008.615-.022.073.33.548.885 1.207 1.668l.614.725c.33.38.535.636.703.805.03-.073.03-.198.03-.33v-1.01c0-.592-.03-1.141-.11-1.339-.067-.153-.227-.197-.425-.234l-.198-.029c-.058-.059-.043-.212 0-.256.396.014.68.022.98.022.272 0 .535-.008.82-.022.044.044.059.197 0 .256l-.131.022c-.19.044-.33.088-.396.242-.08.197-.11.746-.11 1.339v1.749M21.537 3.59c-2.848-1.367-5.425-.715-8.306.148-2.902.868-5.482 1.337-8.381.154l.79 1.41.87 1.557.79 1.41c2.309.652 4.22-.194 6.271-1.22 2.463-1.23 4.688-2.337 7.502-1.696-2.378-1.19-4.534-.895-7.02-.22 2.434-1.24 4.726-2.204 7.484-1.543M13.16 20.478l-2.272-4.385H9.91l2.283 4.826s.23.455.724.203c.493-.25.245-.644.245-.644M4.634 4.025s-.068-.159-.26-.053c-.16.089-.077.253-.077.253l3.004 6.351h.728L4.634 4.025"/></svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "HostOS-openbsd.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OpenBSD</title><path d="M13.695 1.653c-.202.47-.146 1.02-.293 1.509-.034.112-.146.452-.308.429-.333-.048-.16-.688-.545-.7l.12.934c-.577.073-.498-.829-.733-1.195-.27-.423-.335.192-.317.38.011.122.036.242.05.363.026.21.032.393.005.603-.552-.007-.35-.733-.754-.844l.03.874c-.612-.005-.89-.557-1.159-1.025-.112-.196-.261-.574-.53-.453.126.544.423 1.064.454 1.63.007.145-.13.516-.333.448-.469-.158-.406-1.008-.796-1.231-.08-.045-.204-.006-.29-.002 0 .45.198.996.356 1.418.034.09.129.41-.069.403-.353-.01-.441-.695-.8-.615.044.185.153.335.215.513.037.109.106.219.126.332.044.247-.269.267-.432.22-.384-.114-.66-.428-.935-.703-.076-.076-.277-.344-.404-.222-.141.135.136.373.215.464.234.271.488.589.6.935.049.148.058.36-.09.462-.146.1-.384-.083-.502-.16-.362-.239-.721-.654-1.176-.664l-.107.271.29.392.752.845-.875-.362c.035.229.583.506.475.742-.064.14-.38.142-.505.124-.446-.064-.762-.396-1.177-.515-.366-.105-.298.18-.09.343.072.057.141.117.211.177.125.108.245.219.362.336.183.183.343.378.513.573l-.875-.03v.06l.845.392-.151.603c-.244 0-.442-.067-.664-.163-.151-.066-.31-.175-.482-.163-.206.014-.328.202-.19.377.206.263.62.412.883.617.1.078.247.212.133.345-.225.264-.832-.074-1.128.013v.06c.275.161.839.253 1 .549.128.231-.232.756-.487.736-.227-.019-.436-.275-.603-.41-.401-.322-.83-.7-1.298-.923-.801-.38-1.597.226-2.232.622.081.256.402-.017.603.029.271.061.477.313.651.513.84.968 1.543 2.064 1.857 3.319.083.33.224.725-.023 1.021-.066.08-.165.09-.238.155-.055.05-.052.118.023.141.138.043.34-.021.475-.054.443-.107.949-.346 1.15-.78.125-.271.169-.797.48-.905.068.29.394.673.363.965-.029.259-.302.56-.461.751-.057.068-.193.217-.112.315.082.097.25-.112.3-.16.229-.216.73-.558.865-.062.118.432-.261 1.13-.45 1.509-.054.105-.297.435-.202.553.11.135.338-.218.387-.282.19-.249.856-.987 1.21-.722.431.324.282.555.119.994-.046.123-.216.433-.1.55.111.114.258.01.315-.098.104-.197.383-.78.661-.631.175.093.441.251.543.425.158.272.02.815-.022 1.111-.024.17-.207.702-.055.825.14.113.254-.228.296-.312.149-.295.32-.597.54-.845.08-.089.192-.237.327-.212.7.131-.015.829.273 1.185.058.072.215.067.3.083l.362-.935c.184.07.455.095.591.248.114.128.137.344.17.506.092.454.142.896.084 1.357.057.042.148.138.225.088.097-.062.11-.315.143-.42.106-.332.269-.65.42-.965.099-.207.37-.427.565-.142.2.292.12.804.246 1.138.32-.158.355-.825.362-1.147l.415.061.25.513.45 1.297c.234-.09.16-.538.187-.754.035-.293.103-.882.318-1.1.086-.087.258-.095.37-.137.129.312.199.666.354.965.06.116.198.242.337.17.133-.068.128-.224.111-.35-.042-.313-.113-.62-.138-.936.598-.042.95.441 1.325.845.145.155.271.362.485.422l-.31-.905-.172-.845c.217-.09.676-.534.905-.47.34.097.6 1.046 1.023.823.18-.095.088-.257.003-.383-.126-.188-.506-.639-.465-.874.03-.175.324-.379.494-.377.391.006 1.071.304 1.297.618l.272-.03c-.04-.54-.85-.787-.966-1.328a.404.404 0 01.004-.172c.086-.347.294-.195.51-.102.067.029.213.103.269.02.06-.091-.048-.212-.087-.289-.082-.156-.156-.337-.122-.513.282.074.455.242.694.4.056.038.18.131.251.08.075-.056-.036-.167-.071-.208-.106-.123-.432-.42-.4-.6.022-.122.227-.252.31-.335.276-.276.59-.556.815-.875h.03c.532.621 2.203.186 1.99-.754-.132.019-.256.123-.392.077-.594-.205-.45-1.157-1.116-1.163-.049-.62-.298-1.24-.599-1.78-.138-.247-.424-.473-.525-.725-.055-.14-.046-.36-.052-.512.349-.054.177-.407.05-.603-.142-.218-.292-.477-.475-.66-.226-.227-.562-.374-.533-.758.027-.357.642-.311.747-.633-.183.008-.363.053-.543.083-.449.075-.527-.076-.317-.475.183-.349.474-.613.73-.905.083-.093.336-.306.205-.441-.107-.112-.286.058-.377.119-.333.22-.705.384-1.086.502-.113.035-.448.166-.486-.035-.051-.272.463-.322.395-.628-.205.049-.61.374-.807.223-.238-.18.111-.643.149-.856.038-.216-.136-.224-.258-.09-.043.048-.081.1-.12.15-.07.087-.126.17-.17.271-.494-.288.44-.623.265-.89-.063-.095-.179 0-.235.05-.117.102-.558.61-.654.237-.106-.412.108-.908.22-1.297.028-.102.159-.376.032-.449-.185-.106-.266.253-.31.359a2.333 2.333 0 01-.615.839c-.086.077-.232.225-.36.19-.187-.051-.188-.57-.182-.728.003-.075.045-.205-.028-.26-.096-.071-.147.072-.16.14-.048.222-.186.856-.515.44-.298-.376.163-1.157-.444-1.315l-.332 1.056c-.398-.087-.31-.656-.211-.966l-.181-.06a3.303 3.303 0 01-.112.362c-.16.451-.375.539-.541.03-.127-.388-.082-.807-.145-1.207-.025-.159-.04-.32-.198-.392zm.03.905c.153.364-.008.82.237 1.176.25.364.716.168 1.02.397.108.081.022.256-.007.358-.1.347-.278.604-.465.905.655-.335.875-1.29.965-1.96h.03c-.026.596-.007 1.182 0 1.779.003.27-.037.582.272.633V4.46c.323.093.808.502 1.159.381.179-.061.342-.277.467-.411.094-.102.175-.212.244-.332h.03l-.12.965-.302-.06.663.473.261.226-.2.294-.875.636c.637-.094.958-.564 1.418-.935-.15.63-.491 1.262-.332 1.93h.03l.362-1.448c.274.13.37.476.633.633.383.228.919-.204 1.267-.331-.227.322-.57.548-.633.965l-.272-.12c.236.606.519 1.19.62 1.84.093.594-.024 1.183.016 1.78.02.275.133.517.179.784-.563.191-.666.98-1.207 1.236.043-.188.11-.377.11-.573 0-.14-.066-.282-.03-.422.073-.277.314-.508.412-.784.152-.43.05-.835-.009-1.2Line truncated
|
||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-artixlinux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Artix Linux</title><path d="M12 0L7.873 8.462l11.358 6.363zM6.626 11.018L.295 24l18.788-7.762zm13.846 6.352l-5.926 3.402L23.706 24Z"/></svg>
|
||||
|
After Width: | Height: | Size: 218 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-asahilinux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Asahi Linux</title><path d="m13.835 0-1.72 1.323v.97h2.178zm-1.95.057L9.81 1.095l2.076 4.153zm.23 3.768V6.22l-1.057-2.113L6.43 5.678 12 8.009l5.57-2.331zM6.21 5.835.533 15.957 11.885 24V8.21L6.222 5.84Zm11.58 0-.012.004-5.6 2.345 7.512 10.449 3.777-2.675zm-3.955 7.926v5.422l1.952-2.711zm2.864 3.981-4.411 6.135 5.846-4.14z"/></svg>
|
||||
|
After Width: | Height: | Size: 410 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-cachyos.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>CachyOS</title><path d="M5.301 2.646 0 11.771l5.541 9.583h11.486l2.904-5.017H8.102l-2.56-4.429L8.067 7.54h6.063l2.83-4.893ZM20.058 4.12a.748.748 0 0 0 0 1.496.748.748 0 0 0 0-1.496m-1.983 4.303a1.45 1.45 0 0 0 0 2.9 1.45 1.45 0 0 0 0-2.9m4.02 3.98a1.904 1.904 0 0 0 0 3.809 1.904 1.904 0 0 0 0-3.81"/></svg>
|
||||
|
After Width: | Height: | Size: 385 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-devuan.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Devuan</title><path d="M0 .415C42.518 10.56 2.297 18.812 2.297 18.812c-.792.127-1.432.54-1.816 1.167-.433.704-.47 1.656-.066 2.326.492.814 1.114 1.096 1.65 1.217.845.191 1.527-.113 1.527-.113s20.562-6.11 20.407-12.214C23.922 8.131 17.694 2.948 0 .415"/></svg>
|
||||
|
After Width: | Height: | Size: 337 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-garudalinux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Garuda Linux</title><path d="M10.24 3.179C6.82 6.579 3.366 10.064 0 13.465c2.4 2.406 4.889 4.898 7.319 7.332l7.504.024 6.334-6.316-13.754-.012-1.525 1.54 11.512.024-3.198 3.197H7.956L2.172 13.47l8.74-8.74h6.284l4.815 4.815-7.501-.01v-2.12l-3.68 3.68c3.873.004 7.746.003 11.62 0v2.102l1.55-1.55-.003-2.306-6.16-6.159z"/></svg>
|
||||
|
After Width: | Height: | Size: 403 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-mxlinux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>MX Linux</title><path d="M12.001 13.301l3.277 3.819-.75.9-2.133-2.521-1.131-1.338.737-.86zM24 2.41v19.182c0 .655-.531 1.186-1.186 1.186H1.186A1.186 1.186 0 0 1 0 21.591V2.409c0-.655.531-1.186 1.186-1.186h21.628c.655 0 1.186.53 1.186 1.186zm-2.241 17.09l-2.116-2.542-2.115-2.541-.586.704-3.25-3.788 4.913-5.73-1.175-1.008-4.76 5.549-4.743-5.527-1.947 1.67 5 5.827-.73.851-1.24-1.465-3.384 4-3.385 4h19.518z"/></svg>
|
||||
|
After Width: | Height: | Size: 492 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-nobaralinux.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Nobara Linux</title><path d="M23.808 11.808v8.281a3.542 3.542 0 0 1-3.542 3.527h-.46a3.543 3.543 0 0 1-3.083-3.513v-7.282l3.543-1.013-3.66-1.045a4.724 4.724 0 0 0-9.33 1.045v2.362a2.362 2.362 0 0 0 2.362 2.362 3.543 3.543 0 0 1 3.543 3.542V24a3.539 3.539 0 0 0-3.542-3.542 3.537 3.537 0 0 0-3.063 1.76 3.54 3.54 0 0 1-2.382 1.398h-.46A3.542 3.542 0 0 1 .192 20.09V3.543a3.542 3.542 0 0 1 6.323-2.194A11.756 11.756 0 0 1 12 0c6.521 0 11.808 5.287 11.808 11.808zm-9.446 0A2.359 2.359 0 0 1 12 14.17a2.362 2.362 0 1 1 2.362-2.362z"/></svg>
|
||||
|
After Width: | Height: | Size: 614 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-openwrt.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OpenWrt</title><path d="m12 0c-3.906 0-7.4465 1.5949-10.006 4.1543l1.6953 1.6953c2.1278-2.1278 5.069-3.4395 8.3105-3.4395 3.2416 0 6.1833 1.3122 8.3105 3.4395l1.6953-1.6953c-2.56-2.5594-6.0999-4.1543-10.006-4.1543zm0 4.3203c-2.7091 0-5.1685 1.1138-6.9473 2.8926l1.6953 1.6953c1.346-1.346 3.2079-2.1777 5.252-2.1777 2.0435 0 3.9053 0.83172 5.252 2.1777l1.6953-1.6953c-1.7782-1.7782-4.2381-2.8926-6.9473-2.8926zm-7.7285 3.7559c-1.3295 1.6792-2.1113 3.7906-2.1113 6.084 0 5.4189 4.4216 9.8398 9.8398 9.8398 5.4183 0 9.8398-4.4209 9.8398-9.8398 0-2.2934-0.79833-4.4048-2.1113-6.084l-1.7129 1.7129c0.8974 1.2298 1.4297 2.7427 1.4297 4.3711 0 4.1053-3.34 7.4473-7.4453 7.4473-4.1052 0-7.4473-3.342-7.4473-7.4473 0-1.6284 0.53174-3.1413 1.4297-4.3711l-1.7109-1.7129zm7.7285 0.56641c-1.5128 0-2.8928 0.61633-3.9062 1.6133l1.6953 1.6953c1.2219-1.2195 3.2006-1.2195 4.4219 0l1.6953-1.6953c-1.0354-1.0361-2.4416-1.6176-3.9062-1.6133zm0 3.8887c-0.8997 0-1.6289 0.72911-1.6289 1.6289 0 0.8992 0.72921 1.6289 1.6289 1.6289 0.8998 0 1.6289-0.72971 1.6289-1.6289-0.0019-0.8992-0.72971-1.6277-1.6289-1.6289z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-parrotsecurity.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Parrot Security</title><path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0Zm6.267 2.784L13.03 5.54l8.05-.179-8.05 3.333-2.154 2.688 5.007 9.038-1.536-1.605 1.645 3.456-4.937-5.527-6.268-6.28L2.77 12.11l.7-3.442 4.018-.261.823-4.06Z"/></svg>
|
||||
|
After Width: | Height: | Size: 351 B |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-qubesos.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Qubes OS</title><path d="M21.893 20.79l-2.289-1.332 1.547-.895a2.402 2.402 0 0 0 1.2-2.08V7.098l-.003-.059a2.402 2.402 0 0 0-1.198-2.027l-3.899-2.255-4.21-2.436a2.473 2.473 0 0 0-.237-.118L12.77.187l-.093-.036-.052-.019c-.028-.01-.057-.018-.085-.027l-.062-.019-.079-.02-.072-.017-.073-.013-.079-.013-.068-.008-.087-.008-.063-.004A10.324 10.324 0 0 0 11.9 0h-.03l-.082.001-.076.002-.093.007-.064.006c-.037.004-.073.01-.11.016-.014.004-.029.006-.044.009a3.266 3.266 0 0 0-.154.034 2.39 2.39 0 0 0-.602.245L5.536 3.277l-3 1.736a2.407 2.407 0 0 0-1.201 2.083v9.385a2.405 2.405 0 0 0 1.2 2.08l8.108 4.693a2.395 2.395 0 0 0 2.4.002l1.804-1.044 2.302 1.339c1.03.599 2.687.599 3.716 0l1.03-.6c1.027-.597 1.027-1.562-.002-2.161zm-10.71-2.695l-4.46-2.583a1.324 1.324 0 0 1-.66-1.143V9.206c0-.236.063-.464.177-.662l.002.001c.116-.2.282-.368.482-.485l4.459-2.58c.092-.053.189-.093.289-.122l.034-.01c.035-.01.07-.015.105-.022.023-.004.045-.01.068-.013.031-.004.062-.004.093-.006.028 0 .055-.004.083-.004.036 0 .073.004.11.007.02.002.038.002.058.005.037.005.074.014.11.022.018.004.037.007.055.012.04.011.077.025.115.04l.045.015c.052.022.104.047.154.076l4.46 2.58c.198.116.364.283.48.483l.002.003-.003.002c.116.201.177.43.177.661v5.161c0 .15-.028.295-.076.433a1.32 1.32 0 0 1-.583.71l-4.46 2.582a1.312 1.312 0 0 1-1.316 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-slackware.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Slackware</title><path d="M12.924 1.228c-.584-.01-1.251 0-1.485.027-2.46.282-4.138 1.3-4.753 2.891-.218.552-.274 1.002-.243 1.772.048 1.21.419 2.004 1.262 2.742 1.225 1.06 2.98 1.508 5.998 1.508 2.737 0 3.71.413 3.916 1.675.313 1.867-1.57 3.07-4.414 2.827-1.878-.16-3.496-.912-4.223-1.967a7.772 7.772 0 01-.355-.62c-.382-.76-.64-.978-1.176-.978-.43.005-.732.165-.918.494l-.133.24v4.03l.137.296c.165.344.4.546.744.63.35.09.794-.036 1.42-.402l.5-.29.826.185c1.82.403 2.75.523 4.065.523 1.103.005 1.548-.046 2.455-.285 1.124-.297 1.974-.785 2.717-1.57.8-.844 1.15-1.853 1.097-3.147-.069-1.628-.695-2.698-2-3.414-.96-.525-2.292-.79-4.377-.88-2.042-.086-2.794-.155-3.515-.32-.51-.12-.785-.25-1.076-.515-.653-.589-.59-1.755.136-2.482.642-.637 1.511-.928 2.774-.928 1.432.005 2.393.27 3.412.955.185.127.721.62 1.193 1.092.886.902 1.135 1.082 1.506 1.082.244 0 .59-.163.732-.344.26-.329.303-.63.303-2.2 0-1.66-.043-1.91-.377-2.282-.387-.425-.848-.42-1.75.031l-.59.297-.63-.17c-1.496-.392-2.038-.477-3.178-.504zM0 13.775v9h24v-1H1v-8z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "LinuxDistro-zorin.svg",
|
||||
"idiom": "universal"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"preserves-vector-representation": true,
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Zorin</title><path d="M4 18.944L5.995 22.4h12.01L20 18.944H4zM24 12l-2.013 3.488H9.216l12.771-6.976L24 12zM0 12l2.013-3.488h12.771L2.013 15.488 0 12zm4-6.944L5.995 1.6h12.01L20 5.056H4z"/></svg>
|
||||
|
After Width: | Height: | Size: 272 B |
@@ -40,6 +40,45 @@
|
||||
"sourceURL": "https://www.archlinux.org/art",
|
||||
"title": "Arch Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-artixlinux",
|
||||
"hex": "10A0CC",
|
||||
"id": "artixlinux",
|
||||
"ids": [
|
||||
"artix"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "artixlinux",
|
||||
"sourceURL": "https://gitea.artixlinux.org/artix/artwork/src/commit/256432e3d06b3e9024bfd6912768e80281ea3746/icons/logo-gray.svg",
|
||||
"title": "Artix Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-asahilinux",
|
||||
"hex": "A61200",
|
||||
"id": "asahilinux",
|
||||
"ids": [
|
||||
"asahi"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "asahilinux",
|
||||
"sourceURL": "https://github.com/AsahiLinux/artwork/blob/292637c9658c1491ddc1128fb6134aec01d904dd/logos/svg/AsahiLinux_logomark_mono.svg",
|
||||
"title": "Asahi Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-cachyos",
|
||||
"hex": "00AA88",
|
||||
"id": "cachyos",
|
||||
"ids": [
|
||||
"cachyos"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "cachyos",
|
||||
"sourceURL": "https://commons.wikimedia.org/wiki/File:CachyOS_Logo.svg",
|
||||
"title": "CachyOS"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-centos",
|
||||
"hex": "262577",
|
||||
@@ -79,6 +118,19 @@
|
||||
"sourceURL": "https://commons.wikimedia.org/wiki/File:Deepin_logo.svg",
|
||||
"title": "deepin"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-devuan",
|
||||
"hex": "004489",
|
||||
"id": "devuan",
|
||||
"ids": [
|
||||
"devuan"
|
||||
],
|
||||
"license": "CC-BY-SA-4.0",
|
||||
"package": "simple-icons",
|
||||
"slug": "devuan",
|
||||
"sourceURL": "https://git.devuan.org/devuan/documentation/src/commit/f4931e70e17f043c2824d591bba7c7f70ed583b6/art/graphics/logo/devuan-emblem.svg",
|
||||
"title": "Devuan"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-elementary",
|
||||
"hex": "64BAFF",
|
||||
@@ -118,6 +170,19 @@
|
||||
"sourceURL": "https://docs.fedoraproject.org/en-US/project/brand/",
|
||||
"title": "Fedora"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-garudalinux",
|
||||
"hex": "8839EF",
|
||||
"id": "garudalinux",
|
||||
"ids": [
|
||||
"garuda"
|
||||
],
|
||||
"license": "GPL-3.0-only",
|
||||
"package": "simple-icons",
|
||||
"slug": "garudalinux",
|
||||
"sourceURL": "https://gitlab.com/garuda-linux/themes-and-settings/artwork/garuda-icons/-/blob/aab26625fe01479ebc3a252103fca723baca9e88/usr/share/icons/garuda/distributor-logo-garuda-outline.svg",
|
||||
"title": "Garuda Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-gentoo",
|
||||
"hex": "54487A",
|
||||
@@ -196,6 +261,19 @@
|
||||
"sourceURL": "https://manjaro.org",
|
||||
"title": "Manjaro"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-mxlinux",
|
||||
"hex": "000000",
|
||||
"id": "mxlinux",
|
||||
"ids": [
|
||||
"mx"
|
||||
],
|
||||
"license": "GPL-3.0-only",
|
||||
"package": "simple-icons",
|
||||
"slug": "mxlinux",
|
||||
"sourceURL": "https://mxlinux.org/art/",
|
||||
"title": "MX Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-nixos",
|
||||
"hex": "5277C3",
|
||||
@@ -209,6 +287,19 @@
|
||||
"sourceURL": "https://brand.nixos.org/logos/nixos-logomark-black-flat-minimal.svg",
|
||||
"title": "NixOS"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-nobaralinux",
|
||||
"hex": "000000",
|
||||
"id": "nobaralinux",
|
||||
"ids": [
|
||||
"nobara"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "nobaralinux",
|
||||
"sourceURL": "https://wiki.nobaraproject.org",
|
||||
"title": "Nobara Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-opensuse",
|
||||
"hex": "73BA25",
|
||||
@@ -225,6 +316,32 @@
|
||||
"sourceURL": "https://github.com/openSUSE/artwork/blob/33e94aa76837c09f03d1712705949b71a246a53b/logos/buttons/button-colour.svg",
|
||||
"title": "openSUSE"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-openwrt",
|
||||
"hex": "00B5E2",
|
||||
"id": "openwrt",
|
||||
"ids": [
|
||||
"openwrt"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "openwrt",
|
||||
"sourceURL": "https://openwrt.org/docs/guide-graphic-designer/openwrt-logo",
|
||||
"title": "OpenWrt"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-parrotsecurity",
|
||||
"hex": "15E0ED",
|
||||
"id": "parrotsecurity",
|
||||
"ids": [
|
||||
"parrot"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "parrotsecurity",
|
||||
"sourceURL": "https://gitlab.com/parrotsec/project/documentation/-/blob/d1d426b9cb3ea0efd16a2b34056c1ebb21bb9af9/static/img/parrot-logo.svg",
|
||||
"title": "Parrot Security"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-popos",
|
||||
"hex": "48B9C7",
|
||||
@@ -239,6 +356,19 @@
|
||||
"sourceURL": "https://github.com/system76/brand/blob/7a31740b54f929b62a165baa61dfb0b5164261e8/Pop_OS%20branding/Pop_icon.svg",
|
||||
"title": "Pop!_OS"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-qubesos",
|
||||
"hex": "3874D8",
|
||||
"id": "qubesos",
|
||||
"ids": [
|
||||
"qubes"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "qubesos",
|
||||
"sourceURL": "https://github.com/QubesOS/qubes-attachment/blob/ed7e552eb8a5fca4e099361d137793d3551b3968/icons/qubes-logo-home.svg",
|
||||
"title": "Qubes OS"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-raspberrypi",
|
||||
"hex": "A22846",
|
||||
@@ -280,6 +410,19 @@
|
||||
"sourceURL": "https://github.com/rocky-linux/branding/blob/94e97dd30b87d909cc4f6a6838a2926f77f9ac47/logo/src/icon-black.svg",
|
||||
"title": "Rocky Linux"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-slackware",
|
||||
"hex": "000000",
|
||||
"id": "slackware",
|
||||
"ids": [
|
||||
"slackware"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "slackware",
|
||||
"sourceURL": "https://en.wikipedia.org/wiki/Slackware",
|
||||
"title": "Slackware"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-solus",
|
||||
"hex": "5294E2",
|
||||
@@ -361,6 +504,19 @@
|
||||
"sourceURL": "https://commons.wikimedia.org/wiki/File:Xubuntu_Icon.svg",
|
||||
"title": "Xubuntu"
|
||||
},
|
||||
{
|
||||
"asset": "LinuxDistro-zorin",
|
||||
"hex": "15A6F0",
|
||||
"id": "zorin",
|
||||
"ids": [
|
||||
"zorin"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "zorin",
|
||||
"sourceURL": "https://zorin.com/press",
|
||||
"title": "Zorin"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-macos",
|
||||
"hex": "000000",
|
||||
@@ -374,6 +530,72 @@
|
||||
"sourceURL": "https://www.apple.com",
|
||||
"title": "macOS"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-bsd",
|
||||
"hex": "AB2B28",
|
||||
"id": "bsd",
|
||||
"ids": [
|
||||
"bsd",
|
||||
"dragonfly"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "bsd",
|
||||
"sourceURL": "https://freebsdfoundation.org/about-us/about-the-foundation/project",
|
||||
"title": "BSD"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-freebsd",
|
||||
"hex": "AB2B28",
|
||||
"id": "freebsd",
|
||||
"ids": [
|
||||
"freebsd"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "freebsd",
|
||||
"sourceURL": "https://www.freebsdfoundation.org/about/project/",
|
||||
"title": "FreeBSD"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-openbsd",
|
||||
"hex": "F2CA30",
|
||||
"id": "openbsd",
|
||||
"ids": [
|
||||
"openbsd"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "openbsd",
|
||||
"sourceURL": "https://en.wikipedia.org/wiki/OpenBSD",
|
||||
"title": "OpenBSD"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-netbsd",
|
||||
"hex": "FF6600",
|
||||
"id": "netbsd",
|
||||
"ids": [
|
||||
"netbsd"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "netbsd",
|
||||
"sourceURL": "https://www.netbsd.org",
|
||||
"title": "NetBSD"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-linux",
|
||||
"hex": "FCC624",
|
||||
"id": "linux",
|
||||
"ids": [
|
||||
"linux"
|
||||
],
|
||||
"license": null,
|
||||
"package": "simple-icons",
|
||||
"slug": "linux",
|
||||
"sourceURL": "https://www.linuxfoundation.org/the-linux-mark/",
|
||||
"title": "Linux"
|
||||
},
|
||||
{
|
||||
"asset": "HostOS-windows",
|
||||
"colorSource": "Termind presentation choice",
|
||||
|
||||
@@ -138,13 +138,14 @@ public nonisolated enum RemoteDistributionDetection: Hashable, Sendable {
|
||||
extension RemoteSystemInfo {
|
||||
public var distributionDetection: RemoteDistributionDetection {
|
||||
guard let kernelName else { return .unavailable }
|
||||
if kernelName.caseInsensitiveCompare("Darwin") == .orderedSame {
|
||||
let kernel = kernelName.lowercased()
|
||||
if kernel == "darwin" {
|
||||
return .resolved(DetectedDistribution(id: "macos"))
|
||||
}
|
||||
guard kernelName.caseInsensitiveCompare("Linux") == .orderedSame else { return .resolved(nil) }
|
||||
guard let distributionID,
|
||||
let distribution = DetectedDistribution(id: distributionID, likeIDs: distributionLikeIDs)
|
||||
else { return .unavailable }
|
||||
return .resolved(distribution)
|
||||
if ["freebsd", "openbsd", "netbsd", "dragonfly"].contains(kernel) {
|
||||
return .resolved(DetectedDistribution(id: kernel))
|
||||
}
|
||||
guard kernel == "linux" else { return .resolved(nil) }
|
||||
return .resolved(DetectedDistribution(id: distributionID ?? "linux", likeIDs: distributionLikeIDs))
|
||||
}
|
||||
}
|
||||
@@ -37,10 +37,11 @@ public nonisolated struct HostIconCatalog: Codable, Sendable {
|
||||
}
|
||||
|
||||
public var selectableEntries: [HostIconEntry] {
|
||||
let platforms = ["macos", "windows"].compactMap { id in entries.first { $0.id == id } }
|
||||
return platforms
|
||||
+ entries.filter { $0.id != "macos" && $0.id != "windows" }
|
||||
.sorted { $0.title.localizedStandardCompare($1.title) == .orderedAscending }
|
||||
entries.sorted {
|
||||
let comparison = $0.title.compare(
|
||||
$1.title, options: [.caseInsensitive], locale: Locale(identifier: "en_US"))
|
||||
return comparison == .orderedSame ? $0.id < $1.id : comparison == .orderedAscending
|
||||
}
|
||||
}
|
||||
|
||||
public func entry(matching distribution: DetectedDistribution) -> HostIconEntry? {
|
||||
@@ -49,6 +50,8 @@ public nonisolated struct HostIconCatalog: Codable, Sendable {
|
||||
uniquingKeysWith: { first, _ in first }
|
||||
)
|
||||
if let exact = byID[distribution.id] { return exact }
|
||||
return distribution.likeIDs.lazy.compactMap { byID[$0] }.first
|
||||
if let related = distribution.likeIDs.lazy.compactMap({ byID[$0] }).first { return related }
|
||||
// Detection only persists supported OS families; BSD and macOS match above.
|
||||
return byID["linux"]
|
||||
}
|
||||
}
|
||||
@@ -2,32 +2,44 @@
|
||||
{ "title": "AlmaLinux", "slug": "almalinux", "ids": ["almalinux", "alma"] },
|
||||
{ "title": "Alpine Linux", "slug": "alpinelinux", "ids": ["alpine"] },
|
||||
{ "title": "Arch Linux", "slug": "archlinux", "ids": ["arch"] },
|
||||
{ "title": "Artix Linux", "slug": "artixlinux", "ids": ["artix"] },
|
||||
{ "title": "Asahi Linux", "slug": "asahilinux", "ids": ["asahi"] },
|
||||
{ "title": "CachyOS", "slug": "cachyos", "ids": ["cachyos"] },
|
||||
{ "title": "CentOS", "slug": "centos", "ids": ["centos"] },
|
||||
{ "title": "Debian", "slug": "debian", "ids": ["debian"] },
|
||||
{ "title": "deepin", "slug": "deepin", "ids": ["deepin"] },
|
||||
{ "title": "Devuan", "slug": "devuan", "ids": ["devuan"] },
|
||||
{ "title": "elementary", "slug": "elementary", "ids": ["elementary"] },
|
||||
{ "title": "EndeavourOS", "slug": "endeavouros", "ids": ["endeavouros"] },
|
||||
{ "title": "Fedora", "slug": "fedora", "ids": ["fedora"] },
|
||||
{ "title": "Garuda Linux", "slug": "garudalinux", "ids": ["garuda"] },
|
||||
{ "title": "Gentoo", "slug": "gentoo", "ids": ["gentoo"] },
|
||||
{ "title": "Kali Linux", "slug": "kalilinux", "ids": ["kali"] },
|
||||
{ "title": "Kubuntu", "slug": "kubuntu", "ids": ["kubuntu"] },
|
||||
{ "title": "Linux Mint", "slug": "linuxmint", "ids": ["linuxmint"] },
|
||||
{ "title": "Lubuntu", "slug": "lubuntu", "ids": ["lubuntu"] },
|
||||
{ "title": "Manjaro", "slug": "manjaro", "ids": ["manjaro"] },
|
||||
{ "title": "MX Linux", "slug": "mxlinux", "ids": ["mx"] },
|
||||
{ "title": "NixOS", "slug": "nixos", "ids": ["nixos"] },
|
||||
{ "title": "Nobara Linux", "slug": "nobaralinux", "ids": ["nobara"] },
|
||||
{
|
||||
"title": "openSUSE",
|
||||
"slug": "opensuse",
|
||||
"ids": ["opensuse", "opensuse-leap", "opensuse-tumbleweed", "opensuse-microos"]
|
||||
},
|
||||
{ "title": "OpenWrt", "slug": "openwrt", "ids": ["openwrt"] },
|
||||
{ "title": "Parrot Security", "slug": "parrotsecurity", "ids": ["parrot"] },
|
||||
{ "title": "Pop!_OS", "slug": "popos", "ids": ["pop", "popos"] },
|
||||
{ "title": "Qubes OS", "slug": "qubesos", "ids": ["qubes"] },
|
||||
{ "title": "Raspberry Pi", "slug": "raspberrypi", "ids": ["raspbian", "raspberrypios"] },
|
||||
{ "title": "Red Hat", "slug": "redhat", "ids": ["rhel", "redhat"] },
|
||||
{ "title": "Rocky Linux", "slug": "rockylinux", "ids": ["rocky"] },
|
||||
{ "title": "Slackware", "slug": "slackware", "ids": ["slackware"] },
|
||||
{ "title": "Solus", "slug": "solus", "ids": ["solus"] },
|
||||
{ "title": "SUSE", "slug": "suse", "ids": ["suse", "sles", "sled"] },
|
||||
{ "title": "Ubuntu", "slug": "ubuntu", "ids": ["ubuntu"] },
|
||||
{ "title": "Ubuntu MATE", "slug": "ubuntumate", "ids": ["ubuntu-mate", "ubuntu-mate-desktop"] },
|
||||
{ "title": "Void Linux", "slug": "voidlinux", "ids": ["void"] },
|
||||
{ "title": "Xubuntu", "slug": "xubuntu", "ids": ["xubuntu"] }
|
||||
{ "title": "Xubuntu", "slug": "xubuntu", "ids": ["xubuntu"] },
|
||||
{ "title": "Zorin", "slug": "zorin", "ids": ["zorin"] }
|
||||
]
|
||||
@@ -72,6 +72,14 @@ def main():
|
||||
metadata = {entry["title"]: entry for entry in json.loads(read(simple, "data/simple-icons.json"))}
|
||||
requested = json.loads((ROOT / "Scripts/linux-distribution-icons.json").read_text())
|
||||
requested.append({"title": "Apple", "slug": "apple", "ids": ["macos"], "id": "macos"})
|
||||
for title, slug, ids in [
|
||||
("BSD", "bsd", ["bsd", "dragonfly"]),
|
||||
("FreeBSD", "freebsd", ["freebsd"]),
|
||||
("OpenBSD", "openbsd", ["openbsd"]),
|
||||
("NetBSD", "netbsd", ["netbsd"]),
|
||||
("Linux", "linux", ["linux"]),
|
||||
]:
|
||||
requested.append({"title": title, "slug": slug, "ids": ids, "id": slug})
|
||||
with tempfile.TemporaryDirectory(prefix="termind-host-icons-") as temporary:
|
||||
stage = Path(temporary)
|
||||
assets = stage / "assets"
|
||||
@@ -83,7 +91,7 @@ def main():
|
||||
for item in requested:
|
||||
info = metadata[item["title"]]
|
||||
is_mac = item.get("id") == "macos"
|
||||
asset = "HostOS-macos" if is_mac else "LinuxDistro-" + item["slug"]
|
||||
asset = "HostOS-" + item["id"] if "id" in item else "LinuxDistro-" + item["slug"]
|
||||
write_icon(assets, asset, read(simple, "icons/" + item["slug"] + ".svg"))
|
||||
entries.append({
|
||||
"id": item.get("id", item["slug"]), "title": "macOS" if is_mac else item["title"],
|
||||
|
||||
@@ -1505,7 +1505,8 @@ private actor MobileTestSFTPClient: SFTPClientProtocol {
|
||||
|
||||
@Suite struct WorkspaceHostIconTests {
|
||||
@Test @MainActor func operatingSystemArtworkIsBundledOnMobile() {
|
||||
#expect(HostIconCatalog.bundled.selectableEntries.prefix(2).map(\.id) == ["macos", "windows"])
|
||||
#expect(HostIconCatalog.bundled.selectableEntries.first?.title == "AlmaLinux")
|
||||
#expect(HostIconCatalog.bundled.selectableEntries.last?.title == "Zorin")
|
||||
for entry in HostIconCatalog.bundled.entries {
|
||||
#expect(UIImage(named: entry.asset) != nil, Comment(rawValue: entry.asset))
|
||||
}
|
||||
|
||||
@@ -41,12 +41,13 @@ struct MobileHostIntegrationRenderingTests {
|
||||
descendants(controller.view).compactMap { $0 as? UIButton }.first { $0.showsMenuAsPrimaryAction })
|
||||
let actions = try await menuActions(in: picker, expectedCount: HostIconCatalog.bundled.entries.count + 2)
|
||||
#expect(
|
||||
actions.prefix(4).map(\.title) == [
|
||||
actions.prefix(2).map(\.title) == [
|
||||
AppLocalization.string("Automatic", locale: Locale(identifier: language)),
|
||||
AppLocalization.string("Server", locale: Locale(identifier: language)), "macOS", "Windows",
|
||||
AppLocalization.string("Server", locale: Locale(identifier: language)),
|
||||
])
|
||||
#expect(actions.dropFirst(2).map(\.title) == HostIconCatalog.bundled.selectableEntries.map(\.title))
|
||||
#expect(actions.first?.state == .on)
|
||||
picker.sendAction(actions[3])
|
||||
picker.sendAction(try #require(actions.first { $0.title == "Windows" }))
|
||||
#expect(draft.host.iconOverrideID == "windows")
|
||||
#expect(draft.host.detectedDistribution?.id == "macos")
|
||||
for style in [UIUserInterfaceStyle.light, .dark] {
|
||||
|
||||
@@ -44,6 +44,11 @@ struct MobileWorkspaceSessionTests {
|
||||
try await Task.sleep(for: .milliseconds(10))
|
||||
}
|
||||
#expect(workspace.activitySession.iconAsset == "LinuxDistro-ubuntu")
|
||||
workspace.receiveShellEvent(.systemInfo(RemoteSystemInfo(kernelName: "DragonFly")))
|
||||
#expect(workspace.activitySession.iconAsset == "HostOS-bsd")
|
||||
#expect(app.library.host(host.id)?.detectedDistribution?.id == "dragonfly")
|
||||
workspace.receiveShellEvent(.systemInfo(RemoteSystemInfo(distributionID: "custom-linux", kernelName: "Linux")))
|
||||
#expect(workspace.activitySession.iconAsset == "HostOS-linux")
|
||||
#expect(workspace.status == originalStatus)
|
||||
#expect(session.openWorkspace(id) === workspace)
|
||||
}
|
||||
|
||||
@@ -7,9 +7,23 @@ import Testing
|
||||
|
||||
@Suite @MainActor
|
||||
struct HostIconPresentationTests {
|
||||
@Test(arguments: [
|
||||
("artix", "Artix Linux"), ("asahi", "Asahi Linux"), ("cachyos", "CachyOS"),
|
||||
("devuan", "Devuan"), ("garuda", "Garuda Linux"), ("mx", "MX Linux"),
|
||||
("nobara", "Nobara Linux"), ("openwrt", "OpenWrt"), ("parrot", "Parrot Security"),
|
||||
("qubes", "Qubes OS"), ("slackware", "Slackware"), ("zorin", "Zorin"),
|
||||
("freebsd", "FreeBSD"), ("openbsd", "OpenBSD"), ("netbsd", "NetBSD"), ("dragonfly", "BSD"),
|
||||
("linux", "Linux"), ("unlisted-linux", "Linux"),
|
||||
])
|
||||
func expandedCatalogMatchesSystemIdentifiers(id: String, title: String) throws {
|
||||
let distribution = try #require(DetectedDistribution(id: id))
|
||||
#expect(HostIconCatalog.entry(for: distribution)?.title == title)
|
||||
}
|
||||
|
||||
@Test func bundledArtworkCanBeLoadedAndManualSelectionWins() throws {
|
||||
let catalog = HostIconCatalog.bundled
|
||||
#expect(catalog.selectableEntries.prefix(2).map(\.id) == ["macos", "windows"])
|
||||
#expect(catalog.selectableEntries.first?.title == "AlmaLinux")
|
||||
#expect(catalog.selectableEntries.last?.title == "Zorin")
|
||||
for entry in catalog.entries {
|
||||
#expect(NSImage(named: entry.asset) != nil, Comment(rawValue: entry.asset))
|
||||
}
|
||||
|
||||
@@ -727,6 +727,17 @@ struct ShellIntegrationBootstrapTests {
|
||||
#expect(completed.systemInfo?.architecture == "arm64")
|
||||
}
|
||||
|
||||
@Test(arguments: ["FreeBSD", "OpenBSD", "NetBSD", "DragonFly"], ["||", "|||"])
|
||||
func bsdKernelOnlyRecordsRetainTheirSystemIdentity(kernel: String, prefix: String) throws {
|
||||
var bootstrap = RemoteShellIntegrationBootstrap(token: "BSD")
|
||||
let marker = "__TRMD_BSD_SYSTEM__\(prefix)\(kernel)|14.1|amd64__\r\n__TRMD_BSD_SHELL__/bin/zsh__\r\n"
|
||||
_ = try #require(bootstrap.receive(Data(marker.utf8)).command)
|
||||
let completed = bootstrap.receive(Data("__TRMD_BSD_DONE__\r\n".utf8))
|
||||
#expect(completed.integrationInstalled)
|
||||
#expect(completed.systemInfo?.distributionDetection == .resolved(DetectedDistribution(id: kernel)))
|
||||
#expect(completed.systemInfo?.distributionID == nil)
|
||||
}
|
||||
|
||||
@Test func existingProbeReadsDarwinOnTheLocalMac() throws {
|
||||
var bootstrap = RemoteShellIntegrationBootstrap(token: "LOCALMAC")
|
||||
var script = Data("export SHELL=/bin/zsh\n".utf8)
|
||||
|
||||