view rust/rhg/src/utils/path_utils.rs @ 48674:f7086f6173f8 stable

dirstate-v2: rename the configuration to enable the format The rename of the old experimental name was overlooked before the 6.0 release. We rename everything to use the new name (and keep the released name as an alias for compatibility). Differential Revision: https://phab.mercurial-scm.org/D12129
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 01 Feb 2022 16:36:20 +0100
parents 9ecf802b06e0
children 10c32e1b892a
line wrap: on
line source

// path utils module
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.

use crate::error::CommandError;
use crate::ui::UiError;
use hg::repo::Repo;
use hg::utils::current_dir;
use hg::utils::files::{get_bytes_from_path, relativize_path};
use hg::utils::hg_path::HgPath;
use hg::utils::hg_path::HgPathBuf;
use std::borrow::Cow;

pub fn relativize_paths(
    repo: &Repo,
    paths: impl IntoIterator<Item = impl AsRef<HgPath>>,
    mut callback: impl FnMut(Cow<[u8]>) -> Result<(), UiError>,
) -> Result<(), CommandError> {
    let cwd = current_dir()?;
    let repo_root = repo.working_directory_path();
    let repo_root = cwd.join(repo_root); // Make it absolute
    let repo_root_hgpath =
        HgPathBuf::from(get_bytes_from_path(repo_root.to_owned()));
    let outside_repo: bool;
    let cwd_hgpath: HgPathBuf;

    if let Ok(cwd_relative_to_repo) = cwd.strip_prefix(&repo_root) {
        // The current directory is inside the repo, so we can work with
        // relative paths
        outside_repo = false;
        cwd_hgpath =
            HgPathBuf::from(get_bytes_from_path(cwd_relative_to_repo));
    } else {
        outside_repo = true;
        cwd_hgpath = HgPathBuf::from(get_bytes_from_path(cwd));
    }

    for file in paths {
        if outside_repo {
            let file = repo_root_hgpath.join(file.as_ref());
            callback(relativize_path(&file, &cwd_hgpath))?;
        } else {
            callback(relativize_path(file.as_ref(), &cwd_hgpath))?;
        }
    }
    Ok(())
}