|
515 | 515 | <span id="510">510</span>
|
516 | 516 | <span id="511">511</span>
|
517 | 517 | <span id="512">512</span>
|
| 518 | +<span id="513">513</span> |
| 519 | +<span id="514">514</span> |
| 520 | +<span id="515">515</span> |
| 521 | +<span id="516">516</span> |
| 522 | +<span id="517">517</span> |
| 523 | +<span id="518">518</span> |
| 524 | +<span id="519">519</span> |
| 525 | +<span id="520">520</span> |
| 526 | +<span id="521">521</span> |
| 527 | +<span id="522">522</span> |
| 528 | +<span id="523">523</span> |
| 529 | +<span id="524">524</span> |
| 530 | +<span id="525">525</span> |
| 531 | +<span id="526">526</span> |
| 532 | +<span id="527">527</span> |
| 533 | +<span id="528">528</span> |
| 534 | +<span id="529">529</span> |
| 535 | +<span id="530">530</span> |
| 536 | +<span id="531">531</span> |
| 537 | +<span id="532">532</span> |
| 538 | +<span id="533">533</span> |
| 539 | +<span id="534">534</span> |
| 540 | +<span id="535">535</span> |
| 541 | +<span id="536">536</span> |
| 542 | +<span id="537">537</span> |
| 543 | +<span id="538">538</span> |
| 544 | +<span id="539">539</span> |
| 545 | +<span id="540">540</span> |
| 546 | +<span id="541">541</span> |
| 547 | +<span id="542">542</span> |
518 | 548 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
519 | 549 | <span class="comment">// *</span>
|
520 | 550 | <span class="comment">// * (c) Joseph Crail <jbcrail@gmail.com></span>
|
|
553 | 583 | <span class="ident">suffix</span>: <span class="ident">String</span>,
|
554 | 584 | <span class="ident">symbolic</span>: <span class="ident">bool</span>,
|
555 | 585 | <span class="ident">relative</span>: <span class="ident">bool</span>,
|
| 586 | + <span class="ident">logical</span>: <span class="ident">bool</span>, |
556 | 587 | <span class="ident">target_dir</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
557 | 588 | <span class="ident">no_target_dir</span>: <span class="ident">bool</span>,
|
558 | 589 | <span class="ident">no_dereference</span>: <span class="ident">bool</span>,
|
|
638 | 669 |
|
639 | 670 | <span class="kw">mod</span> <span class="ident">options</span> {
|
640 | 671 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">FORCE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"force"</span>;
|
| 672 | + <span class="comment">//pub const DIRECTORY: &str = "directory";</span> |
641 | 673 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">INTERACTIVE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"interactive"</span>;
|
642 | 674 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">NO_DEREFERENCE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"no-dereference"</span>;
|
643 | 675 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">SYMBOLIC</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"symbolic"</span>;
|
| 676 | + <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">LOGICAL</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"logical"</span>; |
| 677 | + <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">PHYSICAL</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"physical"</span>; |
644 | 678 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">TARGET_DIRECTORY</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"target-directory"</span>;
|
645 | 679 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">NO_TARGET_DIRECTORY</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"no-target-directory"</span>;
|
646 | 680 | <span class="kw">pub</span> <span class="kw">const</span> <span class="ident">RELATIVE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"relative"</span>;
|
|
669 | 703 | .<span class="ident">map</span>(<span class="ident">PathBuf::from</span>)
|
670 | 704 | .<span class="ident">collect</span>();
|
671 | 705 |
|
| 706 | + <span class="kw">let</span> <span class="ident">symbolic</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::SYMBOLIC</span>); |
| 707 | + |
672 | 708 | <span class="kw">let</span> <span class="ident">overwrite_mode</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::FORCE</span>) {
|
673 | 709 | <span class="ident">OverwriteMode::Force</span>
|
674 | 710 | } <span class="kw">else</span> <span class="kw">if</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::INTERACTIVE</span>) {
|
|
680 | 716 | <span class="kw">let</span> <span class="ident">backup_mode</span> <span class="op">=</span> <span class="ident">backup_control::determine_backup_mode</span>(<span class="kw-2">&</span><span class="ident">matches</span>)<span class="question-mark">?</span>;
|
681 | 717 | <span class="kw">let</span> <span class="ident">backup_suffix</span> <span class="op">=</span> <span class="ident">backup_control::determine_backup_suffix</span>(<span class="kw-2">&</span><span class="ident">matches</span>);
|
682 | 718 |
|
| 719 | + <span class="comment">// When we have "-L" or "-L -P", false otherwise</span> |
| 720 | + <span class="kw">let</span> <span class="ident">logical</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::LOGICAL</span>); |
| 721 | + |
683 | 722 | <span class="kw">let</span> <span class="ident">settings</span> <span class="op">=</span> <span class="ident">Settings</span> {
|
684 | 723 | <span class="ident">overwrite</span>: <span class="ident">overwrite_mode</span>,
|
685 | 724 | <span class="ident">backup</span>: <span class="ident">backup_mode</span>,
|
686 | 725 | <span class="ident">suffix</span>: <span class="ident">backup_suffix</span>,
|
687 |
| - <span class="ident">symbolic</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::SYMBOLIC</span>), |
| 726 | + <span class="ident">symbolic</span>, |
| 727 | + <span class="ident">logical</span>, |
688 | 728 | <span class="ident">relative</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::RELATIVE</span>),
|
689 | 729 | <span class="ident">target_dir</span>: <span class="ident">matches</span>
|
690 | 730 | .<span class="ident">value_of</span>(<span class="ident">options::TARGET_DIRECTORY</span>)
|
|
705 | 745 | .<span class="ident">infer_long_args</span>(<span class="bool-val">true</span>)
|
706 | 746 | .<span class="ident">arg</span>(<span class="ident">backup_control::arguments::backup</span>())
|
707 | 747 | .<span class="ident">arg</span>(<span class="ident">backup_control::arguments::backup_no_args</span>())
|
708 |
| - <span class="comment">// TODO: opts.arg(</span> |
709 |
| - <span class="comment">// Arg::new(("d", "directory", "allow users with appropriate privileges to attempt \</span> |
710 |
| - <span class="comment">// to make hard links to directories");</span> |
| 748 | + <span class="comment">/*.arg( |
| 749 | + Arg::new(options::DIRECTORY) |
| 750 | + .short('d') |
| 751 | + .long(options::DIRECTORY) |
| 752 | + .help("allow users with appropriate privileges to attempt to make hard links to directories") |
| 753 | + )*/</span> |
711 | 754 | .<span class="ident">arg</span>(
|
712 | 755 | <span class="ident">Arg::new</span>(<span class="ident">options::FORCE</span>)
|
713 | 756 | .<span class="ident">short</span>(<span class="string">'f'</span>)
|
|
729 | 772 | symbolic link to a directory"</span>,
|
730 | 773 | ),
|
731 | 774 | )
|
732 |
| - <span class="comment">// TODO: opts.arg(</span> |
733 |
| - <span class="comment">// Arg::new(("L", "logical", "dereference TARGETs that are symbolic links");</span> |
734 |
| - <span class="comment">//</span> |
735 |
| - <span class="comment">// TODO: opts.arg(</span> |
736 |
| - <span class="comment">// Arg::new(("P", "physical", "make hard links directly to symbolic links");</span> |
| 775 | + .<span class="ident">arg</span>( |
| 776 | + <span class="ident">Arg::new</span>(<span class="ident">options::LOGICAL</span>) |
| 777 | + .<span class="ident">short</span>(<span class="string">'L'</span>) |
| 778 | + .<span class="ident">long</span>(<span class="ident">options::LOGICAL</span>) |
| 779 | + .<span class="ident">help</span>(<span class="string">"dereference TARGETs that are symbolic links"</span>) |
| 780 | + .<span class="ident">overrides_with</span>(<span class="ident">options::PHYSICAL</span>), |
| 781 | + ) |
| 782 | + .<span class="ident">arg</span>( |
| 783 | + <span class="comment">// Not implemented yet</span> |
| 784 | + <span class="ident">Arg::new</span>(<span class="ident">options::PHYSICAL</span>) |
| 785 | + .<span class="ident">short</span>(<span class="string">'P'</span>) |
| 786 | + .<span class="ident">long</span>(<span class="ident">options::PHYSICAL</span>) |
| 787 | + .<span class="ident">help</span>(<span class="string">"make hard links directly to symbolic links"</span>), |
| 788 | + ) |
737 | 789 | .<span class="ident">arg</span>(
|
738 | 790 | <span class="ident">Arg::new</span>(<span class="ident">options::SYMBOLIC</span>)
|
739 | 791 | .<span class="ident">short</span>(<span class="string">'s'</span>)
|
740 |
| - .<span class="ident">long</span>(<span class="string">"symbolic"</span>) |
| 792 | + .<span class="ident">long</span>(<span class="ident">options::SYMBOLIC</span>) |
741 | 793 | .<span class="ident">help</span>(<span class="string">"make symbolic links instead of hard links"</span>)
|
742 | 794 | <span class="comment">// override added for https://github.com/uutils/coreutils/issues/2359</span>
|
743 | 795 | .<span class="ident">overrides_with</span>(<span class="ident">options::SYMBOLIC</span>),
|
|
963 | 1015 | <span class="kw">if</span> <span class="ident">settings</span>.<span class="ident">symbolic</span> {
|
964 | 1016 | <span class="ident">symlink</span>(<span class="kw-2">&</span><span class="ident">source</span>, <span class="ident">dst</span>)<span class="question-mark">?</span>;
|
965 | 1017 | } <span class="kw">else</span> {
|
966 |
| - <span class="ident">fs::hard_link</span>(<span class="kw-2">&</span><span class="ident">source</span>, <span class="ident">dst</span>)<span class="question-mark">?</span>; |
| 1018 | + <span class="kw">let</span> <span class="ident">p</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">settings</span>.<span class="ident">logical</span> <span class="op">&&</span> <span class="ident">is_symlink</span>(<span class="kw-2">&</span><span class="ident">source</span>) { |
| 1019 | + <span class="comment">// if we want to have an hard link,</span> |
| 1020 | + <span class="comment">// source is a symlink and -L is passed</span> |
| 1021 | + <span class="comment">// we want to resolve the symlink to create the hardlink</span> |
| 1022 | + <span class="ident">std::fs::canonicalize</span>(<span class="kw-2">&</span><span class="ident">source</span>)<span class="question-mark">?</span> |
| 1023 | + } <span class="kw">else</span> { |
| 1024 | + <span class="ident">source</span>.<span class="ident">to_path_buf</span>() |
| 1025 | + }; |
| 1026 | + <span class="ident">fs::hard_link</span>(<span class="kw-2">&</span><span class="ident">p</span>, <span class="ident">dst</span>)<span class="question-mark">?</span>; |
967 | 1027 | }
|
968 | 1028 |
|
969 | 1029 | <span class="kw">if</span> <span class="ident">settings</span>.<span class="ident">verbose</span> {
|
|
0 commit comments