|
482 | 482 | <span id="480">480</span>
|
483 | 483 | <span id="481">481</span>
|
484 | 484 | <span id="482">482</span>
|
| 485 | +<span id="483">483</span> |
| 486 | +<span id="484">484</span> |
| 487 | +<span id="485">485</span> |
| 488 | +<span id="486">486</span> |
| 489 | +<span id="487">487</span> |
| 490 | +<span id="488">488</span> |
| 491 | +<span id="489">489</span> |
| 492 | +<span id="490">490</span> |
| 493 | +<span id="491">491</span> |
| 494 | +<span id="492">492</span> |
| 495 | +<span id="493">493</span> |
| 496 | +<span id="494">494</span> |
| 497 | +<span id="495">495</span> |
| 498 | +<span id="496">496</span> |
| 499 | +<span id="497">497</span> |
| 500 | +<span id="498">498</span> |
| 501 | +<span id="499">499</span> |
| 502 | +<span id="500">500</span> |
| 503 | +<span id="501">501</span> |
| 504 | +<span id="502">502</span> |
485 | 505 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
486 | 506 | <span class="comment">// *</span>
|
487 | 507 | <span class="comment">// * (c) Joseph Crail <jbcrail@gmail.com></span>
|
|
538 | 558 | <span class="ident">TargetIsDirectory</span>(<span class="ident">PathBuf</span>),
|
539 | 559 | <span class="ident">SomeLinksFailed</span>,
|
540 | 560 | <span class="ident">FailedToLink</span>(<span class="ident">String</span>),
|
| 561 | + <span class="ident">SameFile</span>(<span class="ident">PathBuf</span>, <span class="ident">PathBuf</span>), |
541 | 562 | <span class="ident">MissingDestination</span>(<span class="ident">PathBuf</span>),
|
542 | 563 | <span class="ident">ExtraOperand</span>(<span class="ident">OsString</span>),
|
543 | 564 | }
|
|
547 | 568 | <span class="kw">match</span> <span class="self">self</span> {
|
548 | 569 | <span class="ident"><span class="self">Self</span>::TargetIsDirectory</span>(<span class="ident">s</span>) => <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"target {} is not a directory"</span>, <span class="ident">s</span>.<span class="ident">quote</span>()),
|
549 | 570 | <span class="ident"><span class="self">Self</span>::FailedToLink</span>(<span class="ident">e</span>) => <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"failed to link: {}"</span>, <span class="ident">e</span>),
|
| 571 | + <span class="ident"><span class="self">Self</span>::SameFile</span>(<span class="ident">e</span>, <span class="ident">e2</span>) => <span class="macro">write!</span>( |
| 572 | + <span class="ident">f</span>, |
| 573 | + <span class="string">"'{}' and '{}' are the same file"</span>, |
| 574 | + <span class="ident">e2</span>.<span class="ident">display</span>(), |
| 575 | + <span class="ident">e</span>.<span class="ident">display</span>() |
| 576 | + ), |
550 | 577 | <span class="ident"><span class="self">Self</span>::SomeLinksFailed</span> => <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"some links failed to create"</span>),
|
551 | 578 | <span class="ident"><span class="self">Self</span>::MissingDestination</span>(<span class="ident">s</span>) => {
|
552 | 579 | <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"missing destination file operand after {}"</span>, <span class="ident">s</span>.<span class="ident">quote</span>())
|
|
569 | 596 | <span class="ident"><span class="self">Self</span>::TargetIsDirectory</span>(<span class="kw">_</span>)
|
570 | 597 | <span class="op">|</span> <span class="ident"><span class="self">Self</span>::SomeLinksFailed</span>
|
571 | 598 | <span class="op">|</span> <span class="ident"><span class="self">Self</span>::FailedToLink</span>(<span class="kw">_</span>)
|
| 599 | + <span class="op">|</span> <span class="ident"><span class="self">Self</span>::SameFile</span>(<span class="kw">_</span>, <span class="kw">_</span>) |
572 | 600 | <span class="op">|</span> <span class="ident"><span class="self">Self</span>::MissingDestination</span>(<span class="kw">_</span>)
|
573 | 601 | <span class="op">|</span> <span class="ident"><span class="self">Self</span>::ExtraOperand</span>(<span class="kw">_</span>) => <span class="number">1</span>,
|
574 | 602 | }
|
|
865 | 893 | <span class="prelude-val">Ok</span>(<span class="ident">result</span>.<span class="ident">into</span>())
|
866 | 894 | }
|
867 | 895 |
|
868 |
| -<span class="kw">fn</span> <span class="ident">link</span>(<span class="ident">src</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">dst</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">settings</span>: <span class="kw-2">&</span><span class="ident">Settings</span>) -> <span class="prelude-ty">Result</span><span class="op"><</span>()<span class="op">></span> { |
| 896 | +<span class="kw">fn</span> <span class="ident">link</span>(<span class="ident">src</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">dst</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">settings</span>: <span class="kw-2">&</span><span class="ident">Settings</span>) -> <span class="ident">UResult</span><span class="op"><</span>()<span class="op">></span> { |
869 | 897 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">backup_path</span> <span class="op">=</span> <span class="prelude-val">None</span>;
|
870 | 898 | <span class="kw">let</span> <span class="ident">source</span>: <span class="ident">Cow</span><span class="op"><</span><span class="lifetime">'_</span>, <span class="ident">Path</span><span class="op">></span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">settings</span>.<span class="ident">relative</span> {
|
871 | 899 | <span class="ident">relative_path</span>(<span class="ident">src</span>, <span class="ident">dst</span>)<span class="question-mark">?</span>
|
|
892 | 920 | <span class="ident">BackupMode::NumberedBackup</span> => <span class="prelude-val">Some</span>(<span class="ident">numbered_backup_path</span>(<span class="ident">dst</span>)),
|
893 | 921 | <span class="ident">BackupMode::ExistingBackup</span> => <span class="prelude-val">Some</span>(<span class="ident">existing_backup_path</span>(<span class="ident">dst</span>, <span class="kw-2">&</span><span class="ident">settings</span>.<span class="ident">suffix</span>)),
|
894 | 922 | };
|
| 923 | + <span class="kw">if</span> <span class="ident">settings</span>.<span class="ident">backup</span> <span class="op">==</span> <span class="ident">BackupMode::ExistingBackup</span> <span class="op">&&</span> <span class="op">!</span><span class="ident">settings</span>.<span class="ident">symbolic</span> { |
| 924 | + <span class="comment">// when ln --backup f f, it should detect that it is the same file</span> |
| 925 | + <span class="kw">let</span> <span class="ident">dst_abs</span> <span class="op">=</span> <span class="ident">canonicalize</span>(<span class="ident">dst</span>, <span class="ident">MissingHandling::Normal</span>, <span class="ident">ResolveMode::Logical</span>)<span class="question-mark">?</span>; |
| 926 | + <span class="kw">let</span> <span class="ident">source_abs</span> <span class="op">=</span> <span class="ident">canonicalize</span>( |
| 927 | + <span class="ident">source</span>.<span class="ident">clone</span>(), |
| 928 | + <span class="ident">MissingHandling::Normal</span>, |
| 929 | + <span class="ident">ResolveMode::Logical</span>, |
| 930 | + )<span class="question-mark">?</span>; |
| 931 | + <span class="kw">if</span> <span class="ident">dst_abs</span> <span class="op">==</span> <span class="ident">source_abs</span> { |
| 932 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">LnError::SameFile</span>(<span class="ident">dst</span>.<span class="ident">to_path_buf</span>(), <span class="ident">source</span>.<span class="ident">to_path_buf</span>()).<span class="ident">into</span>()); |
| 933 | + } |
| 934 | + } |
895 | 935 | <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="kw-2">ref</span> <span class="ident">p</span>) <span class="op">=</span> <span class="ident">backup_path</span> {
|
896 | 936 | <span class="ident">fs::rename</span>(<span class="ident">dst</span>, <span class="ident">p</span>)<span class="question-mark">?</span>;
|
897 | 937 | }
|
|
0 commit comments