|
808 | 808 | <span id="803">803</span>
|
809 | 809 | <span id="804">804</span>
|
810 | 810 | <span id="805">805</span>
|
| 811 | +<span id="806">806</span> |
| 812 | +<span id="807">807</span> |
| 813 | +<span id="808">808</span> |
| 814 | +<span id="809">809</span> |
| 815 | +<span id="810">810</span> |
| 816 | +<span id="811">811</span> |
| 817 | +<span id="812">812</span> |
| 818 | +<span id="813">813</span> |
| 819 | +<span id="814">814</span> |
| 820 | +<span id="815">815</span> |
| 821 | +<span id="816">816</span> |
| 822 | +<span id="817">817</span> |
| 823 | +<span id="818">818</span> |
| 824 | +<span id="819">819</span> |
| 825 | +<span id="820">820</span> |
| 826 | +<span id="821">821</span> |
| 827 | +<span id="822">822</span> |
| 828 | +<span id="823">823</span> |
| 829 | +<span id="824">824</span> |
| 830 | +<span id="825">825</span> |
| 831 | +<span id="826">826</span> |
| 832 | +<span id="827">827</span> |
| 833 | +<span id="828">828</span> |
| 834 | +<span id="829">829</span> |
| 835 | +<span id="830">830</span> |
| 836 | +<span id="831">831</span> |
| 837 | +<span id="832">832</span> |
| 838 | +<span id="833">833</span> |
| 839 | +<span id="834">834</span> |
| 840 | +<span id="835">835</span> |
| 841 | +<span id="836">836</span> |
| 842 | +<span id="837">837</span> |
811 | 843 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
812 | 844 | <span class="comment">// *</span>
|
813 | 845 | <span class="comment">// * (c) Ben Eills <ben@beneills.com></span>
|
|
1180 | 1212 | <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="ident">matches</span>)<span class="question-mark">?</span>;
|
1181 | 1213 | <span class="kw">let</span> <span class="ident">target_dir</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_TARGET_DIRECTORY</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">d</span><span class="op">|</span> <span class="ident">d</span>.<span class="ident">to_owned</span>());
|
1182 | 1214 |
|
| 1215 | + <span class="kw">let</span> <span class="ident">preserve_timestamps</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_PRESERVE_TIMESTAMPS</span>); |
| 1216 | + <span class="kw">let</span> <span class="ident">compare</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_COMPARE</span>); |
| 1217 | + <span class="kw">let</span> <span class="ident">strip</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_STRIP</span>); |
| 1218 | + <span class="kw">if</span> <span class="ident">preserve_timestamps</span> <span class="op">&&</span> <span class="ident">compare</span> { |
| 1219 | + <span class="macro">show_error!</span>(<span class="string">"Options --compare and --preserve-timestamps are mutually exclusive"</span>); |
| 1220 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">1</span>.<span class="ident">into</span>()); |
| 1221 | + } |
| 1222 | + <span class="kw">if</span> <span class="ident">compare</span> <span class="op">&&</span> <span class="ident">strip</span> { |
| 1223 | + <span class="macro">show_error!</span>(<span class="string">"Options --compare and --strip are mutually exclusive"</span>); |
| 1224 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="number">1</span>.<span class="ident">into</span>()); |
| 1225 | + } |
1183 | 1226 | <span class="prelude-val">Ok</span>(<span class="ident">Behavior</span> {
|
1184 | 1227 | <span class="ident">main_function</span>,
|
1185 | 1228 | <span class="ident">specified_mode</span>,
|
|
1188 | 1231 | <span class="ident">owner</span>: <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_OWNER</span>).<span class="ident">unwrap_or</span>(<span class="string">""</span>).<span class="ident">to_string</span>(),
|
1189 | 1232 | <span class="ident">group</span>: <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_GROUP</span>).<span class="ident">unwrap_or</span>(<span class="string">""</span>).<span class="ident">to_string</span>(),
|
1190 | 1233 | <span class="ident">verbose</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_VERBOSE</span>),
|
1191 |
| - <span class="ident">preserve_timestamps</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_PRESERVE_TIMESTAMPS</span>), |
1192 |
| - <span class="ident">compare</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_COMPARE</span>), |
1193 |
| - <span class="ident">strip</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_STRIP</span>), |
| 1234 | + <span class="ident">preserve_timestamps</span>, |
| 1235 | + <span class="ident">compare</span>, |
| 1236 | + <span class="ident">strip</span>, |
1194 | 1237 | <span class="ident">strip_program</span>: <span class="ident">String::from</span>(
|
1195 | 1238 | <span class="ident">matches</span>
|
1196 | 1239 | .<span class="ident">value_of</span>(<span class="ident">OPT_STRIP_PROGRAM</span>)
|
|
1281 | 1324 | <span class="kw">if</span> <span class="ident">sources</span>.<span class="ident">len</span>() <span class="op">></span> <span class="number">1</span> <span class="op">|</span><span class="op">|</span> (<span class="ident">target</span>.<span class="ident">exists</span>() <span class="op">&&</span> <span class="ident">target</span>.<span class="ident">is_dir</span>()) {
|
1282 | 1325 | <span class="ident">copy_files_into_dir</span>(<span class="ident">sources</span>, <span class="kw-2">&</span><span class="ident">target</span>, <span class="ident">b</span>)
|
1283 | 1326 | } <span class="kw">else</span> {
|
1284 |
| - <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">parent</span>) <span class="op">=</span> <span class="ident">target</span>.<span class="ident">parent</span>() { |
1285 |
| - <span class="kw">if</span> <span class="op">!</span><span class="ident">parent</span>.<span class="ident">exists</span>() <span class="op">&&</span> <span class="ident">b</span>.<span class="ident">create_leading</span> { |
| 1327 | + <span class="comment">// if -t is used in combination with -D, create whole target because it does not include filename</span> |
| 1328 | + <span class="kw">let</span> <span class="ident">to_create</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">Path</span><span class="op">></span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">b</span>.<span class="ident">target_dir</span>.<span class="ident">is_some</span>() <span class="op">&&</span> <span class="ident">b</span>.<span class="ident">create_leading</span> { |
| 1329 | + <span class="prelude-val">Some</span>(<span class="ident">target</span>.<span class="ident">as_path</span>()) |
| 1330 | + } <span class="kw">else</span> { |
| 1331 | + <span class="ident">target</span>.<span class="ident">parent</span>() |
| 1332 | + }; |
| 1333 | + |
| 1334 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">to_create</span>) <span class="op">=</span> <span class="ident">to_create</span> { |
| 1335 | + <span class="kw">if</span> <span class="op">!</span><span class="ident">to_create</span>.<span class="ident">exists</span>() <span class="op">&&</span> <span class="ident">b</span>.<span class="ident">create_leading</span> { |
1286 | 1336 | <span class="kw">if</span> <span class="ident">b</span>.<span class="ident">verbose</span> {
|
1287 | 1337 | <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">PathBuf::new</span>();
|
1288 |
| - <span class="comment">// When creating directories with -Dv, show directory creations step</span> |
1289 |
| - <span class="comment">// by step</span> |
1290 |
| - <span class="kw">for</span> <span class="ident">part</span> <span class="kw">in</span> <span class="ident">parent</span>.<span class="ident">components</span>() { |
| 1338 | + <span class="comment">// When creating directories with -Dv, show directory creations step by step</span> |
| 1339 | + <span class="kw">for</span> <span class="ident">part</span> <span class="kw">in</span> <span class="ident">to_create</span>.<span class="ident">components</span>() { |
1291 | 1340 | <span class="ident">result</span>.<span class="ident">push</span>(<span class="ident">part</span>.<span class="ident">as_os_str</span>());
|
1292 | 1341 | <span class="kw">if</span> <span class="op">!</span><span class="ident">Path::new</span>(<span class="ident">part</span>.<span class="ident">as_os_str</span>()).<span class="ident">is_dir</span>() {
|
1293 | 1342 | <span class="comment">// Don't display when the directory already exists</span>
|
|
1296 | 1345 | }
|
1297 | 1346 | }
|
1298 | 1347 |
|
1299 |
| - <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span> <span class="ident">fs::create_dir_all</span>(<span class="ident">parent</span>) { |
1300 |
| - <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">InstallError::CreateDirFailed</span>(<span class="ident">parent</span>.<span class="ident">to_path_buf</span>(), <span class="ident">e</span>).<span class="ident">into</span>()); |
| 1348 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span> <span class="ident">fs::create_dir_all</span>(<span class="ident">to_create</span>) { |
| 1349 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">InstallError::CreateDirFailed</span>(<span class="ident">to_create</span>.<span class="ident">to_path_buf</span>(), <span class="ident">e</span>).<span class="ident">into</span>()); |
1301 | 1350 | }
|
1302 | 1351 |
|
1303 | 1352 | <span class="comment">// Silent the warning as we want to the error message</span>
|
1304 | 1353 | <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::question_mark</span>)]</span>
|
1305 |
| - <span class="kw">if</span> <span class="ident">mode::chmod</span>(<span class="ident">parent</span>, <span class="ident">b</span>.<span class="ident">mode</span>()).<span class="ident">is_err</span>() { |
1306 |
| - <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">InstallError::ChmodFailed</span>(<span class="ident">parent</span>.<span class="ident">to_path_buf</span>()).<span class="ident">into</span>()); |
| 1354 | + <span class="kw">if</span> <span class="ident">mode::chmod</span>(<span class="ident">to_create</span>, <span class="ident">b</span>.<span class="ident">mode</span>()).<span class="ident">is_err</span>() { |
| 1355 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">InstallError::ChmodFailed</span>(<span class="ident">to_create</span>.<span class="ident">to_path_buf</span>()).<span class="ident">into</span>()); |
1307 | 1356 | }
|
1308 | 1357 | }
|
1309 | 1358 | }
|
1310 | 1359 |
|
1311 |
| - <span class="kw">if</span> <span class="ident">target</span>.<span class="ident">is_file</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">is_new_file_path</span>(<span class="kw-2">&</span><span class="ident">target</span>) { |
1312 |
| - <span class="ident">copy</span>( |
1313 |
| - <span class="ident">sources</span>.<span class="ident">get</span>(<span class="number">0</span>).<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> { |
1314 |
| - <span class="ident">UUsageError::new</span>( |
1315 |
| - <span class="number">1</span>, |
1316 |
| - <span class="macro">format!</span>( |
1317 |
| - <span class="string">"missing destination file operand after '{}'"</span>, |
1318 |
| - <span class="ident">target</span>.<span class="ident">to_str</span>().<span class="ident">unwrap</span>() |
1319 |
| - ), |
1320 |
| - ) |
1321 |
| - })<span class="question-mark">?</span>, |
1322 |
| - <span class="kw-2">&</span><span class="ident">target</span>, |
1323 |
| - <span class="ident">b</span>, |
| 1360 | + <span class="kw">let</span> <span class="ident">source</span> <span class="op">=</span> <span class="ident">sources</span>.<span class="ident">first</span>().<span class="ident">ok_or_else</span>(<span class="op">|</span><span class="op">|</span> { |
| 1361 | + <span class="ident">UUsageError::new</span>( |
| 1362 | + <span class="number">1</span>, |
| 1363 | + <span class="macro">format!</span>( |
| 1364 | + <span class="string">"missing destination file operand after '{}'"</span>, |
| 1365 | + <span class="ident">target</span>.<span class="ident">to_str</span>().<span class="ident">unwrap</span>() |
| 1366 | + ), |
1324 | 1367 | )
|
| 1368 | + })<span class="question-mark">?</span>; |
| 1369 | + |
| 1370 | + <span class="comment">// If the -D flag was passed (target does not include filename),</span> |
| 1371 | + <span class="comment">// we need to add the source name to the target_dir</span> |
| 1372 | + <span class="comment">// because `copy` expects `to` to be a file, not a directory</span> |
| 1373 | + <span class="kw">let</span> <span class="ident">target</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">target</span>.<span class="ident">is_dir</span>() <span class="op">&&</span> <span class="ident">b</span>.<span class="ident">create_leading</span> { |
| 1374 | + <span class="ident">target</span>.<span class="ident">join</span>(<span class="ident">source</span>) |
| 1375 | + } <span class="kw">else</span> { |
| 1376 | + <span class="ident">target</span> <span class="comment">// already includes dest filename</span> |
| 1377 | + }; |
| 1378 | + |
| 1379 | + <span class="kw">if</span> <span class="ident">target</span>.<span class="ident">is_file</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">is_new_file_path</span>(<span class="kw-2">&</span><span class="ident">target</span>) { |
| 1380 | + <span class="ident">copy</span>(<span class="ident">source</span>, <span class="kw-2">&</span><span class="ident">target</span>, <span class="ident">b</span>) |
1325 | 1381 | } <span class="kw">else</span> {
|
1326 | 1382 | <span class="prelude-val">Err</span>(<span class="ident">InstallError::InvalidTarget</span>(<span class="ident">target</span>).<span class="ident">into</span>())
|
1327 | 1383 | }
|
|
1395 | 1451 | <span class="comment">// The codes actually making use of the backup process don't seem to agree</span>
|
1396 | 1452 | <span class="comment">// on how best to approach the issue. (mv and ln, for example)</span>
|
1397 | 1453 | <span class="kw">if</span> <span class="ident">to</span>.<span class="ident">exists</span>() {
|
| 1454 | + <span class="kw">if</span> <span class="ident">b</span>.<span class="ident">verbose</span> { |
| 1455 | + <span class="macro">println!</span>(<span class="string">"removed {}"</span>, <span class="ident">to</span>.<span class="ident">quote</span>()); |
| 1456 | + } |
1398 | 1457 | <span class="ident">backup_path</span> <span class="op">=</span> <span class="ident">backup_control::get_backup_path</span>(<span class="ident">b</span>.<span class="ident">backup_mode</span>, <span class="ident">to</span>, <span class="kw-2">&</span><span class="ident">b</span>.<span class="ident">suffix</span>);
|
1399 | 1458 | <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">backup_path</span>) <span class="op">=</span> <span class="ident">backup_path</span> {
|
1400 | 1459 | <span class="comment">// TODO!!</span>
|
|
1564 | 1623 |
|
1565 | 1624 | <span class="comment">// setuid || setgid || sticky</span>
|
1566 | 1625 | <span class="kw">let</span> <span class="ident">extra_mode</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0o7000</span>;
|
| 1626 | + <span class="comment">// setuid || setgid || sticky || permissions</span> |
| 1627 | + <span class="kw">let</span> <span class="ident">all_modes</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0o7777</span>; |
1567 | 1628 |
|
1568 | 1629 | <span class="kw">if</span> <span class="ident">b</span>.<span class="ident">specified_mode</span>.<span class="ident">unwrap_or</span>(<span class="number">0</span>) <span class="op">&</span> <span class="ident">extra_mode</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span>
|
1569 | 1630 | <span class="op">|</span><span class="op">|</span> <span class="ident">from_meta</span>.<span class="ident">mode</span>() <span class="op">&</span> <span class="ident">extra_mode</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span>
|
1570 | 1631 | <span class="op">|</span><span class="op">|</span> <span class="ident">to_meta</span>.<span class="ident">mode</span>() <span class="op">&</span> <span class="ident">extra_mode</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span>
|
1571 | 1632 | {
|
1572 | 1633 | <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="bool-val">true</span>);
|
1573 | 1634 | }
|
| 1635 | + <span class="kw">if</span> <span class="ident">b</span>.<span class="ident">mode</span>() <span class="op">!</span><span class="op">=</span> <span class="ident">to_meta</span>.<span class="ident">mode</span>() <span class="op">&</span> <span class="ident">all_modes</span> { |
| 1636 | + <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="bool-val">true</span>); |
| 1637 | + } |
1574 | 1638 |
|
1575 | 1639 | <span class="kw">if</span> <span class="op">!</span><span class="ident">from_meta</span>.<span class="ident">is_file</span>() <span class="op">|</span><span class="op">|</span> <span class="op">!</span><span class="ident">to_meta</span>.<span class="ident">is_file</span>() {
|
1576 | 1640 | <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="bool-val">true</span>);
|
|
0 commit comments