forked from mirrors/jj
cli: Refactor workspace root directory creation
* Add file_util::create_or_reuse_dir() which is needed by all init functionality regardless of the backend.
This commit is contained in:
parent
b3c47953e8
commit
8423c63a04
2 changed files with 19 additions and 11 deletions
|
@ -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 _;
|
||||
|
@ -51,16 +51,11 @@ 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_with_message("Failed to create workspace", e)),
|
||||
}
|
||||
let wc_path = wc_path
|
||||
.canonicalize()
|
||||
.map_err(|e| user_error_with_message("Failed to create workspace", e))?; // raced?
|
||||
let cwd = command.cwd().canonicalize().unwrap();
|
||||
let wc_path = cwd.join(&args.destination);
|
||||
let wc_path = file_util::create_or_reuse_dir(&wc_path)
|
||||
.and_then(|_| wc_path.canonicalize())
|
||||
.map_err(|e| user_error_with_message("Failed to create workspace", e))?;
|
||||
let relative_wc_path = file_util::relative_path(&cwd, &wc_path);
|
||||
|
||||
if let Some(git_store_str) = &args.git_repo {
|
||||
|
|
|
@ -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};
|
||||
|
||||
|
@ -42,6 +42,19 @@ impl<T> IoResultExt<T> for io::Result<T> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates a directory or does nothing if the directory already exists.
|
||||
///
|
||||
/// 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) -> io::Result<()> {
|
||||
match fs::create_dir(dirname) {
|
||||
Ok(()) => Ok(()),
|
||||
Err(_) if dirname.is_dir() => Ok(()),
|
||||
Err(e) => Err(e),
|
||||
}
|
||||
}
|
||||
|
||||
/// 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
|
||||
|
|
Loading…
Reference in a new issue