Files
container/Sources/ContainerPersistence/PathUtils.swift
T
Noah Thornton a967399d48 Add support for layered and plugin configurations (#1543)
- This adds support for reading configurations from
  a three layer hierarchy:
  1. User provided TOML
  2. Install root TOML
  3. Code defaults
- We add some code to support plugin configurations
  via the ConfigurationLoader. Each plugin can provide
  a struct with an accompanying id that gets used to
  parse the scoped section of the TOML.
2026-05-12 14:35:21 -07:00

63 lines
2.7 KiB
Swift

//===----------------------------------------------------------------------===//
// Copyright © 2026 Apple Inc. and the container project authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
import ContainerVersion
import Foundation
import SystemPackage
public enum PathUtils {
public enum BaseConfigPath {
case home
case appRoot
case installRoot
public func basePath(env: [String: String] = ProcessInfo.processInfo.environment) -> FilePath {
switch self {
case .home:
let configHome: String
if let xdg = env["XDG_CONFIG_HOME"], !xdg.isEmpty {
configHome = xdg
} else {
configHome = NSHomeDirectory() + "/.config"
}
return FilePath(configHome).appending("container")
case .appRoot:
if let envPath = env["CONTAINER_APP_ROOT"], !envPath.isEmpty {
return FilePath(envPath)
}
let appSupportURL = FileManager.default.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first!.appendingPathComponent("com.apple.container")
return FilePath(appSupportURL.path(percentEncoded: false))
case .installRoot:
if let envPath = env["CONTAINER_INSTALL_ROOT"], !envPath.isEmpty {
return FilePath(envPath)
}
// Use the kernel-recorded executable path (via _NSGetExecutablePath)
// rather than argv[0]: when the binary is invoked through PATH (e.g.
// `container ...`), argv[0] is just the basename and resolves to an
// empty FilePath, which FileManager treats as CWD-relative.
let installRootURL = CommandLine.executablePathUrl
.deletingLastPathComponent()
.appendingPathComponent("..")
.standardized
return FilePath(installRootURL.path(percentEncoded: false))
}
}
}
}