blob: 9566dfffea26bf5b110efa03776cf527a10a6525 [file] [log] [blame]
// 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);
}
}