|
457 | 457 | <span id="451">451</span>
|
458 | 458 | <span id="452">452</span>
|
459 | 459 | <span id="453">453</span>
|
| 460 | +<span id="454">454</span> |
| 461 | +<span id="455">455</span> |
| 462 | +<span id="456">456</span> |
| 463 | +<span id="457">457</span> |
| 464 | +<span id="458">458</span> |
| 465 | +<span id="459">459</span> |
| 466 | +<span id="460">460</span> |
| 467 | +<span id="461">461</span> |
| 468 | +<span id="462">462</span> |
| 469 | +<span id="463">463</span> |
| 470 | +<span id="464">464</span> |
| 471 | +<span id="465">465</span> |
| 472 | +<span id="466">466</span> |
| 473 | +<span id="467">467</span> |
| 474 | +<span id="468">468</span> |
| 475 | +<span id="469">469</span> |
| 476 | +<span id="470">470</span> |
| 477 | +<span id="471">471</span> |
| 478 | +<span id="472">472</span> |
| 479 | +<span id="473">473</span> |
| 480 | +<span id="474">474</span> |
| 481 | +<span id="475">475</span> |
| 482 | +<span id="476">476</span> |
| 483 | +<span id="477">477</span> |
| 484 | +<span id="478">478</span> |
| 485 | +<span id="479">479</span> |
| 486 | +<span id="480">480</span> |
| 487 | +<span id="481">481</span> |
| 488 | +<span id="482">482</span> |
| 489 | +<span id="483">483</span> |
| 490 | +<span id="484">484</span> |
460 | 491 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
461 | 492 | <span class="comment">// *</span>
|
462 | 493 | <span class="comment">// * (c) Alex Lyon <arcterus@mail.com></span>
|
|
473 | 504 | <span class="kw">use</span> <span class="ident">remove_dir_all::remove_dir_all</span>;
|
474 | 505 | <span class="kw">use</span> <span class="ident">std::collections::VecDeque</span>;
|
475 | 506 | <span class="kw">use</span> <span class="ident">std::fs</span>;
|
| 507 | +<span class="kw">use</span> <span class="ident">std::fs::File</span>; |
| 508 | +<span class="kw">use</span> <span class="ident">std::io::ErrorKind</span>; |
476 | 509 | <span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stderr</span>, <span class="ident">stdin</span>, <span class="ident">BufRead</span>, <span class="ident">Write</span>};
|
477 | 510 | <span class="kw">use</span> <span class="ident">std::ops::BitOr</span>;
|
478 | 511 | <span class="kw">use</span> <span class="ident">std::path</span>::{<span class="ident">Path</span>, <span class="ident">PathBuf</span>};
|
|
486 | 519 | <span class="ident">Never</span>,
|
487 | 520 | <span class="ident">Once</span>,
|
488 | 521 | <span class="ident">Always</span>,
|
| 522 | + <span class="ident">PromptProtected</span>, |
489 | 523 | }
|
490 | 524 |
|
491 | 525 | <span class="kw">struct</span> <span class="ident">Options</span> {
|
|
571 | 605 | }
|
572 | 606 | }
|
573 | 607 | } <span class="kw">else</span> {
|
574 |
| - <span class="ident">InteractiveMode::Never</span> |
| 608 | + <span class="ident">InteractiveMode::PromptProtected</span> |
575 | 609 | }
|
576 | 610 | },
|
577 | 611 | <span class="ident">one_fs</span>: <span class="ident">matches</span>.<span class="ident">contains_id</span>(<span class="ident">OPT_ONE_FILE_SYSTEM</span>),
|
|
843 | 877 | } <span class="kw">else</span> {
|
844 | 878 | <span class="bool-val">true</span>
|
845 | 879 | };
|
846 |
| - <span class="kw">if</span> <span class="ident">response</span> { |
| 880 | + <span class="kw">if</span> <span class="ident">response</span> <span class="op">&&</span> <span class="ident">prompt_write_protected</span>(<span class="ident">path</span>, <span class="bool-val">false</span>, <span class="ident">options</span>) { |
847 | 881 | <span class="kw">match</span> <span class="ident">fs::remove_file</span>(<span class="ident">path</span>) {
|
848 | 882 | <span class="prelude-val">Ok</span>(<span class="kw">_</span>) => {
|
849 | 883 | <span class="kw">if</span> <span class="ident">options</span>.<span class="ident">verbose</span> {
|
|
865 | 899 | <span class="bool-val">false</span>
|
866 | 900 | }
|
867 | 901 |
|
| 902 | +<span class="kw">fn</span> <span class="ident">prompt_write_protected</span>(<span class="ident">path</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">is_dir</span>: <span class="ident">bool</span>, <span class="ident">options</span>: <span class="kw-2">&</span><span class="ident">Options</span>) -> <span class="ident">bool</span> { |
| 903 | + <span class="kw">if</span> <span class="ident">options</span>.<span class="ident">interactive</span> <span class="op">==</span> <span class="ident">InteractiveMode::Never</span> { |
| 904 | + <span class="kw">return</span> <span class="bool-val">true</span>; |
| 905 | + } |
| 906 | + <span class="kw">match</span> <span class="ident">File::open</span>(<span class="ident">path</span>) { |
| 907 | + <span class="prelude-val">Ok</span>(<span class="kw">_</span>) => <span class="bool-val">true</span>, |
| 908 | + <span class="prelude-val">Err</span>(<span class="ident">err</span>) => { |
| 909 | + <span class="kw">if</span> <span class="ident">err</span>.<span class="ident">kind</span>() <span class="op">==</span> <span class="ident">ErrorKind::PermissionDenied</span> { |
| 910 | + <span class="kw">if</span> <span class="ident">is_dir</span> { |
| 911 | + <span class="ident">prompt</span>(<span class="kw-2">&</span>(<span class="macro">format!</span>(<span class="string">"rm: remove write-protected directory {}? "</span>, <span class="ident">path</span>.<span class="ident">quote</span>()))) |
| 912 | + } <span class="kw">else</span> { |
| 913 | + <span class="kw">if</span> <span class="ident">fs::metadata</span>(<span class="ident">path</span>).<span class="ident">unwrap</span>().<span class="ident">len</span>() <span class="op">==</span> <span class="number">0</span> { |
| 914 | + <span class="kw">return</span> <span class="ident">prompt</span>( |
| 915 | + <span class="kw-2">&</span>(<span class="macro">format!</span>( |
| 916 | + <span class="string">"rm: remove write-protected regular empty file {}? "</span>, |
| 917 | + <span class="ident">path</span>.<span class="ident">quote</span>() |
| 918 | + )), |
| 919 | + ); |
| 920 | + } |
| 921 | + <span class="ident">prompt</span>(<span class="kw-2">&</span>(<span class="macro">format!</span>(<span class="string">"rm: remove write-protected regular file {}? "</span>, <span class="ident">path</span>.<span class="ident">quote</span>()))) |
| 922 | + } |
| 923 | + } <span class="kw">else</span> { |
| 924 | + <span class="bool-val">true</span> |
| 925 | + } |
| 926 | + } |
| 927 | + } |
| 928 | +} |
| 929 | + |
868 | 930 | <span class="kw">fn</span> <span class="ident">prompt_file</span>(<span class="ident">path</span>: <span class="kw-2">&</span><span class="ident">Path</span>, <span class="ident">is_dir</span>: <span class="ident">bool</span>) -> <span class="ident">bool</span> {
|
869 | 931 | <span class="kw">if</span> <span class="ident">is_dir</span> {
|
870 | 932 | <span class="ident">prompt</span>(<span class="kw-2">&</span>(<span class="macro">format!</span>(<span class="string">"rm: remove directory {}? "</span>, <span class="ident">path</span>.<span class="ident">quote</span>())))
|
|
0 commit comments