1.\" Copyright (c) 2010-2013 Hudson River Trading LLC 2.\" Written by: John H. Baldwin <jhb@FreeBSD.org> 3.\" All rights reserved. 4.\" 5.\" Redistribution and use in source and binary forms, with or without 6.\" modification, are permitted provided that the following conditions 7.\" are met: 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24.\" SUCH DAMAGE. 25.\" 26.Dd May 27, 2026 27.Dt ETCUPDATE 8 28.Os 29.Sh NAME 30.Nm etcupdate 31.Nd "manage updates to system files not updated by installworld" 32.Sh SYNOPSIS 33.Nm 34.Op Fl npFN 35.Op Fl B | Fl b 36.Op Fl d Ar workdir 37.Op Fl r | Fl s Ar source | Fl t Ar tarball 38.Op Fl A Ar patterns 39.Op Fl D Ar destdir 40.Op Fl I Ar patterns 41.Op Fl L Ar logfile 42.Op Fl M Ar options 43.Op Fl m Ar make 44.Nm 45.Cm build 46.Op Fl N 47.Op Fl B | Fl b 48.Op Fl d Ar workdir 49.Op Fl s Ar source 50.Op Fl L Ar logfile 51.Op Fl M Ar options 52.Op Fl m Ar make 53.Ar tarball 54.Nm 55.Cm diff 56.Op Fl l 57.Op Fl d Ar workdir 58.Op Fl D Ar destdir 59.Op Fl I Ar patterns 60.Op Fl L Ar logfile 61.Nm 62.Cm extract 63.Op Fl N 64.Op Fl B | Fl b 65.Op Fl d Ar workdir 66.Op Fl s Ar source | Fl t Ar tarball 67.Op Fl D Ar destdir 68.Op Fl L Ar logfile 69.Op Fl M Ar options 70.Op Fl m Ar make 71.Nm 72.Cm resolve 73.Op Fl p 74.Op Fl d Ar workdir 75.Op Fl D Ar destdir 76.Op Fl L Ar logfile 77.Nm 78.Cm revert 79.Op Fl d Ar workdir 80.Op Fl D Ar destdir 81.Op Fl L Ar logfile 82.Ar 83.Nm 84.Cm status 85.Op Fl d Ar workdir 86.Op Fl D Ar destdir 87.Sh DESCRIPTION 88The 89.Nm 90utility is a tool for managing updates to files that are not updated as 91part of 92.Sq make installworld 93such as files in 94.Pa /etc . 95It manages updates by doing a three-way merge of changes made to these 96files against the local versions. 97It is also designed to minimize the amount of user intervention with 98the goal of simplifying upgrades for clusters of machines. 99.Pp 100To perform a three-way merge, 101.Nm 102keeps copies of the current and previous versions of files that it manages. 103These copies are stored in two trees known as the 104.Dq current 105and 106.Dq previous 107trees. 108During a merge, 109.Nm 110compares the 111.Dq current 112and 113.Dq previous 114copies of each file to determine which changes need to be merged into the 115local version of each file. 116If a file can be updated without generating a conflict, 117.Nm 118will update the file automatically. 119If the local changes to a file conflict with the changes made to a file in 120the source tree, 121then a merge conflict is generated. 122The conflict must be resolved after the merge has finished. 123The 124.Nm 125utility will not perform a new merge until all conflicts from an earlier 126merge are resolved. 127.Sh MODES 128The 129.Nm 130utility supports several modes of operation. 131The mode is specified via an optional command argument. 132If present, the command must be the first argument on the command line. 133If a command is not specified, the default mode is used. 134.Ss Default Mode 135The default mode merges changes from the source tree to the destination 136directory. 137First, 138it updates the 139.Dq current 140and 141.Dq previous 142trees. 143Next, 144it compares the two trees merging changes into the destination directory. 145Finally, 146it displays warnings for any conditions it could not handle automatically. 147.Pp 148If the 149.Fl r 150option is not specified, 151then the first step taken is to update the 152.Dq current 153and 154.Dq previous 155trees. 156If a 157.Dq current 158tree already exists, 159then that tree is saved as the 160.Dq previous 161tree. 162An older 163.Dq previous 164tree is removed if it exists. 165By default the new 166.Dq current 167tree is built from a source tree. 168However, 169if a tarball is specified via the 170.Fl t 171option, 172then the tree is extracted from that tarball instead. 173.Pp 174Next, 175.Nm 176compares the files in the 177.Dq current 178and 179.Dq previous 180trees. 181If a file was removed from the 182.Dq current 183tree, 184then it will be removed from the destination directory only if it 185does not have any local modifications. 186If a file was added to the 187.Dq current 188tree, 189then it will be copied to the destination directory only if it 190would not clobber an existing file. 191If a file is changed in the 192.Dq current 193tree, 194then 195.Nm 196will attempt to merge the changes into the version of the file in the 197destination directory. 198If the merge encounters conflicts, 199then a version of the file with conflict markers will be saved for 200future resolution. 201If the merge does not encounter conflicts, 202then the merged version of the file will be saved in the destination 203directory. 204If 205.Nm 206is not able to safely merge in changes to a file other than a merge conflict, 207it will generate a warning. 208.Pp 209For each file that is updated a line will be output with a leading character 210to indicate the action taken. 211The possible actions follow: 212.Pp 213.Bl -tag -width "A" -compact -offset indent 214.It A 215Added 216.It C 217Conflict 218.It D 219Deleted 220.It M 221Merged 222.It U 223Updated 224.El 225.Pp 226Finally, 227if any warnings were encountered they are displayed after the merge has 228completed. 229.Pp 230Note that for certain files 231.Nm 232will perform post-install actions any time that the file is updated. 233Specifically, 234.Xr pwd_mkdb 8 235is invoked if 236.Pa /etc/master.passwd 237is changed, 238.Xr cap_mkdb 1 239is invoked to update 240.Pa /etc/login.conf.db 241if 242.Pa /etc/login.conf 243is changed, 244.Xr newaliases 1 245is invoked if 246.Pa /etc/mail/aliases 247is changed, 248.Xr services_mkdb 8 249is invoked if 250.Pa /etc/services 251is changed, 252.Xr tzsetup 8 253is invoked if 254.Pa /etc/localtime 255is changed and if 256.Fa /var/db/zoneinfo 257exists, 258and 259.Pa /etc/rc.d/motd 260is invoked if 261.Pa /etc/motd 262is changed. 263One exception is that if 264.Pa /etc/mail/aliases 265is changed and the destination directory is not the default, 266then a warning will be issued instead. 267This is due to a limitation of the 268.Xr newaliases 1 269command. 270Similarly, 271if 272.Pa /etc/motd 273is changed and the destination directory is not the default, 274then 275.Pa /etc/rc.d/motd 276will not be executed due to a limitation of that script. 277In this case no warning is issued as the result of 278.Pa /etc/rc.d/motd 279is merely cosmetic and will be corrected on the next reboot. 280.Ss Build Mode 281The 282.Cm build 283mode is used to build a tarball that contains a snapshot of a 284.Dq current 285tree. 286This tarball can be used by the default and extract modes. 287Using a tarball can allow 288.Nm 289to perform a merge without requiring a source tree that matches the 290currently installed world. 291The 292.Fa tarball 293argument specifies the name of the file to create. 294The file will be a 295.Xr tar 5 296file compressed with 297.Xr bzip2 1 . 298.Ss Diff Mode 299The 300.Cm diff 301mode compares the versions of files in the destination directory to the 302.Dq current 303tree and generates a unified format diff of the changes. 304This can be used to determine which files have been locally modified and how. 305Note that 306.Nm 307does not manage files that are not maintained in the source tree such as 308.Pa /etc/fstab 309and 310.Pa /etc/rc.conf . 311.Ss Extract Mode 312The 313.Cm extract 314mode generates a new 315.Dq current 316tree. 317Unlike the default mode, 318it does not save any existing 319.Dq current 320tree and does not modify any existing 321.Dq previous 322tree. 323The new 324.Dq current 325tree can either be built from a source tree or extracted from a tarball. 326.Ss Resolve Mode 327The 328.Cm resolve 329mode is used to resolve any conflicts encountered during a merge. 330In this mode, 331.Nm 332iterates over any existing conflicts prompting the user for actions to take 333on each conflicted file. 334For each file, the following actions are available: 335.Pp 336.Bl -tag -width "(tf) theirs-full" -compact 337.It (p) postpone 338Ignore this conflict for now. 339.It (df) diff-full 340Show all changes made to the merged file as a unified diff. 341.It (e) edit 342Change the merged file in an editor. 343.It (r) resolved 344Install the merged version of the file into the destination directory. 345.It (mf) mine-full 346Use the version of the file in the destination directory and ignore any 347changes made to the file in the 348.Dq current 349tree. 350.It (tf) theirs-full 351Use the version of the file from the 352.Dq current 353tree and discard any local changes made to the file. 354.It (h) help 355Display the list of commands. 356.El 357.Ss Revert Mode 358The 359.Cm revert 360mode is used to restore the stock versions of files. 361In this mode, 362.Nm 363installs the stock version of requested files. 364This mode cannot be used to restore directories, only individual files. 365.Ss Status Mode 366The 367.Cm status 368mode shows a summary of the results of the most recent merge. 369First it lists any files for which there are unresolved conflicts. 370Next it lists any warnings generated during the last merge. 371If the last merge did not generate any conflicts or warnings, 372then nothing will be output. 373.Sh OPTIONS 374The following options are available. 375Note that most options do not apply to all modes. 376.Bl -tag -width ".Fl A Ar patterns" 377.It Fl A Ar patterns 378Always install the new version of any files that match any of the patterns 379listed in 380.Ar patterns . 381Each pattern is evaluated as an 382.Xr sh 1 383shell pattern. 384This option may be specified multiple times to specify multiple patterns. 385Multiple space-separated patterns may also be specified in a single 386option. 387Note that ignored files specified via the 388.Ev IGNORE_FILES 389variable or the 390.Fl I 391option will not be installed. 392.It Fl B 393Do not build generated files in a private object tree. 394Instead, reuse the generated files from a previously built object tree 395that matches the source tree. 396This is the default. 397.It Fl b 398Build generated files in a private object tree before trying to 399compare anything. 400This is necessary in the uncommon case where 401.Nm 402is not run after a 403.Cm buildworld . 404.It Fl D Ar destdir 405Specify an alternate destination directory as the target of a merge. 406This is analogous to the 407.Dv DESTDIR 408variable used with 409.Sq make installworld . 410The default destination directory is an empty string which results in 411merges updating 412.Pa /etc 413on the local machine. 414.It Fl d Ar workdir 415Specify an alternate directory to use as the work directory. 416The work directory is used to store the 417.Dq current 418and 419.Dq previous 420trees as well as unresolved conflicts. 421The default work directory is 422.Pa <destdir>/var/db/etcupdate . 423.It Fl F 424Ignore changes in the FreeBSD ID string when comparing files in the 425destination directory to files in either of the 426.Dq current 427or 428.Dq previous 429trees. 430In 431.Cm diff 432mode, 433this reduces noise due to FreeBSD ID string changes in the output. 434During an update this can simplify handling for harmless conflicts caused 435by FreeBSD ID string changes. 436.Pp 437Specifically, 438if a file in the destination directory is identical to the same file in the 439.Dq previous 440tree modulo the FreeBSD ID string, 441then the file is treated as if it was unmodified and the 442.Dq current 443version of the file will be installed. 444Similarly, 445if a file in the destination directory is identical to the same file in the 446.Dq current 447tree modulo the FreeBSD ID string, 448then the 449.Dq current 450version of the file will be installed to update the ID string. 451If the 452.Dq previous 453and 454.Dq current 455versions of the file are identical, 456then 457.Nm 458will not change the file in the destination directory. 459.Pp 460Due to limitations in the 461.Xr diff 1 462command, 463this option may not have an effect if there are other changes in a file that 464are close to the FreeBSD ID string. 465.It Fl I Ar patterns 466Ignore any files that match any of the patterns listed in 467.Ar patterns . 468No warnings or other messages will be generated for those files during a 469merge. 470Each pattern is evaluated as an 471.Xr sh 1 472shell pattern. 473This option may be specified multiple times to specify multiple patterns. 474Multiple space-separated patterns may also be specified in a single 475option. 476.It Fl l 477In 478.Cm diff 479mode list files that are changed locally, omit printing content difference. 480.It Fl L Ar logfile 481Specify an alternate path for the log file. 482The 483.Nm 484utility logs each command that it invokes along with the standard output 485and standard error to this file. 486By default the log file is stored in a file named 487.Pa log 488in the work directory. 489.It Fl M Ar options 490Pass 491.Ar options 492as additional parameters to 493.Xr make 1 494when building a 495.Dq current 496tree. 497This can be used to set the 498.Dv TARGET 499or 500.Dv TARGET_ARCH 501variables for a cross-build. 502.It Fl m Ar make 503Use 504.Ar make 505as the 506.Xr make 1 507binary when building a 508.Dq current 509tree. 510.It Fl n 511Enable 512.Dq dry-run 513mode. 514Do not merge any changes to the destination directory. 515Instead, 516report what actions would be taken during a merge. 517Note that the existing 518.Dq current 519and 520.Dq previous 521trees will not be changed. 522If the 523.Fl r 524option is not specified, 525then a temporary 526.Dq current 527tree will be extracted to perform the comparison. 528.It Fl N 529Perform a 530.Dv NO_ROOT 531build when building a 532.Dq current 533tree. 534The resulting tree will include a corresponding 535.Pa METALOG 536file at its root. 537.It Fl p 538Enable 539.Dq pre-world 540mode. 541Only merge changes to files that are necessary to successfully run 542.Sq make installworld 543or 544.Sq make installkernel . 545When this flag is enabled, 546the existing 547.Dq current 548and 549.Dq previous 550trees are left alone. 551Instead, 552a temporary tree is populated with the necessary files. 553This temporary tree is compared against the 554.Dq current 555tree. 556This allows a normal update to be run after 557.Sq make installworld 558has completed. 559Any conflicts generated during a 560.Dq pre-world 561update should be resolved by a 562.Dq pre-world 563.Cm resolve . 564.It Fl r 565Do not update the 566.Dq current 567and 568.Dq previous 569trees during a merge. 570This can be used to 571.Dq re-run 572a previous merge operation. 573.It Fl s Ar source 574Specify an alternate source tree to use when building or extracting a 575.Dq current 576tree. 577The default source tree is 578.Pa /usr/src . 579.It Fl t Ar tarball 580Extract a new 581.Dq current 582tree from a tarball previously generated by the 583.Cm build 584command rather than building the tree from a source tree. 585.El 586.Sh CONFIG FILE 587The 588.Nm 589utility can also be configured by setting variables in an optional 590configuration file named 591.Pa /etc/etcupdate.conf . 592Note that command line options override settings in the configuration file. 593The configuration file is executed by 594.Xr sh 1 , 595so it uses that syntax to set configuration variables. 596The following variables can be set: 597.Bl -tag -width ".Ev ALWAYS_INSTALL" 598.It Ev ALWAYS_INSTALL 599Always install files that match any of the patterns listed in this variable 600similar to the 601.Fl A 602option. 603.It Ev DESTDIR 604Specify an alternate destination directory similar to the 605.Fl D 606option. 607.It Ev EDITOR 608Specify a program to edit merge conflicts. 609.It Ev FREEBSD_ID 610Ignore changes in the FreeBSD ID string similar to the 611.Fl F 612option. 613This is enabled by setting the variable to a non-empty value. 614.It Ev IGNORE_FILES 615Ignore files that match any of the patterns listed in this variable 616similar to the 617.Fl I 618option. 619.It Ev LOGFILE 620Specify an alternate path for the log file similar to the 621.Fl L 622option. 623.It Ev MAKE_CMD 624Specify the 625.Xr make 1 626binary when building a 627.Dq current 628tree similar to the 629.Fl m 630option. 631.It Ev MAKE_OPTIONS 632Pass additional options to 633.Xr make 1 634when building a 635.Dq current 636tree similar to the 637.Fl M 638option. 639.It Ev SRCDIR 640Specify an alternate source tree similar to the 641.Fl s 642option. 643.It Ev WORKDIR 644Specify an alternate work directory similar to the 645.Fl d 646option. 647.El 648.Sh ENVIRONMENT 649The 650.Nm 651utility uses the program identified in the 652.Ev EDITOR 653environment variable to edit merge conflicts. 654If 655.Ev EDITOR 656is not set, 657.Xr vi 1 658is used as the default editor. 659.Sh FILES 660.Bl -tag -width ".Pa /var/db/etcupdate/log" -compact 661.It Pa /etc/etcupdate.conf 662Optional config file. 663.It Pa /var/db/etcupdate 664Default work directory used to store trees and other data. 665.It Pa /var/db/etcupdate/log 666Default log file. 667.El 668.Sh EXIT STATUS 669.Ex -std 670.Sh EXAMPLES 671To compare the files in 672.Pa /etc 673with the stock versions: 674.Pp 675.Dl "etcupdate diff" 676.Pp 677To merge changes after an upgrade via the buildworld and installworld process: 678.Pp 679.Dl "etcupdate" 680.Pp 681To resolve any conflicts generated during a merge: 682.Pp 683.Dl "etcupdate resolve" 684.Ss Bootstrapping 685The 686.Nm 687utility may need to be bootstrapped before it can be used. 688The 689.Cm diff 690command will fail with an error about a missing reference tree if 691bootstrapping is needed. 692.Pp 693Bootstrapping 694.Nm 695requires a source tree that matches the currently installed world. 696The easiest way to ensure this is to bootstrap 697.Nm 698before updating the source tree to start the next world upgrade cycle. 699First, 700generate a reference tree: 701.Pp 702.Dl "etcupdate extract" 703.Pp 704Second, 705use the 706.Cm diff 707command to compare the reference tree to your current files in 708.Pa /etc . 709Undesired differences should be removed using an editor, 710.Xr patch 1 , 711or by copying files from the reference tree 712.Po 713located at 714.Pa /var/db/etcupdate/current 715by default 716.Pc 717. 718.Pp 719If the tree at 720.Pa /usr/src 721is already newer than the currently installed world, 722a new tree matching the currently installed world can be checked out to 723a temporary location. 724The reference tree for 725.Nm 726can then be generated via: 727.Pp 728.Dl "etcupdate extract -s /path/to/tree" 729.Pp 730The 731.Cm diff 732command can be used as above to remove undesired differences. 733Afterwards, 734the changes in the tree at 735.Pa /usr/src 736can be merged via a regular merge. 737.Sh DIAGNOSTICS 738The following warning messages may be generated during a merge. 739Note that several of these warnings cover obscure cases that should occur 740rarely if at all in practice. 741For example, 742if a file changes from a file to a directory in the 743.Dq current 744tree 745and the file was modified in the destination directory, 746then a warning will be triggered. 747In general, 748when a warning references a pathname, 749the corresponding file in the destination directory is not changed by a 750merge operation. 751.Bl -diag 752.It "Directory mismatch: <path> (<type>)" 753An attempt was made to create a directory at 754.Pa path 755but an existing file of type 756.Dq type 757already exists for that path name. 758.It "Modified link changed: <file> (<old> became <new>)" 759The target of a symbolic link named 760.Pa file 761was changed from 762.Dq old 763to 764.Dq new 765in the 766.Dq current 767tree. 768The symbolic link has been modified to point to a target that is neither 769.Dq old 770nor 771.Dq new 772in the destination directory. 773.It "Modified mismatch: <file> (<new> vs <dest>)" 774A file named 775.Pa file 776of type 777.Dq new 778was modified in the 779.Dq current 780tree, 781but the file exists as a different type 782.Dq dest 783in the destination directory. 784.It "Modified <type> changed: <file> (<old> became <new>)" 785A file named 786.Pa file 787changed type from 788.Dq old 789in the 790.Dq previous 791tree to type 792.Dq new 793in the 794.Dq current 795tree. 796The file in the destination directory of type 797.Dq type 798has been modified, 799so it could not be merged automatically. 800.It "Modified <type> remains: <file>" 801The file of type 802.Dq type 803named 804.Pa file 805has been removed from the 806.Dq current 807tree, 808but it has been locally modified. 809The modified version of the file remains in the destination directory. 810.It "Needs update: /etc/localtime (required manual update via tzsetup(8))" 811The 812.Fa /var/db/zoneinfo 813file does not exist, 814so 815.Nm 816was not able to refresh 817.Fa /etc/localtime 818from its source file in 819.Fa /usr/share/zoneinfo . 820Running 821.Xr tzsetup 8 822will both refresh 823.Fa /etc/localtime 824and generate 825.Fa /var/db/zoneinfo 826permitting future updates to refresh 827.Fa /etc/localtime 828automatically. 829.It "Needs update: /etc/mail/aliases.db (required manual update via newaliases(1))" 830The file 831.Pa /etc/mail/aliases 832was updated during a merge with a non-empty destination directory. 833Due to a limitation of the 834.Xr newaliases 1 835command, 836.Nm 837was not able to automatically update the corresponding aliases database. 838.It "New file mismatch: <file> (<new> vs <dest>)" 839A new file named 840.Pa file 841of type 842.Dq new 843has been added to the 844.Dq current 845tree. 846A file of that name already exists in the destination directory, 847but it is of a different type 848.Dq dest . 849.It "New link conflict: <file> (<new> vs <dest>)" 850A symbolic link named 851.Pa file 852has been added to the 853.Dq current 854tree that links to 855.Dq new . 856A symbolic link of the same name already exists in the destination 857directory, 858but it links to a different target 859.Dq dest . 860.It "Non-empty directory remains: <file>" 861The directory 862.Pa file 863was removed from the 864.Dq current 865tree, 866but it contains additional files in the destination directory. 867These additional files as well as the directory remain. 868.It "Remove mismatch: <file> (<old> became <new>)" 869A file named 870.Pa file 871changed from type 872.Dq old 873in the 874.Dq previous 875tree to type 876.Dq new 877in the 878.Dq current 879tree, 880but it has been removed in the destination directory. 881.It "Removed file changed: <file>" 882A file named 883.Pa file 884was modified in the 885.Dq current 886tree, 887but it has been removed in the destination directory. 888.It "Removed link changed: <file> (<old> became <new>)" 889The target of a symbolic link named 890.Pa file 891was changed from 892.Dq old 893to 894.Dq new 895in the 896.Dq current 897tree, 898but it has been removed in the destination directory. 899.El 900.Sh SEE ALSO 901.Xr cap_mkdb 1 , 902.Xr diff 1 , 903.Xr make 1 , 904.Xr newaliases 1 , 905.Xr sh 1 , 906.Xr pwd_mkdb 8 , 907.Xr services_mkdb 8 , 908.Xr tzsetup 8 909.Sh HISTORY 910The 911.Nm 912utility first appeared in 913.Fx 10.0 . 914.Sh AUTHORS 915The 916.Nm 917utility was written by 918.An John Baldwin Aq Mt jhb@FreeBSD.org . 919.Sh BUGS 920Rerunning a merge does not automatically delete conflicts left over from a 921previous merge. 922Any conflicts must be resolved before the merge can be rerun. 923It is not clear if this is a feature or a bug. 924.Pp 925There is no way to easily automate conflict resolution for specific files. 926For example, one can imagine a syntax along the lines of 927.Pp 928.Dl "etcupdate resolve tf /some/file" 929.Pp 930to resolve a specific conflict in an automated fashion. 931.Pp 932Bootstrapping 933.Nm 934often results in gratuitous diffs in 935.Pa /etc/mail/*.cf 936that cause conflicts in the first merge. 937If an object tree that matches the source tree is present when bootstrapping, 938then passing the 939.Fl B 940flag to the 941.Cm extract 942command can work around this. 943