mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-27 19:17:43 +00:00
Merge pull request #8251 from sylvestre/l10n-mv
l10n: port mv for translation + add french
This commit is contained in:
commit
6a30c74475
4 changed files with 232 additions and 70 deletions
|
@ -14,3 +14,50 @@ mv-after-help = When specifying more than one of -i, -f, -n, only the final one
|
||||||
- all This is the default operation when an --update option is not specified, and results in all existing files in the destination being replaced.
|
- all This is the default operation when an --update option is not specified, and results in all existing files in the destination being replaced.
|
||||||
- none This is similar to the --no-clobber option, in that no files in the destination are replaced, but also skipping a file does not induce a failure.
|
- none This is similar to the --no-clobber option, in that no files in the destination are replaced, but also skipping a file does not induce a failure.
|
||||||
- older This is the default operation when --update is specified, and results in files being replaced if they’re older than the corresponding source file.
|
- older This is the default operation when --update is specified, and results in files being replaced if they’re older than the corresponding source file.
|
||||||
|
|
||||||
|
# Error messages
|
||||||
|
mv-error-no-such-file = cannot stat {$path}: No such file or directory
|
||||||
|
mv-error-cannot-stat-not-directory = cannot stat {$path}: Not a directory
|
||||||
|
mv-error-same-file = {$source} and {$target} are the same file
|
||||||
|
mv-error-self-target-subdirectory = cannot move {$source} to a subdirectory of itself, {$target}
|
||||||
|
mv-error-directory-to-non-directory = cannot overwrite directory {$path} with non-directory
|
||||||
|
mv-error-non-directory-to-directory = cannot overwrite non-directory {$target} with directory {$source}
|
||||||
|
mv-error-not-directory = target {$path}: Not a directory
|
||||||
|
mv-error-target-not-directory = target directory {$path}: Not a directory
|
||||||
|
mv-error-failed-access-not-directory = failed to access {$path}: Not a directory
|
||||||
|
mv-error-backup-with-no-clobber = cannot combine --backup with -n/--no-clobber or --update=none-fail
|
||||||
|
mv-error-extra-operand = mv: extra operand {$operand}
|
||||||
|
mv-error-backup-might-destroy-source = backing up {$target} might destroy source; {$source} not moved
|
||||||
|
mv-error-will-not-overwrite-just-created = will not overwrite just-created '{$target}' with '{$source}'
|
||||||
|
mv-error-not-replacing = not replacing {$target}
|
||||||
|
mv-error-cannot-move = cannot move {$source} to {$target}
|
||||||
|
mv-error-directory-not-empty = Directory not empty
|
||||||
|
mv-error-dangling-symlink = can't determine symlink type, since it is dangling
|
||||||
|
mv-error-no-symlink-support = your operating system does not support symlinks
|
||||||
|
mv-error-permission-denied = Permission denied
|
||||||
|
mv-error-inter-device-move-failed = inter-device move failed: '{$from}' to '{$to}'; unable to remove target: {$err}
|
||||||
|
|
||||||
|
# Help messages
|
||||||
|
mv-help-force = do not prompt before overwriting
|
||||||
|
mv-help-interactive = prompt before override
|
||||||
|
mv-help-no-clobber = do not overwrite an existing file
|
||||||
|
mv-help-strip-trailing-slashes = remove any trailing slashes from each SOURCE argument
|
||||||
|
mv-help-target-directory = move all SOURCE arguments into DIRECTORY
|
||||||
|
mv-help-no-target-directory = treat DEST as a normal file
|
||||||
|
mv-help-verbose = explain what is being done
|
||||||
|
mv-help-progress = Display a progress bar.
|
||||||
|
Note: this feature is not supported by GNU coreutils.
|
||||||
|
mv-help-debug = explain how a file is copied. Implies -v
|
||||||
|
|
||||||
|
# Verbose messages
|
||||||
|
mv-verbose-renamed = renamed {$from} -> {$to}
|
||||||
|
mv-verbose-renamed-with-backup = renamed {$from} -> {$to} (backup: {$backup})
|
||||||
|
|
||||||
|
# Debug messages
|
||||||
|
mv-debug-skipped = skipped {$target}
|
||||||
|
|
||||||
|
# Prompt messages
|
||||||
|
mv-prompt-overwrite = overwrite {$target}?
|
||||||
|
|
||||||
|
# Progress messages
|
||||||
|
mv-progress-moving = moving
|
||||||
|
|
63
src/uu/mv/locales/fr-FR.ftl
Normal file
63
src/uu/mv/locales/fr-FR.ftl
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
mv-about = Déplacer SOURCE vers DEST, ou plusieurs SOURCE(s) vers RÉPERTOIRE.
|
||||||
|
mv-usage = mv [OPTION]... [-T] SOURCE DEST
|
||||||
|
mv [OPTION]... SOURCE... RÉPERTOIRE
|
||||||
|
mv [OPTION]... -t RÉPERTOIRE SOURCE...
|
||||||
|
mv-after-help = Lors de la spécification de plus d'une option parmi -i, -f, -n, seule la dernière prend effet.
|
||||||
|
|
||||||
|
Ne pas déplacer un non-répertoire qui a une destination existante avec un horodatage de modification identique ou plus récent ;
|
||||||
|
au lieu de cela, ignorer silencieusement le fichier sans échouer. Si le déplacement traverse les limites du système de fichiers, la comparaison est
|
||||||
|
avec l'horodatage source tronqué aux résolutions du système de fichiers de destination et des appels système utilisés
|
||||||
|
pour mettre à jour les horodatages ; cela évite le travail en double si plusieurs commandes mv -u sont exécutées avec la même source
|
||||||
|
et destination. Cette option est ignorée si l'option -n ou --no-clobber est également spécifiée, qui donne plus de contrôle
|
||||||
|
sur quels fichiers existants dans la destination sont remplacés, et sa valeur peut être une des suivantes :
|
||||||
|
|
||||||
|
- all C'est l'opération par défaut quand une option --update n'est pas spécifiée, et résulte en tous les fichiers existants dans la destination étant remplacés.
|
||||||
|
- none C'est similaire à l'option --no-clobber, en ce que aucun fichier dans la destination n'est remplacé, mais aussi ignorer un fichier n'induit pas un échec.
|
||||||
|
- older C'est l'opération par défaut quand --update est spécifié, et résulte en des fichiers étant remplacés s'ils sont plus anciens que le fichier source correspondant.
|
||||||
|
|
||||||
|
# Messages d'erreur
|
||||||
|
mv-error-no-such-file = impossible de lire {$path} : Aucun fichier ou répertoire de ce nom
|
||||||
|
mv-error-cannot-stat-not-directory = impossible de lire {$path} : N'est pas un répertoire
|
||||||
|
mv-error-same-file = {$source} et {$target} sont le même fichier
|
||||||
|
mv-error-self-target-subdirectory = impossible de déplacer {$source} vers un sous-répertoire de lui-même, {$target}
|
||||||
|
mv-error-directory-to-non-directory = impossible d'écraser le répertoire {$path} avec un non-répertoire
|
||||||
|
mv-error-non-directory-to-directory = impossible d'écraser le non-répertoire {$target} avec le répertoire {$source}
|
||||||
|
mv-error-not-directory = cible {$path} : N'est pas un répertoire
|
||||||
|
mv-error-target-not-directory = répertoire cible {$path} : N'est pas un répertoire
|
||||||
|
mv-error-failed-access-not-directory = impossible d'accéder à {$path} : N'est pas un répertoire
|
||||||
|
mv-error-backup-with-no-clobber = impossible de combiner --backup avec -n/--no-clobber ou --update=none-fail
|
||||||
|
mv-error-extra-operand = mv : opérande supplémentaire {$operand}
|
||||||
|
mv-error-backup-might-destroy-source = sauvegarder {$target} pourrait détruire la source ; {$source} non déplacé
|
||||||
|
mv-error-will-not-overwrite-just-created = ne va pas écraser le fichier qui vient d'être créé '{$target}' avec '{$source}'
|
||||||
|
mv-error-not-replacing = ne remplace pas {$target}
|
||||||
|
mv-error-cannot-move = impossible de déplacer {$source} vers {$target}
|
||||||
|
mv-error-directory-not-empty = Répertoire non vide
|
||||||
|
mv-error-dangling-symlink = impossible de déterminer le type de lien symbolique, car il est suspendu
|
||||||
|
mv-error-no-symlink-support = votre système d'exploitation ne prend pas en charge les liens symboliques
|
||||||
|
mv-error-permission-denied = Permission refusée
|
||||||
|
mv-error-inter-device-move-failed = échec du déplacement inter-périphérique : '{$from}' vers '{$to}' ; impossible de supprimer la cible : {$err}
|
||||||
|
|
||||||
|
# Messages d'aide
|
||||||
|
mv-help-force = ne pas demander avant d'écraser
|
||||||
|
mv-help-interactive = demander avant d'écraser
|
||||||
|
mv-help-no-clobber = ne pas écraser un fichier existant
|
||||||
|
mv-help-strip-trailing-slashes = supprimer toutes les barres obliques de fin de chaque argument SOURCE
|
||||||
|
mv-help-target-directory = déplacer tous les arguments SOURCE dans RÉPERTOIRE
|
||||||
|
mv-help-no-target-directory = traiter DEST comme un fichier normal
|
||||||
|
mv-help-verbose = expliquer ce qui est fait
|
||||||
|
mv-help-progress = Afficher une barre de progression.
|
||||||
|
Note : cette fonctionnalité n'est pas supportée par GNU coreutils.
|
||||||
|
mv-help-debug = expliquer comment un fichier est copié. Implique -v
|
||||||
|
|
||||||
|
# Messages verbeux
|
||||||
|
mv-verbose-renamed = renommé {$from} -> {$to}
|
||||||
|
mv-verbose-renamed-with-backup = renommé {$from} -> {$to} (sauvegarde : {$backup})
|
||||||
|
|
||||||
|
# Messages de débogage
|
||||||
|
mv-debug-skipped = ignoré {$target}
|
||||||
|
|
||||||
|
# Messages de confirmation
|
||||||
|
mv-prompt-overwrite = écraser {$target} ?
|
||||||
|
|
||||||
|
# Messages de progression
|
||||||
|
mv-progress-moving = déplacement
|
|
@ -2,36 +2,30 @@
|
||||||
//
|
//
|
||||||
// For the full copyright and license information, please view the LICENSE
|
// For the full copyright and license information, please view the LICENSE
|
||||||
// file that was distributed with this source code.
|
// file that was distributed with this source code.
|
||||||
|
use std::collections::HashMap;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use uucore::error::UError;
|
use uucore::error::UError;
|
||||||
|
use uucore::locale::get_message_with_args;
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum MvError {
|
pub enum MvError {
|
||||||
#[error("cannot stat {0}: No such file or directory")]
|
#[error("{}", get_message_with_args("mv-error-no-such-file", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
NoSuchFile(String),
|
NoSuchFile(String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-cannot-stat-not-directory", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
#[error("cannot stat {0}: Not a directory")]
|
|
||||||
CannotStatNotADirectory(String),
|
CannotStatNotADirectory(String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-same-file", HashMap::from([("source".to_string(), .0.clone()), ("target".to_string(), .1.clone())])))]
|
||||||
#[error("{0} and {1} are the same file")]
|
|
||||||
SameFile(String, String),
|
SameFile(String, String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-self-target-subdirectory", HashMap::from([("source".to_string(), .0.clone()), ("target".to_string(), .1.clone())])))]
|
||||||
#[error("cannot move {0} to a subdirectory of itself, {1}")]
|
|
||||||
SelfTargetSubdirectory(String, String),
|
SelfTargetSubdirectory(String, String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-directory-to-non-directory", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
#[error("cannot overwrite directory {0} with non-directory")]
|
|
||||||
DirectoryToNonDirectory(String),
|
DirectoryToNonDirectory(String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-non-directory-to-directory", HashMap::from([("source".to_string(), .0.clone()), ("target".to_string(), .1.clone())])))]
|
||||||
#[error("cannot overwrite non-directory {1} with directory {0}")]
|
|
||||||
NonDirectoryToDirectory(String, String),
|
NonDirectoryToDirectory(String, String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-not-directory", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
#[error("target {0}: Not a directory")]
|
|
||||||
NotADirectory(String),
|
NotADirectory(String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-target-not-directory", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
#[error("target directory {0}: Not a directory")]
|
|
||||||
TargetNotADirectory(String),
|
TargetNotADirectory(String),
|
||||||
|
#[error("{}", get_message_with_args("mv-error-failed-access-not-directory", HashMap::from([("path".to_string(), .0.clone())])))]
|
||||||
#[error("failed to access {0}: Not a directory")]
|
|
||||||
FailedToAccessNotADirectory(String),
|
FailedToAccessNotADirectory(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use clap::builder::ValueParser;
|
||||||
use clap::{Arg, ArgAction, ArgMatches, Command, error::ErrorKind};
|
use clap::{Arg, ArgAction, ArgMatches, Command, error::ErrorKind};
|
||||||
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
|
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::OsString;
|
use std::ffi::OsString;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
@ -48,7 +48,7 @@ use fs_extra::dir::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::error::MvError;
|
use crate::error::MvError;
|
||||||
use uucore::locale::get_message;
|
use uucore::locale::{get_message, get_message_with_args};
|
||||||
|
|
||||||
/// Options contains all the possible behaviors and flags for mv.
|
/// Options contains all the possible behaviors and flags for mv.
|
||||||
///
|
///
|
||||||
|
@ -167,7 +167,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
||||||
{
|
{
|
||||||
return Err(UUsageError::new(
|
return Err(UUsageError::new(
|
||||||
1,
|
1,
|
||||||
"cannot combine --backup with -n/--no-clobber or --update=none-fail",
|
get_message("mv-error-backup-with-no-clobber"),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ pub fn uu_app() -> Command {
|
||||||
Arg::new(OPT_FORCE)
|
Arg::new(OPT_FORCE)
|
||||||
.short('f')
|
.short('f')
|
||||||
.long(OPT_FORCE)
|
.long(OPT_FORCE)
|
||||||
.help("do not prompt before overwriting")
|
.help(get_message("mv-help-force"))
|
||||||
.overrides_with_all([OPT_INTERACTIVE, OPT_NO_CLOBBER])
|
.overrides_with_all([OPT_INTERACTIVE, OPT_NO_CLOBBER])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
|
@ -222,7 +222,7 @@ pub fn uu_app() -> Command {
|
||||||
Arg::new(OPT_INTERACTIVE)
|
Arg::new(OPT_INTERACTIVE)
|
||||||
.short('i')
|
.short('i')
|
||||||
.long(OPT_INTERACTIVE)
|
.long(OPT_INTERACTIVE)
|
||||||
.help("prompt before override")
|
.help(get_message("mv-help-interactive"))
|
||||||
.overrides_with_all([OPT_FORCE, OPT_NO_CLOBBER])
|
.overrides_with_all([OPT_FORCE, OPT_NO_CLOBBER])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
|
@ -230,14 +230,14 @@ pub fn uu_app() -> Command {
|
||||||
Arg::new(OPT_NO_CLOBBER)
|
Arg::new(OPT_NO_CLOBBER)
|
||||||
.short('n')
|
.short('n')
|
||||||
.long(OPT_NO_CLOBBER)
|
.long(OPT_NO_CLOBBER)
|
||||||
.help("do not overwrite an existing file")
|
.help(get_message("mv-help-no-clobber"))
|
||||||
.overrides_with_all([OPT_FORCE, OPT_INTERACTIVE])
|
.overrides_with_all([OPT_FORCE, OPT_INTERACTIVE])
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(OPT_STRIP_TRAILING_SLASHES)
|
Arg::new(OPT_STRIP_TRAILING_SLASHES)
|
||||||
.long(OPT_STRIP_TRAILING_SLASHES)
|
.long(OPT_STRIP_TRAILING_SLASHES)
|
||||||
.help("remove any trailing slashes from each SOURCE argument")
|
.help(get_message("mv-help-strip-trailing-slashes"))
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(backup_control::arguments::backup())
|
.arg(backup_control::arguments::backup())
|
||||||
|
@ -249,7 +249,7 @@ pub fn uu_app() -> Command {
|
||||||
Arg::new(OPT_TARGET_DIRECTORY)
|
Arg::new(OPT_TARGET_DIRECTORY)
|
||||||
.short('t')
|
.short('t')
|
||||||
.long(OPT_TARGET_DIRECTORY)
|
.long(OPT_TARGET_DIRECTORY)
|
||||||
.help("move all SOURCE arguments into DIRECTORY")
|
.help(get_message("mv-help-target-directory"))
|
||||||
.value_name("DIRECTORY")
|
.value_name("DIRECTORY")
|
||||||
.value_hint(clap::ValueHint::DirPath)
|
.value_hint(clap::ValueHint::DirPath)
|
||||||
.conflicts_with(OPT_NO_TARGET_DIRECTORY)
|
.conflicts_with(OPT_NO_TARGET_DIRECTORY)
|
||||||
|
@ -259,24 +259,21 @@ pub fn uu_app() -> Command {
|
||||||
Arg::new(OPT_NO_TARGET_DIRECTORY)
|
Arg::new(OPT_NO_TARGET_DIRECTORY)
|
||||||
.short('T')
|
.short('T')
|
||||||
.long(OPT_NO_TARGET_DIRECTORY)
|
.long(OPT_NO_TARGET_DIRECTORY)
|
||||||
.help("treat DEST as a normal file")
|
.help(get_message("mv-help-no-target-directory"))
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(OPT_VERBOSE)
|
Arg::new(OPT_VERBOSE)
|
||||||
.short('v')
|
.short('v')
|
||||||
.long(OPT_VERBOSE)
|
.long(OPT_VERBOSE)
|
||||||
.help("explain what is being done")
|
.help(get_message("mv-help-verbose"))
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(OPT_PROGRESS)
|
Arg::new(OPT_PROGRESS)
|
||||||
.short('g')
|
.short('g')
|
||||||
.long(OPT_PROGRESS)
|
.long(OPT_PROGRESS)
|
||||||
.help(
|
.help(get_message("mv-help-progress"))
|
||||||
"Display a progress bar. \n\
|
|
||||||
Note: this feature is not supported by GNU coreutils.",
|
|
||||||
)
|
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -290,7 +287,7 @@ pub fn uu_app() -> Command {
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(OPT_DEBUG)
|
Arg::new(OPT_DEBUG)
|
||||||
.long(OPT_DEBUG)
|
.long(OPT_DEBUG)
|
||||||
.help("explain how a file is copied. Implies -v")
|
.help(get_message("mv-help-debug"))
|
||||||
.action(ArgAction::SetTrue),
|
.action(ArgAction::SetTrue),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -326,10 +323,12 @@ fn handle_two_paths(source: &Path, target: &Path, opts: &Options) -> UResult<()>
|
||||||
if opts.backup == BackupMode::Simple && source_is_target_backup(source, target, &opts.suffix) {
|
if opts.backup == BackupMode::Simple && source_is_target_backup(source, target, &opts.suffix) {
|
||||||
return Err(io::Error::new(
|
return Err(io::Error::new(
|
||||||
io::ErrorKind::NotFound,
|
io::ErrorKind::NotFound,
|
||||||
format!(
|
get_message_with_args(
|
||||||
"backing up {} might destroy source; {} not moved",
|
"mv-error-backup-might-destroy-source",
|
||||||
target.quote(),
|
HashMap::from([
|
||||||
source.quote()
|
("target".to_string(), target.quote().to_string()),
|
||||||
|
("source".to_string(), source.quote().to_string()),
|
||||||
|
]),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.into());
|
.into());
|
||||||
|
@ -359,7 +358,13 @@ fn handle_two_paths(source: &Path, target: &Path, opts: &Options) -> UResult<()>
|
||||||
if opts.no_target_dir {
|
if opts.no_target_dir {
|
||||||
if source.is_dir() {
|
if source.is_dir() {
|
||||||
rename(source, target, opts, None).map_err_context(|| {
|
rename(source, target, opts, None).map_err_context(|| {
|
||||||
format!("cannot move {} to {}", source.quote(), target.quote())
|
get_message_with_args(
|
||||||
|
"mv-error-cannot-move",
|
||||||
|
HashMap::from([
|
||||||
|
("source".to_string(), source.quote().to_string()),
|
||||||
|
("target".to_string(), target.quote().to_string()),
|
||||||
|
]),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Err(MvError::DirectoryToNonDirectory(target.quote().to_string()).into())
|
Err(MvError::DirectoryToNonDirectory(target.quote().to_string()).into())
|
||||||
|
@ -371,7 +376,13 @@ fn handle_two_paths(source: &Path, target: &Path, opts: &Options) -> UResult<()>
|
||||||
match opts.overwrite {
|
match opts.overwrite {
|
||||||
OverwriteMode::NoClobber => return Ok(()),
|
OverwriteMode::NoClobber => return Ok(()),
|
||||||
OverwriteMode::Interactive => {
|
OverwriteMode::Interactive => {
|
||||||
if !prompt_yes!("overwrite {}? ", target.quote()) {
|
if !prompt_yes!(
|
||||||
|
"{}",
|
||||||
|
get_message_with_args(
|
||||||
|
"mv-prompt-overwrite",
|
||||||
|
HashMap::from([("target".to_string(), target.quote().to_string())]),
|
||||||
|
)
|
||||||
|
) {
|
||||||
return Err(io::Error::other("").into());
|
return Err(io::Error::other("").into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -473,7 +484,10 @@ fn handle_multiple_paths(paths: &[PathBuf], opts: &Options) -> UResult<()> {
|
||||||
if opts.no_target_dir {
|
if opts.no_target_dir {
|
||||||
return Err(UUsageError::new(
|
return Err(UUsageError::new(
|
||||||
1,
|
1,
|
||||||
format!("mv: extra operand {}", paths[2].quote()),
|
get_message_with_args(
|
||||||
|
"mv-error-extra-operand",
|
||||||
|
HashMap::from([("operand".to_string(), paths[2].quote().to_string())]),
|
||||||
|
),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
let target_dir = paths.last().unwrap();
|
let target_dir = paths.last().unwrap();
|
||||||
|
@ -511,11 +525,17 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, options: &Options)
|
||||||
|
|
||||||
let count_progress = if let Some(ref multi_progress) = multi_progress {
|
let count_progress = if let Some(ref multi_progress) = multi_progress {
|
||||||
if files.len() > 1 {
|
if files.len() > 1 {
|
||||||
Some(multi_progress.add(
|
Some(
|
||||||
ProgressBar::new(files.len().try_into().unwrap()).with_style(
|
multi_progress.add(
|
||||||
ProgressStyle::with_template("moving {msg} {wide_bar} {pos}/{len}").unwrap(),
|
ProgressBar::new(files.len().try_into().unwrap()).with_style(
|
||||||
|
ProgressStyle::with_template(&format!(
|
||||||
|
"{} {{msg}} {{wide_bar}} {{pos}}/{{len}}",
|
||||||
|
get_message("mv-progress-moving")
|
||||||
|
))
|
||||||
|
.unwrap(),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
))
|
)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -545,10 +565,12 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, options: &Options)
|
||||||
// If the target file was already created in this mv call, do not overwrite
|
// If the target file was already created in this mv call, do not overwrite
|
||||||
show!(USimpleError::new(
|
show!(USimpleError::new(
|
||||||
1,
|
1,
|
||||||
format!(
|
get_message_with_args(
|
||||||
"will not overwrite just-created '{}' with '{}'",
|
"mv-error-will-not-overwrite-just-created",
|
||||||
targetpath.display(),
|
HashMap::from([
|
||||||
sourcepath.display()
|
("target".to_string(), targetpath.display().to_string()),
|
||||||
|
("source".to_string(), sourcepath.display().to_string())
|
||||||
|
])
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
continue;
|
continue;
|
||||||
|
@ -565,10 +587,12 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, options: &Options)
|
||||||
Err(e) if e.to_string().is_empty() => set_exit_code(1),
|
Err(e) if e.to_string().is_empty() => set_exit_code(1),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
let e = e.map_err_context(|| {
|
let e = e.map_err_context(|| {
|
||||||
format!(
|
get_message_with_args(
|
||||||
"cannot move {} to {}",
|
"mv-error-cannot-move",
|
||||||
sourcepath.quote(),
|
HashMap::from([
|
||||||
targetpath.quote()
|
("source".to_string(), sourcepath.quote().to_string()),
|
||||||
|
("target".to_string(), targetpath.quote().to_string()),
|
||||||
|
]),
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
match multi_progress {
|
match multi_progress {
|
||||||
|
@ -597,7 +621,13 @@ fn rename(
|
||||||
if to.exists() {
|
if to.exists() {
|
||||||
if opts.update == UpdateMode::None {
|
if opts.update == UpdateMode::None {
|
||||||
if opts.debug {
|
if opts.debug {
|
||||||
println!("skipped {}", to.quote());
|
println!(
|
||||||
|
"{}",
|
||||||
|
get_message_with_args(
|
||||||
|
"mv-debug-skipped",
|
||||||
|
HashMap::from([("target".to_string(), to.quote().to_string())])
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
@ -609,19 +639,34 @@ fn rename(
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.update == UpdateMode::NoneFail {
|
if opts.update == UpdateMode::NoneFail {
|
||||||
let err_msg = format!("not replacing {}", to.quote());
|
let err_msg = get_message_with_args(
|
||||||
|
"mv-error-not-replacing",
|
||||||
|
HashMap::from([("target".to_string(), to.quote().to_string())]),
|
||||||
|
);
|
||||||
return Err(io::Error::other(err_msg));
|
return Err(io::Error::other(err_msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
match opts.overwrite {
|
match opts.overwrite {
|
||||||
OverwriteMode::NoClobber => {
|
OverwriteMode::NoClobber => {
|
||||||
if opts.debug {
|
if opts.debug {
|
||||||
println!("skipped {}", to.quote());
|
println!(
|
||||||
|
"{}",
|
||||||
|
get_message_with_args(
|
||||||
|
"mv-debug-skipped",
|
||||||
|
HashMap::from([("target".to_string(), to.quote().to_string())])
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
OverwriteMode::Interactive => {
|
OverwriteMode::Interactive => {
|
||||||
if !prompt_yes!("overwrite {}?", to.quote()) {
|
if !prompt_yes!(
|
||||||
|
"{}",
|
||||||
|
get_message_with_args(
|
||||||
|
"mv-prompt-overwrite",
|
||||||
|
HashMap::from([("target".to_string(), to.quote().to_string())]),
|
||||||
|
)
|
||||||
|
) {
|
||||||
return Err(io::Error::other(""));
|
return Err(io::Error::other(""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -641,7 +686,9 @@ fn rename(
|
||||||
if is_empty_dir(to) {
|
if is_empty_dir(to) {
|
||||||
fs::remove_dir(to)?;
|
fs::remove_dir(to)?;
|
||||||
} else {
|
} else {
|
||||||
return Err(io::Error::other("Directory not empty"));
|
return Err(io::Error::other(get_message(
|
||||||
|
"mv-error-directory-not-empty",
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -650,13 +697,21 @@ fn rename(
|
||||||
|
|
||||||
if opts.verbose {
|
if opts.verbose {
|
||||||
let message = match backup_path {
|
let message = match backup_path {
|
||||||
Some(path) => format!(
|
Some(path) => get_message_with_args(
|
||||||
"renamed {} -> {} (backup: {})",
|
"mv-verbose-renamed-with-backup",
|
||||||
from.quote(),
|
HashMap::from([
|
||||||
to.quote(),
|
("from".to_string(), from.quote().to_string()),
|
||||||
path.quote()
|
("to".to_string(), to.quote().to_string()),
|
||||||
|
("backup".to_string(), path.quote().to_string()),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
None => get_message_with_args(
|
||||||
|
"mv-verbose-renamed",
|
||||||
|
HashMap::from([
|
||||||
|
("from".to_string(), from.quote().to_string()),
|
||||||
|
("to".to_string(), to.quote().to_string()),
|
||||||
|
]),
|
||||||
),
|
),
|
||||||
None => format!("renamed {} -> {}", from.quote(), to.quote()),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match multi_progress {
|
match multi_progress {
|
||||||
|
@ -751,7 +806,7 @@ fn rename_symlink_fallback(from: &Path, to: &Path) -> io::Result<()> {
|
||||||
} else {
|
} else {
|
||||||
Err(io::Error::new(
|
Err(io::Error::new(
|
||||||
io::ErrorKind::NotFound,
|
io::ErrorKind::NotFound,
|
||||||
"can't determine symlink type, since it is dangling",
|
get_message("mv-error-dangling-symlink"),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -761,7 +816,7 @@ fn rename_symlink_fallback(from: &Path, to: &Path) -> io::Result<()> {
|
||||||
let path_symlink_points_to = fs::read_link(from)?;
|
let path_symlink_points_to = fs::read_link(from)?;
|
||||||
Err(io::Error::new(
|
Err(io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
"your operating system does not support symlinks",
|
get_message("mv-error-no-symlink-support"),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,8 +857,7 @@ fn rename_dir_fallback(
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(all(unix, not(any(target_os = "macos", target_os = "redox"))))]
|
#[cfg(all(unix, not(any(target_os = "macos", target_os = "redox"))))]
|
||||||
let xattrs =
|
let xattrs = fsxattr::retrieve_xattrs(from).unwrap_or_else(|_| HashMap::new());
|
||||||
fsxattr::retrieve_xattrs(from).unwrap_or_else(|_| std::collections::HashMap::new());
|
|
||||||
|
|
||||||
let result = if let Some(ref pb) = progress_bar {
|
let result = if let Some(ref pb) = progress_bar {
|
||||||
move_dir_with_progress(from, to, &options, |process_info: TransitProcess| {
|
move_dir_with_progress(from, to, &options, |process_info: TransitProcess| {
|
||||||
|
@ -822,7 +876,7 @@ fn rename_dir_fallback(
|
||||||
Err(err) => match err.kind {
|
Err(err) => match err.kind {
|
||||||
fs_extra::error::ErrorKind::PermissionDenied => Err(io::Error::new(
|
fs_extra::error::ErrorKind::PermissionDenied => Err(io::Error::new(
|
||||||
io::ErrorKind::PermissionDenied,
|
io::ErrorKind::PermissionDenied,
|
||||||
"Permission denied",
|
get_message("mv-error-permission-denied"),
|
||||||
)),
|
)),
|
||||||
_ => Err(io::Error::other(format!("{err:?}"))),
|
_ => Err(io::Error::other(format!("{err:?}"))),
|
||||||
},
|
},
|
||||||
|
@ -837,9 +891,13 @@ fn rename_file_fallback(from: &Path, to: &Path) -> io::Result<()> {
|
||||||
let from = from.to_string_lossy();
|
let from = from.to_string_lossy();
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
err.kind(),
|
err.kind(),
|
||||||
format!(
|
get_message_with_args(
|
||||||
"inter-device move failed: '{from}' to '{to}'\
|
"mv-error-inter-device-move-failed",
|
||||||
; unable to remove target: {err}"
|
HashMap::from([
|
||||||
|
("from".to_string(), from.to_string()),
|
||||||
|
("to".to_string(), to.to_string()),
|
||||||
|
("err".to_string(), err.to_string()),
|
||||||
|
]),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue