| // Copyright 2020 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| use anyhow::{anyhow, Context}; | |
| use std::ffi::OsStr; | |
| use std::path::PathBuf; | |
| use std::{env, fs, io}; | |
| /// Return the fuchsia root directory. | |
| pub fn get_fuchsia_root() -> Result<PathBuf, anyhow::Error> { | |
| let dir = env::var("FUCHSIA_DIR").context("failed to get_fuchsia_root")?; | |
| Ok(fs::canonicalize(dir).context("failed to get_fuchsia_root")?) | |
| } | |
| /// Returns the path to the template files. | |
| pub fn get_templates_dir_path() -> io::Result<PathBuf> { | |
| let exe_path = env::current_exe()?; | |
| let exe_dir_path = exe_path.parent().ok_or_else(|| { | |
| io::Error::new(io::ErrorKind::InvalidData, anyhow!("exe directory is root")) | |
| })?; | |
| Ok(exe_dir_path.join("create_templates")) | |
| } | |
| /// Converts an OS-specific filename to a String, returning an io::Error | |
| /// if a failure occurs. The io::Error contains the invalid filename, | |
| /// which gives the user a better indication of what went wrong. | |
| pub fn filename_to_string(filename: impl AsRef<OsStr>) -> io::Result<String> { | |
| let filename = filename.as_ref(); | |
| Ok(filename | |
| .to_str() | |
| .ok_or_else(|| { | |
| io::Error::new(io::ErrorKind::InvalidData, anyhow!("invalid filename {:?}", filename)) | |
| })? | |
| .to_string()) | |
| } | |
| #[cfg(test)] | |
| mod tests { | |
| use super::*; | |
| use crate::test_util::lock_test_environment; | |
| use std::env; | |
| use std::os::unix; | |
| #[test] | |
| fn get_fuchsia_root_resolves_symlinks() { | |
| // Create a test environment and lock it to prevent races between tests | |
| // that modify the environment. | |
| let test_env = lock_test_environment(); | |
| let subdir_path = test_env.path().join("subdir"); | |
| let link_path = test_env.path().join("symlink"); | |
| let _subdir = | |
| std::fs::File::create(&subdir_path).expect("internal error: failed to create sub dir"); | |
| let _link = unix::fs::symlink(&subdir_path, &link_path); | |
| // Set FUCHSIA_DIR to a symlink. | |
| env::set_var("FUCHSIA_DIR", link_path); | |
| let fuchsia_root = get_fuchsia_root(); | |
| assert!(fuchsia_root.is_ok(), fuchsia_root); | |
| assert_eq!(fuchsia_root.unwrap(), subdir_path); | |
| } | |
| } |