rust/rhg/src/utils/path_utils.rs
changeset 48453 9b0e1f64656f
parent 48342 10c32e1b892a
child 49914 58074252db3c
equal deleted inserted replaced
48452:2afaa0145584 48453:9b0e1f64656f
     1 // path utils module
     1 // path utils module
     2 //
     2 //
     3 // This software may be used and distributed according to the terms of the
     3 // This software may be used and distributed according to the terms of the
     4 // GNU General Public License version 2 or any later version.
     4 // GNU General Public License version 2 or any later version.
     5 
     5 
     6 use crate::error::CommandError;
       
     7 use crate::ui::UiError;
       
     8 use hg::errors::HgError;
     6 use hg::errors::HgError;
     9 use hg::repo::Repo;
     7 use hg::repo::Repo;
    10 use hg::utils::current_dir;
     8 use hg::utils::current_dir;
    11 use hg::utils::files::{get_bytes_from_path, relativize_path};
     9 use hg::utils::files::{get_bytes_from_path, relativize_path};
    12 use hg::utils::hg_path::HgPath;
    10 use hg::utils::hg_path::HgPath;
    13 use hg::utils::hg_path::HgPathBuf;
    11 use hg::utils::hg_path::HgPathBuf;
    14 use std::borrow::Cow;
    12 use std::borrow::Cow;
    15 
    13 
    16 pub fn relativize_paths(
    14 pub struct RelativizePaths {
    17     repo: &Repo,
    15     repo_root: HgPathBuf,
    18     paths: impl IntoIterator<Item = Result<impl AsRef<HgPath>, HgError>>,
    16     cwd: HgPathBuf,
    19     mut callback: impl FnMut(Cow<[u8]>) -> Result<(), UiError>,
    17     outside_repo: bool,
    20 ) -> Result<(), CommandError> {
    18 }
    21     let cwd = current_dir()?;
       
    22     let repo_root = repo.working_directory_path();
       
    23     let repo_root = cwd.join(repo_root); // Make it absolute
       
    24     let repo_root_hgpath =
       
    25         HgPathBuf::from(get_bytes_from_path(repo_root.to_owned()));
       
    26     let outside_repo: bool;
       
    27     let cwd_hgpath: HgPathBuf;
       
    28 
    19 
    29     if let Ok(cwd_relative_to_repo) = cwd.strip_prefix(&repo_root) {
    20 impl RelativizePaths {
    30         // The current directory is inside the repo, so we can work with
    21     pub fn new(repo: &Repo) -> Result<Self, HgError> {
    31         // relative paths
    22         let cwd = current_dir()?;
    32         outside_repo = false;
    23         let repo_root = repo.working_directory_path();
    33         cwd_hgpath =
    24         let repo_root = cwd.join(repo_root); // Make it absolute
    34             HgPathBuf::from(get_bytes_from_path(cwd_relative_to_repo));
    25         let repo_root_hgpath =
    35     } else {
    26             HgPathBuf::from(get_bytes_from_path(repo_root.to_owned()));
    36         outside_repo = true;
    27 
    37         cwd_hgpath = HgPathBuf::from(get_bytes_from_path(cwd));
    28         if let Ok(cwd_relative_to_repo) = cwd.strip_prefix(&repo_root) {
       
    29             // The current directory is inside the repo, so we can work with
       
    30             // relative paths
       
    31             Ok(Self {
       
    32                 repo_root: repo_root_hgpath,
       
    33                 cwd: HgPathBuf::from(get_bytes_from_path(
       
    34                     cwd_relative_to_repo,
       
    35                 )),
       
    36                 outside_repo: false,
       
    37             })
       
    38         } else {
       
    39             Ok(Self {
       
    40                 repo_root: repo_root_hgpath,
       
    41                 cwd: HgPathBuf::from(get_bytes_from_path(cwd)),
       
    42                 outside_repo: true,
       
    43             })
       
    44         }
    38     }
    45     }
    39 
    46 
    40     for file in paths {
    47     pub fn relativize<'a>(&self, path: &'a HgPath) -> Cow<'a, [u8]> {
    41         if outside_repo {
    48         if self.outside_repo {
    42             let file = repo_root_hgpath.join(file?.as_ref());
    49             let joined = self.repo_root.join(path);
    43             callback(relativize_path(&file, &cwd_hgpath))?;
    50             Cow::Owned(relativize_path(&joined, &self.cwd).into_owned())
    44         } else {
    51         } else {
    45             callback(relativize_path(file?.as_ref(), &cwd_hgpath))?;
    52             relativize_path(path, &self.cwd)
    46         }
    53         }
    47     }
    54     }
    48     Ok(())
       
    49 }
    55 }