This commit is contained in:
sylvestre
2023-08-12 02:19:19 +00:00
parent 7605aad764
commit 755ed4ad46
37 changed files with 238 additions and 151 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,8 +1,9 @@
(function() {var implementors = {
"uu_fmt":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_fmt/struct.FmtOptions.html\" title=\"struct uu_fmt::FmtOptions\">FmtOptions</a>"]],
"uu_nl":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_nl/struct.Settings.html\" title=\"struct uu_nl::Settings\">Settings</a>"]],
"uu_numfmt":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_numfmt/options/struct.FormatOptions.html\" title=\"struct uu_numfmt::options::FormatOptions\">FormatOptions</a>"]],
"uu_sort":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_sort/struct.GlobalSettings.html\" title=\"struct uu_sort::GlobalSettings\">GlobalSettings</a>"]],
"uu_stty":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_stty/struct.TermSize.html\" title=\"struct uu_stty::TermSize\">TermSize</a>"]],
"uu_tail":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"uu_tail/args/enum.FilterMode.html\" title=\"enum uu_tail::args::FilterMode\">FilterMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_tail/args/struct.Settings.html\" title=\"struct uu_tail::args::Settings\">Settings</a>"]],
"uu_tail":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uu_tail/args/struct.Settings.html\" title=\"struct uu_tail::args::Settings\">Settings</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"enum\" href=\"uu_tail/args/enum.FilterMode.html\" title=\"enum uu_tail::args::FilterMode\">FilterMode</a>"]],
"uucore":[["impl&lt;'parser&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"uucore/parse_size/struct.Parser.html\" title=\"struct uucore::parse_size::Parser\">Parser</a>&lt;'parser&gt;"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
(function() {var implementors = {
"uu_numfmt":[["impl&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uu_numfmt/format/struct.WhitespaceSplitter.html\" title=\"struct uu_numfmt::format::WhitespaceSplitter\">WhitespaceSplitter</a>&lt;'a&gt;"]],
"uu_tail":[["impl&lt;'a&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uu_tail/chunks/struct.ReverseChunks.html\" title=\"struct uu_tail::chunks::ReverseChunks\">ReverseChunks</a>&lt;'a&gt;"]],
"uucore":[["impl&lt;B: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/std/io/trait.BufRead.html\" title=\"trait std::io::BufRead\">BufRead</a>&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uucore/lines/struct.Lines.html\" title=\"struct uucore::lines::Lines\">Lines</a>&lt;B&gt;"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uucore/utmpx/struct.UtmpxIter.html\" title=\"struct uucore::utmpx::UtmpxIter\">UtmpxIter</a>"]]
"uucore":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uucore/utmpx/struct.UtmpxIter.html\" title=\"struct uucore::utmpx::UtmpxIter\">UtmpxIter</a>"],["impl&lt;B: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/std/io/trait.BufRead.html\" title=\"trait std::io::BufRead\">BufRead</a>&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/iter/traits/iterator/trait.Iterator.html\" title=\"trait core::iter::traits::iterator::Iterator\">Iterator</a> for <a class=\"struct\" href=\"uucore/lines/struct.Lines.html\" title=\"struct uucore::lines::Lines\">Lines</a>&lt;B&gt;"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
+1 -1
View File
@@ -5,5 +5,5 @@
"uu_sort":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uu_sort/enum.GeneralF64ParseResult.html\" title=\"enum uu_sort::GeneralF64ParseResult\">GeneralF64ParseResult</a>"]],
"uu_stty":[["impl&lt;T: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a>&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"struct\" href=\"uu_stty/struct.Flag.html\" title=\"struct uu_stty::Flag\">Flag</a>&lt;T&gt;"]],
"uu_tail":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uu_tail/args/enum.FollowMode.html\" title=\"enum uu_tail::args::FollowMode\">FollowMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uu_tail/args/enum.Signum.html\" title=\"enum uu_tail::args::Signum\">Signum</a>"]],
"uucore":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/backup_control/enum.BackupMode.html\" title=\"enum uucore::backup_control::BackupMode\">BackupMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/fs/enum.ResolveMode.html\" title=\"enum uucore::fs::ResolveMode\">ResolveMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/fs/enum.MissingHandling.html\" title=\"enum uucore::fs::MissingHandling\">MissingHandling</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/encoding/enum.Format.html\" title=\"enum uucore::encoding::Format\">Format</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/quoting_style/enum.Quotes.html\" title=\"enum uucore::quoting_style::Quotes\">Quotes</a>"]]
"uucore":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/encoding/enum.Format.html\" title=\"enum uucore::encoding::Format\">Format</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/quoting_style/enum.Quotes.html\" title=\"enum uucore::quoting_style::Quotes\">Quotes</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/fs/enum.ResolveMode.html\" title=\"enum uucore::fs::ResolveMode\">ResolveMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/backup_control/enum.BackupMode.html\" title=\"enum uucore::backup_control::BackupMode\">BackupMode</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.71.1/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"uucore/fs/enum.MissingHandling.html\" title=\"enum uucore::fs::MissingHandling\">MissingHandling</a>"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6 -6
View File
File diff suppressed because one or more lines are too long
+55 -21
View File
@@ -393,6 +393,23 @@
<a href="#393" id="393">393</a>
<a href="#394" id="394">394</a>
<a href="#395" id="395">395</a>
<a href="#396" id="396">396</a>
<a href="#397" id="397">397</a>
<a href="#398" id="398">398</a>
<a href="#399" id="399">399</a>
<a href="#400" id="400">400</a>
<a href="#401" id="401">401</a>
<a href="#402" id="402">402</a>
<a href="#403" id="403">403</a>
<a href="#404" id="404">404</a>
<a href="#405" id="405">405</a>
<a href="#406" id="406">406</a>
<a href="#407" id="407">407</a>
<a href="#408" id="408">408</a>
<a href="#409" id="409">409</a>
<a href="#410" id="410">410</a>
<a href="#411" id="411">411</a>
<a href="#412" id="412">412</a>
</pre></div><pre class="rust"><code><span class="comment">// * This file is part of `fmt` from the uutils coreutils package.
// *
// * (c) kwantam &lt;kwantam@gmail.com&gt;
@@ -455,6 +472,29 @@
goal: usize,
tabwidth: usize,
}
<span class="kw">impl </span>Default <span class="kw">for </span>FmtOptions {
<span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<span class="self">Self </span>{
crown: <span class="bool-val">false</span>,
tagged: <span class="bool-val">false</span>,
mail: <span class="bool-val">false</span>,
uniform: <span class="bool-val">false</span>,
quick: <span class="bool-val">false</span>,
split_only: <span class="bool-val">false</span>,
use_prefix: <span class="bool-val">false</span>,
prefix: String::new(),
xprefix: <span class="bool-val">false</span>,
use_anti_prefix: <span class="bool-val">false</span>,
anti_prefix: String::new(),
xanti_prefix: <span class="bool-val">false</span>,
width: <span class="number">75</span>,
goal: <span class="number">70</span>,
tabwidth: <span class="number">8</span>,
}
}
}
<span class="doccomment">/// Parse the command line arguments and return the list of files and formatting options.
///
/// # Arguments
@@ -465,7 +505,11 @@
///
/// A tuple containing a vector of file names and a `FmtOptions` struct.
</span><span class="attr">#[allow(clippy::cognitive_complexity)]
#[allow(clippy::field_reassign_with_default)]
</span><span class="kw">fn </span>parse_arguments(args: <span class="kw">impl </span>uucore::Args) -&gt; UResult&lt;(Vec&lt;String&gt;, FmtOptions)&gt; {
<span class="comment">// by default, goal is 93% of width
</span><span class="kw">const </span>DEFAULT_GOAL_TO_WIDTH_RATIO: usize = <span class="number">93</span>;
<span class="kw">let </span>matches = uu_app().try_get_matches_from(args)<span class="question-mark">?</span>;
<span class="kw">let </span><span class="kw-2">mut </span>files: Vec&lt;String&gt; = matches
@@ -473,23 +517,7 @@
.map(|v| v.map(ToString::to_string).collect())
.unwrap_or_default();
<span class="kw">let </span><span class="kw-2">mut </span>fmt_opts = FmtOptions {
crown: <span class="bool-val">false</span>,
tagged: <span class="bool-val">false</span>,
mail: <span class="bool-val">false</span>,
uniform: <span class="bool-val">false</span>,
quick: <span class="bool-val">false</span>,
split_only: <span class="bool-val">false</span>,
use_prefix: <span class="bool-val">false</span>,
prefix: String::new(),
xprefix: <span class="bool-val">false</span>,
use_anti_prefix: <span class="bool-val">false</span>,
anti_prefix: String::new(),
xanti_prefix: <span class="bool-val">false</span>,
width: <span class="number">79</span>,
goal: <span class="number">74</span>,
tabwidth: <span class="number">8</span>,
};
<span class="kw">let </span><span class="kw-2">mut </span>fmt_opts = FmtOptions::default();
fmt_opts.tagged = matches.get_flag(OPT_TAGGED_PARAGRAPH);
<span class="kw">if </span>matches.get_flag(OPT_CROWN_MARGIN) {
@@ -536,7 +564,10 @@
),
));
}
fmt_opts.goal = cmp::min(fmt_opts.width * <span class="number">94 </span>/ <span class="number">100</span>, fmt_opts.width - <span class="number">3</span>);
fmt_opts.goal = cmp::min(
fmt_opts.width * DEFAULT_GOAL_TO_WIDTH_RATIO / <span class="number">100</span>,
fmt_opts.width - <span class="number">3</span>,
);
};
<span class="kw">if let </span><span class="prelude-val">Some</span>(s) = matches.get_one::&lt;String&gt;(OPT_GOAL) {
@@ -550,7 +581,10 @@
}
};
<span class="kw">if </span>!matches.get_flag(OPT_WIDTH) {
fmt_opts.width = cmp::max(fmt_opts.goal * <span class="number">100 </span>/ <span class="number">94</span>, fmt_opts.goal + <span class="number">3</span>);
fmt_opts.width = cmp::max(
fmt_opts.goal * <span class="number">100 </span>/ DEFAULT_GOAL_TO_WIDTH_RATIO,
fmt_opts.goal + <span class="number">3</span>,
);
} <span class="kw">else if </span>fmt_opts.goal &gt; fmt_opts.width {
<span class="kw">return </span><span class="prelude-val">Err</span>(USimpleError::new(<span class="number">1</span>, <span class="string">&quot;GOAL cannot be greater than WIDTH.&quot;</span>));
}
@@ -751,14 +785,14 @@
Arg::new(OPT_WIDTH)
.short(<span class="string">&#39;w&#39;</span>)
.long(<span class="string">&quot;width&quot;</span>)
.help(<span class="string">&quot;Fill output lines up to a maximum of WIDTH columns, default 79.&quot;</span>)
.help(<span class="string">&quot;Fill output lines up to a maximum of WIDTH columns, default 75.&quot;</span>)
.value_name(<span class="string">&quot;WIDTH&quot;</span>),
)
.arg(
Arg::new(OPT_GOAL)
.short(<span class="string">&#39;g&#39;</span>)
.long(<span class="string">&quot;goal&quot;</span>)
.help(<span class="string">&quot;Goal width, default ~0.94*WIDTH. Must be less than WIDTH.&quot;</span>)
.help(<span class="string">&quot;Goal width, default of 93% of WIDTH. Must be less than WIDTH.&quot;</span>)
.value_name(<span class="string">&quot;GOAL&quot;</span>),
)
.arg(
+54 -50
View File
@@ -578,6 +578,8 @@
<a href="#578" id="578">578</a>
<a href="#579" id="579">579</a>
<a href="#580" id="580">580</a>
<a href="#581" id="581">581</a>
<a href="#582" id="582">582</a>
</pre></div><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
// *
// * (c) Alex Lyon &lt;arcterus@mail.com&gt;
@@ -950,7 +952,7 @@
}
<span class="kw">fn </span>remove_dir(path: <span class="kw-2">&amp;</span>Path, options: <span class="kw-2">&amp;</span>Options) -&gt; bool {
<span class="kw">if </span>prompt_file(path, options, <span class="bool-val">true</span>) {
<span class="kw">if </span>prompt_dir(path, options) {
<span class="kw">if let </span><span class="prelude-val">Ok</span>(<span class="kw-2">mut </span>read_dir) = fs::read_dir(path) {
<span class="kw">if </span>options.dir || options.recursive {
<span class="kw">if </span>read_dir.next().is_none() {
@@ -995,7 +997,7 @@
</span>}
<span class="kw">fn </span>remove_file(path: <span class="kw-2">&amp;</span>Path, options: <span class="kw-2">&amp;</span>Options) -&gt; bool {
<span class="kw">if </span>prompt_file(path, options, <span class="bool-val">false</span>) {
<span class="kw">if </span>prompt_file(path, options) {
<span class="kw">match </span>fs::remove_file(path) {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
<span class="kw">if </span>options.verbose {
@@ -1017,8 +1019,23 @@
<span class="bool-val">false
</span>}
<span class="kw">fn </span>prompt_dir(path: <span class="kw-2">&amp;</span>Path, options: <span class="kw-2">&amp;</span>Options) -&gt; bool {
<span class="comment">// If interactive is Never we never want to send prompts
</span><span class="kw">if </span>options.interactive == InteractiveMode::Never {
<span class="kw">return </span><span class="bool-val">true</span>;
}
<span class="comment">// We can&#39;t use metadata.permissions.readonly for directories because it only works on files
// So we have to handle whether a directory is writable manually
</span><span class="kw">if let </span><span class="prelude-val">Ok</span>(metadata) = fs::metadata(path) {
handle_writable_directory(path, options, <span class="kw-2">&amp;</span>metadata)
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
}
<span class="attr">#[allow(clippy::cognitive_complexity)]
</span><span class="kw">fn </span>prompt_file(path: <span class="kw-2">&amp;</span>Path, options: <span class="kw-2">&amp;</span>Options, is_dir: bool) -&gt; bool {
</span><span class="kw">fn </span>prompt_file(path: <span class="kw-2">&amp;</span>Path, options: <span class="kw-2">&amp;</span>Options) -&gt; bool {
<span class="comment">// If interactive is Never we never want to send prompts
</span><span class="kw">if </span>options.interactive == InteractiveMode::Never {
<span class="kw">return </span><span class="bool-val">true</span>;
@@ -1031,59 +1048,46 @@
}
}
}
<span class="kw">if </span>is_dir {
<span class="comment">// We can&#39;t use metadata.permissions.readonly for directories because it only works on files
// So we have to handle whether a directory is writable on not manually
</span><span class="kw">if let </span><span class="prelude-val">Ok</span>(metadata) = fs::metadata(path) {
handle_writable_directory(path, options, <span class="kw-2">&amp;</span>metadata)
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
} <span class="kw">else </span>{
<span class="comment">// File::open(path) doesn&#39;t open the file in write mode so we need to use file options to open it in also write mode to check if it can written too
</span><span class="kw">match </span>File::options().read(<span class="bool-val">true</span>).write(<span class="bool-val">true</span>).open(path) {
<span class="prelude-val">Ok</span>(file) =&gt; {
<span class="kw">if let </span><span class="prelude-val">Ok</span>(metadata) = file.metadata() {
<span class="kw">if </span>metadata.permissions().readonly() {
<span class="kw">if </span>metadata.len() == <span class="number">0 </span>{
<span class="macro">prompt_yes!</span>(
<span class="string">&quot;remove write-protected regular empty file {}?&quot;</span>,
path.quote()
)
} <span class="kw">else </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove write-protected regular file {}?&quot;</span>, path.quote())
}
} <span class="kw">else if </span>options.interactive == InteractiveMode::Always {
<span class="kw">if </span>metadata.len() == <span class="number">0 </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove regular empty file {}?&quot;</span>, path.quote())
} <span class="kw">else </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove file {}?&quot;</span>, path.quote())
}
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
}
<span class="prelude-val">Err</span>(err) =&gt; {
<span class="kw">if </span>err.kind() == ErrorKind::PermissionDenied {
<span class="kw">if let </span><span class="prelude-val">Ok</span>(metadata) = fs::metadata(path) {
<span class="kw">if </span>metadata.len() == <span class="number">0 </span>{
<span class="macro">prompt_yes!</span>(
<span class="string">&quot;remove write-protected regular empty file {}?&quot;</span>,
path.quote()
)
} <span class="kw">else </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove write-protected regular file {}?&quot;</span>, path.quote())
}
<span class="comment">// File::open(path) doesn&#39;t open the file in write mode so we need to use file options to open it in also write mode to check if it can written too
</span><span class="kw">match </span>File::options().read(<span class="bool-val">true</span>).write(<span class="bool-val">true</span>).open(path) {
<span class="prelude-val">Ok</span>(file) =&gt; {
<span class="kw">if let </span><span class="prelude-val">Ok</span>(metadata) = file.metadata() {
<span class="kw">if </span>metadata.permissions().readonly() {
<span class="kw">if </span>metadata.len() == <span class="number">0 </span>{
<span class="macro">prompt_yes!</span>(
<span class="string">&quot;remove write-protected regular empty file {}?&quot;</span>,
path.quote()
)
} <span class="kw">else </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove write-protected regular file {}?&quot;</span>, path.quote())
}
} <span class="kw">else if </span>options.interactive == InteractiveMode::Always {
<span class="kw">if </span>metadata.len() == <span class="number">0 </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove regular empty file {}?&quot;</span>, path.quote())
} <span class="kw">else </span>{
<span class="macro">prompt_yes!</span>(<span class="string">&quot;remove file {}?&quot;</span>, path.quote())
}
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
}
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
}
<span class="prelude-val">Err</span>(err) =&gt; {
<span class="kw">if </span>err.kind() == ErrorKind::PermissionDenied {
<span class="kw">match </span>fs::metadata(path) {
<span class="prelude-val">Ok</span>(metadata) <span class="kw">if </span>metadata.len() == <span class="number">0 </span>=&gt; {
<span class="macro">prompt_yes!</span>(
<span class="string">&quot;remove write-protected regular empty file {}?&quot;</span>,
path.quote()
)
}
<span class="kw">_ </span>=&gt; <span class="macro">prompt_yes!</span>(<span class="string">&quot;remove write-protected regular file {}?&quot;</span>, path.quote()),
}
} <span class="kw">else </span>{
<span class="bool-val">true
</span>}
}
}
}
@@ -139,7 +139,32 @@
<a href="#139" id="139">139</a>
<a href="#140" id="140">140</a>
<a href="#141" id="141">141</a>
</pre></div><pre class="rust"><code><span class="kw">use </span>clap::{
<a href="#142" id="142">142</a>
<a href="#143" id="143">143</a>
<a href="#144" id="144">144</a>
<a href="#145" id="145">145</a>
<a href="#146" id="146">146</a>
<a href="#147" id="147">147</a>
<a href="#148" id="148">148</a>
<a href="#149" id="149">149</a>
<a href="#150" id="150">150</a>
<a href="#151" id="151">151</a>
<a href="#152" id="152">152</a>
<a href="#153" id="153">153</a>
<a href="#154" id="154">154</a>
<a href="#155" id="155">155</a>
<a href="#156" id="156">156</a>
<a href="#157" id="157">157</a>
<a href="#158" id="158">158</a>
<a href="#159" id="159">159</a>
<a href="#160" id="160">160</a>
<a href="#161" id="161">161</a>
<a href="#162" id="162">162</a>
<a href="#163" id="163">163</a>
<a href="#164" id="164">164</a>
<a href="#165" id="165">165</a>
</pre></div><pre class="rust"><code><span class="comment">// spell-checker:ignore abcdefgh
</span><span class="kw">use </span>clap::{
builder::{PossibleValue, TypedValueParser},
error::{ContextKind, ContextValue, ErrorKind},
};
@@ -156,6 +181,34 @@
<span class="kw">pub fn </span>new(values: <span class="kw">impl </span>Into&lt;<span class="self">Self</span>&gt;) -&gt; <span class="self">Self </span>{
values.into()
}
<span class="kw">fn </span>generate_clap_error(
<span class="kw-2">&amp;</span><span class="self">self</span>,
cmd: <span class="kw-2">&amp;</span>clap::Command,
arg: <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>clap::Arg&gt;,
value: <span class="kw-2">&amp;</span>str,
) -&gt; clap::Error {
<span class="kw">let </span><span class="kw-2">mut </span>err = clap::Error::new(ErrorKind::InvalidValue).with_cmd(cmd);
<span class="kw">if let </span><span class="prelude-val">Some</span>(arg) = arg {
err.insert(
ContextKind::InvalidArg,
ContextValue::String(arg.to_string()),
);
}
err.insert(
ContextKind::InvalidValue,
ContextValue::String(value.to_string()),
);
err.insert(
ContextKind::ValidValue,
ContextValue::Strings(<span class="self">self</span>.<span class="number">0</span>.iter().map(|x| x.get_name().to_string()).collect()),
);
err
}
}
<span class="kw">impl </span>TypedValueParser <span class="kw">for </span>ShortcutValueParser {
@@ -177,29 +230,16 @@
.filter(|x| x.get_name().starts_with(value))
.collect();
<span class="kw">if </span>matched_values.len() == <span class="number">1 </span>{
<span class="prelude-val">Ok</span>(matched_values[<span class="number">0</span>].get_name().to_string())
} <span class="kw">else </span>{
<span class="kw">let </span><span class="kw-2">mut </span>err = clap::Error::new(ErrorKind::InvalidValue).with_cmd(cmd);
<span class="kw">if let </span><span class="prelude-val">Some</span>(arg) = arg {
err.insert(
ContextKind::InvalidArg,
ContextValue::String(arg.to_string()),
);
<span class="kw">match </span>matched_values.len() {
<span class="number">0 </span>=&gt; <span class="prelude-val">Err</span>(<span class="self">self</span>.generate_clap_error(cmd, arg, value)),
<span class="number">1 </span>=&gt; <span class="prelude-val">Ok</span>(matched_values[<span class="number">0</span>].get_name().to_string()),
<span class="kw">_ </span>=&gt; {
<span class="kw">if let </span><span class="prelude-val">Some</span>(direct_match) = matched_values.iter().find(|x| x.get_name() == value) {
<span class="prelude-val">Ok</span>(direct_match.get_name().to_string())
} <span class="kw">else </span>{
<span class="prelude-val">Err</span>(<span class="self">self</span>.generate_clap_error(cmd, arg, value))
}
}
err.insert(
ContextKind::InvalidValue,
ContextValue::String(value.to_string()),
);
err.insert(
ContextKind::ValidValue,
ContextValue::Strings(<span class="self">self</span>.<span class="number">0</span>.iter().map(|x| x.get_name().to_string()).collect()),
);
<span class="prelude-val">Err</span>(err)
}
}
@@ -268,6 +308,14 @@
<span class="macro">assert_eq!</span>(<span class="string">&quot;abef&quot;</span>, result.unwrap());
}
<span class="attr">#[test]
</span><span class="kw">fn </span>test_parse_ref_with_ambiguous_value_that_is_a_possible_value() {
<span class="kw">let </span>cmd = Command::new(<span class="string">&quot;cmd&quot;</span>);
<span class="kw">let </span>parser = ShortcutValueParser::new([<span class="string">&quot;abcd&quot;</span>, <span class="string">&quot;abcdefgh&quot;</span>]);
<span class="kw">let </span>result = parser.parse_ref(<span class="kw-2">&amp;</span>cmd, <span class="prelude-val">None</span>, OsStr::new(<span class="string">&quot;abcd&quot;</span>));
<span class="macro">assert_eq!</span>(<span class="string">&quot;abcd&quot;</span>, result.unwrap());
}
<span class="attr">#[test]
#[cfg(unix)]
</span><span class="kw">fn </span>test_parse_ref_with_invalid_utf8() {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More