Skip to content

Commit bfec31d

Browse files
committed
deploy: 2ed80ff
1 parent 4db8fd5 commit bfec31d

File tree

6 files changed

+325
-27
lines changed

6 files changed

+325
-27
lines changed

dev/src/uu_cp/copydir.rs.html

+128-4
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,68 @@
392392
<span id="392">392</span>
393393
<span id="393">393</span>
394394
<span id="394">394</span>
395+
<span id="395">395</span>
396+
<span id="396">396</span>
397+
<span id="397">397</span>
398+
<span id="398">398</span>
399+
<span id="399">399</span>
400+
<span id="400">400</span>
401+
<span id="401">401</span>
402+
<span id="402">402</span>
403+
<span id="403">403</span>
404+
<span id="404">404</span>
405+
<span id="405">405</span>
406+
<span id="406">406</span>
407+
<span id="407">407</span>
408+
<span id="408">408</span>
409+
<span id="409">409</span>
410+
<span id="410">410</span>
411+
<span id="411">411</span>
412+
<span id="412">412</span>
413+
<span id="413">413</span>
414+
<span id="414">414</span>
415+
<span id="415">415</span>
416+
<span id="416">416</span>
417+
<span id="417">417</span>
418+
<span id="418">418</span>
419+
<span id="419">419</span>
420+
<span id="420">420</span>
421+
<span id="421">421</span>
422+
<span id="422">422</span>
423+
<span id="423">423</span>
424+
<span id="424">424</span>
425+
<span id="425">425</span>
426+
<span id="426">426</span>
427+
<span id="427">427</span>
428+
<span id="428">428</span>
429+
<span id="429">429</span>
430+
<span id="430">430</span>
431+
<span id="431">431</span>
432+
<span id="432">432</span>
433+
<span id="433">433</span>
434+
<span id="434">434</span>
435+
<span id="435">435</span>
436+
<span id="436">436</span>
437+
<span id="437">437</span>
438+
<span id="438">438</span>
439+
<span id="439">439</span>
440+
<span id="440">440</span>
441+
<span id="441">441</span>
442+
<span id="442">442</span>
443+
<span id="443">443</span>
444+
<span id="444">444</span>
445+
<span id="445">445</span>
446+
<span id="446">446</span>
447+
<span id="447">447</span>
448+
<span id="448">448</span>
449+
<span id="449">449</span>
450+
<span id="450">450</span>
451+
<span id="451">451</span>
452+
<span id="452">452</span>
453+
<span id="453">453</span>
454+
<span id="454">454</span>
455+
<span id="455">455</span>
456+
<span id="456">456</span>
395457
</pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
396458
// *
397459
// * For the full copyright and license information, please view the LICENSE
@@ -418,8 +480,8 @@
418480
<span class="kw">use </span>walkdir::{DirEntry, WalkDir};
419481

420482
<span class="kw">use crate</span>::{
421-
copy_attributes, copy_file, copy_link, preserve_hardlinks, CopyResult, Error, Options,
422-
TargetSlice,
483+
aligned_ancestors, context_for, copy_attributes, copy_file, copy_link, preserve_hardlinks,
484+
CopyResult, Error, Options, TargetSlice,
423485
};
424486

425487
<span class="doccomment">/// Ensure a Windows path starts with a `\\?`.
@@ -566,6 +628,27 @@
566628
}
567629
}
568630

