Skip to content

Commit e3675ee

Browse files
committed
deploy: c249eba
1 parent afe253a commit e3675ee

27 files changed

+237
-45
lines changed

dev/src/uu_cp/copydir.rs.html

+14
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,13 @@
383383
<span id="383">383</span>
384384
<span id="384">384</span>
385385
<span id="385">385</span>
386+
<span id="386">386</span>
387+
<span id="387">387</span>
388+
<span id="388">388</span>
389+
<span id="389">389</span>
390+
<span id="390">390</span>
391+
<span id="391">391</span>
392+
<span id="392">392</span>
386393
</pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
387394
// *
388395
// * For the full copyright and license information, please view the LICENSE
@@ -399,6 +406,7 @@
399406
<span class="kw">use </span>std::io;
400407
<span class="kw">use </span>std::path::{Path, PathBuf, StripPrefixError};
401408

409+
<span class="kw">use </span>indicatif::ProgressBar;
402410
<span class="kw">use </span>uucore::display::Quotable;
403411
<span class="kw">use </span>uucore::error::UIoError;
404412
<span class="kw">use </span>uucore::fs::{canonicalize, FileInformation, MissingHandling, ResolveMode};
@@ -555,6 +563,7 @@
555563

556564
<span class="doccomment">/// Copy a single entry during a directory traversal.
557565
</span><span class="kw">fn </span>copy_direntry(
566+
progress_bar: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;ProgressBar&gt;,
558567
entry: Entry,
559568
options: <span class="kw-2">&amp;</span>Options,
560569
symlinked_files: <span class="kw-2">&amp;mut </span>HashSet&lt;FileInformation&gt;,
@@ -598,6 +607,7 @@
598607
preserve_hardlinks(hard_links, <span class="kw-2">&amp;</span>source_absolute, <span class="kw-2">&amp;</span>dest, <span class="kw-2">&amp;mut </span>found_hard_link)<span class="question-mark">?</span>;
599608
<span class="kw">if </span>!found_hard_link {
600609
<span class="kw">match </span>copy_file(
610+
progress_bar,
601611
<span class="kw-2">&amp;</span>source_absolute,
602612
local_to_target.as_path(),
603613
options,
@@ -625,6 +635,7 @@
625635
// TODO What other kinds of errors, if any, should
626636
// cause us to continue walking the directory?
627637
</span><span class="kw">match </span>copy_file(
638+
progress_bar,
628639
<span class="kw-2">&amp;</span>source_absolute,
629640
local_to_target.as_path(),
630641
options,
@@ -657,6 +668,7 @@
657668
/// Any errors encountered copying files in the tree will be logged but
658669
/// will not cause a short-circuit.
659670
</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>copy_directory(
671+
progress_bar: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;ProgressBar&gt;,
660672
root: <span class="kw-2">&amp;</span>Path,
661673
target: <span class="kw-2">&amp;</span>TargetSlice,
662674
options: <span class="kw-2">&amp;</span>Options,
@@ -670,6 +682,7 @@
670682
<span class="comment">// if no-dereference is enabled and this is a symlink, copy it as a file
671683
</span><span class="kw">if </span>!options.dereference(source_in_command_line) &amp;&amp; root.is_symlink() {
672684
<span class="kw">return </span>copy_file(
685+
progress_bar,
673686
root,
674687
target,
675688
options,
@@ -729,6 +742,7 @@
729742
<span class="prelude-val">Ok</span>(direntry) =&gt; {
730743
<span class="kw">let </span>entry = Entry::new(<span class="kw-2">&amp;</span>context, <span class="kw-2">&amp;</span>direntry)<span class="question-mark">?</span>;
731744
copy_direntry(
745+
progress_bar,
732746
entry,
733747
options,
734748
symlinked_files,

dev/src/uu_cp/cp.rs.html

+182-8
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,93 @@
15831583
<span id="1583">1583</span>
15841584
<span id="1584">1584</span>
15851585
<span id="1585">1585</span>
1586+
<span id="1586">1586</span>
1587+
<span id="1587">1587</span>
1588+
<span id="1588">1588</span>
1589+
<span id="1589">1589</span>
1590+
<span id="1590">1590</span>
1591+
<span id="1591">1591</span>
1592+
<span id="1592">1592</span>
1593+
<span id="1593">1593</span>
1594+
<span id="1594">1594</span>
1595+
<span id="1595">1595</span>
1596+
<span id="1596">1596</span>
1597+
<span id="1597">1597</span>
1598+
<span id="1598">1598</span>
1599+
<span id="1599">1599</span>
1600+
<span id="1600">1600</span>
1601+
<span id="1601">1601</span>
1602+
<span id="1602">1602</span>
1603+
<span id="1603">1603</span>
1604+
<span id="1604">1604</span>
1605+
<span id="1605">1605</span>
1606+
<span id="1606">1606</span>
1607+
<span id="1607">1607</span>
1608+
<span id="1608">1608</span>
1609+
<span id="1609">1609</span>
1610+
<span id="1610">1610</span>
1611+
<span id="1611">1611</span>
1612+
<span id="1612">1612</span>
1613+
<span id="1613">1613</span>
1614+
<span id="1614">1614</span>
1615+
<span id="1615">1615</span>
1616+
<span id="1616">1616</span>
1617+
<span id="1617">1617</span>
1618+
<span id="1618">1618</span>
1619+
<span id="1619">1619</span>
1620+
<span id="1620">1620</span>
1621+
<span id="1621">1621</span>
1622+
<span id="1622">1622</span>
1623+
<span id="1623">1623</span>
1624+
<span id="1624">1624</span>
1625+
<span id="1625">1625</span>
1626+
<span id="1626">1626</span>
1627+
<span id="1627">1627</span>
1628+
<span id="1628">1628</span>
1629+
<span id="1629">1629</span>
1630+
<span id="1630">1630</span>
1631+
<span id="1631">1631</span>
1632+
<span id="1632">1632</span>
1633+
<span id="1633">1633</span>
1634+
<span id="1634">1634</span>
1635+
<span id="1635">1635</span>
1636+
<span id="1636">1636</span>
1637+
<span id="1637">1637</span>
1638+
<span id="1638">1638</span>
1639+
<span id="1639">1639</span>
1640+
<span id="1640">1640</span>
1641+
<span id="1641">1641</span>
1642+
<span id="1642">1642</span>
1643+
<span id="1643">1643</span>
1644+
<span id="1644">1644</span>
1645+
<span id="1645">1645</span>
1646+
<span id="1646">1646</span>
1647+
<span id="1647">1647</span>
1648+
<span id="1648">1648</span>
1649+
<span id="1649">1649</span>
1650+
<span id="1650">1650</span>
1651+
<span id="1651">1651</span>
1652+
<span id="1652">1652</span>
1653+
<span id="1653">1653</span>
1654+
<span id="1654">1654</span>
1655+
<span id="1655">1655</span>
1656+
<span id="1656">1656</span>
1657+
<span id="1657">1657</span>
1658+
<span id="1658">1658</span>
1659+
<span id="1659">1659</span>
1660+
<span id="1660">1660</span>
1661+
<span id="1661">1661</span>
1662+
<span id="1662">1662</span>
1663+
<span id="1663">1663</span>
1664+
<span id="1664">1664</span>
1665+
<span id="1665">1665</span>
1666+
<span id="1666">1666</span>
1667+
<span id="1667">1667</span>
1668+
<span id="1668">1668</span>
1669+
<span id="1669">1669</span>
1670+
<span id="1670">1670</span>
1671+
<span id="1671">1671</span>
1672+
<span id="1672">1672</span>
15861673
</pre><pre class="rust"><code><span class="attribute">#![allow(clippy::missing_safety_doc)]
15871674
#![allow(clippy::extra_unused_lifetimes)]
15881675

@@ -1594,7 +1681,7 @@
15941681
// For the full copyright and license information, please view the LICENSE file
15951682
// that was distributed with this source code.
15961683

1597-
// spell-checker:ignore (ToDO) copydir ficlone ftruncate linkgs lstat nlink nlinks pathbuf pwrite reflink strs xattrs symlinked fiemap
1684+
// spell-checker:ignore (ToDO) copydir ficlone fiemap ftruncate linkgs lstat nlink nlinks pathbuf pwrite reflink strs xattrs symlinked deduplicated advcpmv
15981685

15991686
</span><span class="attribute">#[macro_use]
16001687
</span><span class="kw">extern crate </span>quick_error;
@@ -1618,6 +1705,7 @@
16181705

16191706
<span class="kw">use </span>clap::{crate_version, Arg, ArgAction, ArgMatches, Command};
16201707
<span class="kw">use </span>filetime::FileTime;
1708+
<span class="kw">use </span>indicatif::{ProgressBar, ProgressStyle};
16211709
<span class="attribute">#[cfg(unix)]
16221710
</span><span class="kw">use </span>libc::mkfifo;
16231711
<span class="kw">use </span>quick_error::ResultExt;
@@ -1799,6 +1887,7 @@
17991887
target_dir: <span class="prelude-ty">Option</span>&lt;String&gt;,
18001888
update: bool,
18011889
verbose: bool,
1890+
progress_bar: bool,
18021891
}
18031892

18041893
<span class="kw">static </span>ABOUT: <span class="kw-2">&amp;</span>str = <span class="string">&quot;Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.&quot;</span>;
@@ -1829,6 +1918,7 @@
18291918
<span class="kw">pub const </span>PARENT: <span class="kw-2">&amp;</span>str = <span class="string">&quot;parent&quot;</span>;
18301919
<span class="kw">pub const </span>PARENTS: <span class="kw-2">&amp;</span>str = <span class="string">&quot;parents&quot;</span>;
18311920
<span class="kw">pub const </span>PATHS: <span class="kw-2">&amp;</span>str = <span class="string">&quot;paths&quot;</span>;
1921+
<span class="kw">pub const </span>PROGRESS_BAR: <span class="kw-2">&amp;</span>str = <span class="string">&quot;progress&quot;</span>;
18321922
<span class="kw">pub const </span>PRESERVE: <span class="kw-2">&amp;</span>str = <span class="string">&quot;preserve&quot;</span>;
18331923
<span class="kw">pub const </span>PRESERVE_DEFAULT_ATTRIBUTES: <span class="kw-2">&amp;</span>str = <span class="string">&quot;preserve-default-attributes&quot;</span>;
18341924
<span class="kw">pub const </span>RECURSIVE: <span class="kw-2">&amp;</span>str = <span class="string">&quot;recursive&quot;</span>;
@@ -2124,6 +2214,18 @@
21242214
)
21252215
<span class="comment">// END TODO
21262216
</span>.arg(
2217+
<span class="comment">// The &#39;g&#39; short flag is modeled after advcpmv
2218+
// See this repo: https://github.com/jarun/advcpmv
2219+
</span>Arg::new(options::PROGRESS_BAR)
2220+
.long(options::PROGRESS_BAR)
2221+
.short(<span class="string">&#39;g&#39;</span>)
2222+
.action(clap::ArgAction::SetTrue)
2223+
.help(
2224+
<span class="string">&quot;Display a progress bar. \n\
2225+
Note: this feature is not supported by GNU coreutils.&quot;</span>,
2226+
),
2227+
)
2228+
.arg(
21272229
Arg::new(options::PATHS)
21282230
.action(ArgAction::Append)
21292231
.value_hint(clap::ValueHint::AnyPath),
@@ -2402,6 +2504,7 @@
24022504
preserve_attributes,
24032505
recursive,
24042506
target_dir,
2507+
progress_bar: matches.get_flag(options::PROGRESS_BAR),
24052508
};
24062509

24072510
<span class="prelude-val">Ok</span>(options)
@@ -2520,7 +2623,7 @@
25202623
/// `Err(Error::NotAllFilesCopied)` if at least one non-fatal error was
25212624
/// encountered.
25222625
///
2523-
/// Behavior depends on `options`, see [`Options`] for details.
2626+
/// Behavior depends on path`options`, see [`Options`] for details.
25242627
///
25252628
/// [`Options`]: ./struct.Options.html
25262629
</span><span class="kw">fn </span>copy(sources: <span class="kw-2">&amp;</span>[Source], target: <span class="kw-2">&amp;</span>TargetSlice, options: <span class="kw-2">&amp;</span>Options) -&gt; CopyResult&lt;()&gt; {
@@ -2534,7 +2637,23 @@
25342637
<span class="kw">let </span><span class="kw-2">mut </span>non_fatal_errors = <span class="bool-val">false</span>;
25352638
<span class="kw">let </span><span class="kw-2">mut </span>seen_sources = HashSet::with_capacity(sources.len());
25362639
<span class="kw">let </span><span class="kw-2">mut </span>symlinked_files = HashSet::new();
2537-
<span class="kw">for </span>source <span class="kw">in </span>sources {
2640+
2641+
<span class="kw">let </span>progress_bar = <span class="kw">if </span>options.progress_bar {
2642+
<span class="prelude-val">Some</span>(
2643+
ProgressBar::new(disk_usage(sources, options.recursive)<span class="question-mark">?</span>)
2644+
.with_style(
2645+
ProgressStyle::with_template(
2646+
<span class="string">&quot;{msg}: [{elapsed_precise}] {wide_bar} {bytes:&gt;7}/{total_bytes:7}&quot;</span>,
2647+
)
2648+
.unwrap(),
2649+
)
2650+
.with_message(uucore::util_name()),
2651+
)
2652+
} <span class="kw">else </span>{
2653+
<span class="prelude-val">None
2654+
</span>};
2655+
2656+
<span class="kw">for </span>source <span class="kw">in </span>sources.iter() {
25382657
<span class="kw">if </span>seen_sources.contains(source) {
25392658
<span class="comment">// FIXME: compare sources by the actual file they point to, not their path. (e.g. dir/file == dir/../dir/file in most cases)
25402659
</span><span class="macro">show_warning!</span>(<span class="string">&quot;source {} specified more than once&quot;</span>, source.quote());
@@ -2545,9 +2664,14 @@
25452664
preserve_hardlinks(<span class="kw-2">&amp;mut </span>hard_links, source, <span class="kw-2">&amp;</span>dest, <span class="kw-2">&amp;mut </span>found_hard_link)<span class="question-mark">?</span>;
25462665
}
25472666
<span class="kw">if </span>!found_hard_link {
2548-
<span class="kw">if let </span><span class="prelude-val">Err</span>(error) =
2549-
copy_source(source, target, <span class="kw-2">&amp;</span>target_type, options, <span class="kw-2">&amp;mut </span>symlinked_files)
2550-
{
2667+
<span class="kw">if let </span><span class="prelude-val">Err</span>(error) = copy_source(
2668+
<span class="kw-2">&amp;</span>progress_bar,
2669+
source,
2670+
target,
2671+
<span class="kw-2">&amp;</span>target_type,
2672+
options,
2673+
<span class="kw-2">&amp;mut </span>symlinked_files,
2674+
) {
25512675
<span class="kw">match </span>error {
25522676
<span class="comment">// When using --no-clobber, we don&#39;t want to show
25532677
// an error message
@@ -2602,6 +2726,7 @@
26022726
}
26032727

26042728
<span class="kw">fn </span>copy_source(
2729+
progress_bar: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;ProgressBar&gt;,
26052730
source: <span class="kw-2">&amp;</span>SourceSlice,
26062731
target: <span class="kw-2">&amp;</span>TargetSlice,
26072732
target_type: <span class="kw-2">&amp;</span>TargetType,
@@ -2611,11 +2736,18 @@
26112736
<span class="kw">let </span>source_path = Path::new(<span class="kw-2">&amp;</span>source);
26122737
<span class="kw">if </span>source_path.is_dir() {
26132738
<span class="comment">// Copy as directory
2614-
</span>copy_directory(source, target, options, symlinked_files, <span class="bool-val">true</span>)
2739+
</span>copy_directory(progress_bar, source, target, options, symlinked_files, <span class="bool-val">true</span>)
26152740
} <span class="kw">else </span>{
26162741
<span class="comment">// Copy as file
26172742
</span><span class="kw">let </span>dest = construct_dest_path(source_path, target, target_type, options)<span class="question-mark">?</span>;
2618-
copy_file(source_path, dest.as_path(), options, symlinked_files, <span class="bool-val">true</span>)
2743+
copy_file(
2744+
progress_bar,
2745+
source_path,
2746+
dest.as_path(),
2747+
options,
2748+
symlinked_files,
2749+
<span class="bool-val">true</span>,
2750+
)
26192751
}
26202752
}
26212753

@@ -2862,6 +2994,7 @@
28622994
/// The original permissions of `source` will be copied to `dest`
28632995
/// after a successful copy.
28642996
</span><span class="kw">fn </span>copy_file(
2997+
progress_bar: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;ProgressBar&gt;,
28652998
source: <span class="kw-2">&amp;</span>Path,
28662999
dest: <span class="kw-2">&amp;</span>Path,
28673000
options: <span class="kw-2">&amp;</span>Options,
@@ -3037,6 +3170,11 @@
30373170
</span>fs::set_permissions(dest, dest_permissions).ok();
30383171
}
30393172
copy_attributes(source, dest, <span class="kw-2">&amp;</span>options.preserve_attributes)<span class="question-mark">?</span>;
3173+
3174+
<span class="kw">if let </span><span class="prelude-val">Some</span>(progress_bar) = progress_bar {
3175+
progress_bar.inc(fs::metadata(source)<span class="question-mark">?</span>.len());
3176+
}
3177+
30403178
<span class="prelude-val">Ok</span>(())
30413179
}
30423180

@@ -3156,6 +3294,42 @@
31563294
<span class="prelude-val">Ok</span>(target.join(local_to_root))
31573295
}
31583296

3297+
<span class="doccomment">/// Get the total size of a slice of files and directories.
3298+
///
3299+
/// This function is much like the `du` utility, by recursively getting the sizes of files in directories.
3300+
/// Files are not deduplicated when appearing in multiple sources. If `recursive` is set to `false`, the
3301+
/// directories in `paths` will be ignored.
3302+
</span><span class="kw">fn </span>disk_usage(paths: <span class="kw-2">&amp;</span>[PathBuf], recursive: bool) -&gt; io::Result&lt;u64&gt; {
3303+
<span class="kw">let </span><span class="kw-2">mut </span>total = <span class="number">0</span>;
3304+
<span class="kw">for </span>p <span class="kw">in </span>paths {
3305+
<span class="kw">let </span>md = fs::metadata(p)<span class="question-mark">?</span>;
3306+
<span class="kw">if </span>md.file_type().is_dir() {
3307+
<span class="kw">if </span>recursive {
3308+
total += disk_usage_directory(p)<span class="question-mark">?</span>;
3309+
}
3310+
} <span class="kw">else </span>{
3311+
total += md.len();
3312+
}
3313+
}
3314+
<span class="prelude-val">Ok</span>(total)
3315+
}
3316+
3317+
<span class="doccomment">/// A helper for `disk_usage` specialized for directories.
3318+
</span><span class="kw">fn </span>disk_usage_directory(p: <span class="kw-2">&amp;</span>Path) -&gt; io::Result&lt;u64&gt; {
3319+
<span class="kw">let </span><span class="kw-2">mut </span>total = <span class="number">0</span>;
3320+
3321+
<span class="kw">for </span>entry <span class="kw">in </span>fs::read_dir(p)<span class="question-mark">? </span>{
3322+
<span class="kw">let </span>entry = entry<span class="question-mark">?</span>;
3323+
<span class="kw">if </span>entry.file_type()<span class="question-mark">?</span>.is_dir() {
3324+
total += disk_usage_directory(<span class="kw-2">&amp;</span>entry.path())<span class="question-mark">?</span>;
3325+
} <span class="kw">else </span>{
3326+
total += entry.metadata()<span class="question-mark">?</span>.len();
3327+
}
3328+
}
3329+
3330+
<span class="prelude-val">Ok</span>(total)
3331+
}
3332+
31593333
<span class="attribute">#[test]
31603334
</span><span class="kw">fn </span>test_cp_localize_to_target() {
31613335
<span class="macro">assert!</span>(

dev/src/uu_cp/platform/linux.rs.html

+2
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
<span id="131">131</span>
132132
<span id="132">132</span>
133133
<span id="133">133</span>
134+
<span id="134">134</span>
134135
</pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
135136
// *
136137
// * For the full copyright and license information, please view the LICENSE
@@ -246,6 +247,7 @@
246247
source_is_fifo: bool,
247248
) -&gt; CopyResult&lt;()&gt; {
248249
<span class="kw">let </span>result = <span class="kw">match </span>(reflink_mode, sparse_mode) {
250+
(ReflinkMode::Never, SparseMode::Always) =&gt; sparse_copy(source, dest),
249251
(ReflinkMode::Never, <span class="kw">_</span>) =&gt; std::fs::copy(source, dest).map(|<span class="kw">_</span>| ()),
250252
(ReflinkMode::Auto, SparseMode::Always) =&gt; sparse_copy(source, dest),
251253

dev/src/uudoc/uudoc.rs.html

+2
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@
301301
<span id="301">301</span>
302302
<span id="302">302</span>
303303
<span id="303">303</span>
304+
<span id="304">304</span>
304305
</pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.
305306
//
306307
// For the full copyright and license information, please view the LICENSE
@@ -347,6 +348,7 @@
347348
* [Build from source](build.md)\n\
348349
* [Contributing](contributing.md)\n\
349350
* [GNU test coverage](test_coverage.md)\n\
351+
* [Extensions](extensions.md)\n\
350352
\n\
351353
# Reference\n\
352354
* [Multi-call binary](multicall.md)\n&quot;</span>,

0 commit comments

Comments
 (0)