|
492 | 492 | <span id="486">486</span>
|
493 | 493 | <span id="487">487</span>
|
494 | 494 | <span id="488">488</span>
|
| 495 | +<span id="489">489</span> |
| 496 | +<span id="490">490</span> |
| 497 | +<span id="491">491</span> |
| 498 | +<span id="492">492</span> |
| 499 | +<span id="493">493</span> |
| 500 | +<span id="494">494</span> |
| 501 | +<span id="495">495</span> |
| 502 | +<span id="496">496</span> |
| 503 | +<span id="497">497</span> |
| 504 | +<span id="498">498</span> |
| 505 | +<span id="499">499</span> |
| 506 | +<span id="500">500</span> |
| 507 | +<span id="501">501</span> |
495 | 508 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
|
496 | 509 | <span class="comment">//</span>
|
497 | 510 | <span class="comment">// (c) Orvar Segerström <orvarsegerstrom@gmail.com></span>
|
|
796 | 809 | <span class="kw">let</span> <span class="ident">target_dir</span> <span class="op">=</span> <span class="ident">paths</span>.<span class="ident">last</span>().<span class="ident">unwrap</span>();
|
797 | 810 | <span class="kw">let</span> <span class="ident">sources</span> <span class="op">=</span> <span class="kw-2">&</span><span class="ident">paths</span>[..<span class="ident">paths</span>.<span class="ident">len</span>() <span class="op">-</span> <span class="number">1</span>];
|
798 | 811 |
|
799 |
| - <span class="comment">// Check if we have mv dir1 dir2 dir2</span> |
800 |
| - <span class="comment">// And generate an error if this is the case</span> |
801 |
| - <span class="kw">if</span> <span class="ident">sources</span>.<span class="ident">contains</span>(<span class="ident">target_dir</span>) { |
802 |
| - <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">USimpleError::new</span>( |
803 |
| - <span class="number">1</span>, |
804 |
| - <span class="macro">format!</span>( |
805 |
| - <span class="string">"cannot move {} to a subdirectory of itself, '{}/{}'"</span>, |
806 |
| - <span class="ident">target_dir</span>.<span class="ident">quote</span>(), |
807 |
| - <span class="ident">target_dir</span>.<span class="ident">display</span>(), |
808 |
| - <span class="ident">target_dir</span>.<span class="ident">display</span>() |
809 |
| - ), |
810 |
| - )); |
811 |
| - } |
812 |
| - |
813 | 812 | <span class="ident">move_files_into_dir</span>(<span class="ident">sources</span>, <span class="ident">target_dir</span>, <span class="ident">b</span>)
|
814 | 813 | }
|
815 | 814 | }
|
|
820 | 819 | <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">MvError::NotADirectory</span>(<span class="ident">target_dir</span>.<span class="ident">quote</span>().<span class="ident">to_string</span>()).<span class="ident">into</span>());
|
821 | 820 | }
|
822 | 821 |
|
| 822 | + <span class="kw">let</span> <span class="ident">canonized_target_dir</span> <span class="op">=</span> <span class="ident">target_dir</span> |
| 823 | + .<span class="ident">canonicalize</span>() |
| 824 | + .<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">target_dir</span>.<span class="ident">to_path_buf</span>()); |
| 825 | + |
823 | 826 | <span class="kw">for</span> <span class="ident">sourcepath</span> <span class="kw">in</span> <span class="ident">files</span>.<span class="ident">iter</span>() {
|
824 | 827 | <span class="kw">let</span> <span class="ident">targetpath</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">sourcepath</span>.<span class="ident">file_name</span>() {
|
825 | 828 | <span class="prelude-val">Some</span>(<span class="ident">name</span>) => <span class="ident">target_dir</span>.<span class="ident">join</span>(<span class="ident">name</span>),
|
|
828 | 831 | <span class="kw">continue</span>;
|
829 | 832 | }
|
830 | 833 | };
|
| 834 | + |
| 835 | + <span class="comment">// Check if we have mv dir1 dir2 dir2</span> |
| 836 | + <span class="comment">// And generate an error if this is the case</span> |
| 837 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Ok</span>(<span class="ident">canonized_source</span>) <span class="op">=</span> <span class="ident">sourcepath</span>.<span class="ident">canonicalize</span>() { |
| 838 | + <span class="kw">if</span> <span class="ident">canonized_source</span> <span class="op">==</span> <span class="ident">canonized_target_dir</span> { |
| 839 | + <span class="comment">// User tried to move directory to itself, warning is shown</span> |
| 840 | + <span class="comment">// and process of moving files is continued.</span> |
| 841 | + <span class="macro">show!</span>(<span class="ident">USimpleError::new</span>( |
| 842 | + <span class="number">1</span>, |
| 843 | + <span class="macro">format!</span>( |
| 844 | + <span class="string">"cannot move '{}' to a subdirectory of itself, '{}/{}'"</span>, |
| 845 | + <span class="ident">sourcepath</span>.<span class="ident">display</span>(), |
| 846 | + <span class="ident">target_dir</span>.<span class="ident">display</span>(), |
| 847 | + <span class="ident">canonized_target_dir</span>.<span class="ident">components</span>().<span class="ident">last</span>().<span class="ident">map_or_else</span>( |
| 848 | + <span class="op">|</span><span class="op">|</span> <span class="ident">target_dir</span>.<span class="ident">display</span>().<span class="ident">to_string</span>(), |
| 849 | + <span class="op">|</span><span class="ident">dir</span><span class="op">|</span> { <span class="ident">PathBuf::from</span>(<span class="ident">dir</span>.<span class="ident">as_os_str</span>()).<span class="ident">display</span>().<span class="ident">to_string</span>() } |
| 850 | + ) |
| 851 | + ) |
| 852 | + )); |
| 853 | + <span class="kw">continue</span>; |
| 854 | + } |
| 855 | + } |
| 856 | + |
831 | 857 | <span class="macro">show_if_err!</span>(
|
832 | 858 | <span class="ident">rename</span>(<span class="ident">sourcepath</span>, <span class="kw-2">&</span><span class="ident">targetpath</span>, <span class="ident">b</span>).<span class="ident">map_err_context</span>(<span class="op">|</span><span class="op">|</span> <span class="macro">format!</span>(
|
833 | 859 | <span class="string">"cannot move {} to {}"</span>,
|
|
0 commit comments