631+
<span class="doccomment">/// Decide whether the given path ends with `/.`.
632+
///
633+
/// # Examples
634+
///
635+
/// ```rust,ignore
636+
/// assert!(ends_with_slash_dot(&quot;/.&quot;));
637+
/// assert!(ends_with_slash_dot(&quot;./.&quot;));
638+
/// assert!(ends_with_slash_dot(&quot;a/.&quot;));
639+
///
640+
/// assert!(!ends_with_slash_dot(&quot;.&quot;));
641+
/// assert!(!ends_with_slash_dot(&quot;./&quot;));
642+
/// assert!(!ends_with_slash_dot(&quot;a/..&quot;));
643+
/// ```
644+
</span><span class="kw">fn </span>ends_with_slash_dot&lt;P&gt;(path: P) -&gt; bool
645+
<span class="kw">where
646+
</span>P: AsRef&lt;Path&gt;,
647+
{
648+
<span class="comment">// `path.ends_with(&quot;.&quot;)` does not seem to work
649+
</span>path.as_ref().display().to_string().ends_with(<span class="string">&quot;/.&quot;</span>)
650+
}
651+
569652
<span class="doccomment">/// Copy a single entry during a directory traversal.
570653
</span><span class="kw">fn </span>copy_direntry(
571654
progress_bar: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;ProgressBar&gt;,
@@ -590,7 +673,10 @@
590673

591674
<span class="comment">// If the source is a directory and the destination does not
592675
// exist, ...
593-
</span><span class="kw">if </span>source_absolute.is_dir() &amp;&amp; !local_to_target.exists() {
676+
</span><span class="kw">if </span>source_absolute.is_dir()
677+
&amp;&amp; !ends_with_slash_dot(<span class="kw-2">&amp;</span>source_absolute)
678+
&amp;&amp; !local_to_target.exists()
679+
{
594680
<span class="kw">if </span>target_is_file {
595681
<span class="kw">return </span><span class="prelude-val">Err</span>(<span class="string">&quot;cannot overwrite non-directory with directory&quot;</span>.into());
596682
} <span class="kw">else </span>{
@@ -599,7 +685,10 @@
599685
// `create_dir_all()` will have any benefit over
600686
// `create_dir()`, since all the ancestor directories
601687
// should have already been created.
602-
</span>fs::create_dir_all(local_to_target)<span class="question-mark">?</span>;
688+
</span>fs::create_dir_all(<span class="kw-2">&amp;</span>local_to_target)<span class="question-mark">?</span>;
689+
<span class="kw">if </span>options.verbose {
690+
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, context_for(<span class="kw-2">&amp;</span>source_relative, <span class="kw-2">&amp;</span>local_to_target));
691+
}
603692
<span class="kw">return </span><span class="prelude-val">Ok</span>(());
604693
}
605694
}
@@ -717,6 +806,19 @@
717806
<span class="kw">if let </span><span class="prelude-val">Some</span>(parent) = root.parent() {
718807
<span class="kw">let </span>new_target = target.join(parent);
719808
std::fs::create_dir_all(<span class="kw-2">&amp;</span>new_target)<span class="question-mark">?</span>;
809+
810+
<span class="kw">if </span>options.verbose {
811+
<span class="comment">// For example, if copying file `a/b/c` and its parents
812+
// to directory `d/`, then print
813+
//
814+
// a -&gt; d/a
815+
// a/b -&gt; d/a/b
816+
//
817+
</span><span class="kw">for </span>(x, y) <span class="kw">in </span>aligned_ancestors(root, <span class="kw-2">&amp;</span>target.join(root)) {
818+
<span class="macro">println!</span>(<span class="string">&quot;{} -&gt; {}&quot;</span>, x.display(), y.display());
819+
}
820+
}
821+
720822
new_target
721823
} <span class="kw">else </span>{
722824
target.to_path_buf()
@@ -786,5 +888,27 @@
786888

787889
<span class="prelude-val">Ok</span>(pathbuf1.starts_with(pathbuf2))
788890
}
891+
892+
<span class="attribute">#[cfg(test)]
893+
</span><span class="kw">mod </span>tests {
894+
<span class="kw">use </span><span class="kw">super</span>::ends_with_slash_dot;
895+
896+
<span class="attribute">#[test]
897+
</span><span class="kw">fn </span>test_ends_with_slash_dot() {
898+
<span class="macro">assert!</span>(ends_with_slash_dot(<span class="string">&quot;/.&quot;</span>));
899+
<span class="macro">assert!</span>(ends_with_slash_dot(<span class="string">&quot;./.&quot;</span>));
900+
<span class="macro">assert!</span>(ends_with_slash_dot(<span class="string">&quot;../.&quot;</span>));
901+
<span class="macro">assert!</span>(ends_with_slash_dot(<span class="string">&quot;a/.&quot;</span>));
902+
<span class="macro">assert!</span>(ends_with_slash_dot(<span class="string">&quot;/a/.&quot;</span>));
903+
904+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;&quot;</span>));
905+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;.&quot;</span>));
906+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;./&quot;</span>));
907+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;..&quot;</span>));
908+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;/..&quot;</span>));
909+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;a/..&quot;</span>));
910+
<span class="macro">assert!</span>(!ends_with_slash_dot(<span class="string">&quot;/a/..&quot;</span>));
911+
}
912+
}
789913
</code></pre></div>
790914
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_cp" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>

