Skip to content

Commit

Permalink
cli: Refactor workspace root directory creation
Browse files Browse the repository at this point in the history
* Add Workspace::create_workspace_root() which is needed by all init
  functionality regardless of the backend.
  • Loading branch information
essiene committed Jan 16, 2024
1 parent dc07436 commit 6fc1ac8
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
13 changes: 3 additions & 10 deletions cli/src/commands/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

use std::io;
use std::io::Write;
use std::{fs, io};

use clap::ArgGroup;
use itertools::Itertools as _;
Expand Down Expand Up @@ -53,15 +53,8 @@ pub(crate) fn cmd_init(
command: &CommandHelper,
args: &InitArgs,
) -> Result<(), CommandError> {
let wc_path = command.cwd().join(&args.destination);
match fs::create_dir(&wc_path) {
Ok(()) => {}
Err(_) if wc_path.is_dir() => {}
Err(e) => return Err(user_error(format!("Failed to create workspace: {e}"))),
}
let wc_path = wc_path
.canonicalize()
.map_err(|e| user_error(format!("Failed to create workspace: {e}")))?; // raced?
let wc_path = file_util::create_or_reuse_dir(&command.cwd().join(&args.destination))
.map_err(|e| user_error(format!("Failed to create workspace: {e}")))?;
let cwd = command.cwd().canonicalize().unwrap();
let relative_wc_path = file_util::relative_path(&cwd, &wc_path);

Expand Down
21 changes: 20 additions & 1 deletion lib/src/file_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

#![allow(missing_docs)]

use std::fs::File;
use std::fs::{self, File};
use std::path::{Component, Path, PathBuf};
use std::{io, iter};

Expand Down Expand Up @@ -42,6 +42,25 @@ impl<T> IoResultExt<T> for io::Result<T> {
}
}

/// Creates a directory and returns it's canonicalized path.
///
/// If the directory already exists, will only return it's canonicalized path
/// without doing anything.
///
/// Returns the underlying error if the directory can't be created.
/// The function will also fail if intermediate directories on the path do not
/// already exist.
pub fn create_or_reuse_dir(dirname: &Path) -> std::io::Result<PathBuf> {
match fs::create_dir(dirname) {
Ok(()) => {}
Err(_) if dirname.is_dir() => {}
Err(e) => return Err(e),
}

// if it fails, race condition?
dirname.canonicalize()
}

/// Turns the given `to` path into relative path starting from the `from` path.
///
/// Both `from` and `to` paths are supposed to be absolute and normalized in the
Expand Down

0 comments on commit 6fc1ac8

Please sign in to comment.