dev/src/uu_cp/cp.rs.html

+169-11
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,85 @@
16881688
<span id="1688">1688</span>
16891689
<span id="1689">1689</span>
16901690
<span id="1690">1690</span>
1691+
<span id="1691">1691</span>
1692+
<span id="1692">1692</span>
1693+
<span id="1693">1693</span>
1694+
<span id="1694">1694</span>
1695+
<span id="1695">1695</span>
1696+
<span id="1696">1696</span>
1697+
<span id="1697">1697</span>
1698+
<span id="1698">1698</span>
1699+
<span id="1699">1699</span>
1700+
<span id="1700">1700</span>
1701+
<span id="1701">1701</span>
1702+
<span id="1702">1702</span>
1703+
<span id="1703">1703</span>
1704+
<span id="1704">1704</span>
1705+
<span id="1705">1705</span>
1706+
<span id="1706">1706</span>
1707+
<span id="1707">1707</span>
1708+
<span id="1708">1708</span>
1709+
<span id="1709">1709</span>
1710+
<span id="1710">1710</span>
1711+
<span id="1711">1711</span>
1712+
<span id="1712">1712</span>
1713+
<span id="1713">1713</span>
1714+
<span id="1714">1714</span>
1715+
<span id="1715">1715</span>
1716+
<span id="1716">1716</span>
1717+
<span id="1717">1717</span>
1718+
<span id="1718">1718</span>
1719+
<span id="1719">1719</span>
1720+
<span id="1720">1720</span>
1721+
<span id="1721">1721</span>
1722+
<span id="1722">1722</span>
1723+
<span id="1723">1723</span>
1724+
<span id="1724">1724</span>
1725+
<span id="1725">1725</span>
1726+
<span id="1726">1726</span>
1727+
<span id="1727">1727</span>
1728+
<span id="1728">1728</span>
1729+
<span id="1729">1729</span>
1730+
<span id="1730">1730</span>
1731+
<span id="1731">1731</span>
1732+
<span id="1732">1732</span>
1733+
<span id="1733">1733</span>
1734+
<span id="1734">1734</span>
1735+
<span id="1735">1735</span>
1736+
<span id="1736">1736</span>
1737+
<span id="1737">1737</span>
1738+
<span id="1738">1738</span>
1739+
<span id="1739">1739</span>
1740+
<span id="1740">1740</span>
1741+
<span id="1741">1741</span>
1742+
<span id="1742">1742</span>
1743+
<span id="1743">1743</span>
1744+
<span id="1744">1744</span>
1745+
<span id="1745">1745</span>
1746+
<span id="1746">1746</span>
1747+
<span id="1747">1747</span>
1748+
<span id="1748">1748</span>
1749+
<span id="1749">1749</span>
1750+
<span id="1750">1750</span>
1751+
<span id="1751">1751</span>
1752+
<span id="1752">1752</span>
1753+
<span id="1753">1753</span>
1754+
<span id="1754">1754</span>
1755+
<span id="1755">1755</span>
1756+
<span id="1756">1756</span>
1757+
<span id="1757">1757</span>
1758+
<span id="1758">1758</span>
1759+
<span id="1759">1759</span>
1760+
<span id="1760">1760</span>
1761+
<span id="1761">1761</span>
1762+
<span id="1762">1762</span>
1763+
<span id="1763">1763</span>
1764+
<span id="1764">1764</span>
1765+
<span id="1765">1765</span>
1766+
<span id="1766">1766</span>
1767+
<span id="1767">1767</span>
1768+
<span id="1768">1768</span>
1769+
<span id="1769">1769</span>
16911770
</pre><pre class="rust"><code><span class="attribute">#![allow(clippy::missing_safety_doc)]
16921771
#![allow(clippy::extra_unused_lifetimes)]
16931772

@@ -3006,6 +3085,47 @@
30063085
</span>path.symlink_metadata().is_ok()
30073086
}
30083087

3088+
<span class="doccomment">/// Zip the ancestors of a source path and destination path.
3089+
///
3090+
/// # Examples
3091+
///
3092+
/// ```rust,ignore
3093+
/// let actual = aligned_ancestors(&amp;Path::new(&quot;a/b/c&quot;), &amp;Path::new(&quot;d/a/b/c&quot;));
3094+
/// let expected = vec![
3095+
/// (Path::new(&quot;a&quot;), Path::new(&quot;d/a&quot;)),
3096+
/// (Path::new(&quot;a/b&quot;), Path::new(&quot;d/a/b&quot;)),
3097+
/// ];
3098+
/// assert_eq!(actual, expected);
3099+
/// ```
3100+
</span><span class="kw">fn </span>aligned_ancestors&lt;<span class="lifetime">&#39;a</span>&gt;(source: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>Path, dest: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>Path) -&gt; Vec&lt;(<span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>Path, <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span>Path)&gt; {
3101+
<span class="comment">// Collect the ancestors of each. For example, if `source` is
3102+
// &quot;a/b/c&quot;, then the ancestors are &quot;a/b/c&quot;, &quot;a/b&quot;, &quot;a/&quot;, and &quot;&quot;.
3103+
</span><span class="kw">let </span>source_ancestors: Vec&lt;<span class="kw-2">&amp;</span>Path&gt; = source.ancestors().collect();
3104+
<span class="kw">let </span>dest_ancestors: Vec&lt;<span class="kw-2">&amp;</span>Path&gt; = dest.ancestors().collect();
3105+
3106+
<span class="comment">// For this particular application, we don&#39;t care about the null
3107+
// path &quot;&quot; and we don&#39;t care about the full path (e.g. &quot;a/b/c&quot;),
3108+
// so we exclude those.
3109+
</span><span class="kw">let </span>n = source_ancestors.len();
3110+
<span class="kw">let </span>source_ancestors = <span class="kw-2">&amp;</span>source_ancestors[<span class="number">1</span>..n - <span class="number">1</span>];
3111+
3112+
<span class="comment">// Get the matching number of elements from the ancestors of the
3113+
// destination path (for example, get &quot;d/a&quot; and &quot;d/a/b&quot;).
3114+
</span><span class="kw">let </span>k = source_ancestors.len();
3115+
<span class="kw">let </span>dest_ancestors = <span class="kw-2">&amp;</span>dest_ancestors[<span class="number">1</span>..<span class="number">1 </span>+ k];
3116+
3117+
<span class="comment">// Now we have two slices of the same length, so we zip them.
3118+
</span><span class="kw">let </span><span class="kw-2">mut </span>result = <span class="macro">vec!</span>[];
3119+
<span class="kw">for </span>(x, y) <span class="kw">in </span>source_ancestors
3120+
.iter()
3121+
.rev()
3122+
.zip(dest_ancestors.iter().rev())
3123+
{
3124+
result.push((<span class="kw-2">*</span>x, <span class="kw-2">*</span>y));
3125+
}
3126+
result
3127+
}
3128+
30093129
<span class="doccomment">/// Copy the a file from `source` to `dest`. `source` will be dereferenced if
30103130
/// `options.dereference` is set to true. `dest` will be dereferenced only if
30113131
/// the source was not a symlink.
@@ -3065,9 +3185,33 @@
30653185
<span class="kw">if let </span><span class="prelude-val">Some</span>(pb) = progress_bar {
30663186
<span class="comment">// Suspend (hide) the progress bar so the println won&#39;t overlap with the progress bar.
30673187
</span>pb.suspend(|| {
3188+
<span class="kw">if </span>options.parents {
3189+
<span class="comment">// For example, if copying file `a/b/c` and its parents
3190+
// to directory `d/`, then print
3191+
//
3192+
// a -&gt; d/a
3193+
// a/b -&gt; d/a/b
3194+
//
3195+
</span><span class="kw">for </span>(x, y) <span class="kw">in </span>aligned_ancestors(source, dest) {
3196+
<span class="macro">println!</span>(<span class="string">&quot;{} -&gt; {}&quot;</span>, x.display(), y.display());
3197+
}
3198+
}
3199+
30683200
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, context_for(source, dest));
30693201
});
30703202
} <span class="kw">else </span>{
3203+
<span class="kw">if </span>options.parents {
3204+
<span class="comment">// For example, if copying file `a/b/c` and its parents
3205+
// to directory `d/`, then print
3206+
//
3207+
// a -&gt; d/a
3208+
// a/b -&gt; d/a/b
3209+
//
3210+
</span><span class="kw">for </span>(x, y) <span class="kw">in </span>aligned_ancestors(source, dest) {
3211+
<span class="macro">println!</span>(<span class="string">&quot;{} -&gt; {}&quot;</span>, x.display(), y.display());
3212+
}
3213+
}
3214+
30713215
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, context_for(source, dest));
30723216
}
30733217
}
@@ -3366,17 +3510,31 @@
33663510
<span class="prelude-val">Ok</span>(total)
33673511
}
33683512

3369-
<span class="attribute">#[test]
3370-
</span><span class="kw">fn </span>test_cp_localize_to_target() {
3371-
<span class="macro">assert!</span>(
3372-
localize_to_target(
3373-
Path::new(<span class="string">&quot;a/source/&quot;</span>),
3374-
Path::new(<span class="string">&quot;a/source/c.txt&quot;</span>),
3375-
Path::new(<span class="string">&quot;target/&quot;</span>)
3376-
)
3377-
.unwrap()
3378-
== Path::new(<span class="string">&quot;target/c.txt&quot;</span>)
3379-
);
3513+
<span class="attribute">#[cfg(test)]
3514+
</span><span class="kw">mod </span>tests {
3515+
3516+
<span class="kw">use crate</span>::{aligned_ancestors, localize_to_target};
3517+
<span class="kw">use </span>std::path::Path;
3518+
3519+
<span class="attribute">#[test]
3520+
</span><span class="kw">fn </span>test_cp_localize_to_target() {
3521+
<span class="kw">let </span>root = Path::new(<span class="string">&quot;a/source/&quot;</span>);
3522+
<span class="kw">let </span>source = Path::new(<span class="string">&quot;a/source/c.txt&quot;</span>);
3523+
<span class="kw">let </span>target = Path::new(<span class="string">&quot;target/&quot;</span>);
3524+
<span class="kw">let </span>actual = localize_to_target(root, source, target).unwrap();
3525+
<span class="kw">let </span>expected = Path::new(<span class="string">&quot;target/c.txt&quot;</span>);
3526+
<span class="macro">assert_eq!</span>(actual, expected);
3527+
}
3528+
3529+
<span class="attribute">#[test]
3530+
</span><span class="kw">fn </span>test_aligned_ancestors() {
3531+
<span class="kw">let </span>actual = aligned_ancestors(<span class="kw-2">&amp;</span>Path::new(<span class="string">&quot;a/b/c&quot;</span>), <span class="kw-2">&amp;</span>Path::new(<span class="string">&quot;d/a/b/c&quot;</span>));
3532+
<span class="kw">let </span>expected = <span class="macro">vec!</span>[
3533+
(Path::new(<span class="string">&quot;a&quot;</span>), Path::new(<span class="string">&quot;d/a&quot;</span>)),
3534+
(Path::new(<span class="string">&quot;a/b&quot;</span>), Path::new(<span class="string">&quot;d/a/b&quot;</span>)),
3535+
];
3536+
<span class="macro">assert_eq!</span>(actual, expected);
3537+
}
33803538
}
33813539
</code></pre></div>
33823540
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_cp" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>

0 commit comments

Comments
 (0)