monotone-commits-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-commits-diffs] net.venge.monotone: 76c1b2d9bf6e58326e66f63395d


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone: 76c1b2d9bf6e58326e66f63395db2cc0a8f36076
Date: Sun, 9 Dec 2012 20:02:37 +0100 (CET)

revision:            76c1b2d9bf6e58326e66f63395db2cc0a8f36076
date:                2012-12-09T19:01:10
author:              Richard Hopkins <address@hidden>
branch:              net.venge.monotone
changelog:
merge of '35bcf1126213a624a161f48a38a55642ac807bca'
     and 'd2c56ab00604e0e40d76125b8b320211e62c1822'

manifest:
format_version "1"

new_manifest [f7148c06725422972115ce09792aadbd542e627e]

old_revision [35bcf1126213a624a161f48a38a55642ac807bca]

patch "src/std_hooks.lua"
 from [5b089162751bf675605aa10655c77dcd7af99b93]
   to [a2ec9556e5a0d3b3cc47633b14ad226b5c829925]

old_revision [d2c56ab00604e0e40d76125b8b320211e62c1822]

delete "test/func/(imp)_merge((patch_foo_a),_(delete_foo_))"

delete "test/func/(imp)_merge((patch_foo_a),_(delete_foo_))/__driver__.lua"

delete "test/func/add_unknown_recursive"

delete "test/func/add_unknown_recursive/__driver__.lua"

delete "test/func/ls_unknown_of_unknown_subdir"

delete "test/func/ls_unknown_of_unknown_subdir/__driver__.lua"

delete "test/func/merge((drop_a),_(rename_a_b,_patch_b))"

delete "test/func/merge((drop_a),_(rename_a_b,_patch_b))/__driver__.lua"

delete "test/func/merge((patch_a),_(drop_a))"

delete "test/func/merge((patch_a),_(drop_a))/__driver__.lua"

delete "test/func/merge((patch_a),_(drop_a,_add_a))"

delete "test/func/merge((patch_a),_(drop_a,_add_a))/__driver__.lua"

rename "test/func/ls_unknown_in_subdir"
    to "test/func/ls_unknown"

add_dir "test/func/automate_erase_descendants"

add_dir "test/func/diff_vs_manual_merge"

add_dir "test/func/disapprove_root_revision"

add_dir "test/func/netsync_uri_multi_include_exclude"

add_dir "test/func/pull_branch_vs_db_check"

add_dir "test/func/resolve_conflicts_dropped_modified_1"

add_dir "test/func/resolve_conflicts_dropped_modified_2"

add_dir "test/func/resolve_conflicts_dropped_modified_3"

add_dir "test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2"

add_dir "test/func/resolve_conflicts_dropped_modified_upstream_vs_local_attr"

add_dir "test/func/revert_with_inodeprints"

add_dir "test/func/status_of_ignored"

add_dir "test/func/using_packets"

add_file "contrib/basicio.vim"
 content [ff652790f22fb5e3421c0b70b5c45d6c8d470d3b]

add_file "contrib/colortone.pl"
 content [4de0235589831da1b9daeeba18841074c240fe78]

add_file "contrib/mtn-export-revisions.pl"
 content [c5cf12354570aa798414a85883961afd8a8e116e]

add_file "contrib/mtncommit.vim"
 content [edafe2ebd93351bb290baa1db5b9313dab3237a6]

add_file "test/func/automate_erase_descendants/__driver__.lua"
 content [45830e0a1e9f33e9031ca9953689b3648a9eb04e]

add_file "test/func/diff_vs_manual_merge/__driver__.lua"
 content [9264cfa19cf1c5998549c4ec902535ea1bad6ebf]

add_file "test/func/disapprove_root_revision/__driver__.lua"
 content [743f82c455ccc4d57b1ee123d0c8fcf7341f8207]

add_file "test/func/netsync_uri_multi_include_exclude/__driver__.lua"
 content [d54722eeef8802ba80caa5b9a9f3c355c0763081]

add_file "test/func/pull_branch_vs_db_check/__driver__.lua"
 content [65e0a47e3dc19cf4d1161f89c8fb7fddfa1de6e3]

add_file "test/func/resolve_conflicts_dropped_modified_1/__driver__.lua"
 content [2c87a2a5810a34019c4ca4148eb2b9bede764267]

add_file "test/func/resolve_conflicts_dropped_modified_1/conflicts"
 content [c6a5d84c1e1345aef2a87ad2885fb6b9a03b70b9]

add_file "test/func/resolve_conflicts_dropped_modified_1/conflicts-orphaned"
 content [12fab989ba071fd2babef30ba3aad1744d4cb2fa]

add_file 
"test/func/resolve_conflicts_dropped_modified_1/conflicts-orphaned-resolved"
 content [672fd1e54221b5b6360759b9a9a41426ce36ed6d]

add_file "test/func/resolve_conflicts_dropped_modified_1/conflicts-recreated"
 content [3f43d9d13d0149e3be0fa3a7a8695182dbc871ea]

add_file 
"test/func/resolve_conflicts_dropped_modified_1/conflicts-recreated-resolved"
 content [7937832db9408aeadbbeed472d86f29ef3394a06]

add_file "test/func/resolve_conflicts_dropped_modified_1/conflicts-resolved"
 content [b2fe24f2d19a8d539c0c89c305a7b58a36ead63e]

add_file "test/func/resolve_conflicts_dropped_modified_1/show_conflicts"
 content [cce385ec522c8e4885cac7d3375896aaa507f0e0]

add_file 
"test/func/resolve_conflicts_dropped_modified_1/show_conflicts-orphaned"
 content [e343653ac3989164acb2dbb54f3f97b035d28de6]

add_file "test/func/resolve_conflicts_dropped_modified_2/__driver__.lua"
 content [81b11d9ab24ad470156b95e8be8efd9dc1645156]

add_file "test/func/resolve_conflicts_dropped_modified_3/__driver__.lua"
 content [fd2a4dd0c38dff10bd3ff2f20e983f3f548b3d18]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua"
 content [80f056dd3773dab5d5019d78cbb0f7393d66bde3]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_2_3"
 content [1f257fa6e99abf93229af189109b9efe3cfae88f]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_2_3_resolved"
 content [d8b9a96fdaf210a4d1bc495c62c3dcf40114d39e]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2"
 content [bb23f1fbf87e4f1dcb8aa7c4c3fcb90e1fc84fed]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved"
 content [4482ad2e755308ce8a546191348cc648ad13d782]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_attr/__driver__.lua"
 content [abe2836cc2dfbae368820e3b5515ad587911c71b]

add_file 
"test/func/resolve_conflicts_dropped_modified_upstream_vs_local_attr/conflicts"
 content [0ab94901aaab08fbed7c8a74c8dd4e44dcd85f46]

add_file "test/func/revert_with_inodeprints/__driver__.lua"
 content [d3ad794b0a265fb5fa4eee3e264eefc6931d9340]

add_file "test/func/status_of_ignored/__driver__.lua"
 content [f64919f41c4733dac61b88884b945988faa1c2b0]

add_file "test/func/using_packets/__driver__.lua"
 content [cbba17e46d782afcc3a2a97b54280a7373588c03]

patch ".mtn-ignore"
 from [347361ce3fa47016cbe4f5ba29188696d939a1d8]
   to [be27b64d4938d68bb89fab2933c1c35d0cebf885]

patch "AUTHORS"
 from [8ddfabfc16a07f92a8095d987629487bd4ab5321]
   to [20e7cd2ee129e9f5f0e1819f47f2df8598f6a557]

patch "Attic/pcre/README"
 from [420b5f8ab281ef77f9caa6cde682d24ea5f68322]
   to [903cf10e0439d34e3137fa24171f747306da11e5]

patch "HACKING"
 from [cf403ac1b4e542270a8f08bdeb0ae0dd61d9d0aa]
   to [db78c6f7b4dd870840f6bcbc906d8faa2e737daa]

patch "INSTALL"
 from [3ae95cf7a59bc52ae8caf0e99ab3f30013130ee4]
   to [f25c96921a702ea32195e8d659b461404516af2a]

patch "INSTALL_windows_cygwin.txt"
 from [46b16835478139759c0f52b531f16b6731e26314]
   to [155d548dd4bd91fa35deb7166c06a9353d615a23]

patch "INSTALL_windows_native.txt"
 from [720fd6b6c8f3696e572a3f2f5466b9518d1aadcf]
   to [890ae02b8d52b803a093cfa38c267de4955f3943]

patch "Makefile.am"
 from [d8bebdb36192f09f35b5737b9975fce92b11eeb9]
   to [e601735ae7a62b55743bef936b8acf1f2ff490fb]

patch "NEWS"
 from [282addc1d59cc722b9e713aa5e04605e9bd2289d]
   to [54723cd3a325f76fc39e733ff3ff4372860afb5c]

patch "configure.ac"
 from [0c190a9066cfcdb0c2e94f7f436b7ae79ead2235]
   to [195c8b95513b0490fe09ab6d6d44902aceda9b53]

patch "cygport/README.txt"
 from [361e69b992054b76cba996af183076b6a2cd0bce]
   to [7edb410cb14ee2da1875ee18d12c881d0778b7dc]

patch "cygport/monotone.cygwin.patch"
 from [db390a58c5769095af2f36d20dcba1c6609e99da]
   to [e6c67e0555b8a25a94cad440d17a006fdfbb6d88]

patch "doc/monotone.texi"
 from [0e40017dfe8ba652e6af4585a2ac176c8bd12dcc]
   to [2d2a1a9c79e57fffe52a876d912e71355524d91b]

patch "doc/pcrepattern.texi"
 from [10041ae21b3ce5f6971aca811ce57abc0827da8b]
   to [43ef52850c1fd113b8a21d63634bafe61b3aec45]

patch "extra/mtn-hooks/monotone-buildbot.lua"
 from [41d82aee6613c5d1775fd8ebf97ffd0c29ea807c]
   to [d1439935004ff6fb523dfa6b2c5fd5c8641339ab]

patch "extra/mtn-hooks/monotone-cvs-ignore.lua"
 from [7bc64a29dac6409b2dbfbda0b3458ccc5b5fdc46]
   to [e237828983a27a99d58ec6bb0243fbf56fdcb817]

patch "extra/shell/monotone.bash_completion.in"
 from [df7a7d5b8f27d5dfdf4bd09f953f0b4e26518775]
   to [b9f93761b9d2bebfdcf1d82f5147211b10bb51de]

patch "innosetup/README.txt"
 from [86ad710152a8dcfa19b88adf1c1eb135e787454e]
   to [d306d15f4bba8011dd1fa01dd9522b93c8ce8920]

patch "innosetup/monotone.iss.in"
 from [1800543d08b166faa10b73a217b03c827733e710]
   to [ac82a895b5fb4de6b175e65cc99db7e233d7fa9b]

patch "notes/release-checklist.txt"
 from [9667681829dde1bdc955fbca7ce0062789d7f396]
   to [854f5ee471e9eb2ad639c37370034f8326bbb47d]

patch "po/de.po"
 from [76781e0c24fe5452e4e1adf16a6e565488577c00]
   to [7d6060bdaf4235e303217616005a44d5663ee456]

patch "po/fr.po"
 from [60820cde761ddab3a09f857d1615e082aa4c53c2]
   to [25ee46a98124152467c17aa6ea47f3e83aaac819]

patch "po/it.po"
 from [b4b3e1fbd6d4fef3dcd21e24c5d35bbb2ddddc1a]
   to [bdf8a6936c2cef1e7c73d8fb782b6e49e4e76e19]

patch "po/sv.po"
 from [44eb891ddd95b97af1dd12adcaf80070f4a314e4]
   to [55b2f84972d9c24e4b8e7effea3a143f09176a6c]

patch "src/ancestry.cc"
 from [8b3388b690a5f4878bd29d752c3e6e073411739e]
   to [e673b17a5d2fad2716f7f4efe33c2ca11c7c31f9]

patch "src/automate.cc"
 from [efa4ecceab7f1e31f71778f325da312bf6aefba5]
   to [30e9bb3567e320f83ce5c1b4817dc9ad90fe8423]

patch "src/automate_reader.cc"
 from [f647cff8c945367fbf054eb9fd3a14ff738e330b]
   to [ac60e48d6902a3cef96bc86a93640936c125beee]

patch "src/cmd.cc"
 from [077158d4777347710668422f6935bca67125b860]
   to [94f7a433246032017e7c9a61645903feef68128e]

patch "src/cmd_conflicts.cc"
 from [ad9dc74c27d4d8c50a74e5825ec9e0a12cdc1b09]
   to [28995825acadb97eaa4b5cda378c66e548e9ad16]

patch "src/cmd_db.cc"
 from [ad043207d9a5014f8137a23782b36a97dc9fc4c0]
   to [6bc1764d38063b0f5a23dd490f02786daafad0b7]

patch "src/cmd_diff_log.cc"
 from [b24dffb0470d057fa1e91ccc5a81627b40252e78]
   to [73c7b3cba5a9e1af54ff98b44863c631289bfed4]

patch "src/cmd_files.cc"
 from [f15378efd25e597762776ad6e9c6f78c1a4ff191]
   to [35ef41ea62233513fe1aa54cedf8c70ade96973a]

patch "src/cmd_list.cc"
 from [5eee1fff3753df893cfc1325d362f6bc8445dd11]
   to [a0103f85cfb0c0e36fe33f3bad41e321cf1d5dcc]

patch "src/cmd_merging.cc"
 from [84b177469ecb60664be23c42c38cc649d23899a7]
   to [0a6aa03896408c4acdb7a1a9cd1682cb98c6f02a]

patch "src/cmd_netsync.cc"
 from [9dd8803cef465c834268105a42cc37dc282af520]
   to [88ca982ea191c22c88b490e87695b359754aff45]

patch "src/cmd_ws_commit.cc"
 from [d9dbacb820c6d070c4952ee2b0f143e61e85631e]
   to [9c041c3ec231af27f63333af4ca73b69dfd9983c]

patch "src/database.cc"
 from [ec58501c63bd6ba1b75c59f9111a4d26e0d4f19e]
   to [87efeeff2d3263ba98af684a4022f1897434ed2d]

patch "src/database_check.cc"
 from [b926df22bc2ec6134600d55072462c9a3df1b8b3]
   to [b5c6eb77f74e421e2ad7f86702cf1b49cc38aa22]

patch "src/diff_output.cc"
 from [8df7c0bec2e64275f6c8e8b6ccb035c8fd0f684f]
   to [78be17ba28d6f26930b6ee36f04b4382450b912b]

patch "src/diff_output.hh"
 from [9125ccd0d0fa725782c9910b5f34e844048d2da8]
   to [905c550857ce361fd3e0da69840fd95860cc7874]

patch "src/file_io.cc"
 from [3a9cd566f250de51fefd41368c4fc1aaa1e85896]
   to [76874e5ca4978bd0fd3ba183cd19edc3447ece0d]

patch "src/gzip.cc"
 from [e7c19bee910e3d421fd073933810ec52092b1d9b]
   to [9da41f6820cdf39707b22c716e3682e0fa0fd745]

patch "src/gzip.hh"
 from [649dfc0b250954f39c0f73870f8bec3f32f7fa43]
   to [17093f66e365b3730a49ef1910295f622972c36e]

patch "src/key_packet.cc"
 from [d1306df89dd684badac02c03744cd446381c07d3]
   to [c97262d161b23c9640972188979669b3e95afe7b]

patch "src/key_store.cc"
 from [64c4c4bed1fadc26b51207b9f61343f9dd7d3c6e]
   to [b7859345f7c665914d16357409bdff24a48b7996]

patch "src/lua.cc"
 from [bb919b7d41842bcc07c2d7c442ef415f7978a83b]
   to [6787dcbd552c2c8772e511dcd12b8f682868c0b3]

patch "src/lua.hh"
 from [146872f14cc23c6179c37bcda8667a0ecd178826]
   to [4396421e2bb335241ce33c29a53aeffd3ebf7380]

patch "src/luaext_parse_basic_io.cc"
 from [995b37d3cc3eb58a3c6be6db06e38f997ba6845e]
   to [f7a89950b6355b57d24ccf12331c7e2beae686bd]

patch "src/luaext_platform.cc"
 from [288a571d7c91fbb4abffb66611b52aac74889aa2]
   to [135278a8a971333575a0d8c92ed5d93262723cc7]

patch "src/merge_conflict.cc"
 from [1c09dc4a20532ce040c429d7fb5ed2a25a199856]
   to [b47a70720f836809f06347360ee91ddf587b5721]

patch "src/merge_content.cc"
 from [76d5a0997d9217b309d75806f8059d8f56f2ca49]
   to [095c2d20ac8d8d495806f6463c311d253cb6a686]

patch "src/merge_content.hh"
 from [c74c14bb8031b9bf67f684d9ddfdf6624f424f01]
   to [f9a3388e5d2bd6d873d352dabf896df32827e983]

patch "src/merge_roster.cc"
 from [98297d6264f77d540fc8e1578b1ebc5b2f36ec38]
   to [c3eb70578a3b8b88c4d1b7af43b7685d6f636c23]

patch "src/merge_roster.hh"
 from [cd2da3b06f595187a27622a98580b0636aabea4b]
   to [c782f7684e380f4583ed7ea88b0b2967f89d1d23]

patch "src/monotone.cc"
 from [a25ecdd170a601db798b63a60add7681609a34c4]
   to [764bc9ca406b41d21efd552a0d810bc2849e0588]

patch "src/network/automate_session.cc"
 from [2c77f8e025f0d9a0ac4862127944fdebd28425ca]
   to [3e42eadbc0379688a0a764ecb957f9e0dfde9adc]

patch "src/network/netsync_session.cc"
 from [d2a9eee38bb3018fd84c699070f8e28557da6cc9]
   to [3c89f6b9938ff38e4bb33ed5f9e9fa1681515c4d]

patch "src/network/session_base.cc"
 from [d44057cfd11f195fcfd95abae4d5550bd2402152]
   to [b5e1c8544dccb3532ca8047cd157f0c209055e6a]

patch "src/netxx/serverbase.cxx"
 from [7a9b465ce4b0b02cb8ff126acf86d3896b4eb456]
   to [156f2090341d2a36bdb718e7c69df58f9251983e]

patch "src/options_applicator.cc"
 from [5407017eb222eb329f9e22fc465d4f36743d37ee]
   to [4aedb28ed059d5c6edc9a7aba4f5b39929dba70e]

patch "src/options_list.hh"
 from [0462e302b89179f4acb28ecb91f4255140d4a4a7]
   to [27c44e89ebc9a828ac0a7b91505f997884646062]

patch "src/packet.cc"
 from [f61360ed2524fdf53411bd24d022a2a3c9e6e9c7]
   to [571ff6eae1d269a146da74f2730b70376957d3bb]

patch "src/packet.hh"
 from [0a224e6e92f244e2c3e9a5cdb935eb8613d7e85b]
   to [9c43d30145f0292d6ceda5e717e366fdead5a4d6]

patch "src/paths.cc"
 from [c724539af68eb71b98431d565eade79c2dcadf15]
   to [f4244d2b15de4c1b8005fa8b244fe8391ce61d1b]

patch "src/pcrewrap.cc"
 from [7f5bd4e7d8d9e02f2b0271fa9a0f64dcbce2467d]
   to [59b11bb0076d4724c95c34840409be6d8357a68e]

patch "src/rcs_file.cc"
 from [885b3fbe7b6cfed78816f0e57cd71d44616213c6]
   to [03cf68912a4a708545ebce3d415c0e970ddead0b]

patch "src/rev_output.cc"
 from [a2c70b893b31296917d1a2b974faa1da46c13f1e]
   to [6b9862bfda95d0d558d8335fb2accfc0180e8fbd]

patch "src/revision.hh"
 from [740c4dd4ee350fcf06af3ba707cef3dadecb46f8]
   to [8d93883e8a6de779aa199d9b2e1aa58589f0626c]

patch "src/roster.cc"
 from [b4cec49faa1928388c7ab0ae1e2f389b202270b0]
   to [b0608d6ec3e3f2d23a5c97bb64c4354eeb01773a]

patch "src/sanity.cc"
 from [17e9e70774f064cfb8ef4e25075a1f493b63cd78]
   to [95d33b629774a37076959f4e66ca82a16089d093]

patch "src/selectors.cc"
 from [3efba0ce3139290b4088cea0d6e82a912565471e]
   to [3fe6662223cd5a5f539189be93cf6652f9374acf]

patch "src/sha1.cc"
 from [5e1aa972d7c7d66e06320b039989652b830dcd75]
   to [42e48b22fd88b25e0d38d4f91e1f13f8a83c7120]

patch "src/ssh_agent.cc"
 from [6d188e7012a0b82f782563b09bbd7adf3f70cf75]
   to [4a0dcab873559e934e41c5f220b5434d35600d9b]

patch "src/std_hooks.lua"
 from [a594ce3c5f5377c8d44c6781d41444a14a64cbb6]
   to [a2ec9556e5a0d3b3cc47633b14ad226b5c829925]

patch "src/transforms.cc"
 from [cdfb6854ef4992faba21074145f3c8269b845b11]
   to [b99278ffe95c0081bf4986bc74d3699c37a52948]

patch "src/unix/fs.cc"
 from [4a432ccc7d7f5926ba00b108f45960aa013d23b8]
   to [f51cae4dbc5589b0add4f7b9b649fde3c83d1220]

patch "src/uri.cc"
 from [ee873c2b7f4cd405ae5a0871cdd6e33341ebec9d]
   to [f50e7599f6294a9872c055a8b230ea4933bdcc82]

patch "src/vocab.cc"
 from [1a4f7c3ab144ead8f4698c7c225c2fac6b161cc3]
   to [4c73af08de6dd30f710896835673361ee019466e]

patch "src/win32/fs.cc"
 from [e524671f74e0644fb08b16e3535fe00f80106328]
   to [7fe5820033df2ee964aad6ed906dde92d4d46397]

patch "src/win32/get_system_flavour.cc"
 from [504a6ac65967da7d4b4a437d0beebc04ee8f969d]
   to [08c4e014bf680bd9396fe2a70571d215560337a6]

patch "src/win32/terminal.cc"
 from [036785c31b25174a945c09d04030552377394221]
   to [8aa0b4610e4683fea74c0378e6d934d2829f2799]

patch "src/work.cc"
 from [36e5dcda8cf09c9054cb88e6165707112ba9ac03]
   to [8d3836724bbef0b606fad9c200d85126c9462565]

patch "src/work.hh"
 from [00e100f44763cad0019683c16c4a13d53a94d5e0]
   to [b3fd4ec1187a85bd63081775e15471d692be2923]

patch "test/extra/bash_completion/bashrc"
 from [50253c70d06f889a476b8333d5013c5512a1ef57]
   to [dd471a4f720b559295d901a73908cbc667f7227c]

patch "test/func/addition_of_files_and_directories/__driver__.lua"
 from [0051df02ca4bdb2c88e5931b087aaa6b3b0e67e5]
   to [a92d8e5231833e0f5146e04248c30eb31e82029e]

patch "test/func/attr_mtn_execute/__driver__.lua"
 from [ac0c1f7ecf54690607e55d5aa43544c023e3700c]
   to [b5bfcf8f4fdb98c59f95da35b93e7d97d08b99e7]

patch "test/func/automate_get_attributes/__driver__.lua"
 from [9b89d87cc43aa1c5ba5569d495ebfa812d81305f]
   to [3c820fcccbd5102c4bb3a4e9c01233de137aa21a]

patch "test/func/automate_interface_version/__driver__.lua"
 from [6fdc200cf0f8c01e6174ebb04f521b0e645198ec]
   to [8b65eadc6b526d1490ed02dc74a06134612c5c7b]

patch "test/func/automate_inventory_ignore_dirs/__driver__.lua"
 from [7afec31b9343b5e6d95f0d0bc30aa661254d7aeb]
   to [8b022036bd487f071752e21a3da566bc664c5995]

patch "test/func/automate_put_revision/__driver__.lua"
 from [deeeb9cb4ff8625284a4f69846ef9fa561a42ccf]
   to [e116294fa44da8646b2e41288615035f913b9563]

patch "test/func/automate_set_drop_attribute/__driver__.lua"
 from [5a090a94f10ebfa6ddb7378f9a285865ce881245]
   to [3d759e4395849775e5194721e6f5b05f50080644]

patch "test/func/automate_show_conflicts/__driver__.lua"
 from [f835c5204474b98db1ef43aead8c9c0f97014575]
   to [41adbaaa488c5b3cda193cec8d037b66368f8b55]

patch "test/func/branch_leaves_sync_bug/__driver__.lua"
 from [6b227867aeb3692dba4e68efdfe5c59ff5c15919]
   to [943c3f2d7c3294e5da221d44911c08511058acb2]

patch "test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua"
 from [bf16d8dcec86e4ae012d1c6078082f9d13a9fd80]
   to [e75946886b2b0b4ee301016860238e6315c22a59]

patch "test/func/clone_branch_no_dir/__driver__.lua"
 from [b490cd593cefd9aa0b4dec9ab177eb72c3fb8058]
   to [1ab33d8f6d1bdc38d3804d8fcd41b6c2f65a6e61]

patch "test/func/clone_creates__MTN_log/__driver__.lua"
 from [5a8fe703d56ea39db22dcfbe6183294c1eb3f01b]
   to [b412d2f37df048846fc1f76ab62572d4c39b0796]

patch "test/func/clone_creates_right__MTN_options/__driver__.lua"
 from [12e86831366aa0f5573d1ec511872b6f9034aeb2]
   to [9891e77e30b8830f8040bcb817a0db26a433c9dd]

patch "test/func/clone_validates_target_directory/__driver__.lua"
 from [1286723ee00ea9ea6831e12575ba7ac32a066645]
   to [0c6f70282431ed62359ad0b4a827575406889f4b]

patch "test/func/clone_warning_with_multiple_heads/__driver__.lua"
 from [4333c6de0518517ff9bc04b4baef0d2d5ff08914]
   to [18e8670ea08dcb9602425ebdb97a786b20945ff6]

patch "test/func/clone_weird_branch_names/__driver__.lua"
 from [205c20a2809513b93ee9ab6c1affb24070f284a2]
   to [e1253c24b2b696483bb621c85e48caa8d5c2cc90]

patch "test/func/conflict_messages/__driver__.lua"
 from [a681cb85649f5e5ce53bad9b8ef8f2300c22d9d8]
   to [33836bd943bbe8c33abff9b8597db9d4c768b2d6]

patch "test/func/db_opt_fallback_mechanisms/__driver__.lua"
 from [09354a970b921effa2850aa4ad722ce95a433ea8]
   to [0b0da944f19f7a0be42165069fdc1bb8862fd6ee]

patch "test/func/extended-selectors/__driver__.lua"
 from [435f44fb1b33bdfb53929fe6bd15ba7fa4c2c1d3]
   to [e80ed8e831bbc9cc346e7722c9877d32887104ef]

patch "test/func/imp_test_filesync_confdir/__driver__.lua"
 from [5262dae96bcf38a2a27cea3d17523e08ad3e03aa]
   to [19822aa249d9300dc8695f41adbd12cbce5a9234]

patch "test/func/list_databases/__driver__.lua"
 from [d78cd923f7f4950590407127854dcd3467b85625]
   to [9ab31d5e81fbca51ae7a5a919953e79d9c8e6631]

patch "test/func/list_workspaces/__driver__.lua"
 from [d7cc622b5a893fd344653512a434440082dbc247]
   to [e83147fac524181f19720ec74b04a38f7b1c41a7]

patch "test/func/log_--no-files_and_--merges/__driver__.lua"
 from [1a7944f904399553b56f8f4cc69b22152d03b851]
   to [7e1b2967179f5b5dec932ee44c0004e41b527bb0]

patch "test/func/ls_unknown/__driver__.lua"
 from [2d2da6ec91b788419c052f7f8e9168253269589a]
   to [6654ef88997747a089cb73f7c6e7ff7ddd44d6a8]

patch "test/func/manpage/__driver__.lua"
 from [a381ef4517c907170547a4984923650617f69c60]
   to [c8d528d2e1dab045cd6115111cceb2d5906296a8]

patch "test/func/netsync_key_hooks/__driver__.lua"
 from [d7fad5a70688d3db512a05ebb0e3643006f8c7e2]
   to [0c2d3f3443fa9ff90615cd5338e322baa5ad44aa]

patch "test/func/netsync_negotiation/__driver__.lua"
 from [38cd5d9df0e16cf05d59f0d9525ae546a9654f5f]
   to [0b30d988c62dfc2aa3c4a7e0021b3395faba8609]

patch "test/func/netsync_over_pipes/__driver__.lua"
 from [e4ee774912c36ca34a2bfe897daecac570f626a7]
   to [e769e909c59f15351c957a47d98bd7be5868e9f7]

patch "test/func/resolve_conflicts_all_resolutions/__driver__.lua"
 from [0a504a8ecd385dadb9a01b7fc2c836e58dbaf6ff]
   to [e491c1be8ceb2a90b1f80f6e29a4430e4ef8a439]

patch "test/func/resolve_conflicts_errors/__driver__.lua"
 from [4911dc65645a5af929cd990eef09c97146e60d17]
   to [0819ba223855d9814a7420c7412166b1109ed20f]

patch "test/func/resolve_conflicts_orphaned_file/__driver__.lua"
 from [fe6a4618be2793d18ee2f97adf94cd564763164f]
   to [beb41b901c1e08bbef25e87fe0b2ef36e74a2a8b]

patch "test/func/resolve_conflicts_read_all/__driver__.lua"
 from [c8f14848057bb6eff36844cebd24aff6caed9d08]
   to [ccc41061b22420f5b08eea1271a3b5acf6c270d2]

patch "test/func/restricted_commit_with_inodeprints/__driver__.lua"
 from [b11b4fbd4ed1b88ccb61d2b9ea5347c61a360c47]
   to [48dda63d86651a117b978054e362f4ed056f3e47]

patch "test/func/schema_migration_new_db/__driver__.lua"
 from [b1ed03f18f2480f322746b2e142f21ad005ae9cf]
   to [3c9bd83bd39e98ced7d78a436143968717e11a0a]

patch "test/func/serve-automate/__driver__.lua"
 from [d41f819fd49060c45bb154dde614699b0cb938e7]
   to [1343490c3b79e3d936a5b72ba7561055239235f8]

patch "test/func/serve-automate-single-run/__driver__.lua"
 from [01013ad10150f9056bee7609338cb09b47d8c677]
   to [9ac5e0e67c0a6849289ddfaf175505f674da6410]

patch "test/func/ssh_agent/__driver__.lua"
 from [e1e991f96a3289db93574829306b32b20aeba886]
   to [3f28e56f4fe2fa4169a34c5cc16e4039b2bd492a]

patch "test/func/syntax_errors_in_.mtn-ignore/mtn-ignore"
 from [c46ecd3b4771b7b0af41b6caff2074df0427fbfa]
   to [55bfcaa55ef14ee091aa6279251af51121f910b9]

patch "test/func/things_in_.mtn-ignore_get_ignored/__driver__.lua"
 from [2b1974541199d82c39a4c9529f9d85d2bf5c7106]
   to [e782689702a5ed0d977d1610dd7c06df505cdb1d]

patch "test/func/two_parent_workspace_inodeprints/__driver__.lua"
 from [cb9175dd15771248cc7d53864fa77c17b9d09802]
   to [27930df4f388e02e7fa017e62aa0dd9873ac3d35]

patch "test/func/two_parent_workspace_list/__driver__.lua"
 from [5d6df31659e888cf21e541121d487d3e5249e2df]
   to [2a365be32c664d756c0187954ca84c79590558fd]

patch "test/func/update_with_pending_modification/__driver__.lua"
 from [03be28a852978808341205ba2e2f713ce8dcaf35]
   to [de7b5ac13bfad72bce229ee71f3ae972c741f08b]

patch "test/func/user_commands/extra_rc"
 from [94c90e2f0259bc9905f6be3fcc2580f0c8c2714d]
   to [7830e76cf219e92da08c959d7f9e33804be59c5a]

patch "test/func/util_mtnopt/__driver__.lua"
 from [84307ea94ec302c6d9bbe163955e8f5e86973ce0]
   to [6981b9fe1aa7800aaaf76bd18f0ddbb73b0e6046]

patch "test/src/testlib.lua"
 from [6d2a308918594226fa6549ed0268ccaea3921038]
   to [445ed7ee75dfde94af676e7644e29e874aff58d7]

patch "test/unit/tests/xdelta.cc"
 from [4aff975cfd9a9cf18c26f70118e2895880ed6100]
   to [ed5f467ebc4755f7521e74a40833181974b43a8f]

patch "util/audit-includes"
 from [d5757fcf83ab116fba16c53221da0f832307a113]
   to [1c6fc8be30ebfafc67ca03980e7860db35e5d2e9]

patch "visualc/config.h"
 from [58e9c7709f64437fe0f62cf1ca98a9f5906d92be]
   to [4f5f6370f5e7f3da43b2de50fca73ed4d67c3d85]

  set "contrib/mtn-export-revisions.pl"
 attr "mtn:execute"
value "true"
============================================================
--- src/std_hooks.lua	5b089162751bf675605aa10655c77dcd7af99b93
+++ src/std_hooks.lua	a2ec9556e5a0d3b3cc47633b14ad226b5c829925
@@ -10,7 +10,7 @@
 -- this is the standard set of lua hooks for monotone;
 -- user-provided files can override it or add to it.
 
-function temp_file(namehint)
+function temp_file(namehint, filemodehint)
    local tdir
    tdir = os.getenv("TMPDIR")
    if tdir == nil then tdir = os.getenv("TMP") end
@@ -22,8 +22,14 @@ function temp_file(namehint)
    else
       filename = string.format("%s/mtn.%s.XXXXXX", tdir, namehint)
    end
+   local filemode
+   if filemodehint == nil then
+      filemode = "r+"
+   else
+      filemode = filemodehint
+   end
    local name = mkstemp(filename)
-   local file = io.open(name, "r+")
+   local file = io.open(name, filemode)
    return file, name
 end
 
@@ -823,8 +829,8 @@ mergers.opendiff = {
    wanted = function () return true end
 }
 
-function write_to_temporary_file(data, namehint)
-   tmp, filename = temp_file(namehint)
+function write_to_temporary_file(data, namehint, filemodehint)
+   tmp, filename = temp_file(namehint, filemodehint)
    if (tmp == nil) then
       return nil
    end;
@@ -911,10 +917,10 @@ function merge3 (anc_path, left_path, ri
    tbl.rfile = nil
    tbl.outfile = nil
    tbl.meld_exists = false
-   tbl.lfile = write_to_temporary_file (left, "left")
-   tbl.afile = write_to_temporary_file (ancestor, "ancestor")
-   tbl.rfile = write_to_temporary_file (right, "right")
-   tbl.outfile = write_to_temporary_file ("", "merged")
+   tbl.lfile = write_to_temporary_file (left, "left", "rb+")
+   tbl.afile = write_to_temporary_file (ancestor, "ancestor", "rb+")
+   tbl.rfile = write_to_temporary_file (right, "right", "rb+")
+   tbl.outfile = write_to_temporary_file ("", "merged", "rb+")
 
    if tbl.lfile ~= nil and tbl.rfile ~= nil and tbl.afile ~= nil and tbl.outfile ~= nil
    then
@@ -1052,8 +1058,8 @@ function external_diff(file_path, data_o
 
 -- default external diff, works for gnu diff
 function external_diff(file_path, data_old, data_new, is_binary, diff_args, rev_old, rev_new)
-   local old_file = write_to_temporary_file(data_old);
-   local new_file = write_to_temporary_file(data_new);
+   local old_file = write_to_temporary_file(data_old, nil, "rb+");
+   local new_file = write_to_temporary_file(data_new, nil, "rb+");
 
    if diff_args == nil then diff_args = external_diff_default_args end
    execute("diff", diff_args, "--label", file_path .. "\told", old_file, "--label", file_path .. "\tnew", new_file);
============================================================
--- .mtn-ignore	347361ce3fa47016cbe4f5ba29188696d939a1d8
+++ .mtn-ignore	be27b64d4938d68bb89fab2933c1c35d0cebf885
@@ -2,6 +2,7 @@
 ^ABOUT-NLS$
 ^Makefile(\.in)?$
 ^aclocal\.m4$
+^autom4te\.cache$
 ^build-arch-stamp$
 ^build-indep-stamp$
 ^compile$
@@ -62,7 +63,7 @@
 ^src/std_hooks\.cc$
 ^stamp-h1$
 ^stamp-vti$
-^test/(func|tester|unit)\.status$
+^test/(extra|func|tester|unit)\.status$
 ^test/bin$
 ^test/src/testlib\.cc$
 ^test/unit/tests/[^._]*(_+[^._]+)+$
============================================================
--- AUTHORS	8ddfabfc16a07f92a8095d987629487bd4ab5321
+++ AUTHORS	20e7cd2ee129e9f5f0e1819f47f2df8598f6a557
@@ -70,7 +70,7 @@ files added, by other contributing autho
   Vladimir Vukicevic <address@hidden>
   Markus Wanner <address@hidden>
   Zack Weinberg <address@hidden>
-  Richard Hopkins
+  Richard Hopkins <address@hidden>
 
 Several people have also contributed to the translation of monotone
 into non-English languages; their work is available in the po/
============================================================
--- Attic/pcre/README	420b5f8ab281ef77f9caa6cde682d24ea5f68322
+++ Attic/pcre/README	903cf10e0439d34e3137fa24171f747306da11e5
@@ -1,4 +1,4 @@
-This is the library component of pcre 7.4, downloaded from
+This is the library component of pcre 7.6, downloaded from
 <ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/>.  The only
 modification made to the code is that each .c file has been changed to
 #include "pcre_config.h" unconditionally, instead of "config.h" only when
============================================================
--- HACKING	cf403ac1b4e542270a8f08bdeb0ae0dd61d9d0aa
+++ HACKING	db78c6f7b4dd870840f6bcbc906d8faa2e737daa
@@ -25,7 +25,7 @@ The appropriate Emacs modeline to use fo
 
 -*- mode: C++; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 
-And something close (but not perfect) for VIM:
+And something close (but not perfect) for VIM (requires "set cindent"):
 
 vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s:
 
============================================================
--- INSTALL	3ae95cf7a59bc52ae8caf0e99ab3f30013130ee4
+++ INSTALL	f25c96921a702ea32195e8d659b461404516af2a
@@ -44,6 +44,12 @@ 1. prerequisites:
              databases/sqlite3 devel/automake1.9 devel/boost devel/gettext
              devel/gmake devel/pcre lang/lua security/botan dns/libidn
 
+        on OpenBSD:
+
+           install the following packages using 'pkg_add':
+             autoconf automake boost botan gmake libiconv libidn lua
+             pcre sqlite3 
+
         on Gentoo:
 
            emerge the following packages:
@@ -61,7 +67,7 @@ 1. prerequisites:
 
             install the following extra packages with YaST or zypper:
               autoconf automake gettext-tools gcc-c++ boost-devel zlib-devel
-              libbotan-devel sqlite3-dev pcre-devel lua-devel libidn-devel
+              libbotan-devel sqlite3-devel pcre-devel lua-devel libidn-devel
               libbz2-devel texinfo make
 
         on Mac OS X:
============================================================
--- INSTALL_windows_cygwin.txt	46b16835478139759c0f52b531f16b6731e26314
+++ INSTALL_windows_cygwin.txt	155d548dd4bd91fa35deb7166c06a9353d615a23
@@ -2,40 +2,29 @@
 
 on Windows using Cygwin:
 
-Monotone needs the following packages to compile:
-(newer releases are usually ok)
+An official Cygwin package for monotone and all its dependencies is
+usually available soon after release; just run the Cygwin installer
+and install the 'monotone' package.
 
- Runtime requirements:
-   cygwin-1.7.0-60
-   libgcc1-4.3.2-2
-   libidn11-1.9-1
-   libintl8-0.17-11
-   libpcre0-7.9-1
-   libsqlite3_0-3.6.2-1
-   libstdc++6-4.3.2-2
-   lua-5.1.4-11
-   zlib0-1.2.3-10
+To build Monotone on Cygwin for development and testing, the following
+packages are required (the versions listed are known to work; they may
+not be the exact versions used to build the official Cygwin package).
+Note that the monotone source code is compatible with Lua 5.2, but (as
+of 8 May 2012), Cygwin only has Lua 5.1.4.
 
- Build requirements:
-   gcc4-4.3.2
-   binutils-2.19.51
-   boost-devel-1.33.1
-   libsqlite3-devel-3.6.2
-   libidn-devel-1.9
-   gettext-devel-0.17
-   zlib-1.2.3
-   perl-5.10.0
-   botan-1.8.2
+   binutils-2.22.51
+   libboost-devel-1.48.0
+   botan-1.8.13
+   gcc4-g++-4.5.3
+   gettext-devel-0.18.1
+   libidn-devel-1.22
+   libpcre-devel-8.21
+   libsqlite3-devel-3.7.3
+   lua-5.1.4-11
+   zlib-devel-1.2.5
 
-currently every prerequisite is available as packages except
-lua and botan which are only available in Cygwin 1.7;
-an official Cygwin package for monotone and all its
-dependencies is usually available soon after release.
+No special options are needed for configure.
 
-The following is needed to succesfully configure:
-
- export CXXFLAGS="-I/usr/include/boost-1_33_1/ -g -O2"; configure
-
 There is a bug in the bash builtin 'pwd' in bash 4.1; it can return
 'c:/' syntax for absolute paths in some circumstances. See
 http://sourceware.org/ml/cygwin/2002-11/msg01111.html. In particular,
@@ -43,4 +32,4 @@
 configure creating Makefiles with some problems. A work-around is to
 put 'cd `/bin/pwd`' in your ~/.emacs_bash.
 
-See ../cygport/README for building a Cygwin package.
+See cygport/README for building a Cygwin package.
============================================================
--- INSTALL_windows_native.txt	720fd6b6c8f3696e572a3f2f5466b9518d1aadcf
+++ INSTALL_windows_native.txt	890ae02b8d52b803a093cfa38c267de4955f3943
@@ -2,44 +2,44 @@
 
 on Windows (using MinGW):
 
-Many tools and packages are available on SourceForge:
+Here we give sources for the various packages needed. We give
+directions to the download, rather than an exact URL, to make it easy
+to check for new versions.
 
-https://sourceforge.net/projects/<project>/files/
-
-That site is organized into several hierarchical lists of files. We
-give the hierarchy names here, rather than a complete download URL, to
-make it easy to check for new versions.
-
 The versions given here may not be exactly the same versions as used to
 build the current release of monontone.
 
 These instructions work on a new computer, with only
 Windows XP installed.
 
+The most recent MinGW installer mingw-get-inst-20120426 contains g++
+4.6.2; this is broken for C++ exceptions on MinGW. So we use an
+earlier installer mingw-get-inst-20110211, containing g++ 4.5.2 and a
+catalog of other binary packages that are consistent with that runtime.
+
 Package       | Version | location
 --------------------------
-Python        | 2.7.1   | http://www.python.org/
-                        | "Windows Installer" under "Quick Links (2.7.1)"
-mingw-get-inst| latest  | http://sourceforge.net/projects/mingw/files/
-                        | -> Automated MinGW Installer
+Python        | 2.7.3   | http://www.python.org/
+                        | "Windows Installer" under "Quick Links (2.7.3)"
+                        | Used for the Botan install; that does not work with Python 3.2.3
+mingw-get-inst|20110211 | http://sourceforge.net/projects/mingw/files/
+                        | -> Installer
                         | -> mingw-get-inst
-                        | -> mingw-get-inst-20101030
-                        | -> mingw-get-inst-20101030.exe
-boost         | 1.45.1  | http://sourceforge.net/projects/boost/files/
-                        | -> boost -> 1.54.0 -> boost_1_45_0.tar.gz
-Lua           | 5.1.4   | http://www.lua.org/
-                        | -> download
-                        | -> "...current release is >Lua 5.1.4<" under "Source"
+                        | -> mingw-get-inst-20110211
+                        | -> mingw-get-inst-20110211.exe - _not_ the most recent; see above
+boost         | 1.49.0  | http://sourceforge.net/projects/boost/files/
+                        | -> boost -> 1.49.0 -> boost_1_49_0.tar.bz2
                         | lua-5.1.4.tar.gz
-pcre          | 8.11    | http://www.pcre.org/
+pcre          | 8.30    | http://www.pcre.org/
                         | -> ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-                        | -> pcre-8.11.tar.gz
-botan         | 1.8.11  | http://botan.randombit.net/download.html
+                        | -> pcre-8.30.tar.bz2
+botan         | 1.10.1  | http://botan.randombit.net/download.html
                         | "Source: >tar/gzip<" under "Current Stable Release"
-sqlite3       | 3.7.4   | http://www.sqlite.org/download.html
-                        | -> sqlite-autoconf-3070400.tar.gz
-libidn        | 1.19    | ftp://ftp.gnu.org/gnu/libidn/
-                        | -> libidn-1.19.tar.gz
+                        | _not_ the "windows binary installer"
+sqlite3       | 3.7.11  | http://www.sqlite.org/download.html
+                        | -> sqlite-autoconf-3071100.tar.gz
+libidn        | 1.24    | ftp://ftp.gnu.org/gnu/libidn/
+                        | -> libidn-1.24.tar.gz
 Depends.exe   |         | http://www.dependencywalker.com/ ; also comes with Visual Studio
 
 In general, there are two versions of most tools on the
@@ -78,62 +78,75 @@
     command window run "echo %PATH%" and look for the Python directory in the output.
 
 02. MinGW
-  Run mingw-get-inst (graphical installer for mingw-get and the MinGW base system).
-  At the "Select Components" screen, add "C++ compiler" and "MinGW Developer Toolkit".
-    Other than this, accept all defaults.
+  Run mingw-get-inst-20110211.exe - note that later versions include
+  g++ 4.6.2, which is broken for C++ exceptions on MinGW.
+  Do _not_ update the catalog; use the built-in catalog, to insure the
+  binaries are consistent with the g++ 4.5.2 runtime.
+  At the "Select Components" screen, add:
+    C++ compiler
+    MinGW Developer Toolkit
+  Other than this, accept all defaults.
   Open the MinGW shell (Start->All Programs->MinGW->MinGW Shell)
   Run the following:
-  $ mingw-get install msys-autoconf msys-automake mingw32-libiconv
+  $ mingw-get install msys-autoconf msys-automake
   $ mingw-get install mingw32-zlib mingw32-libz-dev mingw32-gettext
 
 03. boost; only need headers
+  in MinGW shell:
   $ cd /usr
   $ mkdir src
   $ cd src
-  $ tar -zxf ../boost_1_45_1.tar.gz
-  This may give errors about gid_t out of range, and then say
+  $ tar -jxf ../boost_1_49_0.tar.bz2
+  This may give errors about a value out of gid_t range, and then say
   "Exiting with failure status due to previous errors"; you can
   ignore this.
-  $ cd boost_1_45_1
+  $ cd boost_1_49_0
   $ cp -a boost /mingw/include
 
 04. Lua
+  in MinGW shell:
    $ cd /usr/src
-   $ tar -zxf ../lua-5.1.4.tar.gz
-   $ cd lua-5.1.4
+   $ tar -zxf ../lua-5.20.tar.gz
+   $ cd lua-5.2.0
    $ make mingw INSTALL_TOP=/mingw
    $ make install INSTALL_TOP=/mingw
 
 05. pcre
    $ cd /usr/src
-   $ tar -zxf ../pcre-8.11.tar.gz
-   $ cd pcre-8.11
+   $ tar -jxf ../pcre-8.30.tar.bz2
+   $ cd pcre-8.30
    $ ./configure --prefix=/mingw
    $ make install
 
 06. botan
    $ cd /usr/src
-   $ tar -zxf ../Botan-1.8.11.tgz
-   $ cd Botan-1.8.11
-   $ ./configure.py --cc=gcc --os=mingw
+   $ tar -zxf ../Botan-1.10.1.tgz
+   $ cd Botan-1.10.1
+
+   On a 64 bit machine, configure will default to 64 bit compilation
+   options. However, some Botan source files do not yet support 64
+   bits. So force 32 bits.
+   $ ./configure.py --cc=gcc --os=mingw --cpu=x86_32
+
    The Botan configure script generates paths with Python's
    os.path.join(...), which in the case of the Windows Python
    we installed uses '\' as the path separator. There are a
    couple of places in the Makefile where this causes problems.
    $ sed -i 's#\\\(.\)#/\1#g' Makefile
+
    $ make install
 
 07. sqlite3
    $ cd /usr/src
-   $ tar -zxf ../sqlite-autoconf-3070400.tar.gz
-   $ cd sqlite-autoconf-3070400
+   $ tar -zxf ../sqlite-autoconf-3071100.tar.gz
+   $ cd sqlite-autoconf-3071100
    $ ./configure --prefix=/mingw
    $ make install
 
 08. libidn
    $ cd /usr/src
-   $ tar -zxf ../libidn-1.19.tar.gz
-   $ cd libidn-1.19
+   $ tar -zxf ../libidn-1.24.tar.gz
+   $ cd libidn-1.24
    $ ./configure --prefix=/mingw
    $ make install
 
@@ -143,7 +156,7 @@
    unpack it someplace in your %PATH% (for example, C:\MinGW\bin\).
    This is only used by the testsuite, in particular the empty_environment test.
    If you just want to build monotone for your own use, you can skip this and
-   just ignore that that test fails.
+   just ignore that test failing.
 
 10. build monotone
    You can skip the CXXFLAGS and LDFLAGS if you really want to, but if you do that
@@ -151,8 +164,11 @@
    monotone binary will take several extra seconds to start.
    $ cd /c/.../monotone
    $ autoreconf -i # not needed if you use the distributed tarball
-   $ CXXFLAGS="-static-libgcc -static-libstdc++ -O2 -Wall"; export CXXFLAGS
-   $ LDFLAGS="-static-libgcc -static-libstdc++"; export LDFLAGS
+   $ export CXXFLAGS="-static-libgcc -static-libstdc++ -g -O2 -Wall"
+   $ export LDFLAGS="-static-libgcc -static-libstdc++"
+   $ export botan_CFLAGS="-I/mingw/include/botan-1.10"
+   $ export botan_LIBS="-lbotan-1.10"
    $ ./configure
    $ make
 
+See innosetup/README.txt for instructions on building the native Win32 installer.
============================================================
--- Makefile.am	d8bebdb36192f09f35b5737b9975fce92b11eeb9
+++ Makefile.am	e601735ae7a62b55743bef936b8acf1f2ff490fb
@@ -724,6 +724,11 @@ mostlyclean-tests:
 	  rmdir $${d%/*} || :; \
 	done
 
+# With the MacOS X toolchain, some stuff may be generated in the form of subdirs
+.PHONY: mostlyclean-util
+mostlyclean-util:
+	rm -rf util/txt2c.dSYM
+
 MOSTLYCLEANFILES = mtn.1 \
 	run_tester_tests   run_func_tests   run_unit_tests   run_extra_tests \
 	test/tester.status test/func.status test/unit.status test/extra.status
@@ -881,7 +886,7 @@ distcheck-base.hh:
 .PHONY: distcheck-base.hh
 distcheck-base.hh:
 	cd $(srcdir) && $(SHELL) util/audit-includes \
-		$(sort $(mtn_SOURCES) $(test_unit_tester_SOURCES) $(test_bin_tester_SOURCES) \
+		$(sort $(mtn_SOURCES) $(test_bin_unit_tester_SOURCES) $(test_bin_tester_SOURCES) \
                        $(UNIX_PLATFORM_SOURCES) $(WIN32_PLATFORM_SOURCES) \
                        src/win32/main.cc src/unix/main.cc)
 
@@ -896,7 +901,7 @@ uninstall-local: uninstall-nls \
 	install-contrib-data install-examples-data
 uninstall-local: uninstall-nls \
 	uninstall-contrib-data uninstall-examples-data
-mostlyclean-local: mostlyclean-tests
+mostlyclean-local: mostlyclean-tests mostlyclean-util
 check-local: check-testers
 
 # All hooks supported by automake here, depending on all the things we want
============================================================
--- NEWS	282addc1d59cc722b9e713aa5e04605e9bd2289d
+++ NEWS	54723cd3a325f76fc39e733ff3ff4372860afb5c
@@ -1,3 +1,74 @@
+XXX XXX XX XX:XX:XX UTC 201X
+
+        1.1 release.
+
+        Changes
+
+        New features
+
+        - 'automate atttributes' now also works without a workspace
+          and returns the attributes for a specific file from the
+          revision's manifest
+
+        - New 'erase_descendants' automate command which returns all
+          input revisions, except those that are a descendant of
+          another revision in the input.
+
+        - New 'min(A)' selector is now available which returns all
+          revisions selected by A which are not descendants of other
+          revisions selected by A.
+
+        - New 'not(A)' selector is now available which returns all
+          revisions not selected by 'A'.
+
+        - All certs for a revision are now output by 'mtn log' with
+          'suspend', 'testresult', and custom certs placed under a
+          a new 'Other certs' heading.
+
+        - New conflict 'dropped/modified' allows explicitly resolving
+          the case of a file that is dropped on one side of a merge,
+          and modified on the other. Previously, the modifications
+          were always lost; now you have the option of re-adding the
+          file with the modifications during merge conflict
+          resolution.
+
+        - New attribute 'mtn:resolve_conflict' allows specifying a
+          persistent 'drop' conflict resolution for a dropped/modified
+          conflict. This is useful in the case where the conflict will
+          occur again in the future, for example when a file that is
+          maintained in an upstream branch is not needed, and
+          therefore dropped, in a local branch.
+        
+        Bugs fixed
+
+        - Monotone now compiles against Botan 1.10.x (as well as most of
+          the testing releases in 1.9.y).
+
+        - Struct file_handle got renamed to avoid clash with newer glibc's
+          fcntl.h.
+
+        - Monotone now compiles just fine with gcc's option
+          "-Werror=format-security."
+
+        - Fixed recursive file removal on Solaris.
+
+        - Monotone now compiles against Lua 5.2 as well.
+
+        - mtn add and mtn list are now more consistent in their use of
+          --recursive and --unknown options.
+        
+        Internal
+
+        - The performance and memory usage of regular expressions has
+          been improved throughout. This affects any use of the
+          ".mtn-ignore" file such as "mtn ls unknown" and "mtn add",
+          and any calls to "regex.search" in Lua hooks.
+
+        Other
+
+        - 'mtn diff' now outputs old and new revision IDs in the diff header
+           when both are specified.
+
 Sat Mar 26 10:53:47 UTC 2011
 
         1.0 release.
============================================================
--- configure.ac	0c190a9066cfcdb0c2e94f7f436b7ae79ead2235
+++ configure.ac	195c8b95513b0490fe09ab6d6d44902aceda9b53
@@ -10,7 +10,7 @@ AC_PREREQ(2.58)
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.58)
-AC_INIT([monotone], [1.0], [https://code.monotone.ca/p/monotone/issues/], ,
+AC_INIT([monotone], [1.0.90], [https://code.monotone.ca/p/monotone/issues/], ,
 	[http://www.monotone.ca])
 AM_INIT_AUTOMAKE([1.9 tar-ustar dist-bzip2 no-dist-gzip std-options])
 AC_CONFIG_SRCDIR([src/app_state.cc])
============================================================
--- /dev/null	
+++ contrib/basicio.vim	ff652790f22fb5e3421c0b70b5c45d6c8d470d3b
@@ -0,0 +1,13 @@
+" Syntax highlighting for monotone basic_io format 
+" used by 'read-permissions', and 'write-permissions'
+"
+" Set up keywords and patterns we want to highlight
+syn match basicIOSymbol /[a-z_]*/
+syn region basicIOString start=+"+  skip=+\\\\\|\\"+  end=+"+
+syn match basicIOHexID /\[[a-fA-F0-9]*\]/
+
+" Set up sane default highlighting links, such as basicIOString->String
+hi def link basicIOSymbol	Keyword
+hi def link basicIOString	String
+hi def link basicIOHexID	Identifier
+
============================================================
--- /dev/null	
+++ contrib/colortone.pl	4de0235589831da1b9daeeba18841074c240fe78
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+
+# colortone.pl - colors monotone output such as status, log and diff
+#
+# Reads input from STDIN and adds ANSI escape codes before outputting
+# to STDOUT. Passing filenames on the command line is also supported.
+#
+# Windows systems need Win32::Console::ANSI installed to support showing
+# color within cmd.exe.
+#
+# Usage
+# mtn diff | colortone.pl
+# mtn diff > diff.txt && colortone.pl diff.txt
+#
+# Windows Usage
+# To make it easier to use, create a new file 'myname.bat' with the
+# following contents (keeping quotes).
+#
+# @"C:\Program Files\monotone\mtn.exe" %* | perl "C:\Full\Path\To\colortone.pl"
+#
+# This allows you to use 'myname' as a replacement for mtn and output will
+# be colored automatically. Only use it if your key passphrase is not
+# required: diff, status, and log are fine.
+#
+# The piping has to be done through perl manually due to
+# http://support.microsoft.com/kb/321788.
+#
+# Copyright 2011 Richard Hopkins
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use Term::ANSIColor;
+
+if ( $^O eq 'MSWin32' ) {
+    require Win32::Console::ANSI;
+    import  Win32::Console::ANSI;
+}
+
+# pattern => attributes
+#
+# pattern should contain a grouping as only the group will be colored.
+#
+# attributes is a single string containing any attributes supported by
+# Term::ANSIColor separated with a space.
+# eg. 'red on_white bold'
+my %patterns = (
+    q/(^#.*)/             => 'yellow',          # diff header
+    q/(^@@.*)/            => 'magenta',         # diff encloser
+    q/(^\+.*)/            => 'green',           # diff added
+    q/(^\|\s+\+.*)/       => 'green',           # diff added (with graph)
+    q/(^-.*)/             => 'red',             # diff removed
+    q/(^\|\s+-.*)/        => 'red',             # diff removed (with graph)
+    q/([a-f0-9]{40})/     => 'magenta bold',    # revision or file id
+    q/(^\| +\w+:)/        => 'white bold',      # log header (with graph)
+    q/(^\w+:)/            => 'white bold',      # status header
+    q/(^\*\*\*.+\*\*\*$)/ => 'yellow bold',     # status warning
+    q/(  added)/          => 'green',           # status added
+    q/(  patched)/        => 'cyan bold',       # status patched
+    q/(  dropped)/        => 'red',             # status dropped
+    q/(  renamed)/        => 'blue bold',       # status renamed
+);
+
+my $reset = color('reset');
+
+while (<>) {
+
+    # colorize any matching patterns in the current line.
+    foreach my $pattern ( keys %patterns ) {
+        my $color = color( $patterns{$pattern} );
+        $_ =~ s/$pattern/$color$1$reset/;
+    }
+
+    print colored $_;
+}
+
+exit(0);
============================================================
--- /dev/null	
+++ contrib/mtn-export-revisions.pl	c5cf12354570aa798414a85883961afd8a8e116e
@@ -0,0 +1,83 @@
+#! /usr/bin/env perl
+use strict;
+use warnings;
+
+# mtn-export-revisions.pl - exports revisions into montone packet format
+#
+# Reads revision IDs from STDIN and exports any fdata, fdelta, rdata,
+# pubkey, and cert packets ready to be fed to "mtn read"; for example on
+# a different machine or database. The revision IDs from STDIN can be in
+# any order as they are automatically toposorted.
+#
+# Alternatively, you can pass selectors on the command line.
+#
+# BUGS:
+# This script was bodged, but it should instead
+#   + be written by someone who actually knows Perl
+#   + use Tony's excellent Monotone::AutomateStdio Perl library
+# 
+use List::MoreUtils 'uniq';
+
+# export_revision($revision_id)
+sub export_revision {
+    my $id = shift;
+    print STDERR "Exporting revision: $id\n";
+    my $revision = `mtn au get_revision $id`;
+    print STDERR $revision;
+
+    print STDERR "Files\n";
+    my @files = $revision =~ /add_file.*?\n content \[([a-f0-9]{40})\]\n/gs;
+    foreach (@files) {
+        print STDERR "  file '$_'\n";
+        print `mtn au packet_for_fdata $_`;
+    }
+
+    print STDERR "Patches\n";
+    my %patches = $revision =~
+      /patch.*?\n from \[([a-f0-9]{40})\]\n   to \[([a-f0-9]{40})\]/gs;
+    foreach ( keys %patches ) {
+        print STDERR "  patch from '$_' to '$patches{$_}'\n";
+        print `mtn au packet_for_fdelta $_ $patches{$_}`;
+    }
+
+    print STDERR "Public keys\n";
+    my $certs_output = `mtn au certs $id`;
+    my @pubkeys = $certs_output =~ /      key \[([a-f0-9]{40})\]/;
+    foreach ( uniq(@pubkeys) ) {
+        print STDERR "  pubkey '$_'\n";
+        print `mtn au get_public_key $_`;
+    }
+
+    print `mtn au packet_for_rdata $id`;
+    print `mtn au packets_for_certs $id`;
+}
+
+sub get_revisions {
+    my @revisions;
+
+    if ( $#ARGV == -1 ) {
+        while ( my $id = <STDIN> ) {
+            chomp $id;
+            push( @revisions, $id );
+        }
+    }
+    else {
+        foreach my $selector (@ARGV) {
+            my @selected = split( "\n", `mtn au select $selector` );
+            foreach my $id (@selected) {
+                push( @revisions, $id );
+            }
+        }
+    }
+
+    return join( ' ', @revisions );
+}
+
+my $revisions = get_revisions;
+my @toposorted = split( "\n", `mtn au toposort $revisions` );
+
+foreach my $id (@toposorted) {
+    export_revision($id);
+}
+
+exit(0);
============================================================
--- /dev/null	
+++ contrib/mtncommit.vim	edafe2ebd93351bb290baa1db5b9313dab3237a6
@@ -0,0 +1,20 @@
+" Syntax highlighting for monotone commit log messages
+"
+" Set up keywords and patterns we want to highlight
+syn match mtnCommitAdded /\ \ added/
+syn match mtnCommitCancelLine /\*\*\* REMOVE THIS LINE TO CANCEL THE COMMIT \*\*\*/
+" Highlight cert names such as Author: and Branch:
+syn match mtnCommitCertName /^.*: /
+syn match mtnCommitComment /--.*$/
+syn match mtnCommitPatched /\ \ patched/
+syn match mtnCommitRemoved /\ \ removed/
+
+" Set up sane default highlighting links, such as mtnCommitComment->Comment
+hi def link mtnCommitAdded	diffAdded
+hi def link mtnCommitCancelLine	Error
+hi def link mtnCommitCertName	Identifier
+hi def link mtnCommitComment	Comment
+hi def link mtnCommitPatched	diffChanged
+hi def link mtnCommitRemoved	diffRemoved
+
+
============================================================
--- cygport/README.txt	361e69b992054b76cba996af183076b6a2cd0bce
+++ cygport/README.txt	7edb410cb14ee2da1875ee18d12c881d0778b7dc
@@ -9,8 +9,13 @@
     edit *.cygport and/or *.patch as needed
     add the new version to Port Notes in *.patch
 
-$ cd ../monotone-build_cygwin; make dist-gzip
-$ cp ../monotone-build_cygwin/monotone-$NEW.tar.gz .
+download monotone-$NEW.tar.bz2 from http://www.monotone.ca/downloads.php
+    to monotone/cygport directory
+
+    or build dist-gzip, copy to here
+
+$ bunzip2 monotone-$NEW.tar.bz2
+$ gzip monotone-$NEW.tar
 $ cygport monotone-$NEW-1 all
 $ cp monotone-$NEW-1/spkg/monotone.cygwin.patch .
 
============================================================
--- cygport/monotone.cygwin.patch	db390a58c5769095af2f36d20dcba1c6609e99da
+++ cygport/monotone.cygwin.patch	e6c67e0555b8a25a94cad440d17a006fdfbb6d88
@@ -1,6 +1,6 @@
 --- origsrc/monotone-1.0/CYGWIN-PATCHES/README	1970-01-01 01:00:00.000000000 +0100
 +++ src/monotone-1.0/CYGWIN-PATCHES/README	2010-11-03 20:05:14.793224700 +0100
-@@ -0,0 +1,127 @@
+@@ -0,0 +1,130 @@
 +monotone
 +------------------------------------------
 +monotone is a free distributed version control system. it provides a simple,
@@ -67,6 +67,9 @@
 +
 +Port Notes:
 +
++----------  monotone-1.00-1 -- 2011-04-30 -----------
++Upstream major release. No patch needed.
++
 +----------  monotone-0.99.1-1 -- 2010-11-03 -----------
 +Upstream major release. No patch needed.
 +
============================================================
--- doc/monotone.texi	0e40017dfe8ba652e6af4585a2ac176c8bd12dcc
+++ doc/monotone.texi	2d2a1a9c79e57fffe52a876d912e71355524d91b
@@ -39,7 +39,7 @@
 Copyright @copyright{} 2006 Alex Queiroz @*
 Copyright @copyright{} 2006, 2007 William Uther @*
 Copyright @copyright{} 2006 - 2010 Thomas Keller @*
-Copyright @copyright{} 2007 - 2011 Stephen Leake @*
+Copyright @copyright{} 2007 - 2012 Stephen Leake @*
 
 This manual is made available under the GNU GPL version 2.0 or
 greater.  See the accompanying file COPYING for details.
@@ -2935,6 +2935,14 @@ @heading Composite selectors
 example, @code{difference(a:graydon;b:net.venge.monotone)} would return all
 revisions which have an @code{author} cert beginning with @code{graydon} which
 are not in the branch @code{net.venge.monotone}.
address@hidden not(A)
+Set complement; this returns all revisions not selected by A. For example,
address@hidden(c:testresult)} would return all revisions which do not have any
address@hidden certs. Conceptually @code{not(A)} is equivalent to
address@hidden(*, A)}, where @code{*} selects all revisions. The previous
+example to return all revisions which have an @code{author} cert beginning
+with @code{graydon} and are not in the branch @code{net.venge.monotone},
+can be written as @code{a:graydon/not(b:net.venge.monotone)}.
 @item lca(A;B)
 Least common ancestors; this is identical to
 @code{max((ancestors(A)|A)/(ancestors(B)|B))},
@@ -2949,6 +2957,11 @@ @heading Composite selectors
 @code{max(b:net.venge.monotone/a:graydon)} would return the latest revision(s)
 on branch @code{net.venge.monotone} which have an @code{author} cert beginning
 with @code{graydon}.
address@hidden min(A)
+Erase descendants; this returns all revisions selected by @code{A} which are not
+descendants of other revisions selected by @code{A}. For example,
address@hidden(b:net.venge.monotone)} would return the earliest revision(s)
+on branch @code{net.venge.monotone}.
 @item ancestors(A)
 Strict ancestors; returns all revisions which are an ancestor of a revision
 selected by @code{A}. For example, @code{ancestors(b:net.venge.monotone)}
@@ -3238,7 +3251,8 @@ @section Merge Conflicts
 with new conflicts and resolutions, to merge the remaining heads.
 
 For the special case of file content conflicts, a merge command
-invoked without @option{--resolve-conflicts} will attempt to start an
+invoked without @option{--resolve-conflicts} will attempt to use an
+internal content merger; if that fails, it will attempt to start an
 external interactive merge tool; the user must then resolve the conflicts
 and terminate the merge tool, letting monotone continue with the
 merge. This process is repeated for each file content conflict. See
@@ -3264,7 +3278,7 @@ @subsection Conflict Types
 Monotone versions files, directories, and file attributes explicitly,
 and it tracks individual file and directory identity from birth to
 death so that name changes throughout the full life-cycle can be
-tracked exactly.  Partly because of these qualities, monotone notices
+tracked exactly. Partly because of these qualities, monotone notices
 several types of conflicts that other version control systems may not.
 
 The two most common conflicts are described first, then all other
@@ -3281,17 +3295,21 @@ @subheading File Content Conflict
 has a @code{mtn:manual_merge} attribute with value @code{true}. If
 not, it uses an internal merge algorithm to detect whether the changes
 are to the same lines of the file. If they are not, monotone will use
-the result of the internal merge as the new file version.
+the result of the internal merge as the new file version. Note that
+this may not always be what the user wants; if the same line is added
+at two different places in the file, it will be in the result twice.
 
address@hidden:manual_merge} is set @code{true} when a file is
address@hidden for all files for which the @code{binary_file} hook
-returns true; see @ref{attr_init_functions}.
address@hidden:manual_merge} is automatically set @code{true} when a file
+is @command{add}ed for which the @code{binary_file} hook returns true;
+see @ref{attr_init_functions}. The user may also set the
address@hidden:manual_merge} attribute manually; see @address@hidden attr}}.
 
 If @code{mtn:manual_merge} is present and @code{true}, or if the
 changes are to the same lines of the file, and neither
 @option{--resolve-conflicts} nor @option{--non-interactive} was
 specified, the @ref{merge3} hook is called, with the content of both
-conflicting versions and their common ancestor.
+conflicting versions and their common ancestor. When the hook returns,
+the merge proceeds to the next conflict.
 
 Alternatively, you can use your favorite merge tool asychronously with
 the merge, and specify the result file in the conflicts file, using
@@ -3472,8 +3490,57 @@ @subheading Missing Root Conflict
 See the @command{pivot_root} command for more information on moving
 another directory to the project root.
 
address@hidden does not yet support resolving this conflict.
address@hidden does not support resolving this conflict.
 
address@hidden Dropped/Modified file Conflict
address@hidden
+This conflict occurs when a file is dropped in one merge parent,
+and modified in the other.
+
address@hidden supports resolving this conflict; the possible
+resolutions are to drop the file in the result, keep the modified
+version, or keep a user supplied version.
+
+In addition, the attribute @command{mtn:resolve_conflict} may be used
+to specify a @command{drop} resolution for this
+conflict. @command{--resolve-conflicts} must be specified on the merge
+command for the attribute to be processed. Note that a
address@hidden/conflicts} file left over from a previous merge will be
+processed when @command{--resolve-conflicts} is specified; the user must
+delete such files when they are no longer needed.
+
+The attribute is useful in the case where the conflict will occur
+again in the future, for example when a file that is maintained in an
+upstream branch is not needed, and therefore dropped, in a local
+branch. The user only needs to specify the conflict resolution once,
+via the attribute.
+
+Because of the @emph{die-die-die} policy, monotone internally must
+first drop the modified file, and then add a new file with the same
+name and the desired contents. This means history is disconnected;
+when @command{mtn log} is later run for the file, it will stop at this
+merge, not showing the previous history for the file. That history is
+still there; the user can see it by starting @command{mtn log} again
+for the same file but in the parent of the merge.
+
+Note that we don't need a @command{keep} value for the
address@hidden:resolve_conflict} attribute; if the local branch keeps a
+file that the upstream branch drops, the first keep resolution will
+break history, and the conflict will not occur again.
+
+A special case occurs when the user re-adds the file after dropping
+it, then attempts to merge. In this case, the possible resolutions are
+to keep the re-added version, or keep a user modified version,
+replacing the re-added version (drop is not a valid resolution).
+
+There is no such thing as a dropped/modified directory; if the
+directory is empty, the only possible change is rename, which is
+ignored.
+
+If the directory is not empty, that creates a special case of
+dropped/modified file conflict; if the file is kept, it must also be
+renamed to an existing directory.
+
 @subheading Invalid Name Conflict
 
 Monotone reserves the name @file{_MTN} in a workspace root directory
@@ -3696,14 +3763,13 @@ @section Quality Assurance
 test, or testsuite.
 @end itemize
 
-The evaluation of trust is done on a cert-by-cert basis by calling a
-set of Lua hooks: @ref{get_revision_cert_trust},
address@hidden, and @ref{get_file_cert_trust}.  These
-hooks are only called when a cert has at least one good signature from
-a known key, and are passed @emph{all} the keys which have signed the
-cert, as well as the cert's ID, name and value. The hook can then
-evaluate the set of signers, as a group, and decide whether to grant
-or deny trust to the assertion made by the cert.
+The evaluation of trust is done on a cert-by-cert basis by calling the
+Lua hook @ref{get_revision_cert_trust}.  This hook is only called
+when a cert has at least one good signature from a known key, and are
+passed @emph{all} the keys which have signed the cert, as well as the
+cert's ID, name and value. The hook can then evaluate the set of
+signers, as a group, and decide whether to grant or deny trust to the
+assertion made by the cert.
 
 The evaluation of testresults is controlled by the
 @code{accept_testresult_change} hook (see @ref{accept_testresult_change}).
@@ -4220,7 +4286,7 @@ @section Exporting to GIT
 $ mkdir test.git
 $ cd test.git
 $ git init
-$ mtn --db test.mtn git_export | git fast import
+$ mtn --db test.mtn git_export | git fast-import
 @end group
 @end smallexample
 
@@ -4316,7 +4382,10 @@ @section Using packets
 We will create two databases, A and B, then create a few revisions in
 A, and transfer part of them to B.
 
-First we initialize the databases:
+First we initialize the databases (we assume you have a key for
+commits already):
address@hidden see ../test/func/using_packets/__driver__.lua for implementation of
address@hidden this example; keep that up to date if changing this.
 
 @smallexample
 @group
@@ -4363,7 +4432,7 @@ @section Using packets
 @smallexample
 @group
 $ cd ..
-$ mtn -d A automate select i: | mtn -d A automate toposort address@hidden
+$ mtn -d A automate select i: | mtn -d A automate toposort -@@-
 a423db0ad651c74e41ab2529eca6f17513ccf714
 d14e89582ad9030e1eb62f563c8721be02ca0b65
 151f1fb125f19ebe11eb8bfe3a5798fcbea4e736
@@ -4393,25 +4462,29 @@ @section Using packets
 We should transfer:
 
 @enumerate
address@hidden the key used to sign things
 @item The file data (fdata) and file deltas (fdeltas), if any
 @item The release data (rdata)
 @item The certs
 @end enumerate
 
-In that order. This is because certs make reference to release data, and release data
-makes reference to file data and file deltas.
+In that order. This is because certs make reference to revision data
+and keys, and revision data makes reference to file data and file
+deltas.
 
 @smallexample
 @group
+mtn -d A pubkey johndoe@@domain.com > KEY_PACKETS
 mtn -d A automate packet_for_fdata 8714e0ef31edb00e33683f575274379955b3526c > PACKETS
 mtn -d A automate packet_for_rdata a423db0ad651c74e41ab2529eca6f17513ccf714 >> PACKETS
 mtn -d A automate packets_for_certs a423db0ad651c74e41ab2529eca6f17513ccf714 >> PACKETS
-mtn -d B read < PACKETS
+mtn -d B read KEY_PACKETS PACKETS
 @end group
 @end smallexample
 
-This revision (a423db0ad651c74e41ab2529eca6f17513ccf714) was already sent to database
-B. You may want to check the PACKETS file to see what the packets look like.
+Database B now contains revision
+a423db0ad651c74e41ab2529eca6f17513ccf714. You may want to check the
+PACKETS file to see what the packets look like.
 
 Now let's transfer one more revision:
 
@@ -4439,7 +4512,8 @@ @section Using packets
 @smallexample
 @group
 mtn -d A automate packet_for_fdata d2178687226560032947c1deacb39d16a16ea5c6 > PACKETS2
-mtn -d A automate packet_for_fdelta 8714e0ef31edb00e33683f575274379955b3526c 8b52d96d4fab6c1e56d6364b0a2673f4111b228e >> PACKETS2
+mtn -d A automate packet_for_fdelta
+8714e0ef31edb00e33683f575274379955b3526c 8b52d96d4fab6c1e56d6364b0a2673f4111b228e >> PACKETS2
 mtn -d A automate packet_for_rdata d14e89582ad9030e1eb62f563c8721be02ca0b65 >> PACKETS2
 mtn -d A automate packets_for_certs d14e89582ad9030e1eb62f563c8721be02ca0b65 >> PACKETS2
 mtn -d B read < PACKETS2
@@ -4451,35 +4525,27 @@ @section Using packets
 
 @smallexample
 @group
-$ mtn -d A automate select i: | mtn -d A automate toposort address@hidden
+$ mtn -d A automate select i: | mtn -d A automate toposort -@@-
 a423db0ad651c74e41ab2529eca6f17513ccf714
 d14e89582ad9030e1eb62f563c8721be02ca0b65
 151f1fb125f19ebe11eb8bfe3a5798fcbea4e736
 
-$ mtn -d B automate select i: | mtn -d B automate toposort address@hidden
+$ mtn -d B automate select i: | mtn -d B automate toposort -@@-
 a423db0ad651c74e41ab2529eca6f17513ccf714
 d14e89582ad9030e1eb62f563c8721be02ca0b65
 @end group
 @end smallexample
 
-Good! B has the two first revisions (as expected), and A has all three. However, a checkout
-of that branch on B will not work, because the certificate signatures cannot be verified.
-We need to transfer the signatures too (suppose the key used had the ID @code{"johndoe@@domain.com"}):
+Good! B has the two first revisions (as expected), and A has all
+three. We can checkout from B:
 
 @smallexample
 @group
-mtn -d A pubkey johndoe@@domain.com > KEY_PACKETS
-mtn -d B read < KEY_PACKETS
address@hidden group
address@hidden smallexample
-
-Done.
-
address@hidden
address@hidden
 $ mtn -d B co -b test test-B
 $ ls test-B
-file2  _MTN  x
+file file2  _MTN
+$ more test-B/file
+ERASE
 $ more test-B/file2
 file 2 getting in
 @end group
@@ -4487,7 +4553,6 @@ @section Using packets
 
 And that's it! The revisions were successfully transferred.
 
-
 @page
 @node    Bisecting,  , Using packets, Advanced Uses
 @section Bisecting
@@ -4590,7 +4655,8 @@ @chapter Command Reference
 The Lua hook @address@hidden can change the
 default value for any option.
 
-Revision arguments to commands may be selectors or hex ids.
+Revision arguments to commands (but not to automate commands) may be
+selectors (see @ref{Selectors}) or hex ids.
 
 @menu
 * Global and Common Options::   Options that affect all or many commands
@@ -4799,7 +4865,9 @@ @subsection Global Options
 
 @item --xargs <arg>
 @itemx -@@ <arg>
-Insert command line arguments taken from the given file.
+Insert command line arguments taken from the given file. A '-'
+can be used to read the arguments from standard input.
+e.g. @code{--xargs=-}
 @end ftable
 
 @node Common Options,  , Global Options, Global and Common Options
@@ -4843,7 +4911,7 @@ @section Tree
 @anchor{mtn address@hidden mtn checkout [--[no-]move-conflicting-paths] address@hidden @var{directory}
 @itemx mtn checkout [--[no-]move-conflicting-paths] address@hidden @var{directory}
 @itemx mtn co
address@hidden is an alias for @command{checkout}
address@hidden is an alias for @command{checkout}. See @ref{Selectors}.
 
 These commands copy a revision @var{id} out of your database,
 recording the chosen revision (the @dfn{base revision}) in the file
@@ -4892,9 +4960,9 @@ @section Tree
 See @ref{Conflicts}
 
 @anchor{mtn address@hidden mtn explicit_merge [--[no-]update] @var{id} @var{id} @var{destbranch}
-See the online help for options. See @ref{--update}.
+See the online help for options. See @ref{--update}. See @ref{Selectors}.
 
-This command merges exactly the two @var{id}s you give it, and places
+This command merges exactly the two revision @var{id}s you give it, and places
 the result in branch @var{destbranch}.  It is useful when you need more
 control over the merging process than @command{propagate} or @command{merge}
 give you.  For instance, if you have a branch with three heads, and you
@@ -4917,7 +4985,7 @@ @section Tree
 
 @anchor{mtn address@hidden mtn import address@hidden address@hidden [--[no-]dry-run] @var{dir}
 @itemx mtn import address@hidden address@hidden [--[no-]dry-run] @var{dir}
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command imports the contents of the given directory and commits it
 to the head of the given branch or as a child of the given revision (and
@@ -4948,7 +5016,7 @@ @section Tree
 to be the given revision or the head of the given branch instead of the
 null revision.
 
address@hidden address@hidden mtn merge address@hidden [--message @var{string}] [--message-file @var{filename}] [--[no-]update]
address@hidden address@hidden mtn merge address@hidden [--message @var{string}] [--message-file @var{filename}] [--[no-]update] [--resolve-conflicts]
 See the online help for more options. See @ref{--update}.
 
 This command merges the ``heads'' of @var{branchname} (default the
@@ -4968,7 +5036,8 @@ @section Tree
 algorithm. The process then repeats for each additional head, using
 the result of each previous merge as an input to the next.
 
address@hidden Conflicts} can occur.
address@hidden Conflicts} for conflicts that can occur, and the use of
address@hidden
 
 @item mtn merge_into_dir [--[no-]update] @var{sourcebranch} @var{destbranch} @var{dir}
 This command takes a unique head from @var{sourcebranch} and merges it
@@ -4992,10 +5061,10 @@ @section Tree
 @ref{Merge Conflicts} can occur. See @ref{--update}.
 
 @anchor{mtn address@hidden mtn merge_into_workspace [--[no]-move-conflicting-paths] @var{revision}
-Merges @var{revision} into the current workspace; the result is not
-committed to the database. There can be no pending changes in the
-current workspace. The workspace's selected branch is not
-changed.
+Merges @var{revision} (see @ref{Selectors}) into the current
+workspace; the result is not committed to the database. There can be
+no pending changes in the current workspace. The workspace's selected
+branch is not changed.
 
 When a later commit is done, both @var{revision} and the workspace's
 base revision will be recorded as parents.
@@ -5055,6 +5124,8 @@ @section Tree
 or within an existing directory full of files, prior to using
 @command{mtn commit}.
 
+On Windows, workspaces cannot be located in the root directory of a
+device; for example, @file{d:/} is an invalid directory for a workspace.
 @end ftable
 
 @page
@@ -5090,10 +5161,10 @@ @subheading Commands
 @ftable @command
 @item mtn conflicts store address@hidden address@hidden @var{right_rev_id}]
 Store the conflicts encountered by merging @var{left_rev_id} with
address@hidden, in the specified file (defaults to
address@hidden/conflicts}. If @var{left_rev_id} and @var{right_rev_id} are
-not given, the first two heads that the @command{merge} command would
-merge are used.
address@hidden (revision ids; see @ref{Selectors}), in the
+specified file (defaults to @file{_MTN/conflicts}. If
address@hidden and @var{right_rev_id} are not given, the first two
+heads that the @command{merge} command would merge are used.
 
 The conflicts file format is as output by the @command{automate
 show_conflicts} command; see @address@hidden automate show_conflicts}}.
@@ -5109,11 +5180,11 @@ @subheading Commands
 @item mtn conflicts show_remaining address@hidden
 Show remaining unresolved conflicts in the conflicts file.
 
address@hidden mtn conflicts resolve_first address@hidden @var{resolution}
address@hidden conflicts address@hidden mtn conflicts resolve_first address@hidden @var{resolution}
 Specify a resolution for the first conflict in the conflicts file; it
 must be a single file conflict. The conflicts file is updated.
 
address@hidden conflicts address@hidden mtn conflicts resolve_first_left address@hidden @var{resolution}
address@hidden mtn conflicts resolve_first_left address@hidden @var{resolution}
 @itemx mtn conflicts resolve_first_right address@hidden @var{resolution}
 Specify a resolution for one of the files in the first conflict in the
 conflicts file; it must be a two file conflict. The conflicts file is
@@ -5126,11 +5197,11 @@ @subheading Commands
 convenient way to clean up.
 @end ftable
 
address@hidden Single file conflict resolutions
address@hidden Conflict resolutions
 
-For single file conflicts, there are several possible
-resolutions. Note that @command{resolved_user_left} is used even for
-single file conflicts.
+For single and two file conflicts, there are several possible
+resolutions. In the conflicts file, @command{resolved_user_left} is
+used for single file conflicts.
 
 @ftable @command
 @item interactive address@hidden
@@ -5141,62 +5212,47 @@ @subheading Single file conflict resolut
 specified, @var{file} defaults to @file{_MTN/resolutions/<path>},
 where @file{<path>} is the path to the file that has the conflict.
 
-This inserts a @command{resolved_user_left @var{file}} conflict resolution in the
+This inserts a @command{resolved_user_left @var{file}} or
address@hidden @var{file}} conflict resolution in the
 conflicts file.
 
 @item user @var{file}
 The file contents are replaced by the contents of the specified file.
 
-This inserts a @command{resolved_user_left @var{file}} conflict resolution in the
+This inserts a @command{resolved_user_left @var{file}} or
address@hidden @var{file}} conflict resolution in the
 conflicts file.
 
 @item drop
-The file is dropped in the merge. This is useful for an orphaned file
-conflict.
+The file is dropped in the merge.
 
-This inserts a @command{resolved_drop_left} conflict resolution in the
-conflicts file.
+This inserts a @command{resolved_drop_left} or
address@hidden conflict resolution in the conflicts
+file.
 
 @item rename @var{filename}
-The file is renamed. This is useful for an orphaned file conflict.
+The file is renamed.
 
-This inserts a @command{resolved_rename_left @var{filename}} conflict resolution
-in the conflicts file.
+This inserts a @command{resolved_rename_left @var{filename}} or
address@hidden @var{filename}} conflict resolution in
+the conflicts file.
 
address@hidden ftable
address@hidden user_rename @var{contents_file} @var{rename_file}
+The file contents are replaced by the contents of the specified file,
+and renamed.
 
address@hidden Two file conflict resolutions
+This inserts a @command{resolved_user_left @var{contents_file}} or
address@hidden @var{contents_file}} conflict resolution
+in the conflicts file, and a @command{resolved_rename_left
address@hidden or @command{resolved_rename_right
address@hidden conflict resolution.
 
-For two file conflicts, the possible resolutions are:
-
address@hidden @command
address@hidden drop
-The file is dropped in the merge.
-
-This inserts a @command{resolved_drop_left} or @command{resolved_drop_right}
-conflict resolution in the conflicts file.
-
 @item keep
 The file is kept in the merge.
 
 This inserts a @command{resolved_keep_left} or @command{resolved_keep_right}
 conflict resolution in the conflicts file.
 
address@hidden rename @var{filename}
-The file is renamed.
-
-This inserts a @command{resolved_rename_left @var{filename}} or
address@hidden @var{filename}} conflict resolution in
-the conflicts file.
-
address@hidden user @var{file}
-The file contents are replaced by the contents of the specified file.
-The other file in the conflict must be dropped or renamed.
-
-This inserts a @command{resolved_user_left @var{file}} or
address@hidden @var{file}} conflict resolution in the
-conflicts file.
-
 @end ftable
 
 monotone internals note: we don't provide an @code{interactive}
@@ -5218,13 +5274,13 @@ @section Workspace
 
 As a convenience, the @option{--unknown @var{pathname...}} option can be used;
 this option will cause all of the files listed by @command{mtn list
-unknown @var{pathname...}} to be added.
+unknown @var{pathname...}} to be added. However, note that the default
+for @command{list unknown} is @option{--recursive}, while the default
+for @command{add} is @option{--no-recursive}.
 
 Adding directories, whether explicitly or using the @option{--unknown}
 option, is non-recursive by default.  The @command{add} command can be
-made recursive using the @option{--recursive} option.  When adding a
-directory non-recursively, monotone will warn if the directory has
-any files that would be added by a recursive add.
+made recursive using the @option{--recursive} option.
 
 @anchor{mtn address@hidden mtn attr
 Manage @ref{File Attributes}.
@@ -5246,6 +5302,23 @@ @section Workspace
 
    @end table
 
+Several attributes are reserved for mtn use; they all start with ``mtn:'':
+    @table @command
+    @item mtn:encoding
+    Specify character encoding for the file.
+
+    @item mtn:execute
+    File is executable.
+
+    @item mtn:manual_merge
+    Don't use internal or external diff or merger.
+
+    @item mtn:resolve_conflict
+    Specify @command{drop} resolution for a recurring dropped/modified
+    conflict (@ref{dropped_modified_conflict}).
+
+    @end table
+
 @anchor{mtn address@hidden mtn commit
 @itemx mtn commit address@hidden address@hidden address@hidden
 @itemx mtn commit address@hidden address@hidden
@@ -5469,7 +5542,7 @@ @section Workspace
 
 @anchor{mtn address@hidden mtn pluck [--[no-]move-conflicting-paths] address@hidden
 @itemx mtn pluck [--[no-]move-conflicting-paths] address@hidden address@hidden
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command takes changes made at any point in history, and attempts to
 edit your current workspace to include those changes.  The end result is
@@ -5522,6 +5595,10 @@ @section Workspace
 This command also moves any attributes on @var{src} to @var{dst}; see
 @ref{File Attributes} for more details.
 
+Note that you cannot rename a branch. You can accomplish something
+similar by creating a new branch with the desired name, using the
address@hidden approve} command to add a branch name to the desired revision.
+
 @anchor{mtn address@hidden mtn revert @var{pathname...}
 @itemx mtn revert --missing @var{pathname...}
 See the online help for more options.
@@ -5545,7 +5622,7 @@ @section Workspace
 @anchor{mtn address@hidden mtn update [--[no-]move-conflicting-paths] [--branch @var{branchname}]
 @itemx mtn update [--[no-]move-conflicting-paths] address@hidden
 This command changes your workspace to have the a different revision as
-the base revision.
+the base revision. See @ref{Selectors}.
 
 @command{update} performs 3 separate stages. If any of these stages
 fails, the update aborts, doing nothing. The first two stages select
@@ -5645,16 +5722,20 @@ @section Network
 @anchor{netsync uri}
 @smallexample
 @group
-<scheme>://[[<user>@@]<host>[:<port>]][/<path>][?<pattern>[;-<exclude-pattern>[...]]]
+<scheme>://[[<user>@@]<host>[:<port>]][/<path>][?[-]<pattern>[;[-]<pattern>]...]
 @end group
 @end smallexample
 
+Branches matching a pattern are excluded if the pattern is preceded by
+'-', included otherwise.
+
 Valid examples of URIs monotone accepts are:
 
 @smallexample
 @group
 mtn://my.server:4690?my.branch
 mtn://my.server/project?my.other.branch*;-my.other.branch.test
+mtn://my.server/project?one.branch;-one.branch.test;another.branch;-another.branch.test
 file:///path/to/database.mtn?my.branch
 ssh://joe@@my.server/~/db.mtn?joes.branch
 @end group
@@ -5759,9 +5840,9 @@ @section Network
 Finally, @command{clone} copies the files out of the newly created
 database into a local directory, just as @command{checkout} would.  If
 no @var{directory} is given, the @var{branchname} is used as
-directory. If @option{--revision} is given, that revision must be on
-the specified branch, and is checked out; otherwise the head of the
-branch is checked out.
+directory. If @option{--revision} is given (see @ref{Selectors}), that
+revision must be on the specified branch, and is checked out;
+otherwise the head of the branch is checked out.
 
 @strong{Important notice:} The @var{address}[:@var{port}] @var{branchname}
 call syntax is deprecated and subject to removal in future versions of monotone!
@@ -5774,6 +5855,7 @@ @section Informative
 @ftable @command
 @item mtn annotate @var{file}
 @itemx mtn annotate address@hidden [--revs-only] @var{file}
+See @ref{Selectors}.
 
 Dumps an annotated copy of the file to stdout. The output is in the
 form:
@@ -5797,10 +5879,10 @@ @section Informative
 
 @item mtn bisect bad address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``bad'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5810,10 +5892,10 @@ @section Informative
 
 @item mtn bisect good address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``good'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5828,10 +5910,10 @@ @section Informative
 
 @item mtn bisect skip address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``skipped'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5853,16 +5935,18 @@ @section Informative
 
 @item mtn cat address@hidden @var{path}
 Write the contents of a specific file @var{path} in revision @var{id}
-(default to workspace base revision) to standard output.
+(see @ref{Selectors}; default to workspace base revision) to standard
+output.
 
 @item mtn complete file @var{partial-id}
 @itemx mtn complete key @var{partial-id}
 @itemx mtn complete revision @var{partial-id}
 
 These commands print out all known completions of a partial @sc{sha1}
-value, listing completions which are @code{file}, @code{manifest} or
address@hidden IDs depending on which variant is used. For
-example, suppose you enter this command and get this result:
+value (@emph{not} a selector), listing completions which are
address@hidden, @code{manifest} or @code{revision} IDs depending on which
+variant is used. For example, suppose you enter this command and get
+this result:
 
 @smallexample
 @group
@@ -5887,7 +5971,8 @@ @section Informative
 @itemx mtn diff address@hidden address@hidden
 @itemx mtn diff address@hidden address@hidden @var{pathname...}
 @itemx mtn di
address@hidden is an alias for @command{diff}. See online help for more options.
address@hidden is an alias for @command{diff}. See online help for more
+options. See @ref{Selectors}.
 
 These commands print out textual difference listings between various
 manifest versions. With no @option{--revision} options, @command{diff}
@@ -6057,7 +6142,8 @@ @section Informative
 
 @item mtn list duplicates address@hidden
 @itemx mtn ls duplicates
address@hidden duplicates} is an alias for @command{list duplicates}.
address@hidden duplicates} is an alias for @command{list duplicates}. See
address@hidden
 
 This command lists duplicate files in a given revision (defaults to
 the workspace base revision). Ignored and unknown files are excluded
@@ -6066,7 +6152,7 @@ @section Informative
 Two or more files are considered duplicates if the @sc{sha1} hashes of their
 contents are equal.
 
address@hidden mtn list ignored address@hidden
address@hidden mtn list ignored [--[no-]recursive] address@hidden
 @itemx mtn ls ignored
 @command{ls ignored} is an alias for @command{list ignored}.
 
@@ -6083,6 +6169,11 @@ @section Informative
 Specifying only the pathname "." will restrict the search for ignored
 files to the current subdirectory of the workspace.
 
+Default is @option{--recursive}; all directories will be
+traversed. Specifying @option{--no-recursive} restricts the listing to
+the root directory of the specified path (or the workspace, if no path
+is given).
+
 @item mtn list keys address@hidden
 @itemx mtn ls keys
 @command{ls keys} is an alias for @command{list keys}.
@@ -6134,7 +6225,7 @@ @section Informative
 given @var{pattern} (default all tags).  If @option{--exclude}
 options are provided they are used as globs to exclude specified tags.
 
address@hidden mtn list unknown address@hidden
address@hidden mtn list unknown [--[no-]recursive] address@hidden
 @itemx mtn ls unknown
 @command{ls unknown} is an alias for @command{list unknown}.
 
@@ -6150,6 +6241,11 @@ @section Informative
 Specifying only the pathname "." will restrict the search for unknown
 files to the current subdirectory of the workspace.
 
+Default is @option{--recursive}; all directories will be
+traversed. Specifying @option{--no-recursive} restricts the listing to
+the root directory of the specified path (or the workspace, if no path
+is given).
+
 @itemx mtn list vars address@hidden
 @itemx mtn ls vars
 @command{ls vars} is an alias for @command{list vars}.
@@ -6170,7 +6266,7 @@ @section Informative
 
 @anchor{mtn address@hidden mtn log
 @itemx mtn log address@hidden address@hidden address@hidden [...]] [--clear-from] address@hidden [...]] [--clear-to] address@hidden [...]] [--[no-]brief] [--[no-]merges] [--[no-]files] [--[no-]graph] [--[no-]diffs] address@hidden
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command prints out a log, in forward ancestry order by default
 but optionally in reverse ancestry order, of small history summaries.
@@ -6267,7 +6363,7 @@ @section Informative
 
 @item mtn show_conflicts @var{rev} @var{rev}
 This command shows what conflicts would need to be resolved in order to merge
-the given revisions; see @ref{Merge Conflicts}.
+the given revisions; see @ref{Merge Conflicts}, see @ref{Selectors}.
 
 Note that this does not show conflicts due to update commands, since
 in that case one revision is the workspace.
@@ -6315,7 +6411,7 @@ @section Review
 @section Review
 
 @ftable @command
address@hidden mtn approve @var{rev} address@hidden [--[no-]update]
address@hidden address@hidden mtn approve @var{rev} address@hidden [--[no-]update]
 This command puts @var{rev} on the branch @var{branchname} (defaults
 to the workspace branch).
 
@@ -6326,8 +6422,8 @@ @section Review
 
 @anchor{mtn address@hidden mtn comment @var{rev} address@hidden
 
-This adds a new comment to a committed revision.  If @var{comment} is
-not provided, it is obtained from the Lua hook
+This adds a new comment to a committed revision (see @ref{Selectors}).
+If @var{comment} is not provided, it is obtained from the Lua hook
 @address@hidden; the hook is passed an empty string.
 
 This command is a synonym for @command{mtn cert @var{rev} comment
@@ -6336,10 +6432,12 @@ @section Review
 @item mtn disapprove [--[no-]update] address@hidden @var{child}
 See online help for more options; see @ref{Common Options}. See @ref{--update}.
 
-This command records a disapproval of the changes between @var{parent}'s
-ancestor and @var{child}.  If @var{parent} is omitted, only @var{child}
-is disapproved.  The command does the disapproval by committing
-the @i{inverse} changes as a new revision descending from @var{child}.
+This command records a disapproval of the changes between
address@hidden's ancestor and @var{child}. @var{parent} and @var{child}
+are revision ids (see @ref{Selectors}). If @var{parent} is omitted,
+only @var{child} is disapproved.  The command does the disapproval by
+committing the @i{inverse} changes as a new revision descending from
address@hidden
 
 Conceptually, @command{disapprove}'s contract is that disapprove(A) gives a
 revision B such that whenever B is merged with a descendant D of A the merge
@@ -6354,10 +6452,11 @@ @section Review
 @anchor{mtn address@hidden mtn suspend [--[no-]update] [--branch @var{branchname}] @var{rev}
 See @ref{--update}.
 
-This makes @var{rev} invisible as a head of branch @var{branchname}
-(defaults to the current workspace branch).  Any operation that looks
-for heads will not count @var{rev}; this includes @address@hidden
-list branches}} as well as @address@hidden merge}} etc.
+This makes @var{rev} (a revision id; see @ref{Selectors}) invisible as
+a head of branch @var{branchname} (defaults to the current workspace
+branch).  Any operation that looks for heads will not count @var{rev};
+this includes @address@hidden list branches}} as well as
address@hidden@ref{mtn merge}} etc.
 
 If @var{rev} is not a head, @command{suspend} has no effect.
 
@@ -6370,8 +6469,9 @@ @section Review
 
 @item mtn tag @var{rev} @var{tagname}
 This command associates the symbolic name @var{tagname} with the
-revision @var{rev}, so that symbolic name can later be used in
address@hidden for specifying revisions.
+revision @var{rev} (a revision id; see @ref{Selectors}), so that
+symbolic name can later be used in selectors for specifying
+revisions.
 
 This command is a synonym for @command{mtn cert @var{rev} tag
 @var{tagname}}.
@@ -6424,7 +6524,7 @@ @section Key and Cert
 @anchor{mtn address@hidden mtn cert @var{selector} @var{certname} address@hidden
 
 Create a new certificate with name @var{certname}, for all
-revisions matching @var{selector}.
+revisions matching @var{selector} (see @ref{Selectors}).
 
 If @var{certval} is provided, it is the value of the certificate.
 Otherwise the certificate value is read from @code{stdin}.
@@ -6545,11 +6645,11 @@ @section Key and Cert
 
 @item mtn trusted @var{id} @var{certname} @var{certval} @var{signers}
 This command lets you test your revision trust hook
address@hidden  You pass it a revision ID, a
-certificate name, a certificate value, and one or more key IDs or key
-names, and it will tell you whether, under your current settings,
-Monotone would trust a cert on that revision with that value signed by
-those keys.
address@hidden  You pass it a revision ID (see
address@hidden), a certificate name, a certificate value, and one or
+more key IDs or key names, and it will tell you whether, under your
+current settings, Monotone would trust a cert on that revision with
+that value signed by those keys.
 
 The specified keys must exist either in your keystore or in the database.
 
@@ -6811,15 +6911,15 @@ @section Database
 
 @item mtn local kill_certs @var{selector} @var{certname} address@hidden
 This command deletes certs with the given name on revisions that match
-the given selector. If a value is given, it restricts itself to only
-delete certs that also have that same value. Like @address@hidden
-local kill_revision}}, it is a very dangerous command; it permanently
-and irrevocably deletes historical information from your
-database. Also like @command{kill_revision}, this only deletes the
-certs from your local database; if there are other databases that you
-sync with which have these certs they will reappear when you sync,
-unless the owners of those databases also delete those certificates
-locally.
+the given selector (see @ref{Selectors}). If a value is given, it
+restricts itself to only delete certs that also have that same
+value. Like @address@hidden local kill_revision}}, it is a very
+dangerous command; it permanently and irrevocably deletes historical
+information from your database. Also like @command{kill_revision},
+this only deletes the certs from your local database; if there are
+other databases that you sync with which have these certs they will
+reappear when you sync, unless the owners of those databases also
+delete those certificates locally.
 
 Early versions of monotone had @command{db kill_tag_locally} and
 @command{db kill_branch_certs_locally} commands. These can be emulated with
@@ -6827,14 +6927,15 @@ @section Database
 @command{local kill_certs i: branch BRANCH}, respectively.
 
 @anchor{mtn local address@hidden mtn local kill_revision @var{id}
-This command ``kills'', i.e., deletes, a given revision, as well as
-any certs attached to it.  It is a very dangerous command; it
-permanently and irrevocably deletes historical information from your
-database.  If you execute this command in a workspace, whose parent
-revision is the one you are about to delete, the killed revision is
-re-applied to this workspace which makes it possible for you to fix a
-problem and commit again later on easily. For this to work, the
-workspace may not have any changes and/or missing files.
+This command ``kills'', i.e., deletes, a given revision (see
address@hidden), as well as any certs attached to it.  It is a very
+dangerous command; it permanently and irrevocably deletes historical
+information from your database.  If you execute this command in a
+workspace, whose parent revision is the one you are about to delete,
+the killed revision is re-applied to this workspace which makes it
+possible for you to fix a problem and commit again later on
+easily. For this to work, the workspace may not have any changes
+and/or missing files.
 
 There are a number of other caveats with this command:
 @itemize
@@ -7497,7 +7598,48 @@ @section Automation
 
 @end table
 
address@hidden mtn automate erase_descendants address@hidden
 
address@hidden @strong
address@hidden Arguments:
+
+One or more revision IDs.
+
address@hidden Added in:
+
+13.1
+
address@hidden Purpose:
+
+Prints all arguments, except those that are a descendant of some other
+argument.
+
+One way to think about this is that it prints the minimal elements of
+the given set, under the ordering imposed by the ``parent of''
+relation.  Another way to think of it is if the arguments formed a
+branch, then we would print the roots of that branch.  If there are no
+arguments, prints nothing.
+
address@hidden Sample output:
+
address@hidden
+28ce076c69eadb9b1ca7bdf9d40ce95fe2f29b61
+75156724e0e2e3245838f356ec373c50fa469f1f
address@hidden verbatim
+
address@hidden Output format:
+
+Zero or more lines, each giving the ID of one of the given revisions.
+Each line consists of a revision ID, in hexadecimal, followed by a
+newline.  The lines are printed in alphabetically sorted order.
+
address@hidden Error conditions:
+
+If any of the revisions do not exist, prints nothing to stdout, prints
+an error message to stderr, and exits with status 1.
+
address@hidden table
+
 @item mtn automate file_merge @var{left-rid} @var{left-path} @var{right-rid} @var{right-path}
 
 @table @strong
@@ -7588,7 +7730,7 @@ @section Automation
 
 @end table
 
address@hidden mtn automate get_attributes @var{path}
address@hidden mtn automate get_attributes address@hidden @var{path}
 
 @table @strong
 @item Arguments:
@@ -7599,6 +7741,8 @@ @section Automation
 
 @itemize
 @item
+13.1 -- add the possibility to specify a revision for the operation
address@hidden
 11.0 -- removed the @command{format_version} stanza
 @item
 5.0 -- renamed from @command{attributes} to @command{get_attributes}
@@ -7608,8 +7752,8 @@ @section Automation
 
 @item Purpose:
 
-Prints all attributes of the given file in the current workspace, and
-the attribute states.
+Prints all attributes of the given file in the given revision (default
+current workspace revision), and the attribute states.
 
 @item Sample output:
 
@@ -7637,13 +7781,13 @@ @section Automation
 
 @itemize
 @item
-'added': the attribute has just been added to the file
address@hidden: the attribute has just been added to the file
 @item
-'dropped': the attribute has just been dropped from the file
address@hidden: the attribute has just been dropped from the file
 @item
-'unchanged': the attribute has not been changed since the last revision
address@hidden: the attribute has not been changed since the last revision
 @item
-'changed': the attribute has been changed since the last revision
address@hidden: the attribute has been changed since the last revision
 @end itemize
 
 The status 'changed' can come up if an attribute foo has been dropped and
@@ -7657,6 +7801,9 @@ @section Automation
 set value of the dropped attribute for convenience (obviously this is no longer
 recorded in the current workspace).
 
+If attributes from a specific revision are queried, then all the file's
+attribute states are set to @code{unchanged}.
+
 The complete format:
 
 @verbatim
@@ -10142,6 +10289,8 @@ @section Automation
 
 @itemize
 @item
+FIXME: -- Add reporting and resolution for dropped/modified conflicts.
address@hidden
 11.0 -- Add resolution for orphaned node conflicts. Deleted
 @code{resolved_user} conflict resolution; use @code{resolved_*_left}
 for single file conflicts. Add @code{resolved_keep_left,
@@ -10354,6 +10503,52 @@ @section Automation
    right_file_id [e80910e54d0bdea1b6d295ada320b87aaf9fdc23]
 @end verbatim
 
+File dropped and modified (and possibly renamed):
address@hidden
+        conflict dropped_modified
+   ancestor_name "foo"
+ancestor_file_id [e80910e54d0bdea1b6d295ada320b87aaf9fdc23]
+       left_type "dropped file"
+        left_rev [b0d6953684d49dd6bd345c312d6a0c8fed3078ce]
+       left_name "foo"
+    left_file_id [420cde699a422f7c3d2c8951c46ddfd546db66c0]
+      right_type "modified file"
+      right_name "baz"
+   right_file_id [fe6d523f607e2f2fc0f0defad3bda0351a95a337]
address@hidden verbatim
+Here left_name, left_file_id are from left_rev, just before the file
+was dropped.
+
+File orphaned and modified (and possibly renamed):
address@hidden
+        conflict dropped_modified
+   ancestor_name "foo"
+ancestor_file_id [e80910e54d0bdea1b6d295ada320b87aaf9fdc23]
+       left_type "orphaned file"
+        left_rev [b0d6953684d49dd6bd345c312d6a0c8fed3078ce]
+       left_name "foo"
+    left_file_id [420cde699a422f7c3d2c8951c46ddfd546db66c0]
+      right_type "modified file"
+      right_name "baz"
+   right_file_id [fe6d523f607e2f2fc0f0defad3bda0351a95a337]
address@hidden verbatim
+Orphaned/modified is different from dropped/modified because the
+possible resolutions are different; orphaned requires a rename if the
+file is kept.
+
+File dropped and recreated on one side; modified on the other (and possibly renamed):
address@hidden
+        conflict dropped_modified
+   ancestor_name "foo"
+ancestor_file_id [e80910e54d0bdea1b6d295ada320b87aaf9fdc23]
+       left_type "recreated file"
+       left_name "foo"
+    left_file_id [e80910e54d0bdea1b6d295ada320b87aaf9fdc23]
+      right_type "modified file"
+      right_name "baz"
+   right_file_id [fe6d523f607e2f2fc0f0defad3bda0351a95a337]
address@hidden verbatim
+
 Invalid file name (@file{_MTN} in root directory):
 @verbatim
      conflict invalid_name
@@ -10432,7 +10627,7 @@ @section Automation
 
 @end table
 
address@hidden automate address@hidden mtn automate stdio
address@hidden automate address@hidden mtn automate stdio [--automate-stdio-size <size>]
 
 @table @strong
 @item Arguments:
@@ -10533,6 +10728,9 @@ @section Automation
 <command number>:<stream>:<size>:<output>
 @end verbatim
 
+Packet size is limited by the @command{--automate-stdio-size} option
+(default 32k bytes).
+
 @code{<command number>} is a decimal number specifying which command this output
 is from. It is 0 for the first command, and increases by one each time.
 
@@ -12029,12 +12227,6 @@ @subsection Trust Evaluation Hooks
 the revision has been approved by an extra ``reviewer'' who used the
 @command{approve} command.
 
address@hidden@item get_file_cert_trust (@var{signers}, @var{id}, @var{name}, @var{val})
-Similar to @address@hidden, for certs on files.
-
address@hidden@item get_manifest_cert_trust (@var{signers}, @var{id}, @var{name}, @var{val})
-Similar to @address@hidden, for certs on manifests.
-
 @address@hidden accept_testresult_change (@var{old_results}, @var{new_results})
 Called by @address@hidden update}}.
 
@@ -12462,7 +12654,7 @@ @section Additional Lua Functions
 @item guess_terminal_width()
 
 Returns the size of the terminal window as number or a sane default
-(80) if the information cannot be retrieved.
+(72) if the information cannot be retrieved.
 
 @item include(@var{scriptfile})
 
============================================================
--- doc/pcrepattern.texi	10041ae21b3ce5f6971aca811ce57abc0827da8b
+++ doc/pcrepattern.texi	43ef52850c1fd113b8a21d63634bafe61b3aec45
@@ -2209,7 +2209,7 @@ @subsubheading Recursive Patterns
 @verbatim
          \( ( ( (?>[^()]+) | (?R) )* ) \)
             ^                        ^
address@hidden example
address@hidden verbatim
 
 @noindent
 the string they capture is @samp{ab(cd)ef}, the contents of the top
============================================================
--- extra/mtn-hooks/monotone-buildbot.lua	41d82aee6613c5d1775fd8ebf97ffd0c29ea807c
+++ extra/mtn-hooks/monotone-buildbot.lua	d1439935004ff6fb523dfa6b2c5fd5c8641339ab
@@ -10,6 +10,8 @@
 --     - initial version
 -- 0.2 (2011-03-11) Richard Levitte <address@hidden>
 --     - updated to have things more protected
+-- 0.3 (2012-04-10) Markus Wanner <address@hidden>
+--     - adapt to buildbot 0.8.3 and newer
 --
 -- License: GPL
 --
@@ -58,17 +60,21 @@ do
 	    end
 	 end
 
+    -- Note: for buildbot versions before 0.8.3, you need to give a
+    -- 'username' argument instead of 'auth' and 'who'.
 	 print("monotone-buildbot-notification: Running script:",
 	       buildbot_bin, "sendchange",
 	       "--master", buildbot_master,
-	       "--username", "'"..author.."'",
+	       "--auth", "change:changepw",
+	       "--who", "'"..author.."'",
 	       "--revision", rev_id,
 	       "--comments", "'"..changelog.."'",
 	       "--branch", branch,
 	       touched_files)
 	 execute(buildbot_bin, "sendchange",
 		 "--master", buildbot_master,
-		 "--username", author,
+		 "--auth", "change:changepw",
+		 "--who", "'"..author.."'",
 		 "--revision", rev_id,
 		 "--comments", changelog,
 		 "--branch", branch,
============================================================
--- extra/mtn-hooks/monotone-cvs-ignore.lua	7bc64a29dac6409b2dbfbda0b3458ccc5b5fdc46
+++ extra/mtn-hooks/monotone-cvs-ignore.lua	e237828983a27a99d58ec6bb0243fbf56fdcb817
@@ -23,7 +23,7 @@ do
 
       local handle, msg = io.open(dir .. ".cvsignore")
       if (handle) then
-	 for line in handle:lines(dir .. ".cvsignore") do
+	 for line in handle:lines() do
 	    pat2 = _glob_to_pattern(line) .. "$"
 	    if (string.find(name, pat1 .. pat2)) then
 	       return true
============================================================
--- extra/shell/monotone.bash_completion.in	df7a7d5b8f27d5dfdf4bd09f953f0b4e26518775
+++ extra/shell/monotone.bash_completion.in	b9f93761b9d2bebfdcf1d82f5147211b10bb51de
@@ -70,6 +70,7 @@ _monotone_databases() {
 
 _monotone_databases() {
     _filedir mtn
+    _filedir db
     COMPREPLY=(
 	"address@hidden"
 	$(compgen -W "$(LANG=POSIX \
============================================================
--- innosetup/README.txt	86ad710152a8dcfa19b88adf1c1eb135e787454e
+++ innosetup/README.txt	d306d15f4bba8011dd1fa01dd9522b93c8ce8920
@@ -1,11 +1,13 @@
 This directory keeps the files needed to build the Windows native
-installer, using Inno Setup. 
+installer, using Inno Setup.
 
 Here are all the steps for creating a MinGW release, on a fresh
 Windows machine:
 
 Install Inno Setup and Inno Setup preprocessor; see
-http://www.jrsoftware.org/isinfo.php, get the Quick Start Pack ispack-5.3.3.exe
+http://www.jrsoftware.org/isinfo.php, isetup-5.5.1.exe. Install to a
+path that has no spaces in the name; simplifies later steps. Install
+the preprocessor (we use it).
 
 Install MinGW tools; see ../INSTALL_windows_native.txt
 
@@ -15,21 +17,24 @@
 http://wiki.monotone.ca/MonotoneProjectServer/
 
 Check out the release version of monotone:
-mtn -d /path/to/monotone.db checkout -r t:monotone-<version> monotone-<version>
+mtn -d /path/to/monotone.db checkout -r t:monotone-<version> --branch net.venge.monotone.monotone-<version> monotone-<version>
 
-Build the release. In an MSYS shell:
-cd monotone-<version>
-autoreconf -i
-./configure 
+Do not use the source tarball; if you do, the resulting monotone
+executable will not know the base revision, which is needed for good
+bug reports.
+
+Build the release. See the last instruction in ../INSTALL_windows_native.txt
+Then build the installer:
+
 make win32-installer
 
 That builds "monotone-<version>-setup.exe" in the current directory.
 
 NOTE:
 
-  If ISCC (Inno setup compiler) is not in PATH, then you must specify
-  its location:
-  
+  If ISCC (Inno setup compiler) is not in PATH when monotone configure
+  is run, then you must specify its location:
+
     make win32-installer ISCC=/d/progs/InnoSetup5/ISCC.exe
 
 Publish the binary on the monotone website with proper permissions:
@@ -37,4 +42,5 @@
 chmod a+r monotone-<version>-setup.exe
 scp -p monotone-<version>-setup.exe address@hidden:<version>
 
-Download from the web and test, both the installed mtn and the documentation.
+Download from the web (http://www.monotone.ca/downloads.php), install
+and test, both the installed mtn and the documentation.
============================================================
--- innosetup/monotone.iss.in	1800543d08b166faa10b73a217b03c827733e710
+++ innosetup/monotone.iss.in	ac82a895b5fb4de6b175e65cc99db7e233d7fa9b
@@ -17,7 +17,7 @@ DefaultGroupName={#APPNAME}
 AppPublisherURL=http://www.monotone.ca/
 DefaultDirName={pf}\{#APPNAME}
 DefaultGroupName={#APPNAME}
-MinVersion=4.0,4.0
+MinVersion=0,5.0
 OutputDir=.
 AllowNoIcons=1
 Compression=lzma/ultra
============================================================
--- notes/release-checklist.txt	9667681829dde1bdc955fbca7ce0062789d7f396
+++ notes/release-checklist.txt	854f5ee471e9eb2ad639c37370034f8326bbb47d
@@ -1,6 +1,10 @@
 How to release a new version of monotone
-----------------------------------------
+========================================
 
+-----------
+Preparation
+-----------
+
 0) Send a pre-release announcement out to address@hidden
    to inform active translators that a new version of monotone
    is about to be released and that their translations probably
@@ -13,30 +17,40 @@
 1) Make sure that the buildbot looks reasonably green.  Let's not
    release stuff that's known to be broken on any major platforms, eh?
 
-   Also check that the following Makefile targets work:
+2) Check out a fresh copy of the source in a separate directory and
+   prepare it for building (if you use your main workspace, you
+   increase the changes of accidentally picking up weird stuff).
+   For example, {SOMEDIR} in the example here could be 'monotone-{NEW VERSION}'.
 
-    Unix: all doc/monotone.pdf doc/monotone.ps distcheck
+   $ mtn co -r h:net.venge.monotone {SOMEDIR}
+   $ cd {SOMEDIR}
 
-    Win32 MinGW: all check win32-installer
+   If nothing else is said, the rest of this file assumes you're
+   standing in {SOMEDIR}.
 
-    Win32 Cygwin: all check dist-gzip
+   NOTE:  If you're about to create a new release branch, make sure to
+   edit the branch setting in _MTN/options to reflect that.  Do it now
+   instead of forgetting it in a commit later ;-).
 
+-----------------------------------------------------
+Check the documentation, and make appropriate changes
+-----------------------------------------------------
 
-2) Write user-readable release notes at the top of the NEWS file,
+3) Write user-readable release notes at the top of the NEWS file,
    roughly following the format of existing entries.  Make sure to
    mention any incompatibilities at the top, and generally it's a good
    idea to put cool new stuff above nice-but-not-as-exciting stuff.
 
    A useful command:
 
-     $ mtn log --from h:net.venge.monotone --to t:monotone-*
+     $ mtn log --from h:net.venge.monotone --to t:monotone-{LAST RELEASE}
 
    Commit your release notes, so other people can see them.
 
-3) Get people to read over your release notes, it's really easy to
+4) Get people to read over your release notes, it's really easy to
    make mistakes or have stupid grammatical errors here.
 
-4) Check the NEWS if any changes in the automation interface have happened.
+5) Check the NEWS if any changes in the automation interface have happened.
 
    Document changes in the wiki under http://wiki.monotone.ca/AutomateVersions/
    by adding new commands with an 'A' marker or set a 'B' (for _B_ackwards
@@ -55,7 +69,7 @@
 
    Commit your changes.
 
-5) Update the UPGRADE file.  At the very least, bump the version
+6) Update the UPGRADE file.  At the very least, bump the version
    number in the first line.  This file should always contain a
    complete description of how to upgrade from any version of monotone
    to the latest release -- you may need to tweak or remove earlier
@@ -63,78 +77,97 @@
 
    Commit your changes.
 
-6) Double-check that INSTALL, AUTHORS, and README don't need any
+7) Double-check that INSTALL, AUTHORS, and README don't need any
    updates.  If they do, make them.
 
-7) Update version numbers.  The following files need to be touched:
+8) Update version numbers.  The following files need to be touched:
      configure.ac: change the call to AC_INIT
      visualc/config.h: the version number is mentioned several times,
        don't miss any.
    Commit your changes.
 
-8) Okay, everything should be ready to go... double-check that:
+9) Okay, everything should be ready to go... double-check that:
      -- you've done the above steps correctly
      -- you've entered the correct date at the top of the NEWS file
         (esp. important when you wrote the notes a few days ago so
         people could look them over!)
 
-9) Build and test the source package, in a clean checkout (if you use
-   your main workspace, you increase the changes of accidentally
-   picking up weird stuff):
+--------------------
+Building and testing
+--------------------
 
-   $ mtn co -r h:net.venge.monotone SOMEDIR
-   $ cd SOMEDIR
-   $ autoreconf -i && ./configure && make distcheck
+10) Build and test, making sure to check that the targets listed
+    below (mandatory!  Make at the very least sure to check the Unix
+    targets!).
 
-   Wait a long time, eventually it will either bomb out, or say
-   "monotone-<whatever>.tar.bz2 is ready for distribution".  If it
-   bombs out, fix it, otherwise, SOMEDIR/monotone-<NEW VERSION>.tar.bz2
-   is the source package.
+    $ autoreconf -i && ./configure && make {TARGETS}
 
-10) Build docs for the website:
+    Targets to check on different platforms:
 
-    $ tar xvzf SOMEDIR/monotone-<NEW VERSION>.tar.bz2
-    $ cd monotone-<NEW VERSION>
-    $ ./configure
-    $ LANG=C make monotone.pdf html
+      - Unix: all doc/monotone.pdf doc/monotone.ps distcheck
 
-11) Upload everything to the website (uses monotone):
+      - Win32 MinGW: all check win32-installer
 
+      - Win32 Cygwin: all check dist-gzip
+
+    (we really don't need to go through distcheck on all platforms,
+    and that's why it's important to check the Unix targets at the
+    very least)
+
+    Wait a long time on distcheck, eventually it will either bomb out,
+    or say "monotone-{NEW VERSION}.tar.bz2 is ready for distribution".
+    If it bombs out, fix it, otherwise, monotone-{NEW VERSION}.tar.bz2
+    is the source package.
+
+11) Build docs for the website (most of it is already built at this
+    point, but not all):
+
+    $ LANG=C make pdf html
+
+------------------------------
+Uploading, tagging and syncing
+------------------------------
+
+12) Upload everything to the website (uses monotone):
+
     # This requires that you have registered a SSH version 2 public key
     # with the administrators of monotone.ca, currently address@hidden
     #
-    $ mkdir <NEW VERSION>
-    $ mv SOMEDIR/monotone-<NEW VERSION>.tar.bz2 <NEW VERSION>/
-    $ scp -r <NEW VERSION> address@hidden:~/
+    $ mkdir {NEW VERSION}
+    $ cp monotone-{NEW VERSION}.tar.bz2 {NEW VERSION}/
+    $ scp -r {NEW VERSION} address@hidden:~/
 
     # The rest is done via monotone.
     #
-    $ mtn -d DATABASE co -b net.venge.monotone.web.mainsite WEBDIR
-    $ cp monotone-<NEW VERSION>/{NEWS,INSTALL,UPGRADE,monotone.pdf,monotone.html} \
-          WEBDIR/
-    $ rm -rf WEBDIR/docs
-    $ cp -r monotone-<NEW VERSION>/html WEBDIR/docs
+    $ mtn -d DATABASE co -b net.venge.monotone.web.mainsite {WEBDIR}
+    $ cp monotone-{NEW VERSION}/NEWS			{WEBDIR}
+    $ cp monotone-{NEW VERSION}/INSTALL			{WEBDIR}
+    $ cp monotone-{NEW VERSION}/UPGRADE			{WEBDIR}
+    $ cp monotone-{NEW VERSION}/doc/monotone.pdf	{WEBDIR}
+    $ cp monotone-{NEW VERSION}/doc/monotone.html	{WEBDIR}
+    $ rm -rf {WEBDIR}/docs
+    $ cp -r monotone-{NEW VERSION}/doc/html		{WEBDIR}/docs
 
-    Open WEBDIR/monotone.html, change the CSS include from "texinfo.css" to
-    "docs/texinfo.css" and hit save.
+    Open {WEBDIR}/monotone.html, change the CSS include from
+    "texinfo.css" to "docs/texinfo.css" and hit save.
 
-    $ rm WEBDIR/figures/*
-    $ cp monotone-<NEW VERSION>/figures/*.png WEBDIR/figures/
-    $ cd WEBDIR
+    $ rm {WEBDIR}/figures/*
+    $ cp monotone-{NEW VERSION}/doc/figures/*.png	{WEBDIR}/figures/
+    $ cd {WEBDIR}
     $ mtn drop --missing
     $ mtn add --unknown
-    $ mtn ci -m "Updates related to the release of monotone <NEW VERSION>"
+    $ mtn ci -m "Updates related to the release of monotone {NEW VERSION}"
     $ mtn sync
 
-12) Update index.php on the website to state the latest version in the left
+13) Update index.php on the website to state the latest version in the left
     column:
 
-    $ cd WEBDIR
+    $ cd {WEBDIR}
     $ vi index.php
-    $ mtn ci -m "Updates related to the release of monotone <NEW VERSION>"
+    $ mtn ci -m "Updates related to the release of monotone {NEW VERSION}"
     $ mtn sync
 
-13) Check if the releases newsfeed is properly updated, i.e. if the script
+14) Check if the releases newsfeed is properly updated, i.e. if the script
     <http://www.monotone.ca/releases.xml.php> can parse the NEWS file as is
     and links issues and URLs, while keeping the overall structure.
     (If your NEWS entries match the previous ones, this shouldn't be a problem.)
@@ -142,39 +175,47 @@
     If you encounter problems, either patch the NEWS file or adapt the code
     in releases.xml.php and commit your changes accordingly.
 
-14) Once you're pretty sure things have gone well, tag the source:
+15) Once you're pretty sure things have gone well, tag the source:
 
-    $ mtn tag <REVISION> monotone-<NEW VERSION>
+    $ mtn tag {REVISION} monotone-{NEW VERSION}
 
     This is the last possible moment to back out!
 
     $ mtn sync
 
-15) Change the topic in the IRC channel to state the new version
+------------
+Announcement
+------------
+
+16) Change the topic in the IRC channel to state the new version
     number.
 
-16) Send out a release announcement.  Format is something like:
+17) Send out a release announcement.  Format is something like:
 
     To: address@hidden
     CC: address@hidden
-    Subject: [ANNOUNCE] monotone <NEW VERSION> released
+    Subject: [ANNOUNCE] monotone {NEW VERSION} released
 
-    <a few lines stating the new version and where the website is>
+    {a few lines stating the new version and where the website is}
 
-    <the release notes copy/pasted from the top of NEWS>
+    {the release notes copy/pasted from the top of NEWS}
 
-    <sign off>
+    {sign off}
 
-17) Submit a release announcement to freshmeat.net.
+18) Submit a release announcement to freshmeat.net.
 
-18) Append ".90" to the released version number in configure.ac to
+-----------------
+Post-release work
+-----------------
+
+19) Append ".90" to the released version number in configure.ac to
     mark the beginning of the development of the next version of
     monotone.  For more information, read up the paragraph
     "Version numbering scheme" on <http://wiki.monotone.ca/RoadMap>
    
     Commit and sync your changes.
 
-19) Note any mistakes you made and update this file accordingly for
+20) Note any mistakes you made and update this file accordingly for
     next time.
 
-20) Party!
+21) Party!
============================================================
--- po/de.po	76781e0c24fe5452e4e1adf16a6e565488577c00
+++ po/de.po	7d6060bdaf4235e303217616005a44d5663ee456
@@ -1,5 +1,5 @@
 # monotone message string catalogue.
-# Copyright (C) 2003 - 2011 The monotone development team <http://www.monotone.ca>
+# Copyright (C) 2003 - 2012 The monotone development team <http://www.monotone.ca>
 # This file is distributed under the same license as the monotone package.
 # Please see po/README.<lang> for individual copyrights.
 #
@@ -7,7 +7,7 @@ msgstr ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-14 01:32+0100\n"
+"POT-Creation-Date: 2012-11-30 23:06+0100\n"
 "PO-Revision-Date: 2011-03-14 10:18+0100\n"
 "Last-Translator: tommyd <address@hidden>\n"
 "Language-Team: Deutsch <address@hidden>\n"
@@ -22,7 +22,7 @@ msgstr "Fataler Fehler: Formatierung sch
 msgid "fatal: formatter failed on %s:%d: %s"
 msgstr "Fataler Fehler: Formatierung schlug fehl bei %s:%d: %s"
 
-#: src/sanity.cc:353 src/cmd_list.cc:728
+#: src/sanity.cc:353 src/cmd_list.cc:729
 msgid "misuse: "
 msgstr "falscher Gebrauch: "
 
@@ -40,7 +40,7 @@ msgstr "Derzeitige Arbeitsgruppe: %i Ele
 msgid "Current work set: %i items"
 msgstr "Derzeitige Arbeitsgruppe: %i Elemente"
 
-#: src/sanity.hh:371 src/cmd_list.cc:734 src/lua_hooks.cc:105
+#: src/sanity.hh:371 src/cmd_list.cc:735 src/lua_hooks.cc:105
 #, c-format
 msgid "%s"
 msgstr "%s"
@@ -55,7 +55,7 @@ msgstr "Größe der hex-enkodierten ID '
 msgid "hex encoded ID '%s' size != %d"
 msgstr "Größe der hex-enkodierten ID '%s' ist ungleich %d"
 
-#: src/vocab.cc:53 src/database.cc:4231
+#: src/vocab.cc:53 src/database.cc:4229
 #, c-format
 msgid "bad character '%c' in id name '%s'"
 msgstr "ungültiges Zeichen '%c' in ID-Name '%s'"
@@ -82,12 +82,12 @@ msgstr "ungültiges Zeichen '%c' in Schl
 
 #: src/vocab.cc:109
 #, c-format
-msgid "Invalid key length of %d bytes"
+msgid "invalid key length of %d bytes"
 msgstr "Ungültige Schlüssellänge von %d Bytes"
 
 #: src/vocab.cc:123
 #, c-format
-msgid "Invalid hmac length of %d bytes"
+msgid "invalid hmac length of %d bytes"
 msgstr "Ungültige 'hmac'-Länge von %d Bytes"
 
 #: src/charset.cc:72
@@ -117,17 +117,17 @@ msgstr "Pfad '%s' ist im monotone-System
 
 #: src/paths.cc:460
 #, c-format
-msgid "Invalid utf8"
+msgid "invalid utf8"
 msgstr "Ungültiges UTF-8"
 
 #: src/paths.cc:484
 #, c-format
-msgid "Path is not normalized"
+msgid "path is not normalized"
 msgstr "Pfad ist nicht normalisiert"
 
 #: src/paths.cc:486
 #, c-format
-msgid "Bookkeeping path is not in bookkeeping dir"
+msgid "bookkeeping path is not in bookkeeping directory"
 msgstr "Systempfad ist nicht im monotone-Systemverzeichnis"
 
 #: src/paths.cc:827
@@ -160,27 +160,27 @@ msgstr "Wurzel der Suche '%s' ist kein V
 msgid "search root '%s' is not a directory"
 msgstr "Wurzel der Suche '%s' ist kein Verzeichnis"
 
-#: src/luaext_parse_basic_io.cc:44
+#: src/luaext_parse_basic_io.cc:48
 #, c-format
 msgid "bad input to parse_basic_io"
 msgstr "falsche Eingabe für `parse_basic_io'"
 
-#: src/lua.cc:485 src/lua.cc:497 src/lua.cc:509
+#: src/lua.cc:511 src/lua.cc:523 src/lua.cc:535
 #, c-format
 msgid "%s called with an invalid parameter"
 msgstr "%s wurde mit einem ungültigen Parameter aufgerufen"
 
-#: src/lua.cc:592
+#: src/lua.cc:618
 #, c-format
-msgid "Directory '%s' does not exist"
+msgid "directory '%s' does not exist"
 msgstr "Das Verzeichnis '%s' existiert nicht"
 
-#: src/lua.cc:594 src/cmd_othervcs.cc:61 src/work.cc:2140
+#: src/lua.cc:620 src/cmd_othervcs.cc:61 src/work.cc:2112
 #, c-format
 msgid "'%s' is not a directory"
 msgstr "'%s' ist kein Verzeichnis"
 
-#: src/lua.cc:616 src/lua_hooks.cc:216
+#: src/lua.cc:642 src/lua_hooks.cc:216
 #, c-format
 msgid "lua error while loading rcfile '%s'"
 msgstr "lua-Fehler beim Laden der rc-Datei '%s'"
@@ -259,7 +259,7 @@ msgstr "Quellpfad für Umbenennung '%s' 
 msgid "rename source path '%s' does not exist"
 msgstr "Quellpfad für Umbenennung '%s' existiert nicht"
 
-#: src/file_io.cc:281 src/work.cc:1425
+#: src/file_io.cc:281 src/work.cc:1396
 #, c-format
 msgid "file '%s' does not exist"
 msgstr "Datei '%s' existiert nicht"
@@ -276,7 +276,7 @@ msgstr "Kann Datei '%s' nicht zum Lesen 
 
 #: src/file_io.cc:303
 #, c-format
-msgid "Cannot read standard input multiple times"
+msgid "cannot read standard input multiple times"
 msgstr "Kann nicht mehrmals von der Standardeingabe lesen"
 
 #: src/file_io.cc:334
@@ -285,7 +285,7 @@ msgstr ""
 msgstr ""
 "Datei %s kann nicht mit Daten überschrieben werden; sie ist ein Verzeichnis"
 
-#: src/file_io.cc:426 src/work.cc:1822
+#: src/file_io.cc:426 src/work.cc:1794
 #, c-format
 msgid "no such file or directory: '%s'"
 msgstr "Datei oder Verzeichnis unbekannt: '%s'"
@@ -478,29 +478,29 @@ msgstr "%s: entfernte Kopfzeile:"
 
 #: src/automate_reader.cc:46
 #, c-format
-msgid "Bad input to automate stdio: expected ':' after string size"
+msgid "bad input to automate stdio: expected ':' after string size"
 msgstr ""
-"Falsche Eingabe für 'automate stdio': erwartete ':' nach Zeichenketten-Länge."
+"Falsche Eingabe für 'automate stdio': erwartete ':' nach Zeichenketten-Länge"
 
 #: src/automate_reader.cc:66
 #, c-format
-msgid "Bad input to automate stdio: unexpected EOF"
-msgstr "Falsche Eingabe für 'automate stdio': unerwartetes EOF."
+msgid "bad input to automate stdio: unexpected EOF"
+msgstr "Falsche Eingabe für 'automate stdio': unerwartetes EOF"
 
 #: src/automate_reader.cc:94
 #, c-format
-msgid "Bad input to automate stdio: unknown start token '%c'"
-msgstr "Falsche Eingabe für 'automate stdio': unbekanntes Startzeichen '%c'."
+msgid "bad input to automate stdio: unknown start token '%c'"
+msgstr "Falsche Eingabe für 'automate stdio': unbekanntes Startzeichen '%c'"
 
 #: src/automate_reader.cc:116
 #, c-format
-msgid "Bad input to automate stdio: expected '%c' token"
-msgstr "Falsche Eingabe für 'automate stdio': erwartete Zeichen '%c'."
+msgid "bad input to automate stdio: expected '%c' token"
+msgstr "Falsche Eingabe für 'automate stdio': erwartete Zeichen '%c'"
 
 #: src/automate_reader.cc:123
 #, c-format
-msgid "Bad input to automate stdio: command name is missing"
-msgstr "Falsche Eingabe für 'automate stdio': Kommandoname fehlt."
+msgid "bad input to automate stdio: command name is missing"
+msgstr "Falsche Eingabe für 'automate stdio': Kommandoname fehlt"
 
 #: src/commands.cc:496
 #, c-format
@@ -654,7 +654,7 @@ msgstr ""
 
 #: src/cmd.cc:459
 #, c-format
-msgid "Call to user command '%s' (lua command: '%s') failed."
+msgid "call to user command '%s' (lua command: '%s') failed."
 msgstr ""
 "Der Aufruf des Benutzerkommandos '%s' (Lua-Kommando: '%s') schlug fehl."
 
@@ -849,7 +849,7 @@ msgid ""
 #: src/cmd_netsync.cc:122 src/cmd_netsync.cc:225
 #, c-format
 msgid ""
-"No database given; assuming '%s' database. This means that\n"
+"no database given; assuming '%s' database. This means that\n"
 "we can't verify the server key, because we have no record of\n"
 "what it should be."
 msgstr ""
@@ -866,21 +866,21 @@ msgstr "Führt KOMMANDO auf einem entfer
 msgid "Executes COMMAND on a remote server"
 msgstr "Führt KOMMANDO auf einem entfernten Rechner aus"
 
-#: src/cmd_netsync.cc:221 src/cmd_list.cc:1021 src/cmd_packet.cc:73
+#: src/cmd_netsync.cc:221 src/cmd_list.cc:1031 src/cmd_packet.cc:73
 #: src/cmd_packet.cc:134 src/cmd_packet.cc:254 src/cmd_key_cert.cc:81
-#: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1141
-#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1134 src/cmd_ws_commit.cc:1342
-#: src/cmd_ws_commit.cc:1456 src/cmd_ws_commit.cc:1478 src/cmd_automate.cc:138
-#: src/cmd_files.cc:239 src/cmd_files.cc:336 src/cmd_files.cc:360
-#: src/cmd_files.cc:394 src/automate.cc:85 src/automate.cc:122
-#: src/automate.cc:175 src/automate.cc:298 src/automate.cc:400
-#: src/automate.cc:431 src/automate.cc:520 src/automate.cc:1246
-#: src/automate.cc:1419 src/automate.cc:1556 src/automate.cc:1592
-#: src/automate.cc:1624 src/automate.cc:1658 src/automate.cc:1690
-#: src/automate.cc:1730 src/automate.cc:1820 src/automate.cc:1903
-#: src/automate.cc:1936 src/automate.cc:1999 src/automate.cc:2051
-#: src/automate.cc:2106 src/automate.cc:2166 src/automate.cc:2202
-#: src/automate.cc:2272 src/automate.cc:2302 src/automate.cc:2378
+#: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1149
+#: src/cmd_merging.cc:1227 src/cmd_ws_commit.cc:1144 src/cmd_ws_commit.cc:1350
+#: src/cmd_ws_commit.cc:1492 src/cmd_ws_commit.cc:1514 src/cmd_automate.cc:138
+#: src/cmd_files.cc:240 src/cmd_files.cc:337 src/cmd_files.cc:361
+#: src/cmd_files.cc:395 src/automate.cc:85 src/automate.cc:122
+#: src/automate.cc:175 src/automate.cc:331 src/automate.cc:433
+#: src/automate.cc:464 src/automate.cc:553 src/automate.cc:1279
+#: src/automate.cc:1452 src/automate.cc:1589 src/automate.cc:1625
+#: src/automate.cc:1657 src/automate.cc:1691 src/automate.cc:1723
+#: src/automate.cc:1763 src/automate.cc:1853 src/automate.cc:1936
+#: src/automate.cc:1969 src/automate.cc:2032 src/automate.cc:2084
+#: src/automate.cc:2139 src/automate.cc:2199 src/automate.cc:2235
+#: src/automate.cc:2305 src/automate.cc:2335 src/automate.cc:2411
 #: src/asciik.cc:379
 #, c-format
 msgid "wrong argument count"
@@ -1010,18 +1010,18 @@ msgstr "Das Zielverzeichnis für das Kop
 msgid "clone destination directory '%s' already exists"
 msgstr "Das Zielverzeichnis für das Kopieren '%s' existiert bereits."
 
-#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1842 src/cmd_ws_commit.cc:1931
+#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1878 src/cmd_ws_commit.cc:1967
 #, c-format
 msgid "bookkeeping directory already exists in '%s'"
 msgstr "Das monotone-Systemverzeichnis existiert bereits in '%s'"
 
 #: src/cmd_netsync.cc:866 src/cmd_merging.cc:535 src/cmd_merging.cc:636
-#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1030
+#: src/cmd_merging.cc:641 src/cmd_merging.cc:1479 src/cmd_ws_commit.cc:1040
 #, c-format
 msgid "branch '%s' is empty"
 msgstr "Zweig '%s' ist leer"
 
-#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1033 src/cmd_ws_commit.cc:1910
+#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1043 src/cmd_ws_commit.cc:1946
 #, c-format
 msgid "branch '%s' has multiple heads:"
 msgstr "Zweig '%s' hat mehrere Köpfe:"
@@ -1031,12 +1031,12 @@ msgstr "wählen Sie eine durch '%s clone
 msgid "choose one with '%s clone -r<id> URI'"
 msgstr "wählen Sie eine durch '%s clone -r<id> URI'"
 
-#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1039 src/cmd_ws_commit.cc:1916
+#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1049 src/cmd_ws_commit.cc:1952
 #, c-format
 msgid "branch '%s' has multiple heads"
 msgstr "Zweig '%s' hat mehrere Köpfe"
 
-#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1896
+#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1932
 #, c-format
 msgid "revision %s is not a member of branch '%s'"
 msgstr "Revision %s ist nicht Mitglied des Zweiges '%s'"
@@ -1055,11 +1055,11 @@ msgstr "Bedient Client-Anfragen für die
 msgid "Serves the database to connecting clients"
 msgstr "Bedient Client-Anfragen für die Datenbank"
 
-#: src/cmd_list.cc:52
+#: src/cmd_list.cc:53
 msgid "Shows database objects"
 msgstr "Zeigt Datenbank-Objekte"
 
-#: src/cmd_list.cc:53
+#: src/cmd_list.cc:54
 msgid ""
 "This command is used to query information from the database.  It shows "
 "database objects, or the current workspace manifest, or known, unknown, "
@@ -1070,16 +1070,16 @@ msgstr ""
 "Arbeitsbereichs oder bekannte, unbekannte, absichtlich ignorierte, fehlende "
 "oder geänderte Dateien."
 
-#: src/cmd_list.cc:101
+#: src/cmd_list.cc:102
 msgid "Lists certificates attached to a revision"
 msgstr "Gibt Zertifikate, die zu einer Revision gehören, aus"
 
-#: src/cmd_list.cc:129 src/cmd_list.cc:1050
+#: src/cmd_list.cc:130 src/cmd_list.cc:1060
 #, c-format
 msgid "no public key %s found in database"
 msgstr "kein öffentlicher Schlüssel %s in der Datenbank gefunden"
 
-#: src/cmd_list.cc:139
+#: src/cmd_list.cc:140
 #, c-format
 msgid ""
 "Key   : %s\n"
@@ -1092,19 +1092,19 @@ msgstr ""
 "Name      : %s\n"
 "Wert      : %s\n"
 
-#: src/cmd_list.cc:172
+#: src/cmd_list.cc:173
 msgid "ok"
 msgstr "in Ordnung"
 
-#: src/cmd_list.cc:175 src/database.cc:1327
+#: src/cmd_list.cc:176 src/database.cc:1327
 msgid "bad"
 msgstr "schlecht"
 
-#: src/cmd_list.cc:178
+#: src/cmd_list.cc:179
 msgid "unknown"
 msgstr "unbekannt"
 
-#: src/cmd_list.cc:208
+#: src/cmd_list.cc:209
 msgid ""
 "Lists duplicate files in the specified revision. If no revision is "
 "specified, use the workspace"
@@ -1112,165 +1112,165 @@ msgstr ""
 "Listet Datei-Duplikate in der übergebenenn Revision. Wenn keine Revision "
 "übergeben wurde, wird der aktuelle Arbeitsbereich verwendet."
 
-#: src/cmd_list.cc:222
+#: src/cmd_list.cc:223
 #, c-format
 msgid "more than one revision given"
 msgstr "mehr als eine Revision wurde übergeben"
 
-#: src/cmd_list.cc:236 src/cmd_list.cc:1034 src/cmd_db.cc:621
-#: src/cmd_files.cc:270 src/automate.cc:132 src/automate.cc:185
-#: src/automate.cc:235 src/automate.cc:265 src/automate.cc:307
-#: src/automate.cc:312 src/automate.cc:406 src/automate.cc:437
-#: src/automate.cc:1253 src/automate.cc:1438 src/automate.cc:1564
-#: src/automate.cc:1602 src/automate.cc:1634 src/automate.cc:1701
-#: src/automate.cc:1703 src/automate.cc:1739 src/automate.cc:1946
-#: src/automate.cc:2008 src/automate.cc:2013 src/automate.cc:2175
-#: src/selectors.cc:904 src/selectors.cc:922
+#: src/cmd_list.cc:237 src/cmd_list.cc:1044 src/cmd_db.cc:621
+#: src/cmd_files.cc:271 src/automate.cc:132 src/automate.cc:185
+#: src/automate.cc:235 src/automate.cc:268 src/automate.cc:298
+#: src/automate.cc:340 src/automate.cc:345 src/automate.cc:439
+#: src/automate.cc:470 src/automate.cc:1286 src/automate.cc:1471
+#: src/automate.cc:1597 src/automate.cc:1635 src/automate.cc:1667
+#: src/automate.cc:1734 src/automate.cc:1736 src/automate.cc:1772
+#: src/automate.cc:1979 src/automate.cc:2041 src/automate.cc:2046
+#: src/automate.cc:2208 src/selectors.cc:924 src/selectors.cc:942
 #, c-format
 msgid "no revision %s found in database"
 msgstr "Revision %s nicht in Datenbank gefunden"
 
-#: src/cmd_list.cc:355
+#: src/cmd_list.cc:356
 msgid "Lists keys that match a pattern"
 msgstr "Listet Schlüssel auf, die auf ein Muster passen"
 
-#: src/cmd_list.cc:371
+#: src/cmd_list.cc:372
 #, c-format
 msgid "no keys found"
 msgstr "keine Schlüssel gefunden"
 
-#: src/cmd_list.cc:388
+#: src/cmd_list.cc:389
 #, c-format
 msgid "no keys found matching '%s'"
 msgstr "keine Schlüssel gefunden, die auf '%s' passen"
 
-#: src/cmd_list.cc:448
+#: src/cmd_list.cc:449
 #, c-format
 msgid "(*) - only in '%s/'"
 msgstr "(*) - nur in '%s/'"
 
-#: src/cmd_list.cc:466
+#: src/cmd_list.cc:467
 #, c-format
 msgid "Some key names refer to multiple keys"
 msgstr "Einige Schlüsselnamen beziehen sich auf mehrere Schlüssel"
 
-#: src/cmd_list.cc:470
+#: src/cmd_list.cc:471
 #, c-format
 msgid "Duplicate Key: %s"
 msgstr "Doppelter Schlüssel: %s"
 
-#: src/cmd_list.cc:477
+#: src/cmd_list.cc:478
 msgid "Lists branches in the database that match a pattern"
 msgstr "Listet Zweige in der Datenbank auf, die auf ein Muster passen"
 
-#: src/cmd_list.cc:500
+#: src/cmd_list.cc:501
 msgid "Lists the current epoch of branches that match a pattern"
 msgstr "Listet die derzeitige Epoche der Zweige auf, die auf ein Muster passen"
 
-#: src/cmd_list.cc:527
+#: src/cmd_list.cc:528
 #, c-format
 msgid "no epoch for branch '%s'"
 msgstr "kein Zeitraum für Zweig '%s'"
 
-#: src/cmd_list.cc:536
+#: src/cmd_list.cc:537
 msgid "Lists all tags in the database"
 msgstr "Listet alle Marken in der Datenbank auf"
 
-#: src/cmd_list.cc:586
+#: src/cmd_list.cc:587
 msgid "Lists variables in the whole database or a domain"
 msgstr "Listet die Variablen der gesamten Datenbank oder einer Domäne auf"
 
-#: src/cmd_list.cc:657
+#: src/cmd_list.cc:658
 msgid "<no branch set>"
 msgstr "<kein Zweig gesetzt>"
 
-#: src/cmd_list.cc:659
+#: src/cmd_list.cc:660
 #, c-format
 msgid "%s (in '%s')"
 msgstr "%s (in '%s')"
 
-#: src/cmd_list.cc:663
+#: src/cmd_list.cc:664
 #, c-format
 msgid "no known valid workspaces"
 msgstr "keine bekannten und gültigen Arbeitsbereiche"
 
-#: src/cmd_list.cc:667
+#: src/cmd_list.cc:668
 msgid "Lists known workspaces of a specified database"
 msgstr "Listet bekannte Arbeitsbereiche der gewählten Datenbank"
 
-#: src/cmd_list.cc:677
+#: src/cmd_list.cc:678
 msgid "Lists managed databases and their known workspaces"
 msgstr "Listet verwaltete Datenbanken und deren bekannte Arbeitsbereiche"
 
-#: src/cmd_list.cc:684 src/database.cc:4978
+#: src/cmd_list.cc:685 src/database.cc:4976
 #, c-format
 msgid "no default database location configured"
 msgstr "kein Standard-Datenbankpfad konfiguriert"
 
-#: src/cmd_list.cc:688 src/database.cc:5056
+#: src/cmd_list.cc:689 src/database.cc:5054
 #, c-format
 msgid "could not query default database glob"
 msgstr "konnte nicht das Standarddateimuster für Datenbanken abfragen"
 
-#: src/cmd_list.cc:735
+#: src/cmd_list.cc:736
 #, c-format
 msgid "ignoring database '%s'"
 msgstr "ignoriere Datenbank '%s'"
 
-#: src/cmd_list.cc:739
+#: src/cmd_list.cc:740
 #, c-format
 msgid "%s (in %s):"
 msgstr "%s (in %s):"
 
-#: src/cmd_list.cc:746
+#: src/cmd_list.cc:747
 msgid "Lists workspace files that belong to the current branch"
 msgstr ""
 "Listet Dateien des Arbeitsbereiches auf, die zum derzeitigen Zweig gehören"
 
-#: src/cmd_list.cc:805
+#: src/cmd_list.cc:811
 msgid "Lists workspace files that are unknown in the current branch"
 msgstr ""
 "Listet Dateien des Arbeitsbereiches auf, die im derzeitigen Zweig unbekannt "
 "sind"
 
-#: src/cmd_list.cc:817
+#: src/cmd_list.cc:827
 msgid "Lists workspace files that are ignored in the current branch"
 msgstr ""
 "Listet Dateien des Arbeitsbereiches auf, die im derzeitigen Zweig ignoriert "
 "werden"
 
-#: src/cmd_list.cc:829
+#: src/cmd_list.cc:839
 msgid "Lists files that belong to the branch but are not in the workspace"
 msgstr ""
 "Listet Dateien auf, die zum derzeitigen Zweig gehören, jedoch im "
 "Arbeitsbereich fehlen"
 
-#: src/cmd_list.cc:852
+#: src/cmd_list.cc:862
 msgid "Lists files that have changed with respect to the current revision"
 msgstr ""
 "Listet Dateien auf, die sich gegenüber der Basisrevision des "
 "Arbeitsbereiches geändert haben."
 
-#: src/cmd_list.cc:957
+#: src/cmd_list.cc:967
 msgid "Lists all keys in the keystore"
 msgstr "Listet alle Schlüssel aus dem Schlüsselbund auf"
 
-#: src/cmd_list.cc:962 src/cmd_db.cc:50 src/cmd_db.cc:62 src/cmd_db.cc:74
+#: src/cmd_list.cc:972 src/cmd_db.cc:50 src/cmd_db.cc:62 src/cmd_db.cc:74
 #: src/cmd_db.cc:91 src/cmd_db.cc:105 src/cmd_db.cc:119 src/cmd_db.cc:135
 #: src/cmd_db.cc:325 src/cmd_db.cc:341 src/cmd_db.cc:362 src/cmd_db.cc:380
-#: src/cmd_automate.cc:113 src/cmd_automate.cc:235 src/automate.cc:344
-#: src/automate.cc:370 src/automate.cc:472 src/automate.cc:1320
-#: src/automate.cc:1348 src/automate.cc:1768
+#: src/cmd_automate.cc:113 src/cmd_automate.cc:235 src/automate.cc:377
+#: src/automate.cc:403 src/automate.cc:505 src/automate.cc:1353
+#: src/automate.cc:1381 src/automate.cc:1801
 #, c-format
 msgid "no arguments needed"
 msgstr "keine Parameter benötigt"
 
-#: src/cmd_list.cc:1015 src/cmd_db.cc:610 src/automate.cc:394
-#: src/automate.cc:425
+#: src/cmd_list.cc:1025 src/cmd_db.cc:610 src/automate.cc:427
+#: src/automate.cc:458
 msgid "REV"
 msgstr "REV"
 
-#: src/cmd_list.cc:1016
+#: src/cmd_list.cc:1026
 msgid "Prints all certificates attached to a revision"
 msgstr "Gibt alle Zertifikate, die zu einer Revision gehören, aus"
 
@@ -1523,13 +1523,13 @@ msgstr "leerer Kommentar"
 msgstr "leerer Kommentar"
 
 #: src/cmd_merging.cc:119 src/cmd_merging.cc:438 src/cmd_merging.cc:659
-#: src/cmd_merging.cc:853 src/cmd_merging.cc:986
+#: src/cmd_merging.cc:854
 #, c-format
 msgid "[left]  %s"
 msgstr "[links] %s"
 
 #: src/cmd_merging.cc:120 src/cmd_merging.cc:439 src/cmd_merging.cc:660
-#: src/cmd_merging.cc:854 src/cmd_merging.cc:987
+#: src/cmd_merging.cc:855
 #, c-format
 msgid "[right] %s"
 msgstr "[rechts] %s"
@@ -1559,10 +1559,10 @@ msgstr ""
 "Ziel-Revision befindet sich in keinem Zweig.\n"
 "Beim nächsten Einpflegen wird der Zweig '%s' genutzt"
 
-#: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
-#: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
-#: src/cmd_ws_commit.cc:2270 src/cmd_ws_commit.cc:2385 src/cmd_files.cc:308
-#: src/cmd_files.cc:406 src/automate.cc:1035 src/automate.cc:1328
+#: src/cmd_merging.cc:209 src/cmd_merging.cc:825 src/cmd_ws_commit.cc:370
+#: src/cmd_ws_commit.cc:1370 src/cmd_ws_commit.cc:2078
+#: src/cmd_ws_commit.cc:2306 src/cmd_ws_commit.cc:2421 src/cmd_files.cc:309
+#: src/cmd_files.cc:407 src/automate.cc:1068 src/automate.cc:1361
 #, c-format
 msgid "this command can only be used in a single-parent workspace"
 msgstr ""
@@ -1657,7 +1657,7 @@ msgstr "höchstens ein Revisionsselektor
 msgid "at most one revision selector may be specified"
 msgstr "höchstens ein Revisionsselektor darf angegeben werden"
 
-#: src/cmd_merging.cc:452 src/cmd_merging.cc:763
+#: src/cmd_merging.cc:452 src/cmd_merging.cc:764
 #, c-format
 msgid "[merged] %s"
 msgstr "[vereinigt] %s"
@@ -1666,7 +1666,7 @@ msgstr "Führt nicht-vereinigte Köpfe e
 msgid "Merges unmerged heads of a branch"
 msgstr "Führt nicht-vereinigte Köpfe eines Zweiges zusammen"
 
-#: src/cmd_merging.cc:528 src/cmd_merging.cc:1121 src/cmd_merging.cc:1462
+#: src/cmd_merging.cc:528 src/cmd_merging.cc:1129 src/cmd_merging.cc:1470
 #, c-format
 msgid "please specify a branch, with '--branch=BRANCH'"
 msgstr "bitte geben Sie einen Zweig mit '--branch=ZWEIG' an"
@@ -1731,34 +1731,34 @@ msgstr "Pfad '%s' wurde im Ziel-Baum nic
 msgid "Path '%s' not found in destination tree."
 msgstr "Pfad '%s' wurde im Ziel-Baum nicht gefunden."
 
-#: src/cmd_merging.cc:770
+#: src/cmd_merging.cc:771
 msgid "SOURCE-BRANCH DEST-BRANCH"
 msgstr "QUELL-ZWEIG ZIEL-ZWEIG"
 
-#: src/cmd_merging.cc:771
+#: src/cmd_merging.cc:772
 msgid "Merges from one branch to another asymmetrically"
 msgstr "Überführt die Änderungen eines Zweigs auf einen anderen asymmetrisch"
 
-#: src/cmd_merging.cc:784
+#: src/cmd_merging.cc:785
 msgid "SOURCE-BRANCH DEST-BRANCH DIR"
 msgstr "QUELL-ZWEIG ZIEL-ZWEIG VERZEICHNIS"
 
-#: src/cmd_merging.cc:785
+#: src/cmd_merging.cc:786
 msgid "Merges one branch into a subdirectory in another branch"
 msgstr ""
 "Überführt die Änderungen eines Zweigs in ein Unterverzeichnis eines anderen "
 "Zweigs"
 
-#: src/cmd_merging.cc:794
+#: src/cmd_merging.cc:795
 msgid "OTHER-REVISION"
 msgstr "ANDERE-REVISION"
 
-#: src/cmd_merging.cc:795
+#: src/cmd_merging.cc:796
 msgid "Merges a revision into the current workspace's base revision"
 msgstr ""
 "Überführt die Änderungen einer Revision in den derzeitigen Arbeitsbereich"
 
-#: src/cmd_merging.cc:796
+#: src/cmd_merging.cc:797
 msgid ""
 "Merges OTHER-REVISION into the current workspace's base revision, and update "
 "the current workspace with the result.  There can be no pending changes in "
@@ -1773,24 +1773,24 @@ msgstr ""
 "Elternrevision beim Einpflegen aufgenommen.  Der gewählte Zweig des "
 "Arbeitsbereiches bleibt unverändert."
 
-#: src/cmd_merging.cc:831
+#: src/cmd_merging.cc:832
 #, c-format
 msgid "'%s' can only be used in a workspace with no pending changes"
 msgstr ""
 "'%s' kann nur in Arbeitsbereichen genutzt werden, die keine Änderungen "
 "aufweisen."
 
-#: src/cmd_merging.cc:845
+#: src/cmd_merging.cc:846
 #, c-format
 msgid "workspace is already at revision %s"
 msgstr "Arbeitsbereich ist bereits auf die Revision %s aktualisiert"
 
-#: src/cmd_merging.cc:848
+#: src/cmd_merging.cc:849
 #, c-format
 msgid "revision %s is already an ancestor of your workspace"
 msgstr "Revision %s ist bereits ein Vorfahre Ihres Arbeitsbereichs"
 
-#: src/cmd_merging.cc:850
+#: src/cmd_merging.cc:851
 #, c-format
 msgid ""
 "revision %s is a descendant of the workspace parent,\n"
@@ -1799,7 +1799,7 @@ msgstr ""
 "Revision %s ist ein Nachkomme der Basisrevision Ihres Arbeitsbereichs,\n"
 "meinten Sie 'mtn update -r %s'?"
 
-#: src/cmd_merging.cc:903
+#: src/cmd_merging.cc:905
 #, c-format
 msgid ""
 "updated to result of merge\n"
@@ -1810,63 +1810,78 @@ msgstr ""
 " [links] %s\n"
 "[rechts] %s\n"
 
-#: src/cmd_merging.cc:911
+#: src/cmd_merging.cc:913
 msgid "LEFT-REVISION RIGHT-REVISION DEST-BRANCH"
 msgstr "LINKE_REVISION RECHTE_REVISION ZIEL_ZWEIG"
 
-#: src/cmd_merging.cc:912
+#: src/cmd_merging.cc:914
 msgid "Merges two explicitly given revisions"
 msgstr "Vereinigt zwei explizit übergebene Revisionen"
 
-#: src/cmd_merging.cc:913
+#: src/cmd_merging.cc:915
 msgid ""
 "The results of the merge are placed on the branch specified by DEST-BRANCH."
 msgstr "Das Ergebnis der Vereinigung wird in den Zweig ZIEL_ZWEIG platziert."
 
-#: src/cmd_merging.cc:935
+#: src/cmd_merging.cc:937
 #, c-format
 msgid "%s and %s are the same revision, aborting"
 msgstr "%s und %s sind dieselben Revisionen, breche ab"
 
-#: src/cmd_merging.cc:938 src/cmd_merging.cc:941
+#: src/cmd_merging.cc:940 src/cmd_merging.cc:943
 #, c-format
 msgid "%s is already an ancestor of %s"
 msgstr "%s ist bereits ein Vorfahre von %s"
 
-#: src/cmd_merging.cc:999 src/cmd_merging.cc:1014
+#: src/cmd_merging.cc:988
 #, c-format
+msgid "[left]     %s"
+msgstr "[links]    %s"
+
+#: src/cmd_merging.cc:989
+#, c-format
+msgid "[right]    %s"
+msgstr "[rechts]    %s"
+
+#: src/cmd_merging.cc:1001 src/cmd_merging.cc:1016
+#, c-format
 msgid "%s is an ancestor of %s; no merge is needed."
 msgstr "%s ist ein Vorgänger von %s; kein Vereinigen notwendig."
 
-#: src/cmd_merging.cc:1042
+#: src/cmd_merging.cc:1044
 #, c-format
 msgid "0 conflicts"
 msgstr "0 Konflikte"
 
-#: src/cmd_merging.cc:1077
+#: src/cmd_merging.cc:1060
 #, c-format
+msgid "[ancestor] %s"
+msgstr "[Vorfahr] %s"
+
+#: src/cmd_merging.cc:1085
+#, c-format
 msgid "%d conflict with supported resolutions."
 msgid_plural "%d conflicts with supported resolutions."
 msgstr[0] "%d Konflikt mit unterstützten Konfliktlösungen"
 msgstr[1] "%d Konflikte mit unterstützten Konfliktlösungen"
 
-#: src/cmd_merging.cc:1082 src/cmd_conflicts.cc:160 src/cmd_conflicts.cc:173
+#: src/cmd_merging.cc:1090 src/cmd_conflicts.cc:298 src/cmd_conflicts.cc:311
 #, c-format
 msgid "warning: %d conflict with no supported resolutions."
 msgid_plural "warning: %d conflicts with no supported resolutions."
 msgstr[0] "Warnung: %d Konflikt ohne unterstützte Konfliktlösungen"
 msgstr[1] "Warnung: %d Konflikte ohne unterstützte Konfliktlösungen"
 
-#: src/cmd_merging.cc:1089
+#: src/cmd_merging.cc:1097
 msgid "REV REV"
 msgstr "REVISION REVISION"
 
-#: src/cmd_merging.cc:1090
+#: src/cmd_merging.cc:1098
 msgid "Shows what conflicts need resolution between two revisions"
 msgstr ""
 "Zeigt, welche Konflikte zwischen zwei Revisionen behoben werden müssten."
 
-#: src/cmd_merging.cc:1091
+#: src/cmd_merging.cc:1099
 msgid ""
 "The conflicts are calculated based on the two revisions given in the REV "
 "parameters."
@@ -1874,21 +1889,21 @@ msgstr ""
 "Die Konflikte werden basierend auf den zwei übergebenen REVISION-Argumenten "
 "berechnet."
 
-#: src/cmd_merging.cc:1128
+#: src/cmd_merging.cc:1136
 #, c-format
 msgid "branch '%s' has only 1 head; must be at least 2 for conflicts"
 msgstr ""
 "Zweig '%s' hat nur einen Kopf; es müssen mindestens zwei für conflicts sein"
 
-#: src/cmd_merging.cc:1161
+#: src/cmd_merging.cc:1169
 msgid "[LEFT_REVID RIGHT_REVID]"
 msgstr "[LINKE_REVID RECHTE_REVID]"
 
-#: src/cmd_merging.cc:1162
+#: src/cmd_merging.cc:1170
 msgid "Shows the conflicts between two revisions"
 msgstr "Zeigt die Konflikte zwischen zwei Revisionen"
 
-#: src/cmd_merging.cc:1163
+#: src/cmd_merging.cc:1171
 msgid ""
 "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
 "two heads that would be chosen by the 'merge' command."
@@ -1897,11 +1912,11 @@ msgstr ""
 "standardmäßig mit den ersten zwei Köpfen vorbelegt, die auch das 'merge'-"
 "Kommando auswählen würde."
 
-#: src/cmd_merging.cc:1180
+#: src/cmd_merging.cc:1188
 msgid "Store the conflicts from merging two revisions"
 msgstr "Speichert die Konflikte vom Zusammenführen zweier Revisionen"
 
-#: src/cmd_merging.cc:1181
+#: src/cmd_merging.cc:1189
 #, c-format
 msgid ""
 "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
@@ -1913,21 +1928,21 @@ msgstr ""
 "Kommando auswählen würde. Wenn die Option '--conflicts-file' nicht übergeben "
 "wird, wird '%s' benutzt."
 
-#: src/cmd_merging.cc:1190 src/options_list.hh:603 src/options_list.hh:624
+#: src/cmd_merging.cc:1198 src/options_list.hh:603 src/options_list.hh:624
 #, c-format
 msgid "conflicts file must be under '_MTN'"
 msgstr "Konfliktdatei muss sich unterhalb des '_MTN'-Verzeichnisses befinden"
 
-#: src/cmd_merging.cc:1202
+#: src/cmd_merging.cc:1210
 #, c-format
 msgid "stored in '%s'"
 msgstr "in '%s' gespeichert"
 
-#: src/cmd_merging.cc:1205
+#: src/cmd_merging.cc:1213
 msgid "LEFT_REVID LEFT_FILENAME RIGHT_REVID RIGHT_FILENAME"
 msgstr "LINKE_REVID LINKER_DATEINAME RECHTE_REVID RECHTER_DATEINAME"
 
-#: src/cmd_merging.cc:1206
+#: src/cmd_merging.cc:1214
 msgid ""
 "Prints the results of the internal line merger, given two child revisions "
 "and file names"
@@ -1935,22 +1950,22 @@ msgstr ""
 "Gibt die Ergebnisse des internen Zeilenzusammenführers anhand der "
 "übergebenen beiden Kindrevisionen und Dateinamen aus"
 
-#: src/cmd_merging.cc:1258
+#: src/cmd_merging.cc:1266
 #, c-format
 msgid "internal line merger failed"
 msgstr "Ausführung des internen Zeilenzusammenführers fehlgeschlagen"
 
-#: src/cmd_merging.cc:1263
+#: src/cmd_merging.cc:1271
 msgid "[PATH...]"
 msgstr "[PFAD...]"
 
-#: src/cmd_merging.cc:1264
+#: src/cmd_merging.cc:1272
 msgid "Applies changes made at arbitrary places in history"
 msgstr ""
 "Wendet Änderungen an, die an beliebigen Stellen in der Historie vollzogen "
 "wurden"
 
-#: src/cmd_merging.cc:1265
+#: src/cmd_merging.cc:1273
 msgid ""
 "This command takes changes made at any point in history, and edits your "
 "current workspace to include those changes.  The end result is identical to "
@@ -1973,7 +1988,7 @@ msgstr ""
 "Wenn zwei Revisionen übergeben wurden, werden die Änderungen, die zwischen "
 "der ersten und der zweiten Revision gemacht wurden, angewendet."
 
-#: src/cmd_merging.cc:1289
+#: src/cmd_merging.cc:1297
 #, c-format
 msgid ""
 "revision %s is a merge.\n"
@@ -1985,50 +2000,50 @@ msgstr ""
 "Sie:\n"
 "  %s pluck -r ELTERNREVISION -r %s"
 
-#: src/cmd_merging.cc:1305
+#: src/cmd_merging.cc:1313
 #, c-format
 msgid "no changes to apply"
 msgstr "keine Änderungen anwendbar"
 
-#: src/cmd_merging.cc:1367
+#: src/cmd_merging.cc:1375
 #, c-format
 msgid "no changes to be applied"
 msgstr "Es gab keine Änderungen vorzunehmen."
 
-#: src/cmd_merging.cc:1417
+#: src/cmd_merging.cc:1425
 #, c-format
 msgid "no changes were applied"
 msgstr "Es wurden keine Änderungen vorgenommen."
 
-#: src/cmd_merging.cc:1421
+#: src/cmd_merging.cc:1429
 #, c-format
 msgid "applied changes to workspace"
 msgstr "Änderungen auf Arbeitsbereich angewendet"
 
-#: src/cmd_merging.cc:1453
+#: src/cmd_merging.cc:1461
 msgid "Shows unmerged head revisions of a branch"
 msgstr "Zeigt nicht-vereinigte Köpfe (Revisionen) eines Zweiges"
 
-#: src/cmd_merging.cc:1473
+#: src/cmd_merging.cc:1481
 #, c-format
 msgid "branch '%s' is currently merged:"
 msgstr "Zweig '%s' ist derzeit vereinigt:"
 
-#: src/cmd_merging.cc:1475
+#: src/cmd_merging.cc:1483
 #, c-format
 msgid "branch '%s' is currently unmerged:"
 msgstr "Zweig '%s' ist derzeit nicht vereinigt:"
 
-#: src/cmd_merging.cc:1482 src/automate.cc:1411
+#: src/cmd_merging.cc:1490 src/automate.cc:1444
 msgid "[REVID]"
 msgstr "[REVISIONS_ID]"
 
-#: src/cmd_merging.cc:1483
+#: src/cmd_merging.cc:1491
 msgid "Dumps the roster associated with a given identifier"
 msgstr ""
 "Exportiert den Katalog, welcher einer gegebenen Revisions-ID zugeordnet ist"
 
-#: src/cmd_merging.cc:1484
+#: src/cmd_merging.cc:1492
 msgid "If no REVID is given, the workspace is used."
 msgstr "Wenn keine REVID übergeben wurde, wird der Arbeitsbereich genutzt."
 
@@ -2151,7 +2166,7 @@ msgid "Kills a revision from the local d
 
 #: src/cmd_db.cc:177
 msgid "Kills a revision from the local database"
-msgstr "Löscht eine Revision von der lokalen Datenbank"
+msgstr "Löscht eine Revision aus der lokalen Datenbank"
 
 #: src/cmd_db.cc:194
 #, c-format
@@ -2229,11 +2244,11 @@ msgstr "Die Epoche muss %d Zeichen sein"
 msgid "The epoch must be %d characters"
 msgstr "Die Epoche muss %d Zeichen sein"
 
-#: src/cmd_db.cc:414 src/automate.cc:2266
+#: src/cmd_db.cc:414 src/automate.cc:2299
 msgid "DOMAIN NAME VALUE"
 msgstr "DOMÄNE NAME WERT"
 
-#: src/cmd_db.cc:415 src/automate.cc:2267
+#: src/cmd_db.cc:415 src/automate.cc:2300
 msgid "Sets a database variable"
 msgstr "Setzt eine Datenbankvariable"
 
@@ -2263,7 +2278,7 @@ msgstr ""
 "Dieses Kommando entfernt die Variable NAME von der Domäne DOMÄNE, die vorher "
 "in der Datenbank gespeichert war."
 
-#: src/cmd_db.cc:450 src/automate.cc:2313
+#: src/cmd_db.cc:450 src/automate.cc:2346
 #, c-format
 msgid "no var with name '%s' in domain '%s'"
 msgstr "keine Variable mit dem Namen '%s' in der Domäne '%s'"
@@ -2284,7 +2299,7 @@ msgstr ""
 
 #: src/cmd_db.cc:464 src/cmd_db.cc:486
 #, c-format
-msgid "No workspace given"
+msgid "no workspace given"
 msgstr "Kein Arbeitsbereich angegeben"
 
 #: src/cmd_db.cc:478
@@ -2340,8 +2355,8 @@ msgstr "zwischengespeicherte Höhenangab
 msgstr "zwischengespeicherte Höhenangabe: %s"
 
 #: src/cmd_db.cc:630
-msgid "load all revisions from the database"
-msgstr "läd alle Revision aus der Datenbank"
+msgid "Load all revisions from the database"
+msgstr "läd alle Revisionen aus der Datenbank"
 
 #: src/cmd_db.cc:631
 msgid ""
@@ -2362,7 +2377,7 @@ msgstr "Revisionen"
 msgstr "Revisionen"
 
 #: src/cmd_db.cc:659
-msgid "load all roster versions from the database"
+msgid "Load all roster versions from the database"
 msgstr "läd alle Katalog-Versionen aus der Datenbank"
 
 #: src/cmd_db.cc:660
@@ -2383,7 +2398,7 @@ msgstr "Kataloge"
 msgstr "Kataloge"
 
 #: src/cmd_db.cc:687
-msgid "load all file versions from the database"
+msgid "Load all file versions from the database"
 msgstr "läd alle Dateiversionen aus der Datenbank"
 
 #: src/cmd_db.cc:688
@@ -2404,7 +2419,7 @@ msgstr "Dateien"
 msgstr "Dateien"
 
 #: src/cmd_db.cc:713
-msgid "load all certs from the database"
+msgid "Load all certs from the database"
 msgstr "läd alle Zertifikate aus der Datenbank"
 
 #: src/cmd_db.cc:714
@@ -2425,17 +2440,17 @@ msgstr "%d Zertifikate geladen"
 msgid "loaded %d certs"
 msgstr "%d Zertifikate geladen"
 
-#: src/cmd_diff_log.cc:247
+#: src/cmd_diff_log.cc:259
 #, c-format
 msgid "more than two revisions given"
 msgstr "mehr als zwei Revisionen wurden übergeben"
 
-#: src/cmd_diff_log.cc:250
+#: src/cmd_diff_log.cc:262
 #, c-format
 msgid "'--reverse' only allowed with exactly one revision"
 msgstr "'--reverse' erlaubt die Angabe von genau nur einer Revision"
 
-#: src/cmd_diff_log.cc:263
+#: src/cmd_diff_log.cc:275
 #, c-format
 msgid ""
 "this workspace has more than one parent\n"
@@ -2445,21 +2460,21 @@ msgstr ""
 "(Geben Sie die Revision, gegen die Änderungen angezeigt werden sollen, "
 "explizit mit '--revision' an.)"
 
-#: src/cmd_diff_log.cc:407 src/rev_output.cc:147
+#: src/cmd_diff_log.cc:422 src/rev_output.cc:164
 msgid "no changes"
 msgstr "keine Änderungen"
 
-#: src/cmd_diff_log.cc:416 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:776
-#: src/cmd_ws_commit.cc:818 src/cmd_ws_commit.cc:890 src/cmd_ws_commit.cc:1808
-#: src/automate.cc:1019
+#: src/cmd_diff_log.cc:431 src/cmd_ws_commit.cc:537 src/cmd_ws_commit.cc:786
+#: src/cmd_ws_commit.cc:828 src/cmd_ws_commit.cc:900 src/cmd_ws_commit.cc:1844
+#: src/automate.cc:1052
 msgid "[PATH]..."
 msgstr "[PFAD]..."
 
-#: src/cmd_diff_log.cc:417
+#: src/cmd_diff_log.cc:432
 msgid "Shows current differences"
 msgstr "Zeigt die derzeitigen Unterschiede"
 
-#: src/cmd_diff_log.cc:418
+#: src/cmd_diff_log.cc:433
 msgid ""
 "Compares the current tree with the files in the repository and prints the "
 "differences on the standard output.\n"
@@ -2474,7 +2489,7 @@ msgstr ""
 "Unterschiede zwischen diesen beiden ausgegeben.  Wenn kein Format angegeben "
 "wurde, wird standardmäßig 'unified' verwendet."
 
-#: src/cmd_diff_log.cc:429
+#: src/cmd_diff_log.cc:444
 #, c-format
 msgid ""
 "'--diff-args' requires '--external'; try adding '--external' or remove '--"
@@ -2483,31 +2498,31 @@ msgstr ""
 "'--diff-args' benötigt '--external'; fügen Sie '--external' hinzu oder "
 "entfernen Sie '--diff-args'"
 
-#: src/cmd_diff_log.cc:462
+#: src/cmd_diff_log.cc:477
 msgid "[FILE [...]]"
 msgstr "[DATEI [...]]"
 
-#: src/cmd_diff_log.cc:463
+#: src/cmd_diff_log.cc:478
 msgid "Calculates diffs of files"
 msgstr "Berechnet die Unterschiede in Dateien"
 
-#: src/cmd_diff_log.cc:643
+#: src/cmd_diff_log.cc:658
 #, c-format
 msgid "only one of '--last'/'--next' allowed"
 msgstr "'--last' und '--next' sind nur einmal erlaubt"
 
-#: src/cmd_diff_log.cc:660
+#: src/cmd_diff_log.cc:675
 #, c-format
 msgid "try passing a '--from' revision to start at"
 msgstr "Versuchen Sie, über die Option '--from' eine Startrevision anzugeben."
 
-#: src/cmd_diff_log.cc:669
+#: src/cmd_diff_log.cc:684
 #, c-format
 msgid "workspace has no parent revision, probably an empty branch"
 msgstr ""
 "Arbeitsbereich hat keine Elternrevision, wahrscheinlich ein leerer Zweig"
 
-#: src/cmd_diff_log.cc:672
+#: src/cmd_diff_log.cc:687
 #, c-format
 msgid ""
 "workspace parent revision %s not found - did you specify a wrong database?"
@@ -2515,20 +2530,20 @@ msgstr ""
 "Eltern-Revision %s des Arbeitsbereiches wurde nicht gefunden - haben Sie "
 "eine falsche Datenbank angegeben?"
 
-#: src/cmd_diff_log.cc:958
+#: src/cmd_diff_log.cc:973
 #, c-format
 msgid "(Revision: %s)"
 msgstr "(Revision: %s)"
 
-#: src/cmd_diff_log.cc:980 src/cmd_diff_log.cc:994
+#: src/cmd_diff_log.cc:995 src/cmd_diff_log.cc:1009
 msgid "[PATH] ..."
 msgstr "[PFAD] ..."
 
-#: src/cmd_diff_log.cc:981
+#: src/cmd_diff_log.cc:996
 msgid "Prints selected history in forward or reverse order"
 msgstr "Gibt die ausgewählte Historie vorwärts oder rückwärts aus"
 
-#: src/cmd_diff_log.cc:982
+#: src/cmd_diff_log.cc:997
 msgid ""
 "This command prints selected history in forward or reverse order, filtering "
 "it by PATH if given."
@@ -2536,7 +2551,7 @@ msgstr ""
 "Dieses Kommando gibt die ausgewählte Historie vorwärts oder rückwärts aus, "
 "gefiltert durch PFAD, sofern angegeben."
 
-#: src/cmd_diff_log.cc:995
+#: src/cmd_diff_log.cc:1010
 msgid "Lists the selected revision history"
 msgstr "Listet die ausgewählte Revisionshistorie"
 
@@ -2592,19 +2607,19 @@ msgstr ""
 "Datumsformat '%s' kann nicht analysiert werden; nutze stattdessen "
 "Standardformat"
 
-#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:985
+#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:995
 msgid "*** THIS REVISION WILL CREATE A NEW BRANCH ***"
 msgstr "*** DIESE REVISION ERZEUGT EINEN NEUEN ZWEIG ***"
 
-#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:988
+#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:998
 msgid "Old Branch: "
 msgstr "Alter Zweig: "
 
-#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:989
+#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:999
 msgid "New Branch: "
 msgstr "Neuer Zweig: "
 
-#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1000
+#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1010
 msgid "*** THIS REVISION WILL CREATE DIVERGENCE ***"
 msgstr "*** DIESE REVISION WIRD EINEN NEUEN KOPF ERZEUGEN ***"
 
@@ -2680,25 +2695,25 @@ msgstr "erzeuge '%s/' neu"
 msgid "recreating '%s/'"
 msgstr "erzeuge '%s/' neu"
 
-#: src/cmd_ws_commit.cc:539
+#: src/cmd_ws_commit.cc:538
 msgid "Reverts files and/or directories"
 msgstr "Setzt Dateien und/oder Verzeichnisse zurück"
 
-#: src/cmd_ws_commit.cc:540
+#: src/cmd_ws_commit.cc:539
 msgid "In order to revert the entire workspace, specify '.' as the file name."
 msgstr ""
 "Um den gesamten Arbeitsbereich zurückzusetzen, muss '.' als Dateiname "
 "übergeben werden."
 
-#: src/cmd_ws_commit.cc:547
+#: src/cmd_ws_commit.cc:546
 msgid "PATH..."
 msgstr "PFAD..."
 
-#: src/cmd_ws_commit.cc:548
+#: src/cmd_ws_commit.cc:547
 msgid "Reverses a mistaken 'drop'"
 msgstr "Hebt ein falsches 'drop' auf"
 
-#: src/cmd_ws_commit.cc:549
+#: src/cmd_ws_commit.cc:548
 msgid ""
 "If the file was deleted from the workspace, this is the same as 'revert'. "
 "Otherwise, it just removes the 'drop' from the manifest."
@@ -2707,36 +2722,36 @@ msgstr ""
 "Kommando wie 'revert'.  Andernfalls entfernt es lediglich den 'drop'-Eintrag "
 "aus der Änderungsliste des Arbeitsbereichs, ohne die Datei selbst anzufassen."
 
-#: src/cmd_ws_commit.cc:566 src/cmd_ws_commit.cc:575
+#: src/cmd_ws_commit.cc:565 src/cmd_ws_commit.cc:574
 #, c-format
 msgid "revision %s it not a child of %s, cannot invert"
 msgstr "Revision %s ist kein Kind von %s, kann nicht umkehren"
 
-#: src/cmd_ws_commit.cc:571 src/cmd_ws_commit.cc:610 src/cmd_ws_commit.cc:650
+#: src/cmd_ws_commit.cc:570 src/cmd_ws_commit.cc:609 src/cmd_ws_commit.cc:649
 #, c-format
 msgid "revision %s has %d parents, cannot invert"
 msgstr "Revision %s hat %d Eltern, kann nicht umkehren"
 
-#: src/cmd_ws_commit.cc:583
+#: src/cmd_ws_commit.cc:582
 msgid "[PARENT-REVISION] CHILD-REVISION"
 msgstr "[ELTERN-REVISION] KIND-REVISION"
 
-#: src/cmd_ws_commit.cc:584
+#: src/cmd_ws_commit.cc:583
 msgid "Disapproves a particular revision or revision range"
 msgstr "Verwirft eine bestimmte Revision oder eine Auswahl von Revisionen"
 
-#: src/cmd_ws_commit.cc:615 src/cmd_ws_commit.cc:655
+#: src/cmd_ws_commit.cc:614 src/cmd_ws_commit.cc:654
 #, c-format
 msgid "need '--branch' argument for disapproval"
 msgstr "benötige '--branch'-Parameter für das Verwerfen"
 
-#: src/cmd_ws_commit.cc:638
+#: src/cmd_ws_commit.cc:637
 #, c-format
 msgid "revisions %s and %s do not share common history, cannot invert"
 msgstr ""
 "Revision %s und %s teilen keine gemeinsame Historie, kann nicht umkehren"
 
-#: src/cmd_ws_commit.cc:641
+#: src/cmd_ws_commit.cc:640
 #, c-format
 msgid ""
 "revisions share common history, but %s is not an ancestor of %s, cannot "
@@ -2745,8 +2760,13 @@ msgstr ""
 "Revisionen teilen gemeinsame Historie, aber %s ist kein Vorfahr von %s, kann "
 "nicht umkehren"
 
-#: src/cmd_ws_commit.cc:702 src/cmd_ws_commit.cc:1771
+#: src/cmd_ws_commit.cc:673
 #, c-format
+msgid "cannot disapprove root revision"
+msgstr "kann Wurzel-Revision nicht verwerfen"
+
+#: src/cmd_ws_commit.cc:703 src/cmd_ws_commit.cc:1807
+#, c-format
 msgid ""
 "note: this revision creates divergence\n"
 "note: you may (or may not) wish to run '%s merge'"
@@ -2754,33 +2774,33 @@ msgstr ""
 "Hinweis: Diese Revision erzeugt einen neuen Kopf\n"
 "Hinweis: Sie möchten eventuell '%s merge' ausführen"
 
-#: src/cmd_ws_commit.cc:709
+#: src/cmd_ws_commit.cc:710
 msgid "[DIRECTORY...]"
 msgstr "[VERZEICHNIS...]"
 
-#: src/cmd_ws_commit.cc:710
+#: src/cmd_ws_commit.cc:711
 msgid "Creates directories and adds them to the workspace"
 msgstr "Erzeugt Verzeichnisse und fügt sie zum Arbeitsbereich hinzu"
 
-#: src/cmd_ws_commit.cc:728
+#: src/cmd_ws_commit.cc:729
 #, c-format
 msgid "directory '%s' already exists"
 msgstr "Das Verzeichnis '%s' existiert bereits."
 
-#: src/cmd_ws_commit.cc:735
+#: src/cmd_ws_commit.cc:736
 #, c-format
 msgid "ignoring directory '%s' (see '.mtn-ignore')"
 msgstr "ignoriere Verzeichnis '%s' (siehe '.mtn-ignore')"
 
-#: src/cmd_ws_commit.cc:777
+#: src/cmd_ws_commit.cc:787
 msgid "Adds files to the workspace"
 msgstr "Fügt Dateien zum Arbeitsbereich hinzu"
 
-#: src/cmd_ws_commit.cc:819
+#: src/cmd_ws_commit.cc:829
 msgid "Drops files from the workspace"
 msgstr "Entfernt Dateien vom Arbeitsbereich"
 
-#: src/cmd_ws_commit.cc:834
+#: src/cmd_ws_commit.cc:844
 msgid ""
 "SRC DEST\n"
 "SRC1 [SRC2 [...]] DEST_DIR"
@@ -2788,24 +2808,24 @@ msgstr ""
 "QUELLE ZIEL\n"
 "QUELLE1 [QUELLE2 [...]] ZIEL_VERZEICHNIS"
 
-#: src/cmd_ws_commit.cc:836
+#: src/cmd_ws_commit.cc:846
 msgid "Renames entries in the workspace"
 msgstr "Benennt Einträge im Arbeitsbereich um"
 
-#: src/cmd_ws_commit.cc:862
+#: src/cmd_ws_commit.cc:872
 #, c-format
 msgid "the specified target directory '%s/' doesn't exist."
 msgstr "Das angegebene Ziel-Verzeichnis '%s/' existiert nicht."
 
-#: src/cmd_ws_commit.cc:868
+#: src/cmd_ws_commit.cc:878
 msgid "NEW_ROOT PUT_OLD"
 msgstr "NEUE_WURZEL ALTE_WURZEL"
 
-#: src/cmd_ws_commit.cc:869
+#: src/cmd_ws_commit.cc:879
 msgid "Renames the root directory"
 msgstr "Benennt das Wurzelverzeichnis um"
 
-#: src/cmd_ws_commit.cc:870
+#: src/cmd_ws_commit.cc:880
 msgid ""
 "After this command, the directory that currently has the name NEW_ROOT will "
 "be the root directory, and the directory that is currently the root "
@@ -2817,52 +2837,52 @@ msgstr ""
 "ALTE_WURZEL erhält.\n"
 "Die Benutzung von '--bookkeep-only' wird NICHT empfohlen."
 
-#: src/cmd_ws_commit.cc:891
+#: src/cmd_ws_commit.cc:901
 msgid "Shows workspace's status information"
 msgstr "Zeigt Status-Informationen des Arbeitsbereiches"
 
-#: src/cmd_ws_commit.cc:929
+#: src/cmd_ws_commit.cc:939
 #, c-format
 msgid "bisection from revision %s in progress"
 msgstr "Bisektion von Revision %s wird durchgeführt"
 
-#: src/cmd_ws_commit.cc:1024
+#: src/cmd_ws_commit.cc:1034
 #, c-format
 msgid "use '--revision' or '--branch' to specify what to checkout"
 msgstr ""
 "nutzen Sie '--revision' oder '--branch' um festzulegen, was ausgecheckt "
 "werden soll"
 
-#: src/cmd_ws_commit.cc:1037
+#: src/cmd_ws_commit.cc:1047
 #, c-format
 msgid "choose one with '%s checkout -r<id>'"
 msgstr "wählen Sie einen durch '%s checkout -r<id>'"
 
-#: src/cmd_ws_commit.cc:1054
+#: src/cmd_ws_commit.cc:1064
 #, c-format
 msgid "revision %s is not a member of branch %s"
 msgstr "Revision %s ist nicht Mitglied des Zweiges %s"
 
-#: src/cmd_ws_commit.cc:1071
+#: src/cmd_ws_commit.cc:1081
 #, c-format
 msgid "you must specify a destination directory"
 msgstr "Es muss ein Zielverzeichnis angegeben werden."
 
-#: src/cmd_ws_commit.cc:1084
+#: src/cmd_ws_commit.cc:1094
 #, c-format
 msgid "checkout directory '%s' already exists"
 msgstr "Das Verzeichnis '%s' zum Auschecken existiert bereits."
 
-#: src/cmd_ws_commit.cc:1111 src/cmd_ws_commit.cc:1125
-#: src/cmd_ws_commit.cc:1821 src/cmd_ws_commit.cc:1978
+#: src/cmd_ws_commit.cc:1121 src/cmd_ws_commit.cc:1135
+#: src/cmd_ws_commit.cc:1857 src/cmd_ws_commit.cc:2014
 msgid "[DIRECTORY]"
 msgstr "[VERZEICHNIS]"
 
-#: src/cmd_ws_commit.cc:1112 src/cmd_ws_commit.cc:1126
+#: src/cmd_ws_commit.cc:1122 src/cmd_ws_commit.cc:1136
 msgid "Checks out a revision from the database into a directory"
 msgstr "Checkt eine Revision aus der Datenbank in ein Verzeichnis aus"
 
-#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1123 src/cmd_ws_commit.cc:1137
 msgid ""
 "If a revision is given, that's the one that will be checked out.  Otherwise, "
 "it will be the head of the branch (given or implicit).  If no directory is "
@@ -2873,41 +2893,41 @@ msgstr ""
 "ausgecheckt.  Wenn kein Verzeichnis angegeben wird, wird der Zweigname als "
 "Verzeichnisname verwendet."
 
-#: src/cmd_ws_commit.cc:1137
+#: src/cmd_ws_commit.cc:1147
 #, c-format
 msgid "wrong revision count"
 msgstr "falsche Anzahl von Revisionen"
 
-#: src/cmd_ws_commit.cc:1143
+#: src/cmd_ws_commit.cc:1153
 msgid "Manages file attributes"
 msgstr "Verwaltet Dateiattribute"
 
-#: src/cmd_ws_commit.cc:1144
+#: src/cmd_ws_commit.cc:1154
 msgid "This command is used to set, get or drop file attributes."
 msgstr ""
 "Dieses Kommando wird benutzt, um Dateiattribute zu setzen, zu holen oder zu "
 "löschen."
 
-#: src/cmd_ws_commit.cc:1163 src/cmd_ws_commit.cc:1231
-#: src/cmd_ws_commit.cc:1281 src/cmd_ws_commit.cc:1362
+#: src/cmd_ws_commit.cc:1173 src/cmd_ws_commit.cc:1241
+#: src/cmd_ws_commit.cc:1291 src/cmd_ws_commit.cc:1374
 #, c-format
 msgid "unknown path '%s'"
 msgstr "unbekannter Pfad '%s'"
 
-#: src/cmd_ws_commit.cc:1180
+#: src/cmd_ws_commit.cc:1190
 #, c-format
 msgid "path '%s' does not have attribute '%s'"
 msgstr "Pfad '%s' hat kein Attribut '%s'"
 
-#: src/cmd_ws_commit.cc:1199 src/cmd_ws_commit.cc:1212
+#: src/cmd_ws_commit.cc:1209 src/cmd_ws_commit.cc:1222
 msgid "PATH [ATTR]"
 msgstr "PFAD [ATTRIBUT]"
 
-#: src/cmd_ws_commit.cc:1200
+#: src/cmd_ws_commit.cc:1210
 msgid "Removes attributes from a file"
 msgstr "Entfernt Attribute von einer Datei"
 
-#: src/cmd_ws_commit.cc:1201
+#: src/cmd_ws_commit.cc:1211
 msgid ""
 "If no attribute is specified, this command removes all attributes attached "
 "to the file given in PATH.  Otherwise only removes the attribute specified "
@@ -2917,11 +2937,11 @@ msgstr ""
 "die einer Datei zugeordnet wurden.  Andernfalls wird lediglich das "
 "übergebene Attribut entfernt."
 
-#: src/cmd_ws_commit.cc:1213
+#: src/cmd_ws_commit.cc:1223
 msgid "Gets the values of a file's attributes"
 msgstr "Gibt den Wert eines Dateiattributs aus"
 
-#: src/cmd_ws_commit.cc:1214
+#: src/cmd_ws_commit.cc:1224
 msgid ""
 "If no attribute is specified, this command prints all attributes attached to "
 "the file given in PATH.  Otherwise it only prints the attribute specified in "
@@ -2931,61 +2951,79 @@ msgstr ""
 "die der Datei zugeordnet wurden.  Andernfalls wird lediglich der Wert des "
 "übergebenen Attributs ausgegeben."
 
-#: src/cmd_ws_commit.cc:1247
+#: src/cmd_ws_commit.cc:1257
 #, c-format
 msgid "no attributes for '%s'"
 msgstr "keine Attribute für '%s'"
 
-#: src/cmd_ws_commit.cc:1259
+#: src/cmd_ws_commit.cc:1269
 #, c-format
 msgid "no attribute '%s' on path '%s'"
 msgstr "kein Attribut für '%s' auf Pfad '%s'"
 
-#: src/cmd_ws_commit.cc:1305
+#: src/cmd_ws_commit.cc:1315
 msgid "PATH ATTR VALUE"
 msgstr "PFAD ATTRIBUT WERT"
 
-#: src/cmd_ws_commit.cc:1306
+#: src/cmd_ws_commit.cc:1316
 msgid "Sets an attribute on a file"
 msgstr "Setzt ein Attribut auf eine Datei"
 
-#: src/cmd_ws_commit.cc:1307
+#: src/cmd_ws_commit.cc:1317
 msgid ""
 "Sets the attribute given on ATTR to the value specified in VALUE for the "
 "file mentioned in PATH."
 msgstr ""
 "Setzt das Attribut ATTRIBUT auf den Wert WERT für die übergebene Datei DATEI."
 
-#: src/cmd_ws_commit.cc:1336 src/cmd_files.cc:138 src/cmd_files.cc:233
+#: src/cmd_ws_commit.cc:1343 src/cmd_files.cc:139 src/cmd_files.cc:234
 msgid "PATH"
 msgstr "PFAD"
 
-#: src/cmd_ws_commit.cc:1337
+#: src/cmd_ws_commit.cc:1344
 msgid "Prints all attributes for the specified path"
 msgstr "Gibt alle Attribute für den übergebenen Pfad aus"
 
-#: src/cmd_ws_commit.cc:1450
+#: src/cmd_ws_commit.cc:1345
+msgid ""
+"If an explicit revision is given, the file's attributes at this specific "
+"revision are returned."
+msgstr ""
+"Wenn eine Revision explizit übergeben wird, werden die Attribute der Datei "
+"in dieser Revision zurückgegeben"
+
+#: src/cmd_ws_commit.cc:1386
+#, c-format
+msgid "unknown path '%s' in %s"
+msgstr "unbekannter Pfad '%s' in %s"
+
+#: src/cmd_ws_commit.cc:1389
+#, c-format
+msgid "none or only one revision must be given"
+msgstr "keine oder eine Revision müssen übergeben werden"
+
+#: src/cmd_ws_commit.cc:1486
 msgid "PATH KEY VALUE"
 msgstr "PFAD SCHLÜSSEL WERT"
 
-#: src/cmd_ws_commit.cc:1451
+#: src/cmd_ws_commit.cc:1487
 msgid "Sets an attribute on a certain path"
 msgstr "Setzt ein Attribut auf den übergebenen Pfad"
 
-#: src/cmd_ws_commit.cc:1472
+#: src/cmd_ws_commit.cc:1508
 msgid "PATH [KEY]"
 msgstr "PFAD [SCHLÜSSEL]"
 
-#: src/cmd_ws_commit.cc:1473
+#: src/cmd_ws_commit.cc:1509
 msgid "Drops an attribute or all of them from a certain path"
 msgstr "Entfernt ein Attribut oder alle Attribute vom übergebenen Pfad"
 
-#: src/cmd_ws_commit.cc:1513
+#: src/cmd_ws_commit.cc:1549
 #, c-format
 msgid "no changes to commit"
 msgstr "keine Änderungen zum Einpflegen"
 
-#: src/cmd_ws_commit.cc:1534
+#: src/cmd_ws_commit.cc:1570
 #, c-format
 msgid ""
 "parent revisions of this commit are in different branches:\n"
@@ -2997,12 +3035,12 @@ msgstr ""
 "'%s' und '%s'.\n"
 "Bitte geben Sie einen Zweignamen mit '--branch' für das Einpflegen an."
 
-#: src/cmd_ws_commit.cc:1556
+#: src/cmd_ws_commit.cc:1592
 #, c-format
 msgid "changes rejected by hook: %s"
 msgstr "Änderungen durch Hook zurückgewiesen: %s"
 
-#: src/cmd_ws_commit.cc:1570
+#: src/cmd_ws_commit.cc:1606
 #, c-format
 msgid ""
 "'_MTN/log' is non-empty and log message was specified on command line.\n"
@@ -3015,74 +3053,74 @@ msgstr ""
 "entfernen Sie den '--message'-/'--message-file'-Parameter aus der "
 "Kommandozeile."
 
-#: src/cmd_ws_commit.cc:1615
+#: src/cmd_ws_commit.cc:1651
 #, c-format
 msgid "empty log message; commit canceled"
 msgstr "leerer Kommentar; Einpflegen abgebrochen"
 
-#: src/cmd_ws_commit.cc:1635
+#: src/cmd_ws_commit.cc:1671
 #, c-format
 msgid "log message rejected by hook: %s"
 msgstr "Kommentar durch Hook zurückgewiesen: %s"
 
-#: src/cmd_ws_commit.cc:1645
+#: src/cmd_ws_commit.cc:1681
 #, c-format
 msgid "beginning commit on branch '%s'"
 msgstr "beginne Einpflegen auf Zweig '%s'"
 
-#: src/cmd_ws_commit.cc:1651
+#: src/cmd_ws_commit.cc:1687
 #, c-format
 msgid "revision %s already in database"
 msgstr "Revision %s ist bereits in der Datenbank"
 
-#: src/cmd_ws_commit.cc:1695 src/cmd_ws_commit.cc:1725
+#: src/cmd_ws_commit.cc:1731 src/cmd_ws_commit.cc:1761
 #, c-format
 msgid "file '%s' modified during commit, aborting"
 msgstr "Datei '%s' wurde während des Einpflegens geändert, breche ab"
 
-#: src/cmd_ws_commit.cc:1706
+#: src/cmd_ws_commit.cc:1742
 #, c-format
 msgid "your database is missing version %s of file '%s'"
 msgstr "Ihrer Datenbank fehlt die Version %s der Datei '%s'"
 
-#: src/cmd_ws_commit.cc:1764
+#: src/cmd_ws_commit.cc:1800
 #, c-format
 msgid "committed revision %s"
 msgstr "Revision %s eingepflegt"
 
-#: src/cmd_ws_commit.cc:1809
+#: src/cmd_ws_commit.cc:1845
 msgid "Commits workspace changes to the database"
 msgstr "Pflegt Änderungen am Arbeitsbereich in die Datenbank ein"
 
-#: src/cmd_ws_commit.cc:1822
+#: src/cmd_ws_commit.cc:1858
 msgid "Sets up a new workspace directory"
 msgstr "Setzt einen neuen Arbeitsbereich auf"
 
-#: src/cmd_ws_commit.cc:1823
+#: src/cmd_ws_commit.cc:1859
 msgid "If no directory is specified, uses the current directory."
 msgstr ""
 "Wenn kein Verzeichnis übergeben wird, wird das derzeitige Verzeichnis "
 "genutzt."
 
-#: src/cmd_ws_commit.cc:1830
+#: src/cmd_ws_commit.cc:1866
 #, c-format
 msgid "need '--branch' argument for setup"
 msgstr "benötige '--branch'-Parameter für das Setup"
 
-#: src/cmd_ws_commit.cc:1868
+#: src/cmd_ws_commit.cc:1904
 msgid "DIRECTORY"
 msgstr "VERZEICHNIS"
 
-#: src/cmd_ws_commit.cc:1869
+#: src/cmd_ws_commit.cc:1905
 msgid "Imports the contents of a directory into a branch"
 msgstr "Importiert die Inhalte eines Verzeichnisses in einen Zweig"
 
-#: src/cmd_ws_commit.cc:1883
+#: src/cmd_ws_commit.cc:1919
 #, c-format
 msgid "you must specify a directory to import"
 msgstr "Es muss ein Verzeichnis für den Import angegeben werden."
 
-#: src/cmd_ws_commit.cc:1903
+#: src/cmd_ws_commit.cc:1939
 #, c-format
 msgid ""
 "use '--revision' or '--branch' to specify the parent revision for the import"
@@ -3090,40 +3128,40 @@ msgstr ""
 "Nutzen Sie '--revision' oder '--branch', um die Elternrevision für den "
 "Import festzulegen."
 
-#: src/cmd_ws_commit.cc:1914
+#: src/cmd_ws_commit.cc:1950
 #, c-format
 msgid "choose one with '%s import -r<id>'"
 msgstr "wählen Sie eine durch '%s import -r<id>'"
 
-#: src/cmd_ws_commit.cc:1925
+#: src/cmd_ws_commit.cc:1961
 #, c-format
 msgid "import directory '%s' doesn't exists"
 msgstr "Das Import-Verzeichnis '%s' existiert nicht."
 
-#: src/cmd_ws_commit.cc:1926
+#: src/cmd_ws_commit.cc:1962
 #, c-format
 msgid "import directory '%s' is a file"
 msgstr "Der Import-Pfad '%s' ist eine Datei und kein Verzeichnis."
 
-#: src/cmd_ws_commit.cc:1979
+#: src/cmd_ws_commit.cc:2015
 msgid "Migrates a workspace directory's metadata to the latest format"
 msgstr "Migriert die Metadaten eines Arbeitsbereichs auf das neueste Format"
 
-#: src/cmd_ws_commit.cc:1980
+#: src/cmd_ws_commit.cc:2016
 msgid "If no directory is given, defaults to the current workspace."
 msgstr ""
 "Wenn kein Verzeichnis übergeben wurde, wird standardmäßig der derzeitige "
 "Arbeitsbereich genutzt."
 
-#: src/cmd_ws_commit.cc:2004
+#: src/cmd_ws_commit.cc:2040
 msgid "Refreshes the inodeprint cache"
 msgstr "Aktualisiert den 'inodeprint'-Cache"
 
-#: src/cmd_ws_commit.cc:2015
+#: src/cmd_ws_commit.cc:2051
 msgid "Search revisions to find where a change first appeared"
 msgstr "Suche Revisionen, in denen eine Änderung zuerst erschien"
 
-#: src/cmd_ws_commit.cc:2016
+#: src/cmd_ws_commit.cc:2052
 msgid ""
 "These commands subdivide a set of revisions into good, bad and untested "
 "subsets and successively narrow the untested set to find the first revision "
@@ -3134,11 +3172,11 @@ msgstr ""
 "sukksessive solange, bis die erste Revision gefunden wurde, die eine "
 "bestimmte Änderung eingeführt hat."
 
-#: src/cmd_ws_commit.cc:2021
+#: src/cmd_ws_commit.cc:2057
 msgid "Reset the current bisection search"
 msgstr "Setze die aktuelle Bisektionssuche zurück"
 
-#: src/cmd_ws_commit.cc:2022
+#: src/cmd_ws_commit.cc:2058
 msgid ""
 "Update the workspace back to the revision from which the bisection was "
 "started and remove all current search information, allowing a new search to "
@@ -3148,24 +3186,24 @@ msgstr ""
 "Bisektion gestartet wurde und entferne alle derzeitigen Suchinformationen, "
 "um eine neue Suche zu ermöglichen."
 
-#: src/cmd_ws_commit.cc:2037 src/cmd_ws_commit.cc:2093
+#: src/cmd_ws_commit.cc:2073 src/cmd_ws_commit.cc:2129
 #, c-format
 msgid "no bisection in progress"
 msgstr "es wird keine Bisektion durchgeführt"
 
-#: src/cmd_ws_commit.cc:2052 src/cmd_ws_commit.cc:2280
+#: src/cmd_ws_commit.cc:2088 src/cmd_ws_commit.cc:2316
 #, c-format
 msgid "this command can only be used in a workspace with no pending changes"
 msgstr ""
 "dieses Kommando kann nur in einem Arbeitsbereich genutzt werden, der keine "
 "Änderungen aufweist."
 
-#: src/cmd_ws_commit.cc:2058
+#: src/cmd_ws_commit.cc:2094
 #, c-format
 msgid "reset back to %s"
 msgstr "setzte auf %s zurück"
 
-#: src/cmd_ws_commit.cc:2124
+#: src/cmd_ws_commit.cc:2160
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to "
@@ -3174,7 +3212,7 @@ msgstr ""
 "unterteile Revisionen; %d gute; %d schlechte; %d übergangene; geben Sie gute "
 "Revisionen an, um die Suche zu starten"
 
-#: src/cmd_ws_commit.cc:2130
+#: src/cmd_ws_commit.cc:2166
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to "
@@ -3183,43 +3221,43 @@ msgstr ""
 "unterteile Revisionen; %d gute; %d schlechte; %d übergangene; geben Sie "
 "schlechte Revisionen an, um die Suche zu starten"
 
-#: src/cmd_ws_commit.cc:2193
+#: src/cmd_ws_commit.cc:2229
 #, c-format
 msgid "bisecting %d revisions; %d good; %d bad; %d skipped; %d remaining"
 msgstr ""
 "unterteile %d Revisionen; %d gute; %d schlechte; %d übergangene; %d "
 "verbleiben"
 
-#: src/cmd_ws_commit.cc:2211
+#: src/cmd_ws_commit.cc:2247
 #, c-format
 msgid "bisection finished at revision %s"
 msgstr "Bisektion bei Revision %s beendet"
 
-#: src/cmd_ws_commit.cc:2304
+#: src/cmd_ws_commit.cc:2340
 #, c-format
 msgid "bisection started at revision %s"
 msgstr "Bisektion bei Revision %s gestartet"
 
-#: src/cmd_ws_commit.cc:2320
+#: src/cmd_ws_commit.cc:2356
 #, c-format
 msgid "ignored redundant bisect %s on revision %s"
 msgstr "ignoriere überflüssiges 'bisect %s' auf Revision %s"
 
-#: src/cmd_ws_commit.cc:2325
+#: src/cmd_ws_commit.cc:2361
 #, c-format
 msgid "conflicting bisect %s/%s on revision %s"
 msgstr "Konflikt bei 'bisect %s/%s' auf Revision %s"
 
-#: src/cmd_ws_commit.cc:2343
+#: src/cmd_ws_commit.cc:2379
 #, c-format
 msgid "updating to %s"
 msgstr "aktualisiere auf %s"
 
-#: src/cmd_ws_commit.cc:2368
+#: src/cmd_ws_commit.cc:2404
 msgid "Reports on the current status of the bisection search"
 msgstr "Berichtet den derzeitigen Status der Bisektionssuche"
 
-#: src/cmd_ws_commit.cc:2369
+#: src/cmd_ws_commit.cc:2405
 msgid ""
 "Lists the total number of revisions in the search set, the number of "
 "revisions that have been determined to be good or bad, the number of "
@@ -3231,30 +3269,30 @@ msgstr ""
 "Revisionen, die übergangen wurden, sowie die Anzahl der zum Test "
 "verbleibenden Revisionen auf."
 
-#: src/cmd_ws_commit.cc:2397
+#: src/cmd_ws_commit.cc:2433
 #, c-format
 msgid "next revision for bisection testing is %s\n"
 msgstr "nächste Revision für Bisektionstest ist %s\n"
 
-#: src/cmd_ws_commit.cc:2398
+#: src/cmd_ws_commit.cc:2434
 #, c-format
 msgid "however this workspace is currently at %s\n"
 msgstr "der Arbeitsbereich hat jedoch derzeit die Revision %s\n"
 
-#: src/cmd_ws_commit.cc:2399
+#: src/cmd_ws_commit.cc:2435
 #, c-format
 msgid "run 'bisect update' to update to this revision before testing"
 msgstr ""
 "führen Sie 'bisect update' aus, um vor dem Test zur korrekten Revision zu "
 "aktualisieren"
 
-#: src/cmd_ws_commit.cc:2404
+#: src/cmd_ws_commit.cc:2440
 msgid "Updates the workspace to the next revision to be tested by bisection"
 msgstr ""
 "Aktualisiert den Arbeitsbereich zur nächsten Revision, die durch die "
 "Bisektionssuche getestet werden soll."
 
-#: src/cmd_ws_commit.cc:2405
+#: src/cmd_ws_commit.cc:2441
 msgid ""
 "This command can be used if updates by good, bad or skip commands fail due "
 "to blocked paths or other problems."
@@ -3263,13 +3301,13 @@ msgstr ""
 "Kommandos 'good', 'bad' oder 'skip' durch bestimmte Probleme, wie "
 "beispielsweise blockierte Pfade, fehlschlagen."
 
-#: src/cmd_ws_commit.cc:2415
+#: src/cmd_ws_commit.cc:2451
 msgid "Excludes the current revision or specified revisions from the search"
 msgstr ""
 "Schließt die derzeitige Revision oder die spezifizierten Revisionen von der "
 "Suche aus"
 
-#: src/cmd_ws_commit.cc:2416
+#: src/cmd_ws_commit.cc:2452
 msgid ""
 "Skipped revisions are removed from the set being searched. Revisions that "
 "cannot be tested for some reason should be skipped."
@@ -3278,23 +3316,23 @@ msgstr ""
 "die aus irgend einem Grund nicht getestet werden können, sollten übergangen "
 "werden."
 
-#: src/cmd_ws_commit.cc:2426
+#: src/cmd_ws_commit.cc:2462
 msgid "Marks the current revision or specified revisions as bad"
 msgstr ""
 "Markiert die derzeitige Revision oder die spezifizierten Revisionen als "
 "schlecht"
 
-#: src/cmd_ws_commit.cc:2427
+#: src/cmd_ws_commit.cc:2463
 msgid "Known bad revisions are removed from the set being searched."
 msgstr ""
 "Bekannte schlechte Revisionen werden von der durchsuchten Menge entfernt."
 
-#: src/cmd_ws_commit.cc:2436
+#: src/cmd_ws_commit.cc:2472
 msgid "Marks the current revision or specified revisions as good"
 msgstr ""
 "Markiert die derzeitige Revision oder die spezifizierten Revisionen als gut"
 
-#: src/cmd_ws_commit.cc:2437
+#: src/cmd_ws_commit.cc:2473
 msgid "Known good revisions are removed from the set being searched."
 msgstr "Bekannte gute Revisionen werden von der durchsuchten Menge entfernt."
 
@@ -3409,8 +3447,7 @@ msgid "bad input to mtn_automate() lua e
 #: src/cmd_automate.cc:333
 #, c-format
 msgid "bad input to mtn_automate() lua extension: command name is missing"
-msgstr ""
-"falsche Eingabe für mtn_automate()-Lua-Erweiterung: Kommandoname fehlt"
+msgstr "falsche Eingabe für mtn_automate()-Lua-Erweiterung: Kommandoname fehlt"
 
 #: src/cmd_files.cc:39
 msgid "Loads a file's contents into the database"
@@ -3463,11 +3500,11 @@ msgstr "Ziel-Datei-ID existiert nicht"
 msgid "destination file id does not exist"
 msgstr "Ziel-Datei-ID existiert nicht"
 
-#: src/cmd_files.cc:139
+#: src/cmd_files.cc:140
 msgid "Prints an annotated copy of a file"
 msgstr "Gibt eine kommentierte Kopie der Datei aus"
 
-#: src/cmd_files.cc:140
+#: src/cmd_files.cc:141
 msgid ""
 "Calculates and prints an annotated copy of the given file from the specified "
 "REVISION."
@@ -3475,7 +3512,7 @@ msgstr ""
 "Berechnet und gibt eine kommentierte Kopie der übergebenen Datei von "
 "REVISION aus"
 
-#: src/cmd_files.cc:172
+#: src/cmd_files.cc:173
 #, c-format
 msgid ""
 "with no revision selected, this command can only be used in a single-parent "
@@ -3484,25 +3521,25 @@ msgstr ""
 "Ohne eine gewählte Revision kann dieses Kommando nur in Arbeitsbereichen mit "
 "einem Vorfahren genutzt werden."
 
-#: src/cmd_files.cc:190
+#: src/cmd_files.cc:191
 #, c-format
 msgid "no such file '%s' in revision %s"
 msgstr "keine Datei '%s' in Revision %s gefunden"
 
-#: src/cmd_files.cc:194
+#: src/cmd_files.cc:195
 #, c-format
 msgid "'%s' in revision %s is not a file"
 msgstr "'%s' in Revision %s ist keine Datei"
 
-#: src/cmd_files.cc:202
+#: src/cmd_files.cc:203
 msgid "[PATH]"
 msgstr "[PFAD]"
 
-#: src/cmd_files.cc:203
+#: src/cmd_files.cc:204
 msgid "Calculates the identity of a file or stdin"
 msgstr "Berechnet die Identität (ID) einer Datei oder der Standardeingabe"
 
-#: src/cmd_files.cc:204
+#: src/cmd_files.cc:205
 msgid ""
 "If any PATH is given, calculates their identity; otherwise, the one from the "
 "standard input is calculated."
@@ -3510,34 +3547,34 @@ msgstr ""
 "Wenn ein PFAD übergeben wurde, wird die ID dieser Datei berechnet.  "
 "Andernfalls wird die ID der Standardeingabe berechnet."
 
-#: src/cmd_files.cc:234
+#: src/cmd_files.cc:235
 msgid "Prints the file identifier of a file"
 msgstr "Gibt die Identität (ID) einer Datei aus"
 
-#: src/cmd_files.cc:244
+#: src/cmd_files.cc:245
 #, c-format
 msgid "cannot read from stdin"
 msgstr "kann nicht von stdin lesen"
 
-#: src/cmd_files.cc:258 src/cmd_files.cc:367 src/automate.cc:2070
+#: src/cmd_files.cc:259 src/cmd_files.cc:368 src/automate.cc:2103
 #, c-format
 msgid "no file version %s found in database"
 msgstr "Dateiversion %s nicht in Datenbank gefunden"
 
-#: src/cmd_files.cc:280 src/cmd_files.cc:284
+#: src/cmd_files.cc:281 src/cmd_files.cc:285
 #, c-format
 msgid "no file '%s' found in revision %s"
 msgstr "keine Datei '%s' in Revision %s gefunden"
 
-#: src/cmd_files.cc:291 src/cmd_files.cc:388
+#: src/cmd_files.cc:292 src/cmd_files.cc:389
 msgid "FILENAME"
 msgstr "DATEINAME"
 
-#: src/cmd_files.cc:292
+#: src/cmd_files.cc:293
 msgid "Prints a file from the database"
 msgstr "Gibt Dateiinhalte aus der Datenbank aus"
 
-#: src/cmd_files.cc:293
+#: src/cmd_files.cc:294
 msgid ""
 "Fetches the given file FILENAME from the database and prints it to the "
 "standard output."
@@ -3545,19 +3582,19 @@ msgstr ""
 "Liest die Daten der Datei DATEINAME von der Datenbank und gibt sie auf der "
 "Standardausgabe aus."
 
-#: src/cmd_files.cc:330 src/cmd_files.cc:354 src/automate.cc:1652
+#: src/cmd_files.cc:331 src/cmd_files.cc:355 src/automate.cc:1685
 msgid "FILEID"
 msgstr "DATEI_ID"
 
-#: src/cmd_files.cc:331
+#: src/cmd_files.cc:332
 msgid "Prints the contents of a file (given an identifier)"
 msgstr "Gibt die Inhalte einer Datei aus (anhand einer gegebenen ID)"
 
-#: src/cmd_files.cc:355
+#: src/cmd_files.cc:356
 msgid "Prints the size of a file (given an identifier)"
 msgstr "Gibt die Dateigröße einer Datei aus (anhand einer gegebenen ID)"
 
-#: src/cmd_files.cc:389
+#: src/cmd_files.cc:390
 msgid "Prints the contents of a file (given a name)"
 msgstr "Gibt die Inhalte einer Datei aus (anhand eines gegebenen Namens)"
 
@@ -3565,139 +3602,251 @@ msgstr "Kommandos zur Konfliktauflösung
 msgid "Commands for conflict resolutions"
 msgstr "Kommandos zur Konfliktauflösung"
 
-#: src/cmd_conflicts.cc:71
+#: src/cmd_conflicts.cc:81
 #, c-format
 msgid "orphaned node '%s'"
 msgstr "verwaister Knoten '%s'"
 
-#: src/cmd_conflicts.cc:76 src/cmd_conflicts.cc:103 src/cmd_conflicts.cc:143
+#: src/cmd_conflicts.cc:86 src/cmd_conflicts.cc:172 src/cmd_conflicts.cc:188
+#: src/cmd_conflicts.cc:241 src/cmd_conflicts.cc:281
 #, c-format
 msgid "possible resolutions:"
 msgstr "mögliche Lösungen:"
 
-#: src/cmd_conflicts.cc:77
+#: src/cmd_conflicts.cc:87 src/cmd_conflicts.cc:173
 #, c-format
 msgid "resolve_first drop"
 msgstr "resolve_first drop"
 
-#: src/cmd_conflicts.cc:78
+#: src/cmd_conflicts.cc:88
 #, c-format
 msgid "resolve_first rename \"file_name\""
 msgstr "resolve_first rename \"Dateiname\""
 
-#: src/cmd_conflicts.cc:98
+#: src/cmd_conflicts.cc:121 src/merge_conflict.cc:1207
 #, c-format
-msgid "duplicate_name %s"
-msgstr "duplicate_name %s"
+msgid "conflict: file '%s'"
+msgstr "Konflikt: Datei '%s'"
 
-#: src/cmd_conflicts.cc:107
+#: src/cmd_conflicts.cc:127 src/merge_conflict.cc:1213
 #, c-format
+msgid "orphaned on the left"
+msgstr "auf linker Seite verwaist"
+
+#: src/cmd_conflicts.cc:128 src/cmd_conflicts.cc:149
+#, c-format
+msgid "modified on the right"
+msgstr "auf rechter Seite verändert"
+
+#: src/cmd_conflicts.cc:132 src/cmd_conflicts.cc:153
+#, c-format
+msgid "modified on the left"
+msgstr "auf linker Seite verändert"
+
+#: src/cmd_conflicts.cc:133 src/merge_conflict.cc:1229
+#, c-format
+msgid "orphaned on the right"
+msgstr "auf rechter Seite verwaist"
+
+#: src/cmd_conflicts.cc:142 src/merge_conflict.cc:1218
+#, c-format
+msgid "dropped on the left"
+msgstr "auf linker Seite gelöscht"
+
+#: src/cmd_conflicts.cc:146 src/merge_conflict.cc:1220
+#, c-format
+msgid "dropped and recreated on the left"
+msgstr "auf linker Seite gelöscht und neu erstellt"
+
+#: src/cmd_conflicts.cc:156 src/merge_conflict.cc:1234
+#, c-format
+msgid "dropped on the right"
+msgstr "auf rechter Seite gelöscht"
+
+#: src/cmd_conflicts.cc:159 src/merge_conflict.cc:1236
+#, c-format
+msgid "dropped and recreated on the right"
+msgstr "auf rechter Seite gelöscht und neu erzeugt"
+
+#: src/cmd_conflicts.cc:174
+#, c-format
+msgid "resolve_first rename"
+msgstr "resolve_first rename"
+
+#: src/cmd_conflicts.cc:175
+#, c-format
+msgid "resolve_first user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first user_rename \"neuer_Inhaltsname\" \"neuer_Dateiname\""
+
+#: src/cmd_conflicts.cc:179
+#, c-format
+msgid "resolve_first keep"
+msgstr "resolve_first keep"
+
+#: src/cmd_conflicts.cc:180
+#, c-format
+msgid "resolve_first user \"name\""
+msgstr "resolve_first user \"Name\""
+
+#: src/cmd_conflicts.cc:193 src/cmd_conflicts.cc:245
+#, c-format
 msgid "resolve_first_left drop"
 msgstr "resolve_first_left drop"
 
-#: src/cmd_conflicts.cc:108
+#: src/cmd_conflicts.cc:194
 #, c-format
-msgid "resolve_first_left keep"
-msgstr "resolve_first_left keep"
+msgid "resolve_first_left rename"
+msgstr "resolve_first_left rename"
 
-#: src/cmd_conflicts.cc:109
+#: src/cmd_conflicts.cc:195
 #, c-format
-msgid "resolve_first_left rename \"name\""
-msgstr "resolve_first_left rename \"Name\""
+msgid "resolve_first_left user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first_left user_rename \"neuer_Inhaltsname\" \"neuer_Dateiname\""
 
-#: src/cmd_conflicts.cc:110
+#: src/cmd_conflicts.cc:201 src/cmd_conflicts.cc:246
 #, c-format
+msgid "resolve_first_left keep"
+msgstr "resolve_first_left keep"
+
+#: src/cmd_conflicts.cc:202 src/cmd_conflicts.cc:248
+#, c-format
 msgid "resolve_first_left user \"name\""
 msgstr "resolve_first_left user \"Name\""
 
-#: src/cmd_conflicts.cc:115
+#: src/cmd_conflicts.cc:209 src/cmd_conflicts.cc:253
 #, c-format
 msgid "resolve_first_right drop"
 msgstr "resolve_first_right drop"
 
-#: src/cmd_conflicts.cc:116
+#: src/cmd_conflicts.cc:210
 #, c-format
+msgid "resolve_first_right rename"
+msgstr "resolve_first_right rename"
+
+#: src/cmd_conflicts.cc:211
+#, c-format
+msgid "resolve_first_right user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first_right user_rename \"neuer_Inhaltsname\" \"neuer_Dateiname\""
+
+#: src/cmd_conflicts.cc:216 src/cmd_conflicts.cc:254
+#, c-format
 msgid "resolve_first_right keep"
 msgstr "resolve_first_right keep"
 
-#: src/cmd_conflicts.cc:117
+#: src/cmd_conflicts.cc:217 src/cmd_conflicts.cc:256
 #, c-format
-msgid "resolve_first_right rename \"name\""
-msgstr "resolve_first_right rename \"Name\""
+msgid "resolve_first_right user \"name\""
+msgstr "resolve_first_right user \"Name\""
 
-#: src/cmd_conflicts.cc:118
+#: src/cmd_conflicts.cc:236
 #, c-format
-msgid "resolve_first_right user \"name\""
-msgstr "resolve_first_right user \"Name\""
+msgid "duplicate_name %s"
+msgstr "duplicate_name %s"
 
-#: src/cmd_conflicts.cc:138
+#: src/cmd_conflicts.cc:247
 #, c-format
+msgid "resolve_first_left rename \"name\""
+msgstr "resolve_first_left rename \"Name\""
+
+#: src/cmd_conflicts.cc:255
+#, c-format
+msgid "resolve_first_right rename \"name\""
+msgstr "resolve_first_right rename \"Name\""
+
+#: src/cmd_conflicts.cc:276
+#, c-format
 msgid "content %s"
 msgstr "Inhalt %s"
 
-#: src/cmd_conflicts.cc:144
+#: src/cmd_conflicts.cc:282
 #, c-format
 msgid "resolve_first interactive \"file_name\""
 msgstr "resolve_first interactive \"Dateiname\""
 
-#: src/cmd_conflicts.cc:145
+#: src/cmd_conflicts.cc:283
 #, c-format
 msgid "resolve_first user \"file_name\""
 msgstr "resolve_first user \"Dateiname\""
 
-#: src/cmd_conflicts.cc:164
+#: src/cmd_conflicts.cc:302
 #, c-format
 msgid "all conflicts resolved"
 msgstr "alle Konflikte aufgelöst"
 
-#: src/cmd_conflicts.cc:200
+#: src/cmd_conflicts.cc:340
 #, c-format
 msgid "'%s' is not a supported conflict resolution for %s"
 msgstr "'%s' ist keine unterstützte Konfliktlösung für %s"
 
-#: src/cmd_conflicts.cc:250 src/cmd_conflicts.cc:255
+#: src/cmd_conflicts.cc:390 src/cmd_conflicts.cc:395
 #, c-format
 msgid "too many arguments"
 msgstr "zu viele Argumente"
 
-#: src/cmd_conflicts.cc:260 src/cmd_conflicts.cc:276
+#: src/cmd_conflicts.cc:401 src/cmd_conflicts.cc:419
 #, c-format
-msgid "other resolution must be 'drop' or 'rename'"
-msgstr "andere Konfliktlösung muss 'drop' oder 'rename' sein"
+msgid "other resolution is %s; specify 'drop', 'rename', or 'user_rename'"
+msgstr "andere Konfliktlösung ist %s; benutze 'drop', 'rename' oder 'user_rename'"
 
-#: src/cmd_conflicts.cc:265 src/cmd_conflicts.cc:271 src/cmd_conflicts.cc:338
-#: src/cmd_conflicts.cc:344 src/cmd_conflicts.cc:393 src/cmd_conflicts.cc:408
-#: src/cmd_conflicts.cc:457 src/cmd_conflicts.cc:470
+#: src/cmd_conflicts.cc:407 src/cmd_conflicts.cc:413 src/cmd_conflicts.cc:427
+#: src/cmd_conflicts.cc:446 src/cmd_conflicts.cc:534 src/cmd_conflicts.cc:540
+#: src/cmd_conflicts.cc:573 src/cmd_conflicts.cc:579 src/cmd_conflicts.cc:586
+#: src/cmd_conflicts.cc:594 src/cmd_conflicts.cc:601 src/cmd_conflicts.cc:625
+#: src/cmd_conflicts.cc:631 src/cmd_conflicts.cc:638 src/cmd_conflicts.cc:646
+#: src/cmd_conflicts.cc:653 src/cmd_conflicts.cc:705 src/cmd_conflicts.cc:720
+#: src/cmd_conflicts.cc:769 src/cmd_conflicts.cc:782
 #, c-format
 msgid "wrong number of arguments"
 msgstr "falsche Anzahl an Parametern"
 
-#: src/cmd_conflicts.cc:401
+#: src/cmd_conflicts.cc:464 src/cmd_conflicts.cc:477
 #, c-format
+msgid "must specify resolve_first (not _left or _right)"
+msgstr "resolve_first muss angeben werden (nicht _left oder _right)"
+
+#: src/cmd_conflicts.cc:467 src/cmd_conflicts.cc:480 src/cmd_conflicts.cc:580
+#: src/cmd_conflicts.cc:587 src/cmd_conflicts.cc:632 src/cmd_conflicts.cc:639
+#: src/merge_conflict.cc:2095 src/merge_conflict.cc:2102
+#, c-format
+msgid "orphaned files must be renamed"
+msgstr "verwaiste Dateien müssen umbenannt werden"
+
+#: src/cmd_conflicts.cc:566 src/cmd_conflicts.cc:618
+#, c-format
+msgid ""
+"must specify 'resolve_first_left' or 'resolve_first_right' (not just "
+"'resolve_first')"
+msgstr ""
+"'resolve_first_left' oder 'resolve_first_right' muss angegeben werden (nicht nur "
+"'resolve_first')"
+
+
+#: src/cmd_conflicts.cc:713
+#, c-format
 msgid "interactive merge result saved in '%s'"
 msgstr "interaktives Ergebnis der Vereinigung in '%s' gespeichert"
 
-#: src/cmd_conflicts.cc:404
+#: src/cmd_conflicts.cc:716
 #, c-format
 msgid "interactive merge failed."
 msgstr "interaktives Vereinigen fehlgeschlagen"
 
-#: src/cmd_conflicts.cc:428
+#: src/cmd_conflicts.cc:740
 #, c-format
 msgid "no resolvable yet unresolved left side conflicts"
 msgstr "keine lösbaren oder nicht aufgelösten linksseitigen Konflikte"
 
-#: src/cmd_conflicts.cc:432
+#: src/cmd_conflicts.cc:744
 #, c-format
 msgid "no resolvable yet unresolved right side conflicts"
 msgstr "keine lösbaren oder nicht aufgelösten rechtsseitigen Konflikte"
 
-#: src/cmd_conflicts.cc:436
+#: src/cmd_conflicts.cc:748
 #, c-format
 msgid "no resolvable yet unresolved single-file conflicts"
 msgstr "keine lösbaren oder nicht aufgelösten Einzeldatei-Konflikte"
 
-#: src/cmd_conflicts.cc:450
+#: src/cmd_conflicts.cc:762
 msgid ""
 "Show the first unresolved conflict in the conflicts file, and possible "
 "resolutions"
@@ -3705,31 +3854,31 @@ msgstr ""
 "Zeigt den ersten nicht aufgelösten Konflikt in der Konfliktdatei und "
 "mögliche Konfliktlösungen"
 
-#: src/cmd_conflicts.cc:463
+#: src/cmd_conflicts.cc:775
 msgid "Show the remaining unresolved conflicts in the conflicts file"
 msgstr "Zeigt die verbliebenen ungelösten Probleme in der Konfliktdatei"
 
-#: src/cmd_conflicts.cc:475 src/cmd_conflicts.cc:489 src/cmd_conflicts.cc:503
+#: src/cmd_conflicts.cc:787 src/cmd_conflicts.cc:801 src/cmd_conflicts.cc:815
 msgid "RESOLUTION"
 msgstr "LÖSUNG"
 
-#: src/cmd_conflicts.cc:476
+#: src/cmd_conflicts.cc:788
 msgid "Set the resolution for the first unresolved single-file conflict."
 msgstr "Setzt die Lösung für den ersten, nicht gelösten Einzeldatei-Konflikt."
 
-#: src/cmd_conflicts.cc:490
+#: src/cmd_conflicts.cc:802
 msgid "Set the left resolution for the first unresolved two-file conflict"
 msgstr ""
 "Setzt die linksseitige Lösung für den ersten, nicht aufgelösten Zwei-Dateien-"
 "Konflikt"
 
-#: src/cmd_conflicts.cc:504
+#: src/cmd_conflicts.cc:816
 msgid "Set the right resolution for the first unresolved two-file conflict"
 msgstr ""
 "Setzt die rechtsseitige Lösung für den ersten, nicht aufgelösten Zwei-"
 "Dateien-Konflikt"
 
-#: src/cmd_conflicts.cc:518
+#: src/cmd_conflicts.cc:830
 msgid "Delete any bookkeeping files related to conflict resolution"
 msgstr ""
 "Entfernt alle konfliktlösungsrelevanten Dateien aus dem monotone-Systempfad"
@@ -3748,7 +3897,7 @@ msgstr "rc-Datei '%s' existiert nicht"
 msgid "rcfile '%s' does not exist"
 msgstr "rc-Datei '%s' existiert nicht"
 
-#: src/transforms.cc:83
+#: src/transforms.cc:84
 #, c-format
 msgid ""
 "%s\n"
@@ -3859,7 +4008,7 @@ msgstr "'%s' ist keine bekannte Option e
 msgid "'%s' is not a recognized workspace option"
 msgstr "'%s' ist keine bekannte Option eines Arbeitsbereichs"
 
-#: src/work.cc:1091
+#: src/work.cc:1112
 #, c-format
 msgid ""
 "cannot add '%s', because '%s' is recorded as a file in the workspace manifest"
@@ -3867,114 +4016,105 @@ msgstr ""
 "Kann '%s' nicht hinzufügen, da '%s' als Datei im  Arbeitsbereich-Manifest "
 "aufgenommen wurde."
 
-#: src/work.cc:1097
+#: src/work.cc:1118
 #, c-format
 msgid "adding '%s' to workspace manifest"
 msgstr "füge '%s' dem Arbeitsbereich-Manifest hinzu"
 
-#: src/work.cc:1174
+#: src/work.cc:1158
 #, c-format
-msgid ""
-"non-recursive add: Files in the directory '%s' will not be added "
-"automatically."
-msgstr ""
-"nicht-rekursives Hinzufügen: Dateien im Verzeichnis '%s' werden nicht "
-"automatisch hinzugefügt."
-
-#: src/work.cc:1187
-#, c-format
 msgid "skipping ignorable file '%s'"
 msgstr "übergehe ignorierbare Datei '%s'"
 
-#: src/work.cc:1194
+#: src/work.cc:1165
 #, c-format
 msgid "skipping '%s', already accounted for in workspace"
 msgstr "übergehe '%s', bereits im Arbeitsbereich festgehalten"
 
-#: src/work.cc:1350 src/merge_conflict.cc:2340 src/merge_conflict.cc:2405
+#: src/work.cc:1321 src/merge_conflict.cc:2824 src/merge_conflict.cc:3200
 #, c-format
 msgid "dropping '%s'"
 msgstr "entferne '%s'"
 
-#: src/work.cc:1361 src/work.cc:1372
+#: src/work.cc:1332 src/work.cc:1343
 #, c-format
 msgid "path '%s' already exists"
 msgstr "Pfad '%s' existiert bereits"
 
-#: src/work.cc:1390 src/merge_conflict.cc:2345 src/merge_conflict.cc:2426
+#: src/work.cc:1361 src/merge_conflict.cc:2829 src/merge_conflict.cc:3221
 #, c-format
 msgid "renaming '%s' to '%s'"
 msgstr "benenne '%s' nach '%s' um"
 
-#: src/work.cc:1394
+#: src/work.cc:1365
 #, c-format
 msgid "adding '%s'"
 msgstr "füge '%s' hinzu"
 
-#: src/work.cc:1426
+#: src/work.cc:1397
 #, c-format
 msgid "file '%s' is a directory"
 msgstr "Datei '%s' ist ein Verzeichnis"
 
-#: src/work.cc:1430
+#: src/work.cc:1401
 #, c-format
 msgid "content of file '%s' has changed, not overwriting"
 msgstr ""
 "Inhalt der Datei '%s' hat sich geändert, Datei wird nicht überschrieben"
 
-#: src/work.cc:1431
+#: src/work.cc:1402
 #, c-format
 msgid "updating '%s'"
 msgstr "aktualisiere '%s'"
 
-#: src/work.cc:1486
+#: src/work.cc:1457
 #, c-format
 msgid "cannot drop non-empty directory '%s'"
 msgstr "kann Verzeichnis '%s' nicht entfernen, da es nicht leer ist"
 
-#: src/work.cc:1519
+#: src/work.cc:1490
 #, c-format
 msgid "attach node %d blocked by unversioned path '%s'"
 msgstr ""
 "Anfügen des Knotens %d wird blockiert durch den unversionisierten Pfad '%s'"
 
-#: src/work.cc:1538
+#: src/work.cc:1509
 #, c-format
 msgid "attach node %d blocked by blocked parent '%s'"
 msgstr ""
 "Anfügen des Knotens %d wird blockiert durch den blockierten Elternpfad '%s'"
 
-#: src/work.cc:1574
+#: src/work.cc:1545
 #, c-format
 msgid "%d workspace conflicts"
 msgstr "%d Konflikte im Arbeitsbereich"
 
-#: src/work.cc:1627
+#: src/work.cc:1598
 #, c-format
 msgid "moved conflicting path '%s' to '%s'"
 msgstr "verschob in Konflikt stehenden Pfad '%s' nach '%s'"
 
-#: src/work.cc:1691
+#: src/work.cc:1662
 #, c-format
 msgid "missing directory '%s'"
 msgstr "fehlendes Verzeichnis '%s'"
 
-#: src/work.cc:1696
+#: src/work.cc:1667
 #, c-format
 msgid "not a directory '%s'"
 msgstr "'%s' ist kein Verzeichnis"
 
-#: src/work.cc:1709
+#: src/work.cc:1680
 #, c-format
 msgid "missing file '%s'"
 msgstr "fehlende Datei '%s'"
 
-#: src/work.cc:1714
+#: src/work.cc:1685
 #, c-format
 msgid "not a file '%s'"
 msgstr "'%s' ist keine Datei"
 
-#: src/work.cc:1731
+#: src/work.cc:1702
 #, c-format
 msgid ""
 "%d missing items; use '%s ls missing' to view.\n"
@@ -3994,88 +4134,88 @@ msgstr ""
 " '%s drop --missing' oder\n"
 " '%s revert --missing'"
 
-#: src/work.cc:1889
+#: src/work.cc:1861
 #, c-format
 msgid "unable to drop the root directory"
 msgstr "kann das Wurzelverzeichnis nicht entfernen"
 
-#: src/work.cc:1892
+#: src/work.cc:1864
 #, c-format
 msgid "skipping '%s', not currently tracked"
 msgstr "übergehe '%s', wird derzeit nicht verfolgt"
 
-#: src/work.cc:1902
+#: src/work.cc:1874
 #, c-format
 msgid "cannot remove '%s/', it is not empty"
 msgstr "kann '%s/' nicht entfernen, Verzeichnis ist nicht leer"
 
-#: src/work.cc:1917
+#: src/work.cc:1889
 #, c-format
 msgid "directory '%s' not empty - it will be dropped but not deleted"
 msgstr ""
 "Das Verzeichnis '%s' ist nicht leer - es wird von monotone entfernt, aber "
 "nicht gelöscht"
 
-#: src/work.cc:1928
+#: src/work.cc:1900
 #, c-format
 msgid "file '%s' changed - it will be dropped but not deleted"
 msgstr ""
 "Die Datei '%s' wurde verändert - sie wird von monotone entfernt, aber nicht "
 "gelöscht"
 
-#: src/work.cc:1932
+#: src/work.cc:1904
 #, c-format
 msgid "dropping '%s' from workspace manifest"
 msgstr "entferne '%s' aus dem Arbeitsbereich-Manifest"
 
-#: src/work.cc:1973 src/work.cc:2022
+#: src/work.cc:1945 src/work.cc:1994
 #, c-format
 msgid "cannot rename the workspace root (try '%s pivot_root' instead)"
 msgstr ""
 "kann Wurzel des Arbeitsbereiches nicht umbenennen (versuchen Sie stattdessen "
 "'%s pivot_root')"
 
-#: src/work.cc:1976 src/work.cc:2025
+#: src/work.cc:1948 src/work.cc:1997
 #, c-format
 msgid "source file '%s' is not versioned"
 msgstr "Quell-Datei '%s' ist nicht versionisiert"
 
-#: src/work.cc:1981 src/work.cc:2047
+#: src/work.cc:1953 src/work.cc:2019
 #, c-format
 msgid "cannot move '%s' to a subdirectory of itself, '%s/%s'"
 msgstr "kann nicht '%s' in eigenes Unterverzeichnis verschieben, '%s/%s'"
 
-#: src/work.cc:1983
+#: src/work.cc:1955
 #, c-format
 msgid "'%s' and '%s' are the same file"
 msgstr "'%s' und '%s' sind dieselbe Datei"
 
-#: src/work.cc:1999
+#: src/work.cc:1971
 #, c-format
 msgid "destination path's parent directory '%s/' doesn't exist"
 msgstr "Elternverzeichnis '%s/' des Zielpfades existiert nicht"
 
-#: src/work.cc:2016
+#: src/work.cc:1988
 #, c-format
 msgid "destination '%s/' is not a directory"
 msgstr "Ziel '%s' ist kein Verzeichnis"
 
-#: src/work.cc:2042
+#: src/work.cc:2014
 #, c-format
 msgid "destination '%s' already exists in the workspace manifest"
 msgstr "Ziel '%s' existiert bereits im Manifest des Arbeitsbereichs"
 
-#: src/work.cc:2065
+#: src/work.cc:2037
 #, c-format
 msgid "renaming '%s' to '%s' in workspace manifest"
 msgstr "benenne '%s' zu '%s' im Arbeitsbereich-Manifest um"
 
-#: src/work.cc:2090
+#: src/work.cc:2062
 #, c-format
 msgid "'%s' doesn't exist in workspace, skipping"
 msgstr "'%s' existiert nicht im Arbeitsbereich, übergehe Aktion"
 
-#: src/work.cc:2094
+#: src/work.cc:2066
 #, c-format
 msgid ""
 "destination '%s' already exists in workspace, skipping filesystem rename"
@@ -4083,7 +4223,7 @@ msgstr ""
 "Ziel '%s' existiert bereits im Arbeitsbereich, übergehe Umbenennung im "
 "Dateisystem"
 
-#: src/work.cc:2099
+#: src/work.cc:2071
 #, c-format
 msgid ""
 "'%s' doesn't exist in workspace and '%s' does, skipping filesystem rename"
@@ -4091,37 +4231,37 @@ msgstr ""
 "'%s' existiert im Gegensatz zu '%s' nicht im Arbeitsbereich, übergehe "
 "Umbenennung im Dateisystem"
 
-#: src/work.cc:2120
+#: src/work.cc:2092
 #, c-format
 msgid "proposed new root directory '%s' is not versioned or does not exist"
 msgstr ""
 "das neu vorgeschlagene Wurzelverzeichnis '%s' ist nicht unter "
 "Versionkontrolle oder existiert nicht"
 
-#: src/work.cc:2123
+#: src/work.cc:2095
 #, c-format
 msgid "proposed new root directory '%s' is not a directory"
 msgstr "das neu vorgeschlagene Wurzelverzeichnis '%s' ist kein Verzeichnis"
 
-#: src/work.cc:2126
+#: src/work.cc:2098
 #, c-format
 msgid "proposed new root directory '%s' contains illegal path '%s'"
 msgstr ""
 "das neu vorgeschlagene Wurzelverzeichnis '%s' beinhaltet den ungültigen Pfad "
 "'%s'"
 
-#: src/work.cc:2136
+#: src/work.cc:2108
 #, c-format
 msgid "directory '%s' is not versioned or does not exist"
 msgstr ""
 "das Verzeichnis '%s' ist nicht unter Versionskontrolle oder existiert nicht"
 
-#: src/work.cc:2144
+#: src/work.cc:2116
 #, c-format
 msgid "'%s' is in the way"
 msgstr "'%s' ist im Weg"
 
-#: src/work.cc:2187
+#: src/work.cc:2159
 #, c-format
 msgid ""
 "workspace is locked\n"
@@ -4130,7 +4270,7 @@ msgstr ""
 "Der Arbeitsbereich ist gesperrt.\n"
 "Sie müssen das Verzeichnis %s aufräumen und entfernen."
 
-#: src/work.cc:2206
+#: src/work.cc:2178
 #, c-format
 msgid ""
 "re-run this command with '--move-conflicting-paths' to move conflicting "
@@ -4139,7 +4279,7 @@ msgstr ""
 "führen Sie dieses Kommando mit '--move-conflicting-paths' erneut aus, um in "
 "Konflikt stehende Pfade aus den Weg zu räumen"
 
-#: src/work.cc:2238
+#: src/work.cc:2210
 #, c-format
 msgid "moved some conflicting files into '%s'"
 msgstr "verschob einige in Konflikt stehende Dateien in '%s'"
@@ -4332,7 +4472,8 @@ msgstr ""
 msgstr ""
 "Datenbank '%s' beinhaltet Manifeste, aber keine Revisionen\n"
 "Dies ist eine sehr alte Datenbank, die erneuert werden muss.\n"
-"Bitte konsultieren Sie 'http://wiki.monotone.ca/upgradefromchangesets/' für Details"
+"Bitte konsultieren Sie 'http://wiki.monotone.ca/upgradefromchangesets/' für "
+"Details"
 
 #: src/database.cc:650
 #, c-format
@@ -4552,7 +4693,7 @@ msgid ""
 #: src/database.cc:2530
 #, c-format
 msgid ""
-"Unknown delta direction '%s'; assuming 'reverse'. Valid values are "
+"unknown delta direction '%s'; assuming 'reverse'. Valid values are "
 "'reverse', 'forward', 'both'."
 msgstr ""
 "Unbekannte Delta-Richtung '%s'; habe 'reverse' vermutet. Gültige Werte sind "
@@ -4594,27 +4735,27 @@ msgstr "Revision beinhaltet ungültige m
 msgid "revision contains incorrect manifest_id"
 msgstr "Revision beinhaltet ungültige manifest_id"
 
-#: src/database.cc:3489
+#: src/database.cc:3487
 #, c-format
-msgid "Failed to get RSA verifying key for %s"
+msgid "failed to get RSA verifying key for %s"
 msgstr "RSA konnte den Schlüssel für %s nicht überprüfen"
 
-#: src/database.cc:3628
+#: src/database.cc:3626
 #, c-format
-msgid "Your database contains multiple keys named '%s'"
+msgid "your database contains multiple keys named '%s'"
 msgstr "Ihre Datenbank beinhaltet mehrere Schlüssel mit dem Namen '%s'"
 
-#: src/database.cc:3789
+#: src/database.cc:3787
 #, c-format
 msgid "cert revision %s does not exist in db"
 msgstr "Zertifikats-Revision %s existiert nicht in der Datenbank"
 
-#: src/database.cc:3791
+#: src/database.cc:3789
 #, c-format
 msgid "dropping cert"
 msgstr "entferne Zertifikat"
 
-#: src/database.cc:3801
+#: src/database.cc:3799
 #, c-format
 msgid ""
 "the branch name\n"
@@ -4638,34 +4779,34 @@ msgstr ""
 "Kommando '%s local kill_certs' um das Zweigzertifikat wieder zu löschen\n"
 "und danach ein neues mit gültigen Zweignamen zu erstellen."
 
-#: src/database.cc:4118
+#: src/database.cc:4116
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'"
 msgstr "ignoriere ungültige Signatur von '%s' vom '%s'"
 
-#: src/database.cc:4123
+#: src/database.cc:4121
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'"
 msgstr "ignoriere unbekannte Signatur von '%s' vom '%s'"
 
-#: src/database.cc:4125
+#: src/database.cc:4123
 #, c-format
 msgid "trust function disliked %d signers of '%s' cert on revision %s"
 msgstr ""
 "Vertrauensfunktion lehnt %d Unterzeichner des Zertifikats '%s' auf Revision "
 "%s ab"
 
-#: src/database.cc:4813 src/database.cc:4955
+#: src/database.cc:4811 src/database.cc:4953
 #, c-format
 msgid "no database specified"
 msgstr "keine Datenbank spezifiziert"
 
-#: src/database.cc:4826
+#: src/database.cc:4824
 #, c-format
 msgid "database '%s' does not exist"
 msgstr "Datenbank '%s' existiert nicht"
 
-#: src/database.cc:4834
+#: src/database.cc:4832
 #, c-format
 msgid ""
 "'%s' is a workspace, not a database\n"
@@ -4674,17 +4815,17 @@ msgstr ""
 "'%s' ist ein Arbeitsverzeichnis, keine Datenbank\n"
 "(meinten Sie '%s'?)"
 
-#: src/database.cc:4838
+#: src/database.cc:4836
 #, c-format
 msgid "'%s' is a directory, not a database"
 msgstr "'%s' ist ein Verzeichnis, keine Datenbank"
 
-#: src/database.cc:4846
+#: src/database.cc:4844
 #, c-format
 msgid "database '%s' already exists"
 msgstr "Datenbank '%s' existiert bereits"
 
-#: src/database.cc:4851
+#: src/database.cc:4849
 #, c-format
 msgid ""
 "existing (possibly stale) journal file '%s' has same stem as new database "
@@ -4695,32 +4836,32 @@ msgstr ""
 "'%s'.\n"
 "Datenbankerstellung abgebrochen"
 
-#: src/database.cc:5013
+#: src/database.cc:5011
 #, c-format
 msgid "the database alias '%s' has multiple ambiguous expansions:"
 msgstr "der Datenbankalias '%s' kann auf mehrere Arten erweitert werden:"
 
-#: src/database.cc:5036
+#: src/database.cc:5034
 #, c-format
 msgid "could not query default database alias"
 msgstr "konnte nicht den Standarddatenbankalias abfragen"
 
-#: src/database.cc:5038
+#: src/database.cc:5036
 #, c-format
 msgid "using default database '%s'"
 msgstr "nutze Standarddatenbank '%s'"
 
-#: src/database.cc:5048
+#: src/database.cc:5046
 #, c-format
 msgid "invalid database alias '%s': does not start with a colon"
 msgstr "ungültiger Datenbankalias '%s': beginnt nicht mit einem Doppelpunkt"
 
-#: src/database.cc:5052
+#: src/database.cc:5050
 #, c-format
 msgid "invalid database alias '%s': must not be empty"
 msgstr "ungültiger Datenbankalias '%s': darf nicht leer sein"
 
-#: src/database.cc:5068
+#: src/database.cc:5066
 #, c-format
 msgid "invalid database alias '%s': does contain invalid characters"
 msgstr "ungültiger Datenbankalias '%s': beinhaltet ungültige Zeichen"
@@ -4794,7 +4935,7 @@ msgstr "kein Schlüsselpaar %s im Schlü
 msgid "no key pair %s found in key store '%s'"
 msgstr "kein Schlüsselpaar %s im Schlüsselbund '%s' gefunden"
 
-#: src/key_store.cc:620
+#: src/key_store.cc:633
 #, c-format
 msgid ""
 "failed to decrypt old private RSA key, probably incorrect passphrase or "
@@ -4803,48 +4944,48 @@ msgstr ""
 "konnte alten, privaten RSA-Schlüssel nicht entschlüsseln; Passwort ist "
 "womöglich falsch oder der 'get_passphrase'-Luahook fehlt"
 
-#: src/key_store.cc:633
+#: src/key_store.cc:646
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
 msgstr ""
 "konnte privaten RSA-Schlüssel nicht vom PKCS#8-Schlüsselpaar extrahieren"
 
-#: src/key_store.cc:673
+#: src/key_store.cc:686
 #, c-format
 msgid "key '%s' already exists"
 msgstr "Schlüssel '%s' existiert bereits"
 
-#: src/key_store.cc:685
+#: src/key_store.cc:698
 #, c-format
 msgid "generating key-pair '%s'"
 msgstr "erzeuge Schlüsselpaar '%s'"
 
-#: src/key_store.cc:733
+#: src/key_store.cc:746
 #, c-format
 msgid "storing key-pair %s in '%s/'"
 msgstr "speichere Schlüsselpaar %s in '%s/'"
 
-#: src/key_store.cc:746
+#: src/key_store.cc:759
 #, c-format
 msgid "storing public key %s in '%s'"
 msgstr "speichere öffentlichen Schlüssel %s in '%s'"
 
-#: src/key_store.cc:762
+#: src/key_store.cc:775
 #, c-format
 msgid "key '%s' has hash '%s'"
 msgstr "Der Schlüssel '%s' hat die Prüfsumme '%s'"
 
-#: src/key_store.cc:776
+#: src/key_store.cc:789
 #, c-format
 msgid "no key pair '%s' found in key store '%s'"
 msgstr "kein Schlüsselpaar '%s' in Schlüsselbund '%s' gefunden"
 
-#: src/key_store.cc:828
+#: src/key_store.cc:845
 #, c-format
 msgid "Botan error decrypting data: '%s'"
 msgstr "Botan-Fehler beim Entschlüsseln von Daten: '%s'"
 
-#: src/key_store.cc:851
+#: src/key_store.cc:868
 #, c-format
 msgid ""
 "you have chosen to sign only with ssh-agent but ssh-agent does not seem to "
@@ -4853,12 +4994,12 @@ msgstr ""
 "Sie haben ausgewählt, nur mit ssh-agent zu signieren, aber derzeit scheint "
 "ssh-agent nicht zu laufen"
 
-#: src/key_store.cc:881
+#: src/key_store.cc:898
 #, c-format
 msgid "you don't seem to have your monotone key imported "
 msgstr "anscheinend haben Sie Ihren monotone-Schlüssel nicht importiert"
 
-#: src/key_store.cc:935
+#: src/key_store.cc:952
 #, c-format
 msgid ""
 "make_signature: ssh signature (%i) != monotone signature (%i)\n"
@@ -4869,24 +5010,24 @@ msgstr ""
 "ssh-Signatur     : %s\n"
 "monotone-Signatur: %s"
 
-#: src/key_store.cc:951
+#: src/key_store.cc:968
 #, c-format
 msgid "make_signature: signature is not valid"
 msgstr "make_signature: Signatur ist ungültig"
 
-#: src/key_store.cc:963
+#: src/key_store.cc:980
 #, c-format
 msgid "no ssh-agent is available, cannot add key %s"
 msgstr "es ist kein ssh-agent verfügbar; kann Schlüssel %s nicht hinzufügen"
 
-#: src/key_store.cc:1060
+#: src/key_store.cc:1087
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
 msgstr ""
 "konnte alten, privaten RSA-Schlüssel nicht entschlüsseln; Passwort ist "
 "womöglich falsch"
 
-#: src/key_store.cc:1097
+#: src/key_store.cc:1124
 #, c-format
 msgid "public and private keys for %s do not match"
 msgstr "öffentlicher und privater Schlüssel für %s stimmen nicht überein"
@@ -5030,22 +5171,22 @@ msgstr ""
 msgstr ""
 "falsch gebildetes Paket: ungültige öffentliche Schlüsseldaten für '%s': %s"
 
-#: src/packet.cc:187
+#: src/packet.cc:189
 #, c-format
 msgid "malformed packet: invalid private key data for '%s': %s"
 msgstr "falsch gebildetes Paket: ungültige private Schlüsseldaten für '%s': %s"
 
-#: src/packet.cc:199
+#: src/packet.cc:205
 #, c-format
 msgid "malformed packet: invalid cert name"
 msgstr "falsch gebildetes Paket: ungültiger Zertifikatsname"
 
-#: src/packet.cc:206
+#: src/packet.cc:212
 #, c-format
 msgid "malformed packet: too many arguments in header"
 msgstr "falsch gebildetes Paket: zu viele Argumente im Kopf"
 
-#: src/packet.cc:335
+#: src/packet.cc:341
 #, c-format
 msgid "unknown packet type '%s'"
 msgstr "unbekannter Pakettyp '%s'"
@@ -5416,7 +5557,7 @@ msgstr "Server ist zu alt für entfernte
 
 #: src/network/automate_session.cc:130
 #, c-format
-msgid "Sorry, you aren't allowed to do that."
+msgid "sorry, you aren't allowed to do that."
 msgstr "Entschuldigung, Sie dürfen dies nicht tun."
 
 #: src/network/automate_session.cc:219
@@ -5628,7 +5769,8 @@ msgstr ""
 "keys with this name and we don't know which one it is"
 msgstr ""
 "entferne eingehendes Zertifkat, welches von einem Schlüssel unterschrieben\n"
-"wurden, den wir nicht haben.  Sie müssen wahrscheinlich diesen Schlüssel von\n"
+"wurden, den wir nicht haben.  Sie müssen wahrscheinlich diesen Schlüssel "
+"von\n"
 "einem neueren netsync-Peer holen.  Der Name des Schlüssels ist '%s', aber\n"
 "beachten Sie, dass es mehrere Schlüssel mit diesem Namen gibt und wir nicht\n"
 "wissen, welcher das ist"
@@ -5715,7 +5857,7 @@ msgstr "Schlüssel"
 
 #: src/network/netsync_session.cc:1467
 #, c-format
-msgid "Cannot find key '%s'"
+msgid "cannot find key '%s'"
 msgstr "Kann Schlüssel '%s' nicht finden"
 
 #: src/network/reactor.cc:182
@@ -5846,7 +5988,7 @@ msgstr "Peer %s E/A im 'confirmed state'
 
 #: src/network/session_base.cc:256
 #, c-format
-msgid "Network error on peer %s, disconnecting"
+msgid "network error on peer %s, disconnecting"
 msgstr "Netzwerk-Fehler an Peer %s, trenne Verbindung"
 
 #: src/netxx_pipe.cc:50 src/netxx_pipe.cc:189
@@ -6082,26 +6224,26 @@ msgstr "konnte Revision nicht analysiere
 msgid "failed to parse revision"
 msgstr "konnte Revision nicht analysieren"
 
-#: src/roster.cc:2477
+#: src/roster.cc:2495
 #, c-format
 msgid "restriction includes deletion of '%s' but excludes deletion of '%s'"
 msgstr ""
 "Die Beschränkung schließt das Löschen von '%s' ein, jedoch das Löschen von "
 "'%s' aus."
 
-#: src/roster.cc:2488
+#: src/roster.cc:2506
 #, c-format
 msgid "restriction excludes addition of '%s' but includes addition of '%s'"
 msgstr ""
 "Beschränkung schließt das Hinzufügen von '%s' ein, jedoch das Hinzufügen von "
 "'%s' aus."
 
-#: src/roster.cc:2514
+#: src/roster.cc:2532
 #, c-format
 msgid "restriction excludes addition of root directory"
 msgstr "Beschränkung schließt das Hinzufügen des Wurzelverzeichnisses aus"
 
-#: src/roster.cc:2518
+#: src/roster.cc:2536
 #, c-format
 msgid "invalid restriction"
 msgstr "ungültige Beschränkung"
@@ -6154,7 +6296,7 @@ msgstr ""
 "Wenn kein Argument übergeben wurde, gibt dieses Kommando die Köpfe des "
 "Zweiges des Arbeitsbereichs aus."
 
-#: src/automate.cc:116 src/automate.cc:169 src/automate.cc:1723
+#: src/automate.cc:116 src/automate.cc:169 src/automate.cc:1756
 msgid "REV1 [REV2 [REV3 [...]]]"
 msgstr "REV1 [REV2 [REV3 [...]]]"
 
@@ -6166,268 +6308,272 @@ msgstr "Gibt die Nachfahren der übergeb
 msgid "Prints the descendents of the given revisions"
 msgstr "Gibt die Nachfahren der übergebenen Revisionen aus"
 
-#: src/automate.cc:223 src/automate.cc:253
+#: src/automate.cc:223 src/automate.cc:256 src/automate.cc:286
 msgid "[REV1 [REV2 [REV3 [...]]]]"
 msgstr "[REV1 [REV2 [REV3 [...]]]]"
 
 #: src/automate.cc:224
 msgid "Erases the ancestors in a list of revisions"
-msgstr "Entfernt die Vorfahren von einer Liste von Revisionen"
+msgstr "Entfernt die Vorfahren in einer Liste von Revisionen"
 
-#: src/automate.cc:254
+#: src/automate.cc:257
+msgid "Erases the descendants in a list of revisions"
+msgstr "Entfernt die Nachfahren in einer Liste von Revisionen"
+
+#: src/automate.cc:287
 msgid "Topologically sorts a list of revisions"
 msgstr "Sortiert eine Liste von Revisionen topologisch"
 
-#: src/automate.cc:291
+#: src/automate.cc:324
 msgid "NEW_REV [OLD_REV1 [OLD_REV2 [...]]]"
 msgstr "NEUE_REV [ALTE_REV1 [ALTE_REV2 [...]]]"
 
-#: src/automate.cc:292
+#: src/automate.cc:325
 msgid "Lists the ancestors of the first revision given, not in the others"
 msgstr ""
 "Gibt die Vorfahren der ersten Revision aus, die nicht ebenfalls Vorfahren "
 "der anderen übergebenen Revisionen sind"
 
-#: src/automate.cc:339
+#: src/automate.cc:372
 msgid "Lists the leaves of the revision graph"
 msgstr "Gibt die Blätter des Revisionsgraphen aus"
 
-#: src/automate.cc:365
+#: src/automate.cc:398
 msgid "Lists the roots of the revision graph"
 msgstr "Gibt die Wurzeln des Revisionsgraphen aus"
 
-#: src/automate.cc:395
+#: src/automate.cc:428
 msgid "Prints the parents of a revision"
 msgstr "Gibt die Eltern einer Revision aus"
 
-#: src/automate.cc:426
+#: src/automate.cc:459
 msgid "Prints the children of a revision"
 msgstr "Gibt die Kinder einer Revision aus"
 
-#: src/automate.cc:467
+#: src/automate.cc:500
 msgid "Prints the complete ancestry graph"
 msgstr "Gibt den kompletten Revisionsgraphen aus"
 
-#: src/automate.cc:514 src/asciik.cc:373
+#: src/automate.cc:547 src/asciik.cc:373
 msgid "SELECTOR"
 msgstr "SELEKTOR"
 
-#: src/automate.cc:515
+#: src/automate.cc:548
 msgid "Lists the revisions that match a selector"
 msgstr "Gibt die Revisionen aus, die auf einem Selektor passen"
 
-#: src/automate.cc:907
+#: src/automate.cc:940
 #, c-format
 msgid ""
 "'%s' is both known and ignored; it will be shown as 'missing'. Check '.mtn-"
 "ignore'"
 msgstr ""
-"'%s' ist bekannt, wird aber gleichzeitig ignoriert und wird daher "
-"als 'fehlend' gekennzeichnet. Überpüfen Sie die Datei '.mtn-ignore'"
+"'%s' ist bekannt, wird aber gleichzeitig ignoriert und wird daher als "
+"'fehlend' gekennzeichnet. Überpüfen Sie die Datei '.mtn-ignore'"
 
-#: src/automate.cc:1020
+#: src/automate.cc:1053
 msgid "Prints a summary of files found in the workspace"
 msgstr ""
 "Gibt eine Zusammenfassung der Dateien, die im Arbeitsbereich gefunden "
 "wurden, aus"
 
-#: src/automate.cc:1240 src/automate.cc:1586 src/automate.cc:1617
+#: src/automate.cc:1273 src/automate.cc:1619 src/automate.cc:1650
 msgid "REVID"
 msgstr "REVISIONS_ID"
 
-#: src/automate.cc:1241
+#: src/automate.cc:1274
 msgid "Shows change information for a revision"
 msgstr "Zeigt die Änderungen, die in einer Revision vorgenommen wurden"
 
-#: src/automate.cc:1268
+#: src/automate.cc:1301
 msgid "[PATHS ...]"
 msgstr "[PFADE...]"
 
-#: src/automate.cc:1269
+#: src/automate.cc:1302
 msgid "Shows change information for a workspace"
 msgstr "Zeigt Änderungen in einem Arbeitsbereich"
 
-#: src/automate.cc:1315
+#: src/automate.cc:1348
 msgid "Shows the revision on which the workspace is based"
 msgstr "Gibt die Revision zurück, auf der der Arbeitsbereich basiert"
 
-#: src/automate.cc:1343
+#: src/automate.cc:1376
 msgid "Shows the revision of the current workspace"
 msgstr "Gibt die Revision des derzeitigen Arbeitsbereiches zurück"
 
-#: src/automate.cc:1412
+#: src/automate.cc:1445
 msgid "Shows the manifest associated with a revision"
 msgstr "Zeigt das Manifest, welches einer Revision zugeordnet ist"
 
-#: src/automate.cc:1551
+#: src/automate.cc:1584
 msgid "Prints the extended manifest for the given identifier"
 msgstr ""
 "Gibt das erweiterte Manifest für die Revision mit der übergebenen ID aus"
 
-#: src/automate.cc:1587
+#: src/automate.cc:1620
 msgid "Prints the revision data in packet format"
 msgstr "Gibt die Revisionsdaten im Paketformat aus"
 
-#: src/automate.cc:1618
+#: src/automate.cc:1651
 msgid "Prints the certs associated with a revision in packet format"
 msgstr ""
 "Gibt die Zertifikate, die einer Revision zugeordnet sind, im Paketformat aus"
 
-#: src/automate.cc:1653
+#: src/automate.cc:1686
 msgid "Prints the file data in packet format"
 msgstr "Gibt die Dateidaten im Paketformat aus"
 
-#: src/automate.cc:1668
+#: src/automate.cc:1701
 #, c-format
 msgid "no such file '%s'"
 msgstr "Datei nicht gefunden: '%s'"
 
-#: src/automate.cc:1684
+#: src/automate.cc:1717
 msgid "OLD_FILE NEW_FILE"
 msgstr "ALTE_DATEI NEUE_DATEI"
 
-#: src/automate.cc:1685
+#: src/automate.cc:1718
 msgid "Prints the file delta in packet format"
 msgstr "Gibt ein Datei-Delta im Paketformat aus"
 
-#: src/automate.cc:1724
+#: src/automate.cc:1757
 msgid "Prints revisions that are common ancestors of a list of revisions"
 msgstr ""
 "Gibt die Revisionen aus, die gemeinsame Vorfahren einer Liste von Revisionen "
 "sind"
 
-#: src/automate.cc:1763
+#: src/automate.cc:1796
 msgid "Prints all branch certs in the revision graph"
 msgstr "Gibt alle Zweigzertifikate des Revisionsgraphen aus"
 
-#: src/automate.cc:1814
+#: src/automate.cc:1847
 msgid "[BRANCH_PATTERN]"
 msgstr "[ZWEIG_MUSTER]"
 
-#: src/automate.cc:1815
+#: src/automate.cc:1848
 msgid "Prints all tags attached to a set of branches"
 msgstr "Gibt alle Marken zurück, die einer Menge von Zweigen zugeordnet sind"
 
-#: src/automate.cc:1897
+#: src/automate.cc:1930
 msgid "OPTION"
 msgstr "OPTION"
 
-#: src/automate.cc:1898
+#: src/automate.cc:1931
 msgid "Shows the value of an option"
 msgstr "Zeigt den Wert einer Option im Arbeitsbereich"
 
-#: src/automate.cc:1929
+#: src/automate.cc:1962
 msgid "REV FILE"
 msgstr "REVISION DATEI"
 
-#: src/automate.cc:1930
+#: src/automate.cc:1963
 msgid ""
 "Lists the revisions that changed the content relative to another revision"
 msgstr ""
 "Gibt alle Revisionen aus, die den Inhalt von DATEI relativ zu REVISION "
 "geändert haben"
 
-#: src/automate.cc:1951 src/automate.cc:2018
+#: src/automate.cc:1984 src/automate.cc:2051
 #, c-format
 msgid "file '%s' is unknown for revision %s"
 msgstr "Datei '%s' ist der Revision %s unbekannt"
 
-#: src/automate.cc:1992
+#: src/automate.cc:2025
 msgid "REV1 FILE REV2"
 msgstr "REV1 DATEI REV2"
 
-#: src/automate.cc:1993
+#: src/automate.cc:2026
 msgid ""
 "Prints the name of a file in a target revision relative to a given revision"
 msgstr ""
 "Gibt den Namen von DATEI aus REV1 zurück, so wie sie in der REV2 benannt ist"
 
-#: src/automate.cc:2045
+#: src/automate.cc:2078
 msgid "[FILEID] CONTENTS"
 msgstr "[DATEIID] INHALT"
 
-#: src/automate.cc:2046
+#: src/automate.cc:2079
 msgid "Stores a file in the database"
 msgstr "Speichert eine Datei in der Datenbank"
 
-#: src/automate.cc:2100
+#: src/automate.cc:2133
 msgid "REVISION-DATA"
 msgstr "REVISIONS-DATEN"
 
-#: src/automate.cc:2101
+#: src/automate.cc:2134
 msgid "Stores a revision into the database"
 msgstr "Speichert eine Revision in der Datenbank"
 
-#: src/automate.cc:2143
+#: src/automate.cc:2176
 #, c-format
 msgid "missing prerequisite for revision %s"
 msgstr "fehlende Voraussetzung für Revision %s"
 
-#: src/automate.cc:2160
+#: src/automate.cc:2193
 msgid "REVISION-ID NAME VALUE"
 msgstr "REVISIONS-ID NAME WERT"
 
-#: src/automate.cc:2161
+#: src/automate.cc:2194
 msgid "Adds a revision certificate"
 msgstr "Fügt ein Zertifikat zu einer Revision hinzu"
 
-#: src/automate.cc:2196
+#: src/automate.cc:2229
 msgid "[DOMAIN]"
 msgstr "[DOMÄNE]"
 
-#: src/automate.cc:2197
+#: src/automate.cc:2230
 msgid "Retrieve database variables"
 msgstr "Gibt Datenbankvariablen zurück"
 
-#: src/automate.cc:2245
+#: src/automate.cc:2278
 #, c-format
 msgid "no variables found or invalid domain specified"
 msgstr "keine Variablen gefunden oder ungültige Domäne angegeben"
 
-#: src/automate.cc:2296
+#: src/automate.cc:2329
 msgid "DOMAIN [NAME]"
 msgstr "DOMÄNE [NAME]"
 
-#: src/automate.cc:2297
+#: src/automate.cc:2330
 msgid "Drops a database variable"
 msgstr "Entfernt eine Datenbankvariable"
 
-#: src/automate.cc:2333
+#: src/automate.cc:2366
 #, c-format
 msgid "no variables found in domain '%s'"
 msgstr "keine Variablen in der Domäne '%s' gefunden"
 
-#: src/automate.cc:2350
+#: src/automate.cc:2383
 msgid "Prints the workspace root for the current directory"
 msgstr ""
 "Gibt das Wurzelverzeichnis des Arbeitsbereichs für das aktuelle Verzeichnis "
 "aus"
 
-#: src/automate.cc:2373
+#: src/automate.cc:2406
 msgid "Executes the given lua function and returns the result"
 msgstr "Führt die gegebene Lua-Funktion aus und gibt deren Rückgabewert zurück"
 
-#: src/automate.cc:2383
+#: src/automate.cc:2416
 #, c-format
 msgid "lua function '%s' does not exist"
 msgstr "Lua-Funktion '%s' existiert nicht"
 
-#: src/automate.cc:2396
+#: src/automate.cc:2429
 #, c-format
 msgid "lua call '%s' failed"
 msgstr "Ausführung der Lua-Funktion '%s' schlug fehl"
 
-#: src/automate.cc:2431
+#: src/automate.cc:2464
 #, c-format
 msgid "no completions for this command"
 msgstr "keine Vervollständigungen für dieses Kommando"
 
-#: src/automate.cc:2436
+#: src/automate.cc:2469
 #, c-format
 msgid "multiple completions possible for this command"
 msgstr "mehrere Vervollständigungen für dieses Kommando möglich"
 
-#: src/automate.cc:2448
+#: src/automate.cc:2481
 #, c-format
 msgid "sorry, that can't be run remotely or over stdio"
 msgstr ""
@@ -6797,8 +6943,8 @@ msgstr "Der Selektor '%s' ist kein gült
 
 #: src/selectors.cc:172
 #, c-format
-msgid "expanded date '%s' -> '%s'"
-msgstr "expandierte Datum '%s' -> '%s'"
+msgid "expanded date '%s' to UTC -> '%s'"
+msgstr "expandierte Datum '%s' zu UTC -> '%s'"
 
 #: src/selectors.cc:215
 #, c-format
@@ -6845,39 +6991,39 @@ msgstr[1] "die '%s'-Funktion benötigt %
 msgstr[0] "die '%s'-Funktion benötigt %d Argument, nicht %d"
 msgstr[1] "die '%s'-Funktion benötigt %d Argumente, nicht %d"
 
-#: src/selectors.cc:619
+#: src/selectors.cc:639
 #, c-format
 msgid "unknown selection function '%s'"
 msgstr "unbekannte Selektorfunktion '%s'"
 
-#: src/selectors.cc:652
+#: src/selectors.cc:672
 #, c-format
 msgid "expanded selector '%s' -> '%s'"
 msgstr "expandiere Selektor '%s' -> '%s'"
 
-#: src/selectors.cc:691
+#: src/selectors.cc:711
 #, c-format
 msgid "unknown selector type: %c"
 msgstr "unbekannter Selektor-Typ: %c"
 
-#: src/selectors.cc:726
+#: src/selectors.cc:746
 #, c-format
 msgid "selector '%s' is invalid, it ends with the escape character '\\'"
 msgstr "Selektor '%s' ist ungültig, er endet mit dem Escapezeichen '\\'"
 
-#: src/selectors.cc:731
+#: src/selectors.cc:751
 #, c-format
 msgid "selector '%s' is invalid, it contains an unknown escape sequence '%s%s'"
 msgstr ""
 "Selektor '%s' ist ungültig, er beinhaltet eine unbekannte Escapesequenz '%s"
 "%s'"
 
-#: src/selectors.cc:770
+#: src/selectors.cc:790
 #, c-format
 msgid "selector '%s' is invalid, unmatched ')'"
 msgstr "Selektor '%s' ist ungültig, keine öffnende Klammer für ')'"
 
-#: src/selectors.cc:787
+#: src/selectors.cc:807
 #, c-format
 msgid ""
 "selector '%s' is invalid, function argument doesn't look like an arg-list"
@@ -6885,7 +7031,7 @@ msgstr ""
 "Selektor '%s' ist ungültig, Funktionsargument sieht nicht wie eine Liste von "
 "Argumenten aus"
 
-#: src/selectors.cc:798
+#: src/selectors.cc:818
 #, c-format
 msgid ""
 "selector '%s' is invalid, grouping parentheses contain something that "
@@ -6894,17 +7040,17 @@ msgstr ""
 "Selektor '%s' ist ungültig, gruppierende Klammern beinhalten etwas, das "
 "nicht wie ein Ausdruck aussieht"
 
-#: src/selectors.cc:809
+#: src/selectors.cc:829
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '/'"
 msgstr "Selektor '%s' ist ungültig, da er mit einem '/' beginnt"
 
-#: src/selectors.cc:813
+#: src/selectors.cc:833
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '|'"
 msgstr "Selektor '%s' ist ungültig, da er mit einem '|' beginnt"
 
-#: src/selectors.cc:838
+#: src/selectors.cc:858
 #, c-format
 msgid ""
 "selector '%s' is invalid, because there is a '%s' someplace it shouldn't be"
@@ -6912,7 +7058,7 @@ msgstr ""
 "Selektor '%s' ist ungültig, da sich ein '%s' an einer Stelle befindet, wo es "
 "nicht hingehört"
 
-#: src/selectors.cc:843 src/selectors.cc:846
+#: src/selectors.cc:863 src/selectors.cc:866
 #, c-format
 msgid ""
 "selector '%s' is invalid, don't mix '/' and '|' operators without parentheses"
@@ -6920,22 +7066,22 @@ msgstr ""
 "Selektor '%s' ist ungültig, Vermischung von '/'- und '|'-Operatoren ohne "
 "Klammern"
 
-#: src/selectors.cc:885
+#: src/selectors.cc:905
 #, c-format
 msgid "selector '%s' is invalid, it doesn't look like an expr"
 msgstr "Selektor '%s' ist ungültig,  sieht nicht nach einem Ausdruck aus"
 
-#: src/selectors.cc:908
+#: src/selectors.cc:928
 #, c-format
 msgid "expanding selection '%s'"
 msgstr "expandiere Auswahl '%s'"
 
-#: src/selectors.cc:912
+#: src/selectors.cc:932
 #, c-format
 msgid "no match for selection '%s'"
 msgstr "kein Treffer für Auswahl '%s'"
 
-#: src/selectors.cc:917
+#: src/selectors.cc:937
 #, c-format
 msgid "expanded to '%s'"
 msgstr "erweitert zu '%s'"
@@ -6992,177 +7138,186 @@ msgstr "Hinweis: Ihr Arbeitsbereich wurd
 msgid "note: your workspace has not been updated"
 msgstr "Hinweis: Ihr Arbeitsbereich wurde nicht aktualisiert."
 
-#: src/merge_roster.cc:341
+#: src/merge_roster.cc:420
 #, c-format
-msgid ""
-"content changes to the file '%s'\n"
-"will be ignored during this merge as the file has been\n"
-"removed on one side of the merge.  Affected revisions include:"
-msgstr ""
-"Inhaltsänderungen in der Datei '%s'\n"
-"werden bei dieser Vereinigung ignoriert, da die Datei\n"
-"auf einer Seite der Vereinigung gelöscht wurde. Betroffene Revisionen:"
+msgid "unsupported '%s' conflict resolution in mtn:resolve_conflict attribute"
+msgstr "nicht unterstützte '%s'-Konfliktlösung in 'mtn:resolve_conflict'-Attribut"
 
-#: src/merge_roster.cc:346
+#: src/merge_conflict.cc:590
 #, c-format
-msgid "Revision: %s"
-msgstr "Revision: %s"
-
-#: src/merge_conflict.cc:576
-#, c-format
 msgid "conflict: missing root directory"
 msgstr "Konflikt: fehlendes Wurzelverzeichnis"
 
-#: src/merge_conflict.cc:586 src/merge_conflict.cc:628
+#: src/merge_conflict.cc:600 src/merge_conflict.cc:642
 #, c-format
 msgid "directory '%s' pivoted to root on the left"
 msgstr ""
 "Verzeichnis '%s' wurde auf linker Seite mit Wurzelverzeichnis getauscht"
 
-#: src/merge_conflict.cc:596 src/merge_conflict.cc:638
+#: src/merge_conflict.cc:610 src/merge_conflict.cc:652
 #, c-format
 msgid "directory '%s' deleted on the right"
 msgstr "Verzeichnis '%s' wurde auf rechter Seite gelöscht"
 
-#: src/merge_conflict.cc:609 src/merge_conflict.cc:649
+#: src/merge_conflict.cc:623 src/merge_conflict.cc:663
 #, c-format
 msgid "directory '%s' deleted on the left"
 msgstr "Verzeichnis '%s' wurde auf linker Seite gelöscht"
 
-#: src/merge_conflict.cc:618 src/merge_conflict.cc:658
+#: src/merge_conflict.cc:632 src/merge_conflict.cc:672
 #, c-format
 msgid "directory '%s' pivoted to root on the right"
 msgstr ""
 "Verzeichnis '%s' wurde auf rechter Seite mit Wurzelverzeichnis getauscht"
 
-#: src/merge_conflict.cc:702
+#: src/merge_conflict.cc:716
 #, c-format
 msgid "conflict: invalid name '_MTN' in root directory"
 msgstr "Konflikt: ungültiger Name '_MTN' im Wurzelverzeichnis"
 
-#: src/merge_conflict.cc:712
+#: src/merge_conflict.cc:726
 #, c-format
 msgid "'%s' pivoted to root on the left"
 msgstr "'%s' wurde auf linker Seite mit Wurzelverzeichnis getauscht"
 
-#: src/merge_conflict.cc:722 src/merge_conflict.cc:825
-#: src/merge_conflict.cc:843
+#: src/merge_conflict.cc:736 src/merge_conflict.cc:839
+#: src/merge_conflict.cc:857
 #, c-format
 msgid "'%s' renamed to '%s' on the right"
 msgstr "'%s' wurde zu '%s' auf rechter Seite umbenannt"
 
-#: src/merge_conflict.cc:730
+#: src/merge_conflict.cc:744
 #, c-format
 msgid "'%s' added in revision %s on the right"
 msgstr "'%s' wurde in Revision %s auf rechter Seite hinzugefügt"
 
-#: src/merge_conflict.cc:742
+#: src/merge_conflict.cc:756
 #, c-format
 msgid "'%s' pivoted to root on the right"
 msgstr "'%s' wurde auf rechter Seite mit Wurzelverzeichnis getauscht"
 
-#: src/merge_conflict.cc:752 src/merge_conflict.cc:816
-#: src/merge_conflict.cc:834
+#: src/merge_conflict.cc:766 src/merge_conflict.cc:830
+#: src/merge_conflict.cc:848
 #, c-format
 msgid "'%s' renamed to '%s' on the left"
 msgstr "'%s' wurde zu '%s' auf linker Seite umbenannt"
 
-#: src/merge_conflict.cc:760
+#: src/merge_conflict.cc:774
 #, c-format
 msgid "'%s' added in revision %s on the left"
 msgstr "'%s' wurde in Revision %s auf linker Seite hinzugefügt"
 
-#: src/merge_conflict.cc:809
+#: src/merge_conflict.cc:823
 #, c-format
 msgid "conflict: directory loop created"
 msgstr "Konflikt: Verzeichnis-Schleife erzeugt"
 
-#: src/merge_conflict.cc:887
+#: src/merge_conflict.cc:901
 #, c-format
 msgid "conflict: orphaned file '%s' from revision %s"
 msgstr "Konflikt: verwaiste Datei '%s' von Revision %s"
 
-#: src/merge_conflict.cc:894
+#: src/merge_conflict.cc:908
 #, c-format
 msgid "conflict: orphaned directory '%s' from revision %s"
 msgstr "Konflikt: verwaistes Verzeichnis '%s' von Revision %s"
 
-#: src/merge_conflict.cc:911
+#: src/merge_conflict.cc:925
 #, c-format
 msgid "parent directory '%s' was deleted on the right"
 msgstr "Eltern-Verzeichnis '%s' wurde auf rechter Seite gelöscht"
 
-#: src/merge_conflict.cc:920
+#: src/merge_conflict.cc:934
 #, c-format
 msgid "file '%s' was renamed from '%s' on the left"
 msgstr "Datei '%s' wurde auf linker Seite von '%s' umbenannt"
 
-#: src/merge_conflict.cc:923
+#: src/merge_conflict.cc:937
 #, c-format
 msgid "directory '%s' was renamed from '%s' on the left"
 msgstr "Verzeichnis '%s' wurde auf linker Seite von '%s' umbenannt"
 
-#: src/merge_conflict.cc:933
+#: src/merge_conflict.cc:947
 #, c-format
 msgid "file '%s' was added on the left"
 msgstr "Datei '%s' wurde auf linker Seite hinzugefügt"
 
-#: src/merge_conflict.cc:936
+#: src/merge_conflict.cc:950
 #, c-format
 msgid "directory '%s' was added on the left"
 msgstr "Verzeichnis '%s' wurde auf linker Seite hinzugefügt"
 
-#: src/merge_conflict.cc:954
+#: src/merge_conflict.cc:968
 #, c-format
 msgid "parent directory '%s' was deleted on the left"
 msgstr "Eltern-Verzeichnis '%s' wurde auf linker Seite gelöscht"
 
-#: src/merge_conflict.cc:963
+#: src/merge_conflict.cc:977
 #, c-format
 msgid "file '%s' was renamed from '%s' on the right"
 msgstr "Datei '%s' wurde auf rechter Seite zu '%s' umbenannt"
 
-#: src/merge_conflict.cc:966
+#: src/merge_conflict.cc:980
 #, c-format
 msgid "directory '%s' was renamed from '%s' on the right"
 msgstr "Verzeichnis '%s' wurde auf rechter Seite zu '%s' umbenannt"
 
-#: src/merge_conflict.cc:975
+#: src/merge_conflict.cc:989
 #, c-format
 msgid "file '%s' was added on the right"
 msgstr "Datei '%s' wurde auf rechter Seite hinzugefügt"
 
-#: src/merge_conflict.cc:978
+#: src/merge_conflict.cc:992
 #, c-format
 msgid "directory '%s' was added on the right"
 msgstr "Verzeichnis '%s' wurde auf rechter Seite hinzugefügt"
 
-#: src/merge_conflict.cc:1035
+#: src/merge_conflict.cc:1049
 #, c-format
 msgid "conflict: multiple names for file '%s' from revision %s"
 msgstr "Konflikt: mehrere Namen für Datei '%s' von Revision %s"
 
-#: src/merge_conflict.cc:1038
+#: src/merge_conflict.cc:1052
 #, c-format
 msgid "conflict: multiple names for directory '%s' from revision %s"
 msgstr "Konflikt: mehrere Namen für Verzeichnis '%s' von Revision %s"
 
-#: src/merge_conflict.cc:1041
+#: src/merge_conflict.cc:1055
 #, c-format
 msgid "renamed to '%s' on the left"
 msgstr "umbenannt zu '%s' auf linker Seite"
 
-#: src/merge_conflict.cc:1042
+#: src/merge_conflict.cc:1056
 #, c-format
 msgid "renamed to '%s' on the right"
 msgstr "umbenannt zu '%s' auf rechter Seite"
 
-#: src/merge_conflict.cc:1100
+#: src/merge_conflict.cc:1222
 #, c-format
+msgid "modified on the right, named %s"
+msgstr "auf rechter Seite verändert, umbenannt nach %s"
+
+#: src/merge_conflict.cc:1226
+#, c-format
+msgid "modified on the left, named %s"
+msgstr "auf linker Seite verändert, umbenannt nach %s"
+
+#: src/merge_conflict.cc:1257
+#, c-format
+msgid "left_resolution: drop"
+msgstr "left_resolution: drop"
+
+#: src/merge_conflict.cc:1274
+#, c-format
+msgid "right_resolution: drop"
+msgstr "right_resolution: drop"
+
+#: src/merge_conflict.cc:1331
+#, c-format
 msgid "conflict: duplicate name '%s' for the directory '%s'"
 msgstr "Konflikt: doppelter Name '%s' für das Verzeichnis '%s'"
 
-#: src/merge_conflict.cc:1109
+#: src/merge_conflict.cc:1340
 #, c-format
 msgid ""
 "conflict: duplicate name '%s' for the directory\n"
@@ -7173,84 +7328,84 @@ msgstr ""
 "          names '%s' auf linker Seite und\n"
 "          names '%s' auf rechter Seite."
 
-#: src/merge_conflict.cc:1127 src/merge_conflict.cc:1177
+#: src/merge_conflict.cc:1358 src/merge_conflict.cc:1408
 #, c-format
 msgid "added as a new file on the left"
 msgstr "als neue Datei auf linker Seite hinzugefügt"
 
-#: src/merge_conflict.cc:1129 src/merge_conflict.cc:1179
+#: src/merge_conflict.cc:1360 src/merge_conflict.cc:1410
 #, c-format
 msgid "added as a new directory on the left"
 msgstr "als neues Verzeichnis auf linker Seite hinzugefügt"
 
-#: src/merge_conflict.cc:1137 src/merge_conflict.cc:1161
+#: src/merge_conflict.cc:1368 src/merge_conflict.cc:1392
 #, c-format
 msgid "added as a new file on the right"
 msgstr "als neue Datei auf rechter Seite hinzugefügt"
 
-#: src/merge_conflict.cc:1139 src/merge_conflict.cc:1163
+#: src/merge_conflict.cc:1370 src/merge_conflict.cc:1394
 #, c-format
 msgid "added as a new directory on the right"
 msgstr "als neues Verzeichnis auf rechter Seite hinzugefügt"
 
-#: src/merge_conflict.cc:1152 src/merge_conflict.cc:1204
+#: src/merge_conflict.cc:1383 src/merge_conflict.cc:1435
 #, c-format
 msgid "renamed from file '%s' on the left"
 msgstr "von Datei '%s' auf linker Seite umbenannt"
 
-#: src/merge_conflict.cc:1154 src/merge_conflict.cc:1206
+#: src/merge_conflict.cc:1385 src/merge_conflict.cc:1437
 #, c-format
 msgid "renamed from directory '%s' on the left"
 msgstr "von Verzeichnis '%s' auf linker Seite umbenannt"
 
-#: src/merge_conflict.cc:1187 src/merge_conflict.cc:1214
+#: src/merge_conflict.cc:1418 src/merge_conflict.cc:1445
 #, c-format
 msgid "renamed from file '%s' on the right"
 msgstr "von Datei '%s' auf rechter Seite umbenannt"
 
-#: src/merge_conflict.cc:1189 src/merge_conflict.cc:1216
+#: src/merge_conflict.cc:1420 src/merge_conflict.cc:1447
 #, c-format
 msgid "renamed from directory '%s' on the right"
 msgstr "von Verzeichnis '%s' auf rechter Seite umbenannt"
 
-#: src/merge_conflict.cc:1267
+#: src/merge_conflict.cc:1498
 #, c-format
 msgid "conflict: multiple values for attribute '%s' on file '%s'"
 msgstr "Konflikt: mehrere Werte für Attribut '%s' auf Datei '%s'"
 
-#: src/merge_conflict.cc:1270
+#: src/merge_conflict.cc:1501
 #, c-format
 msgid "conflict: multiple values for attribute '%s' on directory '%s'"
 msgstr "Konflikt: mehrere Werte für das Attribut '%s' auf Verzeichnis '%s'"
 
-#: src/merge_conflict.cc:1274
+#: src/merge_conflict.cc:1505
 #, c-format
 msgid "set to '%s' on the left"
 msgstr "auf '%s' auf linker Seite gesetzt"
 
-#: src/merge_conflict.cc:1276
+#: src/merge_conflict.cc:1507
 #, c-format
 msgid "deleted on the left"
 msgstr "auf linker Seite gelöscht"
 
-#: src/merge_conflict.cc:1279
+#: src/merge_conflict.cc:1510
 #, c-format
 msgid "set to '%s' on the right"
 msgstr "auf '%s' auf rechter Seite gelöscht"
 
-#: src/merge_conflict.cc:1281
+#: src/merge_conflict.cc:1512
 #, c-format
 msgid "deleted on the right"
 msgstr "auf rechter Seite gelöscht"
 
-#: src/merge_conflict.cc:1301
+#: src/merge_conflict.cc:1532
 #, c-format
 msgid ""
 "conflict: multiple values for attribute '%s' on file '%s' from revision %s"
 msgstr ""
 "Konflikt: mehrere Werte für Attribut '%s' auf Datei '%s' von Revision %s"
 
-#: src/merge_conflict.cc:1304
+#: src/merge_conflict.cc:1535
 #, c-format
 msgid ""
 "conflict: multiple values for attribute '%s' on directory '%s' from revision "
@@ -7259,197 +7414,236 @@ msgstr ""
 "Konflikt: mehrere Werte für Attribut '%s' auf Verzeichnis '%s' von Revision "
 "'%s'"
 
-#: src/merge_conflict.cc:1310
+#: src/merge_conflict.cc:1541
 #, c-format
 msgid "set to '%s' on left file '%s'"
 msgstr "auf '%s' auf linker Datei '%s' gesetzt"
 
-#: src/merge_conflict.cc:1313
+#: src/merge_conflict.cc:1544
 #, c-format
 msgid "set to '%s' on left directory '%s'"
 msgstr "auf '%s' auf linkem Verzeichnis '%s' gesetzt"
 
-#: src/merge_conflict.cc:1319
+#: src/merge_conflict.cc:1550
 #, c-format
 msgid "deleted from left file '%s'"
 msgstr "von linker Datei '%s' gelöscht"
 
-#: src/merge_conflict.cc:1322
+#: src/merge_conflict.cc:1553
 #, c-format
 msgid "deleted from left directory '%s'"
 msgstr "von linkem Verzeichnis '%s' gelöscht"
 
-#: src/merge_conflict.cc:1329
+#: src/merge_conflict.cc:1560
 #, c-format
 msgid "set to '%s' on right file '%s'"
 msgstr "auf '%s' auf rechter Datei '%s' gesetzt"
 
-#: src/merge_conflict.cc:1332
+#: src/merge_conflict.cc:1563
 #, c-format
 msgid "set to '%s' on right directory '%s'"
 msgstr "auf '%s' auf rechtem Verzeichnis '%s' gesetzt"
 
-#: src/merge_conflict.cc:1338
+#: src/merge_conflict.cc:1569
 #, c-format
 msgid "deleted from right file '%s'"
 msgstr "von rechter Datei '%s' gelöscht"
 
-#: src/merge_conflict.cc:1341
+#: src/merge_conflict.cc:1572
 #, c-format
 msgid "deleted from right directory '%s'"
 msgstr "von linkem Verzeichnis '%s' gelöscht"
 
-#: src/merge_conflict.cc:1416
+#: src/merge_conflict.cc:1647
 #, c-format
 msgid "conflict: content conflict on file '%s'"
 msgstr "Konflikt: Inhaltskonflikt in Datei '%s'"
 
-#: src/merge_conflict.cc:1418
+#: src/merge_conflict.cc:1649
 #, c-format
 msgid "content hash is %s on the left"
 msgstr "Inhalts-Prüfsumme ist %s auf linker Seite"
 
-#: src/merge_conflict.cc:1419
+#: src/merge_conflict.cc:1650
 #, c-format
 msgid "content hash is %s on the right"
 msgstr "Inhalts-Prüfsumme ist %s auf rechter Seite"
 
-#: src/merge_conflict.cc:1438
+#: src/merge_conflict.cc:1669
 #, c-format
 msgid "conflict: content conflict on file '%s' from revision %s"
 msgstr "Konflik: Inhaltskonflikt in '%s' von Revision %s"
 
-#: src/merge_conflict.cc:1440
+#: src/merge_conflict.cc:1671
 #, c-format
 msgid "content hash is %s on the left in file '%s'"
 msgstr "Inhalts-Prüfsumme ist %s auf linker Seite in Datei '%s'"
 
-#: src/merge_conflict.cc:1442
+#: src/merge_conflict.cc:1673
 #, c-format
 msgid "content hash is %s on the right in file '%s'"
 msgstr "Inhalts-Prüfsumme ist %s auf rechter Seite in Datei '%s'"
 
-#: src/merge_conflict.cc:1483 src/merge_conflict.cc:1714
-#: src/merge_conflict.cc:2079
+#: src/merge_conflict.cc:1714 src/merge_conflict.cc:1946
+#: src/merge_conflict.cc:2546
 #, c-format
 msgid "conflicts file does not match current conflicts"
 msgstr "Konfliktlösungsdatei passt nicht auf derzeitige Konflikte"
 
-#: src/merge_conflict.cc:1484
+#: src/merge_conflict.cc:1715
 #, c-format
 msgid "%s is not a supported conflict resolution for %s"
 msgstr "%s ist keine unterstützte Konfliktlösung für %s"
 
-#: src/merge_conflict.cc:1485
+#: src/merge_conflict.cc:1716
+#, c-format
+msgid ""
+"history for '%s' from %s will be lost; see user manual Merge Conflicts "
+"section"
+msgstr ""
+"Historie von '%s' von %s wird verloren gehen; konsultieren Sie den Abschnitt \"Merge Conflicts\" im Benutzerhandbuch"
+
+#: src/merge_conflict.cc:1717
 msgid "extra chars at end of conflict"
 msgstr "zusätzliche Zeichen am Ende des Konflikts"
 
-#: src/merge_conflict.cc:1701
+#: src/merge_conflict.cc:1933
 #, c-format
 msgid "expected orphaned_directory or orphaned_file, found %s"
 msgstr "erwartete orphaned_directory oder orphaned_file, erhielt %s"
 
-#: src/merge_conflict.cc:2131
+#: src/merge_conflict.cc:2604
 #, c-format
 msgid "extra data in file"
 msgstr "zusätzliche Daten in Datei"
 
-#: src/merge_conflict.cc:2251
+#: src/merge_conflict.cc:2732
 #, c-format
 msgid "left revision id does not match conflict file"
 msgstr "linke Revisions-ID passt nicht auf Konfliktlösungsdatei"
 
-#: src/merge_conflict.cc:2257
+#: src/merge_conflict.cc:2738
 #, c-format
 msgid "right revision id does not match conflict file"
 msgstr "rechte Revisions-ID passt nicht auf Konfliktlösungsdatei"
 
-#: src/merge_conflict.cc:2285
+#: src/merge_conflict.cc:2769
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existiert bereits"
 
-#: src/merge_conflict.cc:2287
+#: src/merge_conflict.cc:2771
 #, c-format
 msgid "directory '%s' does not exist or is unknown"
 msgstr "Das Verzeichnis '%s' existiert nicht oder ist unbekannt"
 
-#: src/merge_conflict.cc:2337
+#: src/merge_conflict.cc:2821
 #, c-format
 msgid "can't drop directory '%s'; it is not empty"
 msgstr "kann Verzeichnis '%s' nicht entfernen; Verzeichnis ist nicht leer"
 
-#: src/merge_conflict.cc:2352
+#: src/merge_conflict.cc:2835
 #, c-format
 msgid "no resolution provided for orphaned_node '%s'"
 msgstr "keine Lösung für verwaisten Knoten '%s' angegeben"
 
-#: src/merge_conflict.cc:2357
+#: src/merge_conflict.cc:2840
 #, c-format
 msgid "invalid resolution for orphaned_node '%s'"
 msgstr "ungültige Lösung für verwaisten Knoten '%s'"
 
-#: src/merge_conflict.cc:2381 src/merge_conflict.cc:2419
+#: src/merge_conflict.cc:2863 src/merge_conflict.cc:2896
 #, c-format
+msgid "replacing content of '%s' from %s with '%s'"
+msgstr "ersetze Inhalt von '%s' von %s mit '%s'"
+
+#: src/merge_conflict.cc:2935
+#, c-format
+msgid "extra %s_resolution provided for dropped_modified '%s'"
+msgstr "zusätzliche %s_resolution-Lösung für dropped_modified-Konflikt '%s' angegeben"
+
+#: src/merge_conflict.cc:2942
+#, c-format
+msgid "no resolution provided for dropped_modified '%s'"
+msgstr "keine Lösung für dropped_modified-Konflikt '%s' angegeben"
+
+#: src/merge_conflict.cc:2943
+#, c-format
+msgid "no %s_resolution provided for dropped_modified '%s'"
+msgstr "keine %s_resolution-Lösung für dropped_modified-Konflikt '%s' angegeben"
+
+#: src/merge_conflict.cc:2980
+#, c-format
+msgid "dropping '%s' from %s"
+msgstr "entferne '%s' von %s"
+
+#: src/merge_conflict.cc:2988 src/merge_conflict.cc:2995
+#, c-format
+msgid "keeping '%s' from %s"
+msgstr "behalte '%s' von %s"
+
+#: src/merge_conflict.cc:3017 src/merge_conflict.cc:3026
+#: src/merge_conflict.cc:3040 src/merge_conflict.cc:3052
+#, c-format
+msgid "renaming '%s' from %s to '%s'"
+msgstr "benenne '%s' von %s nach '%s' um"
+
+#: src/merge_conflict.cc:3176 src/merge_conflict.cc:3214
+#, c-format
 msgid "inconsistent left/right resolutions for '%s'"
 msgstr "inkonsistente Konfliktlösungen auf beiden Seiten für '%s'"
 
-#: src/merge_conflict.cc:2383
+#: src/merge_conflict.cc:3178
 #, c-format
 msgid "replacing content of '%s' with '%s'"
 msgstr "ersetze Inhalt von '%s' mit '%s'"
 
-#: src/merge_conflict.cc:2410
+#: src/merge_conflict.cc:3205
 #, c-format
 msgid "can't drop '%s'; not empty"
 msgstr "kann '%s' nicht entfernen; nicht leer"
 
-#: src/merge_conflict.cc:2421
+#: src/merge_conflict.cc:3216
 #, c-format
 msgid "keeping '%s'"
 msgstr "behalte '%s'"
 
-#: src/merge_conflict.cc:2433
+#: src/merge_conflict.cc:3227
 #, c-format
 msgid "no resolution provided for duplicate_name '%s'"
 msgstr "keine Lösung für doppelten Namenskonflikt '%s' angegeben"
 
-#: src/merge_conflict.cc:2438
+#: src/merge_conflict.cc:3327
 #, c-format
-msgid "invalid resolution for duplicate_name '%s'"
-msgstr "ungültige Lösung für doppelten Namenskonflikt '%s'"
-
-#: src/merge_conflict.cc:2538
-#, c-format
 msgid "merge of '%s', '%s' failed"
 msgstr "Vereinigung von '%s', '%s' schlug fehl"
 
-#: src/merge_conflict.cc:2540
+#: src/merge_conflict.cc:3329
 #, c-format
 msgid "merged '%s', '%s'"
 msgstr "vereinigt '%s', '%s'"
 
-#: src/merge_conflict.cc:2549
+#: src/merge_conflict.cc:3338
 #, c-format
 msgid "replacing content of '%s', '%s' with '%s'"
 msgstr "ersetze Inhalt von '%s', '%s' mit '%s'"
 
-#: src/merge_content.cc:271
+#: src/merge_content.cc:330
 #, c-format
 msgid "file '%s' does not exist in workspace"
 msgstr "Datei '%s' existiert nicht im Arbeitsbereich"
 
-#: src/merge_content.cc:272
+#: src/merge_content.cc:331
 #, c-format
 msgid "'%s' in workspace is a directory, not a file"
 msgstr "'%s' im Arbeitsbereich ist ein Verzeichnis, keine Datei"
 
-#: src/merge_content.cc:276
+#: src/merge_content.cc:335
 #, c-format
 msgid "file '%s' in workspace has id %s, wanted %s"
 msgstr "Datei '%s' im Arbeitsbereich hat die ID %s, erwartete %s"
 
-#: src/merge_content.cc:533
+#: src/merge_content.cc:606
 #, c-format
 msgid ""
 "help required for 3-way merge\n"
@@ -7464,19 +7658,19 @@ msgstr ""
 "[   rechts] %s\n"
 "[vereinigt] %s"
 
-#: src/merge_content.cc:703
+#: src/merge_content.cc:785
 #, c-format
 msgid "%d content conflict requires user intervention"
 msgid_plural "%d content conflicts require user intervention"
 msgstr[0] "%d Inhaltskonflikt erfordert einen Benutzereingriff"
 msgstr[1] "%d Inhaltskonflikte erfordern einen Benutzereingriff"
 
-#: src/merge_content.cc:719
+#: src/merge_content.cc:801
 #, c-format
 msgid "can't spawn external merger when non-interactive"
 msgstr "kann externes Merge-Werkzeug im nicht-interaktiven Modus nicht starten"
 
-#: src/merge_content.cc:729
+#: src/merge_content.cc:811
 #, c-format
 msgid "merge failed due to unresolved conflicts"
 msgstr "Vereinigung schlug wegen nicht aufgelösten Konflikten fehl"
@@ -7493,7 +7687,7 @@ msgstr "kann Host-Bestandteil der URI '%
 
 #: src/uri.cc:150 src/uri.cc:153 src/uri.cc:175 src/uri.cc:196
 #, c-format
-msgid "Bad URLencoded string '%s'"
+msgid "bad URLencoded string '%s'"
 msgstr "Falsch URL-kodierte Zeichenfolge '%s'"
 
 #: src/sha1.cc:34
@@ -7505,54 +7699,54 @@ msgstr "Bewerte Botans SHA-1-Kern"
 msgid "Benchmarking botan's SHA-1 core"
 msgstr "Bewerte Botans SHA-1-Kern"
 
-#: src/sha1.cc:61
+#: src/sha1.cc:64
 #, c-format
 msgid "SHA-1 provider '%s': %s MiB/s"
 msgstr "SHA-1 Anbieter '%s': %s MiB/s"
 
-#: src/sha1.cc:73
+#: src/sha1.cc:76
 #, c-format
 msgid "%s MiB/s"
 msgstr "%s MiB/s"
 
-#: src/pcrewrap.cc:219
+#: src/pcrewrap.cc:273
 #, c-format
 msgid "while compiling regex '%s': %s"
 msgstr "Fehler während der Übersetzung des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:228
+#: src/pcrewrap.cc:282
 #, c-format
 msgid "error in regex '%s': %s"
 msgstr "Fehler im regulären Ausdruck '%s': %s"
 
-#: src/pcrewrap.cc:230
+#: src/pcrewrap.cc:284
 #, c-format
 msgid "error near char %d of regex '%s': %s"
 msgstr "Fehler in der Nähe des Zeichens %d des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:245
+#: src/pcrewrap.cc:299
 #, c-format
 msgid "while studying regex '%s': %s"
 msgstr "Fehler während der Untersuchung des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:263
+#: src/pcrewrap.cc:317
 #, c-format
 msgid "backtrack limit exceeded in regular _expression_ matching"
 msgstr "Backtrack-Grenze im regulären Ausdruck überschritten"
 
-#: src/pcrewrap.cc:267
+#: src/pcrewrap.cc:321
 #, c-format
 msgid "recursion limit exceeded in regular _expression_ matching"
 msgstr "Rekursions-Grenze im regulären Ausdruck überschritten"
 
-#: src/pcrewrap.cc:272
+#: src/pcrewrap.cc:326
 #, c-format
 msgid "invalid UTF-8 sequence found during regular _expression_ matching"
 msgstr ""
 "ungültige UTF-8-Sequenz während der Anwendung des regulären Ausdrucks "
 "gefunden"
 
-#: src/pcrewrap.cc:275
+#: src/pcrewrap.cc:329
 #, c-format
 msgid "pcre_exec returned %d"
 msgstr "pcre_exec gab %d zurück"
@@ -7569,30 +7763,34 @@ msgstr "Marke:      "
 msgid "Tag:      "
 msgstr "Marke:      "
 
-#: src/rev_output.cc:106
+#: src/rev_output.cc:110
+msgid "Other certs:"
+msgstr "Andere Zertifikate:"
+
+#: src/rev_output.cc:123
 msgid "Changelog: "
 msgstr "Änderungen: "
 
-#: src/rev_output.cc:114
+#: src/rev_output.cc:131
 msgid "Comments: "
 msgstr "Kommentare: "
 
-#: src/rev_output.cc:141
+#: src/rev_output.cc:158
 msgid "Changes"
 msgstr "Änderungen"
 
-#: src/rev_output.cc:143
+#: src/rev_output.cc:160
 msgid "Changes against parent "
 msgstr "Veränderungen ggü. Elternrev. "
 
-#: src/rev_output.cc:151
+#: src/rev_output.cc:168
 #, c-format
 msgid "  dropped  %s"
 msgstr ""
 "       Pfad  %s\n"
 "   entfernt"
 
-#: src/rev_output.cc:156
+#: src/rev_output.cc:173
 #, c-format
 msgid ""
 "  renamed  %s\n"
@@ -7602,21 +7800,21 @@ msgstr ""
 "       nach  %s\n"
 "  umbenannt"
 
-#: src/rev_output.cc:161 src/rev_output.cc:165
+#: src/rev_output.cc:178 src/rev_output.cc:182
 #, c-format
 msgid "  added    %s"
 msgstr ""
 "       Pfad  %s\n"
 "hinzugefügt"
 
-#: src/rev_output.cc:169
+#: src/rev_output.cc:186
 #, c-format
 msgid "  patched  %s"
 msgstr ""
 "      Datei  %s\n"
 "  verändert"
 
-#: src/rev_output.cc:173
+#: src/rev_output.cc:190
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -7628,7 +7826,7 @@ msgstr ""
 "        auf  %1$s\n"
 "    gesetzt"
 
-#: src/rev_output.cc:186
+#: src/rev_output.cc:203
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -8316,87 +8514,97 @@ msgstr "Fehler beim Schließen der Datei
 msgid "error closing file '%s': %s"
 msgstr "Fehler beim Schließen der Datei '%s': %s"
 
-#: src/unix/fs.cc:49 src/win32/fs.cc:26
+#: src/unix/fs.cc:52 src/win32/fs.cc:26
 #, c-format
 msgid "cannot get working directory: %s"
 msgstr "kann Arbeitsverzeichnis nicht ermitteln: %s"
 
-#: src/unix/fs.cc:61 src/win32/fs.cc:42
+#: src/unix/fs.cc:64 src/win32/fs.cc:42
 #, c-format
 msgid "cannot change to directory '%s': %s"
 msgstr "kann nicht in Verzeichnis '%s' wechseln: %s"
 
-#: src/unix/fs.cc:83
+#: src/unix/fs.cc:86
 #, c-format
 msgid "could not find home directory for uid %d"
 msgstr "konnte Heimatverzeichnis für UID %d nicht finden"
 
-#: src/unix/fs.cc:116
+#: src/unix/fs.cc:119
 #, c-format
 msgid "could not find home directory for user '%s'"
 msgstr "konnte Heimatverzeichnis von Benutzer '%s' nicht finden"
 
-#: src/unix/fs.cc:134
+#: src/unix/fs.cc:137
 #, c-format
 msgid "error accessing file '%s': %s"
 msgstr "Fehler beim Zugriff auf die Datei '%s': %s"
 
-#: src/unix/fs.cc:143
+#: src/unix/fs.cc:146
 #, c-format
 msgid "cannot handle special file '%s'"
 msgstr "kann nicht mit spezieller Datei '%s' umgehen"
 
-#: src/unix/fs.cc:159 src/win32/fs.cc:172
+#: src/unix/fs.cc:162 src/win32/fs.cc:172
 #, c-format
 msgid "could not open directory '%s': %s"
 msgstr "konnte Verzeichnis '%s' nicht öffnen: %s"
 
-#: src/unix/fs.cc:250
+#: src/unix/fs.cc:253
 #, c-format
 msgid "error accessing '%s/%s': %s"
 msgstr "Fehler beim Zugriff auf '%s/%s': %s"
 
-#: src/unix/fs.cc:272
+#: src/unix/fs.cc:275
 #, c-format
 msgid "stat(%s) failed: %s"
 msgstr "stat(%s) schlug fehl: %s"
 
-#: src/unix/fs.cc:284
+#: src/unix/fs.cc:287
 #, c-format
 msgid "chmod(%s) failed: %s"
 msgstr "chmod(%s) schlug fehl: %s"
 
-#: src/unix/fs.cc:295
+#: src/unix/fs.cc:330
 #, c-format
+msgid "error reading file '%s': %s"
+msgstr "Fehler beim Lesen der Datei '%s': %s"
+
+#: src/unix/fs.cc:345
+#, c-format
+msgid "error writing file '%s': %s"
+msgstr "Fehler beim Schreiben der Datei '%s': %s"
+
+#: src/unix/fs.cc:360
+#, c-format
 msgid "renaming '%s' to '%s' failed: %s"
 msgstr "Umbenennung von '%s' nach '%s' schlug fehl: %s"
 
-#: src/unix/fs.cc:308 src/unix/fs.cc:363 src/win32/fs.cc:248
+#: src/unix/fs.cc:374 src/unix/fs.cc:429 src/win32/fs.cc:248
 #, c-format
 msgid "could not remove '%s': %s"
 msgstr "konnte '%s' nicht entfernen: %s"
 
-#: src/unix/fs.cc:390 src/win32/fs.cc:303
+#: src/unix/fs.cc:456 src/win32/fs.cc:310
 #, c-format
 msgid "could not create directory '%s': %s"
 msgstr "konnte Verzeichnis '%s' nicht erstellen: %s"
 
-#: src/unix/fs.cc:456 src/win32/fs.cc:451
+#: src/unix/fs.cc:522 src/win32/fs.cc:458
 #, c-format
 msgid "cannot create temp file '%s': %s"
 msgstr "Kann temporäre Datei '%s' nicht anlegen: %s"
 
-#: src/unix/fs.cc:466
+#: src/unix/fs.cc:532
 #, c-format
 msgid "all %d possible temporary file names are in use"
 msgstr "alle %d möglichen, temporären Dateinamen sind in Benutzung"
 
-#: src/unix/fs.cc:507 src/win32/fs.cc:512
+#: src/unix/fs.cc:573 src/win32/fs.cc:519
 #, c-format
 msgid "error writing to temp file '%s': %s"
 msgstr "Fehler beim Schreiben zur temporären Datei '%s': %s"
 
-#: src/unix/fs.cc:512 src/win32/fs.cc:519
+#: src/unix/fs.cc:578 src/win32/fs.cc:526
 #, c-format
 msgid ""
 "giving up after four zero-length writes to '%s' (%d byte written, %d left)"
@@ -8497,41 +8705,41 @@ msgstr "Fehler beim Lesen des Verzeichni
 msgid "error while reading directory: %s"
 msgstr "Fehler beim Lesen des Verzeichnisses: %s"
 
-#: src/win32/fs.cc:291
+#: src/win32/fs.cc:298
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation error code 0x%x"
 msgstr ""
 "konnte '%s' und dessen Inhalte nicht entfernen: SHFileOperation Fehlercode 0x"
 "%x"
 
-#: src/win32/fs.cc:294
+#: src/win32/fs.cc:301
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation partially aborted"
 msgstr ""
 "konnte '%s' und dessen Inhalte nicht entfernen: SHFileOperation wurde "
 "teilweise abgebrochen"
 
-#: src/win32/fs.cc:359
+#: src/win32/fs.cc:366
 #, c-format
 msgid "GetFileAttributes(%s) failed: %s"
 msgstr "GetFileAttributes(%s) schlug fehl: %s"
 
-#: src/win32/fs.cc:364
+#: src/win32/fs.cc:371
 #, c-format
 msgid "SetFileAttributes(%s) failed: %s"
 msgstr "SetFileAttributes(%s) schlug fehl: %s"
 
-#: src/win32/fs.cc:390
+#: src/win32/fs.cc:397
 #, c-format
 msgid "renaming '%s' to '%s' failed: %s (%d)"
 msgstr "Umbenennung von '%s' nach '%s' schlug fehl: %s (%d)"
 
-#: src/win32/fs.cc:459
+#: src/win32/fs.cc:466
 #, c-format
 msgid "cannot find a temporary file (tried %d possibilities)"
 msgstr "kann keine temporäre Datei finden (versuchte %d Möglichkeiten)"
 
-#: src/win32/fs.cc:486
+#: src/win32/fs.cc:493
 #, c-format
 msgid "'%s' will be accessible to all users of this computer\n"
 msgstr "'%s' wird für alle Benutzer dieses Computers zugänglich sein\n"
@@ -8566,43 +8774,65 @@ msgid "this monotone binary requires at 
 #: src/monotone.cc:143
 #, c-format
 msgid "this monotone binary requires at least SQLite 3.3.8 to run"
-msgstr "dieses monotone benötigt mindestens SQLite 3.3.8, um ausgeführt zu werden"
+msgstr ""
+"dieses monotone benötigt mindestens SQLite 3.3.8, um ausgeführt zu werden"
 
 #: src/monotone.cc:146
 #, c-format
 msgid "this monotone binary requires at least SQLite 3.3.14 to run"
-msgstr "dieses monotone benötigt mindestens SQLite 3.3.14, um ausgeführt zu werden"
+msgstr ""
+"dieses monotone benötigt mindestens SQLite 3.3.14, um ausgeführt zu werden"
 
 #: src/monotone.cc:157
 #, c-format
 msgid "monotone does not support Botan 1.7.14"
 msgstr "monotone unterstüzt Botan 1.7.14 nicht"
 
-#: src/monotone.cc:161
+#: src/monotone.cc:163
 #, c-format
+msgid "monotone does not support Botan 1.9.9"
+msgstr "monotone unterstüzt Botan 1.9.9 nicht"
+
+#: src/monotone.cc:168
+#, c-format
 msgid "this monotone binary requires Botan 1.6.3 or newer"
 msgstr "dieses monotone benötigt Botan 1.6.3 oder neuer"
 
-#: src/monotone.cc:163
+#: src/monotone.cc:170
 #, c-format
-msgid "this monotone binary does not work with Botan newer than 1.7.6"
-msgstr "dieses monotone arbeitet nicht mit Botan >1.7.6 zusammen"
+msgid "this monotone binary does not work with Botan 1.7.7 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.7.7 oder neuer zusammen"
 
-#: src/monotone.cc:166
+#: src/monotone.cc:175
 #, c-format
 msgid "this monotone binary requires Botan 1.7.7 or newer"
 msgstr "dieses monotone benötigt Botan 1.7.7 oder neuer"
 
-#: src/monotone.cc:172 src/monotone.cc:177
+#: src/monotone.cc:182 src/monotone.cc:189
 #, c-format
-msgid "this monotone binary does not work with Botan 1.9.x"
-msgstr "dieses monotone arbeitet nicht mit Botan 1.9.x zusammen"
+msgid "this monotone binary does not work with Botan 1.9.4 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.9.4 oder neuer zusammen"
 
-#: src/monotone.cc:175
+#: src/monotone.cc:187
 #, c-format
 msgid "this monotone binary requires Botan 1.7.22 or newer"
 msgstr "dieses monotone benötigt Botan 1.7.22 oder neuer"
 
+#: src/monotone.cc:195
+#, c-format
+msgid "this monotone binary requires Botan 1.9.4 or newer"
+msgstr "dieses monotone benötigt Botan 1.9.4 oder neuer"
+
+#: src/monotone.cc:197
+#, c-format
+msgid "this monotone binary does not work with Botan 1.9.11 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.9.11 oder neuer zusammen"
+
+#: src/monotone.cc:202
+#, c-format
+msgid "this monotone binary requires Botan 1.9.11 or newer"
+msgstr "dieses monotone benötigt Botan 1.9.11 oder neuer"
+
 #: src/std_hooks.lua:56
 msgid "Press enter"
 msgstr "Drücken Sie die Eingabetaste"
@@ -8611,6 +8841,31 @@ msgstr "Drücken Sie die Eingabetaste, w
 msgid "Press enter when the subprocess has completed"
 msgstr "Drücken Sie die Eingabetaste, wenn der Unterprozess beendet ist"
 
+#~ msgid ""
+#~ "non-recursive add: Files in the directory '%s' will not be added "
+#~ "automatically."
+#~ msgstr ""
+#~ "nicht-rekursives Hinzufügen: Dateien im Verzeichnis '%s' werden nicht "
+#~ "automatisch hinzugefügt."
+
+#~ msgid ""
+#~ "content changes to the file '%s'\n"
+#~ "will be ignored during this merge as the file has been\n"
+#~ "removed on one side of the merge.  Affected revisions include:"
+#~ msgstr ""
+#~ "Inhaltsänderungen in der Datei '%s'\n"
+#~ "werden bei dieser Vereinigung ignoriert, da die Datei\n"
+#~ "auf einer Seite der Vereinigung gelöscht wurde. Betroffene Revisionen:"
+
+#~ msgid "Revision: %s"
+#~ msgstr "Revision: %s"
+
+#~ msgid "invalid resolution for duplicate_name '%s'"
+#~ msgstr "ungültige Lösung für doppelten Namenskonflikt '%s'"
+
+#~ msgid "this monotone binary does not work with Botan newer than 1.7.6"
+#~ msgstr "dieses monotone arbeitet nicht mit Botan >1.7.6 zusammen"
+
 #~ msgid "Network error: %s"
 #~ msgstr "Netzwerk-Fehler: %s"
 
============================================================
--- po/fr.po	60820cde761ddab3a09f857d1615e082aa4c53c2
+++ po/fr.po	25ee46a98124152467c17aa6ea47f3e83aaac819
@@ -7,8 +7,8 @@ msgstr ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-14 08:25+0100\n"
-"PO-Revision-Date: 2011-03-19 13:08+0100\n"
+"POT-Creation-Date: 2011-03-27 20:20+0200\n"
+"PO-Revision-Date: 2011-03-27 20:21+0200\n"
 "Last-Translator: tommyd <address@hidden>\n"
 "Language-Team: Benoît Dejean <address@hidden>\n"
 "Language: fr\n"
@@ -84,13 +84,13 @@ msgstr "caractère invalide « %c » d
 
 #: src/vocab.cc:109
 #, c-format
-msgid "Invalid key length of %d bytes"
-msgstr "Longueur de clef invalide de %d octets"
+msgid "invalid key length of %d bytes"
+msgstr "longueur de clef invalide de %d octets"
 
 #: src/vocab.cc:123
 #, c-format
-msgid "Invalid hmac length of %d bytes"
-msgstr "Longueur HMAC invalide de %d octets"
+msgid "invalid hmac length of %d bytes"
+msgstr "longueur HMAC invalide de %d octets"
 
 #: src/charset.cc:72
 #, c-format
@@ -115,22 +115,22 @@ msgid "path '%s' is in bookkeeping dir"
 #: src/paths.cc:446 src/paths.cc:466
 #, c-format
 msgid "path '%s' is in bookkeeping dir"
-msgstr "Le chemin « %s » est dans le répertoire administratif"
+msgstr "le chemin « %s » est dans le répertoire administratif"
 
 #: src/paths.cc:460
 #, c-format
-msgid "Invalid utf8"
-msgstr "Encodage UTF8 invalide"
+msgid "invalid utf8"
+msgstr "encodage UTF8 invalide"
 
 #: src/paths.cc:484
 #, c-format
-msgid "Path is not normalized"
+msgid "path is not normalized"
 msgstr "le chemin n'est pas en forme normalisée"
 
 #: src/paths.cc:486
 #, c-format
-msgid "Bookkeeping path is not in bookkeeping dir"
-msgstr "Le chemin administratif n'est pas dans le répertoire administratif"
+msgid "bookkeeping path is not in bookkeeping directory"
+msgstr "le chemin administratif n'est pas dans le répertoire administratif"
 
 #: src/paths.cc:827
 #, c-format
@@ -140,12 +140,12 @@ msgid "skipping directory '%s' with unsu
 #: src/paths.cc:910
 #, c-format
 msgid "skipping directory '%s' with unsupported name"
-msgstr "Omission du répertoire « %s » ayant un nom non-géré"
+msgstr "omission du répertoire « %s » ayant un nom non-géré"
 
 #: src/paths.cc:912
 #, c-format
 msgid "skipping file '%s' with unsupported name"
-msgstr "Omission du fichier « %s » ayant un nom non-géré"
+msgstr "omission du fichier « %s » ayant un nom non-géré"
 
 #: src/paths.cc:930
 #, c-format
@@ -174,7 +174,7 @@ msgstr "%s a été appelé avec un param
 
 #: src/lua.cc:592
 #, c-format
-msgid "Directory '%s' does not exist"
+msgid "directory '%s' does not exist"
 msgstr "le répertoire « %s » n'existe pas"
 
 #: src/lua.cc:594 src/cmd_othervcs.cc:61 src/work.cc:2140
@@ -279,8 +279,8 @@ msgstr "impossible d'ouvrir le fichier Â
 
 #: src/file_io.cc:303
 #, c-format
-msgid "Cannot read standard input multiple times"
-msgstr "Impossible de lire l'entrée standard plusieurs fois"
+msgid "cannot read standard input multiple times"
+msgstr "impossible de lire l'entrée standard plusieurs fois"
 
 #: src/file_io.cc:334
 #, c-format
@@ -446,7 +446,7 @@ msgid "C++ exception of unknown type"
 
 #: src/ui.cc:759
 msgid "C++ exception of unknown type"
-msgstr "Exception C++ de type inconnu"
+msgstr "exception C++ de type inconnu"
 
 #: src/ui.cc:843
 #, c-format
@@ -487,31 +487,31 @@ msgstr "en-tête distant : « %s »"
 
 #: src/automate_reader.cc:46
 #, c-format
-msgid "Bad input to automate stdio: expected ':' after string size"
+msgid "bad input to automate stdio: expected ':' after string size"
 msgstr ""
-"Donnée invalide pour automate stdio : « : » est attendu après la longueur de "
+"donnée invalide pour automate stdio : « : » est attendu après la longueur de "
 "la chaîne de caractères"
 
 #: src/automate_reader.cc:66
 #, c-format
-msgid "Bad input to automate stdio: unexpected EOF"
-msgstr "Donnée invalide pour automate stdio : EOF inattendue"
+msgid "bad input to automate stdio: unexpected EOF"
+msgstr "donnée invalide pour automate stdio : EOF inattendue"
 
 #: src/automate_reader.cc:94
 #, c-format
-msgid "Bad input to automate stdio: unknown start token '%c'"
+msgid "bad input to automate stdio: unknown start token '%c'"
 msgstr ""
-"Donnée invalide pour automate stdio : le lexème de départ « %c » est inconnu"
+"donnée invalide pour automate stdio : le lexème de départ « %c » est inconnu"
 
 #: src/automate_reader.cc:116
 #, c-format
-msgid "Bad input to automate stdio: expected '%c' token"
-msgstr "Donnée invalide pour automate stdio : lexème « %c » attendu"
+msgid "bad input to automate stdio: expected '%c' token"
+msgstr "donnée invalide pour automate stdio : lexème « %c » attendu"
 
 #: src/automate_reader.cc:123
 #, c-format
-msgid "Bad input to automate stdio: command name is missing"
-msgstr "Donnée invalide pour automate stdio : nom de commande manquant"
+msgid "bad input to automate stdio: command name is missing"
+msgstr "donnée invalide pour automate stdio : nom de commande manquant"
 
 #: src/commands.cc:496
 #, c-format
@@ -664,9 +664,9 @@ msgstr ""
 
 #: src/cmd.cc:459
 #, c-format
-msgid "Call to user command '%s' (lua command: '%s') failed."
+msgid "call to user command '%s' (lua command: '%s') failed."
 msgstr ""
-"L'appel à la commande utilisateur « %s » (commande lua : « %s ») a échoué."
+"l'appel à la commande utilisateur « %s » (commande lua : « %s ») a échoué."
 
 #: src/cmd.cc:470 src/cmd.cc:494
 #, c-format
@@ -795,7 +795,10 @@ msgid ""
 "monotone was written originally by Graydon Hoare <address@hidden> in 2003 "
 "and has since then received numerous contributions from many individuals. A "
 "complete list of authors can be found in AUTHORS."
-msgstr "monotone est originellement écrit par Graydon Hoare <address@hidden> en 2003, et a depuis reçu des contributions nombreuses par un grand nombre d'individus.  La liste complète des auteurs se trouve dans AUTHORS."
+msgstr ""
+"monotone est originellement écrit par Graydon Hoare <address@hidden> en "
+"2003, et a depuis reçu des contributions nombreuses par un grand nombre "
+"d'individus.  La liste complète des auteurs se trouve dans AUTHORS."
 
 #: src/cmd.cc:954
 msgid ""
@@ -814,7 +817,9 @@ msgid ""
 msgid ""
 "monotone and this man page is Copyright (c) 2003 \\- %s by the monotone "
 "development team."
-msgstr "monotone et cette page de manuel sont protégés par copyright (c) 2003 \\- %s, détenu par le groupe de dévelopement de monotone"
+msgstr ""
+"monotone et cette page de manuel sont protégés par copyright (c) 2003 \\- "
+"%s, détenu par le groupe de dévelopement de monotone"
 
 #: src/cmd.cc:970
 #, c-format
@@ -853,11 +858,11 @@ msgid ""
 #: src/cmd_netsync.cc:122 src/cmd_netsync.cc:225
 #, c-format
 msgid ""
-"No database given; assuming '%s' database. This means that\n"
+"no database given; assuming '%s' database. This means that\n"
 "we can't verify the server key, because we have no record of\n"
 "what it should be."
 msgstr ""
-"Aucune base de données spécifiée; la base de données '%s' sera\n"
+"aucune base de données spécifiée; la base de données '%s' sera\n"
 "employée.  Comme conséquence, la clef du serveur ne pourra pas être\n"
 "vérfié, car elle n'a pas encore été notée."
 
@@ -892,7 +897,7 @@ msgid "received remote error code %d"
 #: src/cmd_netsync.cc:280
 #, c-format
 msgid "received remote error code %d"
-msgstr "Reçu le code d'erreur du réseau distant : %d"
+msgstr "reçu le code d'erreur du réseau distant : %d"
 
 #: src/cmd_netsync.cc:293
 #, c-format
@@ -1198,7 +1203,8 @@ msgid "Lists known workspaces of a speci
 
 #: src/cmd_list.cc:667
 msgid "Lists known workspaces of a specified database"
-msgstr "Liste tout les éspaces de travail connu pour une base de données spécifié"
+msgstr ""
+"Liste tout les éspaces de travail connu pour une base de données spécifié"
 
 #: src/cmd_list.cc:677
 msgid "Lists managed databases and their known workspaces"
@@ -1207,7 +1213,8 @@ msgid "no default database location conf
 #: src/cmd_list.cc:684 src/database.cc:4978
 #, c-format
 msgid "no default database location configured"
-msgstr "les location par default pour des bases de données ne sont pas configurés"
+msgstr ""
+"les location par default pour des bases de données ne sont pas configurés"
 
 #: src/cmd_list.cc:688 src/database.cc:5056
 #, c-format
@@ -1232,11 +1239,15 @@ msgid "Lists workspace files that are un
 
 #: src/cmd_list.cc:805
 msgid "Lists workspace files that are unknown in the current branch"
-msgstr "Liste les fichiers de l'espace de travail qui ne sont pas connus à la branch actuelle"
+msgstr ""
+"Liste les fichiers de l'espace de travail qui ne sont pas connus à la branch "
+"actuelle"
 
 #: src/cmd_list.cc:817
 msgid "Lists workspace files that are ignored in the current branch"
-msgstr "Liste les fichiers de l'espace de travail qui sont ignorés dans la branch actuelle"
+msgstr ""
+"Liste les fichiers de l'espace de travail qui sont ignorés dans la branch "
+"actuelle"
 
 #: src/cmd_list.cc:829
 msgid "Lists files that belong to the branch but are not in the workspace"
@@ -1486,7 +1497,8 @@ msgid "need '--branch' argument for appr
 #: src/cmd_key_cert.cc:414
 #, c-format
 msgid "need '--branch' argument for approval"
-msgstr "un argument à l'option « --branch » est requis pour la commande approve"
+msgstr ""
+"un argument à l'option « --branch » est requis pour la commande approve"
 
 #: src/cmd_key_cert.cc:423
 msgid "Suspends a particular revision"
@@ -1549,8 +1561,8 @@ msgstr ""
 "target revision not in any branch.\n"
 "Next commit will use branch '%s'"
 msgstr ""
-"la révision cible n'est dans aucune branche\n"
-"le prochain commit utilisera la branche « %s »"
+"la révision cible n'est dans aucune branche.\n"
+"Le prochain commit utilisera la branche « %s »"
 
 #: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
 #: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
@@ -1648,7 +1660,7 @@ msgid "at most one revision selector may
 #: src/cmd_merging.cc:387
 #, c-format
 msgid "at most one revision selector may be specified"
-msgstr "Vous ne pouvez spécifier qu'au plus un sélecteur de révision"
+msgstr "vous ne pouvez spécifier qu'au plus un sélecteur de révision"
 
 #: src/cmd_merging.cc:452 src/cmd_merging.cc:763
 #, c-format
@@ -1869,7 +1881,7 @@ msgstr ""
 #, c-format
 msgid "branch '%s' has only 1 head; must be at least 2 for conflicts"
 msgstr ""
-"La branche « %s » n'a qu'une tête, il en faut au moins deux pour les "
+"la branche « %s » n'a qu'une tête, il en faut au moins deux pour les "
 "conflits."
 
 #: src/cmd_merging.cc:1161
@@ -1899,7 +1911,10 @@ msgid ""
 "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
 "two heads that would be chosen by the 'merge' command. If '--conflicts-file' "
 "is not given, '%s' is used."
-msgstr "Si aucun argument n'est donné, GAUCHE_REVID et DROITE_REVID prennent par défaut les deux premières têtes qui seraient choisies par la commande « merge ». Si « --conflicts-file » n'est pas donné, « %s » est utilisé."
+msgstr ""
+"Si aucun argument n'est donné, GAUCHE_REVID et DROITE_REVID prennent par "
+"défaut les deux premières têtes qui seraient choisies par la commande "
+"« merge ». Si « --conflicts-file » n'est pas donné, « %s » est utilisé."
 
 #: src/cmd_merging.cc:1190 src/options_list.hh:603 src/options_list.hh:624
 #, c-format
@@ -2270,7 +2285,7 @@ msgstr ""
 
 #: src/cmd_db.cc:464 src/cmd_db.cc:486
 #, c-format
-msgid "No workspace given"
+msgid "no workspace given"
 msgstr "aucun espace de travail fourni"
 
 #: src/cmd_db.cc:478
@@ -2326,8 +2341,8 @@ msgstr "altitude dans le cache : %s"
 msgstr "altitude dans le cache : %s"
 
 #: src/cmd_db.cc:630
-msgid "load all revisions from the database"
-msgstr "charge le contenu de toutes les révisions de la base de données"
+msgid "Load all revisions from the database"
+msgstr "Charge le contenu de toutes les révisions de la base de données"
 
 #: src/cmd_db.cc:631
 msgid ""
@@ -2348,8 +2363,8 @@ msgstr "révisions"
 msgstr "révisions"
 
 #: src/cmd_db.cc:659
-msgid "load all roster versions from the database"
-msgstr "charge toutes les versions « roster » de la base de données"
+msgid "Load all roster versions from the database"
+msgstr "Charge toutes les versions « roster » de la base de données"
 
 #: src/cmd_db.cc:660
 msgid ""
@@ -2369,8 +2384,8 @@ msgstr "listes"
 msgstr "listes"
 
 #: src/cmd_db.cc:687
-msgid "load all file versions from the database"
-msgstr "charge toutes les versions des fichiers depuis la base de données"
+msgid "Load all file versions from the database"
+msgstr "Charge toutes les versions des fichiers depuis la base de données"
 
 #: src/cmd_db.cc:688
 msgid ""
@@ -2391,7 +2406,7 @@ msgstr "fichiers"
 msgstr "fichiers"
 
 #: src/cmd_db.cc:713
-msgid "load all certs from the database"
+msgid "Load all certs from the database"
 msgstr "Charge tous les certificats depuis la base de données"
 
 #: src/cmd_db.cc:714
@@ -2490,13 +2505,17 @@ msgid "workspace has no parent revision,
 #: src/cmd_diff_log.cc:669
 #, c-format
 msgid "workspace has no parent revision, probably an empty branch"
-msgstr "l'espace de travail n'a pas de révision parent, il s'agit probablement d'une branche vide"
+msgstr ""
+"l'espace de travail n'a pas de révision parent, il s'agit probablement d'une "
+"branche vide"
 
 #: src/cmd_diff_log.cc:672
 #, c-format
 msgid ""
 "workspace parent revision %s not found - did you specify a wrong database?"
-msgstr "la révision parent de l'espace de travail %s est manquante. Est-ce la bonne base de données ?"
+msgstr ""
+"la révision parent de l'espace de travail %s est manquante. Est-ce la bonne "
+"base de données ?"
 
 #: src/cmd_diff_log.cc:958
 #, c-format
@@ -2530,7 +2549,8 @@ msgstr ""
 "This file must be removed before commit will proceed.\n"
 "You may recover the previous message from this file if necessary."
 msgstr ""
-"une sauvegarde provenant d'un changement échoué existe dans « _MTN/commit ».\n"
+"une sauvegarde provenant d'un changement échoué existe dans « _MTN/"
+"commit ».\n"
 "Il faut supprimer ce fichier avant d'effectuer un nouveau changement.\n"
 "Vous pouvez récupérer le message précédent de ce fichier si nécessaire."
 
@@ -2652,7 +2672,8 @@ msgid "no file version %s found in datab
 #: src/cmd_ws_commit.cc:485
 #, c-format
 msgid "no file version %s found in database for '%s'"
-msgstr "aucune version de fichier %s trouvée dans la base de données pour « %s »"
+msgstr ""
+"aucune version de fichier %s trouvée dans la base de données pour « %s »"
 
 #: src/cmd_ws_commit.cc:499
 #, c-format
@@ -2706,7 +2727,9 @@ msgid "need '--branch' argument for disa
 #: src/cmd_ws_commit.cc:615 src/cmd_ws_commit.cc:655
 #, c-format
 msgid "need '--branch' argument for disapproval"
-msgstr "un argument à l'option « --branch » est requis pour la commande de désaprobation « mtn disapprove »"
+msgstr ""
+"un argument à l'option « --branch » est requis pour la commande de "
+"désaprobation « mtn disapprove »"
 
 #: src/cmd_ws_commit.cc:638
 #, c-format
@@ -2986,8 +3009,10 @@ msgstr ""
 "Perhaps move or delete '_MTN/log',\n"
 "or remove '--message'/'--message-file' from the command line?"
 msgstr ""
-"« _MTN/log » n'est pas vide et une entrée d'historique a été donnée sur la ligne de commande\n"
-"Veuillez déplacer ou supprimer « _MTN/log », ou enlever « --message »/« --message-file » de la ligne de commande."
+"« _MTN/log » n'est pas vide et une entrée d'historique a été donnée sur la "
+"ligne de commande\n"
+"Veuillez déplacer ou supprimer « _MTN/log », ou enlever « --message »/« --"
+"message-file » de la ligne de commande."
 
 #: src/cmd_ws_commit.cc:1615
 #, c-format
@@ -3060,7 +3085,9 @@ msgid ""
 #, c-format
 msgid ""
 "use '--revision' or '--branch' to specify the parent revision for the import"
-msgstr "utilisez « --revision » ou « --branch » pour préciser la révision parente pour l'import"
+msgstr ""
+"utilisez « --revision » ou « --branch » pour préciser la révision parente "
+"pour l'import"
 
 #: src/cmd_ws_commit.cc:1914
 #, c-format
@@ -3361,7 +3388,7 @@ msgid "Automates several commands in one
 
 #: src/cmd_automate.cc:230
 msgid "Automates several commands in one run"
-msgstr "automatise plusieurs commandes en une fois"
+msgstr "Automatise plusieurs commandes en une fois"
 
 #: src/cmd_automate.cc:305
 #, c-format
@@ -3822,7 +3849,9 @@ msgid "could not unregister workspace fr
 #: src/work.cc:669
 #, c-format
 msgid "could not unregister workspace from old database '%s'"
-msgstr "ne pouvait pas supprimer l'espace de travail de la vielle base de données « %s »"
+msgstr ""
+"ne pouvait pas supprimer l'espace de travail de la vielle base de données "
+"« %s »"
 
 #: src/work.cc:733
 #, c-format
@@ -3833,7 +3862,9 @@ msgid ""
 #, c-format
 msgid ""
 "cannot add '%s', because '%s' is recorded as a file in the workspace manifest"
-msgstr "impossible d'ajouter « %s », car « %s » est répertorié comme un fichier dans le manifeste de l'espace de travail"
+msgstr ""
+"impossible d'ajouter « %s », car « %s » est répertorié comme un fichier dans "
+"le manifeste de l'espace de travail"
 
 #: src/work.cc:1097
 #, c-format
@@ -3845,7 +3876,9 @@ msgid ""
 msgid ""
 "non-recursive add: Files in the directory '%s' will not be added "
 "automatically."
-msgstr "ajout non-récursif : les fichiers dans le répertoire « %s » ne seront pas ajoutés automatiquement."
+msgstr ""
+"ajout non-récursif : les fichiers dans le répertoire « %s » ne seront pas "
+"ajoutés automatiquement."
 
 #: src/work.cc:1187
 #, c-format
@@ -4023,7 +4056,8 @@ msgid "destination '%s' already exists i
 #: src/work.cc:2042
 #, c-format
 msgid "destination '%s' already exists in the workspace manifest"
-msgstr "la destination « %s » existe déjà dans le manifeste de l'espace de travail"
+msgstr ""
+"la destination « %s » existe déjà dans le manifeste de l'espace de travail"
 
 #: src/work.cc:2065
 #, c-format
@@ -4039,13 +4073,17 @@ msgid ""
 #, c-format
 msgid ""
 "destination '%s' already exists in workspace, skipping filesystem rename"
-msgstr "la destination « %s » existe déjà dans l'espace de travail, pas de modification du système de fichier"
+msgstr ""
+"la destination « %s » existe déjà dans l'espace de travail, pas de "
+"modification du système de fichier"
 
 #: src/work.cc:2099
 #, c-format
 msgid ""
 "'%s' doesn't exist in workspace and '%s' does, skipping filesystem rename"
-msgstr "« %s » n'existe pas dans l'espace de travail et « %s » existe, pas de modification du système de fichier"
+msgstr ""
+"« %s » n'existe pas dans l'espace de travail et « %s » existe, pas de "
+"modification du système de fichier"
 
 #: src/work.cc:2120
 #, c-format
@@ -4061,7 +4099,8 @@ msgid "proposed new root directory '%s' 
 #: src/work.cc:2126
 #, c-format
 msgid "proposed new root directory '%s' contains illegal path '%s'"
-msgstr "le nouveau dossier racine proposé « %s » contient le chemin illégal « %s »"
+msgstr ""
+"le nouveau dossier racine proposé « %s » contient le chemin illégal « %s »"
 
 #: src/work.cc:2136
 #, c-format
@@ -4087,7 +4126,9 @@ msgid ""
 msgid ""
 "re-run this command with '--move-conflicting-paths' to move conflicting "
 "paths out of the way"
-msgstr "exécutez à nouveau la commande avec l'option « --move-conflicting-paths » pour sortir des chemins conflictuels."
+msgstr ""
+"exécutez à nouveau la commande avec l'option « --move-conflicting-paths » "
+"pour sortir des chemins conflictuels."
 
 #: src/work.cc:2238
 #, c-format
@@ -4102,7 +4143,9 @@ msgid "'_MTN/format' should not exist in
 #: src/migrate_work.cc:84
 #, c-format
 msgid "'_MTN/format' should not exist in a format 1 workspace; corrected"
-msgstr "« _MTN/format » ne devrait pas exister dans un espace de travail au format 1 ; corrigé"
+msgstr ""
+"« _MTN/format » ne devrait pas exister dans un espace de travail au format "
+"1 ; corrigé"
 
 #: src/migrate_work.cc:125
 #, c-format
@@ -4193,17 +4236,17 @@ msgid "you have %d keys named '%s'"
 #: src/project.cc:542 src/project.cc:558
 #, c-format
 msgid "you have %d keys named '%s'"
-msgstr "Vous avez « %d » clefs nommées « %s »"
+msgstr "vous avez « %d » clefs nommées « %s »"
 
 #: src/project.cc:550
 #, c-format
 msgid "there are %d keys named '%s'"
-msgstr "Il y a « %d » clefs nommées « %s »"
+msgstr "il y a « %d » clefs nommées « %s »"
 
 #: src/project.cc:566
 #, c-format
 msgid "there is no key named '%s'"
-msgstr "Il n'y a pas de clef nommée « %s »"
+msgstr "il n'y a pas de clef nommée « %s »"
 
 #: src/project.cc:587
 #, c-format
@@ -4221,7 +4264,7 @@ msgstr ""
 "perhaps consider '%s merge'"
 msgstr ""
 "la branche « %s » possède plusieurs têtes\n"
-"Vous devriez peut-être lancer « %s merge »."
+"vous devriez peut-être lancer « %s merge »."
 
 #: src/project.cc:732
 #, c-format
@@ -4248,7 +4291,7 @@ msgid "initializing new database '%s'"
 #: src/database.cc:586
 #, c-format
 msgid "initializing new database '%s'"
-msgstr "Initialise une nouvelle base de données « %s »"
+msgstr "initialise une nouvelle base de données « %s »"
 
 #: src/database.cc:595
 #, c-format
@@ -4284,7 +4327,8 @@ msgstr ""
 msgstr ""
 "la base de données %s contient des manifestes mais aucune révision.\n"
 "C'est un base de données très ancienne ; elle a besoin d'être mise à jour.\n"
-"Veuillez lire les détails dans « http://wiki.monotone.ca/upgradefromchangesets/ »"
+"Veuillez lire les détails dans « http://wiki.monotone.ca/"
+"upgradefromchangesets/ »"
 
 #: src/database.cc:650
 #, c-format
@@ -4293,7 +4337,8 @@ msgstr ""
 "Run '%s db regenerate_caches' to restore use of this database"
 msgstr ""
 "le cache de la base de données « %s » manque de données\n"
-"Lancez « %s db regenerate_caches » pour pouvoir réutiliser cette base de données."
+"Lancez « %s db regenerate_caches » pour pouvoir réutiliser cette base de "
+"données."
 
 #: src/database.cc:953
 msgid "sqlite error: "
@@ -4502,10 +4547,10 @@ msgid ""
 #: src/database.cc:2530
 #, c-format
 msgid ""
-"Unknown delta direction '%s'; assuming 'reverse'. Valid values are "
+"unknown delta direction '%s'; assuming 'reverse'. Valid values are "
 "'reverse', 'forward', 'both'."
 msgstr ""
-"Direction de delta « %s » inconnue ; « reverse » supposée. Les valeurs "
+"direction de delta « %s » inconnue ; « reverse » supposée. Les valeurs "
 "valides sont « reverse », « forward » et « both »."
 
 #: src/database.cc:2863
@@ -4546,13 +4591,13 @@ msgstr "la révision contient un identif
 
 #: src/database.cc:3489
 #, c-format
-msgid "Failed to get RSA verifying key for %s"
-msgstr "Échec de l'obtention de la clef de vérification RSA pour %s"
+msgid "failed to get RSA verifying key for %s"
+msgstr "échec d'obtenir la clef de vérification RSA pour %s"
 
 #: src/database.cc:3628
 #, c-format
-msgid "Your database contains multiple keys named '%s'"
-msgstr "Votre base de données contient de multiples clefs nommées « %s »"
+msgid "your database contains multiple keys named '%s'"
+msgstr "votre base de données contient de multiples clefs nommées « %s »"
 
 #: src/database.cc:3789
 #, c-format
@@ -4579,7 +4624,8 @@ msgstr ""
 msgstr ""
 "le nom de la branche\n"
 "  '%s'\n"
-"contient des méta-caractères (ou ou plusieurs de la liste « ?,;*%%+{}[]!^ ») ou\n"
+"contient des méta-caractères (ou ou plusieurs de la liste « ?,;*%%+{}[]!^ ») "
+"ou\n"
 "débute par un tiret ce qui risque de causer des malfonctions lorsqu'utilisé\n"
 "dans un motif de branche netsync.\n"
 "\n"
@@ -4600,7 +4646,9 @@ msgid "trust function disliked %d signer
 #: src/database.cc:4125
 #, c-format
 msgid "trust function disliked %d signers of '%s' cert on revision %s"
-msgstr "la fonction de confiance n'a pas aimé %d signataires du certificat « %s » de la révision %s"
+msgstr ""
+"la fonction de confiance n'a pas aimé %d signataires du certificat « %s » de "
+"la révision %s"
 
 #: src/database.cc:4813 src/database.cc:4955
 #, c-format
@@ -4638,7 +4686,8 @@ msgstr ""
 "'%s'.\n"
 "Cancelling database creation"
 msgstr ""
-"le fichier journal « %s » (possiblement périmé) a la même ossature que la nouvelle base de données « %s »\n"
+"le fichier journal « %s » (possiblement périmé) a la même ossature que la "
+"nouvelle base de données « %s »\n"
 "Création de la base de données annulée"
 
 #: src/database.cc:5013
@@ -4688,7 +4737,9 @@ msgid "key store has multiple copies of 
 #: src/key_store.cc:160
 #, c-format
 msgid "key store has multiple copies of the key with id %s"
-msgstr "l'entrepôt de clefs contient plusieurs exemplaires de la clef ayant l'identitiant %s."
+msgstr ""
+"l'entrepôt de clefs contient plusieurs exemplaires de la clef ayant "
+"l'identitiant %s."
 
 #: src/key_store.cc:169
 #, c-format
@@ -4709,7 +4760,9 @@ msgid "expected key with id %s in key fi
 #: src/key_store.cc:442
 #, c-format
 msgid "expected key with id %s in key file '%s', got key with id %s"
-msgstr "attendu une clef avec id %s dans le fichier de clef « %s », reçu la clef d'id %s"
+msgstr ""
+"attendu une clef avec id %s dans le fichier de clef « %s », reçu la clef "
+"d'id %s"
 
 #: src/key_store.cc:508
 #, c-format
@@ -4748,14 +4801,14 @@ msgstr ""
 "failed to decrypt old private RSA key, probably incorrect passphrase or "
 "missing 'get_passphrase' lua hook"
 msgstr ""
-"Échec du déchiffrage de l'ancienne clef privée RSA, probablement dû à une "
+"échec du déchiffrage de l'ancienne clef privée RSA, probablement dû à une "
 "phrase de passe incorrecte ou à un crochet lua « get_passphrase » manquant."
 
 #: src/key_store.cc:633
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
 msgstr ""
-"Échec de l'extraction de la clef privée RSA depuis la paire de clefs PKCS#8."
+"échec de l'extraction de la clef privée RSA depuis la paire de clefs PKCS#8."
 
 #: src/key_store.cc:673
 #, c-format
@@ -4780,7 +4833,7 @@ msgid "key '%s' has hash '%s'"
 #: src/key_store.cc:762
 #, c-format
 msgid "key '%s' has hash '%s'"
-msgstr "La clef « %s » possède le hachage « %s »."
+msgstr "la clef « %s » possède le hachage « %s »."
 
 #: src/key_store.cc:776
 #, c-format
@@ -4790,14 +4843,16 @@ msgid "Botan error decrypting data: '%s'
 #: src/key_store.cc:828
 #, c-format
 msgid "Botan error decrypting data: '%s'"
-msgstr "Erreur de déchiffrage (avec Botan) de données : « %s »"
+msgstr "erreur de déchiffrage (avec Botan) de données : « %s »"
 
 #: src/key_store.cc:851
 #, c-format
 msgid ""
 "you have chosen to sign only with ssh-agent but ssh-agent does not seem to "
 "be running"
-msgstr "vous avez choisi de signer seulement avec ssh-agent mais ssh-agent ne semble pas être lancé"
+msgstr ""
+"vous avez choisi de signer seulement avec ssh-agent mais ssh-agent ne semble "
+"pas être lancé"
 
 #: src/key_store.cc:881
 #, c-format
@@ -4829,7 +4884,7 @@ msgstr ""
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
 msgstr ""
-"Échec du déchiffrage de l'ancienne clef privée RSA, phrase secrète "
+"échec du déchiffrage de l'ancienne clef privée RSA, phrase secrète "
 "incorrecte probablement"
 
 #: src/key_store.cc:1097
@@ -4921,7 +4976,9 @@ msgid ""
 msgid ""
 "the key %s stored in your database does\n"
 "not match the version in your local key store!"
-msgstr "la clef %s enregistrée dans votre base de données ne correspond pas à la version dans votre entrepôt local de clefs !"
+msgstr ""
+"la clef %s enregistrée dans votre base de données ne correspond pas à la "
+"version dans votre entrepôt local de clefs !"
 
 #: src/keys.cc:102
 #, c-format
@@ -4939,14 +4996,17 @@ msgstr ""
 "Pick one to use for signatures by adding '-k<keyname>' to your command"
 msgstr ""
 "vous avez plusieurs clefs privées\n"
-"Choisissez celle que vous voulez utiliser pour signer en ajoutant « -k<nomdeclef> » à votre commande"
+"Choisissez celle que vous voulez utiliser pour signer en ajoutant « -"
+"k<nomdeclef> » à votre commande"
 
 #: src/keys.cc:144
 #, c-format
 msgid ""
 "a key is required for this operation, but the '--key' option was given with "
 "an empty argument"
-msgstr "Une clef est requise pour cette opération, mais l'argument de l'option « --key » était vide"
+msgstr ""
+"une clef est requise pour cette opération, mais l'argument de l'option « --"
+"key » était vide"
 
 #: src/packet.cc:134
 #, c-format
@@ -5128,7 +5188,8 @@ msgstr ""
 msgstr ""
 "la disposition de la base de données « %s » est faite selon un vieux schéma\n"
 "Essayez « %s db migrate » pour mettre la base de données à niveau.\n"
-"(Cette opération est irréversible ; vous voudrez probablement en faire une copie de sauvegarde préalablement.)"
+"(Cette opération est irréversible ; vous voudrez probablement en faire une "
+"copie de sauvegarde préalablement.)"
 
 #: src/migrate_schema.cc:1218
 #, c-format
@@ -5201,7 +5262,9 @@ msgid ""
 #, c-format
 msgid ""
 "directory '%s' for path '%s' cannot be added, as there is a file in the way"
-msgstr "le dossier « %s » pour le chemin « %s » ne peut pas être ajouté, un fichier fait obstacle"
+msgstr ""
+"le dossier « %s » pour le chemin « %s » ne peut pas être ajouté, un fichier "
+"fait obstacle"
 
 #: src/migrate_ancestry.cc:510
 #, c-format
@@ -5306,7 +5369,8 @@ msgid "processing failure while talking 
 #: src/netsync.cc:163
 #, c-format
 msgid "processing failure while talking to peer '%s', disconnecting"
-msgstr "échec de traitement pendant le dialogue avec le pair « %s », déconnexion"
+msgstr ""
+"échec de traitement pendant le dialogue avec le pair « %s », déconnexion"
 
 #: src/netsync.cc:171
 #, c-format
@@ -5345,13 +5409,13 @@ msgstr "le serveur est trop vieux pour l
 
 #: src/network/automate_session.cc:130
 #, c-format
-msgid "Sorry, you aren't allowed to do that."
-msgstr "Désolé, vous n'êtes pas autorisé à faire cela."
+msgid "sorry, you aren't allowed to do that."
+msgstr "désolé, vous n'êtes pas autorisé à faire cela."
 
 #: src/network/automate_session.cc:219
 #, c-format
 msgid "unexpected netcmd '%d' received on automate connection"
-msgstr "Réception inattendue de netcmd « %d » lors d'une connexion automatique"
+msgstr "réception inattendue de netcmd « %d » lors d'une connexion automatique"
 
 #: src/network/connection_info.cc:91
 #, c-format
@@ -5404,7 +5468,9 @@ msgid ""
 msgid ""
 "include / exclude pattern was given both as part of the URI and as a "
 "separate argument"
-msgstr "un motif d'inclusion/exclusion a été donné et pour une partie de l'URI et comme argument séparé."
+msgstr ""
+"un motif d'inclusion/exclusion a été donné et pour une partie de l'URI et "
+"comme argument séparé."
 
 #: src/network/connection_info.cc:477
 #, c-format
@@ -5446,7 +5512,9 @@ msgid ""
 msgid ""
 "the '--no-transport-auth' option is usually only used in combination with '--"
 "stdio'"
-msgstr "L'option « --no-transport-auth » n'est habituellement utilisée qu'en combinaison avec « --stdio »"
+msgstr ""
+"L'option « --no-transport-auth » n'est habituellement utilisée qu'en "
+"combinaison avec « --stdio »"
 
 #: src/network/listener_base.cc:47
 #, c-format
@@ -5519,7 +5587,8 @@ msgid "mismatched epoch on branch '%s'. 
 #: src/network/netsync_session.cc:978
 #, c-format
 msgid "mismatched epoch on branch '%s'. Server has %s, client has %s"
-msgstr "discordance d'époque sur la branche « %s ». Le serveur a %s, le client a %s."
+msgstr ""
+"discordance d'époque sur la branche « %s ». Le serveur a %s, le client a %s."
 
 #: src/network/netsync_session.cc:997
 #, c-format
@@ -5644,7 +5713,7 @@ msgstr "clefs"
 
 #: src/network/netsync_session.cc:1467
 #, c-format
-msgid "Cannot find key '%s'"
+msgid "cannot find key '%s'"
 msgstr "impossible de trouver la clef « %s »"
 
 #: src/network/reactor.cc:182
@@ -5776,8 +5845,8 @@ msgstr "échec E/S du pair %s en état c
 
 #: src/network/session_base.cc:256
 #, c-format
-msgid "Network error on peer %s, disconnecting"
-msgstr "Erreur réseau avec le pair %s, déconnexion"
+msgid "network error on peer %s, disconnecting"
+msgstr "erreur réseau avec le pair %s, déconnexion"
 
 #: src/netxx_pipe.cc:50 src/netxx_pipe.cc:189
 #, c-format
@@ -6005,7 +6074,8 @@ msgstr ""
 msgstr ""
 "rencontre d'une révision au format inconnu, version %s.\n"
 "Je ne comprend que le format version 1.\n"
-"Une version plus récente de monotone est requise pour terminer cette opération."
+"Une version plus récente de monotone est requise pour terminer cette "
+"opération."
 
 #: src/revision.cc:402
 #, c-format
@@ -6714,7 +6784,8 @@ msgid "selector '%s' is not a valid date
 #: src/selectors.cc:168
 #, c-format
 msgid "selector '%s' is not a valid date (internally completed to '%s')"
-msgstr "le sélecteur « %s » n'est pas une date valide (expansion interne « %s »)"
+msgstr ""
+"le sélecteur « %s » n'est pas une date valide (expansion interne « %s »)"
 
 #: src/selectors.cc:172
 #, c-format
@@ -6834,18 +6905,23 @@ msgid ""
 #, c-format
 msgid ""
 "selector '%s' is invalid, because there is a '%s' someplace it shouldn't be"
-msgstr "le sélecteur « %s » est invalide, car un « %s » se trouve là où il ne devrait pas."
+msgstr ""
+"le sélecteur « %s » est invalide, car un « %s » se trouve là où il ne "
+"devrait pas."
 
 #: src/selectors.cc:843 src/selectors.cc:846
 #, c-format
 msgid ""
 "selector '%s' is invalid, don't mix '/' and '|' operators without parentheses"
-msgstr "le sélecteur « %s » est invalide, ne mélangez pas les opérateurs « / » et « | » sans parenthèses."
+msgstr ""
+"le sélecteur « %s » est invalide, ne mélangez pas les opérateurs « / » et « |"
+" » sans parenthèses."
 
 #: src/selectors.cc:885
 #, c-format
 msgid "selector '%s' is invalid, it doesn't look like an expr"
-msgstr "le sélecteur « %s » est invalide, car il ne ressemble pas à une _expression_."
+msgstr ""
+"le sélecteur « %s » est invalide, car il ne ressemble pas à une _expression_."
 
 #: src/selectors.cc:908
 #, c-format
@@ -6922,7 +6998,8 @@ msgstr ""
 "removed on one side of the merge.  Affected revisions include:"
 msgstr ""
 "le contenu modifié dans le fichier « %s »\n"
-"sera ignoré durant cette fusion puisque le fichier a été supprimé sur un côté de la fusion. Les révisions affectées sont :"
+"sera ignoré durant cette fusion puisque le fichier a été supprimé sur un "
+"côté de la fusion. Les révisions affectées sont :"
 
 #: src/merge_roster.cc:346
 #, c-format
@@ -7421,7 +7498,7 @@ msgstr "incapable d'analyser l'URI de l'
 
 #: src/uri.cc:150 src/uri.cc:153 src/uri.cc:175 src/uri.cc:196
 #, c-format
-msgid "Bad URLencoded string '%s'"
+msgid "bad URLencoded string '%s'"
 msgstr "mauvaise chaîne URL-encodée « %s »"
 
 #: src/sha1.cc:34
@@ -7644,7 +7721,9 @@ msgid "need %d bytes to decode '%s' at %
 #: src/netio.hh:36 src/netio.hh:54
 #, c-format
 msgid "need %d bytes to decode '%s' at %d, only have %d"
-msgstr "%d octets sont nécessaires pour décoder « %s » à %d, seulement %d sont disponibles"
+msgstr ""
+"%d octets sont nécessaires pour décoder « %s » à %d, seulement %d sont "
+"disponibles"
 
 #: src/netio.hh:82 src/netio.hh:117
 #, c-format
@@ -7752,7 +7831,9 @@ msgid ""
 msgid ""
 "automatically update the workspace, if it was at a head and the command "
 "creates a new head"
-msgstr "met à jour l'espace de trvail, s'il était en tête des révisions et la commande créait une nouvelle tête"
+msgstr ""
+"met à jour l'espace de trvail, s'il était en tête des révisions et la "
+"commande créait une nouvelle tête"
 
 #: src/options_list.hh:225
 msgid "address:port to listen on (default :4691)"
@@ -7906,7 +7987,9 @@ msgid ""
 msgid ""
 "move conflicting, unversioned paths into '%s' before proceeding with any "
 "workspace change"
-msgstr "déplacer les chemins en conflit et sans version vers « %s » avant de procéder à tout changement de l'espace de travail"
+msgstr ""
+"déplacer les chemins en conflit et sans version vers « %s » avant de "
+"procéder à tout changement de l'espace de travail"
 
 #: src/options_list.hh:390
 msgid ""
@@ -8006,11 +8089,14 @@ msgid ""
 #: src/options_list.hh:458
 msgid ""
 "do not load '%APPDATA%\\monotone\\monotonerc' or '_MTN\\monotonerc' lua files"
-msgstr "ne pas charger les fichiers « %APPDATA%\\monotone\\monotonerc » ou « _MTN\\monotonerc » lua"
+msgstr ""
+"ne pas charger les fichiers « %APPDATA%\\monotone\\monotonerc » ou « _MTN"
+"\\monotonerc » lua"
 
 #: src/options_list.hh:461
 msgid "do not load '~/.monotone/monotonerc' or '_MTN/monotonerc' lua files"
-msgstr "inhibe les fichiers lua « ~/.monotone/monotonerc » et « _MTN/monotonerc »"
+msgstr ""
+"inhibe les fichiers lua « ~/.monotone/monotonerc » et « _MTN/monotonerc »"
 
 #: src/options_list.hh:468
 msgid "do not load the built-in lua file with the default hooks"
@@ -8046,15 +8132,21 @@ msgid ""
 msgid ""
 "decrease verbosity (undo previous '-v', then disable informational output, "
 "then disable warnings)"
-msgstr "baisser la verbosité (annuler l'option « -v » précédente, puis désactiver la sortie informative, puis désactiver les avertissements)"
+msgstr ""
+"baisser la verbosité (annuler l'option « -v » précédente, puis désactiver la "
+"sortie informative, puis désactiver les avertissements)"
 
 #: src/options_list.hh:503
 msgid "increase verbosity (undo previous '-q', and then enable debug output)"
-msgstr "augmenter la verbosité (annuler l'option « -q » précédente, puis activer la sortie de déboguage)"
+msgstr ""
+"augmenter la verbosité (annuler l'option « -q » précédente, puis activer la "
+"sortie de déboguage)"
 
 #: src/options_list.hh:513
 msgid "please us '-v' (or '-v -v -v' if there are previous '-q' options)"
-msgstr "veuillez utiliser « -v » (ou « -v -v -v » s'il y a des options « -q » précédentes)"
+msgstr ""
+"veuillez utiliser « -v » (ou « -v -v -v » s'il y a des options « -q » "
+"précédentes)"
 
 #: src/options_list.hh:516
 msgid "print debug log to stderr while running"
@@ -8326,8 +8418,12 @@ msgid_plural ""
 "giving up after four zero-length writes to '%s' (%d byte written, %d left)"
 msgid_plural ""
 "giving up after four zero-length writes to '%s' (%d bytes written, %d left)"
-msgstr[0] "abandon après quatre écritures de longueur zéro sur « %s » (%d octet écrit, %d laissés)"
-msgstr[1] "abandon après quatre écritures de longueur zéro sur « %s » (%d octets écrits, %d laissés)"
+msgstr[0] ""
+"abandon après quatre écritures de longueur zéro sur « %s » (%d octet écrit, "
+"%d laissés)"
+msgstr[1] ""
+"abandon après quatre écritures de longueur zéro sur « %s » (%d octets "
+"écrits, %d laissés)"
 
 #: src/unix/os_strerror.cc:21 src/win32/os_strerror.cc:27
 #, c-format
@@ -8488,7 +8584,8 @@ msgid "this monotone binary requires at 
 #: src/monotone.cc:146
 #, c-format
 msgid "this monotone binary requires at least SQLite 3.3.14 to run"
-msgstr "ce binaire de monotone requiert au moins SQLite 3.3.14 pour s'exécuter."
+msgstr ""
+"ce binaire de monotone requiert au moins SQLite 3.3.14 pour s'exécuter."
 
 #: src/monotone.cc:157
 #, c-format
@@ -8498,22 +8595,27 @@ msgid "this monotone binary requires Bot
 #: src/monotone.cc:161
 #, c-format
 msgid "this monotone binary requires Botan 1.6.3 or newer"
-msgstr "ce binaire de monotone requiert une version de Botan au moins égale à 1.6.3."
+msgstr ""
+"ce binaire de monotone requiert une version de Botan au moins égale à 1.6.3."
 
 #: src/monotone.cc:163
 #, c-format
 msgid "this monotone binary does not work with Botan newer than 1.7.6"
-msgstr "ce binaire de monotone ne fonctionne pas avec une version de Botan plus récente que 1.7.6."
+msgstr ""
+"ce binaire de monotone ne fonctionne pas avec une version de Botan plus "
+"récente que 1.7.6."
 
 #: src/monotone.cc:166
 #, c-format
 msgid "this monotone binary requires Botan 1.7.7 or newer"
-msgstr "ce binaire de monotone requiert une version de Botan au moins égale à 1.7.7."
+msgstr ""
+"ce binaire de monotone requiert une version de Botan au moins égale à 1.7.7."
 
 #: src/monotone.cc:172 src/monotone.cc:177
 #, c-format
 msgid "this monotone binary does not work with Botan 1.9.x"
-msgstr "ce binaire de monotone ne fonctionne pas avec les versions 1.9.x de Botan."
+msgstr ""
+"ce binaire de monotone ne fonctionne pas avec les versions 1.9.x de Botan."
 
 #: src/monotone.cc:175
 #, c-format
============================================================
--- po/it.po	b4b3e1fbd6d4fef3dcd21e24c5d35bbb2ddddc1a
+++ po/it.po	bdf8a6936c2cef1e7c73d8fb782b6e49e4e76e19
@@ -2,19 +2,19 @@
 # Copyright (C) 2003 - 2011 The monotone development team <http://www.monotone.ca>
 # This file is distributed under the same license as the monotone package.
 # Please see po/README.<lang> for individual copyrights.
-# 
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-01 10:16+0100\n"
-"PO-Revision-Date: 2011-03-14 10:19+0100\n"
-"Last-Translator: tommyd <address@hidden>\n"
+"POT-Creation-Date: 2011-04-21 12:52+0200\n"
+"PO-Revision-Date: 2011-04-21 13:08+0100\n"
+"Last-Translator: Lapo Luchini <address@hidden>\n"
 "Language-Team: \n"
+"Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
 #: src/sanity.cc:252
@@ -22,27 +22,30 @@ msgstr "fatale: il formattatore ha falli
 msgid "fatal: formatter failed on %s:%d: %s"
 msgstr "fatale: il formattatore ha fallito su %s:%d: %s"
 
-#: src/sanity.cc:353 src/cmd_list.cc:728
+#: src/sanity.cc:353
+#: src/cmd_list.cc:728
 msgid "misuse: "
 msgstr "abuso: "
 
-#: src/sanity.cc:357 src/database.cc:951 src/migrate_schema.cc:65
+#: src/sanity.cc:357
+#: src/database.cc:952
+#: src/migrate_schema.cc:65
 msgid "error: "
 msgstr "errore: "
 
 #: src/sanity.cc:379
 #, c-format
 msgid "%s:%d: index '%s' = %d overflowed vector '%s' with size %d"
-msgstr ""
-"%s:%d: l'indice ‘%s’ = %d ha mandato in overflow il vettore ‘%s’ con "
-"grandezza %d"
+msgstr "%s:%d: l'indice ‘%s’ = %d ha mandato in overflow il vettore ‘%s’ con grandezza %d"
 
 #: src/sanity.cc:426
 #, c-format
 msgid "Current work set: %i items"
 msgstr "Insieme di lavoro attuale: %i elementi"
 
-#: src/sanity.hh:371 src/cmd_list.cc:734 src/lua_hooks.cc:105
+#: src/sanity.hh:371
+#: src/cmd_list.cc:734
+#: src/lua_hooks.cc:105
 #, c-format
 msgid "%s"
 msgstr "%s"
@@ -57,7 +60,8 @@ msgstr "dimensione dell'ID esadecimale â
 msgid "hex encoded ID '%s' size != %d"
 msgstr "dimensione dell'ID esadecimale ‘%s’ != %d"
 
-#: src/vocab.cc:53 src/database.cc:4230
+#: src/vocab.cc:53
+#: src/database.cc:4231
 #, c-format
 msgid "bad character '%c' in id name '%s'"
 msgstr "carattere non ammesso ‘%c’ nel nome dell'id ‘%s’"
@@ -83,13 +87,13 @@ msgstr "carattere non ammesso ‘%c’ n
 msgstr "carattere non ammesso ‘%c’ nel nome della chiave ‘%s’"
 
 #: src/vocab.cc:109
-#, c-format
-msgid "Invalid key length of %d bytes"
+#, fuzzy, c-format
+msgid "invalid key length of %d bytes"
 msgstr "Chiave di lunghezza non valida (%d byte)"
 
 #: src/vocab.cc:123
-#, c-format
-msgid "Invalid hmac length of %d bytes"
+#, fuzzy, c-format
+msgid "invalid hmac length of %d bytes"
 msgstr "HMAC di lunghezza non valida (%d byte)"
 
 #: src/charset.cc:72
@@ -97,12 +101,15 @@ msgstr "non riesco a convertire una stri
 msgid "failed to convert string from %s to %s: '%s'"
 msgstr "non riesco a convertire una stringa da ‘%s’ a ‘%s’: ‘%s’"
 
-#: src/charset.cc:337 src/charset.cc:351
+#: src/charset.cc:337
+#: src/charset.cc:351
 #, c-format
 msgid "error converting %d UTF-8 bytes to IDNA ACE: %s"
 msgstr "errore nella conversione di %d byte UTF-8 in IDNA ACE: %s"
 
-#: src/paths.cc:360 src/paths.cc:381 src/paths.cc:386
+#: src/paths.cc:360
+#: src/paths.cc:381
+#: src/paths.cc:386
 #, c-format
 msgid "path '%s' is invalid"
 msgstr "il percorso ‘%s’ non è valido"
@@ -112,24 +119,25 @@ msgstr "percorso assoluto ‘%s’ non v
 msgid "absolute path '%s' is invalid"
 msgstr "percorso assoluto ‘%s’ non valido"
 
-#: src/paths.cc:446 src/paths.cc:466
+#: src/paths.cc:446
+#: src/paths.cc:466
 #, c-format
 msgid "path '%s' is in bookkeeping dir"
 msgstr "path‘%s’ is in bookkeeping dir"
 
 #: src/paths.cc:460
 #, c-format
-msgid "Invalid utf8"
+msgid "invalid utf8"
 msgstr "UTF-8 non valido"
 
 #: src/paths.cc:484
-#, c-format
-msgid "Path is not normalized"
+#, fuzzy, c-format
+msgid "path is not normalized"
 msgstr "Path non in forma normalizzata"
 
 #: src/paths.cc:486
-#, c-format
-msgid "Bookkeeping path is not in bookkeeping dir"
+#, fuzzy, c-format
+msgid "bookkeeping path is not in bookkeeping directory"
 msgstr "Il percorso contabilità non è nella dir contabilità"
 
 #: src/paths.cc:827
@@ -167,22 +175,27 @@ msgstr "Input non valido per parse_basic
 msgid "bad input to parse_basic_io"
 msgstr "Input non valido per parse_basic_io"
 
-#: src/lua.cc:485 src/lua.cc:497 src/lua.cc:509 src/cmd.cc:470 src/cmd.cc:494
+#: src/lua.cc:485
+#: src/lua.cc:497
+#: src/lua.cc:509
 #, c-format
 msgid "%s called with an invalid parameter"
 msgstr "‘%s’ chiamato con un parametro non valido"
 
 #: src/lua.cc:592
-#, c-format
-msgid "Directory '%s' does not exist"
+#, fuzzy, c-format
+msgid "directory '%s' does not exist"
 msgstr "La directory ‘%s’ non esiste"
 
-#: src/lua.cc:594 src/cmd_othervcs.cc:61 src/work.cc:2140
+#: src/lua.cc:594
+#: src/cmd_othervcs.cc:61
+#: src/work.cc:2140
 #, c-format
 msgid "'%s' is not a directory"
 msgstr "‘%s’ non è una directory"
 
-#: src/lua.cc:616 src/lua_hooks.cc:216
+#: src/lua.cc:616
+#: src/lua_hooks.cc:216
 #, c-format
 msgid "lua error while loading rcfile '%s'"
 msgstr "errore lua caricando il file rc ‘%s’"
@@ -235,10 +248,11 @@ msgid "rename source file '%s' is a dire
 #: src/file_io.cc:242
 #, c-format
 msgid "rename source file '%s' is a directory -- bug in monotone?"
-msgstr ""
-"il file sorgente da rinominare ‘%s’ è una directory -- bug in monotone?"
+msgstr "il file sorgente da rinominare ‘%s’ è una directory -- bug in monotone?"
 
-#: src/file_io.cc:245 src/file_io.cc:260 src/file_io.cc:272
+#: src/file_io.cc:245
+#: src/file_io.cc:260
+#: src/file_io.cc:272
 #, c-format
 msgid "rename target '%s' already exists"
 msgstr "esiste già un'altra chiave con nome ‘%s’"
@@ -251,8 +265,7 @@ msgid "rename source dir '%s' is a file 
 #: src/file_io.cc:257
 #, c-format
 msgid "rename source dir '%s' is a file -- bug in monotone?"
-msgstr ""
-"la directory sorgente da rinominare ‘%s’ è un file -- bug in monotone?"
+msgstr "la directory sorgente da rinominare ‘%s’ è un file -- bug in monotone?"
 
 #: src/file_io.cc:270
 #, c-format
@@ -260,23 +273,24 @@ msgstr "il percorso da rinominare ‘%sâ
 msgstr "il percorso da rinominare ‘%s’ non esiste"
 
 #: src/file_io.cc:281
+#: src/work.cc:1425
 #, c-format
-msgid "file %s does not exist"
+msgid "file '%s' does not exist"
 msgstr "il file ‘%s’ non esiste"
 
 #: src/file_io.cc:282
-#, c-format
-msgid "file %s cannot be read as data; it is a directory"
+#, fuzzy, c-format
+msgid "file '%s' cannot be read as data; it is a directory"
 msgstr "il file ‘%s’ non può essere letto: è una directory"
 
 #: src/file_io.cc:286
-#, c-format
-msgid "cannot open file %s for reading"
+#, fuzzy, c-format
+msgid "cannot open file '%s' for reading"
 msgstr "non riesco ad aprire file ‘%s’ in lettura"
 
 #: src/file_io.cc:303
-#, c-format
-msgid "Cannot read standard input multiple times"
+#, fuzzy, c-format
+msgid "cannot read standard input multiple times"
 msgstr "Non posso leggere stdin più volte"
 
 #: src/file_io.cc:334
@@ -284,7 +298,8 @@ msgstr "il file ‘%s’ non può essere
 msgid "file '%s' cannot be overwritten as data; it is a directory"
 msgstr "il file ‘%s’ non può essere sovrascritto: è una directory"
 
-#: src/file_io.cc:426 src/work.cc:1822
+#: src/file_io.cc:426
+#: src/work.cc:1822
 #, c-format
 msgid "no such file or directory: '%s'"
 msgstr "nessun file o directory con nome ‘%s’"
@@ -294,12 +309,17 @@ msgstr "mi aspettavo il file ‘%s’, i
 msgid "expected file '%s', but it is a directory."
 msgstr "mi aspettavo il file ‘%s’, invece è una cartella."
 
-#: src/globish.cc:55 src/globish.cc:62 src/globish.cc:129
+#: src/globish.cc:55
+#: src/globish.cc:62
+#: src/globish.cc:129
 #, c-format
 msgid "invalid pattern '%s': unmatched '['"
 msgstr "pattern ‘%s’ non valido: '[' spaiata"
 
-#: src/globish.cc:88 src/globish.cc:117 src/globish.cc:161 src/globish.cc:195
+#: src/globish.cc:88
+#: src/globish.cc:117
+#: src/globish.cc:161
+#: src/globish.cc:195
 #, c-format
 msgid "invalid pattern '%s': control character 0x%02x is not allowed"
 msgstr "pattern ‘%s’ non valido: carattere di controllo 0x%02x non permesso"
@@ -307,31 +327,23 @@ msgid "invalid pattern '%s': one-element
 #: src/globish.cc:95
 #, c-format
 msgid "invalid pattern '%s': one-element character ranges are not allowed"
-msgstr ""
-"pattern ‘%s’ non valido: i range di caratteri di un solo elemento non sono "
-"permessi"
+msgstr "pattern ‘%s’ non valido: i range di caratteri di un solo elemento non sono permessi"
 
 #: src/globish.cc:98
 #, c-format
-msgid ""
-"invalid pattern '%s': endpoints of a character range must be in ascending "
-"numeric order"
-msgstr ""
-"pattern ‘%s’ non valido: gli estremi di un range di caratteri devono essere "
-"in ordine numerico ascendente"
+msgid "invalid pattern '%s': endpoints of a character range must be in ascending numeric order"
+msgstr "pattern ‘%s’ non valido: gli estremi di un range di caratteri devono essere in ordine numerico ascendente"
 
-#: src/globish.cc:102 src/globish.cc:121
+#: src/globish.cc:102
+#: src/globish.cc:121
 #, c-format
 msgid "invalid pattern '%s': cannot use non-ASCII characters in classes"
-msgstr ""
-"pattern ‘%s’ non valido: impossibile usare caratteri non-ASCII nelle classi"
+msgstr "pattern ‘%s’ non valido: impossibile usare caratteri non-ASCII nelle classi"
 
 #: src/globish.cc:113
 #, c-format
 msgid "syntax error in '%s': character classes may not be nested"
-msgstr ""
-"errore di sintassi in ‘%s’: le classi di caratteri non possono essere "
-"annidiate"
+msgstr "errore di sintassi in ‘%s’: le classi di caratteri non possono essere annidiate"
 
 #: src/globish.cc:132
 #, c-format
@@ -406,18 +418,18 @@ msgid ""
 #, c-format
 msgid ""
 "fatal: %s\n"
-"this is almost certainly a bug in monotone.\n"
-"please send this error message, the output of '%s version --full',\n"
-"and a description of what you were doing to <%s>."
+"This is almost certainly a bug in monotone.\n"
+"Please report this error message, the output of '%s version --full',\n"
+"and a description of what you were doing to '%s'."
 msgstr ""
 
 #: src/ui.cc:671
 #, c-format
 msgid ""
 "fatal: %s\n"
-"this is almost certainly a bug in monotone.\n"
-"please send this error message, the output of '%s version --full',\n"
-"and a description of what you were doing to <%s>.\n"
+"This is almost certainly a bug in monotone.\n"
+"Please report this error message, the output of '%s version --full',\n"
+"and a description of what you were doing to '%s'.\n"
 "This error appears to have been triggered by something in the\n"
 "database you were using, so please preserve it in case it can\n"
 "help in finding the bug."
@@ -444,9 +456,7 @@ msgid "Options specific to '%s %s' (run 
 #: src/ui.cc:1128
 #, c-format
 msgid "Options specific to '%s %s' (run '%s help' to see global options):"
-msgstr ""
-"Opzioni specifiche per '%s %s' (esegui '%s help' per vedere le opzioni "
-"globali): "
+msgstr "Opzioni specifiche per '%s %s' (esegui '%s help' per vedere le opzioni globali): "
 
 #: src/automate_ostream_demuxed.hh:62
 #, c-format
@@ -469,31 +479,28 @@ msgstr "%s: intestazione da remoto:"
 msgstr "%s: intestazione da remoto:"
 
 #: src/automate_reader.cc:46
-#, c-format
-msgid "Bad input to automate stdio: expected ':' after string size"
-msgstr ""
-"Input non valido per ‘automate stdio’: atteso ‘:’ dopo la dimensione di una "
-"stringa"
+#, fuzzy, c-format
+msgid "bad input to automate stdio: expected ':' after string size"
+msgstr "Input non valido per ‘automate stdio’: atteso ‘:’ dopo la dimensione di una stringa"
 
 #: src/automate_reader.cc:66
-#, c-format
-msgid "Bad input to automate stdio: unexpected EOF"
+#, fuzzy, c-format
+msgid "bad input to automate stdio: unexpected EOF"
 msgstr "Input non valido per ‘automate stdio’: EOF inatteso"
 
 #: src/automate_reader.cc:94
-#, c-format
-msgid "Bad input to automate stdio: unknown start token '%c'"
-msgstr ""
-"Input non valido per ‘automate stdio’: il token iniziale ‘%c’ è sconosciuto"
+#, fuzzy, c-format
+msgid "bad input to automate stdio: unknown start token '%c'"
+msgstr "Input non valido per ‘automate stdio’: il token iniziale ‘%c’ è sconosciuto"
 
 #: src/automate_reader.cc:116
-#, c-format
-msgid "Bad input to automate stdio: expected '%c' token"
+#, fuzzy, c-format
+msgid "bad input to automate stdio: expected '%c' token"
 msgstr "Input non valido per ‘automate stdio’: atteso il token ‘%c’"
 
 #: src/automate_reader.cc:123
-#, c-format
-msgid "Bad input to automate stdio: command name is missing"
+#, fuzzy, c-format
+msgid "bad input to automate stdio: command name is missing"
 msgstr "Input non valido per ‘automate stdio’: manca il nome del comando"
 
 #: src/commands.cc:496
@@ -514,8 +521,7 @@ msgid "all arguments given were bookkeep
 #: src/cmd.hh:170
 #, c-format
 msgid "all arguments given were bookkeeping paths; aborting"
-msgstr ""
-"tutte le istruzioni passate erano relative a directory di servizio; sospendo"
+msgstr "tutte le istruzioni passate erano relative a directory di servizio; sospendo"
 
 #: src/cmd.cc:63
 msgid "Commands that aid in scripted execution"
@@ -547,8 +553,7 @@ msgid "Commands for interaction with oth
 
 #: src/cmd.cc:84
 msgid "Commands for interaction with other version control systems"
-msgstr ""
-"Comandi per l'interazione con altri sistemi di controllo delle versioni"
+msgstr "Comandi per l'interazione con altri sistemi di controllo delle versioni"
 
 #: src/cmd.cc:87
 msgid "Commands to review revisions"
@@ -622,36 +627,30 @@ msgstr "Gruppi di comandi:"
 
 #: src/cmd.cc:393
 #, c-format
-msgid ""
-"For information on a specific command, type 'mtn help <command_name> "
-"[subcommand_name ...]'."
-msgstr ""
-"Per informazioni su uno specifico comando, scrivi ‘mtn help <nome_comando> "
-"[nome_sottocomando …]’."
+msgid "For information on a specific command, type 'mtn help <command_name> [subcommand_name ...]'."
+msgstr "Per informazioni su uno specifico comando, scrivi ‘mtn help <nome_comando> [nome_sottocomando …]’."
 
 #: src/cmd.cc:396
 #, c-format
-msgid ""
-"To see more details about the commands of a particular group, type 'mtn help"
-" <group_name>'."
-msgstr ""
-"Per avere maggiori dettagli sui comandi di un particolare gruppo, scrivi "
-"‘mtn help <nome_gruppo>’."
+msgid "To see more details about the commands of a particular group, type 'mtn help <group_name>'."
+msgstr "Per avere maggiori dettagli sui comandi di un particolare gruppo, scrivi ‘mtn help <nome_gruppo>’."
 
 #: src/cmd.cc:399
 #, c-format
-msgid ""
-"Note that you can always abbreviate a command name as long as it does not "
-"conflict with other names."
-msgstr ""
-"Ricorda che puoi sempre abbreviare il nome di un comando fintantantoché non "
-"collide con altri comandi."
+msgid "Note that you can always abbreviate a command name as long as it does not conflict with other names."
+msgstr "Ricorda che puoi sempre abbreviare il nome di un comando fintantantoché non collide con altri comandi."
 
 #: src/cmd.cc:459
-#, c-format
-msgid "Call to user command %s (lua command: %s) failed."
+#, fuzzy, c-format
+msgid "call to user command '%s' (lua command: '%s') failed."
 msgstr "Chiamata al comando utente %s (comando lua: %s) fallita."
 
+#: src/cmd.cc:470
+#: src/cmd.cc:494
+#, fuzzy, c-format
+msgid "'%s' called with an invalid parameter"
+msgstr "‘%s’ chiamato con un parametro non valido"
+
 #: src/cmd.cc:508
 msgid "command [ARGS...]"
 msgstr "comando [ARGOMENTI…]"
@@ -670,12 +669,13 @@ msgstr "non è permesso nessun argomento
 msgstr "non è permesso nessun argomento"
 
 #: src/cmd.cc:540
-msgid "Check that a particular globish matches a particular string"
+#, fuzzy
+msgid "Check that a particular glob matches a particular string"
 msgstr "Verifica se un particolare glob corrisponde a una specifica stringa"
 
 #: src/cmd.cc:548
-#, c-format
-msgid "Globish <%s> does not match string <%s>"
+#, fuzzy, c-format
+msgid "Glob '%s' does not match string '%s'"
 msgstr "Il glob ‘%s’ non corrisponde alla stringa ‘%s’"
 
 #: src/cmd.cc:553
@@ -712,18 +712,8 @@ msgstr "Descrizione"
 msgstr "Descrizione"
 
 #: src/cmd.cc:921
-msgid ""
-"monotone is a highly reliable, very customizable distributed version control"
-" system that provides lightweight branches, history-sensitive merging and a "
-"flexible trust setup. monotone has an easy-to-learn command set and comes "
-"with a rich interface for scripting purposes and thorough documentation."
-msgstr ""
-"monotone è un sistema di controllo delle versioni distribuito, altamente "
-"affidabile e personalizzabile che permette di gestire rami di sviluppo "
-"paralleli in modo leggero, che facilita il merge valutando la storia passata"
-" del progetto eche dà molta flessibilità nella gestione della fiducia. "
-"monotone ha una serie di comandi facili da imparare ed è fornito con una "
-"ricca interfaccia di script potente ed è dettagliatamente documentato."
+msgid "monotone is a highly reliable, very customizable distributed version control system that provides lightweight branches, history-sensitive merging and a flexible trust setup. monotone has an easy-to-learn command set and comes with a rich interface for scripting purposes and thorough documentation."
+msgstr "monotone è un sistema di controllo delle versioni distribuito, altamente affidabile e personalizzabile che permette di gestire rami di sviluppo paralleli in modo leggero, che facilita il merge valutando la storia passata del progetto eche dà molta flessibilità nella gestione della fiducia. monotone ha una serie di comandi facili da imparare ed è fornito con una ricca interfaccia di script potente ed è dettagliatamente documentato."
 
 #: src/cmd.cc:927
 #, c-format
@@ -732,12 +722,8 @@ msgstr "Per maggiori informazioni su mon
 
 #: src/cmd.cc:930
 #, c-format
-msgid ""
-"The complete documentation, including a tutorial for a quick start with the "
-"system, can be found online on %s."
-msgstr ""
-"La documentazione completa, incluso un corso introduttivo per un veloce "
-"inizio col sistema, si trova online a %s."
+msgid "The complete documentation, including a tutorial for a quick start with the system, can be found online on %s."
+msgstr "La documentazione completa, incluso un corso introduttivo per un veloce inizio col sistema, si trova online a %s."
 
 #: src/cmd.cc:934
 msgid "Global Options"
@@ -770,19 +756,12 @@ msgstr ""
 msgstr ""
 
 #: src/cmd.cc:949
-msgid ""
-"monotone was written originally by Graydon Hoare <address@hidden> in 2003"
-" and has since then received numerous contributions from many individuals. A"
-" complete list of authors can be found in AUTHORS."
+msgid "monotone was written originally by Graydon Hoare <address@hidden> in 2003 and has since then received numerous contributions from many individuals. A complete list of authors can be found in AUTHORS."
 msgstr ""
 
 #: src/cmd.cc:954
-msgid ""
-"Nowadays, monotone is maintained by a collective of enthusiastic "
-"programmers, known as the monotone development team."
-msgstr ""
-"Oggi, monotone è mantenuto da un collettivo di programmatori entusiasti, "
-"conosciuti come la squadra sviluppo di monotone."
+msgid "Nowadays, monotone is maintained by a collective of enthusiastic programmers, known as the monotone development team."
+msgstr "Oggi, monotone è mantenuto da un collettivo di programmatori entusiasti, conosciuti come la squadra sviluppo di monotone."
 
 #: src/cmd.cc:957
 msgid "Copyright"
@@ -790,9 +769,7 @@ msgstr ""
 
 #: src/cmd.cc:958
 #, c-format
-msgid ""
-"monotone and this man page is Copyright (c) 2003 \\- %s by the monotone "
-"development team."
+msgid "monotone and this man page is Copyright (c) 2003 \\- %s by the monotone development team."
 msgstr ""
 
 #: src/cmd.cc:970
@@ -803,22 +780,23 @@ msgid "could not execute man page format
 #: src/cmd.cc:974
 #, c-format
 msgid "could not execute man page formatter command '%s': %s"
-msgstr ""
-"potrebbe non eseguire il comando ‘man’ di formattazione pagina ‘%s’: %s"
+msgstr "potrebbe non eseguire il comando ‘man’ di formattazione pagina ‘%s’: %s"
 
 #: src/cmd.cc:991
-#, c-format
-msgid "--message and --message-file are mutually exclusive"
+#, fuzzy, c-format
+msgid "'--message' and '--message-file' are mutually exclusive"
 msgstr "‘--message’ e ‘--message-file’ sono mutuamente esclusivi"
 
-#: src/cmd_netsync.cc:68 src/cmd_netsync.cc:768
-#, c-format
-msgid "cannot use --exclude in URL mode"
+#: src/cmd_netsync.cc:68
+#: src/cmd_netsync.cc:768
+#, fuzzy, c-format
+msgid "cannot use '--exclude' in URI mode"
 msgstr "non è possibile usare --exclude nel modo URL"
 
 #: src/cmd_netsync.cc:108
+#, fuzzy
 msgid ""
-"[URL]\n"
+"[URI]\n"
 "[ADDRESS[:PORTNUMBER]]"
 msgstr ""
 "[URL]\n"
@@ -828,10 +806,11 @@ msgstr "Apre una connessione 'automate s
 msgid "Opens an 'automate stdio' connection to a remote server"
 msgstr "Apre una connessione 'automate stdio' per un server remoto "
 
-#: src/cmd_netsync.cc:122 src/cmd_netsync.cc:225
+#: src/cmd_netsync.cc:122
+#: src/cmd_netsync.cc:225
 #, c-format
 msgid ""
-"No database given; assuming '%s' database. This means that\n"
+"no database given; assuming '%s' database. This means that\n"
 "we can't verify the server key, because we have no record of\n"
 "what it should be."
 msgstr ""
@@ -844,21 +823,51 @@ msgstr "Esegue COMMAND su un server remo
 msgid "Executes COMMAND on a remote server"
 msgstr "Esegue COMMAND su un server remoto"
 
-#: src/cmd_netsync.cc:221 src/cmd_list.cc:1021 src/cmd_packet.cc:73
-#: src/cmd_packet.cc:134 src/cmd_packet.cc:254 src/cmd_key_cert.cc:81
-#: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1141
-#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1134 src/cmd_ws_commit.cc:1342
-#: src/cmd_ws_commit.cc:1456 src/cmd_ws_commit.cc:1478 src/cmd_automate.cc:138
-#: src/cmd_files.cc:239 src/cmd_files.cc:336 src/cmd_files.cc:360
-#: src/cmd_files.cc:394 src/automate.cc:85 src/automate.cc:122
-#: src/automate.cc:175 src/automate.cc:298 src/automate.cc:400
-#: src/automate.cc:431 src/automate.cc:520 src/automate.cc:1246
-#: src/automate.cc:1419 src/automate.cc:1556 src/automate.cc:1592
-#: src/automate.cc:1624 src/automate.cc:1658 src/automate.cc:1690
-#: src/automate.cc:1730 src/automate.cc:1820 src/automate.cc:1903
-#: src/automate.cc:1936 src/automate.cc:1999 src/automate.cc:2051
-#: src/automate.cc:2106 src/automate.cc:2166 src/automate.cc:2202
-#: src/automate.cc:2272 src/automate.cc:2302 src/automate.cc:2378
+#: src/cmd_netsync.cc:221
+#: src/cmd_list.cc:1021
+#: src/cmd_packet.cc:73
+#: src/cmd_packet.cc:134
+#: src/cmd_packet.cc:254
+#: src/cmd_key_cert.cc:81
+#: src/cmd_key_cert.cc:186
+#: src/cmd_merging.cc:384
+#: src/cmd_merging.cc:1141
+#: src/cmd_merging.cc:1219
+#: src/cmd_ws_commit.cc:1134
+#: src/cmd_ws_commit.cc:1342
+#: src/cmd_ws_commit.cc:1456
+#: src/cmd_ws_commit.cc:1478
+#: src/cmd_automate.cc:138
+#: src/cmd_files.cc:239
+#: src/cmd_files.cc:336
+#: src/cmd_files.cc:360
+#: src/cmd_files.cc:394
+#: src/automate.cc:85
+#: src/automate.cc:122
+#: src/automate.cc:175
+#: src/automate.cc:298
+#: src/automate.cc:400
+#: src/automate.cc:431
+#: src/automate.cc:520
+#: src/automate.cc:1246
+#: src/automate.cc:1419
+#: src/automate.cc:1556
+#: src/automate.cc:1592
+#: src/automate.cc:1624
+#: src/automate.cc:1658
+#: src/automate.cc:1690
+#: src/automate.cc:1730
+#: src/automate.cc:1820
+#: src/automate.cc:1903
+#: src/automate.cc:1936
+#: src/automate.cc:1999
+#: src/automate.cc:2051
+#: src/automate.cc:2106
+#: src/automate.cc:2166
+#: src/automate.cc:2202
+#: src/automate.cc:2272
+#: src/automate.cc:2302
+#: src/automate.cc:2378
 #: src/asciik.cc:379
 #, c-format
 msgid "wrong argument count"
@@ -892,65 +901,61 @@ msgstr[1] "invierebbe %d revisioni\n"
 msgstr[1] "invierebbe %d revisioni\n"
 
 #: src/cmd_netsync.cc:331
-#, c-format
-msgid "%9d in branch %s\n"
-msgstr ""
+#, fuzzy, c-format
+msgid "%9d in branch '%s'\n"
+msgstr "%d testa sul ramo ‘%s’"
 
-#: src/cmd_netsync.cc:541 src/cmd_netsync.cc:564 src/cmd_netsync.cc:590
-#: src/cmd_netsync.cc:625 src/cmd_netsync.cc:651 src/cmd_netsync.cc:691
+#: src/cmd_netsync.cc:541
+#: src/cmd_netsync.cc:564
+#: src/cmd_netsync.cc:590
+#: src/cmd_netsync.cc:625
+#: src/cmd_netsync.cc:651
+#: src/cmd_netsync.cc:691
+#, fuzzy
 msgid ""
-"[URL]\n"
+"[URI]\n"
 "[ADDRESS[:PORTNUMBER] [PATTERN ...]]"
 msgstr ""
 "[URL]\n"
 "[INDIRIZZO[:NUMERO_PORTA] [PATTERN …]]"
 
-#: src/cmd_netsync.cc:542 src/cmd_netsync.cc:565
+#: src/cmd_netsync.cc:542
+#: src/cmd_netsync.cc:565
 msgid "Pushes branches to a netsync server"
 msgstr "Invia rami ad un server netsync"
 
 #: src/cmd_netsync.cc:543
-msgid ""
-"This will push all branches that match the pattern given in PATTERN to the "
-"netsync server at the address ADDRESS."
-msgstr ""
-"Questo invierà tutti i rami che corrispondono al pattern specificato al "
-"server netsync che si trova all'indirizzo specificato."
+msgid "This will push all branches that match the pattern given in PATTERN to the netsync server at the address ADDRESS."
+msgstr "Questo invierà tutti i rami che corrispondono al pattern specificato al server netsync che si trova all'indirizzo specificato."
 
-#: src/cmd_netsync.cc:591 src/cmd_netsync.cc:626
+#: src/cmd_netsync.cc:591
+#: src/cmd_netsync.cc:626
 msgid "Pulls branches from a netsync server"
 msgstr "Riceve rami da un server netsync"
 
 #: src/cmd_netsync.cc:592
-msgid ""
-"This pulls all branches that match the pattern given in PATTERN from the "
-"netsync server at the address ADDRESS."
-msgstr ""
-"Questo riceverà tutti i rami che corrispondono al pattern specificato dal "
-"server netsync che si trova all'indirizzo specificato."
+msgid "This pulls all branches that match the pattern given in PATTERN from the netsync server at the address ADDRESS."
+msgstr "Questo riceverà tutti i rami che corrispondono al pattern specificato dal server netsync che si trova all'indirizzo specificato."
 
-#: src/cmd_netsync.cc:609 src/cmd_netsync.cc:846
+#: src/cmd_netsync.cc:609
+#: src/cmd_netsync.cc:846
 #, c-format
 msgid "doing anonymous pull; use -kKEYNAME if you need authentication"
-msgstr ""
-"eseguo ‘pull’ anonimo; utilizza ‘-k NOMECHIAVE’ se necessiti di "
-"autenticazione"
+msgstr "eseguo ‘pull’ anonimo; utilizza ‘-k NOMECHIAVE’ se necessiti di autenticazione"
 
-#: src/cmd_netsync.cc:652 src/cmd_netsync.cc:692
+#: src/cmd_netsync.cc:652
+#: src/cmd_netsync.cc:692
 msgid "Synchronizes branches with a netsync server"
 msgstr "Sincronizza rami con un server netsync"
 
 #: src/cmd_netsync.cc:653
-msgid ""
-"This synchronizes branches that match the pattern given in PATTERN with the "
-"netsync server at the address ADDRESS."
-msgstr ""
-"Questo sincronizzerà tutti i rami che corrispondono al pattern specificato "
-"con il server netsync che si trova all'indirizzo specificato."
+msgid "This synchronizes branches that match the pattern given in PATTERN with the netsync server at the address ADDRESS."
+msgstr "Questo sincronizzerà tutti i rami che corrispondono al pattern specificato con il server netsync che si trova all'indirizzo specificato."
 
 #: src/cmd_netsync.cc:723
+#, fuzzy
 msgid ""
-"URL [DIRECTORY]\n"
+"URI [DIRECTORY]\n"
 "HOST[:PORTNUMBER] BRANCH [DIRECTORY]"
 msgstr ""
 "URL [DIRECTORY]\n"
@@ -961,18 +966,12 @@ msgstr "Checkout di una revisione da un 
 msgstr "Checkout di una revisione da un database remoto in una directory"
 
 #: src/cmd_netsync.cc:725
-msgid ""
-"If a revision is given, that's the one that will be checked out.  Otherwise,"
-" it will be the head of the branch supplied.  If no directory is given, the "
-"branch name will be used as directory"
-msgstr ""
-"Se viene specificata una revisione, sarà quella ad essere oggetto del "
-"checkout.  Altrimenti sarà utilizzata la testa del ramo specificato.  Se "
-"nessuna directory è data, il nome del ramo sarà usato come directory"
+msgid "If a revision is given, that's the one that will be checked out.  Otherwise, it will be the head of the branch supplied.  If no directory is given, the branch name will be used as directory"
+msgstr "Se viene specificata una revisione, sarà quella ad essere oggetto del checkout.  Altrimenti sarà utilizzata la testa del ramo specificato.  Se nessuna directory è data, il nome del ramo sarà usato come directory"
 
 #: src/cmd_netsync.cc:744
-#, c-format
-msgid "the --branch option is only valid with an URI to clone"
+#, fuzzy, c-format
+msgid "the '--branch' option is only valid with an URI to clone"
 msgstr "l'opzione ‘--branch’ è valida solo per clonare un URI"
 
 #: src/cmd_netsync.cc:793
@@ -985,35 +984,46 @@ msgstr "la directory di destinazione del
 msgid "clone destination directory '%s' already exists"
 msgstr "la directory di destinazione della clonazione ‘%s’ esiste già"
 
-#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1842 src/cmd_ws_commit.cc:1931
+#: src/cmd_netsync.cc:832
+#: src/cmd_ws_commit.cc:1842
+#: src/cmd_ws_commit.cc:1931
 #, c-format
 msgid "bookkeeping directory already exists in '%s'"
 msgstr "la directory di servizio di monotone esiste già in ‘%s’"
 
-#: src/cmd_netsync.cc:866 src/cmd_merging.cc:535 src/cmd_merging.cc:636
-#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1030
+#: src/cmd_netsync.cc:866
+#: src/cmd_merging.cc:535
+#: src/cmd_merging.cc:636
+#: src/cmd_merging.cc:641
+#: src/cmd_merging.cc:1471
+#: src/cmd_ws_commit.cc:1030
 #, c-format
 msgid "branch '%s' is empty"
 msgstr "il ramo ‘%s’ è vuoto"
 
-#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1033 src/cmd_ws_commit.cc:1910
-#, c-format
-msgid "branch %s has multiple heads:"
+#: src/cmd_netsync.cc:869
+#: src/cmd_ws_commit.cc:1033
+#: src/cmd_ws_commit.cc:1910
+#, fuzzy, c-format
+msgid "branch '%s' has multiple heads:"
 msgstr "il ramo ‘%s’ ha più teste:"
 
 #: src/cmd_netsync.cc:873
-#, c-format
-msgid "choose one with '%s clone -r<id> URL'"
+#, fuzzy, c-format
+msgid "choose one with '%s clone -r<id> URI'"
 msgstr "scegline una con ‘%s clone -r<id> URL’"
 
-#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1039 src/cmd_ws_commit.cc:1916
-#, c-format
-msgid "branch %s has multiple heads"
+#: src/cmd_netsync.cc:874
+#: src/cmd_ws_commit.cc:1039
+#: src/cmd_ws_commit.cc:1916
+#, fuzzy, c-format
+msgid "branch '%s' has multiple heads"
 msgstr "il ramo ‘%s’ ha più teste"
 
-#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1054 src/cmd_ws_commit.cc:1896
-#, c-format
-msgid "revision %s is not a member of branch %s"
+#: src/cmd_netsync.cc:885
+#: src/cmd_ws_commit.cc:1896
+#, fuzzy, c-format
+msgid "revision %s is not a member of branch '%s'"
 msgstr "la revisione %s non fa parte del ramo ‘%s’"
 
 #: src/cmd_netsync.cc:918
@@ -1035,22 +1045,17 @@ msgstr "Mostra oggetti in database"
 msgstr "Mostra oggetti in database"
 
 #: src/cmd_list.cc:53
-msgid ""
-"This command is used to query information from the database.  It shows "
-"database objects, or the current workspace manifest, or known, unknown, "
-"intentionally ignored, missing, or changed-state files."
-msgstr ""
-"Questo comando è usato per chiedere informazioni dal database. Mostra gli "
-"oggetti del database, o il manifesto del corrente spazio di lavoro, o file "
-"conosciuti, conosciuti, ignorati volutamente, assenti o cambiati di stato"
+msgid "This command is used to query information from the database.  It shows database objects, or the current workspace manifest, or known, unknown, intentionally ignored, missing, or changed-state files."
+msgstr "Questo comando è usato per chiedere informazioni dal database. Mostra gli oggetti del database, o il manifesto del corrente spazio di lavoro, o file conosciuti, conosciuti, ignorati volutamente, assenti o cambiati di stato"
 
 #: src/cmd_list.cc:101
 msgid "Lists certificates attached to a revision"
 msgstr ""
 
-#: src/cmd_list.cc:129 src/cmd_list.cc:1050
-#, c-format
-msgid "no public key '%s' found in database"
+#: src/cmd_list.cc:129
+#: src/cmd_list.cc:1050
+#, fuzzy, c-format
+msgid "no public key %s found in database"
 msgstr "la chiave pubblica ‘%s’ non è nel database"
 
 #: src/cmd_list.cc:139
@@ -1070,7 +1075,8 @@ msgstr "ok"
 msgid "ok"
 msgstr "ok"
 
-#: src/cmd_list.cc:175 src/database.cc:1326
+#: src/cmd_list.cc:175
+#: src/database.cc:1327
 msgid "bad"
 msgstr "invalido"
 
@@ -1079,21 +1085,40 @@ msgstr "sconosciuto"
 msgstr "sconosciuto"
 
 #: src/cmd_list.cc:208
-msgid ""
-"Lists duplicate files in the specified revision. If no revision is "
-"specified, use the workspace"
-msgstr ""
-"Elenca file duplicati nella revisione specificata. Se nessuna revisione è "
-"specificata, usa lo spazio di lavoro"
+msgid "Lists duplicate files in the specified revision. If no revision is specified, use the workspace"
+msgstr "Elenca file duplicati nella revisione specificata. Se nessuna revisione è specificata, usa lo spazio di lavoro"
 
 #: src/cmd_list.cc:222
 #, c-format
 msgid "more than one revision given"
 msgstr "selezionata più di una revisione"
 
-#: src/cmd_list.cc:236 src/automate.cc:1253 src/automate.cc:1438
-#: src/automate.cc:1564 src/automate.cc:1946 src/automate.cc:2008
+#: src/cmd_list.cc:236
+#: src/cmd_list.cc:1034
+#: src/cmd_db.cc:621
+#: src/cmd_files.cc:270
+#: src/automate.cc:132
+#: src/automate.cc:185
+#: src/automate.cc:235
+#: src/automate.cc:265
+#: src/automate.cc:307
+#: src/automate.cc:312
+#: src/automate.cc:406
+#: src/automate.cc:437
+#: src/automate.cc:1253
+#: src/automate.cc:1438
+#: src/automate.cc:1564
+#: src/automate.cc:1602
+#: src/automate.cc:1634
+#: src/automate.cc:1701
+#: src/automate.cc:1703
+#: src/automate.cc:1739
+#: src/automate.cc:1946
+#: src/automate.cc:2008
 #: src/automate.cc:2013
+#: src/automate.cc:2175
+#: src/selectors.cc:904
+#: src/selectors.cc:922
 #, c-format
 msgid "no revision %s found in database"
 msgstr "nel database non è presente la revisione %s"
@@ -1113,8 +1138,8 @@ msgstr "nessuna chiave corrispondente a 
 msgstr "nessuna chiave corrispondente a ‘%s’ trovata"
 
 #: src/cmd_list.cc:448
-#, c-format
-msgid "(*) - only in %s/"
+#, fuzzy, c-format
+msgid "(*) - only in '%s/'"
 msgstr "(*) - solo in ‘%s/’"
 
 #: src/cmd_list.cc:466
@@ -1136,8 +1161,8 @@ msgstr "Elenca l'epoca dei rami che corr
 msgstr "Elenca l'epoca dei rami che corrispondono ad un pattern"
 
 #: src/cmd_list.cc:527
-#, c-format
-msgid "no epoch for branch %s"
+#, fuzzy, c-format
+msgid "no epoch for branch '%s'"
 msgstr "nessuna epoca trovata per il ramo ‘%s’"
 
 #: src/cmd_list.cc:536
@@ -1154,7 +1179,7 @@ msgstr "<nessun ramo impostato>"
 
 #: src/cmd_list.cc:659
 #, c-format
-msgid "%s (in %s)"
+msgid "%s (in '%s')"
 msgstr ""
 
 #: src/cmd_list.cc:663
@@ -1170,12 +1195,14 @@ msgstr "Elenca database gestiti e i loro
 msgid "Lists managed databases and their known workspaces"
 msgstr "Elenca database gestiti e i loro spazi di lavoro conosciuti"
 
-#: src/cmd_list.cc:684 src/database.cc:4977
+#: src/cmd_list.cc:684
+#: src/database.cc:4978
 #, c-format
 msgid "no default database location configured"
 msgstr ""
 
-#: src/cmd_list.cc:688 src/database.cc:5055
+#: src/cmd_list.cc:688
+#: src/database.cc:5056
 #, c-format
 msgid "could not query default database glob"
 msgstr ""
@@ -1204,8 +1231,7 @@ msgid "Lists files that belong to the br
 
 #: src/cmd_list.cc:829
 msgid "Lists files that belong to the branch but are not in the workspace"
-msgstr ""
-"Elenca i file presenti nel ramo attuale ma assenti dallo spazio di lavoro"
+msgstr "Elenca i file presenti nel ramo attuale ma assenti dallo spazio di lavoro"
 
 #: src/cmd_list.cc:852
 msgid "Lists files that have changed with respect to the current revision"
@@ -1215,17 +1241,33 @@ msgstr "Elenca tutte le chiavi di un por
 msgid "Lists all keys in the keystore"
 msgstr "Elenca tutte le chiavi di un portachiavi"
 
-#: src/cmd_list.cc:962 src/cmd_db.cc:50 src/cmd_db.cc:62 src/cmd_db.cc:74
-#: src/cmd_db.cc:91 src/cmd_db.cc:105 src/cmd_db.cc:119 src/cmd_db.cc:135
-#: src/cmd_db.cc:325 src/cmd_db.cc:341 src/cmd_db.cc:362 src/cmd_db.cc:380
-#: src/cmd_automate.cc:113 src/cmd_automate.cc:235 src/automate.cc:344
-#: src/automate.cc:370 src/automate.cc:472 src/automate.cc:1320
-#: src/automate.cc:1348 src/automate.cc:1768
+#: src/cmd_list.cc:962
+#: src/cmd_db.cc:50
+#: src/cmd_db.cc:62
+#: src/cmd_db.cc:74
+#: src/cmd_db.cc:91
+#: src/cmd_db.cc:105
+#: src/cmd_db.cc:119
+#: src/cmd_db.cc:135
+#: src/cmd_db.cc:325
+#: src/cmd_db.cc:341
+#: src/cmd_db.cc:362
+#: src/cmd_db.cc:380
+#: src/cmd_automate.cc:113
+#: src/cmd_automate.cc:235
+#: src/automate.cc:344
+#: src/automate.cc:370
+#: src/automate.cc:472
+#: src/automate.cc:1320
+#: src/automate.cc:1348
+#: src/automate.cc:1768
 #, c-format
 msgid "no arguments needed"
 msgstr "nessun argomento richiesto"
 
-#: src/cmd_list.cc:1015 src/cmd_db.cc:610 src/automate.cc:394
+#: src/cmd_list.cc:1015
+#: src/cmd_db.cc:610
+#: src/automate.cc:394
 #: src/automate.cc:425
 msgid "REV"
 msgstr "REV"
@@ -1234,16 +1276,6 @@ msgstr "Stampa tutti i certificati relat
 msgid "Prints all certificates attached to a revision"
 msgstr "Stampa tutti i certificati relativi ad una revisione"
 
-#: src/cmd_list.cc:1034 src/cmd_db.cc:621 src/cmd_files.cc:270
-#: src/automate.cc:132 src/automate.cc:185 src/automate.cc:235
-#: src/automate.cc:265 src/automate.cc:307 src/automate.cc:312
-#: src/automate.cc:406 src/automate.cc:437 src/automate.cc:1602
-#: src/automate.cc:1634 src/automate.cc:1701 src/automate.cc:1703
-#: src/automate.cc:2175 src/selectors.cc:904 src/selectors.cc:922
-#, c-format
-msgid "no such revision '%s'"
-msgstr "la revisione %s non esiste"
-
 #: src/cmd_packet.cc:67
 msgid "KEY-PACKET-DATA"
 msgstr "PACCHETTO_CHIAVE"
@@ -1257,12 +1289,17 @@ msgstr "la chiave pubblica ‘%s’ non 
 msgid "public key '%s' does not exist"
 msgstr "la chiave pubblica ‘%s’ non è conosciuta"
 
-#: src/cmd_packet.cc:117 src/cmd_packet.cc:128 src/cmd_packet.cc:139
-#: src/cmd_key_cert.cc:168 src/cmd_key_cert.cc:180 src/cmd_key_cert.cc:192
+#: src/cmd_packet.cc:117
+#: src/cmd_packet.cc:128
+#: src/cmd_packet.cc:139
+#: src/cmd_key_cert.cc:168
+#: src/cmd_key_cert.cc:180
+#: src/cmd_key_cert.cc:192
 msgid "KEY_NAME_OR_HASH"
 msgstr "NOME_O_HASH_DELLA_CHIAVE"
 
-#: src/cmd_packet.cc:118 src/cmd_packet.cc:129
+#: src/cmd_packet.cc:118
+#: src/cmd_packet.cc:129
 msgid "Prints a public key packet"
 msgstr "Stampa un pacchetto di chiave pubblica"
 
@@ -1309,16 +1346,19 @@ msgstr "NOME_CHIAVE"
 msgid "KEY_NAME"
 msgstr "NOME_CHIAVE"
 
-#: src/cmd_key_cert.cc:46 src/cmd_key_cert.cc:73
+#: src/cmd_key_cert.cc:46
+#: src/cmd_key_cert.cc:73
 msgid "Generates an RSA key-pair"
 msgstr "Genera una coppia di chiavi RSA"
 
-#: src/cmd_key_cert.cc:61 src/cmd_key_cert.cc:91
+#: src/cmd_key_cert.cc:61
+#: src/cmd_key_cert.cc:91
 #, c-format
 msgid "you already have a key named '%s'"
 msgstr "hai già una chiave chiamata ‘%s’"
 
-#: src/cmd_key_cert.cc:65 src/cmd_key_cert.cc:95
+#: src/cmd_key_cert.cc:65
+#: src/cmd_key_cert.cc:95
 #, c-format
 msgid "there is another key named '%s'"
 msgstr "c'è già una chiave chiamata ‘%s’"
@@ -1328,30 +1368,24 @@ msgstr "NOME_CHIAVE PASSPHRASE"
 msgstr "NOME_CHIAVE PASSPHRASE"
 
 #: src/cmd_key_cert.cc:143
-#, c-format
-msgid "dropping public key '%s' from database"
+#, fuzzy, c-format
+msgid "dropping public key %s from database"
 msgstr "cancello la chiave pubblica ‘%s’ dal database"
 
 #: src/cmd_key_cert.cc:153
-#, c-format
-msgid "dropping key pair '%s' from keystore"
+#, fuzzy, c-format
+msgid "dropping key pair %s from keystore"
 msgstr "cancello la coppia di chiavi ‘%s’ dal portachiavi"
 
 #: src/cmd_key_cert.cc:160
 #, c-format
 msgid "public or private key '%s' does not exist in keystore or database"
-msgstr ""
-"o la chiave pubblica o quella privata ‘%s’ non esiste nel portachiavi o nel "
-"database"
+msgstr "o la chiave pubblica o quella privata ‘%s’ non esiste nel portachiavi o nel database"
 
 #: src/cmd_key_cert.cc:163
 #, c-format
-msgid ""
-"public or private key '%s' does not exist in keystore, and no database was "
-"specified"
-msgstr ""
-"o la chiave pubblica o quella privata ‘%s’ non esiste nel portachiavi, e "
-"nessun database è stato specificato"
+msgid "public or private key '%s' does not exist in keystore, and no database was specified"
+msgstr "o la chiave pubblica o quella privata ‘%s’ non esiste nel portachiavi, e nessun database è stato specificato"
 
 #: src/cmd_key_cert.cc:169
 msgid "Drops a public and/or private key"
@@ -1391,12 +1425,8 @@ msgstr "Crea un certificato per una revi
 msgstr "Crea un certificato per una revisione o un set di revisioni"
 
 #: src/cmd_key_cert.cc:262
-msgid ""
-"Creates a certificate with the given name and value on each revision that "
-"matches the given selector"
-msgstr ""
-"Crea un certificato con i nomi e i valori dati per ogni revisione che "
-"corrisponde al selettore dato"
+msgid "Creates a certificate with the given name and value on each revision that matches the given selector"
+msgstr "Crea un certificato con i nomi e i valori dati per ogni revisione che corrisponde al selettore dato"
 
 #: src/cmd_key_cert.cc:300
 msgid "REVISION NAME VALUE SIGNER1 [SIGNER2 [...]]"
@@ -1449,7 +1479,8 @@ msgstr "Annota i risultati dell'esecuzio
 msgid "Notes the results of running a test on a revision"
 msgstr "Annota i risultati dell'esecuzione di un test su una revisione"
 
-#: src/cmd_key_cert.cc:396 src/cmd_key_cert.cc:422
+#: src/cmd_key_cert.cc:396
+#: src/cmd_key_cert.cc:422
 msgid "REVISION"
 msgstr "REVISIONE"
 
@@ -1458,8 +1489,8 @@ msgstr "Approva una specifica revisione"
 msgstr "Approva una specifica revisione"
 
 #: src/cmd_key_cert.cc:414
-#, c-format
-msgid "need --branch argument for approval"
+#, fuzzy, c-format
+msgid "need '--branch' argument for approval"
 msgstr "per ‘approve’ è necessario un argomento ‘--branch=RAMO’"
 
 #: src/cmd_key_cert.cc:423
@@ -1467,8 +1498,8 @@ msgstr "Sospende una particolare revisio
 msgstr "Sospende una particolare revisione"
 
 #: src/cmd_key_cert.cc:440
-#, c-format
-msgid "need --branch argument to suspend"
+#, fuzzy, c-format
+msgid "need '--branch' argument to suspend"
 msgstr "per ‘suspend’ è necessario un argomento --branch"
 
 #: src/cmd_key_cert.cc:448
@@ -1489,14 +1520,20 @@ msgstr "commento vuoto"
 msgid "empty comment"
 msgstr "commento vuoto"
 
-#: src/cmd_merging.cc:119 src/cmd_merging.cc:438 src/cmd_merging.cc:659
-#: src/cmd_merging.cc:853 src/cmd_merging.cc:986
+#: src/cmd_merging.cc:119
+#: src/cmd_merging.cc:438
+#: src/cmd_merging.cc:659
+#: src/cmd_merging.cc:853
+#: src/cmd_merging.cc:986
 #, c-format
 msgid "[left]  %s"
 msgstr "[sinistra] %s"
 
-#: src/cmd_merging.cc:120 src/cmd_merging.cc:439 src/cmd_merging.cc:660
-#: src/cmd_merging.cc:854 src/cmd_merging.cc:987
+#: src/cmd_merging.cc:120
+#: src/cmd_merging.cc:439
+#: src/cmd_merging.cc:660
+#: src/cmd_merging.cc:854
+#: src/cmd_merging.cc:987
 #, c-format
 msgid "[right] %s"
 msgstr "[destra]   %s"
@@ -1507,39 +1544,44 @@ msgstr "la revisione selezionata non è 
 msgstr "la revisione selezionata non è sul ramo attuale"
 
 #: src/cmd_merging.cc:176
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "target revision is in multiple branches:%s\n"
 "\n"
-"try again with explicit --branch"
+"Try again with explicit '--branch'"
 msgstr ""
 "la revisione in oggetto è in rami multipli:%s\n"
 "\n"
 "prova ancora specificando ‘--branch=RAMO’"
 
 #: src/cmd_merging.cc:187
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"target revision not in any branch\n"
-"next commit will use branch %s"
+"target revision not in any branch.\n"
+"Next commit will use branch '%s'"
 msgstr ""
 "la revisione in oggetto non è in un ramo\n"
 "il prossimo commit userà il ramo ‘%s’"
 
-#: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
-#: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
-#: src/cmd_ws_commit.cc:2270 src/cmd_ws_commit.cc:2385 src/cmd_files.cc:308
-#: src/cmd_files.cc:406 src/automate.cc:1035 src/automate.cc:1328
+#: src/cmd_merging.cc:209
+#: src/cmd_merging.cc:824
+#: src/cmd_ws_commit.cc:370
+#: src/cmd_ws_commit.cc:1358
+#: src/cmd_ws_commit.cc:2042
+#: src/cmd_ws_commit.cc:2270
+#: src/cmd_ws_commit.cc:2385
+#: src/cmd_files.cc:308
+#: src/cmd_files.cc:406
+#: src/automate.cc:1035
+#: src/automate.cc:1328
 #, c-format
 msgid "this command can only be used in a single-parent workspace"
-msgstr ""
-"questo comando può essere usato solamente in spazio lavoro genitore-solo"
+msgstr "questo comando può essere usato solamente in spazio lavoro genitore-solo"
 
 #: src/cmd_merging.cc:213
 #, c-format
 msgid "this workspace is a new project; cannot update"
-msgstr ""
-"questo spazio di lavoro è un nuovo progetto, non posso fare un ‘update’"
+msgstr "questo spazio di lavoro è un nuovo progetto, non posso fare un ‘update’"
 
 #: src/cmd_merging.cc:217
 #, c-format
@@ -1552,11 +1594,11 @@ msgstr "aggiorno seguendo il ramo ‘%sâ
 msgstr "aggiorno seguendo il ramo ‘%s’"
 
 #: src/cmd_merging.cc:228
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"your request matches no descendents of the current revision\n"
-"in fact, it doesn't even match the current revision\n"
-"maybe you want something like --revision=h:%s"
+"your request matches no descendents of the current revision.\n"
+"In fact, it doesn't even match the current revision.\n"
+"Maybe you want something like '--revision=h:%s'"
 msgstr ""
 "la tua richiesta non coincide con nessun discendente\n"
 "della revisione corrente, in effetti non coincide nemmeno\n"
@@ -1588,13 +1630,13 @@ msgstr "selezionata revisione %s per l'u
 msgstr "selezionata revisione %s per l'update"
 
 #: src/cmd_merging.cc:272
-#, c-format
-msgid "switching to branch %s"
+#, fuzzy, c-format
+msgid "switching to branch '%s'"
 msgstr "passaggio al ramo ‘%s’"
 
 #: src/cmd_merging.cc:355
-#, c-format
-msgid "switched branch; next commit will use branch %s"
+#, fuzzy, c-format
+msgid "switched branch; next commit will use branch '%s'"
 msgstr "ramo cambiato: il prossimo commit userà il ramo ‘%s’"
 
 #: src/cmd_merging.cc:356
@@ -1602,28 +1644,22 @@ msgstr "aggiornato alla revisione base %
 msgid "updated to base revision %s"
 msgstr "aggiornato alla revisione base %s"
 
-#: src/cmd_merging.cc:360 src/cmd_merging.cc:378
+#: src/cmd_merging.cc:360
+#: src/cmd_merging.cc:378
 msgid "Updates the workspace"
 msgstr "Aggiorna lo spazio di lavoro"
 
 #: src/cmd_merging.cc:361
-msgid ""
-"This command modifies your workspace to be based off of a different "
-"revision, preserving uncommitted changes as it does so.  If a revision is "
-"given, update the workspace to that revision.  If not, update the workspace "
-"to the head of the branch."
-msgstr ""
-"Questo comando modifica il tuo spazio di lavoro come base di una revisione "
-"differente, preserva i cambiamenti non committati mentre lo fa.  Se è data "
-"una revisione, aggiorna lo spazio di lavoro a quella revisione. Altrimenti, "
-"aggiorna lo spazio di lavoro alla testa del ramo."
+msgid "This command modifies your workspace to be based off of a different revision, preserving uncommitted changes as it does so.  If a revision is given, update the workspace to that revision.  If not, update the workspace to the head of the branch."
+msgstr "Questo comando modifica il tuo spazio di lavoro come base di una revisione differente, preserva i cambiamenti non committati mentre lo fa.  Se è data una revisione, aggiorna lo spazio di lavoro a quella revisione. Altrimenti, aggiorna lo spazio di lavoro alla testa del ramo."
 
 #: src/cmd_merging.cc:387
 #, c-format
 msgid "at most one revision selector may be specified"
 msgstr "al massimo un selettore di revisione può essere specificato"
 
-#: src/cmd_merging.cc:452 src/cmd_merging.cc:763
+#: src/cmd_merging.cc:452
+#: src/cmd_merging.cc:763
 #, c-format
 msgid "[merged] %s"
 msgstr "[unione]   %s"
@@ -1632,9 +1668,11 @@ msgstr "Unisce teste disunite di un ramo
 msgid "Merges unmerged heads of a branch"
 msgstr "Unisce teste disunite di un ramo"
 
-#: src/cmd_merging.cc:528 src/cmd_merging.cc:1121 src/cmd_merging.cc:1462
-#, c-format
-msgid "please specify a branch, with --branch=BRANCH"
+#: src/cmd_merging.cc:528
+#: src/cmd_merging.cc:1121
+#: src/cmd_merging.cc:1462
+#, fuzzy, c-format
+msgid "please specify a branch, with '--branch=BRANCH'"
 msgstr "specifica un ramo, con ‘--branch=RAMO’"
 
 #: src/cmd_merging.cc:538
@@ -1664,7 +1702,8 @@ msgstr "nota: il ramo ‘%s’ ha ancora
 msgid "note: branch '%s' still has %d heads; run merge again"
 msgstr "nota: il ramo ‘%s’ ha ancora %d teste; esegui ‘merge’ di nuovo"
 
-#: src/cmd_merging.cc:638 src/cmd_merging.cc:643
+#: src/cmd_merging.cc:638
+#: src/cmd_merging.cc:643
 #, c-format
 msgid "branch '%s' is not merged"
 msgstr "il ramo ‘%s’ è separato"
@@ -1690,8 +1729,8 @@ msgstr "unione non necessaria; metto ‘
 msgstr "unione non necessaria; metto ‘%s’ nel ramo ‘%s’"
 
 #: src/cmd_merging.cc:703
-#, c-format
-msgid "Path %s not found in destination tree."
+#, fuzzy, c-format
+msgid "Path '%s' not found in destination tree."
 msgstr "Percorso ‘%s’ non trovato nell'albero di destinazione."
 
 #: src/cmd_merging.cc:770
@@ -1716,30 +1755,16 @@ msgid "Merges a revision into the curren
 
 #: src/cmd_merging.cc:795
 msgid "Merges a revision into the current workspace's base revision"
-msgstr ""
-"Unisce una revisione nella revisione base attuale dello spazio di lavoro"
+msgstr "Unisce una revisione nella revisione base attuale dello spazio di lavoro"
 
 #: src/cmd_merging.cc:796
-msgid ""
-"Merges OTHER-REVISION into the current workspace's base revision, and update"
-" the current workspace with the result.  There can be no pending changes in "
-"the current workspace.  Both OTHER-REVISION and the workspace's base "
-"revision will be recorded as parents on commit.  The workspace's selected "
-"branch is not changed."
-msgstr ""
-"Unisce ALTRA-REVISIONE nella revisione base attuale dello spazio di lavoro e"
-" aggiorna lo spazio di lavoro attuale col risultato.  Non ci possono essere "
-"cambiamenti in sospeso nello spazio di lavoro attuale.  Sia ALTRA-REVISIONE "
-"che la revisione base dello spazio di lavoro saranno registrate come "
-"genitori al commit.  Il ramo dello spazio di lavoro selezionato non viene "
-"cambiato."
+msgid "Merges OTHER-REVISION into the current workspace's base revision, and update the current workspace with the result.  There can be no pending changes in the current workspace.  Both OTHER-REVISION and the workspace's base revision will be recorded as parents on commit.  The workspace's selected branch is not changed."
+msgstr "Unisce ALTRA-REVISIONE nella revisione base attuale dello spazio di lavoro e aggiorna lo spazio di lavoro attuale col risultato.  Non ci possono essere cambiamenti in sospeso nello spazio di lavoro attuale.  Sia ALTRA-REVISIONE che la revisione base dello spazio di lavoro saranno registrate come genitori al commit.  Il ramo dello spazio di lavoro selezionato non viene cambiato."
 
 #: src/cmd_merging.cc:831
 #, c-format
 msgid "'%s' can only be used in a workspace with no pending changes"
-msgstr ""
-"‘%s’ può essere usato solamente in spazio di lavoro senza cambiamenti in "
-"sospeso"
+msgstr "‘%s’ può essere usato solamente in spazio di lavoro senza cambiamenti in sospeso"
 
 #: src/cmd_merging.cc:845
 #, c-format
@@ -1780,22 +1805,22 @@ msgstr "Unisce due revisioni date esplic
 msgstr "Unisce due revisioni date esplicitamente"
 
 #: src/cmd_merging.cc:913
-msgid ""
-"The results of the merge are placed on the branch specified by DEST-BRANCH."
-msgstr ""
-"I risultati dell'unione vengono messi nel ramo specificato da DEST-BRANCH."
+msgid "The results of the merge are placed on the branch specified by DEST-BRANCH."
+msgstr "I risultati dell'unione vengono messi nel ramo specificato da DEST-BRANCH."
 
 #: src/cmd_merging.cc:935
 #, c-format
 msgid "%s and %s are the same revision, aborting"
 msgstr "%s e %s sono la stessa revisione, annullo"
 
-#: src/cmd_merging.cc:938 src/cmd_merging.cc:941
+#: src/cmd_merging.cc:938
+#: src/cmd_merging.cc:941
 #, c-format
 msgid "%s is already an ancestor of %s"
 msgstr "%s è già antenato di %s"
 
-#: src/cmd_merging.cc:999 src/cmd_merging.cc:1014
+#: src/cmd_merging.cc:999
+#: src/cmd_merging.cc:1014
 #, c-format
 msgid "%s is an ancestor of %s; no merge is needed."
 msgstr "‘%s’ è un antenato di ‘%s’: il merge non è necessario."
@@ -1812,7 +1837,9 @@ msgstr[1] ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/cmd_merging.cc:1082 src/cmd_conflicts.cc:160 src/cmd_conflicts.cc:173
+#: src/cmd_merging.cc:1082
+#: src/cmd_conflicts.cc:160
+#: src/cmd_conflicts.cc:173
 #, c-format
 msgid "warning: %d conflict with no supported resolutions."
 msgid_plural "warning: %d conflicts with no supported resolutions."
@@ -1828,18 +1855,13 @@ msgstr "Mostra quali conflitti necessita
 msgstr "Mostra quali conflitti necessitano risoluzione tra due revisioni"
 
 #: src/cmd_merging.cc:1091
-msgid ""
-"The conflicts are calculated based on the two revisions given in the REV "
-"parameters."
-msgstr ""
-"I conflitti sono calcolati sulla base delle due revisione date nei parametri"
-" REV."
+msgid "The conflicts are calculated based on the two revisions given in the REV parameters."
+msgstr "I conflitti sono calcolati sulla base delle due revisione date nei parametri REV."
 
 #: src/cmd_merging.cc:1128
 #, c-format
 msgid "branch '%s' has only 1 head; must be at least 2 for conflicts"
-msgstr ""
-"il ramo ‘%s’ ha solo 1 testa; devono essere almeno 2 per avere conflitti"
+msgstr "il ramo ‘%s’ ha solo 1 testa; devono essere almeno 2 per avere conflitti"
 
 #: src/cmd_merging.cc:1161
 msgid "[LEFT_REVID RIGHT_REVID]"
@@ -1850,30 +1872,23 @@ msgstr "Mostra i conflitti presenti tra 
 msgstr "Mostra i conflitti presenti tra due revisioni"
 
 #: src/cmd_merging.cc:1163
-msgid ""
-"If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
-"two heads that would be chosen by the 'merge' command."
-msgstr ""
-"Se non vengono dati argomenti, LEFT_REVID e RIGHT_REVID default per le due "
-"prime teste che sarebbero scelte dal comando 'merge'."
+msgid "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first two heads that would be chosen by the 'merge' command."
+msgstr "Se non vengono dati argomenti, LEFT_REVID e RIGHT_REVID default per le due prime teste che sarebbero scelte dal comando 'merge'."
 
 #: src/cmd_merging.cc:1180
 msgid "Store the conflicts from merging two revisions"
 msgstr "Immagazzina i conflitti derivati dalla fusione di due revisioni"
 
 #: src/cmd_merging.cc:1181
-msgid ""
-"If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
-"two heads that would be chosen by the 'merge' command. If --conflicts-file "
-"is not given, '_MTN/conflicts' is used."
-msgstr ""
-"Se non vengono dati argomenti, LEFT_REVID e RIGHT_REVID default per le due "
-"prime teste che sarebbero scelte dal comando 'merge'. Se --conflicts-file "
-"non è dato, viene usato '_MTN/conflicts'."
+#, fuzzy, c-format
+msgid "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first two heads that would be chosen by the 'merge' command. If '--conflicts-file' is not given, '%s' is used."
+msgstr "Se non vengono dati argomenti, LEFT_REVID e RIGHT_REVID default per le due prime teste che sarebbero scelte dal comando 'merge'. Se --conflicts-file non è dato, viene usato '_MTN/conflicts'."
 
-#: src/cmd_merging.cc:1190 src/options_list.hh:602 src/options_list.hh:623
-#, c-format
-msgid "conflicts file must be under _MTN"
+#: src/cmd_merging.cc:1190
+#: src/options_list.hh:603
+#: src/options_list.hh:624
+#, fuzzy, c-format
+msgid "conflicts file must be under '_MTN'"
 msgstr "il file con i conflitti deve essere sotto ‘_MTN’"
 
 #: src/cmd_merging.cc:1202
@@ -1886,12 +1901,8 @@ msgstr "REVID_SX NOME_FILE_SX REVID_DX N
 msgstr "REVID_SX NOME_FILE_SX REVID_DX NOME_FILE_DX"
 
 #: src/cmd_merging.cc:1206
-msgid ""
-"Prints the results of the internal line merger, given two child revisions "
-"and file names"
-msgstr ""
-"Stampa i risultati della linea fusione interna, date due revisioni figlo e "
-"nomi del file"
+msgid "Prints the results of the internal line merger, given two child revisions and file names"
+msgstr "Stampa i risultati della linea fusione interna, date due revisioni figlo e nomi del file"
 
 #: src/cmd_merging.cc:1258
 #, c-format
@@ -1917,10 +1928,10 @@ msgstr ""
 "Se vengono specificate due revisioni, applica le modifiche necessarie per arrivare dalla prima revisione alla seconda."
 
 #: src/cmd_merging.cc:1289
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"revision %s is a merge\n"
-"to apply the changes relative to one of its parents, use:\n"
+"revision %s is a merge.\n"
+"To apply the changes relative to one of its parents, use:\n"
 "  %s pluck -r PARENT -r %s"
 msgstr ""
 "la revisione %s è frutto di un merge\n"
@@ -1961,7 +1972,8 @@ msgstr "il ramo ‘%s’ è attualmente 
 msgid "branch '%s' is currently unmerged:"
 msgstr "il ramo ‘%s’ è attualmente separato:"
 
-#: src/cmd_merging.cc:1482 src/automate.cc:1411
+#: src/cmd_merging.cc:1482
+#: src/automate.cc:1411
 msgid "[REVID]"
 msgstr "[ID_REV]"
 
@@ -1971,8 +1983,7 @@ msgid "If no REVID is given, the workspa
 
 #: src/cmd_merging.cc:1484
 msgid "If no REVID is given, the workspace is used."
-msgstr ""
-"Se non viene specificato un ID_REV, viene utilizzato lo spazio di lavoro."
+msgstr "Se non viene specificato un ID_REV, viene utilizzato lo spazio di lavoro."
 
 #: src/cmd_db.cc:41
 msgid "Deals with the database"
@@ -1999,61 +2010,32 @@ msgstr "Tentativo di riparare certificat
 msgstr "Tentativo di riparare certificati cattivi"
 
 #: src/cmd_db.cc:82
-msgid ""
-"Older monotone versions could sometimes associate certs with the wrong key. "
-"This fixes such certs if you have the correct key, and can optionally drop "
-"any certs that you don't have the correct key for. This should only be "
-"needed if you had such certs in your db when upgrading from 0.44 or earlier,"
-" or if you loaded such certs with 'mtn read'."
-msgstr ""
-"Versioni più vecchie di monotone a volte potrebbero associare certificati "
-"con chiavi sbagliate. Questo fissa tali certificati se hai la chiave "
-"corretta, e può a piacere abbandonare certi certificati per i quali non hai "
-"la chiave corretta. Questo dovrebbe essere necessario soltanto se hai tali "
-"certificati nel tuo db quando aggiorni da 0.44 o precedente, e se carichi "
-"tali certificati con 'mtn read'."
+msgid "Older monotone versions could sometimes associate certs with the wrong key. This fixes such certs if you have the correct key, and can optionally drop any certs that you don't have the correct key for. This should only be needed if you had such certs in your db when upgrading from 0.44 or earlier, or if you loaded such certs with 'mtn read'."
+msgstr "Versioni più vecchie di monotone a volte potrebbero associare certificati con chiavi sbagliate. Questo fissa tali certificati se hai la chiave corretta, e può a piacere abbandonare certi certificati per i quali non hai la chiave corretta. Questo dovrebbe essere necessario soltanto se hai tali certificati nel tuo db quando aggiorni da 0.44 o precedente, e se carichi tali certificati con 'mtn read'."
 
 #: src/cmd_db.cc:98
 msgid "Dumps the contents of the database"
 msgstr "Esporta il contenuto del database"
 
 #: src/cmd_db.cc:99
-msgid ""
-"Generates a list of SQL instructions that represent the whole contents of "
-"the database.  The resulting output is useful to later restore the database "
-"from a text file that serves as a backup."
-msgstr ""
-"Genera una lista di istruzioni SQL che rappresenta il completo contenuto del"
-" database.  L'output testuale risultante è utile quale backup del database, "
-"per poterlo eventualmente ripristinare in futuro."
+msgid "Generates a list of SQL instructions that represent the whole contents of the database.  The resulting output is useful to later restore the database from a text file that serves as a backup."
+msgstr "Genera una lista di istruzioni SQL che rappresenta il completo contenuto del database.  L'output testuale risultante è utile quale backup del database, per poterlo eventualmente ripristinare in futuro."
 
 #: src/cmd_db.cc:112
 msgid "Loads the contents of the database"
 msgstr "Importa il contenuto del database"
 
 #: src/cmd_db.cc:113
-msgid ""
-"Reads a list of SQL instructions that regenerate the contents of the "
-"database.  This is supposed to be used in conjunction with the output "
-"generated by the 'dump' command."
-msgstr ""
-"Legge ed esegue una lista di istruzioni SQL in modo da rigenerare il "
-"contenuto del database.  Da utilizzare con l'output prodotto dal comando "
-"‘dump’."
+msgid "Reads a list of SQL instructions that regenerate the contents of the database.  This is supposed to be used in conjunction with the output generated by the 'dump' command."
+msgstr "Legge ed esegue una lista di istruzioni SQL in modo da rigenerare il contenuto del database.  Da utilizzare con l'output prodotto dal comando ‘dump’."
 
 #: src/cmd_db.cc:126
 msgid "Migrates the database to a newer schema"
 msgstr "Migra il database ad un nuovo schema"
 
 #: src/cmd_db.cc:127
-msgid ""
-"Updates the database's internal schema to the most recent one.  Needed to "
-"automatically resolve incompatibilities that may be introduced in newer "
-"versions of monotone."
-msgstr ""
-"Aggiorna lo schema interno del database al più recente.  Necessario per "
-"risolvere automaticamente le incompatibilità che possono essere introdotte "
-"in versioni più recenti di monotone."
+msgid "Updates the database's internal schema to the most recent one.  Needed to automatically resolve incompatibilities that may be introduced in newer versions of monotone."
+msgstr "Aggiorna lo schema interno del database al più recente.  Necessario per risolvere automaticamente le incompatibilità che possono essere introdotte in versioni più recenti di monotone."
 
 #: src/cmd_db.cc:152
 #, c-format
@@ -2080,13 +2062,8 @@ msgstr "Comandi che cancellano elementi 
 msgstr "Comandi che cancellano elementi dal database locale"
 
 #: src/cmd_db.cc:173
-msgid ""
-"Deletions cannot be propagated through netsync, so the deleted items will "
-"come back if you sync with a database that still has them."
-msgstr ""
-"Le cancellazioni non possono essere propagate tramite netsync, quindi se "
-"farai un sync con un database che ha ancora questi elementi, li riceverai "
-"nuovamente."
+msgid "Deletions cannot be propagated through netsync, so the deleted items will come back if you sync with a database that still has them."
+msgstr "Le cancellazioni non possono essere propagate tramite netsync, quindi se farai un sync con un database che ha ancora questi elementi, li riceverai nuovamente."
 
 #: src/cmd_db.cc:177
 msgid "Kills a revision from the local database"
@@ -2098,9 +2075,9 @@ msgstr "la revisione %s ha già dei figl
 msgstr "la revisione %s ha già dei figli, non possiamo eliminarla."
 
 #: src/cmd_db.cc:222
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"Cannot kill revision %s,\n"
+"cannot kill revision %s,\n"
 "because it would leave the current workspace in an invalid\n"
 "state, from which monotone cannot recover automatically since\n"
 "the workspace contains uncommitted changes.\n"
@@ -2124,12 +2101,8 @@ msgstr "Elimina i certificati specificat
 msgstr "Elimina i certificati specificati dal database locale"
 
 #: src/cmd_db.cc:251
-msgid ""
-"Deletes all certs which are on the given revision(s) and have the given name"
-" and if a value is specified then also the given value."
-msgstr ""
-"Cancella tutti i certificati che sono nella revisione(i) data e che ha il "
-"nome dato e se è specificato un valore allora anche il valore dato."
+msgid "Deletes all certs which are on the given revision(s) and have the given name and if a value is specified then also the given value."
+msgstr "Cancella tutti i certificati che sono nella revisione(i) data e che ha il nome dato e se è specificato un valore allora anche il valore dato."
 
 #: src/cmd_db.cc:319
 msgid "Does some sanity checks on the database"
@@ -2160,27 +2133,23 @@ msgstr "Imposta l'epoca per il ramo"
 msgstr "Imposta l'epoca per il ramo"
 
 #: src/cmd_db.cc:407
-#, c-format
-msgid "The epoch must be %s characters"
+#, fuzzy, c-format
+msgid "The epoch must be %d characters"
 msgstr "L'epoca deve essere di %s caratteri"
 
-#: src/cmd_db.cc:414 src/automate.cc:2266
+#: src/cmd_db.cc:414
+#: src/automate.cc:2266
 msgid "DOMAIN NAME VALUE"
 msgstr "DOMINIO NOME VALORE"
 
-#: src/cmd_db.cc:415 src/automate.cc:2267
+#: src/cmd_db.cc:415
+#: src/automate.cc:2267
 msgid "Sets a database variable"
 msgstr "Imposta una variabile del database"
 
 #: src/cmd_db.cc:416
-msgid ""
-"This command modifies (or adds if it did not exist before) the variable "
-"named NAME, stored in the database, and sets it to the given value in VALUE."
-"  The variable is placed in the domain DOMAIN."
-msgstr ""
-"Questo comando modifica (o aggiunge se non esisteva prima) la variabile "
-"chiamata NOME immagazzinata nel database e la imposta al valore dato in "
-"VALORE. La variabile viene messa nel dominio DOMINIO."
+msgid "This command modifies (or adds if it did not exist before) the variable named NAME, stored in the database, and sets it to the given value in VALUE.  The variable is placed in the domain DOMAIN."
+msgstr "Questo comando modifica (o aggiunge se non esisteva prima) la variabile chiamata NOME immagazzinata nel database e la imposta al valore dato in VALORE. La variabile viene messa nel dominio DOMINIO."
 
 #: src/cmd_db.cc:434
 msgid "DOMAIN NAME"
@@ -2191,19 +2160,17 @@ msgstr "Cancella una variabile dal datab
 msgstr "Cancella una variabile dal database"
 
 #: src/cmd_db.cc:436
-msgid ""
-"This command removes the variable NAME from domain DOMAIN, which was "
-"previously stored in the database."
-msgstr ""
-"Questo comando rimuove il NOME della variabile dal dominio DOMINIO, che era "
-"precedentemente immagazzinato nel database"
+msgid "This command removes the variable NAME from domain DOMAIN, which was previously stored in the database."
+msgstr "Questo comando rimuove il NOME della variabile dal dominio DOMINIO, che era precedentemente immagazzinato nel database"
 
-#: src/cmd_db.cc:450 src/automate.cc:2313
-#, c-format
-msgid "no var with name %s in domain %s"
+#: src/cmd_db.cc:450
+#: src/automate.cc:2313
+#, fuzzy, c-format
+msgid "no var with name '%s' in domain '%s'"
 msgstr "nessuna variabile ha nome ‘%s’ nel dominio ‘%s’"
 
-#: src/cmd_db.cc:455 src/cmd_db.cc:477
+#: src/cmd_db.cc:455
+#: src/cmd_db.cc:477
 msgid "[WORKSPACE_PATH]"
 msgstr "[PATH_SPAZIO_DI_LAVORO]"
 
@@ -2213,13 +2180,12 @@ msgid "This command adds WORKSPACE_PATH 
 
 #: src/cmd_db.cc:457
 msgid "This command adds WORKSPACE_PATH to the list of `known-workspaces'."
-msgstr ""
-"Questo comando aggiunge PATH_SPAZIO_DI_LAVORO alla lista degli spazi di "
-"lavoro conosciuti."
+msgstr "Questo comando aggiunge PATH_SPAZIO_DI_LAVORO alla lista degli spazi di lavoro conosciuti."
 
-#: src/cmd_db.cc:464 src/cmd_db.cc:486
-#, c-format
-msgid "No workspace given"
+#: src/cmd_db.cc:464
+#: src/cmd_db.cc:486
+#, fuzzy, c-format
+msgid "no workspace given"
 msgstr "Nessuno spazio di lavoro dato"
 
 #: src/cmd_db.cc:478
@@ -2228,16 +2194,11 @@ msgid "This command removes WORKSPACE_PA
 
 #: src/cmd_db.cc:479
 msgid "This command removes WORKSPACE_PATH to the list of `known-workspaces'."
-msgstr ""
-"Questo comando toglie PATH_SPAZIO_DI_LAVORO dalla lista degli spazi di "
-"lavoro conosciuti."
+msgstr "Questo comando toglie PATH_SPAZIO_DI_LAVORO dalla lista degli spazi di lavoro conosciuti."
 
 #: src/cmd_db.cc:499
-msgid ""
-"Removes all invalid, registered workspace paths for the current database"
-msgstr ""
-"Rimuove tutti i percorsi invalidi registrati nello spazio di lavoro per il "
-"database corrente"
+msgid "Removes all invalid, registered workspace paths for the current database"
+msgstr "Rimuove tutti i percorsi invalidi registrati nello spazio di lavoro per il database corrente"
 
 #: src/cmd_db.cc:544
 msgid "(revision|file|key) PARTIAL-ID"
@@ -2257,12 +2218,8 @@ msgstr "Esegue un passo di migrazione su
 msgstr "Esegue un passo di migrazione sul database specificato"
 
 #: src/cmd_db.cc:598
-msgid ""
-"This command migrates the given database from the specified schema in SCHEMA"
-" to its successor."
-msgstr ""
-"Questo comando migra il database dato dallo schema specificato in SCHEMA al "
-"suo successore."
+msgid "This command migrates the given database from the specified schema in SCHEMA to its successor."
+msgstr "Questo comando migra il database dato dallo schema specificato in SCHEMA al suo successore."
 
 #: src/cmd_db.cc:611
 msgid "Shows a revision's height"
@@ -2274,83 +2231,75 @@ msgstr "altezza in cache: %s"
 msgstr "altezza in cache: %s"
 
 #: src/cmd_db.cc:630
-msgid "load all revisions from the database"
+#, fuzzy
+msgid "Load all revisions from the database"
 msgstr "carica tutte le revisioni dal database"
 
 #: src/cmd_db.cc:631
-msgid ""
-"This command loads all revisions from the database and is intended to be "
-"used for timing revision loading performance."
-msgstr ""
-"Questo comando carica tutte le revisioni dal database ed è pensato per "
-"verificarne le performance."
+msgid "This command loads all revisions from the database and is intended to be used for timing revision loading performance."
+msgstr "Questo comando carica tutte le revisioni dal database ed è pensato per verificarne le performance."
 
 #: src/cmd_db.cc:642
 #, c-format
 msgid "loading revisions"
 msgstr "caricamento delle revisioni"
 
-#: src/cmd_db.cc:643 src/network/netsync_session.cc:1364
-#: src/rcs_import.cc:1234 src/database_check.cc:340
+#: src/cmd_db.cc:643
+#: src/network/netsync_session.cc:1364
+#: src/rcs_import.cc:1234
+#: src/database_check.cc:340
 msgid "revisions"
 msgstr "revisioni"
 
 #: src/cmd_db.cc:659
-msgid "load all roster versions from the database"
+#, fuzzy
+msgid "Load all roster versions from the database"
 msgstr "carica tutti i roster dal database"
 
 #: src/cmd_db.cc:660
-msgid ""
-"This command loads all roster versions from the database and is intended to "
-"be used for timing roster reconstruction performance."
-msgstr ""
-"Questo comanda carica tutte le versioni roster dal database ed è ppensato "
-"per verificarne le performance."
+msgid "This command loads all roster versions from the database and is intended to be used for timing roster reconstruction performance."
+msgstr "Questo comanda carica tutte le versioni roster dal database ed è ppensato per verificarne le performance."
 
 #: src/cmd_db.cc:671
 #, c-format
 msgid "loading rosters"
 msgstr "caricamento dei roster"
 
-#: src/cmd_db.cc:672 src/database_check.cc:208
+#: src/cmd_db.cc:672
+#: src/database_check.cc:208
 msgid "rosters"
 msgstr "roster"
 
 #: src/cmd_db.cc:687
-msgid "load all file versions from the database"
+#, fuzzy
+msgid "Load all file versions from the database"
 msgstr "carica le versioni di tutti i file dal database"
 
 #: src/cmd_db.cc:688
-msgid ""
-"This command loads all files versions from the database and is intended to "
-"be used for timing file reconstruction performance."
-msgstr ""
-"Questo comando carica le versioni di tutti i file dal database e è "
-"progettato per calcolare il tempo di esecuzione della ricostruzione del "
-"file."
+msgid "This command loads all files versions from the database and is intended to be used for timing file reconstruction performance."
+msgstr "Questo comando carica le versioni di tutti i file dal database e è progettato per calcolare il tempo di esecuzione della ricostruzione del file."
 
 #: src/cmd_db.cc:696
 #, c-format
 msgid "loading files"
 msgstr "caricamento dei file"
 
-#: src/cmd_db.cc:697 src/database_check.cc:165
+#: src/cmd_db.cc:697
+#: src/database_check.cc:165
 msgid "files"
 msgstr "file"
 
 #: src/cmd_db.cc:713
-msgid "load all certs from the database"
+#, fuzzy
+msgid "Load all certs from the database"
 msgstr "carica tutti i certificati dal database"
 
 #: src/cmd_db.cc:714
-msgid ""
-"This command loads all certs from the database and is intended to be used "
-"for timing cert loading performance."
-msgstr ""
-"Questo comando carica tutti i certificati dal database e è progettato per "
-"calcolare il tempo di esecuzione del caricamento certificati."
+msgid "This command loads all certs from the database and is intended to be used for timing cert loading performance."
+msgstr "Questo comando carica tutti i certificati dal database e è progettato per calcolare il tempo di esecuzione del caricamento certificati."
 
-#: src/cmd_db.cc:721 src/database.cc:1314
+#: src/cmd_db.cc:721
+#: src/database.cc:1315
 #, c-format
 msgid "loading certs"
 msgstr "caricamento certificati"
@@ -2366,25 +2315,30 @@ msgstr "selezionate più di due revision
 msgstr "selezionate più di due revisioni"
 
 #: src/cmd_diff_log.cc:250
-#, c-format
-msgid "--reverse only allowed with exactly one revision"
+#, fuzzy, c-format
+msgid "'--reverse' only allowed with exactly one revision"
 msgstr "--reverse permesso soltanto con una precisa revisione"
 
 #: src/cmd_diff_log.cc:263
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "this workspace has more than one parent\n"
-"(specify a revision to diff against with --revision)"
+"(specify a revision to diff against with '--revision')"
 msgstr ""
 "questo spazio di lavoro ha più di un genitore\n"
 "(specificare una revisione per confronto diff con --revision)"
 
-#: src/cmd_diff_log.cc:407 src/rev_output.cc:147
+#: src/cmd_diff_log.cc:407
+#: src/rev_output.cc:147
 msgid "no changes"
 msgstr "nessun cambiamento"
 
-#: src/cmd_diff_log.cc:416 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:776
-#: src/cmd_ws_commit.cc:818 src/cmd_ws_commit.cc:890 src/cmd_ws_commit.cc:1808
+#: src/cmd_diff_log.cc:416
+#: src/cmd_ws_commit.cc:538
+#: src/cmd_ws_commit.cc:776
+#: src/cmd_ws_commit.cc:818
+#: src/cmd_ws_commit.cc:890
+#: src/cmd_ws_commit.cc:1808
 #: src/automate.cc:1019
 msgid "[PATH]..."
 msgstr "[PERCORSO…]"
@@ -2402,69 +2356,66 @@ msgstr ""
 "Se viene data una revisione, viene mostra la differenza tra lo spazio di lavoro e quella revisione.  Se vengono date due revisioni, viene mostrata la differenza tra loro.  Se non viene specificato nessun formato, per default ne viene usato uno unificato."
 
 #: src/cmd_diff_log.cc:429
-#, c-format
-msgid ""
-"--diff-args requires --external\n"
-"try adding --external or removing --diff-args?"
+#, fuzzy, c-format
+msgid "'--diff-args' requires '--external'; try adding '--external' or remove '--diff-args'"
 msgstr ""
 "‘--diff-args’ richiede ‘--external’\n"
 "prova ad aggiungere ‘--external’ o togliere ‘--diff-args’"
 
-#: src/cmd_diff_log.cc:463
+#: src/cmd_diff_log.cc:462
 msgid "[FILE [...]]"
 msgstr "[FILE […]]"
 
-#: src/cmd_diff_log.cc:464
+#: src/cmd_diff_log.cc:463
 msgid "Calculates diffs of files"
 msgstr "Calcola le differenze tra file"
 
-#: src/cmd_diff_log.cc:644
-#, c-format
-msgid "only one of --last/--next allowed"
+#: src/cmd_diff_log.cc:643
+#, fuzzy, c-format
+msgid "only one of '--last'/'--next' allowed"
 msgstr "solo un comando permesso tra ‘--last’ e ‘--next’"
 
-#: src/cmd_diff_log.cc:661
-#, c-format
-msgid "try passing a --from revision to start at"
+#: src/cmd_diff_log.cc:660
+#, fuzzy, c-format
+msgid "try passing a '--from' revision to start at"
 msgstr "prova a specificare una revisione da cui partire con ‘--from’"
 
-#: src/cmd_diff_log.cc:670
+#: src/cmd_diff_log.cc:669
 #, c-format
-msgid ""
-"workspace parent revision '%s' not found - did you specify a wrong database?"
+msgid "workspace has no parent revision, probably an empty branch"
 msgstr ""
-"revisione genitore dello spazio di lavoro ‘%s’ non trovata - hai specificato"
-" un database sbagliato?"
 
-#: src/cmd_diff_log.cc:955
+#: src/cmd_diff_log.cc:672
+#, fuzzy, c-format
+msgid "workspace parent revision %s not found - did you specify a wrong database?"
+msgstr "revisione genitore dello spazio di lavoro ‘%s’ non trovata - hai specificato un database sbagliato?"
+
+#: src/cmd_diff_log.cc:958
 #, c-format
 msgid "(Revision: %s)"
 msgstr "(Revisione: %s)"
 
-#: src/cmd_diff_log.cc:977 src/cmd_diff_log.cc:991
+#: src/cmd_diff_log.cc:980
+#: src/cmd_diff_log.cc:994
 msgid "[PATH] ..."
 msgstr "[PERCORSO] …"
 
-#: src/cmd_diff_log.cc:978
+#: src/cmd_diff_log.cc:981
 msgid "Prints selected history in forward or reverse order"
 msgstr "Stampa la storia selezionata in ordine diretto o inverso"
 
-#: src/cmd_diff_log.cc:979
-msgid ""
-"This command prints selected history in forward or reverse order, filtering "
-"it by PATH if given."
-msgstr ""
-"Questo comando stampa lo storico in ordine diretto o inverso, filtrato da "
-"FILE se specificato."
+#: src/cmd_diff_log.cc:982
+msgid "This command prints selected history in forward or reverse order, filtering it by PATH if given."
+msgstr "Questo comando stampa lo storico in ordine diretto o inverso, filtrato da FILE se specificato."
 
-#: src/cmd_diff_log.cc:992
+#: src/cmd_diff_log.cc:995
 msgid "Lists the selected revision history"
-msgstr ""
+msgstr "elenca la storia della revisione selezionata"
 
 #: src/cmd_ws_commit.cc:179
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"A backup from a previously failed commit exists in _MTN/commit.\n"
+"a backup from a previously failed commit exists in '_MTN/commit'.\n"
 "This file must be removed before commit will proceed.\n"
 "You may recover the previous message from this file if necessary."
 msgstr ""
@@ -2492,15 +2443,19 @@ msgstr "*** RIMUOVERE QUESTA LINEA PER C
 msgid "*** REMOVE THIS LINE TO CANCEL THE COMMIT ***\n"
 msgstr "*** RIMUOVERE QUESTA LINEA PER CANCELLARE IL COMMIT ***\n"
 
-#: src/cmd_ws_commit.cc:192 src/rev_output.cc:95
+#: src/cmd_ws_commit.cc:192
+#: src/rev_output.cc:95
 msgid "Branch:   "
 msgstr "Ramo:     "
 
-#: src/cmd_ws_commit.cc:193 src/rev_output.cc:79
+#: src/cmd_ws_commit.cc:193
+#: src/rev_output.cc:79
 msgid "Author:   "
 msgstr "Autore:   "
 
-#: src/cmd_ws_commit.cc:194 src/rev_output.cc:85 src/rev_output.cc:89
+#: src/cmd_ws_commit.cc:194
+#: src/rev_output.cc:85
+#: src/rev_output.cc:89
 msgid "Date:     "
 msgstr "Data:     "
 
@@ -2509,19 +2464,23 @@ msgstr "il formato data‘%s’ non può
 msgid "date format '%s' cannot be parsed; using default instead"
 msgstr "il formato data‘%s’ non può essere interpretato; utilizzo il default"
 
-#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:985
+#: src/cmd_ws_commit.cc:237
+#: src/cmd_ws_commit.cc:985
 msgid "*** THIS REVISION WILL CREATE A NEW BRANCH ***"
 msgstr "*** QUESTA REVISIONE CREERÀ UN NUOVO RAMO ***"
 
-#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:988
+#: src/cmd_ws_commit.cc:240
+#: src/cmd_ws_commit.cc:988
 msgid "Old Branch: "
 msgstr "Ramo vecchio: "
 
-#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:989
+#: src/cmd_ws_commit.cc:241
+#: src/cmd_ws_commit.cc:989
 msgid "New Branch: "
 msgstr "Ramo nuovo: "
 
-#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1000
+#: src/cmd_ws_commit.cc:252
+#: src/cmd_ws_commit.cc:1000
 msgid "*** THIS REVISION WILL CREATE DIVERGENCE ***"
 msgstr "*** QUESTA REVISIONE CREERÀ UNA DIVERGENZA ***"
 
@@ -2531,43 +2490,43 @@ msgstr "modifica del messaggio di log fa
 msgstr "modifica del messaggio di log fallita"
 
 #: src/cmd_ws_commit.cc:289
-#, c-format
-msgid "Commit cancelled."
+#, fuzzy, c-format
+msgid "commit cancelled."
 msgstr "Commit cancellato."
 
 #: src/cmd_ws_commit.cc:307
-#, c-format
-msgid "Commit failed. Instructions not found."
+#, fuzzy, c-format
+msgid "commit failed. Instructions not found."
 msgstr "Commit fallito. Istruzioni non trovate."
 
 #: src/cmd_ws_commit.cc:312
-#, c-format
-msgid "Commit failed. Branch header not found."
+#, fuzzy, c-format
+msgid "commit failed. Branch header not found."
 msgstr "Commit fallito. Valore del ramo non trovato."
 
 #: src/cmd_ws_commit.cc:317
-#, c-format
-msgid "Commit failed. Branch value empty."
+#, fuzzy, c-format
+msgid "commit failed. Branch value empty."
 msgstr "Commit fallito. Valore del ramo vuoto."
 
 #: src/cmd_ws_commit.cc:324
-#, c-format
-msgid "Commit failed. Author header not found."
+#, fuzzy, c-format
+msgid "commit failed. Author header not found."
 msgstr "Commit fallito. Intestazione autore non trovato."
 
 #: src/cmd_ws_commit.cc:329
-#, c-format
-msgid "Commit failed. Author value empty."
+#, fuzzy, c-format
+msgid "commit failed. Author value empty."
 msgstr "Commit fallito. Valore autore vuoto."
 
 #: src/cmd_ws_commit.cc:334
-#, c-format
-msgid "Commit failed. Date header not found."
+#, fuzzy, c-format
+msgid "commit failed. Date header not found."
 msgstr "Commit fallito. Data intestazione non trovata."
 
 #: src/cmd_ws_commit.cc:339
-#, c-format
-msgid "Commit failed. Date value empty."
+#, fuzzy, c-format
+msgid "commit failed. Date value empty."
 msgstr "Commit fallito. Valore data vuoto."
 
 #: src/cmd_ws_commit.cc:362
@@ -2586,13 +2545,13 @@ msgstr "recupero ‘%s’"
 msgstr "recupero ‘%s’"
 
 #: src/cmd_ws_commit.cc:485
-#, c-format
-msgid "no file version %s found in database for %s"
+#, fuzzy, c-format
+msgid "no file version %s found in database for '%s'"
 msgstr "nessun file con versione ‘%s’ trovato per ‘%s’ in database"
 
 #: src/cmd_ws_commit.cc:499
-#, c-format
-msgid "recreating %s/"
+#, fuzzy, c-format
+msgid "recreating '%s/'"
 msgstr "ri-creo ‘%s/’"
 
 #: src/cmd_ws_commit.cc:539
@@ -2600,9 +2559,9 @@ msgstr "Recupera file e/o directory"
 msgstr "Recupera file e/o directory"
 
 #: src/cmd_ws_commit.cc:540
-msgid "In order to revert the entire workspace, specify \".\" as the file name."
-msgstr ""
-"Per recuperare l'intero spazio di lavoro, specifica ‘.’ come nome file."
+#, fuzzy
+msgid "In order to revert the entire workspace, specify '.' as the file name."
+msgstr "Per recuperare l'intero spazio di lavoro, specifica ‘.’ come nome file."
 
 #: src/cmd_ws_commit.cc:547
 msgid "PATH..."
@@ -2613,19 +2572,18 @@ msgstr "Inverte un 'drop' sbagliato"
 msgstr "Inverte un 'drop' sbagliato"
 
 #: src/cmd_ws_commit.cc:549
-msgid ""
-"If the file was deleted from the workspace, this is the same as 'revert'. "
-"Otherwise, it just removes the 'drop' from the manifest."
-msgstr ""
-"Se il file era stato cancellato dallo spazio di lavoro, questo è lo stesso "
-"come 'revert'. Altrimenti, solo rimuove il 'drop' dal manifesto."
+msgid "If the file was deleted from the workspace, this is the same as 'revert'. Otherwise, it just removes the 'drop' from the manifest."
+msgstr "Se il file era stato cancellato dallo spazio di lavoro, questo è lo stesso come 'revert'. Altrimenti, solo rimuove il 'drop' dal manifesto."
 
-#: src/cmd_ws_commit.cc:566 src/cmd_ws_commit.cc:575
+#: src/cmd_ws_commit.cc:566
+#: src/cmd_ws_commit.cc:575
 #, c-format
 msgid "revision %s it not a child of %s, cannot invert"
 msgstr "la revisione %s non è figlia di %s, impossibile invertire"
 
-#: src/cmd_ws_commit.cc:571 src/cmd_ws_commit.cc:610 src/cmd_ws_commit.cc:650
+#: src/cmd_ws_commit.cc:571
+#: src/cmd_ws_commit.cc:610
+#: src/cmd_ws_commit.cc:650
 #, c-format
 msgid "revision %s has %d parents, cannot invert"
 msgstr "la revisione %s ha %d genitori, impossibile invertire"
@@ -2638,27 +2596,24 @@ msgstr "Disapprova una specifica revisio
 msgid "Disapproves a particular revision or revision range"
 msgstr "Disapprova una specifica revisione o intervallo di revisioni"
 
-#: src/cmd_ws_commit.cc:615 src/cmd_ws_commit.cc:655
-#, c-format
-msgid "need --branch argument for disapproval"
+#: src/cmd_ws_commit.cc:615
+#: src/cmd_ws_commit.cc:655
+#, fuzzy, c-format
+msgid "need '--branch' argument for disapproval"
 msgstr "per ‘disapprove’ è necessario un argomento ‘--branch=RAMO’"
 
 #: src/cmd_ws_commit.cc:638
 #, c-format
 msgid "revisions %s and %s do not share common history, cannot invert"
-msgstr ""
-"le revisioni %s e %s non condividono una comune storia, non posso invertire"
+msgstr "le revisioni %s e %s non condividono una comune storia, non posso invertire"
 
 #: src/cmd_ws_commit.cc:641
 #, c-format
-msgid ""
-"revisions share common history, but %s is not an ancestor of %s, cannot "
-"invert"
-msgstr ""
-"le revisioni hanno una storia comune, ma %s non è antenata di %s, "
-"impossibile invertire"
+msgid "revisions share common history, but %s is not an ancestor of %s, cannot invert"
+msgstr "le revisioni hanno una storia comune, ma %s non è antenata di %s, impossibile invertire"
 
-#: src/cmd_ws_commit.cc:702 src/cmd_ws_commit.cc:1771
+#: src/cmd_ws_commit.cc:702
+#: src/cmd_ws_commit.cc:1771
 #, c-format
 msgid ""
 "note: this revision creates divergence\n"
@@ -2681,8 +2636,8 @@ msgstr "la directory ‘%s’ esiste giÃ
 msgstr "la directory ‘%s’ esiste già"
 
 #: src/cmd_ws_commit.cc:735
-#, c-format
-msgid "ignoring directory '%s' [see .mtn-ignore]"
+#, fuzzy, c-format
+msgid "ignoring directory '%s' (see '.mtn-ignore')"
 msgstr "ignoro la directory ‘%s’ [cfr. ‘.mtn-ignore’]"
 
 #: src/cmd_ws_commit.cc:777
@@ -2706,8 +2661,8 @@ msgstr "Rinomina elementi dello spazio d
 msgstr "Rinomina elementi dello spazio di lavoro"
 
 #: src/cmd_ws_commit.cc:862
-#, c-format
-msgid "The specified target directory %s/ doesn't exist."
+#, fuzzy, c-format
+msgid "the specified target directory '%s/' doesn't exist."
 msgstr "La directory di destinazione specificata ‘%s/’ non esiste."
 
 #: src/cmd_ws_commit.cc:868
@@ -2719,9 +2674,10 @@ msgstr "Rinomina la directory root"
 msgstr "Rinomina la directory root"
 
 #: src/cmd_ws_commit.cc:870
+#, fuzzy
 msgid ""
 "After this command, the directory that currently has the name NEW_ROOT will be the root directory, and the directory that is currently the root directory will have name PUT_OLD.\n"
-"Use of --bookkeep-only is NOT recommended."
+"Use of '--bookkeep-only' is NOT recommended."
 msgstr ""
 "Dopo l'esecuzione di questo comando, la directory che attualmente si chiama NUOVA_ROOT sarà la directory di root e la root attuale avrà il nome VECCHIA_ROOT.\n"
 "L'uso di ‘--bookkeep-only’ NON è raccomandato."
@@ -2736,17 +2692,20 @@ msgstr "bisezione dalla revisione %s in 
 msgstr "bisezione dalla revisione %s in corso"
 
 #: src/cmd_ws_commit.cc:1024
-#, c-format
-msgid "use --revision or --branch to specify what to checkout"
-msgstr ""
-"utilizza ‘--revision’ o ‘--branch’ per specificare cosa estrarre con il "
-"checkout"
+#, fuzzy, c-format
+msgid "use '--revision' or '--branch' to specify what to checkout"
+msgstr "utilizza ‘--revision’ o ‘--branch’ per specificare cosa estrarre con il checkout"
 
 #: src/cmd_ws_commit.cc:1037
 #, c-format
 msgid "choose one with '%s checkout -r<id>'"
 msgstr "scegline una con ‘%s checkout -r<id>’"
 
+#: src/cmd_ws_commit.cc:1054
+#, c-format
+msgid "revision %s is not a member of branch %s"
+msgstr "la revisione %s non fa parte del ramo ‘%s’"
+
 #: src/cmd_ws_commit.cc:1071
 #, c-format
 msgid "you must specify a destination directory"
@@ -2755,27 +2714,24 @@ msgid "checkout directory '%s' already e
 #: src/cmd_ws_commit.cc:1084
 #, c-format
 msgid "checkout directory '%s' already exists"
-msgstr ""
-"la directory ‘%s’ esiste già, non può essere utilizzata per il ‘checkout’"
+msgstr "la directory ‘%s’ esiste già, non può essere utilizzata per il ‘checkout’"
 
-#: src/cmd_ws_commit.cc:1111 src/cmd_ws_commit.cc:1125
-#: src/cmd_ws_commit.cc:1821 src/cmd_ws_commit.cc:1978
+#: src/cmd_ws_commit.cc:1111
+#: src/cmd_ws_commit.cc:1125
+#: src/cmd_ws_commit.cc:1821
+#: src/cmd_ws_commit.cc:1978
 msgid "[DIRECTORY]"
 msgstr "[DIRECTORY]"
 
-#: src/cmd_ws_commit.cc:1112 src/cmd_ws_commit.cc:1126
+#: src/cmd_ws_commit.cc:1112
+#: src/cmd_ws_commit.cc:1126
 msgid "Checks out a revision from the database into a directory"
 msgstr "Estrae in una directory una revisione presente in database"
 
-#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
-msgid ""
-"If a revision is given, that's the one that will be checked out.  Otherwise,"
-" it will be the head of the branch (given or implicit).  If no directory is "
-"given, the branch name will be used as directory."
-msgstr ""
-"Se viene data una revisione, sarà quella ad essere checkout. Altrimenti sarà"
-" la testa del ramo (data o implicita). Se nessuna directory è data, il nome "
-"del ramo sarà usato come directory"
+#: src/cmd_ws_commit.cc:1113
+#: src/cmd_ws_commit.cc:1127
+msgid "If a revision is given, that's the one that will be checked out.  Otherwise, it will be the head of the branch (given or implicit).  If no directory is given, the branch name will be used as directory."
+msgstr "Se viene data una revisione, sarà quella ad essere checkout. Altrimenti sarà la testa del ramo (data o implicita). Se nessuna directory è data, il nome del ramo sarà usato come directory"
 
 #: src/cmd_ws_commit.cc:1137
 #, c-format
@@ -2788,21 +2744,23 @@ msgid "This command is used to set, get 
 
 #: src/cmd_ws_commit.cc:1144
 msgid "This command is used to set, get or drop file attributes."
-msgstr ""
-"Questo comando serve a impostare, leggere o eliminare attributi dei file."
+msgstr "Questo comando serve a impostare, leggere o eliminare attributi dei file."
 
-#: src/cmd_ws_commit.cc:1163 src/cmd_ws_commit.cc:1231
-#: src/cmd_ws_commit.cc:1281 src/cmd_ws_commit.cc:1362
-#, c-format
-msgid "Unknown path '%s'"
+#: src/cmd_ws_commit.cc:1163
+#: src/cmd_ws_commit.cc:1231
+#: src/cmd_ws_commit.cc:1281
+#: src/cmd_ws_commit.cc:1362
+#, fuzzy, c-format
+msgid "unknown path '%s'"
 msgstr "Percorso sconosciuto ‘%s’"
 
 #: src/cmd_ws_commit.cc:1180
-#, c-format
-msgid "Path '%s' does not have attribute '%s'"
+#, fuzzy, c-format
+msgid "path '%s' does not have attribute '%s'"
 msgstr "Il percorso ‘%s’ non ha l'attributo ‘%s’"
 
-#: src/cmd_ws_commit.cc:1199 src/cmd_ws_commit.cc:1212
+#: src/cmd_ws_commit.cc:1199
+#: src/cmd_ws_commit.cc:1212
 msgid "PATH [ATTR]"
 msgstr "PATH [ATTR]"
 
@@ -2811,37 +2769,25 @@ msgstr "Elimina attributi da un file"
 msgstr "Elimina attributi da un file"
 
 #: src/cmd_ws_commit.cc:1201
-msgid ""
-"If no attribute is specified, this command removes all attributes attached "
-"to the file given in PATH.  Otherwise only removes the attribute specified "
-"in ATTR."
-msgstr ""
-"Se non è specificato alcun attributo, questo comando rimuove tutti gli "
-"attributi del file PERCORSO.  Altrimenti rimuove solo l'attributo "
-"specificato in ATTR."
+msgid "If no attribute is specified, this command removes all attributes attached to the file given in PATH.  Otherwise only removes the attribute specified in ATTR."
+msgstr "Se non è specificato alcun attributo, questo comando rimuove tutti gli attributi del file PERCORSO.  Altrimenti rimuove solo l'attributo specificato in ATTR."
 
 #: src/cmd_ws_commit.cc:1213
 msgid "Gets the values of a file's attributes"
 msgstr "Lettura degli attributi di un file"
 
 #: src/cmd_ws_commit.cc:1214
-msgid ""
-"If no attribute is specified, this command prints all attributes attached to"
-" the file given in PATH.  Otherwise it only prints the attribute specified "
-"in ATTR."
-msgstr ""
-"Se non è specificato alcun attributo, questo comando stampa tutti gli "
-"attributi del file PERCORSO.  Altrimenti stampa solo l'attributo specificato"
-" in ATTR."
+msgid "If no attribute is specified, this command prints all attributes attached to the file given in PATH.  Otherwise it only prints the attribute specified in ATTR."
+msgstr "Se non è specificato alcun attributo, questo comando stampa tutti gli attributi del file PERCORSO.  Altrimenti stampa solo l'attributo specificato in ATTR."
 
 #: src/cmd_ws_commit.cc:1247
-#, c-format
-msgid "No attributes for '%s'"
+#, fuzzy, c-format
+msgid "no attributes for '%s'"
 msgstr "Nessun attributo per ‘%s’"
 
 #: src/cmd_ws_commit.cc:1259
-#, c-format
-msgid "No attribute '%s' on path '%s'"
+#, fuzzy, c-format
+msgid "no attribute '%s' on path '%s'"
 msgstr "Nessun attributo ‘%s’ nel percorso ‘%s’"
 
 #: src/cmd_ws_commit.cc:1305
@@ -2853,14 +2799,12 @@ msgstr "Imposta un attributo su un file"
 msgstr "Imposta un attributo su un file"
 
 #: src/cmd_ws_commit.cc:1307
-msgid ""
-"Sets the attribute given on ATTR to the value specified in VALUE for the "
-"file mentioned in PATH."
-msgstr ""
-"Imposta l'attributo dato in ATTR al valore specificato in VALORE per il file"
-" PERCORSO."
+msgid "Sets the attribute given on ATTR to the value specified in VALUE for the file mentioned in PATH."
+msgstr "Imposta l'attributo dato in ATTR al valore specificato in VALORE per il file PERCORSO."
 
-#: src/cmd_ws_commit.cc:1336 src/cmd_files.cc:138 src/cmd_files.cc:233
+#: src/cmd_ws_commit.cc:1336
+#: src/cmd_files.cc:138
+#: src/cmd_files.cc:233
 msgid "PATH"
 msgstr "PERCORSO"
 
@@ -2890,11 +2834,11 @@ msgstr "nessuna modifica per il commit"
 msgstr "nessuna modifica per il commit"
 
 #: src/cmd_ws_commit.cc:1534
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "parent revisions of this commit are in different branches:\n"
 "'%s' and '%s'.\n"
-"please specify a branch name for the commit, with --branch."
+"Please specify a branch name for the commit, with '--branch'."
 msgstr ""
 "le revisioni genitori di questo commit sono in rami differenti:\n"
 "‘%s’ e ‘%s’.\n"
@@ -2906,11 +2850,11 @@ msgstr "modifiche respinte dall'hook: %s
 msgstr "modifiche respinte dall'hook: %s"
 
 #: src/cmd_ws_commit.cc:1570
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"_MTN/log is non-empty and log message was specified on command line\n"
-"perhaps move or delete _MTN/log,\n"
-"or remove --message/--message-file from the command line?"
+"'_MTN/log' is non-empty and log message was specified on command line.\n"
+"Perhaps move or delete '_MTN/log',\n"
+"or remove '--message'/'--message-file' from the command line?"
 msgstr ""
 "‘_MTN/log’ non è vuoto e un messaggio di log è stato specificato sulla riga di comando\n"
 "forse vuoi muovere o cancellare ‘_MTN/log’ oppure\n"
@@ -2936,14 +2880,15 @@ msgstr "la revisione %s è già nel data
 msgid "revision %s already in database"
 msgstr "la revisione %s è già nel database"
 
-#: src/cmd_ws_commit.cc:1695 src/cmd_ws_commit.cc:1725
+#: src/cmd_ws_commit.cc:1695
+#: src/cmd_ws_commit.cc:1725
 #, c-format
 msgid "file '%s' modified during commit, aborting"
 msgstr "file ‘%s’ modificato durante il commit, abbandono"
 
 #: src/cmd_ws_commit.cc:1706
-#, c-format
-msgid "Your database is missing version %s of file '%s'"
+#, fuzzy, c-format
+msgid "your database is missing version %s of file '%s'"
 msgstr "Nel tuo database manca la versione %s del file ‘%s’"
 
 #: src/cmd_ws_commit.cc:1764
@@ -2964,8 +2909,8 @@ msgstr "Se non è specificata alcuna dir
 msgstr "Se non è specificata alcuna directory, usa la directory attuale."
 
 #: src/cmd_ws_commit.cc:1830
-#, c-format
-msgid "need --branch argument for setup"
+#, fuzzy, c-format
+msgid "need '--branch' argument for setup"
 msgstr "per ‘setup’ è necessario un argomento ‘--branch=RAMO’"
 
 #: src/cmd_ws_commit.cc:1868
@@ -2982,12 +2927,9 @@ msgstr "devi specificare la directory da
 msgstr "devi specificare la directory da importare"
 
 #: src/cmd_ws_commit.cc:1903
-#, c-format
-msgid ""
-"use --revision or --branch to specify the parent revision for the import"
-msgstr ""
-"utilizza ‘--revision’ o ‘--branch’ per specificare la revisione di cui la "
-"revisione importata sarà figlia"
+#, fuzzy, c-format
+msgid "use '--revision' or '--branch' to specify the parent revision for the import"
+msgstr "utilizza ‘--revision’ o ‘--branch’ per specificare la revisione di cui la revisione importata sarà figlia"
 
 #: src/cmd_ws_commit.cc:1914
 #, c-format
@@ -3010,9 +2952,7 @@ msgid "If no directory is given, default
 
 #: src/cmd_ws_commit.cc:1980
 msgid "If no directory is given, defaults to the current workspace."
-msgstr ""
-"Se non è specificata nessuna directory, verrà utilizzato lo spazio di lavoro"
-" attuale."
+msgstr "Se non è specificata nessuna directory, verrà utilizzato lo spazio di lavoro attuale."
 
 #: src/cmd_ws_commit.cc:2004
 msgid "Refreshes the inodeprint cache"
@@ -3020,41 +2960,31 @@ msgid "Search revisions to find where a 
 
 #: src/cmd_ws_commit.cc:2015
 msgid "Search revisions to find where a change first appeared"
-msgstr ""
-"Cerca revisioni per trovare dove un cambiamentoè apparso per la prima volta"
+msgstr "Cerca revisioni per trovare dove un cambiamentoè apparso per la prima volta"
 
 #: src/cmd_ws_commit.cc:2016
-msgid ""
-"These commands subdivide a set of revisions into good, bad and untested "
-"subsets and successively narrow the untested set to find the first revision "
-"that introduced some change."
-msgstr ""
+msgid "These commands subdivide a set of revisions into good, bad and untested subsets and successively narrow the untested set to find the first revision that introduced some change."
+msgstr "Questi comandi suddividono una serie di revisioni in cattive , buone e in sottoserie non-testate e successivamente restringe la serie non-testate per trovare la prima revisione che introduce qualche cambiamento"
 
 #: src/cmd_ws_commit.cc:2021
 msgid "Reset the current bisection search"
 msgstr "Resetta l'attuale ricerca con bisezione"
 
 #: src/cmd_ws_commit.cc:2022
-msgid ""
-"Update the workspace back to the revision from which the bisection was "
-"started and remove all current search information, allowing a new search to "
-"be started."
-msgstr ""
-"Aggiorna lo spazio di lavoro riportandolo alla versione dalla quale era "
-"iniziata la besezione e rimuove ogni informazione di ricerca corrente, "
-"permettendo di cominciare una nuova ricerca."
+msgid "Update the workspace back to the revision from which the bisection was started and remove all current search information, allowing a new search to be started."
+msgstr "Aggiorna lo spazio di lavoro riportandolo alla versione dalla quale era iniziata la besezione e rimuove ogni informazione di ricerca corrente, permettendo di cominciare una nuova ricerca."
 
-#: src/cmd_ws_commit.cc:2037 src/cmd_ws_commit.cc:2093
+#: src/cmd_ws_commit.cc:2037
+#: src/cmd_ws_commit.cc:2093
 #, c-format
 msgid "no bisection in progress"
 msgstr "nessuna bisezione in corso"
 
-#: src/cmd_ws_commit.cc:2052 src/cmd_ws_commit.cc:2280
+#: src/cmd_ws_commit.cc:2052
+#: src/cmd_ws_commit.cc:2280
 #, c-format
 msgid "this command can only be used in a workspace with no pending changes"
-msgstr ""
-"questo comando può essere usato solamente in spazio di lavoro senza "
-"cambiamenti in sospeso"
+msgstr "questo comando può essere usato solamente in spazio di lavoro senza cambiamenti in sospeso"
 
 #: src/cmd_ws_commit.cc:2058
 #, c-format
@@ -3063,22 +2993,18 @@ msgstr "riportato a %s"
 
 #: src/cmd_ws_commit.cc:2124
 #, c-format
-msgid ""
-"bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to "
-"start search"
-msgstr ""
+msgid "bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to start search"
+msgstr "bisezione di revisioni; %d buone; %d cattive; %d saltate; specificare le revisioni buone per iniziare la ricerca"
 
 #: src/cmd_ws_commit.cc:2130
 #, c-format
-msgid ""
-"bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to "
-"start search"
-msgstr ""
+msgid "bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to start search"
+msgstr "bisezione di revisioni; %d buone; %d cattive; %d saltate; specificare le revisioni cattive e iniziare la ricerca"
 
 #: src/cmd_ws_commit.cc:2193
 #, c-format
 msgid "bisecting %d revisions; %d good; %d bad; %d skipped; %d remaining"
-msgstr ""
+msgstr "bisezione di %d revisioni; %d buone; %d cattive; %d saltate; %d restanti"
 
 #: src/cmd_ws_commit.cc:2211
 #, c-format
@@ -3107,15 +3033,11 @@ msgid "Reports on the current status of 
 
 #: src/cmd_ws_commit.cc:2368
 msgid "Reports on the current status of the bisection search"
-msgstr ""
+msgstr "Segnala lo stato corrente della ricerca di bisezione"
 
 #: src/cmd_ws_commit.cc:2369
-msgid ""
-"Lists the total number of revisions in the search set, the number of "
-"revisions that have been determined to be good or bad, the number of "
-"revisions that have been skipped and the number of revisions remaining to be"
-" tested."
-msgstr ""
+msgid "Lists the total number of revisions in the search set, the number of revisions that have been determined to be good or bad, the number of revisions that have been skipped and the number of revisions remaining to be tested."
+msgstr "Elenca il numero totale di revisioni nella serie ricerca; il numero di revisioni che sono state definite buone o cattive; il numero di revisioni che sono state saltate e il numero di revisioni che devono ancora essere testate"
 
 #: src/cmd_ws_commit.cc:2397
 #, c-format
@@ -3130,33 +3052,23 @@ msgid "run 'bisect update' to update to 
 #: src/cmd_ws_commit.cc:2399
 #, c-format
 msgid "run 'bisect update' to update to this revision before testing"
-msgstr ""
-"esequi  'bisect update' per aggiornare questa revisione prima di verificare"
+msgstr "esequi  'bisect update' per aggiornare questa revisione prima di verificare"
 
 #: src/cmd_ws_commit.cc:2404
 msgid "Updates the workspace to the next revision to be tested by bisection"
-msgstr ""
-"Aggiorna lo spazio di lavoro alla prossima revisione per essere verificato "
-"dalla bisezione"
+msgstr "Aggiorna lo spazio di lavoro alla prossima revisione per essere verificato dalla bisezione"
 
 #: src/cmd_ws_commit.cc:2405
-msgid ""
-"This command can be used if updates by good, bad or skip commands fail due "
-"to blocked paths or other problems."
-msgstr ""
-"Questo comando può essere usato se falliscono aggiurnamenti da buoni, "
-"cattivi o tralasciati comandi dovuti a percorsi bloccati o da altri "
-"problemi."
+msgid "This command can be used if updates by good, bad or skip commands fail due to blocked paths or other problems."
+msgstr "Questo comando può essere usato se falliscono aggiurnamenti da buoni, cattivi o tralasciati comandi dovuti a percorsi bloccati o da altri problemi."
 
 #: src/cmd_ws_commit.cc:2415
 msgid "Excludes the current revision or specified revisions from the search"
 msgstr "Esclude dalla ricerca la revisione attuale o revisioni speficate"
 
 #: src/cmd_ws_commit.cc:2416
-msgid ""
-"Skipped revisions are removed from the set being searched. Revisions that "
-"cannot be tested for some reason should be skipped."
-msgstr ""
+msgid "Skipped revisions are removed from the set being searched. Revisions that cannot be tested for some reason should be skipped."
+msgstr "Le revisioni saltate vengono remosse dalla serie ricercata. Le revisioni che non possono essere testate per qualsiasi ragione devono essere saltate."
 
 #: src/cmd_ws_commit.cc:2426
 msgid "Marks the current revision or specified revisions as bad"
@@ -3164,8 +3076,7 @@ msgid "Known bad revisions are removed f
 
 #: src/cmd_ws_commit.cc:2427
 msgid "Known bad revisions are removed from the set being searched."
-msgstr ""
-"Cattive revisioni conosciute vengono rimosse dall'nsieme che viene ricercato"
+msgstr "Cattive revisioni conosciute vengono rimosse dall'nsieme che viene ricercato"
 
 #: src/cmd_ws_commit.cc:2436
 msgid "Marks the current revision or specified revisions as good"
@@ -3173,8 +3084,7 @@ msgid "Known good revisions are removed 
 
 #: src/cmd_ws_commit.cc:2437
 msgid "Known good revisions are removed from the set being searched."
-msgstr ""
-"Buone revisioni conosciute vengono rimosse dall'nsieme che viene ricercato"
+msgstr "Buone revisioni conosciute vengono rimosse dall'nsieme che viene ricercato"
 
 #: src/cmd_othervcs.cc:28
 msgid "RCSFILE..."
@@ -3185,12 +3095,8 @@ msgstr "Analizzo i file RCS"
 msgstr "Analizzo i file RCS"
 
 #: src/cmd_othervcs.cc:30
-msgid ""
-"This command doesn't reconstruct or import revisions.  You probably want to "
-"use cvs_import."
-msgstr ""
-"Questo comando non ricostruisce o importa intere revisioni; a tal fine usare"
-" ‘cvs_import’."
+msgid "This command doesn't reconstruct or import revisions.  You probably want to use cvs_import."
+msgstr "Questo comando non ricostruisce o importa intere revisioni; a tal fine usare ‘cvs_import’."
 
 #: src/cmd_othervcs.cc:43
 msgid "CVSROOT"
@@ -3201,13 +3107,13 @@ msgstr "Importa tutte le versioni di un 
 msgstr "Importa tutte le versioni di un repository CVS"
 
 #: src/cmd_othervcs.cc:56
-#, c-format
-msgid "need base --branch argument for importing"
+#, fuzzy, c-format
+msgid "need base '--branch' argument for importing"
 msgstr "l'argomento ‘--branch’ è necessario per l'importazione"
 
 #: src/cmd_othervcs.cc:60
-#, c-format
-msgid "path %s does not exist"
+#, fuzzy, c-format
+msgid "path '%s' does not exist"
 msgstr "il percorso ‘%s’ non esiste"
 
 #: src/cmd_othervcs.cc:73
@@ -3227,12 +3133,12 @@ msgid "importing revision marks from '%s
 #: src/cmd_othervcs.cc:106
 #, c-format
 msgid "importing revision marks from '%s'"
-msgstr ""
+msgstr "importa segni di revisione da %s"
 
 #: src/cmd_othervcs.cc:143
 #, c-format
 msgid "exporting revision marks to '%s'"
-msgstr ""
+msgstr "esporta segni di revisione in %s"
 
 #: src/cmd_automate.cc:41
 msgid "Interface for scripted execution"
@@ -3243,9 +3149,7 @@ msgstr "Stampa la versione dellinterfacc
 msgstr "Stampa la versione dellinterfaccia di automazione"
 
 #: src/cmd_automate.cc:132
-msgid ""
-"Emulates certain kinds of diagnostic / UI messages for debugging and testing"
-" purposes, such as stdio"
+msgid "Emulates certain kinds of diagnostic / UI messages for debugging and testing purposes, such as stdio"
 msgstr ""
 
 #: src/cmd_automate.cc:143
@@ -3268,25 +3172,23 @@ msgstr "Automatizza più comandi in una 
 msgstr "Automatizza più comandi in una sola esecuzione"
 
 #: src/cmd_automate.cc:305
-#, c-format
-msgid "directory %s is not a workspace"
+#, fuzzy, c-format
+msgid "directory '%s' is not a workspace"
 msgstr "la directory ‘%s’ non è uno spazio di lavoro"
 
 #: src/cmd_automate.cc:324
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"It is illegal to call the mtn_automate() lua extension,\n"
+"it is illegal to call the mtn_automate() lua extension,\n"
 "unless from a command function defined by register_command()."
 msgstr ""
 "Non è permesso chiamare l'estensione lua mtn_automate(),\n"
 "tranne che da un comando definito con register_command()."
 
 #: src/cmd_automate.cc:333
-#, c-format
-msgid "Bad input to mtn_automate() lua extension: command name is missing"
-msgstr ""
-"Input non valido per l'estensione lua mtn_automate(): manca il nome del "
-"comando"
+#, fuzzy, c-format
+msgid "bad input to mtn_automate() lua extension: command name is missing"
+msgstr "Input non valido per l'estensione lua mtn_automate(): manca il nome del comando"
 
 #: src/cmd_files.cc:39
 msgid "Loads a file's contents into the database"
@@ -3343,30 +3245,22 @@ msgstr "Stampa una copia annotata di un 
 msgstr "Stampa una copia annotata di un file"
 
 #: src/cmd_files.cc:140
-msgid ""
-"Calculates and prints an annotated copy of the given file from the specified"
-" REVISION."
-msgstr ""
-"Calcola e stampa una copia annotata del file dato dalla REVISIONE "
-"specificata."
+msgid "Calculates and prints an annotated copy of the given file from the specified REVISION."
+msgstr "Calcola e stampa una copia annotata del file dato dalla REVISIONE specificata."
 
 #: src/cmd_files.cc:172
 #, c-format
-msgid ""
-"with no revision selected, this command can only be used in a single-parent "
-"workspace"
-msgstr ""
-"con nessuna revisione selezionata, questo comando può essere usato solo in "
-"spazio di lavoro genitore-solo"
+msgid "with no revision selected, this command can only be used in a single-parent workspace"
+msgstr "con nessuna revisione selezionata, questo comando può essere usato solo in spazio di lavoro genitore-solo"
 
 #: src/cmd_files.cc:190
-#, c-format
-msgid "no such file '%s' in revision '%s'"
+#, fuzzy, c-format
+msgid "no such file '%s' in revision %s"
 msgstr "nessun file ‘%s’ trovato nella revisione %s"
 
 #: src/cmd_files.cc:194
-#, c-format
-msgid "'%s' in revision '%s' is not a file"
+#, fuzzy, c-format
+msgid "'%s' in revision %s is not a file"
 msgstr "‘%s’ della revisione %s non è un file"
 
 #: src/cmd_files.cc:202
@@ -3378,33 +3272,33 @@ msgstr "Calcola l'identità di un file o
 msgstr "Calcola l'identità di un file o di stdin"
 
 #: src/cmd_files.cc:204
-msgid ""
-"If any PATH is given, calculates their identity; otherwise, the one from the"
-" standard input is calculated."
-msgstr ""
-"Se è specificato un PERCORSO (o più di uno), ne calcola l'identificatore, in"
-" caso contrario calcola quello di stdin."
+msgid "If any PATH is given, calculates their identity; otherwise, the one from the standard input is calculated."
+msgstr "Se è specificato un PERCORSO (o più di uno), ne calcola l'identificatore, in caso contrario calcola quello di stdin."
 
 #: src/cmd_files.cc:234
 msgid "Prints the file identifier of a file"
 msgstr "Stampa l'identificatore di un file"
 
 #: src/cmd_files.cc:244
-#, c-format
-msgid "Cannot read from stdin"
+#, fuzzy, c-format
+msgid "cannot read from stdin"
 msgstr "Impossibile leggere da stdin"
 
-#: src/cmd_files.cc:258 src/cmd_files.cc:367 src/automate.cc:2070
+#: src/cmd_files.cc:258
+#: src/cmd_files.cc:367
+#: src/automate.cc:2070
 #, c-format
 msgid "no file version %s found in database"
 msgstr "nel database non è presente alcun file con versione ‘%s’"
 
-#: src/cmd_files.cc:280 src/cmd_files.cc:284
-#, c-format
-msgid "no file '%s' found in revision '%s'"
+#: src/cmd_files.cc:280
+#: src/cmd_files.cc:284
+#, fuzzy, c-format
+msgid "no file '%s' found in revision %s"
 msgstr "nessun file ‘%s’ trovato nella revisione %s"
 
-#: src/cmd_files.cc:291 src/cmd_files.cc:388
+#: src/cmd_files.cc:291
+#: src/cmd_files.cc:388
 msgid "FILENAME"
 msgstr "NOMEFILE"
 
@@ -3413,12 +3307,12 @@ msgstr "Stampa un file dal database"
 msgstr "Stampa un file dal database"
 
 #: src/cmd_files.cc:293
-msgid ""
-"Fetches the given file FILENAME from the database and prints it to the "
-"standard output."
+msgid "Fetches the given file FILENAME from the database and prints it to the standard output."
 msgstr "Legge il file NOMEFILE dal database e lo stampa su stdout"
 
-#: src/cmd_files.cc:330 src/cmd_files.cc:354 src/automate.cc:1652
+#: src/cmd_files.cc:330
+#: src/cmd_files.cc:354
+#: src/automate.cc:1652
 msgid "FILEID"
 msgstr "ID_FILE"
 
@@ -3439,11 +3333,13 @@ msgstr "Comandi per la risoluzione dei c
 msgstr "Comandi per la risoluzione dei conflitti"
 
 #: src/cmd_conflicts.cc:71
-#, c-format
-msgid "orphaned node %s"
+#, fuzzy, c-format
+msgid "orphaned node '%s'"
 msgstr "nodo orfano %s"
 
-#: src/cmd_conflicts.cc:76 src/cmd_conflicts.cc:103 src/cmd_conflicts.cc:143
+#: src/cmd_conflicts.cc:76
+#: src/cmd_conflicts.cc:103
+#: src/cmd_conflicts.cc:143
 #, c-format
 msgid "possible resolutions:"
 msgstr "possibili risoluzioni:"
@@ -3506,7 +3402,7 @@ msgid "content %s"
 #: src/cmd_conflicts.cc:138
 #, c-format
 msgid "content %s"
-msgstr ""
+msgstr "contenuto %s"
 
 #: src/cmd_conflicts.cc:144
 #, c-format
@@ -3528,19 +3424,27 @@ msgstr ""
 msgid "'%s' is not a supported conflict resolution for %s"
 msgstr ""
 
-#: src/cmd_conflicts.cc:250 src/cmd_conflicts.cc:255
+#: src/cmd_conflicts.cc:250
+#: src/cmd_conflicts.cc:255
 #, c-format
 msgid "too many arguments"
 msgstr "troppi parametri"
 
-#: src/cmd_conflicts.cc:260 src/cmd_conflicts.cc:276
+# non sono sicura
+#: src/cmd_conflicts.cc:260
+#: src/cmd_conflicts.cc:276
 #, c-format
 msgid "other resolution must be 'drop' or 'rename'"
-msgstr ""
+msgstr "l'altra soluzione deve essere ‘omessa’ o ‘rinominata’"
 
-#: src/cmd_conflicts.cc:265 src/cmd_conflicts.cc:271 src/cmd_conflicts.cc:338
-#: src/cmd_conflicts.cc:344 src/cmd_conflicts.cc:393 src/cmd_conflicts.cc:408
-#: src/cmd_conflicts.cc:457 src/cmd_conflicts.cc:470
+#: src/cmd_conflicts.cc:265
+#: src/cmd_conflicts.cc:271
+#: src/cmd_conflicts.cc:338
+#: src/cmd_conflicts.cc:344
+#: src/cmd_conflicts.cc:393
+#: src/cmd_conflicts.cc:408
+#: src/cmd_conflicts.cc:457
+#: src/cmd_conflicts.cc:470
 #, c-format
 msgid "wrong number of arguments"
 msgstr "numero errato di parametri"
@@ -3571,18 +3475,16 @@ msgstr "non risolvibili ancora non risol
 msgstr "non risolvibili ancora non risolti conflitti file-singolo"
 
 #: src/cmd_conflicts.cc:450
-msgid ""
-"Show the first unresolved conflict in the conflicts file, and possible "
-"resolutions"
-msgstr ""
-"Mostra il primo conflitto irrisolto nel file conflitti, e le possibili "
-"soluzioni"
+msgid "Show the first unresolved conflict in the conflicts file, and possible resolutions"
+msgstr "Mostra il primo conflitto irrisolto nel file conflitti, e le possibili soluzioni"
 
 #: src/cmd_conflicts.cc:463
 msgid "Show the remaining unresolved conflicts in the conflicts file"
 msgstr "Mostra i rimanenti conflitti irrisolti nel file conflitti"
 
-#: src/cmd_conflicts.cc:475 src/cmd_conflicts.cc:489 src/cmd_conflicts.cc:503
+#: src/cmd_conflicts.cc:475
+#: src/cmd_conflicts.cc:489
+#: src/cmd_conflicts.cc:503
 msgid "RESOLUTION"
 msgstr "RISOLUZIONE"
 
@@ -3617,13 +3519,13 @@ msgstr "il file rc ‘%s’ non esiste"
 msgstr "il file rc ‘%s’ non esiste"
 
 #: src/transforms.cc:83
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "%s\n"
-"this may be due to a memory glitch, data corruption during\n"
+"This may be due to a memory glitch, data corruption during\n"
 "a network transfer, corruption of your database or workspace,\n"
-"or a bug in monotone.  if the error persists, please contact\n"
-"%s for assistance.\n"
+"or a bug in monotone.  If the error persists, please report\n"
+"it to '%s'."
 msgstr ""
 "‘%s’ \n"
 "la causa potrebbe essere un fallimento nella memoria, una corruzione di dati durante\n"
@@ -3634,10 +3536,12 @@ msgid "failed to decode boolean testresu
 #: src/update.cc:74
 #, c-format
 msgid "failed to decode boolean testresult cert value '%s'"
-msgstr ""
-"è fallita la decodifica del valore booleano del certificato testresult ‘%s’"
+msgstr "è fallita la decodifica del valore booleano del certificato testresult ‘%s’"
 
-#: src/work.cc:134 src/work.cc:633 src/work.cc:716 src/work.cc:857
+#: src/work.cc:134
+#: src/work.cc:633
+#: src/work.cc:716
+#: src/work.cc:857
 #: src/migrate_work.cc:66
 #, c-format
 msgid "workspace required but not found"
@@ -3662,9 +3566,11 @@ msgstr "la directory di servizio di mono
 msgid "monotone bookkeeping directory '%s' already exists in '%s'"
 msgstr "la directory di servizio di monotone ‘%s’ esiste già in %s"
 
-#: src/work.cc:228 src/migrate_work.cc:197 src/migrate_work.cc:219
-#, c-format
-msgid "workspace is corrupt: reading %s: %s"
+#: src/work.cc:228
+#: src/migrate_work.cc:197
+#: src/migrate_work.cc:219
+#, fuzzy, c-format
+msgid "workspace is corrupt: reading '%s': %s"
 msgstr "lo spazio di lavoro è corrotto: leggendo ‘%s’: %s"
 
 #: src/work.cc:259
@@ -3685,31 +3591,32 @@ msgid "parent revision %s does not exist
 #: src/work.cc:313
 #, c-format
 msgid "parent revision %s does not exist, did you specify the wrong database?"
-msgstr ""
+msgstr "revisione genitore %s non esiste, hai specificato il database snagliato?"
 
 #: src/work.cc:472
-#, c-format
-msgid "Failed to read options file %s: %s"
+#, fuzzy, c-format
+msgid "Failed to read options file '%s': %s"
 msgstr "Impossibile leggere il file di opzioni ‘%s’: %s"
 
-#: src/work.cc:489 src/work.cc:535
+#: src/work.cc:489
+#: src/work.cc:535
 #, c-format
 msgid "a memory database '%s' cannot be used in a workspace"
-msgstr ""
+msgstr "un darabase memoria ‘%s’ non può essere usato nello spazio di lavoro"
 
 #: src/work.cc:521
-#, c-format
-msgid "unrecognized key '%s' in options file %s - ignored"
+#, fuzzy, c-format
+msgid "unrecognized key '%s' in options file '%s' - ignored"
 msgstr "chiave ‘%s’ non riconosciuta nel file di opzioni ‘%s’, verrà ignorata"
 
 #: src/work.cc:525
-#, c-format
-msgid "Could not parse entire options file %s"
+#, fuzzy, c-format
+msgid "Could not parse entire options file '%s'"
 msgstr "Impossibile interpretare il file di opzioni ‘%s’"
 
 #: src/work.cc:560
-#, c-format
-msgid "Failed to write options file %s: %s"
+#, fuzzy, c-format
+msgid "Failed to write options file '%s': %s"
 msgstr "Impossibile scrivere il file di opzioni ‘%s’: %s"
 
 #: src/work.cc:669
@@ -3723,60 +3630,55 @@ msgstr "‘%s’ non è un'opzione ricon
 msgstr "‘%s’ non è un'opzione riconosciuta per la copia di lavoro"
 
 #: src/work.cc:1091
-#, c-format
-msgid ""
-"cannot add %s, because %s is recorded as a file in the workspace manifest"
-msgstr ""
-"impossibile aggiungere ‘%s’ perché ‘%s’ è memorizzato come un file nel "
-"manifesto dello spazio di lavoro"
+#, fuzzy, c-format
+msgid "cannot add '%s', because '%s' is recorded as a file in the workspace manifest"
+msgstr "impossibile aggiungere ‘%s’ perché ‘%s’ è memorizzato come un file nel manifesto dello spazio di lavoro"
 
 #: src/work.cc:1097
-#, c-format
-msgid "adding %s to workspace manifest"
+#, fuzzy, c-format
+msgid "adding '%s' to workspace manifest"
 msgstr "aggiungo ‘%s’ al manifesto dello spazio di lavoro"
 
 #: src/work.cc:1174
 #, c-format
-msgid ""
-"Non-recursive add: Files in the directory '%s' will not be added "
-"automatically."
+msgid "non-recursive add: Files in the directory '%s' will not be added automatically."
 msgstr ""
 
 #: src/work.cc:1187
-#, c-format
-msgid "skipping ignorable file %s"
+#, fuzzy, c-format
+msgid "skipping ignorable file '%s'"
 msgstr "salto il file ignorabile ‘%s’"
 
 #: src/work.cc:1194
-#, c-format
-msgid "skipping %s, already accounted for in workspace"
+#, fuzzy, c-format
+msgid "skipping '%s', already accounted for in workspace"
 msgstr "salto ‘%s’, già considerato nello spazio di lavoro"
 
-#: src/work.cc:1350 src/merge_conflict.cc:2340 src/merge_conflict.cc:2405
-#, c-format
-msgid "dropping %s"
+#: src/work.cc:1350
+#: src/merge_conflict.cc:2340
+#: src/merge_conflict.cc:2405
+#, fuzzy, c-format
+msgid "dropping '%s'"
 msgstr "cancello ‘%s’"
 
-#: src/work.cc:1361 src/work.cc:1372
-#, c-format
-msgid "path %s already exists"
+#: src/work.cc:1361
+#: src/work.cc:1372
+#, fuzzy, c-format
+msgid "path '%s' already exists"
 msgstr "il percorso ‘%s’ esiste già"
 
-#: src/work.cc:1390 src/merge_conflict.cc:2345 src/merge_conflict.cc:2426
-#, c-format
-msgid "renaming %s to %s"
+#: src/work.cc:1390
+#: src/merge_conflict.cc:2345
+#: src/merge_conflict.cc:2426
+#, fuzzy, c-format
+msgid "renaming '%s' to '%s'"
 msgstr "rinomino ‘%s’ in ‘%s’"
 
 #: src/work.cc:1394
-#, c-format
-msgid "adding %s"
+#, fuzzy, c-format
+msgid "adding '%s'"
 msgstr "aggiungo ‘%s’"
 
-#: src/work.cc:1425
-#, c-format
-msgid "file '%s' does not exist"
-msgstr "il file ‘%s’ non esiste"
-
 #: src/work.cc:1426
 #, c-format
 msgid "file '%s' is a directory"
@@ -3788,8 +3690,8 @@ msgstr "i contenuti del file ‘%s’ so
 msgstr "i contenuti del file ‘%s’ sono cambiati, non lo sovrascrivo"
 
 #: src/work.cc:1431
-#, c-format
-msgid "updating %s"
+#, fuzzy, c-format
+msgid "updating '%s'"
 msgstr "aggiorno ‘%s’"
 
 #: src/work.cc:1486
@@ -3813,8 +3715,8 @@ msgstr "%d conflitti nello spazio di lav
 msgstr "%d conflitti nello spazio di lavoro"
 
 #: src/work.cc:1627
-#, c-format
-msgid "moved conflicting path %s to %s"
+#, fuzzy, c-format
+msgid "moved conflicting path '%s' to '%s'"
 msgstr "rimosso percorso contraddittorio %s in %s"
 
 #: src/work.cc:1691
@@ -3838,9 +3740,9 @@ msgstr "‘%s’ non è un file"
 msgstr "‘%s’ non è un file"
 
 #: src/work.cc:1731
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"%d missing items; use '%s ls missing' to view\n"
+"%d missing items; use '%s ls missing' to view.\n"
 "To restore consistency, on each missing item run either\n"
 " '%s drop ITEM' to remove it permanently, or\n"
 " '%s revert ITEM' to restore it.\n"
@@ -3862,90 +3764,87 @@ msgstr "impossibile eliminare la directo
 msgstr "impossibile eliminare la directory root"
 
 #: src/work.cc:1892
-#, c-format
-msgid "skipping %s, not currently tracked"
+#, fuzzy, c-format
+msgid "skipping '%s', not currently tracked"
 msgstr "salto ‘%s’, non sotto controllo di versione"
 
 #: src/work.cc:1902
-#, c-format
-msgid "cannot remove %s/, it is not empty"
+#, fuzzy, c-format
+msgid "cannot remove '%s/', it is not empty"
 msgstr "non posso cancellare ‘%s/’: non è vuota"
 
 #: src/work.cc:1917
-#, c-format
-msgid "directory %s not empty - it will be dropped but not deleted"
+#, fuzzy, c-format
+msgid "directory '%s' not empty - it will be dropped but not deleted"
 msgstr "la directory ‘%s’ non è vuota: verrà abbandonata ma non cancellata"
 
 #: src/work.cc:1928
-#, c-format
-msgid "file %s changed - it will be dropped but not deleted"
+#, fuzzy, c-format
+msgid "file '%s' changed - it will be dropped but not deleted"
 msgstr "il file ‘%s’ è stato motificato: verrà abbandonato ma non cancellato"
 
 #: src/work.cc:1932
-#, c-format
-msgid "dropping %s from workspace manifest"
+#, fuzzy, c-format
+msgid "dropping '%s' from workspace manifest"
 msgstr "elimino ‘%s’ dal manifesto dello spazio di lavoro"
 
-#: src/work.cc:1973 src/work.cc:2022
+#: src/work.cc:1973
+#: src/work.cc:2022
 #, c-format
 msgid "cannot rename the workspace root (try '%s pivot_root' instead)"
-msgstr ""
-"non posso rinominare la root dello spazio di lavoro (usa invece ‘%s "
-"pivot_root’)"
+msgstr "non posso rinominare la root dello spazio di lavoro (usa invece ‘%s pivot_root’)"
 
-#: src/work.cc:1976 src/work.cc:2025
-#, c-format
-msgid "source file %s is not versioned"
+#: src/work.cc:1976
+#: src/work.cc:2025
+#, fuzzy, c-format
+msgid "source file '%s' is not versioned"
 msgstr "il file sorgente ‘%s’ non è sotto controllo di versione"
 
-#: src/work.cc:1981 src/work.cc:2047
-#, c-format
-msgid "cannot move `%s' to a subdirectory of itself, `%s/%s'"
+#: src/work.cc:1981
+#: src/work.cc:2047
+#, fuzzy, c-format
+msgid "cannot move '%s' to a subdirectory of itself, '%s/%s'"
 msgstr "impossibile spostare ‘%s’ in una sottodirectory di sé stessa, ‘%s/%s’"
 
 #: src/work.cc:1983
-#, c-format
-msgid "`%s' and `%s' are the same file"
+#, fuzzy, c-format
+msgid "'%s' and '%s' are the same file"
 msgstr "‘%s’ e ‘%s’ sono lo stesso file"
 
 #: src/work.cc:1999
-#, c-format
-msgid "destination path's parent directory %s/ doesn't exist"
+#, fuzzy, c-format
+msgid "destination path's parent directory '%s/' doesn't exist"
 msgstr "la directory genitore %s/ del percorso destinazione non esiste"
 
 #: src/work.cc:2016
-#, c-format
-msgid "destination %s/ is not a directory"
+#, fuzzy, c-format
+msgid "destination '%s/' is not a directory"
 msgstr "la destinazione ‘%s’ non è una directory"
 
 #: src/work.cc:2042
-#, c-format
-msgid "destination %s already exists in the workspace manifest"
+#, fuzzy, c-format
+msgid "destination '%s' already exists in the workspace manifest"
 msgstr "la destinazione ‘%s’ esiste già nel manifesto dello spazio di lavoro"
 
 #: src/work.cc:2065
-#, c-format
-msgid "renaming %s to %s in workspace manifest"
+#, fuzzy, c-format
+msgid "renaming '%s' to '%s' in workspace manifest"
 msgstr "rinomino ‘%s’ in ‘%s’ nel manifesto dello spazio di lavoro"
 
 #: src/work.cc:2090
-#, c-format
-msgid "%s doesn't exist in workspace, skipping"
+#, fuzzy, c-format
+msgid "'%s' doesn't exist in workspace, skipping"
 msgstr "‘%s’ non esiste nello spazio di lavoro, lo salto"
 
 #: src/work.cc:2094
-#, c-format
-msgid "destination %s already exists in workspace, skipping filesystem rename"
-msgstr ""
-"la destinazione ‘%s’ esiste già nello spazio di lavoro, evito di rinominarla"
-" sul filesystem"
+#, fuzzy, c-format
+msgid "destination '%s' already exists in workspace, skipping filesystem rename"
+msgstr "la destinazione ‘%s’ esiste già nello spazio di lavoro, evito di rinominarla sul filesystem"
 
 #: src/work.cc:2099
-#, c-format
-msgid "%s doesn't exist in workspace and %s does, skipping filesystem rename"
-msgstr ""
-"‘%s’ non esiste nello spazio di lavoro e ‘%s’ esiste, evito il rename sul "
-"filesystem"
+#, fuzzy, c-format
+msgid "'%s' doesn't exist in workspace and '%s' does, skipping filesystem rename"
+msgstr "‘%s’ non esiste nello spazio di lavoro e ‘%s’ esiste, evito il rename sul filesystem"
 
 #: src/work.cc:2120
 #, c-format
@@ -3958,8 +3857,8 @@ msgstr "la nuova directory root proposta
 msgstr "la nuova directory root proposta ‘%s’ non è una directory"
 
 #: src/work.cc:2126
-#, c-format
-msgid "proposed new root directory '%s' contains illegal path %s"
+#, fuzzy, c-format
+msgid "proposed new root directory '%s' contains illegal path '%s'"
 msgstr "la nuova directory root proposta ‘%s’ ha un percorso illegale %s"
 
 #: src/work.cc:2136
@@ -3983,37 +3882,33 @@ msgstr ""
 
 #: src/work.cc:2206
 #, c-format
-msgid ""
-"re-run this command with --move-conflicting-paths to move conflicting paths "
-"out of the way."
-msgstr ""
+msgid "re-run this command with '--move-conflicting-paths' to move conflicting paths out of the way"
+msgstr "esegui di nuovo il comando con --move-conflicting-paths per spostare i percorsi conflittuali fuori dal percorso."
 
 #: src/work.cc:2238
-#, c-format
-msgid "moved some conflicting files into %s/%s"
+#, fuzzy, c-format
+msgid "moved some conflicting files into '%s'"
 msgstr "rimossi alcuni file contraddittori in %s/%s"
 
 #: src/migrate_work.cc:79
-#, c-format
-msgid "workspace is corrupt: %s is invalid"
+#, fuzzy, c-format
+msgid "workspace is corrupt: '%s' is invalid"
 msgstr "lo spazio di lavoro è corrotto: ‘%s’ non è valido"
 
 #: src/migrate_work.cc:84
-#, c-format
-msgid "_MTN/format should not exist in a format 1 workspace; corrected"
-msgstr ""
-"‘_MTN/format’ non dovrebbe esistere in uno spazio di lavoro con formato 1; "
-"corretto"
+#, fuzzy, c-format
+msgid "'_MTN/format' should not exist in a format 1 workspace; corrected"
+msgstr "‘_MTN/format’ non dovrebbe esistere in uno spazio di lavoro con formato 1; corretto"
 
 #: src/migrate_work.cc:125
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"this workspace's metadata is in format 0. to use this workspace\n"
+"this workspace's metadata is in format 0. To use this workspace\n"
 "with this version of monotone, you must delete it and check it\n"
 "out again (migration from format 0 is not possible).\n"
-"once you have done this, you will not be able to use the workspace\n"
+"Once you have done this, you will not be able to use the workspace\n"
 "with versions of monotone older than %s.\n"
-"we apologize for the inconvenience."
+"We apologize for the inconvenience."
 msgstr ""
 "i metadati dello spazio di lavoro sono nel formato 0. Per usare questo spazio di lavoro\n"
 "con questa versione di monotone, devi prima cancellarlo e verificarlo\n"
@@ -4023,12 +3918,12 @@ msgstr ""
 "ci scusiamo per l'inconveniente."
 
 #: src/migrate_work.cc:134
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "to use this workspace with this version of monotone, its metadata\n"
 "must be migrated from format %d to format %d, using the command\n"
 "'%s migrate_workspace'.\n"
-"once you have done this, you will not be able to use the workspace\n"
+"Once you have done this, you will not be able to use the workspace\n"
 "with versions of monotone older than %s."
 msgstr ""
 "per usare questo spazio di lavoro con questa versione di monotone, i suoi metadati\n"
@@ -4037,23 +3932,24 @@ msgstr ""
 "una volta fatto questo, non potrai più usare lo spazio di lavoro\n"
 "con versioni di monotone più vecchie di %s."
 
-#: src/migrate_work.cc:144 src/migrate_work.cc:274
-#, c-format
+#: src/migrate_work.cc:144
+#: src/migrate_work.cc:274
+#, fuzzy, c-format
 msgid ""
 "this version of monotone only understands workspace metadata\n"
-"in formats 0 through %d.  your workspace is in format %d.\n"
-"you need a newer version of monotone to use this workspace."
+"in formats 0 through %d.  Your workspace is in format %d.\n"
+"You need a newer version of monotone to use this workspace."
 msgstr ""
 "questa versione di monotone capisce solo spazi di lavoro con metadati\n"
 "nei formati da 0 a %d.  il tuo spazio di lavoro è in formato %d.\n"
 "ti serve una versione di monotone più recente per usarlo."
 
 #: src/migrate_work.cc:173
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "it is not possible to migrate from workspace format 0 to any\n"
-"later format.  you must delete this workspace and check it out\n"
-"again.  we apologize for the inconvenience."
+"later format.  You must delete this workspace and check it out\n"
+"again.  We apologize for the inconvenience."
 msgstr ""
 "non è possibile conversione spazi di lavoro in formato 0 a nessun\n"
 "formato successivo.  dovete cancellare lo spazio di lavoro ed\n"
@@ -4065,24 +3961,23 @@ msgstr "lo spazio di lavoro è corrotto:
 msgstr "lo spazio di lavoro è corrotto: ‘%s’ esiste ma non è un normale file"
 
 #: src/migrate_work.cc:266
-#, c-format
-msgid "this workspace is in the current format, no migration is necessary."
-msgstr ""
-"questo spazio di lavoro è nel formato attuale, non è necessario migrare."
+#, fuzzy, c-format
+msgid "this workspace is in the current format, no migration is necessary"
+msgstr "questo spazio di lavoro è nel formato attuale, non è necessario migrare."
 
 #: src/cert.cc:127
-#, c-format
-msgid "calculated cert hash '%s' does not match '%s'"
+#, fuzzy, c-format
+msgid "calculated cert hash %s does not match %s"
 msgstr "l'hash calcolato sul certificato è ‘%s’, non corrisponde a ‘%s’"
 
+# dopo i due punti sono valori interni da non tradurre
 #: src/project.cc:477
 #, c-format
-msgid ""
-"could not interpret test result string '%s'; valid strings are: 1, 0, yes, "
-"no, true, false, pass, fail"
-msgstr ""
+msgid "could not interpret test result string '%s'; valid strings are: 1, 0, yes, no, true, false, pass, fail"
+msgstr "non posso interpretare la striga test risultato ‘%s’; stringhe valide sono: 1, 0, yes, no, true, false, pass, fail"
 
-#: src/project.cc:542 src/project.cc:558
+#: src/project.cc:542
+#: src/project.cc:558
 #, c-format
 msgid "you have %d keys named '%s'"
 msgstr "hai %d chiavi chiamate ‘%s’"
@@ -4118,23 +4013,17 @@ msgid "no branch found for empty revisio
 #: src/project.cc:732
 #, c-format
 msgid "no branch found for empty revision, please provide a branch name"
-msgstr ""
-"nessun ramo trovato per revisione vuota, per favore fornisci un nome di ramo"
+msgstr "nessun ramo trovato per revisione vuota, per favore fornisci un nome di ramo"
 
 #: src/project.cc:739
 #, c-format
 msgid "no branch certs found for revision %s, please provide a branch name"
-msgstr ""
-"nessun certificato di ramo trovato per la revisione %s, per favore inserisci"
-" un nome di ramo"
+msgstr "nessun certificato di ramo trovato per la revisione %s, per favore inserisci un nome di ramo"
 
 #: src/project.cc:743
 #, c-format
-msgid ""
-"multiple branch certs found for revision %s, please provide a branch name"
-msgstr ""
-"trovati certificati con rami multipli per la revisione %s, per favore "
-"inserisci il nome di un ramo"
+msgid "multiple branch certs found for revision %s, please provide a branch name"
+msgstr "trovati certificati con rami multipli per la revisione %s, per favore inserisci il nome di un ramo"
 
 #: src/database.cc:586
 #, c-format
@@ -4147,15 +4036,15 @@ msgstr "questo database contiene già de
 msgstr "questo database contiene già dei roster"
 
 #: src/database.cc:617
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"database %s contains old-style revisions\n"
-"if you are a project leader or doing local testing:\n"
+"database '%s' contains old-style revisions.\n"
+"If you are a project leader or doing local testing:\n"
 "  see the file UPGRADE for instructions on upgrading.\n"
-"if you are not a project leader:\n"
+"If you are not a project leader:\n"
 "  wait for a leader to migrate project data, and then\n"
 "  pull into a fresh database.\n"
-"sorry about the inconvenience."
+"Sorry about the inconvenience."
 msgstr ""
 "Il database ‘%s’ contiene revisioni di vecchio tipo.\n"
 "Se sei un capo progetto o stai facendo verificando localmente:\n"
@@ -4166,44 +4055,47 @@ msgstr ""
 "Scusa per l'inconveniete."
 
 #: src/database.cc:627
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"database %s contains manifests but no revisions\n"
-"this is a very old database; it needs to be upgraded\n"
-"please see README.changesets for details"
+"database '%s' contains manifests but no revisions.\n"
+"This is a very old database; it needs to be upgraded.\n"
+"Please see 'http://wiki.monotone.ca/upgradefromchangesets/'\n"
+"for details"
 msgstr ""
 "il database ‘%s’ contiene manifesti ma non revisioni\n"
 "è un database molto vecchio; ha bisogno di essere aggiornato\n"
 "prego vedi README.changesets per dettagli"
 
-#: src/database.cc:649
-#, c-format
+#: src/database.cc:650
+#, fuzzy, c-format
 msgid ""
-"database %s lacks some cached data\n"
-"run '%s db regenerate_caches' to restore use of this database"
+"database '%s' lacks some cached data.\n"
+"Run '%s db regenerate_caches' to restore use of this database"
 msgstr ""
 "il database ‘%s’ manca di alcuni dati precalcolati\n"
 "eseguire ‘%s db regenerate_caches’ per rigenerarli"
 
-#: src/database.cc:952
+#: src/database.cc:953
 msgid "sqlite error: "
 msgstr "errore sqlite: "
 
-#: src/database.cc:976
+#: src/database.cc:977
 msgid "not set"
 msgstr "non impostato"
 
-#: src/database.cc:989
+#: src/database.cc:990
 msgid " (not a monotone database)"
 msgstr " (non è un database monotone)"
 
-#: src/database.cc:1039 src/database.cc:1071 src/database.cc:1771
-#: src/database.cc:1791
+#: src/database.cc:1040
+#: src/database.cc:1072
+#: src/database.cc:1772
+#: src/database.cc:1792
 #, c-format
 msgid "%u"
 msgstr "%u"
 
-#: src/database.cc:1090
+#: src/database.cc:1091
 #, c-format
 msgid ""
 "creator code      : %s\n"
@@ -4260,12 +4152,12 @@ msgstr ""
 "  dimensione pagine   : %s\n"
 "  dimensione cache    : %s"
 
-#: src/database.cc:1156
+#: src/database.cc:1157
 #, c-format
 msgid "invalid date '%s' for revision %s; skipped"
-msgstr ""
+msgstr "dato invalido ‘%s’ per la revisione %s; saltato"
 
-#: src/database.cc:1238
+#: src/database.cc:1239
 #, c-format
 msgid ""
 "timestamp correctness between revisions:\n"
@@ -4291,151 +4183,150 @@ msgstr ""
 "  99th percentile : %s sec\n"
 msgstr ""
 
-#: src/database.cc:1289
+#: src/database.cc:1290
 #, c-format
 msgid "database schema version: %s"
 msgstr "versione dello schema del database: %s"
 
-#: src/database.cc:1323
+#: src/database.cc:1324
 #, c-format
 msgid "checking"
 msgstr "verificando"
 
-#: src/database.cc:1325
+#: src/database.cc:1326
 msgid "checked"
 msgstr "verificato"
 
-#: src/database.cc:1327
+#: src/database.cc:1328
 msgid "fixed"
 msgstr "riparato"
 
-#: src/database.cc:1330
+#: src/database.cc:1331
 msgid "dropped"
 msgstr "abbandonato"
 
-#: src/database.cc:1385
+#: src/database.cc:1386
 #, c-format
 msgid "checked %d certs, found %d bad, fixed %d, dropped %d"
-msgstr ""
-"verificati certificati %d, trovati %d cattivi, riparati %d, abbandonati %d"
+msgstr "verificati certificati %d, trovati %d cattivi, riparati %d, abbandonati %d"
 
-#: src/database.cc:1390
+#: src/database.cc:1391
 #, c-format
 msgid "checked %d certs, found %d bad, fixed %d"
 msgstr "verificati certificati %d, trovati %d cattivi, riparati %d"
 
-#: src/database.cc:1453
+#: src/database.cc:1454
 #, c-format
 msgid "multiple statements in query: %s"
 msgstr "query con più di un comando: %s"
 
-#: src/database.cc:1459
+#: src/database.cc:1460
 #, c-format
 msgid "wanted %d columns got %d in query: %s"
 msgstr "mi aspettavo %d colonne e ne ho ottenute %d nella query ‘%s’"
 
-#: src/database.cc:1538
+#: src/database.cc:1539
 #, c-format
 msgid "null result in query: %s"
 msgstr "risultato nullo nella query: %s"
 
-#: src/database.cc:1564
+#: src/database.cc:1565
 #, c-format
 msgid "wanted %d rows got %d in query: %s"
 msgstr "mi aspettavo %d linee e ne ho ottenute %d nella query ‘%s’"
 
-#: src/database.cc:1898
+#: src/database.cc:1899
 #, c-format
 msgid "roster does not match hash"
 msgstr ""
 
-#: src/database.cc:1919
+#: src/database.cc:1920
 #, c-format
 msgid "roster_delta does not match hash"
 msgstr ""
 
-#: src/database.cc:2104
+#: src/database.cc:2105
 #, c-format
 msgid "delta-reconstructed '%s' item does not match hash"
 msgstr ""
 
-#: src/database.cc:2512
+#: src/database.cc:2513
 #, c-format
 msgid "file preimage '%s' missing in db"
 msgstr "nel database manca la preimmagine del file ‘%s’"
 
-#: src/database.cc:2513
+#: src/database.cc:2514
 #, c-format
 msgid "dropping delta '%s' -> '%s'"
 msgstr "cancello il delta %s → %s"
 
-#: src/database.cc:2529
+#: src/database.cc:2530
 #, c-format
-msgid ""
-"Unknown delta direction '%s'; assuming 'reverse'. Valid values are "
-"'reverse', 'forward', 'both'."
+msgid "unknown delta direction '%s'; assuming 'reverse'. Valid values are 'reverse', 'forward', 'both'."
 msgstr ""
 
-#: src/database.cc:2862
+#: src/database.cc:2863
 #, c-format
 msgid "revision does not match hash"
-msgstr ""
+msgstr "la revisione non corrisponde a hash"
 
-#: src/database.cc:2994
-#, c-format
-msgid "missing prerequisite revision '%s'"
+#: src/database.cc:2995
+#, fuzzy, c-format
+msgid "missing prerequisite revision %s"
 msgstr "manca un requisito: la revisione %s"
 
-#: src/database.cc:2996 src/database.cc:3007 src/database.cc:3023
-#: src/database.cc:3031
-#, c-format
-msgid "dropping revision '%s'"
+#: src/database.cc:2997
+#: src/database.cc:3008
+#: src/database.cc:3024
+#: src/database.cc:3032
+#, fuzzy, c-format
+msgid "dropping revision %s"
 msgstr "elimino la revisione %s"
 
-#: src/database.cc:3006
-#, c-format
-msgid "missing prerequisite file '%s'"
+#: src/database.cc:3007
+#, fuzzy, c-format
+msgid "missing prerequisite file %s"
 msgstr "manca un requisito: il file ‘%s’"
 
-#: src/database.cc:3021
-#, c-format
-msgid "missing prerequisite file pre-delta '%s'"
+#: src/database.cc:3022
+#, fuzzy, c-format
+msgid "missing prerequisite file pre-delta %s"
 msgstr "manca un requisito: la pre-delta del file ‘%s’"
 
-#: src/database.cc:3029
-#, c-format
-msgid "missing prerequisite file post-delta '%s'"
+#: src/database.cc:3030
+#, fuzzy, c-format
+msgid "missing prerequisite file post-delta %s"
 msgstr "manca un requisito: la post-delta del file ‘%s’"
 
-#: src/database.cc:3162
+#: src/database.cc:3163
 #, c-format
 msgid "revision contains incorrect manifest_id"
 msgstr ""
 
-#: src/database.cc:3488
-#, c-format
-msgid "Failed to get RSA verifying key for %s"
+#: src/database.cc:3489
+#, fuzzy, c-format
+msgid "failed to get RSA verifying key for %s"
 msgstr "Impossibile trovare la chiave RSA di verifica per %s"
 
-#: src/database.cc:3627
-#, c-format
-msgid "Your database contains multiple keys named %s"
+#: src/database.cc:3628
+#, fuzzy, c-format
+msgid "your database contains multiple keys named '%s'"
 msgstr "Il tuo database contiene chiavi multiple chiamate %s"
 
-#: src/database.cc:3788
-#, c-format
-msgid "cert revision '%s' does not exist in db"
+#: src/database.cc:3789
+#, fuzzy, c-format
+msgid "cert revision %s does not exist in db"
 msgstr "la revisione %s non è presente in database"
 
-#: src/database.cc:3790
+#: src/database.cc:3791
 #, c-format
 msgid "dropping cert"
 msgstr "cancella certificato"
 
-#: src/database.cc:3800
+#: src/database.cc:3801
 #, c-format
 msgid ""
-"The branch name\n"
+"the branch name\n"
 "  '%s'\n"
 "contains meta characters (one or more of '?,;*%%+{}[]!^') or\n"
 "starts with a dash, which might cause malfunctions when used\n"
@@ -4446,126 +4337,131 @@ msgstr ""
 "cert and re-add a valid one."
 msgstr ""
 
-#: src/database.cc:4117
+#: src/database.cc:4118
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'"
 msgstr "ignoro la firma invalida di ‘%s’ su ‘%s’"
 
-#: src/database.cc:4122
+#: src/database.cc:4123
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'"
 msgstr "ignoro la firma sconosciuta di ‘%s’ su ‘%s’"
 
-#: src/database.cc:4124
-#, c-format
-msgid "trust function disliked %d signers of %s cert on revision %s"
-msgstr ""
-"la funzione di fiducia ha rifiutato %d firmatari del certificato ‘%s’ nella "
-"revisione %s"
+#: src/database.cc:4125
+#, fuzzy, c-format
+msgid "trust function disliked %d signers of '%s' cert on revision %s"
+msgstr "la funzione di fiducia ha rifiutato %d firmatari del certificato ‘%s’ nella revisione %s"
 
-#: src/database.cc:4812 src/database.cc:4954
+#: src/database.cc:4813
+#: src/database.cc:4955
 #, c-format
 msgid "no database specified"
 msgstr "nessun database specificato"
 
-#: src/database.cc:4825
-#, c-format
-msgid "database %s does not exist"
+#: src/database.cc:4826
+#, fuzzy, c-format
+msgid "database '%s' does not exist"
 msgstr "il database ‘%s’ non esiste"
 
-#: src/database.cc:4833
-#, c-format
+#: src/database.cc:4834
+#, fuzzy, c-format
 msgid ""
-"%s is a workspace, not a database\n"
-"(did you mean %s?)"
+"'%s' is a workspace, not a database\n"
+"(did you mean '%s'?)"
 msgstr ""
 "‘%s’ è uno spazio di lavoro, non un database\n"
 "(intendevi ‘%s’?)"
 
-#: src/database.cc:4837
-#, c-format
-msgid "%s is a directory, not a database"
+#: src/database.cc:4838
+#, fuzzy, c-format
+msgid "'%s' is a directory, not a database"
 msgstr "‘%s’ è una directory, non un database"
 
-#: src/database.cc:4845
-#, c-format
-msgid "database %s already exists"
+#: src/database.cc:4846
+#, fuzzy, c-format
+msgid "database '%s' already exists"
 msgstr "il database ‘%s’ esiste già"
 
-#: src/database.cc:4850
-#, c-format
+#: src/database.cc:4851
+#, fuzzy, c-format
 msgid ""
-"existing (possibly stale) journal file '%s' has same stem as new database '%s'\n"
-"cancelling database creation"
+"existing (possibly stale) journal file '%s' has same stem as new database '%s'.\n"
+"Cancelling database creation"
 msgstr ""
 "il file di journal ‘%s’ esistente (forse in stallo) ha lastessa radice del nuovo database ‘%s’\n"
 "creazione del database cancellata"
 
-#: src/database.cc:5012
+#: src/database.cc:5013
 #, c-format
 msgid "the database alias '%s' has multiple ambiguous expansions:"
 msgstr ""
 
-#: src/database.cc:5035
+#: src/database.cc:5036
 #, c-format
 msgid "could not query default database alias"
 msgstr ""
 
-#: src/database.cc:5037
+#: src/database.cc:5038
 #, c-format
 msgid "using default database '%s'"
 msgstr ""
 
-#: src/database.cc:5047
+#: src/database.cc:5048
 #, c-format
 msgid "invalid database alias '%s': does not start with a colon"
 msgstr ""
 
-#: src/database.cc:5051
+#: src/database.cc:5052
 #, c-format
 msgid "invalid database alias '%s': must not be empty"
 msgstr ""
 
-#: src/database.cc:5067
+#: src/database.cc:5068
 #, c-format
 msgid "invalid database alias '%s': does contain invalid characters"
 msgstr ""
 
 #: src/key_store.cc:90
-#, c-format
-msgid "No available keystore found"
+#, fuzzy, c-format
+msgid "no available keystore found"
 msgstr "Nessun portachiavi trovato"
 
-#: src/key_store.cc:134 src/key_store.cc:138 src/key_store.cc:142
-#: src/key_store.cc:144 src/key_store.cc:149
-#, c-format
-msgid "Extraneous data in key store."
+#: src/key_store.cc:134
+#: src/key_store.cc:138
+#: src/key_store.cc:142
+#: src/key_store.cc:144
+#: src/key_store.cc:149
+#, fuzzy, c-format
+msgid "extraneous data in key store"
 msgstr "Dati estranei nel portachiavi."
 
 #: src/key_store.cc:160
-#, c-format
-msgid "Key store has multiple copies of the key with id '%s'."
+#, fuzzy, c-format
+msgid "key store has multiple copies of the key with id %s"
 msgstr "Il portachiavi contiene più copie chiavi con id ‘%s’."
 
 #: src/key_store.cc:169
-#, c-format
-msgid "converting old-format private key '%s'"
+#, fuzzy, c-format
+msgid "converting old-format private key %s"
 msgstr "converto la chiave privata ‘%s’ dal vecchio formato"
 
 #: src/key_store.cc:227
-#, c-format
-msgid "ignored invalid key file ('%s') in key store"
-msgstr ""
+#, fuzzy, c-format
+msgid "ignored invalid key file '%s' in key store"
+msgstr "la coppia di chiavi ‘%s’ non è nel portachiavi ‘%s’"
 
-#: src/key_store.cc:422 src/key_store.cc:426 src/key_store.cc:429
-#: src/key_store.cc:431 src/key_store.cc:434
-#, c-format
-msgid "Invalid data in key file."
-msgstr ""
+#: src/key_store.cc:422
+#: src/key_store.cc:426
+#: src/key_store.cc:429
+#: src/key_store.cc:431
+#: src/key_store.cc:434
+#, fuzzy, c-format
+msgid "invalid data in key file"
+msgstr "Dati non validi nel file chiave."
 
 #: src/key_store.cc:442
 #, c-format
-msgid "expected key with id '%s' in key file '%s', got key with id '%s'"
+msgid "expected key with id %s in key file '%s', got key with id %s"
 msgstr ""
 
 #: src/key_store.cc:508
@@ -4593,25 +4489,21 @@ msgstr "le passphrase non corrispondono,
 msgid "passphrases do not match, try again"
 msgstr "le passphrase non corrispondono, riprova"
 
-#: src/key_store.cc:567 src/key_store.cc:776 src/keys.cc:43
-#, c-format
-msgid "no key pair '%s' found in key store '%s'"
+#: src/key_store.cc:567
+#: src/keys.cc:43
+#, fuzzy, c-format
+msgid "no key pair %s found in key store '%s'"
 msgstr "la coppia di chiavi ‘%s’ non è nel portachiavi ‘%s’"
 
 #: src/key_store.cc:620
 #, c-format
-msgid ""
-"failed to decrypt old private RSA key, probably incorrect passphrase or "
-"missing 'get_passphrase' lua hook"
-msgstr ""
-"fallita la decifratura di una vecchia chiave RSA, probabilmente la "
-"passphrase è errata o manca l'hook lua 'get_passphrase'"
+msgid "failed to decrypt old private RSA key, probably incorrect passphrase or missing 'get_passphrase' lua hook"
+msgstr "fallita la decifratura di una vecchia chiave RSA, probabilmente la passphrase è errata o manca l'hook lua 'get_passphrase'"
 
 #: src/key_store.cc:633
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
-msgstr ""
-"fallita l'estrazione della chiave privata RSA da una coppia di chiavi PKCS#8"
+msgstr "fallita l'estrazione della chiave privata RSA da una coppia di chiavi PKCS#8"
 
 #: src/key_store.cc:673
 #, c-format
@@ -4624,13 +4516,13 @@ msgstr "genero la coppia di chiavi ‘%s
 msgstr "genero la coppia di chiavi ‘%s’"
 
 #: src/key_store.cc:733
-#, c-format
-msgid "storing key-pair '%s' in %s/"
+#, fuzzy, c-format
+msgid "storing key-pair %s in '%s/'"
 msgstr "immagazzino la coppia di chiavi ‘%s’ in ‘%s/’"
 
 #: src/key_store.cc:746
-#, c-format
-msgid "storing public key '%s' in %s"
+#, fuzzy, c-format
+msgid "storing public key %s in '%s'"
 msgstr "immagazzino la chiave pubblica ‘%s’ in ‘%s’"
 
 #: src/key_store.cc:762
@@ -4638,23 +4530,24 @@ msgstr "la chiave ‘%s’ ha hash ‘%s
 msgid "key '%s' has hash '%s'"
 msgstr "la chiave ‘%s’ ha hash ‘%s’"
 
+#: src/key_store.cc:776
+#, c-format
+msgid "no key pair '%s' found in key store '%s'"
+msgstr "la coppia di chiavi ‘%s’ non è nel portachiavi ‘%s’"
+
 #: src/key_store.cc:828
 #, c-format
 msgid "Botan error decrypting data: '%s'"
 msgstr "errore Botan decrittando i dati: ‘%s’"
 
 #: src/key_store.cc:851
-#, c-format
-msgid ""
-"You have chosen to sign only with ssh-agent but ssh-agent does not seem to "
-"be running."
-msgstr ""
-"Hai scelto di firmare esclusivamente con ‘ssh-agent’ ma non sembra essere in"
-" esecuzione."
+#, fuzzy, c-format
+msgid "you have chosen to sign only with ssh-agent but ssh-agent does not seem to be running"
+msgstr "Hai scelto di firmare esclusivamente con ‘ssh-agent’ ma non sembra essere in esecuzione."
 
 #: src/key_store.cc:881
-#, c-format
-msgid "You don't seem to have your monotone key imported "
+#, fuzzy, c-format
+msgid "you don't seem to have your monotone key imported "
 msgstr "Sembra che tu non abbia importato la tua chiave monotone"
 
 #: src/key_store.cc:935
@@ -4674,20 +4567,18 @@ msgstr "make_signature: firma non valida
 msgstr "make_signature: firma non valida"
 
 #: src/key_store.cc:963
-#, c-format
-msgid "no ssh-agent is available, cannot add key '%s'"
+#, fuzzy, c-format
+msgid "no ssh-agent is available, cannot add key %s"
 msgstr "‘ssh-agent’ non disponibile, impossibile aggiungere la chiave ‘%s’"
 
 #: src/key_store.cc:1060
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
-msgstr ""
-"fallita la decifratura di una vecchia chiave RSA, probabilmente la "
-"passphrase è errata"
+msgstr "fallita la decifratura di una vecchia chiave RSA, probabilmente la passphrase è errata"
 
 #: src/key_store.cc:1097
-#, c-format
-msgid "public and private keys for %s don't match"
+#, fuzzy, c-format
+msgid "public and private keys for %s do not match"
 msgstr "le chiavi pubblica e privata per ‘%s’ non corrispondono"
 
 #: src/ssh_agent.cc:141
@@ -4712,21 +4603,13 @@ msgstr "ssh_agent: tipo di pacchetto (%u
 
 #: src/ssh_agent.cc:352
 #, c-format
-msgid ""
-"ssh_agent: get_keys: not all or too many key bytes consumed, location (%u), "
-"length (%i)"
-msgstr ""
-"ssh_agent: get_keys: consumato un numero errato di  byte della chiave, "
-"posizione (%u), lunghezza (%i)"
+msgid "ssh_agent: get_keys: not all or too many key bytes consumed, location (%u), length (%i)"
+msgstr "ssh_agent: get_keys: consumato un numero errato di  byte della chiave, posizione (%u), lunghezza (%i)"
 
 #: src/ssh_agent.cc:376
 #, c-format
-msgid ""
-"ssh_agent: get_keys: not all or too many packet bytes consumed, location "
-"(%u), length (%i)"
-msgstr ""
-"ssh_agent: get_keys: consumato un numero errato di  byte del pacchetto, "
-"posizione (%u), lunghezza (%i)"
+msgid "ssh_agent: get_keys: not all or too many packet bytes consumed, location (%u), length (%i)"
+msgstr "ssh_agent: get_keys: consumato un numero errato di  byte del pacchetto, posizione (%u), lunghezza (%i)"
 
 #: src/ssh_agent.cc:420
 #, c-format
@@ -4735,34 +4618,23 @@ msgstr "ssh_agent: get_keys: tentata fir
 
 #: src/ssh_agent.cc:466
 #, c-format
-msgid ""
-"ssh_agent: sign_data: not all or too many signature bytes consumed, location"
-" (%u), length (%i)"
-msgstr ""
-"ssh_agent: get_keys: consumato un numero errato di  byte della firma, "
-"posizione (%u), lunghezza (%i)"
+msgid "ssh_agent: sign_data: not all or too many signature bytes consumed, location (%u), length (%i)"
+msgstr "ssh_agent: get_keys: consumato un numero errato di  byte della firma, posizione (%u), lunghezza (%i)"
 
 #: src/ssh_agent.cc:472
 #, c-format
-msgid ""
-"ssh_agent: sign_data: not all or too many packet bytes consumed, location "
-"(%u), length (%i)"
-msgstr ""
-"ssh_agent: get_keys: consumato un numero errato di  byte del pacchetto, "
-"posizione (%u), lunghezza (%i)"
+msgid "ssh_agent: sign_data: not all or too many packet bytes consumed, location (%u), length (%i)"
+msgstr "ssh_agent: get_keys: consumato un numero errato di  byte del pacchetto, posizione (%u), lunghezza (%i)"
 
 #: src/ssh_agent.cc:482
 #, c-format
 msgid "ssh_agent: add_identity: attempted to add a key when not connected"
-msgstr ""
-"ssh_agent: add_identity: tentativo di aggiungere una chiave uando non "
-"connesso"
+msgstr "ssh_agent: add_identity: tentativo di aggiungere una chiave uando non connesso"
 
 #: src/ssh_agent.cc:498
 #, c-format
 msgid "ssh_agent: add_identity: response packet of unexpected size (%u)"
-msgstr ""
-"ssh_agent: add_identity: pacchetto di risposta di dimensione inattesa (%u)"
+msgstr "ssh_agent: add_identity: pacchetto di risposta di dimensione inattesa (%u)"
 
 #: src/ssh_agent.cc:501
 #, c-format
@@ -4770,47 +4642,44 @@ msgstr "ssh_agent: tipo di pacchetto (%u
 msgstr "ssh_agent: tipo di pacchetto (%u) != 6"
 
 #: src/keys.cc:88
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"The key '%s' stored in your database does\n"
+"the key %s stored in your database does\n"
 "not match the version in your local key store!"
 msgstr ""
 "La chiave ‘%s’ immagazzinata in database non\n"
 "corrisponde a quella presente nel portachiavi locale!"
 
 #: src/keys.cc:102
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"you have no private key to make signatures with\n"
-"perhaps you need to 'genkey <your email>'"
+"you have no private key to make signatures with.\n"
+"Perhaps you need to 'genkey <your email>'"
 msgstr ""
 "non hai una chiave privata con cui firmare\n"
 "puoi crearla con ‘genkey <tua e-mail>’"
 
 #: src/keys.cc:105
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"you have multiple private keys\n"
-"pick one to use for signatures by adding '-k<keyname>' to your command"
+"you have multiple private keys.\n"
+"Pick one to use for signatures by adding '-k<keyname>' to your command"
 msgstr ""
 "hai più chiavi private\n"
 "scegli quale usare per firmare aggiungendo ‘-k<keyname>’ al tuo comando"
 
 #: src/keys.cc:144
-#, c-format
-msgid ""
-"a key is required for this operation, but the --key option was given with an"
-" empty argument"
-msgstr ""
-"è richiesta una chiave per questa operazione, ma la opzione --key è stata "
-"data con un argomento vuoto"
+#, fuzzy, c-format
+msgid "a key is required for this operation, but the '--key' option was given with an empty argument"
+msgstr "è richiesta una chiave per questa operazione, ma la opzione --key è stata data con un argomento vuoto"
 
 #: src/packet.cc:134
 #, c-format
 msgid "malformed packet: invalid identifier"
 msgstr "pacchetto non valido: identificatore non valido"
 
-#: src/packet.cc:141 src/packet.cc:147
+#: src/packet.cc:141
+#: src/packet.cc:147
 #, c-format
 msgid "malformed packet: invalid base64 block"
 msgstr "pacchetto non valido: blocco base64 non valido"
@@ -4841,11 +4710,12 @@ msgstr "pacchetto non valido: troppi arg
 msgstr "pacchetto non valido: troppi argomenti nell'intestazione"
 
 #: src/packet.cc:335
-#, c-format
-msgid "unknown packet type: '%s'"
+#, fuzzy, c-format
+msgid "unknown packet type '%s'"
 msgstr "pacchetto di tipo sconosciuto: ‘%s’"
 
-#: src/key_packet.cc:91 src/key_packet.cc:97
+#: src/key_packet.cc:91
+#: src/key_packet.cc:97
 #, c-format
 msgid "malformed key_packet: invalid base64 block"
 msgstr ""
@@ -4878,8 +4748,7 @@ msgid "parse failure %d:%d: expecting %s
 #: src/rcs_file.cc:354
 #, c-format
 msgid "parse failure %d:%d: expecting %s, got %s with value '%s'"
-msgstr ""
-"errore sintattico %d:%d: mi aspettavo %s, ho ricevuto %s con valore ‘%s’"
+msgstr "errore sintattico %d:%d: mi aspettavo %s, ho ricevuto %s con valore ‘%s’"
 
 #: src/rcs_file.cc:373
 #, c-format
@@ -4919,8 +4788,8 @@ msgstr ""
 "%s"
 
 #: src/migrate_schema.cc:579
-#, c-format
-msgid "moving key '%s' from database to %s"
+#, fuzzy, c-format
+msgid "moving key '%s' from database to '%s'"
 msgstr "sposto chiave ‘%s’ dal database a ‘%s’"
 
 #: src/migrate_schema.cc:1139
@@ -4949,35 +4818,35 @@ msgstr "%s (database senza tabelle!)"
 msgstr "%s (database senza tabelle!)"
 
 #: src/migrate_schema.cc:1160
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"cannot use the empty sqlite database %s\n"
+"cannot use the empty sqlite database '%s'\n"
 "(monotone databases must be created with '%s db init')"
 msgstr ""
 "impossibile usare il database sqlite vuoto ‘%s’\n"
 "(i database monotone devono essere creati con:‘%s db init’)"
 
 #: src/migrate_schema.cc:1165
-#, c-format
-msgid "%s does not appear to be a monotone database\n"
+#, fuzzy, c-format
+msgid "'%s' does not appear to be a monotone database\n"
 msgstr "‘%s’ non sembra essere un database monotone\n"
 
 #: src/migrate_schema.cc:1169
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"%s appears to be a monotone database, but this version of\n"
+"'%s' appears to be a monotone database, but this version of\n"
 "monotone does not recognize its schema.\n"
-"you probably need a newer version of monotone."
+"You probably need a newer version of monotone."
 msgstr ""
 "‘%s’ sembra essere un database monotone, però questa versione\n"
 "di monotone non riconosce il suo schema.\n"
 "probabilmenete è necessaria una versione di monotone più recente."
 
 #: src/migrate_schema.cc:1188
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"database %s is laid out according to an old schema\n"
-"try '%s db migrate' to upgrade\n"
+"database '%s' is laid out according to an old schema.\n"
+"Try '%s db migrate' to upgrade\n"
 "(this is irreversible; you may want to make a backup copy first)"
 msgstr ""
 "il database ‘%s’ e stato creato secondo uno schema obsoleto\n"
@@ -4992,8 +4861,7 @@ msgid "no migration performed; database 
 #: src/migrate_schema.cc:1233
 #, c-format
 msgid "no migration performed; database schema already up-to-date"
-msgstr ""
-"nessuna migrazione effettuata: lo schema del database era già aggiornato"
+msgstr "nessuna migrazione effettuata: lo schema del database era già aggiornato"
 
 #: src/migrate_schema.cc:1248
 #, c-format
@@ -5018,8 +4886,7 @@ msgid "cannot test migration from unknow
 #: src/migrate_schema.cc:1336
 #, c-format
 msgid "cannot test migration from unknown schema %s"
-msgstr ""
-"schema del database ‘%s’ sconosciuto: non posso verificare la migrazione"
+msgstr "schema del database ‘%s’ sconosciuto: non posso verificare la migrazione"
 
 #: src/migrate_schema.cc:1339
 #, c-format
@@ -5052,31 +4919,26 @@ msgstr "ricostruisco %d nodi"
 msgstr "ricostruisco %d nodi"
 
 #: src/migrate_ancestry.cc:489
-#, c-format
-msgid ""
-"Directory %s for path %s cannot be added, as there is a file in the way"
-msgstr ""
-"La directory %s per il percorso %s non può essere aggiunta, dato che c'è già"
-" un file con lo stesso nome"
+#, fuzzy, c-format
+msgid "directory '%s' for path '%s' cannot be added, as there is a file in the way"
+msgstr "La directory %s per il percorso %s non può essere aggiunta, dato che c'è già un file con lo stesso nome"
 
 #: src/migrate_ancestry.cc:510
-#, c-format
-msgid "Path %s cannot be added, as there is a directory in the way"
-msgstr ""
-"Il percorso ‘%s’ non può essere aggiunto, dato che c'è già una directory con"
-" lo stesso nome"
+#, fuzzy, c-format
+msgid "path '%s' cannot be added, as there is a directory in the way"
+msgstr "Il percorso ‘%s’ non può essere aggiunto, dato che c'è già una directory con lo stesso nome"
 
 #: src/migrate_ancestry.cc:513
-#, c-format
-msgid "Path %s added twice with differing content"
+#, fuzzy, c-format
+msgid "path '%s' added twice with differing content"
 msgstr "Percorso ‘%s’ aggiunto due volte con contenuti diversi"
 
 #: src/migrate_ancestry.cc:800
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"unknown attribute '%s' on path '%s'\n"
-"please contact %s so we can work out the right way to migrate this\n"
-"(if you just want it to go away, see the switch --drop-attr, but\n"
+"unknown attribute '%s' on path '%s'.\n"
+"Please contact %s so we can work out the right way to migrate this\n"
+"(if you just want it to go away, see the switch '--drop-attr', but\n"
 "seriously, if you'd like to keep it, we're happy to figure out how)"
 msgstr ""
 "attributo sconosciuto ‘%s’ nel percorso ‘%s’\n"
@@ -5087,8 +4949,7 @@ msgid "converting existing revision grap
 #: src/migrate_ancestry.cc:907
 #, c-format
 msgid "converting existing revision graph to new roster-style revisions"
-msgstr ""
-"converto il grafo esistente delle revisioni al nuovo formato con roster"
+msgstr "converto il grafo esistente delle revisioni al nuovo formato con roster"
 
 #: src/migrate_ancestry.cc:953
 #, c-format
@@ -5100,8 +4961,10 @@ msgstr "rigenerazione della cache delle 
 msgid "regenerating cached heights"
 msgstr "rigenerazione della cache delle altezze"
 
-#: src/migrate_ancestry.cc:1000 src/migrate_ancestry.cc:1031
-#: src/migrate_ancestry.cc:1063 src/migrate_ancestry.cc:1097
+#: src/migrate_ancestry.cc:1000
+#: src/migrate_ancestry.cc:1031
+#: src/migrate_ancestry.cc:1063
+#: src/migrate_ancestry.cc:1097
 msgid "regenerated"
 msgstr "rigenerazione"
 
@@ -5145,69 +5008,67 @@ msgstr ""
 msgid "underflow on query-in-flight counter"
 msgstr ""
 
-#: src/netsync.cc:112 src/netsync.cc:219
-#, c-format
-msgid "connecting to %s"
+#: src/netsync.cc:112
+#: src/netsync.cc:219
+#, fuzzy, c-format
+msgid "connecting to '%s'"
 msgstr "connessione a ‘%s’"
 
 #: src/netsync.cc:113
-#, c-format
-msgid "  include pattern  %s"
-msgstr ""
+#, fuzzy, c-format
+msgid "  include pattern  '%s'"
+msgstr "includendo genitore richiesto‘%s’"
 
 #: src/netsync.cc:114
 #, c-format
-msgid "  exclude pattern  %s"
+msgid "  exclude pattern  '%s'"
 msgstr ""
 
 #: src/netsync.cc:163
-#, c-format
-msgid "processing failure while talking to peer %s, disconnecting"
+#, fuzzy, c-format
+msgid "processing failure while talking to peer '%s', disconnecting"
 msgstr "ottenuto fallimento parlando col peer ‘%s’, mi scollego"
 
 #: src/netsync.cc:171
-#, c-format
-msgid "timed out waiting for I/O with peer %s, disconnecting"
+#, fuzzy, c-format
+msgid "timed out waiting for I/O with peer '%s', disconnecting"
 msgstr "tempo disponibile finito aspettando I/O con peer ‘%s’, mi scollego"
 
 #: src/netsync.cc:188
-#, c-format
-msgid "successful exchange with %s"
+#, fuzzy, c-format
+msgid "successful exchange with '%s'"
 msgstr "scambio con ‘%s’ avvenuto con successo"
 
 #: src/netsync.cc:194
-#, c-format
-msgid "peer %s disconnected after we informed them of error"
+#, fuzzy, c-format
+msgid "peer '%s' disconnected after we informed them of error"
 msgstr "peer ‘%s’ disconnesso dopo nostra notifica di errore"
 
 #: src/netsync.cc:200
-#, c-format
-msgid "I/O failure while talking to peer %s, disconnecting"
+#, fuzzy, c-format
+msgid "I/O failure while talking to peer '%s', disconnecting"
 msgstr "I/O fallito mentre parlavo col peer ‘%s’, mi scollego"
 
 #: src/netsync.cc:246
+#: src/netsync.cc:419
+#: src/netsync.cc:423
 #, c-format
-msgid "Network error: %s"
-msgstr "Errore di rete: %s"
+msgid "network error: %s"
+msgstr "errore di rete: %s"
 
 #: src/netsync.cc:360
-#, c-format
-msgid "beginning service on %s"
+#, fuzzy, c-format
+msgid "beginning service on '%s'"
 msgstr "attivo il servizio su %s"
 
-#: src/netsync.cc:419 src/netsync.cc:423
-#, c-format
-msgid "network error: %s"
-msgstr "errore di rete: %s"
-
 #: src/network/automate_session.cc:71
 #, c-format
 msgid "server is too old for remote automate connections"
 msgstr "il server è troppo vecchio per connessioni remote automatiche"
 
 #: src/network/automate_session.cc:130
-#, c-format
-msgid "Sorry, you aren't allowed to do that."
+#, fuzzy, c-format
+msgid "sorry, you aren't allowed to do that."
 msgstr "Spiacente, non ti è permesso fare ciò."
 
 #: src/network/automate_session.cc:219
@@ -5256,64 +5117,42 @@ msgid "branch pattern is empty and no de
 #: src/network/connection_info.cc:349
 #, c-format
 msgid "branch pattern is empty and no default value could be loaded"
-msgstr ""
-"nessun pattern di ramo specificato e non può essere caricato nessun valore "
-"di default"
+msgstr "nessun pattern di ramo specificato e non può essere caricato nessun valore di default"
 
 #: src/network/connection_info.cc:428
-#, c-format
-msgid ""
-"include / exclude pattern was given both as part of the URL and as a "
-"separate argument."
-msgstr ""
-"il pattern di inclusione/esclusione è stato specificato sia come parte della"
-" URL che come argomento separato."
+#, fuzzy, c-format
+msgid "include / exclude pattern was given both as part of the URI and as a separate argument"
+msgstr "il pattern di inclusione/esclusione è stato specificato sia come parte della URL che come argomento separato."
 
 #: src/network/connection_info.cc:477
 #, c-format
-msgid ""
-"no branch pattern found in URI, will try to use suitable database defaults "
-"if available"
+msgid "no branch pattern found in URI, will try to use suitable database defaults if available"
 msgstr ""
 
 #: src/network/connection_info.cc:499
 #, c-format
-msgid ""
-"separate server and pattern arguments are deprecated, please consider using "
-"the URI calling syntax instead"
+msgid "separate server and pattern arguments are deprecated, please consider using the URI calling syntax instead"
 msgstr ""
 
 #: src/network/connection_info.cc:508
 #, c-format
-msgid ""
-"you can specify either a query string or separate include/exclude "
-"parameters, but not both"
+msgid "you can specify either a query string or separate include/exclude parameters, but not both"
 msgstr ""
 
 #: src/network/connection_info.cc:529
 #, c-format
-msgid ""
-"need permission to store persistent passphrase (see hook "
-"persist_phrase_ok())"
-msgstr ""
-"è necessario un permesso per ricordare la passphrase (vedi hook "
-"‘persist_phrase_ok()’)"
+msgid "need permission to store persistent passphrase (see hook persist_phrase_ok())"
+msgstr "è necessario un permesso per ricordare la passphrase (vedi hook ‘persist_phrase_ok()’)"
 
 #: src/network/connection_info.cc:533
-#, c-format
-msgid ""
-"The --no-transport-auth option is usually only used in combination with "
-"--stdio"
-msgstr ""
-"L'opzione ‘--no-transport-auth’ è normalmente  usata solo in combinazione "
-"con ‘--stdio’"
+#, fuzzy, c-format
+msgid "the '--no-transport-auth' option is usually only used in combination with '--stdio'"
+msgstr "L'opzione ‘--no-transport-auth’ è normalmente  usata solo in combinazione con ‘--stdio’"
 
 #: src/network/listener_base.cc:47
 #, c-format
 msgid "session limit %d reached, some connections will be refused"
-msgstr ""
-"numero limite di sessioni (%d) raggiunto, alcune connessioni verrano "
-"rifiutate"
+msgstr "numero limite di sessioni (%d) raggiunto, alcune connessioni verrano rifiutate"
 
 #: src/network/listener.cc:61
 #, c-format
@@ -5342,19 +5181,23 @@ msgstr "byte out"
 msgid "bytes out"
 msgstr "byte out"
 
-#: src/network/netsync_session.cc:357 src/network/netsync_session.cc:378
+#: src/network/netsync_session.cc:357
+#: src/network/netsync_session.cc:378
 msgid "certs in"
 msgstr "cert. in"
 
-#: src/network/netsync_session.cc:359 src/network/netsync_session.cc:372
+#: src/network/netsync_session.cc:359
+#: src/network/netsync_session.cc:372
 msgid "revs in"
 msgstr "rev. in"
 
-#: src/network/netsync_session.cc:364 src/network/netsync_session.cc:380
+#: src/network/netsync_session.cc:364
+#: src/network/netsync_session.cc:380
 msgid "certs out"
 msgstr "cert. out"
 
-#: src/network/netsync_session.cc:366 src/network/netsync_session.cc:374
+#: src/network/netsync_session.cc:366
+#: src/network/netsync_session.cc:374
 msgid "revs out"
 msgstr "rev. out"
 
@@ -5364,13 +5207,13 @@ msgstr "underflow del numero di elementi
 msgstr "underflow del numero di elementi %s da ricevere"
 
 #: src/network/netsync_session.cc:756
-#, c-format
-msgid "Unexpected 'refine' command on non-refined item type"
+#, fuzzy, c-format
+msgid "unexpected 'refine' command on non-refined item type"
 msgstr "Comando ‘refine’ non atteso su un elemento di tipo non-refined"
 
 #: src/network/netsync_session.cc:788
-#, c-format
-msgid "Unexpected 'done' command on non-refined item type"
+#, fuzzy, c-format
+msgid "unexpected 'done' command on non-refined item type"
 msgstr "Comando ‘done’ non atteso su un elemento di tipo non-refined"
 
 #: src/network/netsync_session.cc:856
@@ -5379,37 +5222,33 @@ msgstr "‘%s’ con hash ‘%s’ non Ã
 msgstr "‘%s’ con hash ‘%s’ non è presente nel database"
 
 #: src/network/netsync_session.cc:978
-#, c-format
-msgid "Mismatched epoch on branch %s. Server has '%s', client has '%s'."
-msgstr ""
-"Epoca non corrispondente sul ramo ‘%s’: il server usa ‘%s’, il client usa "
-"‘%s’."
+#, fuzzy, c-format
+msgid "mismatched epoch on branch '%s'. Server has %s, client has %s"
+msgstr "Epoca non corrispondente sul ramo ‘%s’: il server usa ‘%s’, il client usa ‘%s’."
 
 #: src/network/netsync_session.cc:997
 #, c-format
 msgid "hash check failed for public key '%s' (%s); wanted '%s' got '%s'"
-msgstr ""
-"verifica dell'hash fallita per la chiave pubblica ‘%s’ (%s); atteso ‘%s’, "
-"ottenuto ‘%s’"
+msgstr "verifica dell'hash fallita per la chiave pubblica ‘%s’ (%s); atteso ‘%s’, ottenuto ‘%s’"
 
 #: src/network/netsync_session.cc:1006
-#, c-format
-msgid "Received duplicate key %s"
+#, fuzzy, c-format
+msgid "received duplicate key %s"
 msgstr "Ricevuta chiave duplicata: %s"
 
 #: src/network/netsync_session.cc:1020
 #, c-format
 msgid ""
-"Dropping incoming cert which claims to be signed by key\n"
-"'%s' (name '%s'), but has a bad signature"
+"dropping incoming cert which claims to be signed by key\n"
+"%s (name '%s'), but has a bad signature"
 msgstr ""
 
 #: src/network/netsync_session.cc:1030
 #, c-format
 msgid ""
-"dropping incoming cert which was signed by a key we don't have\n"
-"you probably need to obtain this key from a more recent netsync peer\n"
-"the name of the key involved is '%s', but note that there are multiple\n"
+"dropping incoming cert which was signed by a key we don't have.\n"
+"You probably need to obtain this key from a more recent netsync peer.\n"
+"The name of the key involved is '%s', but note that there are multiple\n"
 "keys with this name and we don't know which one it is"
 msgstr ""
 
@@ -5440,11 +5279,8 @@ msgstr "il server ha negato l'accesso an
 
 #: src/network/netsync_session.cc:1253
 #, c-format
-msgid ""
-"denied '%s' read permission for '%s' excluding '%s' because of branch '%s'"
-msgstr ""
-"negato a ‘%s’ il permesso di lettura a ‘%s’ con esclusione di ‘%s’ a causa "
-"del ramo ‘%s’"
+msgid "denied '%s' read permission for '%s' excluding '%s' because of branch '%s'"
+msgstr "negato a ‘%s’ il permesso di lettura a ‘%s’ con esclusione di ‘%s’ a causa del ramo ‘%s’"
 
 #: src/network/netsync_session.cc:1264
 #, c-format
@@ -5459,8 +5295,7 @@ msgid "allowed anonymous read/write perm
 #: src/network/netsync_session.cc:1274
 #, c-format
 msgid "allowed anonymous read/write permission for '%s' excluding '%s'"
-msgstr ""
-"concessi permessi di lettura/scrittura anonime a ‘%s’ con esclusione di ‘%s’"
+msgstr "concessi permessi di lettura/scrittura anonime a ‘%s’ con esclusione di ‘%s’"
 
 #: src/network/netsync_session.cc:1283
 #, c-format
@@ -5472,12 +5307,14 @@ msgstr "concessi a ‘%s’ permessi di 
 msgid "allowed '%s' write permission for '%s' excluding '%s'"
 msgstr "concessi a ‘%s’ permessi di scrittura per ‘%s’ con esclusione di ‘%s’"
 
-#: src/network/netsync_session.cc:1312 src/network/reactor.cc:53
+#: src/network/netsync_session.cc:1312
+#: src/network/reactor.cc:53
 #, c-format
 msgid "protocol error while processing peer %s: '%s'"
 msgstr "errore di protocollo processando il peer ‘%s’: %s"
 
-#: src/network/netsync_session.cc:1318 src/network/reactor.cc:59
+#: src/network/netsync_session.cc:1318
+#: src/network/reactor.cc:59
 #, c-format
 msgid "recoverable '%s' error while processing peer %s: '%s'"
 msgstr "errore ‘%s’ recuperabile durante l'elaborazione peer %s: ‘%s’"
@@ -5491,13 +5328,14 @@ msgstr "certificati"
 msgid "certificates"
 msgstr "certificati"
 
-#: src/network/netsync_session.cc:1368 src/database_check.cc:469
+#: src/network/netsync_session.cc:1368
+#: src/database_check.cc:469
 msgid "keys"
 msgstr "chiavi"
 
 #: src/network/netsync_session.cc:1467
-#, c-format
-msgid "Cannot find key '%s'"
+#, fuzzy, c-format
+msgid "cannot find key '%s'"
 msgstr "Non trovo la chiave ‘%s’"
 
 #: src/network/reactor.cc:182
@@ -5506,19 +5344,19 @@ msgstr "il peer ‘%s’ è stato fermo 
 msgstr "il peer ‘%s’ è stato fermo troppo a lungo, mi scollego"
 
 #: src/network/session.cc:199
-#, c-format
-msgid "Received warning from usher: %s"
+#, fuzzy, c-format
+msgid "received warning from usher: %s"
 msgstr "Ricevuto avvertimento dall'usciere: %s"
 
 #: src/network/session.cc:279
-#, c-format
+#, fuzzy, c-format
 msgid ""
 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
 "@ WARNING: SERVER IDENTIFICATION HAS CHANGED              @\n"
 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
 "IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY\n"
-"it is also possible that the server key has just been changed\n"
-"remote host sent key %s\n"
+"It is also possible that the server key has just been changed.\n"
+"Remote host sent key %s,\n"
 "I expected %s\n"
 "'%s unset %s %s' overrides this check"
 msgstr ""
@@ -5537,9 +5375,9 @@ msgstr "la chiave del server è cambiata
 msgstr "la chiave del server è cambiata"
 
 #: src/network/session.cc:295
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"first time connecting to server %s\n"
+"first time connecting to server %s.\n"
 "I'll assume it's really them, but you might want to double-check\n"
 "their key's fingerprint: %s"
 msgstr ""
@@ -5552,7 +5390,8 @@ msgstr "salvo la chiave pubblica per ‘
 msgid "saving public key for %s to database"
 msgstr "salvo la chiave pubblica per ‘%s’ nel database"
 
-#: src/network/session.cc:361 src/network/session.cc:369
+#: src/network/session.cc:361
+#: src/network/session.cc:369
 #, c-format
 msgid "received network error: %s"
 msgstr "ricevuto errore di rete: %s"
@@ -5567,15 +5406,18 @@ msgstr "ricevuta fase di saluto %d scono
 msgid "unknown bye phase %d received"
 msgstr "ricevuta fase di saluto %d sconosciuta"
 
-#: src/network/session.cc:598 src/network/session.cc:610
+#: src/network/session.cc:598
+#: src/network/session.cc:610
 msgid "source and sink"
 msgstr "sorgente e pozzo"
 
-#: src/network/session.cc:599 src/network/session.cc:611
+#: src/network/session.cc:599
+#: src/network/session.cc:611
 msgid "source"
 msgstr "sorgente"
 
-#: src/network/session.cc:599 src/network/session.cc:611
+#: src/network/session.cc:599
+#: src/network/session.cc:611
 msgid "sink"
 msgstr "pozzo"
 
@@ -5596,12 +5438,8 @@ msgstr "il peer ‘%s’ ha terminato la
 
 #: src/network/session_base.cc:156
 #, c-format
-msgid ""
-"peer %s IO terminated connection in shutdown state (possibly client "
-"misreported error)"
-msgstr ""
-"il peer ‘%s’ ha terminato la connessione durante la chiusura (forse il "
-"client ha mal riportato l'errore)"
+msgid "peer %s IO terminated connection in shutdown state (possibly client misreported error)"
+msgstr "il peer ‘%s’ ha terminato la connessione durante la chiusura (forse il client ha mal riportato l'errore)"
 
 #: src/network/session_base.cc:228
 #, c-format
@@ -5615,11 +5453,8 @@ msgstr "IO del peer ‘%s’ fallito dur
 
 #: src/network/session_base.cc:242
 #, c-format
-msgid ""
-"peer %s IO failed in shutdown state (possibly client misreported error)"
-msgstr ""
-"IO del peer ‘%s’ fallito durante la chiusura (forse il cliente ha mal "
-"trasmesso l'errore)"
+msgid "peer %s IO failed in shutdown state (possibly client misreported error)"
+msgstr "IO del peer ‘%s’ fallito durante la chiusura (forse il cliente ha mal trasmesso l'errore)"
 
 #: src/network/session_base.cc:248
 #, c-format
@@ -5627,11 +5462,12 @@ msgstr "IO del peer ‘%s’ fallito dur
 msgstr "IO del peer ‘%s’ fallito durante la conferma (successo)"
 
 #: src/network/session_base.cc:256
-#, c-format
-msgid "Network error on peer %s, disconnecting"
+#, fuzzy, c-format
+msgid "network error on peer %s, disconnecting"
 msgstr "Errore di rete con il peer ‘%s’, mi scollego"
 
-#: src/netxx_pipe.cc:50 src/netxx_pipe.cc:189
+#: src/netxx_pipe.cc:50
+#: src/netxx_pipe.cc:189
 #, c-format
 msgid "this transport not supported on native Win32; use Cygwin"
 msgstr "questo tipo di trasporto non è supportato in Win32 nativo; usa Cygwin"
@@ -5705,15 +5541,11 @@ msgid "the remote side has a newer, inco
 
 #: src/netcmd.cc:146
 msgid "the remote side has a newer, incompatible version of monotone"
-msgstr ""
-"all'altro capo c'è una versione più nuova di monotone, non compatibile con "
-"questa"
+msgstr "all'altro capo c'è una versione più nuova di monotone, non compatibile con questa"
 
 #: src/netcmd.cc:147
 msgid "the remote side has an older, incompatible version of monotone"
-msgstr ""
-"all'altro capo c'è una versione più vecchia di monotone, non compatibile con"
-" questa"
+msgstr "all'altro capo c'è una versione più vecchia di monotone, non compatibile con questa"
 
 #: src/netcmd.cc:160
 #, c-format
@@ -5729,7 +5561,8 @@ msgstr ""
 "valore HMAC errato (ottenuto %s, atteso %s)\n"
 "questo indica che i dati ricevuti sono corrotti"
 
-#: src/netcmd.cc:301 src/netcmd.cc:347
+#: src/netcmd.cc:301
+#: src/netcmd.cc:347
 #, c-format
 msgid "unknown role specifier %d"
 msgstr "specificatore di ruolo %d sconosciuto"
@@ -5745,25 +5578,25 @@ msgstr "l'hash del nodo non corrisponde:
 msgstr "l'hash del nodo non corrisponde: è %s ma era atteso %s"
 
 #: src/rcs_import.cc:714
-#, c-format
-msgid "parsing RCS file %s"
+#, fuzzy, c-format
+msgid "parsing RCS file '%s'"
 msgstr "analizzo il file RCS ‘%s’"
 
 #: src/rcs_import.cc:717
-#, c-format
-msgid "parsed RCS file %s OK"
+#, fuzzy, c-format
+msgid "parsed RCS file '%s' OK"
 msgstr "file RCS ‘%s’ analizzato correttamente"
 
 #: src/rcs_import.cc:906
-#, c-format
-msgid "error reading RCS file %s: %s"
+#, fuzzy, c-format
+msgid "error reading RCS file '%s': %s"
 msgstr "errore leggendo file RCS ‘%s’: %s"
 
 #: src/rcs_import.cc:1210
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"%s appears to be a CVS repository root directory\n"
-"try importing a module instead, with 'cvs_import %s/<module_name>"
+"'%s' appears to be a CVS repository root directory\n"
+"try importing a module instead, with 'cvs_import %s/<module_name>'"
 msgstr ""
 "‘%s’ sembra essere la radice di un repository CVS\n"
 "prova invece a importare un modulo, con ‘cvs_import %s/<nome_modulo>’"
@@ -5821,33 +5654,31 @@ msgstr ""
 msgstr ""
 
 #: src/revision.cc:28
-#, c-format
-msgid "Revision has no manifest id"
+#, fuzzy, c-format
+msgid "revision has no manifest id"
 msgstr "La revisione non ha id manifesto"
 
 #: src/revision.cc:39
-#, c-format
-msgid "Merge revision has a null parent"
-msgstr ""
+#, fuzzy, c-format
+msgid "merge revision has a null parent"
+msgstr "la revisione selezionata non è sul ramo attuale"
 
 #: src/revision.cc:43
-#, c-format
-msgid "Revision has %d edges, not 1 or 2"
-msgstr ""
+#, fuzzy, c-format
+msgid "revision has %d edges, not 1 or 2"
+msgstr "la revisione %s ha %d genitori, impossibile invertire"
 
 #: src/revision.cc:237
 #, c-format
 msgid "the command '%s %s' cannot be restricted in a two-parent workspace"
-msgstr ""
-"il comando ‘%s %s’ non può essere ristretto in spazio di lavoro di due-"
-"genitori"
+msgstr "il comando ‘%s %s’ non può essere ristretto in spazio di lavoro di due-genitori"
 
 #: src/revision.cc:379
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"encountered a revision with unknown format, version '%s'\n"
-"I only know how to understand the version '1' format\n"
-"a newer version of monotone is required to complete this operation"
+"encountered a revision with unknown format, version %s.\n"
+"I only know how to understand the version 1 format.\n"
+"A newer version of monotone is required to complete this operation"
 msgstr ""
 "incontrata una revisione con un formato sconosciuto, versione ‘%s’.\n"
 "capisco solo la versione formato ‘1’\n"
@@ -5861,14 +5692,12 @@ msgid "restriction includes deletion of 
 #: src/roster.cc:2477
 #, c-format
 msgid "restriction includes deletion of '%s' but excludes deletion of '%s'"
-msgstr ""
-"le restrizioni includono la cancellazione di ‘%s’ ma esclude quella di ‘%s’"
+msgstr "le restrizioni includono la cancellazione di ‘%s’ ma esclude quella di ‘%s’"
 
 #: src/roster.cc:2488
 #, c-format
 msgid "restriction excludes addition of '%s' but includes addition of '%s'"
-msgstr ""
-"le restrizioni escludono l'aggiunta di ‘%s’ ma includono quella di ‘%s’"
+msgstr "le restrizioni escludono l'aggiunta di ‘%s’ ma includono quella di ‘%s’"
 
 #: src/roster.cc:2514
 #, c-format
@@ -5922,13 +5751,12 @@ msgstr "Stampa la testa di un dato ramo"
 
 #: src/automate.cc:96
 #, c-format
-msgid ""
-"with no argument, this command prints the heads of the workspace's branch"
-msgstr ""
-"senza parametri, questo comando stampa le teste del ramo dello spazio di "
-"lavoro"
+msgid "with no argument, this command prints the heads of the workspace's branch"
+msgstr "senza parametri, questo comando stampa le teste del ramo dello spazio di lavoro"
 
-#: src/automate.cc:116 src/automate.cc:169 src/automate.cc:1723
+#: src/automate.cc:116
+#: src/automate.cc:169
+#: src/automate.cc:1723
 msgid "REV1 [REV2 [REV3 [...]]]"
 msgstr "REV_1 [REV_2 [REV_3 […]]]"
 
@@ -5940,7 +5768,8 @@ msgstr "Stampa i discendenti di una data
 msgid "Prints the descendents of the given revisions"
 msgstr "Stampa i discendenti di una data reivisione"
 
-#: src/automate.cc:223 src/automate.cc:253
+#: src/automate.cc:223
+#: src/automate.cc:253
 msgid "[REV1 [REV2 [REV3 [...]]]]"
 msgstr "[REV_1 [REV_2 [REV_3 […]]]]"
 
@@ -5958,9 +5787,7 @@ msgid "Lists the ancestors of the first 
 
 #: src/automate.cc:292
 msgid "Lists the ancestors of the first revision given, not in the others"
-msgstr ""
-"Elenca gli antenati della prima revisione data che non lo sono delle "
-"successive"
+msgstr "Elenca gli antenati della prima revisione data che non lo sono delle successive"
 
 #: src/automate.cc:339
 msgid "Lists the leaves of the revision graph"
@@ -5982,7 +5809,8 @@ msgstr "Stampa il grafo completo delle p
 msgid "Prints the complete ancestry graph"
 msgstr "Stampa il grafo completo delle parentele"
 
-#: src/automate.cc:514 src/asciik.cc:373
+#: src/automate.cc:514
+#: src/asciik.cc:373
 msgid "SELECTOR"
 msgstr "SELETTORE"
 
@@ -5991,19 +5819,17 @@ msgstr "Elenca le revisioni corrisponden
 msgstr "Elenca le revisioni corrispondenti ad un selettore"
 
 #: src/automate.cc:907
-#, c-format
-msgid ""
-"'%s' is both known and ignored; it will be shown as 'missing'. Check .mtn-"
-"ignore."
-msgstr ""
-"‘%s’ è sia conosciuto che ignorato; verrà mostrato come ‘mancante’. Verifica"
-" il file ‘.mtn-ignore’."
+#, fuzzy, c-format
+msgid "'%s' is both known and ignored; it will be shown as 'missing'. Check '.mtn-ignore'"
+msgstr "‘%s’ è sia conosciuto che ignorato; verrà mostrato come ‘mancante’. Verifica il file ‘.mtn-ignore’."
 
 #: src/automate.cc:1020
 msgid "Prints a summary of files found in the workspace"
 msgstr "Stampa un sommario dei file contenuti nello spazio di lavoro"
 
-#: src/automate.cc:1240 src/automate.cc:1586 src/automate.cc:1617
+#: src/automate.cc:1240
+#: src/automate.cc:1586
+#: src/automate.cc:1617
 msgid "REVID"
 msgstr "ID_REV"
 
@@ -6062,14 +5888,8 @@ msgid "Prints revisions that are common 
 
 #: src/automate.cc:1724
 msgid "Prints revisions that are common ancestors of a list of revisions"
-msgstr ""
-"Stampa le revisioni che sono antenati comuni di una lista di revisioni"
+msgstr "Stampa le revisioni che sono antenati comuni di una lista di revisioni"
 
-#: src/automate.cc:1739
-#, c-format
-msgid "No such revision %s"
-msgstr "La revisione %s non esiste"
-
 #: src/automate.cc:1763
 msgid "Prints all branch certs in the revision graph"
 msgstr "Stampa tutti i certificati di ramo in un grafo delle revisioni"
@@ -6095,15 +5915,13 @@ msgstr "REV FILE"
 msgstr "REV FILE"
 
 #: src/automate.cc:1930
-msgid ""
-"Lists the revisions that changed the content relative to another revision"
-msgstr ""
-"Elenca le revisioni che hanno il contenuto diverso rispetto ad un'altra "
-"revisione"
+msgid "Lists the revisions that changed the content relative to another revision"
+msgstr "Elenca le revisioni che hanno il contenuto diverso rispetto ad un'altra revisione"
 
-#: src/automate.cc:1951 src/automate.cc:2018
-#, c-format
-msgid "file %s is unknown for revision %s"
+#: src/automate.cc:1951
+#: src/automate.cc:2018
+#, fuzzy, c-format
+msgid "file '%s' is unknown for revision %s"
 msgstr "il file ‘%s’ è sconosciuto per la revisione %s"
 
 #: src/automate.cc:1992
@@ -6111,11 +5929,8 @@ msgstr "REV1 FILE REV2"
 msgstr "REV1 FILE REV2"
 
 #: src/automate.cc:1993
-msgid ""
-"Prints the name of a file in a target revision relative to a given revision"
-msgstr ""
-"Stampa il nome di un file in una revisione selezionata relativa a una "
-"revisione data"
+msgid "Prints the name of a file in a target revision relative to a given revision"
+msgstr "Stampa il nome di un file in una revisione selezionata relativa a una revisione data"
 
 #: src/automate.cc:2045
 msgid "[FILEID] CONTENTS"
@@ -6155,8 +5970,8 @@ msgstr "Recupera una variabile dal datab
 msgstr "Recupera una variabile dal database"
 
 #: src/automate.cc:2245
-#, c-format
-msgid "No variables found or invalid domain specified"
+#, fuzzy, c-format
+msgid "no variables found or invalid domain specified"
 msgstr "Nessuna variabile trovata o dominio specificato non valido"
 
 #: src/automate.cc:2296
@@ -6168,8 +5983,8 @@ msgstr "Elimina una variabile dal databa
 msgstr "Elimina una variabile dal database"
 
 #: src/automate.cc:2333
-#, c-format
-msgid "no variables found in domain %s"
+#, fuzzy, c-format
+msgid "no variables found in domain '%s'"
 msgstr "nessuna variabile presente nel dominio ‘%s’"
 
 #: src/automate.cc:2350
@@ -6266,13 +6081,8 @@ msgstr "roster ‘%s’ incompleto (%d r
 
 #: src/database_check.cc:775
 #, c-format
-msgid ""
-"revision %s missing (%d revision references; %d cert references; %d parent "
-"references; %d child references; %d roster references)"
-msgstr ""
-"revisione %s mancante (%d riferimenti alla revisione; %d riferimenti al "
-"certificato; %d riferimenti al genitore; %d riferimenti al figlio; %d "
-"riferimenti al roster)"
+msgid "revision %s missing (%d revision references; %d cert references; %d parent references; %d child references; %d roster references)"
+msgstr "revisione %s mancante (%d riferimenti alla revisione; %d riferimenti al certificato; %d riferimenti al genitore; %d riferimenti al figlio; %d riferimenti al roster)"
 
 #: src/database_check.cc:787
 #, c-format
@@ -6302,15 +6112,12 @@ msgid "revision %s mismatched parents (%
 #: src/database_check.cc:824
 #, c-format
 msgid "revision %s mismatched parents (%d ancestry parents; %d revision refs)"
-msgstr ""
-"la revisione %s non corrisponde ai genitori (%d stirpi di genitori; %d "
-"riferimenti alla revisione)"
+msgstr "la revisione %s non corrisponde ai genitori (%d stirpi di genitori; %d riferimenti alla revisione)"
 
 #: src/database_check.cc:833
 #, c-format
 msgid "revision %s mismatched children (%d ancestry children; %d parents)"
-msgstr ""
-"la revisione %s non corrisponde ai figli (%d stirpi di figli; %d genitori)"
+msgstr "la revisione %s non corrisponde ai figli (%d stirpi di figli; %d genitori)"
 
 #: src/database_check.cc:845
 #, c-format
@@ -6320,8 +6127,7 @@ msgid "revision %s is not parseable (per
 #: src/database_check.cc:852
 #, c-format
 msgid "revision %s is not parseable (perhaps with unnormalized paths?)"
-msgstr ""
-"revisione %s non comprensibile (forse a causa di percorsi non normalizzati)"
+msgstr "revisione %s non comprensibile (forse a causa di percorsi non normalizzati)"
 
 #: src/database_check.cc:859
 #, c-format
@@ -6336,9 +6142,7 @@ msgid "revision %s unchecked signature i
 #: src/database_check.cc:916
 #, c-format
 msgid "revision %s unchecked signature in %s cert from missing key %s"
-msgstr ""
-"revisione %s firma non controllata nel certificato ‘%s’ per chiave ‘%s’ "
-"mancante"
+msgstr "revisione %s firma non controllata nel certificato ‘%s’ per chiave ‘%s’ mancante"
 
 #: src/database_check.cc:924
 #, c-format
@@ -6353,9 +6157,7 @@ msgid "revision %s mismatched certs (%d 
 #: src/database_check.cc:949
 #, c-format
 msgid "revision %s mismatched certs (%d authors %d dates %d changelogs)"
-msgstr ""
-"la revisione %s non corrisponde ai certificati (%d autori %d date %d "
-"changelogs)"
+msgstr "la revisione %s non corrisponde ai certificati (%d autori %d date %d changelogs)"
 
 #: src/database_check.cc:973
 #, c-format
@@ -6509,12 +6311,8 @@ msgstr ""
 
 #: src/database_check.cc:1198
 #, c-format
-msgid ""
-"check complete: %d files; %d rosters; %d revisions; %d keys; %d certs; %d "
-"heights; %d branches"
-msgstr ""
-"controllo completo: %d file; %d roster; %d revisioni; %d chiavi; %d "
-"certificati; %d altezze; %d rami"
+msgid "check complete: %d files; %d rosters; %d revisions; %d keys; %d certs; %d heights; %d branches"
+msgstr "controllo completo: %d file; %d roster; %d revisioni; %d chiavi; %d certificati; %d altezze; %d rami"
 
 #: src/database_check.cc:1206
 #, c-format
@@ -6557,33 +6355,29 @@ msgstr "il selettore di certificati ‘c
 msgstr "il selettore di certificati ‘c:’ non può essere vuoto"
 
 #: src/selectors.cc:152
-#, c-format
-msgid "selector '%s' is not a valid date\n"
+#, fuzzy, c-format
+msgid "selector '%s' is not a valid date"
 msgstr "il selettore ‘%s’ non è una data valida\n"
 
 #: src/selectors.cc:168
-#, c-format
-msgid "selector '%s' is not a valid date (%s)"
+#, fuzzy, c-format
+msgid "selector '%s' is not a valid date (internally completed to '%s')"
 msgstr "il selettore ‘%s’ non è una data valida (%s)"
 
 #: src/selectors.cc:172
-#, c-format
-msgid "expanded date '%s' -> '%s'\n"
+#, fuzzy, c-format
+msgid "expanded date '%s' -> '%s'"
 msgstr "espansa la data ‘%s’ in ‘%s’\n"
 
 #: src/selectors.cc:215
 #, c-format
 msgid "the empty head selector h: refers to the head of the current branch"
-msgstr ""
-"il selettore vuoto di testa ‘h:’ si riferisce alla testa del ramo corrente"
+msgstr "il selettore vuoto di testa ‘h:’ si riferisce alla testa del ramo corrente"
 
 #: src/selectors.cc:304
 #, c-format
-msgid ""
-"the empty parent selector p: refers to the base revision of the workspace"
-msgstr ""
-"il selettore vuoto di genitore ‘p:’ si riferisce alla revisione su cui è "
-"basato lo spazio di lavoro"
+msgid "the empty parent selector p: refers to the base revision of the workspace"
+msgstr "il selettore vuoto di genitore ‘p:’ si riferisce alla revisione su cui è basato lo spazio di lavoro"
 
 #: src/selectors.cc:350
 #, c-format
@@ -6592,12 +6386,8 @@ msgstr "nessun valore è permesso con il
 
 #: src/selectors.cc:352
 #, c-format
-msgid ""
-"the update selector u: refers to the revision before the last update in the "
-"workspace"
-msgstr ""
-"il selettore di aggiornamento ‘u:’ si riferisce alla revisione precedente "
-"l'ultimo ‘update’ dello spazio di lavoro"
+msgid "the update selector u: refers to the revision before the last update in the workspace"
+msgstr "il selettore di aggiornamento ‘u:’ si riferisce alla revisione precedente l'ultimo ‘update’ dello spazio di lavoro"
 
 #: src/selectors.cc:373
 #, c-format
@@ -6607,8 +6397,7 @@ msgid "the selector w: returns the base 
 #: src/selectors.cc:375
 #, c-format
 msgid "the selector w: returns the base revision(s) of the workspace"
-msgstr ""
-"il selettore ‘w:’ ritorna la/le revisione/i base dello spazio di lavoro"
+msgstr "il selettore ‘w:’ ritorna la/le revisione/i base dello spazio di lavoro"
 
 #: src/selectors.cc:496
 #, c-format
@@ -6639,8 +6428,7 @@ msgstr ""
 
 #: src/selectors.cc:731
 #, c-format
-msgid ""
-"selector '%s' is invalid, it contains an unknown escape sequence '%s%s'"
+msgid "selector '%s' is invalid, it contains an unknown escape sequence '%s%s'"
 msgstr ""
 
 #: src/selectors.cc:770
@@ -6650,15 +6438,12 @@ msgstr "il selettore ‘%s’ non è val
 
 #: src/selectors.cc:787
 #, c-format
-msgid ""
-"selector '%s' is invalid, function argument doesn't look like an arg-list"
+msgid "selector '%s' is invalid, function argument doesn't look like an arg-list"
 msgstr ""
 
 #: src/selectors.cc:798
 #, c-format
-msgid ""
-"selector '%s' is invalid, grouping parentheses contain something that "
-"doesn't look like an expr"
+msgid "selector '%s' is invalid, grouping parentheses contain something that doesn't look like an expr"
 msgstr ""
 
 #: src/selectors.cc:809
@@ -6672,16 +6457,14 @@ msgstr "il selettore ‘%s’ non è val
 msgstr "il selettore ‘%s’ non è valido: inizia con un ‘|’"
 
 #: src/selectors.cc:838
-#, c-format
-msgid ""
-"selector '%s is invalid, because there is a '%s' someplace it shouldn't be"
-msgstr ""
+#, fuzzy, c-format
+msgid "selector '%s' is invalid, because there is a '%s' someplace it shouldn't be"
+msgstr "il selettore ‘%s’ non è valido: inizia con uno ‘/’"
 
-#: src/selectors.cc:843 src/selectors.cc:846
+#: src/selectors.cc:843
+#: src/selectors.cc:846
 #, c-format
-msgid ""
-"selector '%s' is invalid, don't mix '/' and '|' operators without "
-"parentheses"
+msgid "selector '%s' is invalid, don't mix '/' and '|' operators without parentheses"
 msgstr ""
 
 #: src/selectors.cc:885
@@ -6705,14 +6488,14 @@ msgstr "espanso in ‘%s’"
 msgstr "espanso in ‘%s’"
 
 #: src/annotate.cc:429
-#, c-format
-msgid "%s.. by %s %s: "
+#, fuzzy, c-format
+msgid "%s.. by '%s' %s: "
 msgstr "%s.. da %s %s: "
 
 #: src/annotate.cc:431
-#, c-format
-msgid "%s.. by %s: "
-msgstr ""
+#, fuzzy, c-format
+msgid "%s.. by '%s': "
+msgstr "%s.. da %s %s: "
 
 #: src/annotate.cc:433
 #, c-format
@@ -6724,12 +6507,14 @@ msgstr ""
 msgid "%s..: "
 msgstr ""
 
-#: src/restrictions.cc:79 src/restrictions.cc:159
+#: src/restrictions.cc:79
+#: src/restrictions.cc:159
 #, c-format
 msgid "including required parent '%s'"
 msgstr "includendo genitore richiesto‘%s’"
 
-#: src/restrictions.cc:102 src/restrictions.cc:176
+#: src/restrictions.cc:102
+#: src/restrictions.cc:176
 #, c-format
 msgid "conflicting include/exclude on path '%s'"
 msgstr "conflitto di inclusione/esclusione sul percorso ‘%s’"
@@ -6757,9 +6542,9 @@ msgstr "nota: lo spazio di lavoro non è
 msgstr "nota: lo spazio di lavoro non è stato aggiornato"
 
 #: src/merge_roster.cc:341
-#, c-format
+#, fuzzy, c-format
 msgid ""
-"Content changes to the file '%s'\n"
+"content changes to the file '%s'\n"
 "will be ignored during this merge as the file has been\n"
 "removed on one side of the merge.  Affected revisions include:"
 msgstr ""
@@ -6777,29 +6562,33 @@ msgstr "conflitto: directory root mancan
 msgid "conflict: missing root directory"
 msgstr "conflitto: directory root mancante"
 
-#: src/merge_conflict.cc:586 src/merge_conflict.cc:628
+#: src/merge_conflict.cc:586
+#: src/merge_conflict.cc:628
 #, c-format
 msgid "directory '%s' pivoted to root on the left"
 msgstr "directory ‘%s’ scambiata con la root sulla sinistra"
 
-#: src/merge_conflict.cc:596 src/merge_conflict.cc:638
+#: src/merge_conflict.cc:596
+#: src/merge_conflict.cc:638
 #, c-format
 msgid "directory '%s' deleted on the right"
 msgstr "directory ‘%s’ cancellata a destra"
 
-#: src/merge_conflict.cc:609 src/merge_conflict.cc:649
+#: src/merge_conflict.cc:609
+#: src/merge_conflict.cc:649
 #, c-format
 msgid "directory '%s' deleted on the left"
 msgstr "directory ‘%s’ cancellata a sinistra"
 
-#: src/merge_conflict.cc:618 src/merge_conflict.cc:658
+#: src/merge_conflict.cc:618
+#: src/merge_conflict.cc:658
 #, c-format
 msgid "directory '%s' pivoted to root on the right"
 msgstr "directory ‘%s’ scambiata con la root sulla destra"
 
 #: src/merge_conflict.cc:702
-#, c-format
-msgid "conflict: invalid name _MTN in root directory"
+#, fuzzy, c-format
+msgid "conflict: invalid name '_MTN' in root directory"
 msgstr "conflitto: nome ‘_MTN’ non valido nella directory root"
 
 #: src/merge_conflict.cc:712
@@ -6807,7 +6596,8 @@ msgstr "‘%s’ scambiato con la root s
 msgid "'%s' pivoted to root on the left"
 msgstr "‘%s’ scambiato con la root sulla sinistra"
 
-#: src/merge_conflict.cc:722 src/merge_conflict.cc:825
+#: src/merge_conflict.cc:722
+#: src/merge_conflict.cc:825
 #: src/merge_conflict.cc:843
 #, c-format
 msgid "'%s' renamed to '%s' on the right"
@@ -6823,7 +6613,8 @@ msgstr "‘%s’ scambiato con la root s
 msgid "'%s' pivoted to root on the right"
 msgstr "‘%s’ scambiato con la root sulla destra"
 
-#: src/merge_conflict.cc:752 src/merge_conflict.cc:816
+#: src/merge_conflict.cc:752
+#: src/merge_conflict.cc:816
 #: src/merge_conflict.cc:834
 #, c-format
 msgid "'%s' renamed to '%s' on the left"
@@ -6935,42 +6726,50 @@ msgstr ""
 "           chiamata ‘%s’ a sinistra e\n"
 "           chiamata ‘%s’ a destra."
 
-#: src/merge_conflict.cc:1127 src/merge_conflict.cc:1177
+#: src/merge_conflict.cc:1127
+#: src/merge_conflict.cc:1177
 #, c-format
 msgid "added as a new file on the left"
 msgstr "aggiunto come nuovo file sulla sinistra"
 
-#: src/merge_conflict.cc:1129 src/merge_conflict.cc:1179
+#: src/merge_conflict.cc:1129
+#: src/merge_conflict.cc:1179
 #, c-format
 msgid "added as a new directory on the left"
 msgstr "aggiunto come nuova directory sulla sinistra"
 
-#: src/merge_conflict.cc:1137 src/merge_conflict.cc:1161
+#: src/merge_conflict.cc:1137
+#: src/merge_conflict.cc:1161
 #, c-format
 msgid "added as a new file on the right"
 msgstr "aggiunto come nuovo file sulla destra"
 
-#: src/merge_conflict.cc:1139 src/merge_conflict.cc:1163
+#: src/merge_conflict.cc:1139
+#: src/merge_conflict.cc:1163
 #, c-format
 msgid "added as a new directory on the right"
 msgstr "aggiunto come nuova directory sulla destra"
 
-#: src/merge_conflict.cc:1152 src/merge_conflict.cc:1204
+#: src/merge_conflict.cc:1152
+#: src/merge_conflict.cc:1204
 #, c-format
 msgid "renamed from file '%s' on the left"
 msgstr "rinominato dal file ‘%s’ sulla sinistra"
 
-#: src/merge_conflict.cc:1154 src/merge_conflict.cc:1206
+#: src/merge_conflict.cc:1154
+#: src/merge_conflict.cc:1206
 #, c-format
 msgid "renamed from directory '%s' on the left"
 msgstr "rinominato dalla directory ‘%s’ sulla sinistra"
 
-#: src/merge_conflict.cc:1187 src/merge_conflict.cc:1214
+#: src/merge_conflict.cc:1187
+#: src/merge_conflict.cc:1214
 #, c-format
 msgid "renamed from file '%s' on the right"
 msgstr "rinominato dal file ‘%s’ sulla destra"
 
-#: src/merge_conflict.cc:1189 src/merge_conflict.cc:1216
+#: src/merge_conflict.cc:1189
+#: src/merge_conflict.cc:1216
 #, c-format
 msgid "renamed from directory '%s' on the right"
 msgstr "rinominato dalla directory ‘%s’ sulla destra"
@@ -7007,20 +6806,13 @@ msgstr "cancellato sulla destra"
 
 #: src/merge_conflict.cc:1301
 #, c-format
-msgid ""
-"conflict: multiple values for attribute '%s' on file '%s' from revision %s"
-msgstr ""
-"conflitto: valori multipli per l'attributo ‘%s’ sul file ‘%s’ della "
-"revisione %s"
+msgid "conflict: multiple values for attribute '%s' on file '%s' from revision %s"
+msgstr "conflitto: valori multipli per l'attributo ‘%s’ sul file ‘%s’ della revisione %s"
 
 #: src/merge_conflict.cc:1304
 #, c-format
-msgid ""
-"conflict: multiple values for attribute '%s' on directory '%s' from revision"
-" %s"
-msgstr ""
-"conflitto: valori multipli per l'attributo ‘%s’ sulla directory ‘%s’ della "
-"revisione %s"
+msgid "conflict: multiple values for attribute '%s' on directory '%s' from revision %s"
+msgstr "conflitto: valori multipli per l'attributo ‘%s’ sulla directory ‘%s’ della revisione %s"
 
 #: src/merge_conflict.cc:1310
 #, c-format
@@ -7092,7 +6884,8 @@ msgstr "l'hash del contenuto è %s sulla
 msgid "content hash is %s on the right in file '%s'"
 msgstr "l'hash del contenuto è %s sulla destra nel file ‘%s’"
 
-#: src/merge_conflict.cc:1483 src/merge_conflict.cc:1714
+#: src/merge_conflict.cc:1483
+#: src/merge_conflict.cc:1714
 #: src/merge_conflict.cc:2079
 #, c-format
 msgid "conflicts file does not match current conflicts"
@@ -7128,73 +6921,74 @@ msgstr "id revisione destra non corrispo
 msgstr "id revisione destra non corrisponde al file conflitti"
 
 #: src/merge_conflict.cc:2285
-#, c-format
-msgid "%s already exists"
+#, fuzzy, c-format
+msgid "'%s' already exists"
 msgstr "‘%s’ esiste già"
 
 #: src/merge_conflict.cc:2287
-#, c-format
-msgid "directory %s does not exist or is unknown"
+#, fuzzy, c-format
+msgid "directory '%s' does not exist or is unknown"
 msgstr "la directory ‘%s’ non esiste o è sconosciuta"
 
 #: src/merge_conflict.cc:2337
-#, c-format
-msgid "can't drop directory %s; it is not empty"
+#, fuzzy, c-format
+msgid "can't drop directory '%s'; it is not empty"
 msgstr "non posso cancellare ‘%s/’: la directory non è vuota"
 
 #: src/merge_conflict.cc:2352
-#, c-format
-msgid "no resolution provided for orphaned_node %s"
-msgstr ""
+#, fuzzy, c-format
+msgid "no resolution provided for orphaned_node '%s'"
+msgstr "nessuna soluziona fornita per ‘duplicate_name %s’"
 
 #: src/merge_conflict.cc:2357
-#, c-format
-msgid "invalid resolution for orphaned_node %s"
-msgstr ""
+#, fuzzy, c-format
+msgid "invalid resolution for orphaned_node '%s'"
+msgstr "soluzione non valida per ‘duplicate_name %s’"
 
-#: src/merge_conflict.cc:2381 src/merge_conflict.cc:2419
-#, c-format
-msgid "inconsistent left/right resolutions for %s"
+#: src/merge_conflict.cc:2381
+#: src/merge_conflict.cc:2419
+#, fuzzy, c-format
+msgid "inconsistent left/right resolutions for '%s'"
 msgstr "soluzioni sinistra/destra inconsistenti per %s"
 
 #: src/merge_conflict.cc:2383
-#, c-format
-msgid "replacing content of %s with %s"
+#, fuzzy, c-format
+msgid "replacing content of '%s' with '%s'"
 msgstr "rimpiazza contenuto di %s con %s"
 
 #: src/merge_conflict.cc:2410
-#, c-format
-msgid "can't drop %s; not empty"
+#, fuzzy, c-format
+msgid "can't drop '%s'; not empty"
 msgstr "non posso cancellare ‘%s/’: la directory non è vuota"
 
 #: src/merge_conflict.cc:2421
-#, c-format
-msgid "keeping %s"
+#, fuzzy, c-format
+msgid "keeping '%s'"
 msgstr "mantengo ‘%s’"
 
 #: src/merge_conflict.cc:2433
-#, c-format
-msgid "no resolution provided for duplicate_name %s"
+#, fuzzy, c-format
+msgid "no resolution provided for duplicate_name '%s'"
 msgstr "nessuna soluziona fornita per ‘duplicate_name %s’"
 
 #: src/merge_conflict.cc:2438
-#, c-format
-msgid "invalid resolution for duplicate_name %s"
+#, fuzzy, c-format
+msgid "invalid resolution for duplicate_name '%s'"
 msgstr "soluzione non valida per ‘duplicate_name %s’"
 
 #: src/merge_conflict.cc:2538
-#, c-format
-msgid "merge of %s, %s failed"
+#, fuzzy, c-format
+msgid "merge of '%s', '%s' failed"
 msgstr "unione di %s, %s fallita"
 
 #: src/merge_conflict.cc:2540
-#, c-format
-msgid "merged %s, %s"
-msgstr ""
+#, fuzzy, c-format
+msgid "merged '%s', '%s'"
+msgstr "[unione]   %s"
 
 #: src/merge_conflict.cc:2549
-#, c-format
-msgid "replacing content of %s, %s with %s"
+#, fuzzy, c-format
+msgid "replacing content of '%s', '%s' with '%s'"
 msgstr "rimpiazza il contenuto di %s, %s con %s"
 
 #: src/merge_content.cc:271
@@ -7208,8 +7002,8 @@ msgstr "nello spazio di lavoro ‘%s’ 
 msgstr "nello spazio di lavoro ‘%s’ è una directory, non un file"
 
 #: src/merge_content.cc:276
-#, c-format
-msgid "file %s in workspace has id %s, wanted %s"
+#, fuzzy, c-format
+msgid "file '%s' in workspace has id %s, wanted %s"
 msgstr "il file ‘%s’ hd id ‘%s’ nello spazio di lavoro, era atteso ‘%s’"
 
 #: src/merge_content.cc:533
@@ -7254,9 +7048,12 @@ msgstr ""
 msgid "unable to parse host of URI '%s'"
 msgstr ""
 
-#: src/uri.cc:150 src/uri.cc:153 src/uri.cc:175 src/uri.cc:196
-#, c-format
-msgid "Bad URLencoded string '%s'"
+#: src/uri.cc:150
+#: src/uri.cc:153
+#: src/uri.cc:175
+#: src/uri.cc:196
+#, fuzzy, c-format
+msgid "bad URLencoded string '%s'"
 msgstr "La stringa ‘%s’ ha un URL-encoding non corretto"
 
 #: src/sha1.cc:34
@@ -7279,23 +7076,23 @@ msgstr "%s MiB/s"
 msgstr "%s MiB/s"
 
 #: src/pcrewrap.cc:219
-#, c-format
-msgid "while compiling regex \"%s\": %s"
+#, fuzzy, c-format
+msgid "while compiling regex '%s': %s"
 msgstr "durante la compilazione dell'espressione regolare ‘%s’: %s"
 
 #: src/pcrewrap.cc:228
-#, c-format
-msgid "error in regex \"%s\": %s"
+#, fuzzy, c-format
+msgid "error in regex '%s': %s"
 msgstr "errore nell'espressione regolare ‘%s’: %s"
 
 #: src/pcrewrap.cc:230
-#, c-format
-msgid "error near char %d of regex \"%s\": %s"
+#, fuzzy, c-format
+msgid "error near char %d of regex '%s': %s"
 msgstr "errore vicino al carattere %d della regex ‘%s’: %s"
 
 #: src/pcrewrap.cc:245
-#, c-format
-msgid "while studying regex \"%s\": %s"
+#, fuzzy, c-format
+msgid "while studying regex '%s': %s"
 msgstr "durante lo studio dell'espressione regolare ‘%s’: %s"
 
 #: src/pcrewrap.cc:263
@@ -7311,9 +7108,7 @@ msgid "invalid UTF-8 sequence found duri
 #: src/pcrewrap.cc:272
 #, c-format
 msgid "invalid UTF-8 sequence found during regular _expression_ matching"
-msgstr ""
-"trovata una sequenza UTF-8 non valida durante un match con espressione "
-"regolare"
+msgstr "trovata una sequenza UTF-8 non valida durante un match con espressione regolare"
 
 #: src/pcrewrap.cc:275
 #, c-format
@@ -7362,7 +7157,8 @@ msgstr ""
 "  rinominato   %s\n"
 "          in   %s"
 
-#: src/rev_output.cc:161 src/rev_output.cc:165
+#: src/rev_output.cc:161
+#: src/rev_output.cc:165
 #, c-format
 msgid "  added    %s"
 msgstr "  aggiunto     %s"
@@ -7403,7 +7199,8 @@ msgstr ""
 "(your system clock may not be set correctly)"
 msgstr ""
 
-#: src/dates.cc:383 src/dates.cc:387
+#: src/dates.cc:383
+#: src/dates.cc:387
 #, c-format
 msgid "date '%s' is out of range and cannot be formatted"
 msgstr ""
@@ -7415,9 +7212,7 @@ msgstr ""
 
 #: src/dates.cc:431
 #, c-format
-msgid ""
-"date '%s' is too long when formatted using '%s' (the result must fit in %d "
-"characters)"
+msgid "date '%s' is too long when formatted using '%s' (the result must fit in %d characters)"
 msgstr ""
 
 #: src/dates.cc:492
@@ -7425,13 +7220,18 @@ msgstr ""
 msgid "date '%s' is out of range and cannot be parsed"
 msgstr ""
 
-#: src/dates.cc:533 src/dates.cc:547 src/dates.cc:562 src/dates.cc:570
-#: src/dates.cc:577 src/dates.cc:589 src/dates.cc:601 src/dates.cc:610
+#: src/dates.cc:533
+#: src/dates.cc:547
+#: src/dates.cc:562
+#: src/dates.cc:570
+#: src/dates.cc:577
+#: src/dates.cc:589
+#: src/dates.cc:601
+#: src/dates.cc:610
 #: src/dates.cc:644
 #, c-format
 msgid "unrecognized date (monotone only understands ISO 8601 format)"
-msgstr ""
-"data non riconosciuta (monotone comprende solo le date in formato ISO 8601)"
+msgstr "data non riconosciuta (monotone comprende solo le date in formato ISO 8601)"
 
 #: src/dates.cc:537
 #, c-format
@@ -7468,38 +7268,31 @@ msgstr "numero di giorno non valido per 
 msgid "day out of range for its month in '%s'"
 msgstr "numero di giorno non valido per il proprio mese in ‘%s’"
 
-#: src/netio.hh:36 src/netio.hh:54
-#, c-format
-msgid "need %d bytes to decode %s at %d, only have %d"
-msgstr ""
-"sono necessari %d byte per decodificare ‘%s’ alla posizione %d, ma solo %d "
-"sono disponibili"
+#: src/netio.hh:36
+#: src/netio.hh:54
+#, fuzzy, c-format
+msgid "need %d bytes to decode '%s' at %d, only have %d"
+msgstr "sono necessari %d byte per decodificare ‘%s’ alla posizione %d, ma solo %d sono disponibili"
 
-#: src/netio.hh:82 src/netio.hh:117
+#: src/netio.hh:82
+#: src/netio.hh:117
 #, c-format
-msgid ""
-"overflow while decoding variable length integer '%s' into a %d-byte field"
-msgstr ""
-"overflow nella decodifica dell'intero a lunghezza variabile ‘%s’ in un campo"
-" di %d-byte"
+msgid "overflow while decoding variable length integer '%s' into a %d-byte field"
+msgstr "overflow nella decodifica dell'intero a lunghezza variabile ‘%s’ in un campo di %d-byte"
 
 #: src/netio.hh:137
 #, c-format
 msgid "ran out of bytes reading variable length integer '%s' at pos %d"
-msgstr ""
-"spazio esaurito nella lettura dell'intero a lunghezza variabile ‘%s’ alla "
-"posizione %d"
+msgstr "spazio esaurito nella lettura dell'intero a lunghezza variabile ‘%s’ alla posizione %d"
 
 #: src/netio.hh:273
 #, c-format
 msgid "decoding variable length string of %d bytes for '%s', maximum is %d"
-msgstr ""
-"decodifica in corso della stringa a lungheza variabile di %d byte per ‘%s’, "
-"il massimo è %d"
+msgstr "decodifica in corso della stringa a lungheza variabile di %d byte per ‘%s’, il massimo è %d"
 
 #: src/netio.hh:328
-#, c-format
-msgid "expected %s to end at %d, have %d bytes"
+#, fuzzy, c-format
+msgid "expected '%s' to end at %d, have %d bytes"
 msgstr "era previsto che ‘%s’ terminasse in %d, ci sono %d byte"
 
 #: src/option.cc:24
@@ -7533,8 +7326,8 @@ msgstr "parametro ‘%s’ non valido pe
 msgstr "parametro ‘%s’ non valido per l'opzione ‘%s’: %s"
 
 #: src/option.cc:238
-#, c-format
-msgid "Invalid escape in --xargs file"
+#, fuzzy, c-format
+msgid "invalid escape in '--xargs' file"
 msgstr "Escape non validi in ‘--xargs file’"
 
 #: src/option.cc:332
@@ -7544,10 +7337,11 @@ msgstr "l'opzione ‘%s’ ha espansioni
 
 #: src/option.cc:347
 #, c-format
-msgid "negation of --%s"
+msgid "negation of '--%s'"
 msgstr ""
 
-#: src/option.cc:512 src/option.cc:556
+#: src/option.cc:512
+#: src/option.cc:556
 #, c-format
 msgid "deprecated option '%s' used: %s"
 msgstr "opzione deprecata ‘%s’ utilizzata: %s"
@@ -7565,7 +7359,7 @@ msgid "must be between 0 and 255"
 #: src/options_list.hh:132
 #, c-format
 msgid "must be between 0 and 255"
-msgstr ""
+msgstr "deve essere tra 0 e 255"
 
 #: src/options_list.hh:206
 msgid "insert command line arguments taken from the given file"
@@ -7576,13 +7370,12 @@ msgstr "forza l'autore del commit"
 msgstr "forza l'autore del commit"
 
 #: src/options_list.hh:217
-msgid "block size in bytes for \"automate stdio\" output"
+#, fuzzy
+msgid "block size in bytes for 'automate stdio' output"
 msgstr "dimensione di blocco per l'output di ‘automate stdio’ (in byte)"
 
 #: src/options_list.hh:220
-msgid ""
-"automatically update the workspace, if it was at a head and the command "
-"creates a new head"
+msgid "automatically update the workspace, if it was at a head and the command creates a new head"
 msgstr ""
 
 #: src/options_list.hh:225
@@ -7598,16 +7391,11 @@ msgstr "esegue il netsync tramite stdio"
 msgstr "esegue il netsync tramite stdio"
 
 #: src/options_list.hh:235
-msgid ""
-"cause monotone to lie about the maximum netsync protocol version that it "
-"supports, mostly for debugging"
+msgid "cause monotone to lie about the maximum netsync protocol version that it supports, mostly for debugging"
 msgstr ""
 
 #: src/options_list.hh:239
-msgid ""
-"cause monotone to lie about the minimum netsync protocol version it "
-"supports, useful for debugging or if you want to prevent use of older "
-"protocol versions"
+msgid "cause monotone to lie about the minimum netsync protocol version it supports, useful for debugging or if you want to prevent use of older protocol versions"
 msgstr ""
 
 #: src/options_list.hh:244
@@ -7692,9 +7480,7 @@ msgid "when rosterifying, drop attrs ent
 
 #: src/options_list.hh:362
 msgid "when rosterifying, drop attrs entries with the given key"
-msgstr ""
-"durante la conversione al formato con roster, elimina gli attributi con una "
-"chiave specificata"
+msgstr "durante la conversione al formato con roster, elimina gli attributi con una chiave specificata"
 
 #: src/options_list.hh:365
 msgid "don't perform the operation, just show what would have happened"
@@ -7702,7 +7488,7 @@ msgid "drop certs signed by keys we don'
 
 #: src/options_list.hh:368
 msgid "drop certs signed by keys we don't know about"
-msgstr ""
+msgstr "elimina certificati firmati con chiavi che non conosciamo"
 
 #: src/options_list.hh:371
 msgid "file to dump debugging log to, on failure"
@@ -7721,328 +7507,320 @@ msgstr "aggiorna il registro interno di 
 msgstr "aggiorna il registro interno di monotone, non il filesystem"
 
 #: src/options_list.hh:384
-msgid ""
-"move conflicting, unversioned paths into _MTN/resolutions before proceeding "
-"with any workspace change"
+#, c-format
+msgid "move conflicting, unversioned paths into '%s' before proceeding with any workspace change"
 msgstr ""
 
-#: src/options_list.hh:389
-msgid ""
-"controls use of ssh-agent.  valid arguments are: 'yes' to use ssh-agent to "
-"make signatures if possible, 'no' to force use of monotone's internal code, "
-"'only' to force use of ssh-agent, 'check' to sign with both and compare"
-msgstr ""
-"controlla l'utilizzo di ‘ssh-agent’.  i parametri validi sono: ‘yes’ per "
-"firmare se possibile, ‘no’ per forzare l'uso del codice di firma di "
-"monotone, ‘only’ per forzare l'uso di ‘ssh-agent’, ‘check’ per firmare con "
-"entrambi e verificare"
+#: src/options_list.hh:390
+msgid "controls use of ssh-agent.  valid arguments are: 'yes' to use ssh-agent to make signatures if possible, 'no' to force use of monotone's internal code, 'only' to force use of ssh-agent, 'check' to sign with both and compare"
+msgstr "controlla l'utilizzo di ‘ssh-agent’.  i parametri validi sono: ‘yes’ per firmare se possibile, ‘no’ per forzare l'uso del codice di firma di monotone, ‘only’ per forzare l'uso di ‘ssh-agent’, ‘check’ per firmare con entrambi e verificare"
 
-#: src/options_list.hh:396
+#: src/options_list.hh:397
 msgid "force genkey to not error out when the named key already exists"
 msgstr ""
 
-#: src/options_list.hh:400
+#: src/options_list.hh:401
 msgid "display help message"
 msgstr "mostra il messaggio di aiuto"
 
-#: src/options_list.hh:403
+#: src/options_list.hh:404
 msgid "show hidden commands and options"
 msgstr "mostra i comandi e le opzioni nascosti"
 
-#: src/options_list.hh:406
+#: src/options_list.hh:407
 msgid "do not ignore revisions marked as suspended"
 msgstr "non ignorare le revisioni segnate come sospese"
 
-#: src/options_list.hh:409
+#: src/options_list.hh:410
 msgid "do not prompt the user for input"
 msgstr ""
 
-#: src/options_list.hh:412
+#: src/options_list.hh:413
 msgid "sets the key for signatures, using either the key name or the key hash"
 msgstr ""
 
-#: src/options_list.hh:418
+#: src/options_list.hh:419
 msgid "set location of key store"
 msgstr "imposta locazione del portachiavi"
 
-#: src/options_list.hh:421
+#: src/options_list.hh:422
 msgid "push the specified key even if it hasn't signed anything"
-msgstr ""
-"invia la chiave specificata anche se non è stata utilizzata per certificare "
-"nulla"
+msgstr "invia la chiave specificata anche se non è stata utilizzata per certificare nulla"
 
-#: src/options_list.hh:424
+#: src/options_list.hh:425
 msgid "limit log output to the last number of entries"
 msgstr "limita la stampa del log alle ultime N voci"
 
-#: src/options_list.hh:427
+#: src/options_list.hh:428
 msgid "file to write the log to"
 msgstr "file su cui scrivere il registro"
 
-#: src/options_list.hh:431
+#: src/options_list.hh:432
 msgid "set commit changelog message"
 msgstr "imposta il messaggio di ChangeLog del commit"
 
-#: src/options_list.hh:433
+#: src/options_list.hh:434
 msgid "set filename containing commit changelog message"
 msgstr "legge il messaggio di ChangeLog del commit da un file"
 
-#: src/options_list.hh:436
+#: src/options_list.hh:437
 msgid "no prefix to message"
 msgstr "nessun prefisso per il messaggio"
 
-#: src/options_list.hh:439
+#: src/options_list.hh:440
 msgid "perform the operations for files missing from workspace"
 msgstr "esegue l'operazione per file mancanti dallo spazio di lavoro"
 
-#: src/options_list.hh:442
+#: src/options_list.hh:443
 msgid "limit log output to the next number of entries"
 msgstr "limita la stampa del log alle N voci seguenti"
 
-#: src/options_list.hh:445
+#: src/options_list.hh:446
 msgid "exclude files when printing logs"
 msgstr "esclude i file dalla stampa dei log"
 
-#: src/options_list.hh:448
+#: src/options_list.hh:449
 msgid "do not use ASCII graph to display ancestry"
 msgstr "non utilizzare i grafi ASCII delle parentele"
 
-#: src/options_list.hh:451
+#: src/options_list.hh:452
 msgid "do not ignore any files"
 msgstr "non ignorare nessun file"
 
-#: src/options_list.hh:454
+#: src/options_list.hh:455
 msgid "exclude merges when printing logs"
 msgstr "esclude i merge dalla stampa dei log"
 
-#: src/options_list.hh:457
-msgid "do not load %APPDATA%\\monotone\\monotonerc or _MTN\\monotonerc lua files"
-msgstr ""
-"non caricare i file Lua ‘%APPDATA%\\monotone\\monotonerc’ e "
-"‘_MTN\\monotonerc’"
+#: src/options_list.hh:458
+#, fuzzy
+msgid "do not load '%APPDATA%\\monotone\\monotonerc' or '_MTN\\monotonerc' lua files"
+msgstr "non caricare i file Lua ‘%APPDATA%\\monotone\\monotonerc’ e ‘_MTN\\monotonerc’"
 
-#: src/options_list.hh:460
-msgid "do not load ~/.monotone/monotonerc or _MTN/monotonerc lua files"
+#: src/options_list.hh:461
+#, fuzzy
+msgid "do not load '~/.monotone/monotonerc' or '_MTN/monotonerc' lua files"
 msgstr "non caricare i file Lua ‘~/.monotone/monotonerc’ e ‘_MTN/monotonerc’"
 
-#: src/options_list.hh:467
+#: src/options_list.hh:468
 msgid "do not load the built-in lua file with the default hooks"
 msgstr ""
 
-#: src/options_list.hh:469
-msgid "please use --no-standard-rcfiles instead"
-msgstr ""
+#: src/options_list.hh:470
+#, fuzzy
+msgid "please use '--no-standard-rcfiles' instead"
+msgstr "per favore invece usa --no-standard-rcfiles "
 
-#: src/options_list.hh:471
-msgid "old version of --no-standard-rcfiles"
-msgstr ""
+#: src/options_list.hh:472
+#, fuzzy
+msgid "old version of '--no-standard-rcfiles'"
+msgstr "vecchia versione di --no-standard-rcfiles "
 
-#: src/options_list.hh:475
-msgid "please use --no-builtin-rcfile instead"
+#: src/options_list.hh:476
+#, fuzzy
+msgid "please use '--no-builtin-rcfile' instead"
 msgstr "per favore usa --no-builtin-rcfile invece"
 
-#: src/options_list.hh:477
-msgid "old version of --no-builtin-rcfile"
+#: src/options_list.hh:478
+#, fuzzy
+msgid "old version of '--no-builtin-rcfile'"
 msgstr "vecchia versione di --no-builtin-rcfile"
 
-#: src/options_list.hh:483
+#: src/options_list.hh:484
 msgid "load extra lua file"
 msgstr "carica un ulteriore file Lua"
 
-#: src/options_list.hh:486
+#: src/options_list.hh:487
 msgid "record process id of server"
 msgstr "registra l'id del processo server"
 
-#: src/options_list.hh:493
-msgid ""
-"decrease verbosity (undo previous -v, then disable informational output, "
-"then disable warnings)"
+#: src/options_list.hh:494
+msgid "decrease verbosity (undo previous '-v', then disable informational output, then disable warnings)"
 msgstr ""
 
-#: src/options_list.hh:502
-msgid "increase verbosity (undo previous -q, and then enable debug output)"
+#: src/options_list.hh:503
+msgid "increase verbosity (undo previous '-q', and then enable debug output)"
 msgstr ""
 
-#: src/options_list.hh:512
-msgid "please us -v (or -v -v -v if there are previous -q options)"
+#: src/options_list.hh:513
+msgid "please us '-v' (or '-v -v -v' if there are previous '-q' options)"
 msgstr ""
 
-#: src/options_list.hh:515
+#: src/options_list.hh:516
 msgid "print debug log to stderr while running"
 msgstr "stampa i log di debug su stderr"
 
-#: src/options_list.hh:522
-msgid "please use -q -q"
+#: src/options_list.hh:523
+#, fuzzy
+msgid "please use '-q -q'"
 msgstr "per favore usa -q -q"
 
-#: src/options_list.hh:524
+#: src/options_list.hh:525
 msgid "suppress warning, verbose, informational and progress messages"
-msgstr ""
-"sopprime i messaggi di avvertimento, di notifica estesa, informativi e di "
-"avanzamento"
+msgstr "sopprime i messaggi di avvertimento, di notifica estesa, informativi e di avanzamento"
 
-#: src/options_list.hh:532
+#: src/options_list.hh:533
 msgid "print detailed information"
 msgstr "stampa le informazioni dettagliate"
 
-#: src/options_list.hh:535
-msgid ""
-"automatically run the output through nroff (default if the output is a "
-"terminal)"
+#: src/options_list.hh:536
+msgid "automatically run the output through nroff (default if the output is a terminal)"
 msgstr ""
 
-#: src/options_list.hh:539
+#: src/options_list.hh:540
 msgid "show timestamps in front of errors, warnings and progress messages"
 msgstr ""
 
-#: src/options_list.hh:542
+#: src/options_list.hh:543
 msgid "also operate on the contents of any listed directories"
 msgstr "opera anche sui contenuti delle directory specificate"
 
-#: src/options_list.hh:545
+#: src/options_list.hh:546
 msgid "select revision id for operation"
 msgstr "seleziona la revisione per l'operazione"
 
-#: src/options_list.hh:548
+#: src/options_list.hh:549
 msgid "limit search for workspace to specified root"
 msgstr "limita la ricerca di uno spazio di lavoro alla radice specificata"
 
-#: src/options_list.hh:551
+#: src/options_list.hh:552
 msgid "don't look for a workspace"
 msgstr "non cercare uno spazio di lavoro"
 
-#: src/options_list.hh:554
+#: src/options_list.hh:555
 msgid "use the current netsync arguments and options as the future default"
 msgstr "usa gli argomenti netsync attuali come default per il futuro"
 
-#: src/options_list.hh:559
+#: src/options_list.hh:560
 msgid "set ticker style (count|dot|none)"
 msgstr "imposta lo stile del ticker (count|dot|none)"
 
-#: src/options_list.hh:562
+#: src/options_list.hh:563
 msgid "revision(s) to start logging at"
 msgstr "revisione(i) da cui iniziare il log"
 
-#: src/options_list.hh:565
+#: src/options_list.hh:566
 msgid "revision(s) to stop logging at"
 msgstr "revisione(i) a cui terminare il log"
 
-#: src/options_list.hh:568
+#: src/options_list.hh:569
 msgid "perform the operations for unknown files from workspace"
 msgstr "esegue l'operazione sui file sconosciuti presenti in workspace"
 
-#: src/options_list.hh:571
+#: src/options_list.hh:572
 msgid "print version number, then exit"
 msgstr "stampa il numero di versione ed esce"
 
-#: src/options_list.hh:578
+#: src/options_list.hh:579
 msgid "don't output ignored files"
 msgstr "non stampare i file ignorati"
 
-#: src/options_list.hh:581
+#: src/options_list.hh:582
 msgid "don't output unknown files"
 msgstr "non stampare i file sconosciuti"
 
-#: src/options_list.hh:584
+#: src/options_list.hh:585
 msgid "don't output unchanged files"
 msgstr "non stampare i file non modificati"
 
-#: src/options_list.hh:587
+#: src/options_list.hh:588
 msgid "don't output corresponding renames if restricted on such nodes"
 msgstr ""
 
-#: src/options_list.hh:595
+#: src/options_list.hh:596
 msgid "use file to resolve conflicts"
 msgstr "usa un file per risolvere i conflitti"
 
-#: src/options_list.hh:610
+#: src/options_list.hh:611
 msgid "specify conflict resolutions in a file, instead of interactively"
 msgstr ""
 
-#: src/options_list.hh:616
+#: src/options_list.hh:617
 msgid "file in which to store conflicts"
 msgstr "file dove porre i conflitti"
 
-#: src/options_list.hh:629
+#: src/options_list.hh:630
 msgid "use only one changelog cert for the git commit message"
 msgstr ""
 
-#: src/options_list.hh:632
+#: src/options_list.hh:633
 msgid "file mapping author names from original to new values"
 msgstr "mappatura file nomi autore dall'originale a nuovi valori"
 
-#: src/options_list.hh:635
+#: src/options_list.hh:636
 msgid "file mapping branch names from original to new values "
 msgstr ""
 
-#: src/options_list.hh:638
+#: src/options_list.hh:639
 msgid "include git refs for 'revs', 'roots' or 'leaves'"
 msgstr ""
 
-#: src/options_list.hh:641
+#: src/options_list.hh:642
 msgid "include revision ids in commit logs"
 msgstr "includi revisione ids nei commit logs"
 
-#: src/options_list.hh:644
+#: src/options_list.hh:645
 msgid "include standard cert values in commit logs"
 msgstr "include valori certificato standard nei commit logs"
 
-#: src/options_list.hh:647
+#: src/options_list.hh:648
 msgid "load the internal marks table before exporting revisions"
-msgstr ""
+msgstr "carica la tavola segni interni prima di esportare revisioni"
 
-#: src/options_list.hh:650
+#: src/options_list.hh:651
 msgid "save the internal marks table after exporting revisions"
-msgstr ""
+msgstr "salva la tavola segni interni dopo l'esportazione di revisioni"
 
 #: src/safe_map.hh:25
-#, c-format
-msgid "erasing nonexistent key from %s"
+#, fuzzy, c-format
+msgid "erasing nonexistent key from '%s'"
 msgstr "cancello la chiave non esistente dal %s"
 
-#: src/safe_map.hh:42 src/safe_map.hh:62
-#, c-format
-msgid "inserting duplicate entry into %s"
+#: src/safe_map.hh:42
+#: src/safe_map.hh:62
+#, fuzzy, c-format
+msgid "inserting duplicate entry into '%s'"
 msgstr "inserisce immissione duplicata in %s"
 
 #: src/safe_map.hh:80
-#, c-format
-msgid "fetching nonexistent entry from %s"
+#, fuzzy, c-format
+msgid "fetching nonexistent entry from '%s'"
 msgstr "prendo immissione non esistente da %s"
 
 #: src/unix/process.cc:63
-#, c-format
-msgid "error getting status of file %s: %s"
+#, fuzzy, c-format
+msgid "error getting status of file '%s': %s"
 msgstr "impossibile recuperare lo stato del file ‘%s’: %s"
 
 #: src/unix/process.cc:87
-#, c-format
-msgid "error opening file %s: %s"
+#, fuzzy, c-format
+msgid "error opening file '%s': %s"
 msgstr "impossibile aprire il file ‘%s’: %s"
 
 #: src/unix/process.cc:103
-#, c-format
-msgid "setting execute permission on %s"
+#, fuzzy, c-format
+msgid "setting execute permission on '%s'"
 msgstr "imposto i permessi di esecuzione su ‘%s’"
 
 #: src/unix/process.cc:108
-#, c-format
-msgid "clearing execute permission on %s"
+#, fuzzy, c-format
+msgid "clearing execute permission on '%s'"
 msgstr "tolgo i permessi di esecuzione da ‘%s’"
 
 #: src/unix/process.cc:119
-#, c-format
-msgid "error closing file %s: %s"
+#, fuzzy, c-format
+msgid "error closing file '%s': %s"
 msgstr "impossibile chiudere il file ‘%s’: %s"
 
-#: src/unix/fs.cc:49 src/win32/fs.cc:26
+#: src/unix/fs.cc:49
+#: src/win32/fs.cc:26
 #, c-format
 msgid "cannot get working directory: %s"
 msgstr "impossibile cambiare la directory corrente: %s"
 
-#: src/unix/fs.cc:61 src/win32/fs.cc:42
-#, c-format
-msgid "cannot change to directory %s: %s"
+#: src/unix/fs.cc:61
+#: src/win32/fs.cc:42
+#, fuzzy, c-format
+msgid "cannot change to directory '%s': %s"
 msgstr "impossibile entrare nella directory ‘%s’: %s"
 
 #: src/unix/fs.cc:83
@@ -8051,21 +7829,22 @@ msgstr "impossibile trovare la cartella 
 msgstr "impossibile trovare la cartella HOME per lo uid %d"
 
 #: src/unix/fs.cc:116
-#, c-format
-msgid "could not find home directory for user %s"
+#, fuzzy, c-format
+msgid "could not find home directory for user '%s'"
 msgstr "impossibile trovare la cartella HOME per l'utente ‘%s’"
 
 #: src/unix/fs.cc:134
-#, c-format
-msgid "error accessing file %s: %s"
+#, fuzzy, c-format
+msgid "error accessing file '%s': %s"
 msgstr "errore nell'accesso al file ‘%s’: %s"
 
 #: src/unix/fs.cc:143
-#, c-format
-msgid "cannot handle special file %s"
+#, fuzzy, c-format
+msgid "cannot handle special file '%s'"
 msgstr "impossibile gestire il file speciale ‘%s’"
 
-#: src/unix/fs.cc:159 src/win32/fs.cc:172
+#: src/unix/fs.cc:159
+#: src/win32/fs.cc:172
 #, c-format
 msgid "could not open directory '%s': %s"
 msgstr "non riesco ad aprire la directory ‘%s’: %s"
@@ -8090,19 +7869,23 @@ msgstr "non è stato possibile rinominar
 msgid "renaming '%s' to '%s' failed: %s"
 msgstr "non è stato possibile rinominare ‘%s’ in ‘%s’: %s"
 
-#: src/unix/fs.cc:308 src/unix/fs.cc:363 src/win32/fs.cc:248
+#: src/unix/fs.cc:308
+#: src/unix/fs.cc:363
+#: src/win32/fs.cc:248
 #, c-format
 msgid "could not remove '%s': %s"
 msgstr "non posso cancellare ‘%s’: %s"
 
-#: src/unix/fs.cc:390 src/win32/fs.cc:303
+#: src/unix/fs.cc:390
+#: src/win32/fs.cc:303
 #, c-format
 msgid "could not create directory '%s': %s"
 msgstr "non riesco a creare la directory‘%s’: %s"
 
-#: src/unix/fs.cc:456 src/win32/fs.cc:451
-#, c-format
-msgid "cannot create temp file %s: %s"
+#: src/unix/fs.cc:456
+#: src/win32/fs.cc:451
+#, fuzzy, c-format
+msgid "cannot create temp file '%s': %s"
 msgstr "impossibile creare il file temporaneo ‘%s’: %s"
 
 #: src/unix/fs.cc:466
@@ -8110,25 +7893,22 @@ msgstr "tutti i %d possibili nomi di fil
 msgid "all %d possible temporary file names are in use"
 msgstr "tutti i %d possibili nomi di file temporanei sono in uso"
 
-#: src/unix/fs.cc:507 src/win32/fs.cc:512
-#, c-format
-msgid "error writing to temp file %s: %s"
+#: src/unix/fs.cc:507
+#: src/win32/fs.cc:512
+#, fuzzy, c-format
+msgid "error writing to temp file '%s': %s"
 msgstr "impossibile scrivere sul file temporaneo ‘%s’: %s"
 
-#: src/unix/fs.cc:512 src/win32/fs.cc:519
-#, c-format
-msgid ""
-"giving up after four zero-length writes to %s (%d byte written, %d left)"
-msgid_plural ""
-"giving up after four zero-length writes to %s (%d bytes written, %d left)"
-msgstr[0] ""
-"abbandono dopo quattro scritture a lunghezza zero su ‘%s’ (%d byte scritti, "
-"%d mancanti)"
-msgstr[1] ""
-"abbandono dopo quattro scritture a lunghezza zero su ‘%s’ (%d byte scritti, "
-"%d mancanti)"
+#: src/unix/fs.cc:512
+#: src/win32/fs.cc:519
+#, fuzzy, c-format
+msgid "giving up after four zero-length writes to '%s' (%d byte written, %d left)"
+msgid_plural "giving up after four zero-length writes to '%s' (%d bytes written, %d left)"
+msgstr[0] "abbandono dopo quattro scritture a lunghezza zero su ‘%s’ (%d byte scritti, %d mancanti)"
+msgstr[1] "abbandono dopo quattro scritture a lunghezza zero su ‘%s’ (%d byte scritti, %d mancanti)"
 
-#: src/unix/os_strerror.cc:21 src/win32/os_strerror.cc:27
+#: src/unix/os_strerror.cc:21
+#: src/win32/os_strerror.cc:27
 #, c-format
 msgid "unknown error code %d"
 msgstr "codice di errore sconosciuto %d"
@@ -8186,7 +7966,7 @@ msgid "invalid date '%s' not matched by 
 #: src/unix/parse_date.cc:24
 #, c-format
 msgid "invalid date '%s' not matched by format '%s'"
-msgstr ""
+msgstr "dato invalido %s’ non corrisponde al formato %s’"
 
 #: src/win32/get_system_flavour.cc:161
 #, c-format
@@ -8204,8 +7984,8 @@ msgstr "non riesco a determinare il path
 msgstr "non riesco a determinare il path della configurazione"
 
 #: src/win32/fs.cc:144
-#, c-format
-msgid "%s: GetFileAttributes error: %s"
+#, fuzzy, c-format
+msgid "'%s': GetFileAttributes error: %s"
 msgstr "errore di GetFileAttributes su ‘%s’: %s"
 
 #: src/win32/fs.cc:194
@@ -8216,15 +7996,12 @@ msgid "could not remove '%s' and content
 #: src/win32/fs.cc:291
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation error code 0x%x"
-msgstr ""
-"non posso rimuovere ‘%s’ e i contenuti: SHFileOperation codice di errore "
-"0x%x"
+msgstr "non posso rimuovere ‘%s’ e i contenuti: SHFileOperation codice di errore 0x%x"
 
 #: src/win32/fs.cc:294
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation partially aborted"
-msgstr ""
-"non posso rimuovere ‘%s’ e i contenuti: SHFileOperation parzialmente fallita"
+msgstr "non posso rimuovere ‘%s’ e i contenuti: SHFileOperation parzialmente fallita"
 
 #: src/win32/fs.cc:359
 #, c-format
@@ -8247,23 +8024,23 @@ msgstr "non è possibile trovare un file
 msgstr "non è possibile trovare un file temporaneo (provate %d possibilità)"
 
 #: src/win32/fs.cc:486
-#, c-format
-msgid "%s will be accessible to all users of this computer\n"
+#, fuzzy, c-format
+msgid "'%s' will be accessible to all users of this computer\n"
 msgstr "‘%s’ sarà accessibile a tutti gli utenti di questo computer\n"
 
 #: src/win32/ssh_agent_platform.cc:82
-#, c-format
-msgid "Asked to write more than %u to pageant."
+#, fuzzy, c-format
+msgid "asked to write more than %u to pageant"
 msgstr "Richiesta scrittura di più di %u a ‘pageant’."
 
 #: src/win32/ssh_agent_platform.cc:91
-#, c-format
-msgid "Error sending message to pageant (%d)."
+#, fuzzy, c-format
+msgid "error sending message to pageant (%d)"
 msgstr "Errore nell'invio del messaggio a ‘pageant’ (%d)."
 
 #: src/win32/ssh_agent_platform.cc:105
-#, c-format
-msgid "Asked to read more than %u from pageant."
+#, fuzzy, c-format
+msgid "asked to read more than %u from pageant"
 msgstr "Richiesta lettura di più di %u a ‘pageant’."
 
 #: src/win32/parse_date.cc:21
@@ -8274,54 +8051,48 @@ msgid "std::terminate() - exception thro
 #: src/monotone.cc:83
 #, c-format
 msgid "std::terminate() - exception thrown while handling another exception"
-msgstr ""
-"std::terminate() - avvenuta un'eccezione durante la gestione di un'altra "
-"eccezione"
+msgstr "std::terminate() - avvenuta un'eccezione durante la gestione di un'altra eccezione"
 
 #: src/monotone.cc:143
-#, c-format
-msgid "This monotone binary requires at least SQLite 3.3.8 to run."
-msgstr ""
-"Questo eseguibile di monotone richiede almeno SQLite 3.3.8 per funzionare."
+#, fuzzy, c-format
+msgid "this monotone binary requires at least SQLite 3.3.8 to run"
+msgstr "Questo eseguibile di monotone richiede almeno SQLite 3.3.8 per funzionare."
 
 #: src/monotone.cc:146
-#, c-format
-msgid "This monotone binary requires at least SQLite 3.3.14 to run."
-msgstr ""
-"Questo eseguibile di monotone richiede almeno SQLite 3.3.14 per funzionare."
+#, fuzzy, c-format
+msgid "this monotone binary requires at least SQLite 3.3.14 to run"
+msgstr "Questo eseguibile di monotone richiede almeno SQLite 3.3.14 per funzionare."
 
 #: src/monotone.cc:157
-#, c-format
-msgid "Monotone does not support Botan 1.7.14."
+#, fuzzy, c-format
+msgid "monotone does not support Botan 1.7.14"
 msgstr "Monotone non supporta Botan 1.7.14."
 
 #: src/monotone.cc:161
-#, c-format
-msgid "This monotone binary requires Botan 1.6.3 or newer."
+#, fuzzy, c-format
+msgid "this monotone binary requires Botan 1.6.3 or newer"
 msgstr "Questo eseguibile di monotone richiede Botan 1.6.3 o successivo."
 
 #: src/monotone.cc:163
-#, c-format
-msgid "This monotone binary does not work with Botan newer than 1.7.6."
-msgstr ""
-"Questo eseguibile di monotone non funziona con Botan di versioni successive "
-"alla 1.7.6."
+#, fuzzy, c-format
+msgid "this monotone binary does not work with Botan newer than 1.7.6"
+msgstr "Questo eseguibile di monotone non funziona con Botan di versioni successive alla 1.7.6."
 
 #: src/monotone.cc:166
-#, c-format
-msgid "This monotone binary requires Botan 1.7.7 or newer."
+#, fuzzy, c-format
+msgid "this monotone binary requires Botan 1.7.7 or newer"
 msgstr "Questo eseguibile di monotone richiede Botan 1.7.7 o successivo."
 
-#: src/monotone.cc:172 src/monotone.cc:177
-#, c-format
-msgid "This monotone binary does not work with Botan 1.9.x."
+#: src/monotone.cc:172
+#: src/monotone.cc:177
+#, fuzzy, c-format
+msgid "this monotone binary does not work with Botan 1.9.x"
 msgstr "Questo eseguibile di monotone non funziona con Botan 1.9.x."
 
 #: src/monotone.cc:175
-#, c-format
-msgid "This monotone binary requires Botan 1.7.22 or newer."
-msgstr ""
-"Questo eseguibile di monotone non funziona con Botan 1.7.22 o successivo."
+#, fuzzy, c-format
+msgid "this monotone binary requires Botan 1.7.22 or newer"
+msgstr "Questo eseguibile di monotone non funziona con Botan 1.7.22 o successivo."
 
 #: src/std_hooks.lua:56
 msgid "Press enter"
@@ -8330,3 +8101,15 @@ msgstr "Premi ‘invio’ quando il sott
 #: src/std_hooks.lua:58
 msgid "Press enter when the subprocess has completed"
 msgstr "Premi ‘invio’ quando il sotto-processo è completato"
+
+#~ msgid "file %s does not exist"
+#~ msgstr "il file ‘%s’ non esiste"
+
+#~ msgid "no such revision '%s'"
+#~ msgstr "la revisione %s non esiste"
+
+#~ msgid "Network error: %s"
+#~ msgstr "Errore di rete: %s"
+
+#~ msgid "No such revision %s"
+#~ msgstr "La revisione %s non esiste"
============================================================
--- po/sv.po	44eb891ddd95b97af1dd12adcaf80070f4a314e4
+++ po/sv.po	55b2f84972d9c24e4b8e7effea3a143f09176a6c
@@ -7,8 +7,8 @@ msgstr ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-08 12:33+0100\n"
-"PO-Revision-Date: 2011-03-14 10:15+0100\n"
+"POT-Creation-Date: 2012-09-06 04:50+0200\n"
+"PO-Revision-Date: 2012-09-06 05:11+0200\n"
 "Last-Translator: tommyd <address@hidden>\n"
 "Language-Team: Richard Levitte <address@hidden>\n"
 "Language: sv\n"
@@ -22,7 +22,7 @@ msgstr "allvarligt fel: formatering miss
 msgid "fatal: formatter failed on %s:%d: %s"
 msgstr "allvarligt fel: formatering misslyckades vid %s:%d: %s"
 
-#: src/sanity.cc:353 src/cmd_list.cc:728
+#: src/sanity.cc:353 src/cmd_list.cc:729
 msgid "misuse: "
 msgstr "missbruk: "
 
@@ -40,7 +40,7 @@ msgstr "Nuvarande arbetsmängd: %i delar
 msgid "Current work set: %i items"
 msgstr "Nuvarande arbetsmängd: %i delar"
 
-#: src/sanity.hh:371 src/cmd_list.cc:734 src/lua_hooks.cc:105
+#: src/sanity.hh:371 src/cmd_list.cc:735 src/lua_hooks.cc:105
 #, c-format
 msgid "%s"
 msgstr "%s"
@@ -55,7 +55,7 @@ msgstr "storleken för den hexadecimalt 
 msgid "hex encoded ID '%s' size != %d"
 msgstr "storleken för den hexadecimalt kodade identiteten '%s' != %d"
 
-#: src/vocab.cc:53 src/database.cc:4231
+#: src/vocab.cc:53 src/database.cc:4229
 #, c-format
 msgid "bad character '%c' in id name '%s'"
 msgstr "otillåtet tecken '%c' i identitetsnamnet '%s'"
@@ -82,12 +82,12 @@ msgstr "otillåtet tecken '%c' i nyckeln
 
 #: src/vocab.cc:109
 #, c-format
-msgid "Invalid key length of %d bytes"
+msgid "invalid key length of %d bytes"
 msgstr "felaktig nyckellängd, %d byte"
 
 #: src/vocab.cc:123
 #, c-format
-msgid "Invalid hmac length of %d bytes"
+msgid "invalid hmac length of %d bytes"
 msgstr "felaktig HMAC-längd, %d byte"
 
 #: src/charset.cc:72
@@ -117,18 +117,18 @@ msgstr "sökvägen '%s' finns i den admi
 
 #: src/paths.cc:460
 #, c-format
-msgid "Invalid utf8"
-msgstr "Ogiltig utf8"
+msgid "invalid utf8"
+msgstr "ogiltig utf8"
 
 #: src/paths.cc:484
 #, c-format
-msgid "Path is not normalized"
-msgstr "Sökvägen är inte normaliserad"
+msgid "path is not normalized"
+msgstr "sökvägen är inte normaliserad"
 
 #: src/paths.cc:486
 #, c-format
-msgid "Bookkeeping path is not in bookkeeping dir"
-msgstr "Administrativ sökväg är inte i den administrativa katalogen"
+msgid "bookkeeping path is not in bookkeeping directory"
+msgstr "administrativ sökväg är inte i den administrativa katalogen"
 
 #: src/paths.cc:827
 #, c-format
@@ -160,27 +160,27 @@ msgstr "sökroten '%s' är inte en katal
 msgid "search root '%s' is not a directory"
 msgstr "sökroten '%s' är inte en katalog"
 
-#: src/luaext_parse_basic_io.cc:44
+#: src/luaext_parse_basic_io.cc:48
 #, c-format
 msgid "bad input to parse_basic_io"
 msgstr "felaktigt indata till parse_basic_io"
 
-#: src/lua.cc:485 src/lua.cc:497 src/lua.cc:509
+#: src/lua.cc:511 src/lua.cc:523 src/lua.cc:535
 #, c-format
 msgid "%s called with an invalid parameter"
 msgstr "%s anropades med inkorrekt parameter"
 
-#: src/lua.cc:592
+#: src/lua.cc:618
 #, c-format
-msgid "Directory '%s' does not exist"
-msgstr "Katalogen '%s' finns inte"
+msgid "directory '%s' does not exist"
+msgstr "katalogen '%s' finns inte"
 
-#: src/lua.cc:594 src/cmd_othervcs.cc:61 src/work.cc:2140
+#: src/lua.cc:620 src/cmd_othervcs.cc:61 src/work.cc:2112
 #, c-format
 msgid "'%s' is not a directory"
 msgstr "'%s' är inte en katalog"
 
-#: src/lua.cc:616 src/lua_hooks.cc:216
+#: src/lua.cc:642 src/lua_hooks.cc:216
 #, c-format
 msgid "lua error while loading rcfile '%s'"
 msgstr "lua-fel vid läsning av rcfilen '%s'"
@@ -257,7 +257,7 @@ msgstr "källsökvägen att ge nytt namn
 msgid "rename source path '%s' does not exist"
 msgstr "källsökvägen att ge nytt namn, '%s', finns inte"
 
-#: src/file_io.cc:281 src/work.cc:1425
+#: src/file_io.cc:281 src/work.cc:1396
 #, c-format
 msgid "file '%s' does not exist"
 msgstr "filen '%s' finns inte"
@@ -274,15 +274,15 @@ msgstr "kan inte öppna filen '%s' för 
 
 #: src/file_io.cc:303
 #, c-format
-msgid "Cannot read standard input multiple times"
-msgstr "Kan inte läsa från stdin mer än en gång"
+msgid "cannot read standard input multiple times"
+msgstr "kan inte läsa från stdin mer än en gång"
 
 #: src/file_io.cc:334
 #, c-format
 msgid "file '%s' cannot be overwritten as data; it is a directory"
 msgstr "filen %s kan inte skrivas över som data; den är en katalog"
 
-#: src/file_io.cc:426 src/work.cc:1822
+#: src/file_io.cc:426 src/work.cc:1794
 #, c-format
 msgid "no such file or directory: '%s'"
 msgstr "ingen sådan fil eller katalog: '%s'"
@@ -472,29 +472,29 @@ msgstr "%s: inledning från andra änden
 
 #: src/automate_reader.cc:46
 #, c-format
-msgid "Bad input to automate stdio: expected ':' after string size"
+msgid "bad input to automate stdio: expected ':' after string size"
 msgstr ""
-"Felaktigt indata till automate stdio: ':' förväntad efter strängstorlek"
+"felaktigt indata till automate stdio: ':' förväntad efter strängstorlek"
 
 #: src/automate_reader.cc:66
 #, c-format
-msgid "Bad input to automate stdio: unexpected EOF"
-msgstr "Felaktigt indata till automate stdio: oväntat filslut"
+msgid "bad input to automate stdio: unexpected EOF"
+msgstr "felaktigt indata till automate stdio: oväntat filslut"
 
 #: src/automate_reader.cc:94
 #, c-format
-msgid "Bad input to automate stdio: unknown start token '%c'"
+msgid "bad input to automate stdio: unknown start token '%c'"
 msgstr "felaktigt indata till automate stdio: '%c' är ett okänt nyckelord"
 
 #: src/automate_reader.cc:116
 #, c-format
-msgid "Bad input to automate stdio: expected '%c' token"
-msgstr "Felaktigt indata till automate stdio: nyckelordet '%c' förväntat"
+msgid "bad input to automate stdio: expected '%c' token"
+msgstr "felaktigt indata till automate stdio: nyckelordet '%c' förväntat"
 
 #: src/automate_reader.cc:123
 #, c-format
-msgid "Bad input to automate stdio: command name is missing"
-msgstr "Felaktigt indata till automate stdio: saknar kommandonamn"
+msgid "bad input to automate stdio: command name is missing"
+msgstr "felaktigt indata till automate stdio: saknar kommandonamn"
 
 #: src/commands.cc:496
 #, c-format
@@ -646,8 +646,8 @@ msgstr ""
 
 #: src/cmd.cc:459
 #, c-format
-msgid "Call to user command '%s' (lua command: '%s') failed."
-msgstr "Anropet till användarkommandot '%s' (lua command: '%s') misslyckades."
+msgid "call to user command '%s' (lua command: '%s') failed."
+msgstr "anropet till användarkommandot '%s' (lua command: '%s') misslyckades."
 
 #: src/cmd.cc:470 src/cmd.cc:494
 #, c-format
@@ -837,11 +837,11 @@ msgid ""
 #: src/cmd_netsync.cc:122 src/cmd_netsync.cc:225
 #, c-format
 msgid ""
-"No database given; assuming '%s' database. This means that\n"
+"no database given; assuming '%s' database. This means that\n"
 "we can't verify the server key, because we have no record of\n"
 "what it should be."
 msgstr ""
-"Ingen databas angiven; databasen '%s' antagen.  Detta innebär\n"
+"ingen databas angiven; databasen '%s' antagen.  Detta innebär\n"
 "att vi inte kan kolla servernyckeln, eftersom vi inte har\n"
 "någon uppgift om vad den borde vara."
 
@@ -853,21 +853,21 @@ msgstr "Kör KOMMANDO på servern i andr
 msgid "Executes COMMAND on a remote server"
 msgstr "Kör KOMMANDO på servern i andra änden"
 
-#: src/cmd_netsync.cc:221 src/cmd_list.cc:1021 src/cmd_packet.cc:73
+#: src/cmd_netsync.cc:221 src/cmd_list.cc:1031 src/cmd_packet.cc:73
 #: src/cmd_packet.cc:134 src/cmd_packet.cc:254 src/cmd_key_cert.cc:81
-#: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1141
-#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1134 src/cmd_ws_commit.cc:1342
-#: src/cmd_ws_commit.cc:1456 src/cmd_ws_commit.cc:1478 src/cmd_automate.cc:138
-#: src/cmd_files.cc:239 src/cmd_files.cc:336 src/cmd_files.cc:360
-#: src/cmd_files.cc:394 src/automate.cc:85 src/automate.cc:122
-#: src/automate.cc:175 src/automate.cc:298 src/automate.cc:400
-#: src/automate.cc:431 src/automate.cc:520 src/automate.cc:1246
-#: src/automate.cc:1419 src/automate.cc:1556 src/automate.cc:1592
-#: src/automate.cc:1624 src/automate.cc:1658 src/automate.cc:1690
-#: src/automate.cc:1730 src/automate.cc:1820 src/automate.cc:1903
-#: src/automate.cc:1936 src/automate.cc:1999 src/automate.cc:2051
-#: src/automate.cc:2106 src/automate.cc:2166 src/automate.cc:2202
-#: src/automate.cc:2272 src/automate.cc:2302 src/automate.cc:2378
+#: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1149
+#: src/cmd_merging.cc:1227 src/cmd_ws_commit.cc:1144 src/cmd_ws_commit.cc:1350
+#: src/cmd_ws_commit.cc:1492 src/cmd_ws_commit.cc:1514 src/cmd_automate.cc:138
+#: src/cmd_files.cc:240 src/cmd_files.cc:337 src/cmd_files.cc:361
+#: src/cmd_files.cc:395 src/automate.cc:85 src/automate.cc:122
+#: src/automate.cc:175 src/automate.cc:331 src/automate.cc:433
+#: src/automate.cc:464 src/automate.cc:553 src/automate.cc:1279
+#: src/automate.cc:1452 src/automate.cc:1589 src/automate.cc:1625
+#: src/automate.cc:1657 src/automate.cc:1691 src/automate.cc:1723
+#: src/automate.cc:1763 src/automate.cc:1853 src/automate.cc:1936
+#: src/automate.cc:1969 src/automate.cc:2032 src/automate.cc:2084
+#: src/automate.cc:2139 src/automate.cc:2199 src/automate.cc:2235
+#: src/automate.cc:2305 src/automate.cc:2335 src/automate.cc:2411
 #: src/asciik.cc:379
 #, c-format
 msgid "wrong argument count"
@@ -993,18 +993,18 @@ msgstr "kloningens tilltänkta katalog '
 msgid "clone destination directory '%s' already exists"
 msgstr "kloningens tilltänkta katalog '%s' finns redan"
 
-#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1842 src/cmd_ws_commit.cc:1931
+#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1878 src/cmd_ws_commit.cc:1967
 #, c-format
 msgid "bookkeeping directory already exists in '%s'"
 msgstr "det finns redan en administrativ katalog i '%s'"
 
 #: src/cmd_netsync.cc:866 src/cmd_merging.cc:535 src/cmd_merging.cc:636
-#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1030
+#: src/cmd_merging.cc:641 src/cmd_merging.cc:1479 src/cmd_ws_commit.cc:1040
 #, c-format
 msgid "branch '%s' is empty"
 msgstr "grenen '%s' är tom"
 
-#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1033 src/cmd_ws_commit.cc:1910
+#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1043 src/cmd_ws_commit.cc:1946
 #, c-format
 msgid "branch '%s' has multiple heads:"
 msgstr "grenen '%s' har flera löv:"
@@ -1014,12 +1014,12 @@ msgstr "välj ett med '%s clone -r<id> U
 msgid "choose one with '%s clone -r<id> URI'"
 msgstr "välj ett med '%s clone -r<id> URI'"
 
-#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1039 src/cmd_ws_commit.cc:1916
+#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1049 src/cmd_ws_commit.cc:1952
 #, c-format
 msgid "branch '%s' has multiple heads"
 msgstr "grenen '%s' har flera löv"
 
-#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1896
+#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1932
 #, c-format
 msgid "revision %s is not a member of branch '%s'"
 msgstr "revisionen %s är inte med i grenen '%s'"
@@ -1038,11 +1038,11 @@ msgstr "Servera databasen till anslutand
 msgid "Serves the database to connecting clients"
 msgstr "Servera databasen till anslutande klienter"
 
-#: src/cmd_list.cc:52
+#: src/cmd_list.cc:53
 msgid "Shows database objects"
 msgstr "Visar databasobjekt"
 
-#: src/cmd_list.cc:53
+#: src/cmd_list.cc:54
 msgid ""
 "This command is used to query information from the database.  It shows "
 "database objects, or the current workspace manifest, or known, unknown, "
@@ -1052,16 +1052,16 @@ msgstr ""
 "databasobjekt, arbetskopians manifest, okända filer, kända filer, medvetet "
 "ignorerade filer, saknade filer eller ändrade filer"
 
-#: src/cmd_list.cc:101
+#: src/cmd_list.cc:102
 msgid "Lists certificates attached to a revision"
 msgstr "Skriver ut alla certifikat kopplade till en revision"
 
-#: src/cmd_list.cc:129 src/cmd_list.cc:1050
+#: src/cmd_list.cc:130 src/cmd_list.cc:1060
 #, c-format
 msgid "no public key %s found in database"
 msgstr "den publika nyckeln %s finns inte i databasen"
 
-#: src/cmd_list.cc:139
+#: src/cmd_list.cc:140
 #, c-format
 msgid ""
 "Key   : %s\n"
@@ -1074,19 +1074,19 @@ msgstr ""
 "Namn     : %s\n"
 "Värde    : %s\n"
 
-#: src/cmd_list.cc:172
+#: src/cmd_list.cc:173
 msgid "ok"
 msgstr "ok"
 
-#: src/cmd_list.cc:175 src/database.cc:1327
+#: src/cmd_list.cc:176 src/database.cc:1327
 msgid "bad"
 msgstr "felaktig"
 
-#: src/cmd_list.cc:178
+#: src/cmd_list.cc:179
 msgid "unknown"
 msgstr "okänd"
 
-#: src/cmd_list.cc:208
+#: src/cmd_list.cc:209
 msgid ""
 "Lists duplicate files in the specified revision. If no revision is "
 "specified, use the workspace"
@@ -1094,158 +1094,158 @@ msgstr ""
 "Visa duplicerade filer i den angivna revisionen.  Om ingen revision anges "
 "används arbetskopian"
 
-#: src/cmd_list.cc:222
+#: src/cmd_list.cc:223
 #, c-format
 msgid "more than one revision given"
 msgstr "fler än en revision angiven"
 
-#: src/cmd_list.cc:236 src/cmd_list.cc:1034 src/cmd_db.cc:621
-#: src/cmd_files.cc:270 src/automate.cc:132 src/automate.cc:185
-#: src/automate.cc:235 src/automate.cc:265 src/automate.cc:307
-#: src/automate.cc:312 src/automate.cc:406 src/automate.cc:437
-#: src/automate.cc:1253 src/automate.cc:1438 src/automate.cc:1564
-#: src/automate.cc:1602 src/automate.cc:1634 src/automate.cc:1701
-#: src/automate.cc:1703 src/automate.cc:1739 src/automate.cc:1946
-#: src/automate.cc:2008 src/automate.cc:2013 src/automate.cc:2175
-#: src/selectors.cc:904 src/selectors.cc:922
+#: src/cmd_list.cc:237 src/cmd_list.cc:1044 src/cmd_db.cc:621
+#: src/cmd_files.cc:271 src/automate.cc:132 src/automate.cc:185
+#: src/automate.cc:235 src/automate.cc:268 src/automate.cc:298
+#: src/automate.cc:340 src/automate.cc:345 src/automate.cc:439
+#: src/automate.cc:470 src/automate.cc:1286 src/automate.cc:1471
+#: src/automate.cc:1597 src/automate.cc:1635 src/automate.cc:1667
+#: src/automate.cc:1734 src/automate.cc:1736 src/automate.cc:1772
+#: src/automate.cc:1979 src/automate.cc:2041 src/automate.cc:2046
+#: src/automate.cc:2208 src/selectors.cc:924 src/selectors.cc:942
 #, c-format
 msgid "no revision %s found in database"
 msgstr "revisionen %s finns inte i databasen"
 
-#: src/cmd_list.cc:355
+#: src/cmd_list.cc:356
 msgid "Lists keys that match a pattern"
 msgstr "Visar nycklarna som matchar ett givet mönster"
 
-#: src/cmd_list.cc:371
+#: src/cmd_list.cc:372
 #, c-format
 msgid "no keys found"
 msgstr "hittade inga nycklar"
 
-#: src/cmd_list.cc:388
+#: src/cmd_list.cc:389
 #, c-format
 msgid "no keys found matching '%s'"
 msgstr "hittade inga nycklar som matchar '%s'"
 
-#: src/cmd_list.cc:448
+#: src/cmd_list.cc:449
 #, c-format
 msgid "(*) - only in '%s/'"
 msgstr "(*) - enbart i '%s/'"
 
-#: src/cmd_list.cc:466
+#: src/cmd_list.cc:467
 #, c-format
 msgid "Some key names refer to multiple keys"
 msgstr "Vissa nyckelnamn refererar till flera nycklar"
 
-#: src/cmd_list.cc:470
+#: src/cmd_list.cc:471
 #, c-format
 msgid "Duplicate Key: %s"
 msgstr "Fler än en nycket: %s"
 
-#: src/cmd_list.cc:477
+#: src/cmd_list.cc:478
 msgid "Lists branches in the database that match a pattern"
 msgstr "Visar grenarna i en database som matchar ett givet mönster"
 
-#: src/cmd_list.cc:500
+#: src/cmd_list.cc:501
 msgid "Lists the current epoch of branches that match a pattern"
 msgstr "Visar nuvarande epoch för grenarna som matchar ett givet mönster"
 
-#: src/cmd_list.cc:527
+#: src/cmd_list.cc:528
 #, c-format
 msgid "no epoch for branch '%s'"
 msgstr "ingen epok i grenen '%s'"
 
-#: src/cmd_list.cc:536
+#: src/cmd_list.cc:537
 msgid "Lists all tags in the database"
 msgstr "Visar alla taggar i databasen"
 
-#: src/cmd_list.cc:586
+#: src/cmd_list.cc:587
 msgid "Lists variables in the whole database or a domain"
 msgstr "Visar alla databasvariabler eller bara de som tillhör en domän"
 
-#: src/cmd_list.cc:657
+#: src/cmd_list.cc:658
 msgid "<no branch set>"
 msgstr "<ingen gren angiven>"
 
-#: src/cmd_list.cc:659
+#: src/cmd_list.cc:660
 #, c-format
 msgid "%s (in '%s')"
 msgstr "%s (i '%s')"
 
-#: src/cmd_list.cc:663
+#: src/cmd_list.cc:664
 #, c-format
 msgid "no known valid workspaces"
 msgstr "finner ingen giltig arbetskopia"
 
-#: src/cmd_list.cc:667
+#: src/cmd_list.cc:668
 msgid "Lists known workspaces of a specified database"
 msgstr "Listar kända arbetskopior för en specifik databas"
 
-#: src/cmd_list.cc:677
+#: src/cmd_list.cc:678
 msgid "Lists managed databases and their known workspaces"
 msgstr "Visa vilka databaser som hanteras och deras kända arbetskopior"
 
-#: src/cmd_list.cc:684 src/database.cc:4978
+#: src/cmd_list.cc:685 src/database.cc:4976
 #, c-format
 msgid "no default database location configured"
 msgstr "ingen standardkatalog för databaser finns definierad"
 
-#: src/cmd_list.cc:688 src/database.cc:5056
+#: src/cmd_list.cc:689 src/database.cc:5054
 #, c-format
 msgid "could not query default database glob"
 msgstr "kunde inte fråga efter standardglobben för databaser"
 
-#: src/cmd_list.cc:735
+#: src/cmd_list.cc:736
 #, c-format
 msgid "ignoring database '%s'"
 msgstr "ignorerar databasen '%s'"
 
-#: src/cmd_list.cc:739
+#: src/cmd_list.cc:740
 #, c-format
 msgid "%s (in %s):"
 msgstr "%s (i %s):"
 
-#: src/cmd_list.cc:746
+#: src/cmd_list.cc:747
 msgid "Lists workspace files that belong to the current branch"
 msgstr "Visar de filer i arbetskopian som hör till nuvarande gren"
 
-#: src/cmd_list.cc:805
+#: src/cmd_list.cc:811
 msgid "Lists workspace files that are unknown in the current branch"
 msgstr "Visar de filer i arbetskopian som är okända i nuvarande gren"
 
-#: src/cmd_list.cc:817
+#: src/cmd_list.cc:827
 msgid "Lists workspace files that are ignored in the current branch"
 msgstr "Visar de filer i arbetskopian som ignoreras i nuvarande gren"
 
-#: src/cmd_list.cc:829
+#: src/cmd_list.cc:839
 msgid "Lists files that belong to the branch but are not in the workspace"
 msgstr ""
 "Visar alla filer som hör till den nuvarande grenen men inte finns i "
 "arbetskopia"
 
-#: src/cmd_list.cc:852
+#: src/cmd_list.cc:862
 msgid "Lists files that have changed with respect to the current revision"
 msgstr "Visar de filer som har ändrats med avseende på nuvarande revision"
 
-#: src/cmd_list.cc:957
+#: src/cmd_list.cc:967
 msgid "Lists all keys in the keystore"
 msgstr "Visar alla nycklar i nyckellagret"
 
-#: src/cmd_list.cc:962 src/cmd_db.cc:50 src/cmd_db.cc:62 src/cmd_db.cc:74
+#: src/cmd_list.cc:972 src/cmd_db.cc:50 src/cmd_db.cc:62 src/cmd_db.cc:74
 #: src/cmd_db.cc:91 src/cmd_db.cc:105 src/cmd_db.cc:119 src/cmd_db.cc:135
 #: src/cmd_db.cc:325 src/cmd_db.cc:341 src/cmd_db.cc:362 src/cmd_db.cc:380
-#: src/cmd_automate.cc:113 src/cmd_automate.cc:235 src/automate.cc:344
-#: src/automate.cc:370 src/automate.cc:472 src/automate.cc:1320
-#: src/automate.cc:1348 src/automate.cc:1768
+#: src/cmd_automate.cc:113 src/cmd_automate.cc:235 src/automate.cc:377
+#: src/automate.cc:403 src/automate.cc:505 src/automate.cc:1353
+#: src/automate.cc:1381 src/automate.cc:1801
 #, c-format
 msgid "no arguments needed"
 msgstr "inga argument behövs"
 
-#: src/cmd_list.cc:1015 src/cmd_db.cc:610 src/automate.cc:394
-#: src/automate.cc:425
+#: src/cmd_list.cc:1025 src/cmd_db.cc:610 src/automate.cc:427
+#: src/automate.cc:458
 msgid "REV"
 msgstr "REV"
 
-#: src/cmd_list.cc:1016
+#: src/cmd_list.cc:1026
 msgid "Prints all certificates attached to a revision"
 msgstr "Skriver ut alla certifikat kopplade till en revision"
 
@@ -1494,13 +1494,13 @@ msgstr "tom kommentar"
 msgstr "tom kommentar"
 
 #: src/cmd_merging.cc:119 src/cmd_merging.cc:438 src/cmd_merging.cc:659
-#: src/cmd_merging.cc:853 src/cmd_merging.cc:986
+#: src/cmd_merging.cc:854
 #, c-format
 msgid "[left]  %s"
 msgstr "[vänster]    %s"
 
 #: src/cmd_merging.cc:120 src/cmd_merging.cc:439 src/cmd_merging.cc:660
-#: src/cmd_merging.cc:854 src/cmd_merging.cc:987
+#: src/cmd_merging.cc:855
 #, c-format
 msgid "[right] %s"
 msgstr "[höger]      %s"
@@ -1530,10 +1530,10 @@ msgstr ""
 "denna revision är inte i någon gren.\n"
 "Nästa ändring hamnar i grenen '%s'"
 
-#: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
-#: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
-#: src/cmd_ws_commit.cc:2270 src/cmd_ws_commit.cc:2385 src/cmd_files.cc:308
-#: src/cmd_files.cc:406 src/automate.cc:1035 src/automate.cc:1328
+#: src/cmd_merging.cc:209 src/cmd_merging.cc:825 src/cmd_ws_commit.cc:370
+#: src/cmd_ws_commit.cc:1370 src/cmd_ws_commit.cc:2078
+#: src/cmd_ws_commit.cc:2306 src/cmd_ws_commit.cc:2421 src/cmd_files.cc:309
+#: src/cmd_files.cc:407 src/automate.cc:1068 src/automate.cc:1361
 #, c-format
 msgid "this command can only be used in a single-parent workspace"
 msgstr "detta kommando kan enbart användas i en arbetskopia med en förälder"
@@ -1625,7 +1625,7 @@ msgstr "maximalt en revisionsselektor fÃ
 msgid "at most one revision selector may be specified"
 msgstr "maximalt en revisionsselektor för specificeras"
 
-#: src/cmd_merging.cc:452 src/cmd_merging.cc:763
+#: src/cmd_merging.cc:452 src/cmd_merging.cc:764
 #, c-format
 msgid "[merged] %s"
 msgstr "[ihopslagen] %s"
@@ -1634,7 +1634,7 @@ msgstr "Slår ihop ej ihopslagna löv i 
 msgid "Merges unmerged heads of a branch"
 msgstr "Slår ihop ej ihopslagna löv i grenen"
 
-#: src/cmd_merging.cc:528 src/cmd_merging.cc:1121 src/cmd_merging.cc:1462
+#: src/cmd_merging.cc:528 src/cmd_merging.cc:1129 src/cmd_merging.cc:1470
 #, c-format
 msgid "please specify a branch, with '--branch=BRANCH'"
 msgstr "var god ange en gren med '--branch=GREN'"
@@ -1696,33 +1696,33 @@ msgstr "Sökvägen '%s' finns inte i må
 msgid "Path '%s' not found in destination tree."
 msgstr "Sökvägen '%s' finns inte i målträdet."
 
-#: src/cmd_merging.cc:770
+#: src/cmd_merging.cc:771
 msgid "SOURCE-BRANCH DEST-BRANCH"
 msgstr "KÄLLGREN MÅLGREN"
 
-#: src/cmd_merging.cc:771
+#: src/cmd_merging.cc:772
 msgid "Merges from one branch to another asymmetrically"
 msgstr "Slår ihop asymmetriskt från en gren till en annan"
 
-#: src/cmd_merging.cc:784
+#: src/cmd_merging.cc:785
 msgid "SOURCE-BRANCH DEST-BRANCH DIR"
 msgstr "KÄLLGREN MÅLGREN KATALOG"
 
-#: src/cmd_merging.cc:785
+#: src/cmd_merging.cc:786
 msgid "Merges one branch into a subdirectory in another branch"
 msgstr "Slår ihop en gren till en underkatalog i en annan gren"
 
-#: src/cmd_merging.cc:794
+#: src/cmd_merging.cc:795
 msgid "OTHER-REVISION"
 msgstr "ANNAN-REVISION"
 
-#: src/cmd_merging.cc:795
+#: src/cmd_merging.cc:796
 msgid "Merges a revision into the current workspace's base revision"
 msgstr ""
 "Slår ihop en revision med arbetskopians basrevision och sparar det i "
 "arbetskopian"
 
-#: src/cmd_merging.cc:796
+#: src/cmd_merging.cc:797
 msgid ""
 "Merges OTHER-REVISION into the current workspace's base revision, and update "
 "the current workspace with the result.  There can be no pending changes in "
@@ -1736,24 +1736,24 @@ msgstr ""
 "REVISION och arbetskopians grundrevision att anges som föräldrar till den ny "
 "revisionen.  Arbetskopians gren kommer inte att ändras."
 
-#: src/cmd_merging.cc:831
+#: src/cmd_merging.cc:832
 #, c-format
 msgid "'%s' can only be used in a workspace with no pending changes"
 msgstr ""
 "'%s' kan enbart användas i en arbetskopia där alla gjorda ändringar har "
 "arkiverats"
 
-#: src/cmd_merging.cc:845
+#: src/cmd_merging.cc:846
 #, c-format
 msgid "workspace is already at revision %s"
 msgstr "arbetskopian är redan uppdaterad till revision %s"
 
-#: src/cmd_merging.cc:848
+#: src/cmd_merging.cc:849
 #, c-format
 msgid "revision %s is already an ancestor of your workspace"
 msgstr "revisionen %s är redan förfader till din arbetskopia"
 
-#: src/cmd_merging.cc:850
+#: src/cmd_merging.cc:851
 #, c-format
 msgid ""
 "revision %s is a descendant of the workspace parent,\n"
@@ -1762,7 +1762,7 @@ msgstr ""
 "revisionen %s är ättling till arbetskopians förälder,\n"
 "menade du 'mtn update -r %s'?"
 
-#: src/cmd_merging.cc:903
+#: src/cmd_merging.cc:905
 #, c-format
 msgid ""
 "updated to result of merge\n"
@@ -1773,84 +1773,99 @@ msgstr ""
 "[vänster] %s\n"
 "[  höger] %s\n"
 
-#: src/cmd_merging.cc:911
+#: src/cmd_merging.cc:913
 msgid "LEFT-REVISION RIGHT-REVISION DEST-BRANCH"
 msgstr "VÄNSTERREVISION HÖGERREVISION MÅLGREN"
 
-#: src/cmd_merging.cc:912
+#: src/cmd_merging.cc:914
 msgid "Merges two explicitly given revisions"
 msgstr "Slår ihop två explicit angivna revisioner"
 
-#: src/cmd_merging.cc:913
+#: src/cmd_merging.cc:915
 msgid ""
 "The results of the merge are placed on the branch specified by DEST-BRANCH."
 msgstr "Ihopslagningens resultat är placerat i grenen MÅLGREN."
 
-#: src/cmd_merging.cc:935
+#: src/cmd_merging.cc:937
 #, c-format
 msgid "%s and %s are the same revision, aborting"
 msgstr "%s och %s är samma revision, avbryter"
 
-#: src/cmd_merging.cc:938 src/cmd_merging.cc:941
+#: src/cmd_merging.cc:940 src/cmd_merging.cc:943
 #, c-format
 msgid "%s is already an ancestor of %s"
 msgstr "%s är redan förfader till %s"
 
-#: src/cmd_merging.cc:999 src/cmd_merging.cc:1014
+#: src/cmd_merging.cc:988
 #, c-format
+msgid "[left]     %s"
+msgstr "[vänster]    %s"
+
+#: src/cmd_merging.cc:989
+#, c-format
+msgid "[right]    %s"
+msgstr "[höger]      %s"
+
+#: src/cmd_merging.cc:1001 src/cmd_merging.cc:1016
+#, c-format
 msgid "%s is an ancestor of %s; no merge is needed."
 msgstr "%s är en förfader till %s; någon ihopslagning behövs inte."
 
-#: src/cmd_merging.cc:1042
+#: src/cmd_merging.cc:1044
 #, c-format
 msgid "0 conflicts"
 msgstr "0 konflikter"
 
-#: src/cmd_merging.cc:1077
+#: src/cmd_merging.cc:1060
 #, c-format
+msgid "[ancestor] %s"
+msgstr "[förälder]   %s"
+
+#: src/cmd_merging.cc:1085
+#, c-format
 msgid "%d conflict with supported resolutions."
 msgid_plural "%d conflicts with supported resolutions."
 msgstr[0] "varning: %d konflikt med lösningsstöd."
 msgstr[1] "varning: %d konflikter med lösningsstöd."
 
-#: src/cmd_merging.cc:1082 src/cmd_conflicts.cc:160 src/cmd_conflicts.cc:173
+#: src/cmd_merging.cc:1090 src/cmd_conflicts.cc:298 src/cmd_conflicts.cc:311
 #, c-format
 msgid "warning: %d conflict with no supported resolutions."
 msgid_plural "warning: %d conflicts with no supported resolutions."
 msgstr[0] "varning: %d konflikt utan lösningsstöd."
 msgstr[1] "varning: %d konflikter utan lösningsstöd."
 
-#: src/cmd_merging.cc:1089
+#: src/cmd_merging.cc:1097
 msgid "REV REV"
 msgstr "REV REV"
 
-#: src/cmd_merging.cc:1090
+#: src/cmd_merging.cc:1098
 msgid "Shows what conflicts need resolution between two revisions"
 msgstr ""
 "Visar de konflikter som behöver lösas om de givna revisionerna slås ihop."
 
-#: src/cmd_merging.cc:1091
+#: src/cmd_merging.cc:1099
 msgid ""
 "The conflicts are calculated based on the two revisions given in the REV "
 "parameters."
 msgstr "Konflikten beräknas på bas av de två angivna revisionerna REV."
 
-#: src/cmd_merging.cc:1128
+#: src/cmd_merging.cc:1136
 #, c-format
 msgid "branch '%s' has only 1 head; must be at least 2 for conflicts"
 msgstr ""
 "grenen '%s' har bara 1 löv; det måste vara minst 2 stycken för "
 "'show_conflicts'"
 
-#: src/cmd_merging.cc:1161
+#: src/cmd_merging.cc:1169
 msgid "[LEFT_REVID RIGHT_REVID]"
 msgstr "[VÄNSTER_REVID HÖGER_REVID]"
 
-#: src/cmd_merging.cc:1162
+#: src/cmd_merging.cc:1170
 msgid "Shows the conflicts between two revisions"
 msgstr "Visar konflikterna mellan två revisioner"
 
-#: src/cmd_merging.cc:1163
+#: src/cmd_merging.cc:1171
 msgid ""
 "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
 "two heads that would be chosen by the 'merge' command."
@@ -1858,11 +1873,11 @@ msgstr ""
 "Utan givna argument blir VÄNSTER_REVID och HÖGER_REVID de två första löven "
 "som kommandot 'merge' skulle ha valt."
 
-#: src/cmd_merging.cc:1180
+#: src/cmd_merging.cc:1188
 msgid "Store the conflicts from merging two revisions"
 msgstr "Spara konflikterna från en hopslagning av två revisioner"
 
-#: src/cmd_merging.cc:1181
+#: src/cmd_merging.cc:1189
 #, c-format
 msgid ""
 "If no arguments are given, LEFT_REVID and RIGHT_REVID default to the first "
@@ -1873,21 +1888,21 @@ msgstr ""
 "som kommandot 'merge' skulle ha valt.  Om '--conflicts-file' inte är angiven "
 "används '%s'."
 
-#: src/cmd_merging.cc:1190 src/options_list.hh:603 src/options_list.hh:624
+#: src/cmd_merging.cc:1198 src/options_list.hh:603 src/options_list.hh:624
 #, c-format
 msgid "conflicts file must be under '_MTN'"
 msgstr "konfliktfilen måste ligga under '_MTN'"
 
-#: src/cmd_merging.cc:1202
+#: src/cmd_merging.cc:1210
 #, c-format
 msgid "stored in '%s'"
 msgstr "sparat i '%s'"
 
-#: src/cmd_merging.cc:1205
+#: src/cmd_merging.cc:1213
 msgid "LEFT_REVID LEFT_FILENAME RIGHT_REVID RIGHT_FILENAME"
 msgstr "VÄNSTER_REVID VÄNSTER_FILNAMN HÖGER_REVID HÖGER_FILNAMN"
 
-#: src/cmd_merging.cc:1206
+#: src/cmd_merging.cc:1214
 msgid ""
 "Prints the results of the internal line merger, given two child revisions "
 "and file names"
@@ -1895,20 +1910,20 @@ msgstr ""
 "Visa resultatet från den interna ihopslagningsmekanismen, utgående från två "
 "revisioner och filnamn"
 
-#: src/cmd_merging.cc:1258
+#: src/cmd_merging.cc:1266
 #, c-format
 msgid "internal line merger failed"
 msgstr "den interna ihopslagningsmekanismen misslyckades"
 
-#: src/cmd_merging.cc:1263
+#: src/cmd_merging.cc:1271
 msgid "[PATH...]"
 msgstr "[SÖKVÄG ...]"
 
-#: src/cmd_merging.cc:1264
+#: src/cmd_merging.cc:1272
 msgid "Applies changes made at arbitrary places in history"
 msgstr "Applicerar ändringar som gjorts på godtyckliga platser i historien"
 
-#: src/cmd_merging.cc:1265
+#: src/cmd_merging.cc:1273
 msgid ""
 "This command takes changes made at any point in history, and edits your "
 "current workspace to include those changes.  The end result is identical to "
@@ -1930,7 +1945,7 @@ msgstr ""
 "Om två revisioner har givits utförs alla ändringar som gjorts för att komma "
 "från den första till den andra."
 
-#: src/cmd_merging.cc:1289
+#: src/cmd_merging.cc:1297
 #, c-format
 msgid ""
 "revision %s is a merge.\n"
@@ -1941,49 +1956,49 @@ msgstr ""
 "För att utföra ändringarna relativt en av dess föräldrar, gör så här:\n"
 "  %s pluck -r FÖRÄLDER -r %s"
 
-#: src/cmd_merging.cc:1305
+#: src/cmd_merging.cc:1313
 #, c-format
 msgid "no changes to apply"
 msgstr "inga ändringar att utföra"
 
-#: src/cmd_merging.cc:1367
+#: src/cmd_merging.cc:1375
 #, c-format
 msgid "no changes to be applied"
 msgstr "inga ändringar att utföra"
 
-#: src/cmd_merging.cc:1417
+#: src/cmd_merging.cc:1425
 #, c-format
 msgid "no changes were applied"
 msgstr "inga ändringar blev utförda"
 
-#: src/cmd_merging.cc:1421
+#: src/cmd_merging.cc:1429
 #, c-format
 msgid "applied changes to workspace"
 msgstr "utförde ändringarna i arbetskopian"
 
-#: src/cmd_merging.cc:1453
+#: src/cmd_merging.cc:1461
 msgid "Shows unmerged head revisions of a branch"
 msgstr "Visar ej ihopslagna lövrevisioner i grenen"
 
-#: src/cmd_merging.cc:1473
+#: src/cmd_merging.cc:1481
 #, c-format
 msgid "branch '%s' is currently merged:"
 msgstr "grenen '%s' har för tillfället ett löv:"
 
-#: src/cmd_merging.cc:1475
+#: src/cmd_merging.cc:1483
 #, c-format
 msgid "branch '%s' is currently unmerged:"
 msgstr "grenen '%s' har för tillfället mer än ett löv:"
 
-#: src/cmd_merging.cc:1482 src/automate.cc:1411
+#: src/cmd_merging.cc:1490 src/automate.cc:1444
 msgid "[REVID]"
 msgstr "[REVID]"
 
-#: src/cmd_merging.cc:1483
+#: src/cmd_merging.cc:1491
 msgid "Dumps the roster associated with a given identifier"
 msgstr "Skriver ut den lista som hör ihop med angiven identifierare"
 
-#: src/cmd_merging.cc:1484
+#: src/cmd_merging.cc:1492
 msgid "If no REVID is given, the workspace is used."
 msgstr "Om ingen REVID angivits används arbetskopian."
 
@@ -2174,11 +2189,11 @@ msgstr "Epoken måste innehålla %d teck
 msgid "The epoch must be %d characters"
 msgstr "Epoken måste innehålla %d tecken"
 
-#: src/cmd_db.cc:414 src/automate.cc:2266
+#: src/cmd_db.cc:414 src/automate.cc:2299
 msgid "DOMAIN NAME VALUE"
 msgstr "DOMÄN NAMN VÄRDE"
 
-#: src/cmd_db.cc:415 src/automate.cc:2267
+#: src/cmd_db.cc:415 src/automate.cc:2300
 msgid "Sets a database variable"
 msgstr "Sätt en databasvariabel"
 
@@ -2208,7 +2223,7 @@ msgstr ""
 "Detta kommando tar bort den befintliga databasevariabeln NAMN från domänen "
 "DOMÄN."
 
-#: src/cmd_db.cc:450 src/automate.cc:2313
+#: src/cmd_db.cc:450 src/automate.cc:2346
 #, c-format
 msgid "no var with name '%s' in domain '%s'"
 msgstr "det finns inga variabler med namnet '%s' i domänen '%s'"
@@ -2229,8 +2244,8 @@ msgstr ""
 
 #: src/cmd_db.cc:464 src/cmd_db.cc:486
 #, c-format
-msgid "No workspace given"
-msgstr "Ingen arbetskopia angiven"
+msgid "no workspace given"
+msgstr "ingen arbetskopia angiven"
 
 #: src/cmd_db.cc:478
 msgid "Unregisters an existing workspace for the current database"
@@ -2283,8 +2298,8 @@ msgstr "cachade höjder: %s"
 msgstr "cachade höjder: %s"
 
 #: src/cmd_db.cc:630
-msgid "load all revisions from the database"
-msgstr "ladda alla revisioner från databasen"
+msgid "Load all revisions from the database"
+msgstr "Ladda alla revisioner från databasen"
 
 #: src/cmd_db.cc:631
 msgid ""
@@ -2305,8 +2320,8 @@ msgstr "revisioner"
 msgstr "revisioner"
 
 #: src/cmd_db.cc:659
-msgid "load all roster versions from the database"
-msgstr "laddar alla listor från databasen"
+msgid "Load all roster versions from the database"
+msgstr "Laddar alla listor från databasen"
 
 #: src/cmd_db.cc:660
 msgid ""
@@ -2326,8 +2341,8 @@ msgstr "listor"
 msgstr "listor"
 
 #: src/cmd_db.cc:687
-msgid "load all file versions from the database"
-msgstr "laddar alla filversioner från databasen"
+msgid "Load all file versions from the database"
+msgstr "Laddar alla filversioner från databasen"
 
 #: src/cmd_db.cc:688
 msgid ""
@@ -2347,8 +2362,8 @@ msgstr "filer"
 msgstr "filer"
 
 #: src/cmd_db.cc:713
-msgid "load all certs from the database"
-msgstr "laddar alla cert från databasen"
+msgid "Load all certs from the database"
+msgstr "Laddar alla cert från databasen"
 
 #: src/cmd_db.cc:714
 msgid ""
@@ -2368,17 +2383,17 @@ msgstr "laddade %d cert"
 msgid "loaded %d certs"
 msgstr "laddade %d cert"
 
-#: src/cmd_diff_log.cc:247
+#: src/cmd_diff_log.cc:259
 #, c-format
 msgid "more than two revisions given"
 msgstr "fler än två revisioner angivna"
 
-#: src/cmd_diff_log.cc:250
+#: src/cmd_diff_log.cc:262
 #, c-format
 msgid "'--reverse' only allowed with exactly one revision"
 msgstr "'--reserve' enbart tillåtet med exakt en revision"
 
-#: src/cmd_diff_log.cc:263
+#: src/cmd_diff_log.cc:275
 #, c-format
 msgid ""
 "this workspace has more than one parent\n"
@@ -2387,21 +2402,21 @@ msgstr ""
 "denna arbetskopia har mer än en förälder\n"
 "(ange en revision att se skillnader emot med '--revision')"
 
-#: src/cmd_diff_log.cc:407 src/rev_output.cc:147
+#: src/cmd_diff_log.cc:422 src/rev_output.cc:164
 msgid "no changes"
 msgstr "inga ändringar"
 
-#: src/cmd_diff_log.cc:416 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:776
-#: src/cmd_ws_commit.cc:818 src/cmd_ws_commit.cc:890 src/cmd_ws_commit.cc:1808
-#: src/automate.cc:1019
+#: src/cmd_diff_log.cc:431 src/cmd_ws_commit.cc:537 src/cmd_ws_commit.cc:786
+#: src/cmd_ws_commit.cc:828 src/cmd_ws_commit.cc:900 src/cmd_ws_commit.cc:1844
+#: src/automate.cc:1052
 msgid "[PATH]..."
 msgstr "[SÖKVÄG]..."
 
-#: src/cmd_diff_log.cc:417
+#: src/cmd_diff_log.cc:432
 msgid "Shows current differences"
 msgstr "Visa nuvarande skillnader"
 
-#: src/cmd_diff_log.cc:418
+#: src/cmd_diff_log.cc:433
 msgid ""
 "Compares the current tree with the files in the repository and prints the "
 "differences on the standard output.\n"
@@ -2415,7 +2430,7 @@ msgstr ""
 "revisionen. Om två revisioner anges visas skillnaden mellan dem. Om\n"
 "inget format anges används unified."
 
-#: src/cmd_diff_log.cc:429
+#: src/cmd_diff_log.cc:444
 #, c-format
 msgid ""
 "'--diff-args' requires '--external'; try adding '--external' or remove '--"
@@ -2424,50 +2439,50 @@ msgstr ""
 "'--diff-args' kräver att även '--external' anges; lägg till '--external' "
 "eller ta bort '--diff-args'"
 
-#: src/cmd_diff_log.cc:462
+#: src/cmd_diff_log.cc:477
 msgid "[FILE [...]]"
 msgstr "[FIL [...]]"
 
-#: src/cmd_diff_log.cc:463
+#: src/cmd_diff_log.cc:478
 msgid "Calculates diffs of files"
 msgstr "Räknar ut skillnaden mellan filerna"
 
-#: src/cmd_diff_log.cc:643
+#: src/cmd_diff_log.cc:658
 #, c-format
 msgid "only one of '--last'/'--next' allowed"
 msgstr "enbart en av '--last' eller '--next' tillåten"
 
-#: src/cmd_diff_log.cc:660
+#: src/cmd_diff_log.cc:675
 #, c-format
 msgid "try passing a '--from' revision to start at"
 msgstr "prova att ange en revision att börja med med hjälpa av '--from'"
 
-#: src/cmd_diff_log.cc:669
+#: src/cmd_diff_log.cc:684
 #, c-format
 msgid "workspace has no parent revision, probably an empty branch"
 msgstr ""
 "arbetskopian har ingen föräldrarevision, det här är antagligen en tom gren"
 
-#: src/cmd_diff_log.cc:672
+#: src/cmd_diff_log.cc:687
 #, c-format
 msgid ""
 "workspace parent revision %s not found - did you specify a wrong database?"
 msgstr "föräldrarevisionen %s finns inte - angav du fel databas?"
 
-#: src/cmd_diff_log.cc:958
+#: src/cmd_diff_log.cc:973
 #, c-format
 msgid "(Revision: %s)"
 msgstr "(Revision: %s)"
 
-#: src/cmd_diff_log.cc:980 src/cmd_diff_log.cc:994
+#: src/cmd_diff_log.cc:995 src/cmd_diff_log.cc:1009
 msgid "[PATH] ..."
 msgstr "[SÖKVÄG] ..."
 
-#: src/cmd_diff_log.cc:981
+#: src/cmd_diff_log.cc:996
 msgid "Prints selected history in forward or reverse order"
 msgstr "Skriver ut vald historia i framlänges eller baklänges ordning"
 
-#: src/cmd_diff_log.cc:982
+#: src/cmd_diff_log.cc:997
 msgid ""
 "This command prints selected history in forward or reverse order, filtering "
 "it by PATH if given."
@@ -2475,7 +2490,7 @@ msgstr ""
 "Skriv ut historiken i framlänges eller baklänges ordning, med filtrering om "
 "SÖKVÄG är angiven."
 
-#: src/cmd_diff_log.cc:995
+#: src/cmd_diff_log.cc:1010
 msgid "Lists the selected revision history"
 msgstr "Visa vald revisionshistoria"
 
@@ -2528,19 +2543,19 @@ msgstr "datumformatet '%s' kan inte tolk
 msgid "date format '%s' cannot be parsed; using default instead"
 msgstr "datumformatet '%s' kan inte tolkas; använder standardformat istället"
 
-#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:985
+#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:995
 msgid "*** THIS REVISION WILL CREATE A NEW BRANCH ***"
 msgstr "*** DENNA REVISION KOMMER ATT SKAPA EN NY GREN ***"
 
-#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:988
+#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:998
 msgid "Old Branch: "
 msgstr "Gammal gren: "
 
-#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:989
+#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:999
 msgid "New Branch: "
 msgstr "Ny gren: "
 
-#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1000
+#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1010
 msgid "*** THIS REVISION WILL CREATE DIVERGENCE ***"
 msgstr "*** DENNA REVISION KOMMER ATT SKAPA EN DIVERGENS ***"
 
@@ -2614,23 +2629,23 @@ msgstr "återställer '%s/'"
 msgid "recreating '%s/'"
 msgstr "återställer '%s/'"
 
-#: src/cmd_ws_commit.cc:539
+#: src/cmd_ws_commit.cc:538
 msgid "Reverts files and/or directories"
 msgstr "Återställer filer och/eller kataloger"
 
-#: src/cmd_ws_commit.cc:540
+#: src/cmd_ws_commit.cc:539
 msgid "In order to revert the entire workspace, specify '.' as the file name."
 msgstr "Använda '.' om hela arbetskopian ska återställas."
 
-#: src/cmd_ws_commit.cc:547
+#: src/cmd_ws_commit.cc:546
 msgid "PATH..."
 msgstr "SÖKVÄG..."
 
-#: src/cmd_ws_commit.cc:548
+#: src/cmd_ws_commit.cc:547
 msgid "Reverses a mistaken 'drop'"
 msgstr "Återställer en borttagning ('drop') som gjordes av misstag"
 
-#: src/cmd_ws_commit.cc:549
+#: src/cmd_ws_commit.cc:548
 msgid ""
 "If the file was deleted from the workspace, this is the same as 'revert'. "
 "Otherwise, it just removes the 'drop' from the manifest."
@@ -2638,35 +2653,35 @@ msgstr ""
 "Om filen blev borttagen från arbetskopian gör detta samma sak so 'revert'. I "
 "annat fall tar det bara bort 'drop' från manifestet."
 
-#: src/cmd_ws_commit.cc:566 src/cmd_ws_commit.cc:575
+#: src/cmd_ws_commit.cc:565 src/cmd_ws_commit.cc:574
 #, c-format
 msgid "revision %s it not a child of %s, cannot invert"
 msgstr "revisionen %s är inte barn till %s, kan inte invertera"
 
-#: src/cmd_ws_commit.cc:571 src/cmd_ws_commit.cc:610 src/cmd_ws_commit.cc:650
+#: src/cmd_ws_commit.cc:570 src/cmd_ws_commit.cc:609 src/cmd_ws_commit.cc:649
 #, c-format
 msgid "revision %s has %d parents, cannot invert"
 msgstr "revisionen %s har %d föräldrar, kan inte invertera"
 
-#: src/cmd_ws_commit.cc:583
+#: src/cmd_ws_commit.cc:582
 msgid "[PARENT-REVISION] CHILD-REVISION"
 msgstr "[FÖRÄLDRAREVISION] BARNREVISION"
 
-#: src/cmd_ws_commit.cc:584
+#: src/cmd_ws_commit.cc:583
 msgid "Disapproves a particular revision or revision range"
 msgstr "Underkänner angiven eller angivna revisioner"
 
-#: src/cmd_ws_commit.cc:615 src/cmd_ws_commit.cc:655
+#: src/cmd_ws_commit.cc:614 src/cmd_ws_commit.cc:654
 #, c-format
 msgid "need '--branch' argument for disapproval"
 msgstr "för underkännande behöver en gren anges med '--branch'"
 
-#: src/cmd_ws_commit.cc:638
+#: src/cmd_ws_commit.cc:637
 #, c-format
 msgid "revisions %s and %s do not share common history, cannot invert"
 msgstr "revisionen %s och %s har ingen gemensam historia, kan inte invertera"
 
-#: src/cmd_ws_commit.cc:641
+#: src/cmd_ws_commit.cc:640
 #, c-format
 msgid ""
 "revisions share common history, but %s is not an ancestor of %s, cannot "
@@ -2675,8 +2690,13 @@ msgstr ""
 "flera revisioner har gemensam historia, men %s är inte förfader till %s, kan "
 "inte invertera"
 
-#: src/cmd_ws_commit.cc:702 src/cmd_ws_commit.cc:1771
+#: src/cmd_ws_commit.cc:673
 #, c-format
+msgid "cannot disapprove root revision"
+msgstr "kan inte underkänna en rotrevision"
+
+#: src/cmd_ws_commit.cc:703 src/cmd_ws_commit.cc:1807
+#, c-format
 msgid ""
 "note: this revision creates divergence\n"
 "note: you may (or may not) wish to run '%s merge'"
@@ -2684,33 +2704,33 @@ msgstr ""
 "obs: den här revisionen skapade divergens\n"
 "obs: du kan tänkas vilja (eller kanske inte) köra '%s merge'"
 
-#: src/cmd_ws_commit.cc:709
+#: src/cmd_ws_commit.cc:710
 msgid "[DIRECTORY...]"
 msgstr "[KATALOG...]"
 
-#: src/cmd_ws_commit.cc:710
+#: src/cmd_ws_commit.cc:711
 msgid "Creates directories and adds them to the workspace"
 msgstr "Skapar en eller flera kataloger och lägger till dem i arbetskopian"
 
-#: src/cmd_ws_commit.cc:728
+#: src/cmd_ws_commit.cc:729
 #, c-format
 msgid "directory '%s' already exists"
 msgstr "katalogen '%s' finns redan"
 
-#: src/cmd_ws_commit.cc:735
+#: src/cmd_ws_commit.cc:736
 #, c-format
 msgid "ignoring directory '%s' (see '.mtn-ignore')"
 msgstr "ignorerar katalogen '%s' (se '.mtn-ignore')"
 
-#: src/cmd_ws_commit.cc:777
+#: src/cmd_ws_commit.cc:787
 msgid "Adds files to the workspace"
 msgstr "Lägger till filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:819
+#: src/cmd_ws_commit.cc:829
 msgid "Drops files from the workspace"
 msgstr "Överger filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:834
+#: src/cmd_ws_commit.cc:844
 msgid ""
 "SRC DEST\n"
 "SRC1 [SRC2 [...]] DEST_DIR"
@@ -2718,24 +2738,24 @@ msgstr ""
 "KÄLLA MÅL\n"
 "KÄLLA1 [KÄLLA2 [...]] MÅLKATALOG"
 
-#: src/cmd_ws_commit.cc:836
+#: src/cmd_ws_commit.cc:846
 msgid "Renames entries in the workspace"
 msgstr "Byter namn på filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:862
+#: src/cmd_ws_commit.cc:872
 #, c-format
 msgid "the specified target directory '%s/' doesn't exist."
 msgstr "den angivna målkatalogen '%s/' finns inte."
 
-#: src/cmd_ws_commit.cc:868
+#: src/cmd_ws_commit.cc:878
 msgid "NEW_ROOT PUT_OLD"
 msgstr "NY_ROT PLACERA_GAMLA"
 
-#: src/cmd_ws_commit.cc:869
+#: src/cmd_ws_commit.cc:879
 msgid "Renames the root directory"
 msgstr "Byter namn på rotkatalogen"
 
-#: src/cmd_ws_commit.cc:870
+#: src/cmd_ws_commit.cc:880
 msgid ""
 "After this command, the directory that currently has the name NEW_ROOT will "
 "be the root directory, and the directory that is currently the root "
@@ -2747,51 +2767,51 @@ msgstr ""
 "PLACERA_GAMLA.\n"
 "Det är INTE rekommenderat att använda '--bookkeep-only'."
 
-#: src/cmd_ws_commit.cc:891
+#: src/cmd_ws_commit.cc:901
 msgid "Shows workspace's status information"
 msgstr "Visar statusinformation för arbetskopian"
 
-#: src/cmd_ws_commit.cc:929
+#: src/cmd_ws_commit.cc:939
 #, c-format
 msgid "bisection from revision %s in progress"
 msgstr "uppdelning från revision %s pågår"
 
-#: src/cmd_ws_commit.cc:1024
+#: src/cmd_ws_commit.cc:1034
 #, c-format
 msgid "use '--revision' or '--branch' to specify what to checkout"
 msgstr ""
 "använd '--revision' eller '--branch' för att tala om vad som ska hämtas"
 
-#: src/cmd_ws_commit.cc:1037
+#: src/cmd_ws_commit.cc:1047
 #, c-format
 msgid "choose one with '%s checkout -r<id>'"
 msgstr "välj ett med '%s update -r<id>'"
 
-#: src/cmd_ws_commit.cc:1054
+#: src/cmd_ws_commit.cc:1064
 #, c-format
 msgid "revision %s is not a member of branch %s"
 msgstr "revisionen %s är inte med i grenen %s"
 
-#: src/cmd_ws_commit.cc:1071
+#: src/cmd_ws_commit.cc:1081
 #, c-format
 msgid "you must specify a destination directory"
 msgstr "du måste ange en målkatalog"
 
-#: src/cmd_ws_commit.cc:1084
+#: src/cmd_ws_commit.cc:1094
 #, c-format
 msgid "checkout directory '%s' already exists"
 msgstr "katalogen '%s' finns redan"
 
-#: src/cmd_ws_commit.cc:1111 src/cmd_ws_commit.cc:1125
-#: src/cmd_ws_commit.cc:1821 src/cmd_ws_commit.cc:1978
+#: src/cmd_ws_commit.cc:1121 src/cmd_ws_commit.cc:1135
+#: src/cmd_ws_commit.cc:1857 src/cmd_ws_commit.cc:2014
 msgid "[DIRECTORY]"
 msgstr "[KATALOG]"
 
-#: src/cmd_ws_commit.cc:1112 src/cmd_ws_commit.cc:1126
+#: src/cmd_ws_commit.cc:1122 src/cmd_ws_commit.cc:1136
 msgid "Checks out a revision from the database into a directory"
 msgstr "Hämtar en revision från databasen till en katalog"
 
-#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1123 src/cmd_ws_commit.cc:1137
 msgid ""
 "If a revision is given, that's the one that will be checked out.  Otherwise, "
 "it will be the head of the branch (given or implicit).  If no directory is "
@@ -2801,39 +2821,39 @@ msgstr ""
 "lövet i grenen (implicit eller angiven) att hämtas. Om ingen katalog anges "
 "kommer grenens namn att användas som katalognamn."
 
-#: src/cmd_ws_commit.cc:1137
+#: src/cmd_ws_commit.cc:1147
 #, c-format
 msgid "wrong revision count"
 msgstr "felaktigt antal revisioner"
 
-#: src/cmd_ws_commit.cc:1143
+#: src/cmd_ws_commit.cc:1153
 msgid "Manages file attributes"
 msgstr "Hanterar filattribut"
 
-#: src/cmd_ws_commit.cc:1144
+#: src/cmd_ws_commit.cc:1154
 msgid "This command is used to set, get or drop file attributes."
 msgstr "Detta kommando används för att sätta, hämta eller ta bort attribut"
 
-#: src/cmd_ws_commit.cc:1163 src/cmd_ws_commit.cc:1231
-#: src/cmd_ws_commit.cc:1281 src/cmd_ws_commit.cc:1362
+#: src/cmd_ws_commit.cc:1173 src/cmd_ws_commit.cc:1241
+#: src/cmd_ws_commit.cc:1291 src/cmd_ws_commit.cc:1374
 #, c-format
 msgid "unknown path '%s'"
 msgstr "okänd sökväg '%s'"
 
-#: src/cmd_ws_commit.cc:1180
+#: src/cmd_ws_commit.cc:1190
 #, c-format
 msgid "path '%s' does not have attribute '%s'"
 msgstr "sökvägen '%s' har inget attribut '%s'"
 
-#: src/cmd_ws_commit.cc:1199 src/cmd_ws_commit.cc:1212
+#: src/cmd_ws_commit.cc:1209 src/cmd_ws_commit.cc:1222
 msgid "PATH [ATTR]"
 msgstr "SÖKVÄG [ATTR]"
 
-#: src/cmd_ws_commit.cc:1200
+#: src/cmd_ws_commit.cc:1210
 msgid "Removes attributes from a file"
 msgstr "Tar bort attribut från en fil"
 
-#: src/cmd_ws_commit.cc:1201
+#: src/cmd_ws_commit.cc:1211
 msgid ""
 "If no attribute is specified, this command removes all attributes attached "
 "to the file given in PATH.  Otherwise only removes the attribute specified "
@@ -2842,11 +2862,11 @@ msgstr ""
 "Detta kommando tar bort alla attribut kopplade till filen SÖKVÄG om NYCKEL "
 "inte är givet.  Om NYCKEL är givet tas enbart detta attribut bort."
 
-#: src/cmd_ws_commit.cc:1213
+#: src/cmd_ws_commit.cc:1223
 msgid "Gets the values of a file's attributes"
 msgstr "Hämta värdet för ett filattribut"
 
-#: src/cmd_ws_commit.cc:1214
+#: src/cmd_ws_commit.cc:1224
 msgid ""
 "If no attribute is specified, this command prints all attributes attached to "
 "the file given in PATH.  Otherwise it only prints the attribute specified in "
@@ -2855,60 +2875,78 @@ msgstr ""
 "Detta kommando skriver ut alla attribut kopplade till filen SÖKVÄG om NYCKEL "
 "inte är givet.  Om NYCKEL är givet skrivs enbart detta attribut ut."
 
-#: src/cmd_ws_commit.cc:1247
+#: src/cmd_ws_commit.cc:1257
 #, c-format
 msgid "no attributes for '%s'"
 msgstr "inga attribut till '%s'"
 
-#: src/cmd_ws_commit.cc:1259
+#: src/cmd_ws_commit.cc:1269
 #, c-format
 msgid "no attribute '%s' on path '%s'"
 msgstr "inget attribut '%s' för sökvägen '%s'"
 
-#: src/cmd_ws_commit.cc:1305
+#: src/cmd_ws_commit.cc:1315
 msgid "PATH ATTR VALUE"
 msgstr "SÖKVÄG ATTR VÄRDE"
 
-#: src/cmd_ws_commit.cc:1306
+#: src/cmd_ws_commit.cc:1316
 msgid "Sets an attribute on a file"
 msgstr "Sätt ett attribut på en fil"
 
-#: src/cmd_ws_commit.cc:1307
+#: src/cmd_ws_commit.cc:1317
 msgid ""
 "Sets the attribute given on ATTR to the value specified in VALUE for the "
 "file mentioned in PATH."
 msgstr "Sätt attributet NYCKEL med värde VÄRDE på filen SÖKVÄG."
 
-#: src/cmd_ws_commit.cc:1336 src/cmd_files.cc:138 src/cmd_files.cc:233
+#: src/cmd_ws_commit.cc:1343 src/cmd_files.cc:139 src/cmd_files.cc:234
 msgid "PATH"
 msgstr "SÖKVÄG"
 
-#: src/cmd_ws_commit.cc:1337
+#: src/cmd_ws_commit.cc:1344
 msgid "Prints all attributes for the specified path"
 msgstr "Skriver ut alla attribut för den givna sökvägen"
 
-#: src/cmd_ws_commit.cc:1450
+#: src/cmd_ws_commit.cc:1345
+msgid ""
+"If an explicit revision is given, the file's attributes at this specific "
+"revision are returned."
+msgstr ""
+"Om en revision anges explicit får man filens attribut i den revisionen "
+"specifikt."
+
+#: src/cmd_ws_commit.cc:1386
+#, c-format
+msgid "unknown path '%s' in %s"
+msgstr "okänd sökväg '%s' i %s"
+
+#: src/cmd_ws_commit.cc:1389
+#, c-format
+msgid "none or only one revision must be given"
+msgstr "ingen eller enbart en revision får anges"
+
+#: src/cmd_ws_commit.cc:1486
 msgid "PATH KEY VALUE"
 msgstr "SÖKVÄG NYCKEL VÄRDE"
 
-#: src/cmd_ws_commit.cc:1451
+#: src/cmd_ws_commit.cc:1487
 msgid "Sets an attribute on a certain path"
 msgstr "Sätt ett attribut på en given sökväg"
 
-#: src/cmd_ws_commit.cc:1472
+#: src/cmd_ws_commit.cc:1508
 msgid "PATH [KEY]"
 msgstr "SÖKVÄG [NYCKEL]"
 
-#: src/cmd_ws_commit.cc:1473
+#: src/cmd_ws_commit.cc:1509
 msgid "Drops an attribute or all of them from a certain path"
 msgstr "Kata ett eller alla attribut för en given sökväg"
 
-#: src/cmd_ws_commit.cc:1513
+#: src/cmd_ws_commit.cc:1549
 #, c-format
 msgid "no changes to commit"
 msgstr "inga ändringar att arkivera"
 
-#: src/cmd_ws_commit.cc:1534
+#: src/cmd_ws_commit.cc:1570
 #, c-format
 msgid ""
 "parent revisions of this commit are in different branches:\n"
@@ -2919,12 +2957,12 @@ msgstr ""
 "'%s' och '%s'.\n"
 "var god ange en gren för denna arkivering med '--branch'."
 
-#: src/cmd_ws_commit.cc:1556
+#: src/cmd_ws_commit.cc:1592
 #, c-format
 msgid "changes rejected by hook: %s"
 msgstr "ändringar förkastade av hook: %s"
 
-#: src/cmd_ws_commit.cc:1570
+#: src/cmd_ws_commit.cc:1606
 #, c-format
 msgid ""
 "'_MTN/log' is non-empty and log message was specified on command line.\n"
@@ -2935,72 +2973,72 @@ msgstr ""
 "Kanske ta bort eller flytta på '_MTN/log'\n"
 "eller ta bort '--message'/'--message-file' från kommandoraden?"
 
-#: src/cmd_ws_commit.cc:1615
+#: src/cmd_ws_commit.cc:1651
 #, c-format
 msgid "empty log message; commit canceled"
 msgstr "tomt loggmeddelande; arkivering avbryts"
 
-#: src/cmd_ws_commit.cc:1635
+#: src/cmd_ws_commit.cc:1671
 #, c-format
 msgid "log message rejected by hook: %s"
 msgstr "loggmeddelandet förkastas: %s"
 
-#: src/cmd_ws_commit.cc:1645
+#: src/cmd_ws_commit.cc:1681
 #, c-format
 msgid "beginning commit on branch '%s'"
 msgstr "börjar arkivering av ändringar i grenen '%s'"
 
-#: src/cmd_ws_commit.cc:1651
+#: src/cmd_ws_commit.cc:1687
 #, c-format
 msgid "revision %s already in database"
 msgstr "revisionen %s finns redan i databasen"
 
-#: src/cmd_ws_commit.cc:1695 src/cmd_ws_commit.cc:1725
+#: src/cmd_ws_commit.cc:1731 src/cmd_ws_commit.cc:1761
 #, c-format
 msgid "file '%s' modified during commit, aborting"
 msgstr "filen '%s' ändrades under arkivering, avbryter"
 
-#: src/cmd_ws_commit.cc:1706
+#: src/cmd_ws_commit.cc:1742
 #, c-format
 msgid "your database is missing version %s of file '%s'"
 msgstr "din databas saknar version %s av filen '%s'"
 
-#: src/cmd_ws_commit.cc:1764
+#: src/cmd_ws_commit.cc:1800
 #, c-format
 msgid "committed revision %s"
 msgstr "arkiverade revisionen %s"
 
-#: src/cmd_ws_commit.cc:1809
+#: src/cmd_ws_commit.cc:1845
 msgid "Commits workspace changes to the database"
 msgstr "Arkiverar ändringar i arbetskopian till databasen"
 
-#: src/cmd_ws_commit.cc:1822
+#: src/cmd_ws_commit.cc:1858
 msgid "Sets up a new workspace directory"
 msgstr "Initierar en ny arbetskopie-katalog"
 
-#: src/cmd_ws_commit.cc:1823
+#: src/cmd_ws_commit.cc:1859
 msgid "If no directory is specified, uses the current directory."
 msgstr "Använd nuvarande katalog om inget annat anges."
 
-#: src/cmd_ws_commit.cc:1830
+#: src/cmd_ws_commit.cc:1866
 #, c-format
 msgid "need '--branch' argument for setup"
 msgstr "du måste ange en gren med '--branch' till kommandot 'setup'"
 
-#: src/cmd_ws_commit.cc:1868
+#: src/cmd_ws_commit.cc:1904
 msgid "DIRECTORY"
 msgstr "KATALOG"
 
-#: src/cmd_ws_commit.cc:1869
+#: src/cmd_ws_commit.cc:1905
 msgid "Imports the contents of a directory into a branch"
 msgstr "Importerar den givna katalogens innehåll till den givna grenen"
 
-#: src/cmd_ws_commit.cc:1883
+#: src/cmd_ws_commit.cc:1919
 #, c-format
 msgid "you must specify a directory to import"
 msgstr "du måste ange en katalog att importera"
 
-#: src/cmd_ws_commit.cc:1903
+#: src/cmd_ws_commit.cc:1939
 #, c-format
 msgid ""
 "use '--revision' or '--branch' to specify the parent revision for the import"
@@ -3008,38 +3046,38 @@ msgstr ""
 "använd '--revision' eller '--branch' för att ange föräldrarevisionen för "
 "importen"
 
-#: src/cmd_ws_commit.cc:1914
+#: src/cmd_ws_commit.cc:1950
 #, c-format
 msgid "choose one with '%s import -r<id>'"
 msgstr "välj en med '%s import -r<id>'"
 
-#: src/cmd_ws_commit.cc:1925
+#: src/cmd_ws_commit.cc:1961
 #, c-format
 msgid "import directory '%s' doesn't exists"
 msgstr "importkatalogen '%s' finns inte"
 
-#: src/cmd_ws_commit.cc:1926
+#: src/cmd_ws_commit.cc:1962
 #, c-format
 msgid "import directory '%s' is a file"
 msgstr "importkatalogen '%s' är en fil"
 
-#: src/cmd_ws_commit.cc:1979
+#: src/cmd_ws_commit.cc:2015
 msgid "Migrates a workspace directory's metadata to the latest format"
 msgstr "Migrerar en arbetskopias metadata till det senaste formatet"
 
-#: src/cmd_ws_commit.cc:1980
+#: src/cmd_ws_commit.cc:2016
 msgid "If no directory is given, defaults to the current workspace."
 msgstr "Nuvarande katalog avses om inget annat anges"
 
-#: src/cmd_ws_commit.cc:2004
+#: src/cmd_ws_commit.cc:2040
 msgid "Refreshes the inodeprint cache"
 msgstr "Uppdaterar inodeprint-cachen"
 
-#: src/cmd_ws_commit.cc:2015
+#: src/cmd_ws_commit.cc:2051
 msgid "Search revisions to find where a change first appeared"
 msgstr "Leta efter revision för att finna var en ändring uppstod"
 
-#: src/cmd_ws_commit.cc:2016
+#: src/cmd_ws_commit.cc:2052
 msgid ""
 "These commands subdivide a set of revisions into good, bad and untested "
 "subsets and successively narrow the untested set to find the first revision "
@@ -3049,11 +3087,11 @@ msgstr ""
 "otestad mängde, och smalnar successivt av den otestade mängden med målet att "
 "finna den revision som först introducerade en viss ändring."
 
-#: src/cmd_ws_commit.cc:2021
+#: src/cmd_ws_commit.cc:2057
 msgid "Reset the current bisection search"
 msgstr "Avbryt den pågående uppdelningssökningen"
 
-#: src/cmd_ws_commit.cc:2022
+#: src/cmd_ws_commit.cc:2058
 msgid ""
 "Update the workspace back to the revision from which the bisection was "
 "started and remove all current search information, allowing a new search to "
@@ -3062,24 +3100,24 @@ msgstr ""
 "Uppdatera arbetskopian tillbaka till revisionen där uppdelningen började och "
 "ta bort all sökningsinformation så att en ny sökning kan påbörjas."
 
-#: src/cmd_ws_commit.cc:2037 src/cmd_ws_commit.cc:2093
+#: src/cmd_ws_commit.cc:2073 src/cmd_ws_commit.cc:2129
 #, c-format
 msgid "no bisection in progress"
 msgstr "ingen uppdelning pågår"
 
-#: src/cmd_ws_commit.cc:2052 src/cmd_ws_commit.cc:2280
+#: src/cmd_ws_commit.cc:2088 src/cmd_ws_commit.cc:2316
 #, c-format
 msgid "this command can only be used in a workspace with no pending changes"
 msgstr ""
 "detta kommando kan enbart användas i en arbetskopia där alla gjorda "
 "ändringar har arkiverats"
 
-#: src/cmd_ws_commit.cc:2058
+#: src/cmd_ws_commit.cc:2094
 #, c-format
 msgid "reset back to %s"
 msgstr "återställ till %s"
 
-#: src/cmd_ws_commit.cc:2124
+#: src/cmd_ws_commit.cc:2160
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to "
@@ -3088,7 +3126,7 @@ msgstr ""
 "delar upp revisioner; %d bra; %d dåliga; %d hoppades över; var god ange bra "
 "revisioner för att påbörja sökningen"
 
-#: src/cmd_ws_commit.cc:2130
+#: src/cmd_ws_commit.cc:2166
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to "
@@ -3097,41 +3135,41 @@ msgstr ""
 "delar upp revisioner; %d bra; %d dåliga; %d hoppades över; var god ange "
 "dåliga revisioner för att påbörja sökningen"
 
-#: src/cmd_ws_commit.cc:2193
+#: src/cmd_ws_commit.cc:2229
 #, c-format
 msgid "bisecting %d revisions; %d good; %d bad; %d skipped; %d remaining"
 msgstr "delar upp %d revisioner; %d bra; %d dåliga; %d hoppades över; %d kvar"
 
-#: src/cmd_ws_commit.cc:2211
+#: src/cmd_ws_commit.cc:2247
 #, c-format
 msgid "bisection finished at revision %s"
 msgstr "uppdelningen slutade på revision %s"
 
-#: src/cmd_ws_commit.cc:2304
+#: src/cmd_ws_commit.cc:2340
 #, c-format
 msgid "bisection started at revision %s"
 msgstr "uppdelningen började på revision %s"
 
-#: src/cmd_ws_commit.cc:2320
+#: src/cmd_ws_commit.cc:2356
 #, c-format
 msgid "ignored redundant bisect %s on revision %s"
 msgstr "ignorerade redundant uppdelning %s på revision %s"
 
-#: src/cmd_ws_commit.cc:2325
+#: src/cmd_ws_commit.cc:2361
 #, c-format
 msgid "conflicting bisect %s/%s on revision %s"
 msgstr "uppdelning %s och %s i konflikt med varandra i revision %s"
 
-#: src/cmd_ws_commit.cc:2343
+#: src/cmd_ws_commit.cc:2379
 #, c-format
 msgid "updating to %s"
 msgstr "uppdaterar till %s"
 
-#: src/cmd_ws_commit.cc:2368
+#: src/cmd_ws_commit.cc:2404
 msgid "Reports on the current status of the bisection search"
 msgstr "Berättar om den nuvarande uppdelningssökningens tillstånd"
 
-#: src/cmd_ws_commit.cc:2369
+#: src/cmd_ws_commit.cc:2405
 msgid ""
 "Lists the total number of revisions in the search set, the number of "
 "revisions that have been determined to be good or bad, the number of "
@@ -3142,26 +3180,26 @@ msgstr ""
 "markerats som bra eller dåliga, antalet revision som har hoppats över och "
 "antalet revisioner kvar att testa."
 
-#: src/cmd_ws_commit.cc:2397
+#: src/cmd_ws_commit.cc:2433
 #, c-format
 msgid "next revision for bisection testing is %s\n"
 msgstr "nästa revision att testa med uppdelning är %s\n"
 
-#: src/cmd_ws_commit.cc:2398
+#: src/cmd_ws_commit.cc:2434
 #, c-format
 msgid "however this workspace is currently at %s\n"
 msgstr "men denna arbetskopia är för närvarande på %s\n"
 
-#: src/cmd_ws_commit.cc:2399
+#: src/cmd_ws_commit.cc:2435
 #, c-format
 msgid "run 'bisect update' to update to this revision before testing"
 msgstr "kör 'bisect update' för att uppdatera till denna revision innan test"
 
-#: src/cmd_ws_commit.cc:2404
+#: src/cmd_ws_commit.cc:2440
 msgid "Updates the workspace to the next revision to be tested by bisection"
 msgstr "Uppdaterar arbetskopian till nästa revision att testa med uppdelning"
 
-#: src/cmd_ws_commit.cc:2405
+#: src/cmd_ws_commit.cc:2441
 msgid ""
 "This command can be used if updates by good, bad or skip commands fail due "
 "to blocked paths or other problems."
@@ -3169,11 +3207,11 @@ msgstr ""
 "Detta kommando kan användas om uppdatering med kommandona 'good', 'bad' och "
 "'skipped' misslyckades på grund av blockerade sökvägar eller andra problem."
 
-#: src/cmd_ws_commit.cc:2415
+#: src/cmd_ws_commit.cc:2451
 msgid "Excludes the current revision or specified revisions from the search"
 msgstr "Utestänger nuvarande revision eller angivna revisioner från sökningen"
 
-#: src/cmd_ws_commit.cc:2416
+#: src/cmd_ws_commit.cc:2452
 msgid ""
 "Skipped revisions are removed from the set being searched. Revisions that "
 "cannot be tested for some reason should be skipped."
@@ -3181,19 +3219,19 @@ msgstr ""
 "Revisioner som hoppas över tas bort från mängden som söks igenom. Revisioner "
 "som inte kan testas av någon anledning borde hoppas över."
 
-#: src/cmd_ws_commit.cc:2426
+#: src/cmd_ws_commit.cc:2462
 msgid "Marks the current revision or specified revisions as bad"
 msgstr "Markerar nuvarande revision eller angivna revisioner som dåliga"
 
-#: src/cmd_ws_commit.cc:2427
+#: src/cmd_ws_commit.cc:2463
 msgid "Known bad revisions are removed from the set being searched."
 msgstr "Kända dåliga revisioner tas bort från mängden att söka igenom."
 
-#: src/cmd_ws_commit.cc:2436
+#: src/cmd_ws_commit.cc:2472
 msgid "Marks the current revision or specified revisions as good"
 msgstr "Markerar nuvarande revision eller angivna revisioner som bra"
 
-#: src/cmd_ws_commit.cc:2437
+#: src/cmd_ws_commit.cc:2473
 msgid "Known good revisions are removed from the set being searched."
 msgstr "Kända bra revisioner tas bort från mängden att söka igenom."
 
@@ -3360,17 +3398,17 @@ msgstr "målets filidentitet finns inte"
 msgid "destination file id does not exist"
 msgstr "målets filidentitet finns inte"
 
-#: src/cmd_files.cc:139
+#: src/cmd_files.cc:140
 msgid "Prints an annotated copy of a file"
 msgstr "Skriver ut en annoterad kopia av en fil"
 
-#: src/cmd_files.cc:140
+#: src/cmd_files.cc:141
 msgid ""
 "Calculates and prints an annotated copy of the given file from the specified "
 "REVISION."
 msgstr "Skriver ut en annoterad kopia av en given fil från en given REVISION."
 
-#: src/cmd_files.cc:172
+#: src/cmd_files.cc:173
 #, c-format
 msgid ""
 "with no revision selected, this command can only be used in a single-parent "
@@ -3379,25 +3417,25 @@ msgstr ""
 "detta kommando kan bara användas för arbetskopior med en förälder när ingen "
 "specifik revision anges"
 
-#: src/cmd_files.cc:190
+#: src/cmd_files.cc:191
 #, c-format
 msgid "no such file '%s' in revision %s"
 msgstr "filen '%s' finns inte i revisionen %s"
 
-#: src/cmd_files.cc:194
+#: src/cmd_files.cc:195
 #, c-format
 msgid "'%s' in revision %s is not a file"
 msgstr "'%s' i revisionen %s är inte en fil"
 
-#: src/cmd_files.cc:202
+#: src/cmd_files.cc:203
 msgid "[PATH]"
 msgstr "[SÖKVÄG]"
 
-#: src/cmd_files.cc:203
+#: src/cmd_files.cc:204
 msgid "Calculates the identity of a file or stdin"
 msgstr "Räkna ut identiteten för SÖKVÄG eller stdin"
 
-#: src/cmd_files.cc:204
+#: src/cmd_files.cc:205
 msgid ""
 "If any PATH is given, calculates their identity; otherwise, the one from the "
 "standard input is calculated."
@@ -3405,220 +3443,331 @@ msgstr ""
 "Om någon SÖKVÄG är angiven räknas dess identitet ut; om ingen SÖKVÄG "
 "angivits räknas identiteten för data som kommer på stdin ut."
 
-#: src/cmd_files.cc:234
+#: src/cmd_files.cc:235
 msgid "Prints the file identifier of a file"
 msgstr "Skriver ut en fils identitet"
 
-#: src/cmd_files.cc:244
+#: src/cmd_files.cc:245
 #, c-format
 msgid "cannot read from stdin"
 msgstr "kan inte läsa från stdin"
 
-#: src/cmd_files.cc:258 src/cmd_files.cc:367 src/automate.cc:2070
+#: src/cmd_files.cc:259 src/cmd_files.cc:368 src/automate.cc:2103
 #, c-format
 msgid "no file version %s found in database"
 msgstr "filversionen %s finns inte i databasen"
 
-#: src/cmd_files.cc:280 src/cmd_files.cc:284
+#: src/cmd_files.cc:281 src/cmd_files.cc:285
 #, c-format
 msgid "no file '%s' found in revision %s"
 msgstr "filen '%s' finns inte i revisionen %s"
 
-#: src/cmd_files.cc:291 src/cmd_files.cc:388
+#: src/cmd_files.cc:292 src/cmd_files.cc:389
 msgid "FILENAME"
 msgstr "FILNAMN"
 
-#: src/cmd_files.cc:292
+#: src/cmd_files.cc:293
 msgid "Prints a file from the database"
 msgstr "Skriver ut angiven fil från databasen"
 
-#: src/cmd_files.cc:293
+#: src/cmd_files.cc:294
 msgid ""
 "Fetches the given file FILENAME from the database and prints it to the "
 "standard output."
 msgstr ""
 "Hämtar den angivna filen FILNAMN från database och skriver ut den på stdout."
 
-#: src/cmd_files.cc:330 src/cmd_files.cc:354 src/automate.cc:1652
+#: src/cmd_files.cc:331 src/cmd_files.cc:355 src/automate.cc:1685
 msgid "FILEID"
 msgstr "FILID"
 
-#: src/cmd_files.cc:331
+#: src/cmd_files.cc:332
 msgid "Prints the contents of a file (given an identifier)"
 msgstr "Skriver ut innehållet på en fil (givet en filidentitet)"
 
-#: src/cmd_files.cc:355
+#: src/cmd_files.cc:356
 msgid "Prints the size of a file (given an identifier)"
 msgstr "Skriver ut storleken på en fil (givet en filidentitet)"
 
-#: src/cmd_files.cc:389
+#: src/cmd_files.cc:390
 msgid "Prints the contents of a file (given a name)"
 msgstr "Skriver ut innehållet på en fil (givet ett filnamn)"
 
 #: src/cmd_conflicts.cc:19
 msgid "Commands for conflict resolutions"
-msgstr "Kommandon för att lösa revisioner"
+msgstr "Kommandon för att lösa revisionskonflikter"
 
-#: src/cmd_conflicts.cc:71
+#: src/cmd_conflicts.cc:81
 #, c-format
 msgid "orphaned node '%s'"
 msgstr "borttappad nod '%s'"
 
-#: src/cmd_conflicts.cc:76 src/cmd_conflicts.cc:103 src/cmd_conflicts.cc:143
+#: src/cmd_conflicts.cc:86 src/cmd_conflicts.cc:172 src/cmd_conflicts.cc:188
+#: src/cmd_conflicts.cc:241 src/cmd_conflicts.cc:281
 #, c-format
 msgid "possible resolutions:"
 msgstr "möjliga lösningar:"
 
-#: src/cmd_conflicts.cc:77
+#: src/cmd_conflicts.cc:87 src/cmd_conflicts.cc:173
 #, c-format
 msgid "resolve_first drop"
 msgstr "resolve_first drop"
 
-#: src/cmd_conflicts.cc:78
+#: src/cmd_conflicts.cc:88
 #, c-format
 msgid "resolve_first rename \"file_name\""
 msgstr "resolve_first rename \"filnamn\""
 
-#: src/cmd_conflicts.cc:98
+#: src/cmd_conflicts.cc:121 src/merge_conflict.cc:1207
 #, c-format
-msgid "duplicate_name %s"
-msgstr "duplicate_name %s"
+msgid "conflict: file '%s'"
+msgstr "konflikt: fil '%s'"
 
-#: src/cmd_conflicts.cc:107
+#: src/cmd_conflicts.cc:127 src/merge_conflict.cc:1213
 #, c-format
+msgid "orphaned on the left"
+msgstr "övergiven på vänstersidan"
+
+#: src/cmd_conflicts.cc:128 src/cmd_conflicts.cc:149
+#, c-format
+msgid "modified on the right"
+msgstr "förändrad på högersidan"
+
+#: src/cmd_conflicts.cc:132 src/cmd_conflicts.cc:153
+#, c-format
+msgid "modified on the left"
+msgstr "förändrad på vänstersidan"
+
+#: src/cmd_conflicts.cc:133 src/merge_conflict.cc:1229
+#, c-format
+msgid "orphaned on the right"
+msgstr "övergiven på högersidan"
+
+#: src/cmd_conflicts.cc:142 src/merge_conflict.cc:1218
+#, c-format
+msgid "dropped on the left"
+msgstr "borttagen på vänstersidan"
+
+#: src/cmd_conflicts.cc:146 src/merge_conflict.cc:1220
+#, c-format
+msgid "dropped and recreated on the left"
+msgstr "borttagen och återskapad på vänstersidan"
+
+#: src/cmd_conflicts.cc:156 src/merge_conflict.cc:1234
+#, c-format
+msgid "dropped on the right"
+msgstr "borttagen på högersidan"
+
+#: src/cmd_conflicts.cc:159 src/merge_conflict.cc:1236
+#, c-format
+msgid "dropped and recreated on the right"
+msgstr "borttagen och återskapad på högersidan"
+
+#: src/cmd_conflicts.cc:174
+#, c-format
+msgid "resolve_first rename"
+msgstr "resolve_first rename"
+
+#: src/cmd_conflicts.cc:175
+#, c-format
+msgid "resolve_first user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first user_rename \"nytt_innehållsnamn\" \"nytt_filenamn\""
+
+#: src/cmd_conflicts.cc:179
+#, c-format
+msgid "resolve_first keep"
+msgstr "resolve_first keep"
+
+#: src/cmd_conflicts.cc:180
+#, c-format
+msgid "resolve_first user \"name\""
+msgstr "resolve_first user \"namn\""
+
+#: src/cmd_conflicts.cc:193 src/cmd_conflicts.cc:245
+#, c-format
 msgid "resolve_first_left drop"
 msgstr "resolve_first_left drop"
 
-#: src/cmd_conflicts.cc:108
+#: src/cmd_conflicts.cc:194
 #, c-format
-msgid "resolve_first_left keep"
-msgstr "resolve_first_left keep"
+msgid "resolve_first_left rename"
+msgstr "resolve_first_left rename"
 
-#: src/cmd_conflicts.cc:109
+#: src/cmd_conflicts.cc:195
 #, c-format
-msgid "resolve_first_left rename \"name\""
-msgstr "resolve_first_left rename \"namn\""
+msgid "resolve_first_left user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first_left user_rename \"nytt_innehållsnamn\" \"nytt_filenamn\""
 
-#: src/cmd_conflicts.cc:110
+#: src/cmd_conflicts.cc:201 src/cmd_conflicts.cc:246
 #, c-format
+msgid "resolve_first_left keep"
+msgstr "resolve_first_left keep"
+
+#: src/cmd_conflicts.cc:202 src/cmd_conflicts.cc:248
+#, c-format
 msgid "resolve_first_left user \"name\""
 msgstr "resolve_first_left user \"namn\""
 
-#: src/cmd_conflicts.cc:115
+#: src/cmd_conflicts.cc:209 src/cmd_conflicts.cc:253
 #, c-format
 msgid "resolve_first_right drop"
 msgstr "resolve_first_right drop"
 
-#: src/cmd_conflicts.cc:116
+#: src/cmd_conflicts.cc:210
 #, c-format
+msgid "resolve_first_right rename"
+msgstr "resolve_first_right rename"
+
+#: src/cmd_conflicts.cc:211
+#, c-format
+msgid "resolve_first_right user_rename \"new_content_name\" \"new_file_name\""
+msgstr "resolve_first_right user_rename \"nytt_innehållsnamn\" \"nytt_filenamn\""
+
+#: src/cmd_conflicts.cc:216 src/cmd_conflicts.cc:254
+#, c-format
 msgid "resolve_first_right keep"
 msgstr "resolve_first_right keep"
 
-#: src/cmd_conflicts.cc:117
+#: src/cmd_conflicts.cc:217 src/cmd_conflicts.cc:256
 #, c-format
-msgid "resolve_first_right rename \"name\""
-msgstr "resolve_first_right rename \"namn\""
+msgid "resolve_first_right user \"name\""
+msgstr "resolve_first_right user \"namn\""
 
-#: src/cmd_conflicts.cc:118
+#: src/cmd_conflicts.cc:236
 #, c-format
-msgid "resolve_first_right user \"name\""
-msgstr "resolve_first_right user \"namn\""
+msgid "duplicate_name %s"
+msgstr "duplicate_name %s"
 
-#: src/cmd_conflicts.cc:138
+#: src/cmd_conflicts.cc:247
 #, c-format
+msgid "resolve_first_left rename \"name\""
+msgstr "resolve_first_left rename \"namn\""
+
+#: src/cmd_conflicts.cc:255
+#, c-format
+msgid "resolve_first_right rename \"name\""
+msgstr "resolve_first_right rename \"namn\""
+
+#: src/cmd_conflicts.cc:276
+#, c-format
 msgid "content %s"
 msgstr "content %s"
 
-#: src/cmd_conflicts.cc:144
+#: src/cmd_conflicts.cc:282
 #, c-format
 msgid "resolve_first interactive \"file_name\""
 msgstr "resolve_first interactive \"filnamn\""
 
-#: src/cmd_conflicts.cc:145
+#: src/cmd_conflicts.cc:283
 #, c-format
 msgid "resolve_first user \"file_name\""
 msgstr "resolve_first user \"filnamn\""
 
-#: src/cmd_conflicts.cc:164
+#: src/cmd_conflicts.cc:302
 #, c-format
 msgid "all conflicts resolved"
 msgstr "alla konflikter lösta"
 
-#: src/cmd_conflicts.cc:200
+#: src/cmd_conflicts.cc:340
 #, c-format
 msgid "'%s' is not a supported conflict resolution for %s"
 msgstr "'%s' stöds inte som konfliktlösning för %s"
 
-#: src/cmd_conflicts.cc:250 src/cmd_conflicts.cc:255
+#: src/cmd_conflicts.cc:390 src/cmd_conflicts.cc:395
 #, c-format
 msgid "too many arguments"
 msgstr "för många givna argument"
 
-#: src/cmd_conflicts.cc:260 src/cmd_conflicts.cc:276
+#: src/cmd_conflicts.cc:401 src/cmd_conflicts.cc:419
 #, c-format
-msgid "other resolution must be 'drop' or 'rename'"
-msgstr "andra lösningen måste vara 'drop' eller 'rename'"
+msgid "other resolution is %s; specify 'drop', 'rename', or 'user_rename'"
+msgstr "andra lösningen är %s; ange 'drop', 'rename' eller 'user_rename'"
 
-#: src/cmd_conflicts.cc:265 src/cmd_conflicts.cc:271 src/cmd_conflicts.cc:338
-#: src/cmd_conflicts.cc:344 src/cmd_conflicts.cc:393 src/cmd_conflicts.cc:408
-#: src/cmd_conflicts.cc:457 src/cmd_conflicts.cc:470
+#: src/cmd_conflicts.cc:407 src/cmd_conflicts.cc:413 src/cmd_conflicts.cc:427
+#: src/cmd_conflicts.cc:446 src/cmd_conflicts.cc:534 src/cmd_conflicts.cc:540
+#: src/cmd_conflicts.cc:573 src/cmd_conflicts.cc:579 src/cmd_conflicts.cc:586
+#: src/cmd_conflicts.cc:594 src/cmd_conflicts.cc:601 src/cmd_conflicts.cc:625
+#: src/cmd_conflicts.cc:631 src/cmd_conflicts.cc:638 src/cmd_conflicts.cc:646
+#: src/cmd_conflicts.cc:653 src/cmd_conflicts.cc:705 src/cmd_conflicts.cc:720
+#: src/cmd_conflicts.cc:769 src/cmd_conflicts.cc:782
 #, c-format
 msgid "wrong number of arguments"
 msgstr "felaktigt antal givna argument"
 
-#: src/cmd_conflicts.cc:401
+#: src/cmd_conflicts.cc:464 src/cmd_conflicts.cc:477
 #, c-format
+msgid "must specify resolve_first (not _left or _right)"
+msgstr "måste ange resolve_first (inte _left eller _right)"
+
+#: src/cmd_conflicts.cc:467 src/cmd_conflicts.cc:480 src/cmd_conflicts.cc:580
+#: src/cmd_conflicts.cc:587 src/cmd_conflicts.cc:632 src/cmd_conflicts.cc:639
+#: src/merge_conflict.cc:2095 src/merge_conflict.cc:2102
+#, c-format
+msgid "orphaned files must be renamed"
+msgstr "föräldralös fil måste byta namn"
+
+#: src/cmd_conflicts.cc:566 src/cmd_conflicts.cc:618
+#, c-format
+msgid ""
+"must specify 'resolve_first_left' or 'resolve_first_right' (not just "
+"'resolve_first')"
+msgstr ""
+"måste ange 'resolve_first_left' eller 'resolve_first_right' (inte bara\n"
+"'resolve_first')"
+
+#: src/cmd_conflicts.cc:713
+#, c-format
 msgid "interactive merge result saved in '%s'"
 msgstr "den interaktiva ihopslagningens resultat sparades i '%s'"
 
-#: src/cmd_conflicts.cc:404
+#: src/cmd_conflicts.cc:716
 #, c-format
 msgid "interactive merge failed."
 msgstr "den interna ihopslagningsmekanismen misslyckades."
 
-#: src/cmd_conflicts.cc:428
+#: src/cmd_conflicts.cc:740
 #, c-format
 msgid "no resolvable yet unresolved left side conflicts"
 msgstr "inga lösningar på ännu olösta konflikter på vänstersidan"
 
-#: src/cmd_conflicts.cc:432
+#: src/cmd_conflicts.cc:744
 #, c-format
 msgid "no resolvable yet unresolved right side conflicts"
 msgstr "inga lösningar på ännu olösta konflikter på högersidan"
 
-#: src/cmd_conflicts.cc:436
+#: src/cmd_conflicts.cc:748
 #, c-format
 msgid "no resolvable yet unresolved single-file conflicts"
 msgstr "inga lösningar på ännu olösta enfilskonflikter"
 
-#: src/cmd_conflicts.cc:450
+#: src/cmd_conflicts.cc:762
 msgid ""
 "Show the first unresolved conflict in the conflicts file, and possible "
 "resolutions"
 msgstr ""
 "Visa den första olösta konflikten i konfliktfilen och möjliga lösningar"
 
-#: src/cmd_conflicts.cc:463
+#: src/cmd_conflicts.cc:775
 msgid "Show the remaining unresolved conflicts in the conflicts file"
 msgstr "Visa kvarvarande olösta konflikter i konfliktfilen"
 
-#: src/cmd_conflicts.cc:475 src/cmd_conflicts.cc:489 src/cmd_conflicts.cc:503
+#: src/cmd_conflicts.cc:787 src/cmd_conflicts.cc:801 src/cmd_conflicts.cc:815
 msgid "RESOLUTION"
 msgstr "LÖSNING"
 
-#: src/cmd_conflicts.cc:476
+#: src/cmd_conflicts.cc:788
 msgid "Set the resolution for the first unresolved single-file conflict."
 msgstr "Sätt lösningen till den första olösta enkelfilskonflikten."
 
-#: src/cmd_conflicts.cc:490
+#: src/cmd_conflicts.cc:802
 msgid "Set the left resolution for the first unresolved two-file conflict"
 msgstr "Sätt den vänstra lösningen på den första tvåfilskonflikten"
 
-#: src/cmd_conflicts.cc:504
+#: src/cmd_conflicts.cc:816
 msgid "Set the right resolution for the first unresolved two-file conflict"
 msgstr "Sätt den högra lösningen på den första tvåfilskonflikten"
 
-#: src/cmd_conflicts.cc:518
+#: src/cmd_conflicts.cc:830
 msgid "Delete any bookkeeping files related to conflict resolution"
 msgstr "Ta bort alla administrativa filer som hör ihop med konfliktlösning"
 
@@ -3636,7 +3785,7 @@ msgstr "rcfilen '%s' finns inte"
 msgid "rcfile '%s' does not exist"
 msgstr "rcfilen '%s' finns inte"
 
-#: src/transforms.cc:83
+#: src/transforms.cc:84
 #, c-format
 msgid ""
 "%s\n"
@@ -3741,7 +3890,7 @@ msgstr "'%s' är en okänd inställning 
 msgid "'%s' is not a recognized workspace option"
 msgstr "'%s' är en okänd inställning i arbetskopians metadata"
 
-#: src/work.cc:1091
+#: src/work.cc:1112
 #, c-format
 msgid ""
 "cannot add '%s', because '%s' is recorded as a file in the workspace manifest"
@@ -3749,111 +3898,102 @@ msgstr ""
 "kan inte lägga till '%s' eftersom '%s' redan är registrerad som en fil i "
 "arbetskopians manifest"
 
-#: src/work.cc:1097
+#: src/work.cc:1118
 #, c-format
 msgid "adding '%s' to workspace manifest"
 msgstr "lägger till '%s' i arbetskopians manifest"
 
-#: src/work.cc:1174
+#: src/work.cc:1158
 #, c-format
-msgid ""
-"non-recursive add: Files in the directory '%s' will not be added "
-"automatically."
-msgstr ""
-"icke-rekursiv addering: Filer i katalogen '%s' kommer inte att läggas till "
-"automatiskt"
-
-#: src/work.cc:1187
-#, c-format
 msgid "skipping ignorable file '%s'"
 msgstr "hoppar över ignorerbar fil '%s'"
 
-#: src/work.cc:1194
+#: src/work.cc:1165
 #, c-format
 msgid "skipping '%s', already accounted for in workspace"
 msgstr "hoppar över '%s', den finns redan noterad i arbetskopian"
 
-#: src/work.cc:1350 src/merge_conflict.cc:2340 src/merge_conflict.cc:2405
+#: src/work.cc:1321 src/merge_conflict.cc:2824 src/merge_conflict.cc:3200
 #, c-format
 msgid "dropping '%s'"
 msgstr "slänger '%s'"
 
-#: src/work.cc:1361 src/work.cc:1372
+#: src/work.cc:1332 src/work.cc:1343
 #, c-format
 msgid "path '%s' already exists"
 msgstr "sökvägen '%s' finns redan"
 
-#: src/work.cc:1390 src/merge_conflict.cc:2345 src/merge_conflict.cc:2426
+#: src/work.cc:1361 src/merge_conflict.cc:2829 src/merge_conflict.cc:3221
 #, c-format
 msgid "renaming '%s' to '%s'"
 msgstr "byter namn på '%s' till '%s'"
 
-#: src/work.cc:1394
+#: src/work.cc:1365
 #, c-format
 msgid "adding '%s'"
 msgstr "lägger till '%s'"
 
-#: src/work.cc:1426
+#: src/work.cc:1397
 #, c-format
 msgid "file '%s' is a directory"
 msgstr "filen '%s' är en katalog"
 
-#: src/work.cc:1430
+#: src/work.cc:1401
 #, c-format
 msgid "content of file '%s' has changed, not overwriting"
 msgstr "innehållet i filen '%s' har ändrats, skriver inte över"
 
-#: src/work.cc:1431
+#: src/work.cc:1402
 #, c-format
 msgid "updating '%s'"
 msgstr "uppdaterar '%s'"
 
-#: src/work.cc:1486
+#: src/work.cc:1457
 #, c-format
 msgid "cannot drop non-empty directory '%s'"
 msgstr "kan inte ta bort den icke-tomma katalogen '%s'"
 
-#: src/work.cc:1519
+#: src/work.cc:1490
 #, c-format
 msgid "attach node %d blocked by unversioned path '%s'"
 msgstr "bindning av nod %d blockerad av icke-noterad sökväg '%s'"
 
-#: src/work.cc:1538
+#: src/work.cc:1509
 #, c-format
 msgid "attach node %d blocked by blocked parent '%s'"
 msgstr "bindning av nod %d blockerad av icke-noterad sökväg '%s'"
 
-#: src/work.cc:1574
+#: src/work.cc:1545
 #, c-format
 msgid "%d workspace conflicts"
 msgstr "%d konflikter i arbetskopian"
 
-#: src/work.cc:1627
+#: src/work.cc:1598
 #, c-format
 msgid "moved conflicting path '%s' to '%s'"
 msgstr "flyttade vägen '%s' till '%s' på grund av konflikt"
 
-#: src/work.cc:1691
+#: src/work.cc:1662
 #, c-format
 msgid "missing directory '%s'"
 msgstr "saknar katalogen '%s'"
 
-#: src/work.cc:1696
+#: src/work.cc:1667
 #, c-format
 msgid "not a directory '%s'"
 msgstr "'%s' är inte en katalog"
 
-#: src/work.cc:1709
+#: src/work.cc:1680
 #, c-format
 msgid "missing file '%s'"
 msgstr "saknar filen '%s'"
 
-#: src/work.cc:1714
+#: src/work.cc:1685
 #, c-format
 msgid "not a file '%s'"
 msgstr "'%s' är inte en fil"
 
-#: src/work.cc:1731
+#: src/work.cc:1702
 #, c-format
 msgid ""
 "%d missing items; use '%s ls missing' to view.\n"
@@ -3873,86 +4013,86 @@ msgstr ""
 " '%s drop --missing' eller\n"
 " '%s revert --missing'"
 
-#: src/work.cc:1889
+#: src/work.cc:1861
 #, c-format
 msgid "unable to drop the root directory"
 msgstr "kan inte ta bort rotkatalogen"
 
-#: src/work.cc:1892
+#: src/work.cc:1864
 #, c-format
 msgid "skipping '%s', not currently tracked"
 msgstr "hoppar över '%s', ej noterad i arbetskopian för närvarande"
 
-#: src/work.cc:1902
+#: src/work.cc:1874
 #, c-format
 msgid "cannot remove '%s/', it is not empty"
 msgstr "kan inte ta bort '%s/', den är inte tom"
 
-#: src/work.cc:1917
+#: src/work.cc:1889
 #, c-format
 msgid "directory '%s' not empty - it will be dropped but not deleted"
 msgstr ""
 "katalogen '%s' är inte tom - den kommer att slängas administrativt men inte "
 "fysiskt"
 
-#: src/work.cc:1928
+#: src/work.cc:1900
 #, c-format
 msgid "file '%s' changed - it will be dropped but not deleted"
 msgstr ""
 "filen '%s' är ändrad - den kommer att slängas administrativt men inte fysiskt"
 
-#: src/work.cc:1932
+#: src/work.cc:1904
 #, c-format
 msgid "dropping '%s' from workspace manifest"
 msgstr "tar bort '%s' från arbetskopians manifest"
 
-#: src/work.cc:1973 src/work.cc:2022
+#: src/work.cc:1945 src/work.cc:1994
 #, c-format
 msgid "cannot rename the workspace root (try '%s pivot_root' instead)"
 msgstr ""
 "kan inte byta namn på arbetskopians rot (försök med '%s pivot_root' istället)"
 
-#: src/work.cc:1976 src/work.cc:2025
+#: src/work.cc:1948 src/work.cc:1997
 #, c-format
 msgid "source file '%s' is not versioned"
 msgstr "källfilen '%s' är inte versionshanterad"
 
-#: src/work.cc:1981 src/work.cc:2047
+#: src/work.cc:1953 src/work.cc:2019
 #, c-format
 msgid "cannot move '%s' to a subdirectory of itself, '%s/%s'"
 msgstr "kan inte flytta '%s' to en underkatalog av sig själv '%s/%s'"
 
-#: src/work.cc:1983
+#: src/work.cc:1955
 #, c-format
 msgid "'%s' and '%s' are the same file"
 msgstr "'%s' och '%s' är samma fil"
 
-#: src/work.cc:1999
+#: src/work.cc:1971
 #, c-format
 msgid "destination path's parent directory '%s/' doesn't exist"
 msgstr "målvägens föräldrakatalog '%s/' finns inte"
 
-#: src/work.cc:2016
+#: src/work.cc:1988
 #, c-format
 msgid "destination '%s/' is not a directory"
 msgstr "målet '%s/' är inte en katalog"
 
-#: src/work.cc:2042
+#: src/work.cc:2014
 #, c-format
 msgid "destination '%s' already exists in the workspace manifest"
 msgstr "målet '%s' finns redan i arbetskopians manifest"
 
-#: src/work.cc:2065
+#: src/work.cc:2037
 #, c-format
 msgid "renaming '%s' to '%s' in workspace manifest"
 msgstr "byter namn från '%s' till '%s' i arbetskopians manifest"
 
-#: src/work.cc:2090
+#: src/work.cc:2062
 #, c-format
 msgid "'%s' doesn't exist in workspace, skipping"
 msgstr "hoppar över '%s', den existerar inte i arbetskopian"
 
-#: src/work.cc:2094
+#: src/work.cc:2066
 #, c-format
 msgid ""
 "destination '%s' already exists in workspace, skipping filesystem rename"
@@ -3960,7 +4100,7 @@ msgstr ""
 "byter inte namn till '%s' i filsystemet, för den finns redan noterad i "
 "arbetskopian"
 
-#: src/work.cc:2099
+#: src/work.cc:2071
 #, c-format
 msgid ""
 "'%s' doesn't exist in workspace and '%s' does, skipping filesystem rename"
@@ -3968,35 +4108,35 @@ msgstr ""
 "'%s' finns inte i arbetskopian, men '%s' gör det, så namnbytet utförs inte i "
 "filsystemet"
 
-#: src/work.cc:2120
+#: src/work.cc:2092
 #, c-format
 msgid "proposed new root directory '%s' is not versioned or does not exist"
 msgstr ""
 "den föreslagna nya rotkatalogen '%s' är inte noterad i arbetskopian eller "
 "finns inte"
 
-#: src/work.cc:2123
+#: src/work.cc:2095
 #, c-format
 msgid "proposed new root directory '%s' is not a directory"
 msgstr "den föreslagna nya rotkatalogen '%s' är inte en katalog"
 
-#: src/work.cc:2126
+#: src/work.cc:2098
 #, c-format
 msgid "proposed new root directory '%s' contains illegal path '%s'"
 msgstr ""
 "den föreslagna nya rotkatalogen '%s' innehåller den otillåtna sökvägen '%s'"
 
-#: src/work.cc:2136
+#: src/work.cc:2108
 #, c-format
 msgid "directory '%s' is not versioned or does not exist"
 msgstr "katalogen '%s' är inte noterad i arbetskopian eller finns inte"
 
-#: src/work.cc:2144
+#: src/work.cc:2116
 #, c-format
 msgid "'%s' is in the way"
 msgstr "'%s' är i vägen"
 
-#: src/work.cc:2187
+#: src/work.cc:2159
 #, c-format
 msgid ""
 "workspace is locked\n"
@@ -4005,7 +4145,7 @@ msgstr ""
 "arbetskopian är låst\n"
 "du måste rensa och ta bort katalogen %s"
 
-#: src/work.cc:2206
+#: src/work.cc:2178
 #, c-format
 msgid ""
 "re-run this command with '--move-conflicting-paths' to move conflicting "
@@ -4014,7 +4154,7 @@ msgstr ""
 "gör om det här kommandot med '--move-conflicting-paths' för att flytta filer "
 "och kataloger som det blir konflikt med ur vägen"
 
-#: src/work.cc:2238
+#: src/work.cc:2210
 #, c-format
 msgid "moved some conflicting files into '%s'"
 msgstr "flyttade några filer i konflikt till '%s'"
@@ -4414,10 +4554,10 @@ msgid ""
 #: src/database.cc:2530
 #, c-format
 msgid ""
-"Unknown delta direction '%s'; assuming 'reverse'. Valid values are "
+"unknown delta direction '%s'; assuming 'reverse'. Valid values are "
 "'reverse', 'forward', 'both'."
 msgstr ""
-"Okänd riktning '%s' för deltan; 'reverse' antas. Giltiga värden är "
+"okänd riktning '%s' för deltan; 'reverse' antas. Giltiga värden är "
 "'reverse', 'forward', 'both'."
 
 #: src/database.cc:2863
@@ -4456,27 +4596,27 @@ msgstr "revisionen innehåller inkorrekt
 msgid "revision contains incorrect manifest_id"
 msgstr "revisionen innehåller inkorrekt manifest_id"
 
-#: src/database.cc:3489
+#: src/database.cc:3487
 #, c-format
-msgid "Failed to get RSA verifying key for %s"
-msgstr "Misslyckades med att finna signerande RSA-nyckel för %s"
+msgid "failed to get RSA verifying key for %s"
+msgstr "misslyckades med att finna signerande RSA-nyckel för %s"
 
-#: src/database.cc:3628
+#: src/database.cc:3626
 #, c-format
-msgid "Your database contains multiple keys named '%s'"
-msgstr "Din databas innehåller flera nycklar som heter '%s'"
+msgid "your database contains multiple keys named '%s'"
+msgstr "din databas innehåller flera nycklar som heter '%s'"
 
-#: src/database.cc:3789
+#: src/database.cc:3787
 #, c-format
 msgid "cert revision %s does not exist in db"
 msgstr "certrevision %s finns inte i databasen"
 
-#: src/database.cc:3791
+#: src/database.cc:3789
 #, c-format
 msgid "dropping cert"
 msgstr "slänger cert"
 
-#: src/database.cc:3801
+#: src/database.cc:3799
 #, c-format
 msgid ""
 "the branch name\n"
@@ -4499,32 +4639,32 @@ msgstr ""
 "kommandot '%s local kill_certs för att ta bort detta särskilda\n"
 "gren-certifikat och lägga till en giltig."
 
-#: src/database.cc:4118
+#: src/database.cc:4116
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'"
 msgstr "ignorerar felaktig signatur på '%2$s', av '%1$s'"
 
-#: src/database.cc:4123
+#: src/database.cc:4121
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'"
 msgstr "ignorerar okänd signatur på '%2$s', av '%1$s'"
 
-#: src/database.cc:4125
+#: src/database.cc:4123
 #, c-format
 msgid "trust function disliked %d signers of '%s' cert on revision %s"
 msgstr "tillitsfunktionen ogillar %d signerare av certet '%s' i revisionen %s"
 
-#: src/database.cc:4813 src/database.cc:4955
+#: src/database.cc:4811 src/database.cc:4953
 #, c-format
 msgid "no database specified"
 msgstr "ingen databas angiven"
 
-#: src/database.cc:4826
+#: src/database.cc:4824
 #, c-format
 msgid "database '%s' does not exist"
 msgstr "databasen '%s' finns inte"
 
-#: src/database.cc:4834
+#: src/database.cc:4832
 #, c-format
 msgid ""
 "'%s' is a workspace, not a database\n"
@@ -4533,17 +4673,17 @@ msgstr ""
 "'%s' är en katalog, inte en databas\n"
 "(menade du '%s'?)"
 
-#: src/database.cc:4838
+#: src/database.cc:4836
 #, c-format
 msgid "'%s' is a directory, not a database"
 msgstr "'%s' är en katalog, inte en databas"
 
-#: src/database.cc:4846
+#: src/database.cc:4844
 #, c-format
 msgid "database '%s' already exists"
 msgstr "databasen '%s' finns redan"
 
-#: src/database.cc:4851
+#: src/database.cc:4849
 #, c-format
 msgid ""
 "existing (possibly stale) journal file '%s' has same stem as new database "
@@ -4554,32 +4694,32 @@ msgstr ""
 "databasen '%s'.\n"
 "Avbryter skapandet av databasen"
 
-#: src/database.cc:5013
+#: src/database.cc:5011
 #, c-format
 msgid "the database alias '%s' has multiple ambiguous expansions:"
 msgstr "databasaliaset '%s' har flera motsägelsefulla uttydningar:"
 
-#: src/database.cc:5036
+#: src/database.cc:5034
 #, c-format
 msgid "could not query default database alias"
 msgstr "kunde inte fråga efter databasens standardalias"
 
-#: src/database.cc:5038
+#: src/database.cc:5036
 #, c-format
 msgid "using default database '%s'"
 msgstr "använder standarddatabasen '%s'"
 
-#: src/database.cc:5048
+#: src/database.cc:5046
 #, c-format
 msgid "invalid database alias '%s': does not start with a colon"
 msgstr "ogiltigt databasalias '%s': startar inte med ett kolon"
 
-#: src/database.cc:5052
+#: src/database.cc:5050
 #, c-format
 msgid "invalid database alias '%s': must not be empty"
 msgstr "ogiltigt databasalias '%s': får inte vara tomt"
 
-#: src/database.cc:5068
+#: src/database.cc:5066
 #, c-format
 msgid "invalid database alias '%s': does contain invalid characters"
 msgstr "ogiltigt databasalias '%s': innehåller ogiltiga tecken"
@@ -4653,7 +4793,7 @@ msgstr "nyckelparet %s finns inte i kata
 msgid "no key pair %s found in key store '%s'"
 msgstr "nyckelparet %s finns inte i katalogen '%s'"
 
-#: src/key_store.cc:620
+#: src/key_store.cc:633
 #, c-format
 msgid ""
 "failed to decrypt old private RSA key, probably incorrect passphrase or "
@@ -4662,49 +4802,49 @@ msgstr ""
 "misslyckades med att avkoda den gamla privata RSA-nyckeln, antagligen "
 "beroende på inkorrekt lösen eller på att lua-hooken 'get_passphrase' saknas"
 
-#: src/key_store.cc:633
+#: src/key_store.cc:646
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
 msgstr ""
 "misslyckades med att plocka ut den privata RSA-nyckeln från nyckelparet i "
 "PKCS#8-format"
 
-#: src/key_store.cc:673
+#: src/key_store.cc:686
 #, c-format
 msgid "key '%s' already exists"
 msgstr "nyckeln '%s' finns redan"
 
-#: src/key_store.cc:685
+#: src/key_store.cc:698
 #, c-format
 msgid "generating key-pair '%s'"
 msgstr "skapar nyckelparet '%s'"
 
-#: src/key_store.cc:733
+#: src/key_store.cc:746
 #, c-format
 msgid "storing key-pair %s in '%s/'"
 msgstr "lagrar nyckelparet %s i '%s/'"
 
-#: src/key_store.cc:746
+#: src/key_store.cc:759
 #, c-format
 msgid "storing public key %s in '%s'"
 msgstr "lagrar den publika nyckeln %s i '%s'"
 
-#: src/key_store.cc:762
+#: src/key_store.cc:775
 #, c-format
 msgid "key '%s' has hash '%s'"
 msgstr "nyckeln '%s' har kontrollsumman '%s'"
 
-#: src/key_store.cc:776
+#: src/key_store.cc:789
 #, c-format
 msgid "no key pair '%s' found in key store '%s'"
 msgstr "nyckelparet '%s' finns inte i katalogen '%s'"
 
-#: src/key_store.cc:828
+#: src/key_store.cc:845
 #, c-format
 msgid "Botan error decrypting data: '%s'"
 msgstr "Botan genererade ett fel när den avkodade data: '%s'"
 
-#: src/key_store.cc:851
+#: src/key_store.cc:868
 #, c-format
 msgid ""
 "you have chosen to sign only with ssh-agent but ssh-agent does not seem to "
@@ -4713,12 +4853,12 @@ msgstr ""
 "du har valt att enbart signera med hjälp av ssh-agent, men den tycks inte "
 "vara igång"
 
-#: src/key_store.cc:881
+#: src/key_store.cc:898
 #, c-format
 msgid "you don't seem to have your monotone key imported "
 msgstr "du verkar inte ha importerat din monotonenyckel "
 
-#: src/key_store.cc:935
+#: src/key_store.cc:952
 #, c-format
 msgid ""
 "make_signature: ssh signature (%i) != monotone signature (%i)\n"
@@ -4729,24 +4869,24 @@ msgstr ""
 "sshsignatur     : %s\n"
 "monotonesignatur: %s"
 
-#: src/key_store.cc:951
+#: src/key_store.cc:968
 #, c-format
 msgid "make_signature: signature is not valid"
 msgstr "make_signature: signaturen är ogiltig"
 
-#: src/key_store.cc:963
+#: src/key_store.cc:980
 #, c-format
 msgid "no ssh-agent is available, cannot add key %s"
 msgstr "ingen ssh-agent tillgänglig, kunde inte lägga till nyckeln %s"
 
-#: src/key_store.cc:1060
+#: src/key_store.cc:1087
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
 msgstr ""
 "misslyckades med att avkoda den gamla privata RSA-nyckeln, antagligen "
 "beroende på inkorrekt lösen"
 
-#: src/key_store.cc:1097
+#: src/key_store.cc:1124
 #, c-format
 msgid "public and private keys for %s do not match"
 msgstr "publik och privat nyckel för %s stämmer inte överens"
@@ -4887,22 +5027,22 @@ msgstr "otydbart paket: ogiltigt data i 
 msgid "malformed packet: invalid public key data for '%s': %s"
 msgstr "otydbart paket: ogiltigt data i publik nyckel för '%s': %s"
 
-#: src/packet.cc:187
+#: src/packet.cc:189
 #, c-format
 msgid "malformed packet: invalid private key data for '%s': %s"
 msgstr "otydbart paket: ogiltigt data i privat nyckel för '%s': %s"
 
-#: src/packet.cc:199
+#: src/packet.cc:205
 #, c-format
 msgid "malformed packet: invalid cert name"
 msgstr "otydbart paket: ogiltigt certnamn"
 
-#: src/packet.cc:206
+#: src/packet.cc:212
 #, c-format
 msgid "malformed packet: too many arguments in header"
 msgstr "otydbart paket: för många argument i headern"
 
-#: src/packet.cc:335
+#: src/packet.cc:341
 #, c-format
 msgid "unknown packet type '%s'"
 msgstr "okänd pakettyp '%s'"
@@ -5263,8 +5403,8 @@ msgstr "servern är för gammal för fjÃ
 
 #: src/network/automate_session.cc:130
 #, c-format
-msgid "Sorry, you aren't allowed to do that."
-msgstr "Ledsen, du får inte göra så."
+msgid "sorry, you aren't allowed to do that."
+msgstr "ledsen, du får inte göra så."
 
 #: src/network/automate_session.cc:219
 #, c-format
@@ -5440,7 +5580,9 @@ msgid "mismatched epoch on branch '%s'. 
 #: src/network/netsync_session.cc:978
 #, c-format
 msgid "mismatched epoch on branch '%s'. Server has %s, client has %s"
-msgstr "i grenen '%s' har servern epok %s medan klienten har %s; dessa stämmer inte överens"
+msgstr ""
+"i grenen '%s' har servern epok %s medan klienten har %s; dessa stämmer inte "
+"överens"
 
 #: src/network/netsync_session.cc:997
 #, c-format
@@ -5563,8 +5705,8 @@ msgstr "nycklar"
 
 #: src/network/netsync_session.cc:1467
 #, c-format
-msgid "Cannot find key '%s'"
-msgstr "Kan inte hitta nyckeln '%s'"
+msgid "cannot find key '%s'"
+msgstr "kan inte hitta nyckeln '%s'"
 
 #: src/network/reactor.cc:182
 #, c-format
@@ -5694,8 +5836,8 @@ msgstr ""
 
 #: src/network/session_base.cc:256
 #, c-format
-msgid "Network error on peer %s, disconnecting"
-msgstr "Nätverksfel för %s, kopplar ifrån"
+msgid "network error on peer %s, disconnecting"
+msgstr "nätverksfel för %s, kopplar ifrån"
 
 #: src/netxx_pipe.cc:50 src/netxx_pipe.cc:189
 #, c-format
@@ -5710,22 +5852,22 @@ msgid "CreateNamedPipe(%s,...) call fail
 #: src/netxx_pipe.cc:213
 #, c-format
 msgid "CreateNamedPipe(%s,...) call failed: %s"
-msgstr "Anrop till CreateNamedPipe(%s,...) misslyckades: %s"
+msgstr "anrop till CreateNamedPipe(%s,...) misslyckades: %s"
 
 #: src/netxx_pipe.cc:230
 #, c-format
 msgid "CreateFile(%s,...) call failed: %s"
-msgstr "Anrop till CreateFile(%s,...) misslyckades: %s"
+msgstr "anrop till CreateFile(%s,...) misslyckades: %s"
 
 #: src/netxx_pipe.cc:261
 #, c-format
 msgid "CreateProcess(%s,...) call failed: %s"
-msgstr "Anrop till CreateProcess(%s,...) misslyckades: %s"
+msgstr "anrop till CreateProcess(%s,...) misslyckades: %s"
 
 #: src/netxx_pipe.cc:277
 #, c-format
 msgid "pipe/fork failed: %s"
-msgstr "Programkopplingen misslyckades: %s"
+msgstr "programkopplingen misslyckades: %s"
 
 #: src/netxx_pipe.cc:323
 #, c-format
@@ -5740,17 +5882,17 @@ msgid "WaitForMultipleObjects call faile
 #: src/netxx_pipe.cc:450
 #, c-format
 msgid "WaitForMultipleObjects call failed: %s"
-msgstr "Anrop till WaitForMultipleObjects misslyckades: %s"
+msgstr "anrop till WaitForMultipleObjects misslyckades: %s"
 
 #: src/netxx_pipe.cc:460
 #, c-format
 msgid "WaitForSingleObject call failed: %s"
-msgstr "Anrop till WaitForSingleObject misslyckades: %s"
+msgstr "anrop till WaitForSingleObject misslyckades: %s"
 
 #: src/netxx_pipe.cc:480
 #, c-format
 msgid "GetOverlappedResult call failed: %s"
-msgstr "Anrop till GetOverlappedResult misslyckades: %s"
+msgstr "anrop till GetOverlappedResult misslyckades: %s"
 
 #: src/netcmd.cc:46
 #, c-format
@@ -5926,25 +6068,25 @@ msgstr "misslyckades med att tolka revis
 msgid "failed to parse revision"
 msgstr "misslyckades med att tolka revisionen"
 
-#: src/roster.cc:2477
+#: src/roster.cc:2495
 #, c-format
 msgid "restriction includes deletion of '%s' but excludes deletion of '%s'"
 msgstr ""
 "restriktionen inbegriper borttagning av '%s' men utesluter borttagning av "
 "'%s'"
 
-#: src/roster.cc:2488
+#: src/roster.cc:2506
 #, c-format
 msgid "restriction excludes addition of '%s' but includes addition of '%s'"
 msgstr ""
 "restriktionen utesluter tillägget av '%s' men inbegriper tillägget av '%s'"
 
-#: src/roster.cc:2514
+#: src/roster.cc:2532
 #, c-format
 msgid "restriction excludes addition of root directory"
 msgstr "restriktionen utesluter tillägget av rotkatalogen"
 
-#: src/roster.cc:2518
+#: src/roster.cc:2536
 #, c-format
 msgid "invalid restriction"
 msgstr "ogiltig restriktion"
@@ -5996,7 +6138,7 @@ msgstr ""
 msgstr ""
 "om inga argument ges visar det här kommandot löven till arbetskopians gren"
 
-#: src/automate.cc:116 src/automate.cc:169 src/automate.cc:1723
+#: src/automate.cc:116 src/automate.cc:169 src/automate.cc:1756
 msgid "REV1 [REV2 [REV3 [...]]]"
 msgstr "REV1 [REV2 [REV3 [...]]]"
 
@@ -6008,7 +6150,7 @@ msgstr "Skriver ut den givna revisionens
 msgid "Prints the descendents of the given revisions"
 msgstr "Skriver ut den givna revisionens anfäder"
 
-#: src/automate.cc:223 src/automate.cc:253
+#: src/automate.cc:223 src/automate.cc:256 src/automate.cc:286
 msgid "[REV1 [REV2 [REV3 [...]]]]"
 msgstr "[REV1 [REV2 [REV3 [...]]]]"
 
@@ -6016,49 +6158,53 @@ msgstr "Tar bort förfäderna i en given
 msgid "Erases the ancestors in a list of revisions"
 msgstr "Tar bort förfäderna i en given lista av revisioner"
 
-#: src/automate.cc:254
+#: src/automate.cc:257
+msgid "Erases the descendants in a list of revisions"
+msgstr "Tar bort ättlingarna i en given lista av revisioner"
+
+#: src/automate.cc:287
 msgid "Topologically sorts a list of revisions"
 msgstr "Sorterar listan med revisioner topologiskt"
 
-#: src/automate.cc:291
+#: src/automate.cc:324
 msgid "NEW_REV [OLD_REV1 [OLD_REV2 [...]]]"
 msgstr "NY_REV [GAMMAL_REV1 [GAMMAL_REV2 [...]]]"
 
-#: src/automate.cc:292
+#: src/automate.cc:325
 msgid "Lists the ancestors of the first revision given, not in the others"
 msgstr ""
 "Visar föräldrarna till den första givna revisionen som inte är föräldrar "
 "till de övriga"
 
-#: src/automate.cc:339
+#: src/automate.cc:372
 msgid "Lists the leaves of the revision graph"
 msgstr "Visar revisionsgrafens löv"
 
-#: src/automate.cc:365
+#: src/automate.cc:398
 msgid "Lists the roots of the revision graph"
 msgstr "Visar revisionsgrafens rötter"
 
-#: src/automate.cc:395
+#: src/automate.cc:428
 msgid "Prints the parents of a revision"
 msgstr "Skriver ut identiteten på en revisions föräldrar"
 
-#: src/automate.cc:426
+#: src/automate.cc:459
 msgid "Prints the children of a revision"
 msgstr "Skriver ut identiteten på en revisions barn"
 
-#: src/automate.cc:467
+#: src/automate.cc:500
 msgid "Prints the complete ancestry graph"
 msgstr "Skriver ut den fullständiga föräldragrafen"
 
-#: src/automate.cc:514 src/asciik.cc:373
+#: src/automate.cc:547 src/asciik.cc:373
 msgid "SELECTOR"
 msgstr "VÄLJARE"
 
-#: src/automate.cc:515
+#: src/automate.cc:548
 msgid "Lists the revisions that match a selector"
 msgstr "Visar revisionerna som matchar en väljare"
 
-#: src/automate.cc:907
+#: src/automate.cc:940
 #, c-format
 msgid ""
 "'%s' is both known and ignored; it will be shown as 'missing'. Check '.mtn-"
@@ -6067,202 +6213,202 @@ msgstr ""
 "'%s' är samtidigt känd och ignorerad; den kommer att visas som 'missing'.  "
 "Kontrollera '.mtn-ignore'"
 
-#: src/automate.cc:1020
+#: src/automate.cc:1053
 msgid "Prints a summary of files found in the workspace"
 msgstr "Skriver ut en sammanfattning om filerna funna i en arbetskopia"
 
-#: src/automate.cc:1240 src/automate.cc:1586 src/automate.cc:1617
+#: src/automate.cc:1273 src/automate.cc:1619 src/automate.cc:1650
 msgid "REVID"
 msgstr "REVID"
 
-#: src/automate.cc:1241
+#: src/automate.cc:1274
 msgid "Shows change information for a revision"
 msgstr "Visar information om ändringen i en revision"
 
-#: src/automate.cc:1268
+#: src/automate.cc:1301
 msgid "[PATHS ...]"
 msgstr "[SÖKVÄG ...]"
 
-#: src/automate.cc:1269
+#: src/automate.cc:1302
 msgid "Shows change information for a workspace"
 msgstr "Visar information om ändringen i en arbetskopia"
 
-#: src/automate.cc:1315
+#: src/automate.cc:1348
 msgid "Shows the revision on which the workspace is based"
 msgstr "Visar revisionen denna arbetskopia grundar sig på"
 
-#: src/automate.cc:1343
+#: src/automate.cc:1376
 msgid "Shows the revision of the current workspace"
 msgstr "Visar nuvarande arbetskopias revision"
 
-#: src/automate.cc:1412
+#: src/automate.cc:1445
 msgid "Shows the manifest associated with a revision"
 msgstr "Visar manifestet kopplad till en revision"
 
-#: src/automate.cc:1551
+#: src/automate.cc:1584
 msgid "Prints the extended manifest for the given identifier"
 msgstr "Skriver ut den utökade manifestet för given identitet"
 
-#: src/automate.cc:1587
+#: src/automate.cc:1620
 msgid "Prints the revision data in packet format"
 msgstr "Skriv ut datapaket för revision till stdout"
 
-#: src/automate.cc:1618
+#: src/automate.cc:1651
 msgid "Prints the certs associated with a revision in packet format"
 msgstr "Skriver ut certificate tillhörande en revision i paketformat"
 
-#: src/automate.cc:1653
+#: src/automate.cc:1686
 msgid "Prints the file data in packet format"
 msgstr "Skriv ut datapaket för fil till stdout"
 
-#: src/automate.cc:1668
+#: src/automate.cc:1701
 #, c-format
 msgid "no such file '%s'"
 msgstr "filen '%s' finns inte"
 
-#: src/automate.cc:1684
+#: src/automate.cc:1717
 msgid "OLD_FILE NEW_FILE"
 msgstr "GAMMAL_FIL NY_FIL"
 
-#: src/automate.cc:1685
+#: src/automate.cc:1718
 msgid "Prints the file delta in packet format"
 msgstr "Skriv ut datapaket för fildelta till stdout"
 
-#: src/automate.cc:1724
+#: src/automate.cc:1757
 msgid "Prints revisions that are common ancestors of a list of revisions"
 msgstr "Skriver ut revisionernas gemensamma föräldrar"
 
-#: src/automate.cc:1763
+#: src/automate.cc:1796
 msgid "Prints all branch certs in the revision graph"
 msgstr "Skriver ut revisionsgrafens samtliga grencertifikat"
 
-#: src/automate.cc:1814
+#: src/automate.cc:1847
 msgid "[BRANCH_PATTERN]"
 msgstr "[GRENMÖNSTER]"
 
-#: src/automate.cc:1815
+#: src/automate.cc:1848
 msgid "Prints all tags attached to a set of branches"
 msgstr "Skriva ut de givna grenarnas samtliga taggar"
 
-#: src/automate.cc:1897
+#: src/automate.cc:1930
 msgid "OPTION"
 msgstr "FLAGGA"
 
-#: src/automate.cc:1898
+#: src/automate.cc:1931
 msgid "Shows the value of an option"
 msgstr "Visar en inställnings värde"
 
-#: src/automate.cc:1929
+#: src/automate.cc:1962
 msgid "REV FILE"
 msgstr "REV FIL"
 
-#: src/automate.cc:1930
+#: src/automate.cc:1963
 msgid ""
 "Lists the revisions that changed the content relative to another revision"
 msgstr ""
 "Visar revisionerna som ändrade innehållet i förhållande till en annan "
 "revision"
 
-#: src/automate.cc:1951 src/automate.cc:2018
+#: src/automate.cc:1984 src/automate.cc:2051
 #, c-format
 msgid "file '%s' is unknown for revision %s"
 msgstr "filen '%s' är okänd i revision %s"
 
-#: src/automate.cc:1992
+#: src/automate.cc:2025
 msgid "REV1 FILE REV2"
 msgstr "REV1 FIL REV2"
 
-#: src/automate.cc:1993
+#: src/automate.cc:2026
 msgid ""
 "Prints the name of a file in a target revision relative to a given revision"
 msgstr ""
 "Skriver ut namnet på en fil i målrevisionen i förhållande till en given "
 "revision"
 
-#: src/automate.cc:2045
+#: src/automate.cc:2078
 msgid "[FILEID] CONTENTS"
 msgstr "[FILID] INNEHÅLL"
 
-#: src/automate.cc:2046
+#: src/automate.cc:2079
 msgid "Stores a file in the database"
 msgstr "Lagra en fil i databasen"
 
-#: src/automate.cc:2100
+#: src/automate.cc:2133
 msgid "REVISION-DATA"
 msgstr "REVISIONS-DATA"
 
-#: src/automate.cc:2101
+#: src/automate.cc:2134
 msgid "Stores a revision into the database"
 msgstr "Lagra en revision i databasen"
 
-#: src/automate.cc:2143
+#: src/automate.cc:2176
 #, c-format
 msgid "missing prerequisite for revision %s"
 msgstr "saknar nödvändiga förutsättningar för att stoppa in revision %s"
 
-#: src/automate.cc:2160
+#: src/automate.cc:2193
 msgid "REVISION-ID NAME VALUE"
 msgstr "REVISION CERTNAMN CERTVÄRDE"
 
-#: src/automate.cc:2161
+#: src/automate.cc:2194
 msgid "Adds a revision certificate"
 msgstr "Lägger till ett certifikat till revision"
 
-#: src/automate.cc:2196
+#: src/automate.cc:2229
 msgid "[DOMAIN]"
 msgstr "[DOMÄN]"
 
-#: src/automate.cc:2197
+#: src/automate.cc:2230
 msgid "Retrieve database variables"
 msgstr "Hämta databasvariabler"
 
-#: src/automate.cc:2245
+#: src/automate.cc:2278
 #, c-format
 msgid "no variables found or invalid domain specified"
 msgstr "inga variabler fanns eller ogiltig domän"
 
-#: src/automate.cc:2296
+#: src/automate.cc:2329
 msgid "DOMAIN [NAME]"
 msgstr "DOMÄN [NAMN]"
 
-#: src/automate.cc:2297
+#: src/automate.cc:2330
 msgid "Drops a database variable"
 msgstr "Tar bort en databasvariabel"
 
-#: src/automate.cc:2333
+#: src/automate.cc:2366
 #, c-format
 msgid "no variables found in domain '%s'"
 msgstr "det finns inga variabler i domänen '%s'"
 
-#: src/automate.cc:2350
+#: src/automate.cc:2383
 msgid "Prints the workspace root for the current directory"
 msgstr "Visar arbetskopians rot gentemot nuvarande katalog"
 
-#: src/automate.cc:2373
+#: src/automate.cc:2406
 msgid "Executes the given lua function and returns the result"
 msgstr "Genomför den givna lua-funktionen och ger tillbaka resultatet"
 
-#: src/automate.cc:2383
+#: src/automate.cc:2416
 #, c-format
 msgid "lua function '%s' does not exist"
 msgstr "lua-funktionen '%s' finns inte"
 
-#: src/automate.cc:2396
+#: src/automate.cc:2429
 #, c-format
 msgid "lua call '%s' failed"
 msgstr "lua-anropet av '%s' misslyckades"
 
-#: src/automate.cc:2431
+#: src/automate.cc:2464
 #, c-format
 msgid "no completions for this command"
 msgstr "detta kommando gick inte att förstå"
 
-#: src/automate.cc:2436
+#: src/automate.cc:2469
 #, c-format
 msgid "multiple completions possible for this command"
 msgstr "detta kommando har flera möjliga tolkningar"
 
-#: src/automate.cc:2448
+#: src/automate.cc:2481
 #, c-format
 msgid "sorry, that can't be run remotely or over stdio"
 msgstr "ledsen, detta kan inte köras som fjärrkommando eller via stdio"
@@ -6677,37 +6823,37 @@ msgstr[1] "funktionen '%s' tar %d argume
 msgstr[0] "funktionen '%s' tar %d argument, inte %d"
 msgstr[1] "funktionen '%s' tar %d argument, inte %d"
 
-#: src/selectors.cc:619
+#: src/selectors.cc:639
 #, c-format
 msgid "unknown selection function '%s'"
 msgstr "okänd väljarfunktion '%s'"
 
-#: src/selectors.cc:652
+#: src/selectors.cc:672
 #, c-format
 msgid "expanded selector '%s' -> '%s'"
 msgstr "expanderar valet '%s' -> '%s'"
 
-#: src/selectors.cc:691
+#: src/selectors.cc:711
 #, c-format
 msgid "unknown selector type: %c"
 msgstr "okänd väljartyp: %c"
 
-#: src/selectors.cc:726
+#: src/selectors.cc:746
 #, c-format
 msgid "selector '%s' is invalid, it ends with the escape character '\\'"
 msgstr "väljaren '%s' är ogiltig, den slutar med '\\'"
 
-#: src/selectors.cc:731
+#: src/selectors.cc:751
 #, c-format
 msgid "selector '%s' is invalid, it contains an unknown escape sequence '%s%s'"
 msgstr "väljaren '%s' är ogiltig, den innehåller en okänd escapesekvens '%s%s'"
 
-#: src/selectors.cc:770
+#: src/selectors.cc:790
 #, c-format
 msgid "selector '%s' is invalid, unmatched ')'"
 msgstr "väljaren '%s' är ogiltig, ')' utan tillhörande '('"
 
-#: src/selectors.cc:787
+#: src/selectors.cc:807
 #, c-format
 msgid ""
 "selector '%s' is invalid, function argument doesn't look like an arg-list"
@@ -6715,7 +6861,7 @@ msgstr ""
 "väljaren '%s' är ogiltig, funktionsargumentet ser inte ut som en "
 "argumentlista"
 
-#: src/selectors.cc:798
+#: src/selectors.cc:818
 #, c-format
 msgid ""
 "selector '%s' is invalid, grouping parentheses contain something that "
@@ -6724,17 +6870,17 @@ msgstr ""
 "väljaren '%s' är ogiltig, parentesen innehåller något som inte liknar ett "
 "giltigt uttryck"
 
-#: src/selectors.cc:809
+#: src/selectors.cc:829
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '/'"
 msgstr "väljaren '%s' är ogiltig då den börjar med '/'"
 
-#: src/selectors.cc:813
+#: src/selectors.cc:833
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '|'"
 msgstr "väljaren '%s' är ogiltig då den börjar med '|'"
 
-#: src/selectors.cc:838
+#: src/selectors.cc:858
 #, c-format
 msgid ""
 "selector '%s' is invalid, because there is a '%s' someplace it shouldn't be"
@@ -6742,29 +6888,29 @@ msgstr ""
 "väljaren '%s' är ogiltig för det finns en '%s' någonstans där den inte borde "
 "vara"
 
-#: src/selectors.cc:843 src/selectors.cc:846
+#: src/selectors.cc:863 src/selectors.cc:866
 #, c-format
 msgid ""
 "selector '%s' is invalid, don't mix '/' and '|' operators without parentheses"
 msgstr ""
 "väljaren '%s' är ogiltig, blanda in operatorerna '/' och '|' utan parenteser"
 
-#: src/selectors.cc:885
+#: src/selectors.cc:905
 #, c-format
 msgid "selector '%s' is invalid, it doesn't look like an expr"
 msgstr "väljaren '%s' är ogiltig då den inte ser ut som ett uttryck"
 
-#: src/selectors.cc:908
+#: src/selectors.cc:928
 #, c-format
 msgid "expanding selection '%s'"
 msgstr "expanderar valet '%s'"
 
-#: src/selectors.cc:912
+#: src/selectors.cc:932
 #, c-format
 msgid "no match for selection '%s'"
 msgstr "det finns inget som matchar '%s'"
 
-#: src/selectors.cc:917
+#: src/selectors.cc:937
 #, c-format
 msgid "expanded to '%s'"
 msgstr "expanderar till '%s'"
@@ -6821,175 +6967,184 @@ msgstr "obs: din arbetskopia har inte up
 msgid "note: your workspace has not been updated"
 msgstr "obs: din arbetskopia har inte uppdaterats"
 
-#: src/merge_roster.cc:341
+#: src/merge_roster.cc:420
 #, c-format
-msgid ""
-"content changes to the file '%s'\n"
-"will be ignored during this merge as the file has been\n"
-"removed on one side of the merge.  Affected revisions include:"
-msgstr ""
-"innehållsändringar i filen '%s'\n"
-"kommer att ignoreras i den här ihopslagningen eftersom filen har tagits\n"
-"bort på ena sidan av ihopslagningen.  Följande revisioner är påverkade:"
+msgid "unsupported '%s' conflict resolution in mtn:resolve_conflict attribute"
+msgstr "'%s' i attributet mtn:resolve_conflict stöds inte som konfliktlösning"
 
-#: src/merge_roster.cc:346
+#: src/merge_conflict.cc:590
 #, c-format
-msgid "Revision: %s"
-msgstr "Revision: %s"
-
-#: src/merge_conflict.cc:576
-#, c-format
 msgid "conflict: missing root directory"
 msgstr "konflikt: saknar rotkatalogen"
 
-#: src/merge_conflict.cc:586 src/merge_conflict.cc:628
+#: src/merge_conflict.cc:600 src/merge_conflict.cc:642
 #, c-format
 msgid "directory '%s' pivoted to root on the left"
 msgstr "katalogen '%s' svängdes till roten på vänstersidan"
 
-#: src/merge_conflict.cc:596 src/merge_conflict.cc:638
+#: src/merge_conflict.cc:610 src/merge_conflict.cc:652
 #, c-format
 msgid "directory '%s' deleted on the right"
 msgstr "katalogen '%s' togs bort på högersidan"
 
-#: src/merge_conflict.cc:609 src/merge_conflict.cc:649
+#: src/merge_conflict.cc:623 src/merge_conflict.cc:663
 #, c-format
 msgid "directory '%s' deleted on the left"
 msgstr "katalogen '%s' togs bort på vänstersidan"
 
-#: src/merge_conflict.cc:618 src/merge_conflict.cc:658
+#: src/merge_conflict.cc:632 src/merge_conflict.cc:672
 #, c-format
 msgid "directory '%s' pivoted to root on the right"
 msgstr "katalogen '%s' svängdes till roten på högersidan"
 
-#: src/merge_conflict.cc:702
+#: src/merge_conflict.cc:716
 #, c-format
 msgid "conflict: invalid name '_MTN' in root directory"
 msgstr "konflikt: ogiltigt namn '_MTN' i arbetskopians rot"
 
-#: src/merge_conflict.cc:712
+#: src/merge_conflict.cc:726
 #, c-format
 msgid "'%s' pivoted to root on the left"
 msgstr "'%s' svängdes till arbetskopians rot på vänstersidan"
 
-#: src/merge_conflict.cc:722 src/merge_conflict.cc:825
-#: src/merge_conflict.cc:843
+#: src/merge_conflict.cc:736 src/merge_conflict.cc:839
+#: src/merge_conflict.cc:857
 #, c-format
 msgid "'%s' renamed to '%s' on the right"
 msgstr "'%s' bytte namn till '%s' på högersidan"
 
-#: src/merge_conflict.cc:730
+#: src/merge_conflict.cc:744
 #, c-format
 msgid "'%s' added in revision %s on the right"
 msgstr "'%s' las till i revisionen %s på högersidan"
 
-#: src/merge_conflict.cc:742
+#: src/merge_conflict.cc:756
 #, c-format
 msgid "'%s' pivoted to root on the right"
 msgstr "'%s' svängdes till arbetskopians rot på högersidan"
 
-#: src/merge_conflict.cc:752 src/merge_conflict.cc:816
-#: src/merge_conflict.cc:834
+#: src/merge_conflict.cc:766 src/merge_conflict.cc:830
+#: src/merge_conflict.cc:848
 #, c-format
 msgid "'%s' renamed to '%s' on the left"
 msgstr "'%s' bytte namn till '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:760
+#: src/merge_conflict.cc:774
 #, c-format
 msgid "'%s' added in revision %s on the left"
 msgstr "'%s' las till i revisionen %s på vänstersidan"
 
-#: src/merge_conflict.cc:809
+#: src/merge_conflict.cc:823
 #, c-format
 msgid "conflict: directory loop created"
 msgstr "konflikt: katalogloop skapad"
 
-#: src/merge_conflict.cc:887
+#: src/merge_conflict.cc:901
 #, c-format
 msgid "conflict: orphaned file '%s' from revision %s"
 msgstr "konflikt: föräldralös fil '%s' i revision %s"
 
-#: src/merge_conflict.cc:894
+#: src/merge_conflict.cc:908
 #, c-format
 msgid "conflict: orphaned directory '%s' from revision %s"
 msgstr "konflikt: föräldralös katalog '%s' i revision %s"
 
-#: src/merge_conflict.cc:911
+#: src/merge_conflict.cc:925
 #, c-format
 msgid "parent directory '%s' was deleted on the right"
 msgstr "föräldrakatalogen '%s' togs bort på högersidan"
 
-#: src/merge_conflict.cc:920
+#: src/merge_conflict.cc:934
 #, c-format
 msgid "file '%s' was renamed from '%s' on the left"
 msgstr "filen '%s' bytte namn från '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:923
+#: src/merge_conflict.cc:937
 #, c-format
 msgid "directory '%s' was renamed from '%s' on the left"
 msgstr "katalogen '%s' bytte namn från '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:933
+#: src/merge_conflict.cc:947
 #, c-format
 msgid "file '%s' was added on the left"
 msgstr "filen '%s' las till på vänstersidan"
 
-#: src/merge_conflict.cc:936
+#: src/merge_conflict.cc:950
 #, c-format
 msgid "directory '%s' was added on the left"
 msgstr "katalogen '%s' las till på vänstersidan"
 
-#: src/merge_conflict.cc:954
+#: src/merge_conflict.cc:968
 #, c-format
 msgid "parent directory '%s' was deleted on the left"
 msgstr "föräldrakatalogen '%s' togs bort på vänstersidan"
 
-#: src/merge_conflict.cc:963
+#: src/merge_conflict.cc:977
 #, c-format
 msgid "file '%s' was renamed from '%s' on the right"
 msgstr "filen '%s' bytte namn från '%s' på högersidan"
 
-#: src/merge_conflict.cc:966
+#: src/merge_conflict.cc:980
 #, c-format
 msgid "directory '%s' was renamed from '%s' on the right"
 msgstr "katalogen '%s' bytte namn från '%s' på högersidan"
 
-#: src/merge_conflict.cc:975
+#: src/merge_conflict.cc:989
 #, c-format
 msgid "file '%s' was added on the right"
 msgstr "filen '%s' las till på högersidan"
 
-#: src/merge_conflict.cc:978
+#: src/merge_conflict.cc:992
 #, c-format
 msgid "directory '%s' was added on the right"
 msgstr "katalogen '%s' las till på högersidan"
 
-#: src/merge_conflict.cc:1035
+#: src/merge_conflict.cc:1049
 #, c-format
 msgid "conflict: multiple names for file '%s' from revision %s"
 msgstr "konflikt: flera namn för filen '%s' från revision %s"
 
-#: src/merge_conflict.cc:1038
+#: src/merge_conflict.cc:1052
 #, c-format
 msgid "conflict: multiple names for directory '%s' from revision %s"
 msgstr "konflikt: flera namn för katalogen '%s' från revision %s"
 
-#: src/merge_conflict.cc:1041
+#: src/merge_conflict.cc:1055
 #, c-format
 msgid "renamed to '%s' on the left"
 msgstr "bytte namn till '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:1042
+#: src/merge_conflict.cc:1056
 #, c-format
 msgid "renamed to '%s' on the right"
 msgstr "bytte namn till '%s' på högersidan"
 
-#: src/merge_conflict.cc:1100
+#: src/merge_conflict.cc:1222
 #, c-format
+msgid "modified on the right, named %s"
+msgstr "förändrad på högersidan, kallad %s"
+
+#: src/merge_conflict.cc:1226
+#, c-format
+msgid "modified on the left, named %s"
+msgstr "förändrad på vänstersidan, kallad %s"
+
+#: src/merge_conflict.cc:1257
+#, c-format
+msgid "left_resolution: drop"
+msgstr "left_resolution: drop"
+
+#: src/merge_conflict.cc:1274
+#, c-format
+msgid "right_resolution: drop"
+msgstr "right_resolution: drop"
+
+#: src/merge_conflict.cc:1331
+#, c-format
 msgid "conflict: duplicate name '%s' for the directory '%s'"
 msgstr "konflikt: dubbelt namn '%s' för katalogen '%s'"
 
-#: src/merge_conflict.cc:1109
+#: src/merge_conflict.cc:1340
 #, c-format
 msgid ""
 "conflict: duplicate name '%s' for the directory\n"
@@ -7000,84 +7155,84 @@ msgstr ""
 "          heter '%s' i vänster och\n"
 "          heter '%s' i höger förälder."
 
-#: src/merge_conflict.cc:1127 src/merge_conflict.cc:1177
+#: src/merge_conflict.cc:1358 src/merge_conflict.cc:1408
 #, c-format
 msgid "added as a new file on the left"
 msgstr "la till en ny fil på vänstersidan"
 
-#: src/merge_conflict.cc:1129 src/merge_conflict.cc:1179
+#: src/merge_conflict.cc:1360 src/merge_conflict.cc:1410
 #, c-format
 msgid "added as a new directory on the left"
 msgstr "la till en ny katalog på vänstersidan"
 
-#: src/merge_conflict.cc:1137 src/merge_conflict.cc:1161
+#: src/merge_conflict.cc:1368 src/merge_conflict.cc:1392
 #, c-format
 msgid "added as a new file on the right"
 msgstr "la till en ny fil på högersidan"
 
-#: src/merge_conflict.cc:1139 src/merge_conflict.cc:1163
+#: src/merge_conflict.cc:1370 src/merge_conflict.cc:1394
 #, c-format
 msgid "added as a new directory on the right"
 msgstr "la till en ny katalog på högersidan"
 
-#: src/merge_conflict.cc:1152 src/merge_conflict.cc:1204
+#: src/merge_conflict.cc:1383 src/merge_conflict.cc:1435
 #, c-format
 msgid "renamed from file '%s' on the left"
 msgstr "bytte filens namn från '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:1154 src/merge_conflict.cc:1206
+#: src/merge_conflict.cc:1385 src/merge_conflict.cc:1437
 #, c-format
 msgid "renamed from directory '%s' on the left"
 msgstr "bytte katalogens namn från '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:1187 src/merge_conflict.cc:1214
+#: src/merge_conflict.cc:1418 src/merge_conflict.cc:1445
 #, c-format
 msgid "renamed from file '%s' on the right"
 msgstr "bytte filens namn från '%s' på högsidan"
 
-#: src/merge_conflict.cc:1189 src/merge_conflict.cc:1216
+#: src/merge_conflict.cc:1420 src/merge_conflict.cc:1447
 #, c-format
 msgid "renamed from directory '%s' on the right"
 msgstr "bytte katalogens namn från '%s' på högersidan"
 
-#: src/merge_conflict.cc:1267
+#: src/merge_conflict.cc:1498
 #, c-format
 msgid "conflict: multiple values for attribute '%s' on file '%s'"
 msgstr "konflikt: multipla värden på attributet '%s' för filen '%s'"
 
-#: src/merge_conflict.cc:1270
+#: src/merge_conflict.cc:1501
 #, c-format
 msgid "conflict: multiple values for attribute '%s' on directory '%s'"
 msgstr "konflikt: multipla värden på attributet '%s' för katalogen '%s'"
 
-#: src/merge_conflict.cc:1274
+#: src/merge_conflict.cc:1505
 #, c-format
 msgid "set to '%s' on the left"
 msgstr "satt till '%s' på vänstersidan"
 
-#: src/merge_conflict.cc:1276
+#: src/merge_conflict.cc:1507
 #, c-format
 msgid "deleted on the left"
 msgstr "borttagen på vänstersidan"
 
-#: src/merge_conflict.cc:1279
+#: src/merge_conflict.cc:1510
 #, c-format
 msgid "set to '%s' on the right"
 msgstr "satt till '%s' på högersidan"
 
-#: src/merge_conflict.cc:1281
+#: src/merge_conflict.cc:1512
 #, c-format
 msgid "deleted on the right"
 msgstr "borttagen på högersidan"
 
-#: src/merge_conflict.cc:1301
+#: src/merge_conflict.cc:1532
 #, c-format
 msgid ""
 "conflict: multiple values for attribute '%s' on file '%s' from revision %s"
 msgstr ""
 "konflikt: multipla värden på attributet '%s' för filen '%s' i revision %s"
 
-#: src/merge_conflict.cc:1304
+#: src/merge_conflict.cc:1535
 #, c-format
 msgid ""
 "conflict: multiple values for attribute '%s' on directory '%s' from revision "
@@ -7085,197 +7240,235 @@ msgstr ""
 msgstr ""
 "konflikt: multipla värden på attributet '%s' för katalogen '%s' i revision %s"
 
-#: src/merge_conflict.cc:1310
+#: src/merge_conflict.cc:1541
 #, c-format
 msgid "set to '%s' on left file '%s'"
 msgstr "satt till '%s' på vänstra filen '%s'"
 
-#: src/merge_conflict.cc:1313
+#: src/merge_conflict.cc:1544
 #, c-format
 msgid "set to '%s' on left directory '%s'"
 msgstr "satt till '%s' på vänstra katalogen '%s'"
 
-#: src/merge_conflict.cc:1319
+#: src/merge_conflict.cc:1550
 #, c-format
 msgid "deleted from left file '%s'"
 msgstr "borttagen från vänstra filen '%s'"
 
-#: src/merge_conflict.cc:1322
+#: src/merge_conflict.cc:1553
 #, c-format
 msgid "deleted from left directory '%s'"
 msgstr "borttagen från vänstra katalogen '%s'"
 
-#: src/merge_conflict.cc:1329
+#: src/merge_conflict.cc:1560
 #, c-format
 msgid "set to '%s' on right file '%s'"
 msgstr "satt till '%s' på högra filen '%s'"
 
-#: src/merge_conflict.cc:1332
+#: src/merge_conflict.cc:1563
 #, c-format
 msgid "set to '%s' on right directory '%s'"
 msgstr "satt till '%s' på högra katalogen '%s'"
 
-#: src/merge_conflict.cc:1338
+#: src/merge_conflict.cc:1569
 #, c-format
 msgid "deleted from right file '%s'"
 msgstr "borttagen från högra filen '%s'"
 
-#: src/merge_conflict.cc:1341
+#: src/merge_conflict.cc:1572
 #, c-format
 msgid "deleted from right directory '%s'"
 msgstr "borttagen från högra katalogen '%s'"
 
-#: src/merge_conflict.cc:1416
+#: src/merge_conflict.cc:1647
 #, c-format
 msgid "conflict: content conflict on file '%s'"
 msgstr "konflikt: innehållskonflikt i filen '%s'"
 
-#: src/merge_conflict.cc:1418
+#: src/merge_conflict.cc:1649
 #, c-format
 msgid "content hash is %s on the left"
 msgstr "innehållets kontrollsumma är %s på vänstersidan"
 
-#: src/merge_conflict.cc:1419
+#: src/merge_conflict.cc:1650
 #, c-format
 msgid "content hash is %s on the right"
 msgstr "innehållets kontrollsumma är %s på högersidan"
 
-#: src/merge_conflict.cc:1438
+#: src/merge_conflict.cc:1669
 #, c-format
 msgid "conflict: content conflict on file '%s' from revision %s"
 msgstr "konflikt: innehållskonflikt i filen '%s' från revisionen %s"
 
-#: src/merge_conflict.cc:1440
+#: src/merge_conflict.cc:1671
 #, c-format
 msgid "content hash is %s on the left in file '%s'"
 msgstr "innehållets kontrollsumma är %s på vänstersidan för filen '%s'"
 
-#: src/merge_conflict.cc:1442
+#: src/merge_conflict.cc:1673
 #, c-format
 msgid "content hash is %s on the right in file '%s'"
 msgstr "innehållets kontrollsumma är %s på högersidan för filen '%s'"
 
-#: src/merge_conflict.cc:1483 src/merge_conflict.cc:1714
-#: src/merge_conflict.cc:2079
+#: src/merge_conflict.cc:1714 src/merge_conflict.cc:1946
+#: src/merge_conflict.cc:2546
 #, c-format
 msgid "conflicts file does not match current conflicts"
 msgstr "konfliktfilen stämmer inte med nuvarande konflikter"
 
-#: src/merge_conflict.cc:1484
+#: src/merge_conflict.cc:1715
 #, c-format
 msgid "%s is not a supported conflict resolution for %s"
 msgstr "%s stöds inte som konfliktlösning för %s"
 
-#: src/merge_conflict.cc:1485
+#: src/merge_conflict.cc:1716
+#, c-format
+msgid ""
+"history for '%s' from %s will be lost; see user manual Merge Conflicts "
+"section"
+msgstr "'%s' historia från %s kommer att gå förlorat; se manualen, 'Merge Conflicts'"
+
+#: src/merge_conflict.cc:1717
 msgid "extra chars at end of conflict"
 msgstr "extra tecken på slutet av konfliktdata"
 
-#: src/merge_conflict.cc:1701
+#: src/merge_conflict.cc:1933
 #, c-format
 msgid "expected orphaned_directory or orphaned_file, found %s"
 msgstr "väntade mig orphaned_directory eller orphaned_file, fann %s"
 
-#: src/merge_conflict.cc:2131
+#: src/merge_conflict.cc:2604
 #, c-format
 msgid "extra data in file"
 msgstr "extra data i filen"
 
-#: src/merge_conflict.cc:2251
+#: src/merge_conflict.cc:2732
 #, c-format
 msgid "left revision id does not match conflict file"
 msgstr "vänster revisionsidentitet stämmer inte med konfliktfilen"
 
-#: src/merge_conflict.cc:2257
+#: src/merge_conflict.cc:2738
 #, c-format
 msgid "right revision id does not match conflict file"
 msgstr "höger revisionsidentitet stämmer inte med konfliktfilen"
 
-#: src/merge_conflict.cc:2285
+#: src/merge_conflict.cc:2769
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' finns redan"
 
-#: src/merge_conflict.cc:2287
+#: src/merge_conflict.cc:2771
 #, c-format
 msgid "directory '%s' does not exist or is unknown"
 msgstr "katalogen '%s' finns inte eller är okänd"
 
-#: src/merge_conflict.cc:2337
+#: src/merge_conflict.cc:2821
 #, c-format
 msgid "can't drop directory '%s'; it is not empty"
 msgstr "kan inte ta bort katalogen '%s'; den är inte tom"
 
-#: src/merge_conflict.cc:2352
+#: src/merge_conflict.cc:2835
 #, c-format
 msgid "no resolution provided for orphaned_node '%s'"
 msgstr "ingen lösning given för orphaned_node '%s'"
 
-#: src/merge_conflict.cc:2357
+#: src/merge_conflict.cc:2840
 #, c-format
 msgid "invalid resolution for orphaned_node '%s'"
 msgstr "ogiltig lösning för orphaned_node '%s'"
 
-#: src/merge_conflict.cc:2381 src/merge_conflict.cc:2419
+#: src/merge_conflict.cc:2863 src/merge_conflict.cc:2896
 #, c-format
+msgid "replacing content of '%s' from %s with '%s'"
+msgstr "ersätter innehållet för '%s' från %s med '%s'"
+
+#: src/merge_conflict.cc:2935
+#, c-format
+msgid "extra %s_resolution provided for dropped_modified '%s'"
+msgstr "extra %s_resolution given för dropped_modified '%s'"
+
+#: src/merge_conflict.cc:2942
+#, c-format
+msgid "no resolution provided for dropped_modified '%s'"
+msgstr "ingen lösning given för dropped_modified '%s'"
+
+#: src/merge_conflict.cc:2943
+#, c-format
+msgid "no %s_resolution provided for dropped_modified '%s'"
+msgstr "ingen %s_resolution given för dropped_modified '%s'"
+
+#: src/merge_conflict.cc:2980
+#, c-format
+msgid "dropping '%s' from %s"
+msgstr "slänger '%s' från %s"
+
+#: src/merge_conflict.cc:2988 src/merge_conflict.cc:2995
+#, c-format
+msgid "keeping '%s' from %s"
+msgstr "behåller '%s' från %s"
+
+#: src/merge_conflict.cc:3017 src/merge_conflict.cc:3026
+#: src/merge_conflict.cc:3040 src/merge_conflict.cc:3052
+#, c-format
+msgid "renaming '%s' from %s to '%s'"
+msgstr "byter namn på '%s' från %s till '%s'"
+
+#: src/merge_conflict.cc:3176 src/merge_conflict.cc:3214
+#, c-format
 msgid "inconsistent left/right resolutions for '%s'"
 msgstr "inkonsekvent lösning till höger och till vänster för '%s'"
 
-#: src/merge_conflict.cc:2383
+#: src/merge_conflict.cc:3178
 #, c-format
 msgid "replacing content of '%s' with '%s'"
 msgstr "ersätter innehållet i '%s' innehåll med '%s'"
 
-#: src/merge_conflict.cc:2410
+#: src/merge_conflict.cc:3205
 #, c-format
 msgid "can't drop '%s'; not empty"
 msgstr "kan inte ta bort '%s'; den är inte tom"
 
-#: src/merge_conflict.cc:2421
+#: src/merge_conflict.cc:3216
 #, c-format
 msgid "keeping '%s'"
 msgstr "behåller '%s'"
 
-#: src/merge_conflict.cc:2433
+#: src/merge_conflict.cc:3227
 #, c-format
 msgid "no resolution provided for duplicate_name '%s'"
 msgstr "ingen lösning given för det duplicerade '%s'"
 
-#: src/merge_conflict.cc:2438
+#: src/merge_conflict.cc:3327
 #, c-format
-msgid "invalid resolution for duplicate_name '%s'"
-msgstr "ogiltig lösning för duplicate_name '%s'"
-
-#: src/merge_conflict.cc:2538
-#, c-format
 msgid "merge of '%s', '%s' failed"
 msgstr "ihopslagningen av '%s', '%s' misslyckades"
 
-#: src/merge_conflict.cc:2540
+#: src/merge_conflict.cc:3329
 #, c-format
 msgid "merged '%s', '%s'"
 msgstr "slog ihop '%s', '%s'"
 
-#: src/merge_conflict.cc:2549
+#: src/merge_conflict.cc:3338
 #, c-format
 msgid "replacing content of '%s', '%s' with '%s'"
 msgstr "ersätter innehållet för '%s', '%s' med '%s'"
 
-#: src/merge_content.cc:271
+#: src/merge_content.cc:330
 #, c-format
 msgid "file '%s' does not exist in workspace"
 msgstr "filen '%s' existerar inte i arbetskopian"
 
-#: src/merge_content.cc:272
+#: src/merge_content.cc:331
 #, c-format
 msgid "'%s' in workspace is a directory, not a file"
 msgstr "'%s' i arbetskopian är en katalog, inte en fil"
 
-#: src/merge_content.cc:276
+#: src/merge_content.cc:335
 #, c-format
 msgid "file '%s' in workspace has id %s, wanted %s"
 msgstr "filen '%s' i arbetskopian har identiteten %s, %s eftersöktes"
 
-#: src/merge_content.cc:533
+#: src/merge_content.cc:606
 #, c-format
 msgid ""
 "help required for 3-way merge\n"
@@ -7290,20 +7483,20 @@ msgstr ""
 "[     höger] %s\n"
 "[ihopslagen] %s"
 
-#: src/merge_content.cc:703
+#: src/merge_content.cc:785
 #, c-format
 msgid "%d content conflict requires user intervention"
 msgid_plural "%d content conflicts require user intervention"
 msgstr[0] "%d innehållskonflikter, din hjälp behövs"
 msgstr[1] "%d innehållskonflikter, din hjälp behövs"
 
-#: src/merge_content.cc:719
+#: src/merge_content.cc:801
 #, c-format
 msgid "can't spawn external merger when non-interactive"
 msgstr ""
 "kan inte anropa extern ihopslagningsmekanism när jag inte är interaktiv"
 
-#: src/merge_content.cc:729
+#: src/merge_content.cc:811
 #, c-format
 msgid "merge failed due to unresolved conflicts"
 msgstr "ihopslagningen misslyckades på grund av olösta konflikter."
@@ -7320,8 +7513,8 @@ msgstr "kunde inte tyda värdnamnet i UR
 
 #: src/uri.cc:150 src/uri.cc:153 src/uri.cc:175 src/uri.cc:196
 #, c-format
-msgid "Bad URLencoded string '%s'"
-msgstr "Strängen '%s' är inte korrekt URL-kodad"
+msgid "bad URLencoded string '%s'"
+msgstr "strängen '%s' är inte korrekt URL-kodad"
 
 #: src/sha1.cc:34
 msgid "Benchmarks botan's SHA-1 core"
@@ -7332,90 +7525,94 @@ msgstr "Hastigetstestar Botans SHA-1"
 msgid "Benchmarking botan's SHA-1 core"
 msgstr "Hastigetstestar Botans SHA-1"
 
-#: src/sha1.cc:61
+#: src/sha1.cc:64
 #, c-format
 msgid "SHA-1 provider '%s': %s MiB/s"
 msgstr "SHA-1-leverantör '%s': %s MiB/s"
 
-#: src/sha1.cc:73
+#: src/sha1.cc:76
 #, c-format
 msgid "%s MiB/s"
 msgstr "%s MiB/s"
 
-#: src/pcrewrap.cc:219
+#: src/pcrewrap.cc:273
 #, c-format
 msgid "while compiling regex '%s': %s"
 msgstr "medans regexen '%s' kompilerades: %s"
 
-#: src/pcrewrap.cc:228
+#: src/pcrewrap.cc:282
 #, c-format
 msgid "error in regex '%s': %s"
 msgstr "fel i regexen '%s': %s"
 
-#: src/pcrewrap.cc:230
+#: src/pcrewrap.cc:284
 #, c-format
 msgid "error near char %d of regex '%s': %s"
 msgstr "fel nära tecken nummer %d i regexen '%s': %s"
 
-#: src/pcrewrap.cc:245
+#: src/pcrewrap.cc:299
 #, c-format
 msgid "while studying regex '%s': %s"
 msgstr "medans regexen '%s' studerades: %s"
 
-#: src/pcrewrap.cc:263
+#: src/pcrewrap.cc:317
 #, c-format
 msgid "backtrack limit exceeded in regular _expression_ matching"
 msgstr "bakåtspårningsnivån har nått sin gräns under jämförelse av regex"
 
-#: src/pcrewrap.cc:267
+#: src/pcrewrap.cc:321
 #, c-format
 msgid "recursion limit exceeded in regular _expression_ matching"
 msgstr "rekursionen har nått sin gräns under jämförelse av regex"
 
-#: src/pcrewrap.cc:272
+#: src/pcrewrap.cc:326
 #, c-format
 msgid "invalid UTF-8 sequence found during regular _expression_ matching"
 msgstr "ogiltig UTF8-sekvens funnen under jämförelsen av regex"
 
-#: src/pcrewrap.cc:275
+#: src/pcrewrap.cc:329
 #, c-format
 msgid "pcre_exec returned %d"
 msgstr "pcre_exec gav tillbaka %d"
 
 #: src/rev_output.cc:61
 msgid "Revision: "
-msgstr "Revision: "
+msgstr "Revision:    "
 
 #: src/rev_output.cc:67
 msgid "Parent:   "
-msgstr "Förälder: "
+msgstr "Förälder:    "
 
 #: src/rev_output.cc:99
 msgid "Tag:      "
 msgstr "Tagg:        "
 
-#: src/rev_output.cc:106
+#: src/rev_output.cc:110
+msgid "Other certs:"
+msgstr "Övriga cert: "
+
+#: src/rev_output.cc:123
 msgid "Changelog: "
-msgstr "Changelog: "
+msgstr "Changelog:   "
 
-#: src/rev_output.cc:114
+#: src/rev_output.cc:131
 msgid "Comments: "
 msgstr "Kommentarer: "
 
-#: src/rev_output.cc:141
+#: src/rev_output.cc:158
 msgid "Changes"
 msgstr "Ändringar"
 
-#: src/rev_output.cc:143
+#: src/rev_output.cc:160
 msgid "Changes against parent "
 msgstr "Förändringar gentemot förälder "
 
-#: src/rev_output.cc:151
+#: src/rev_output.cc:168
 #, c-format
 msgid "  dropped  %s"
 msgstr "  slängde            %s"
 
-#: src/rev_output.cc:156
+#: src/rev_output.cc:173
 #, c-format
 msgid ""
 "  renamed  %s\n"
@@ -7424,17 +7621,17 @@ msgstr ""
 "  bytte namn på      %s\n"
 "           till      %s"
 
-#: src/rev_output.cc:161 src/rev_output.cc:165
+#: src/rev_output.cc:178 src/rev_output.cc:182
 #, c-format
 msgid "  added    %s"
 msgstr "  la till            %s"
 
-#: src/rev_output.cc:169
+#: src/rev_output.cc:186
 #, c-format
 msgid "  patched  %s"
 msgstr "  ändrade            %s"
 
-#: src/rev_output.cc:173
+#: src/rev_output.cc:190
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -7445,7 +7642,7 @@ msgstr ""
 "            attr     %s\n"
 "           värde     %s"
 
-#: src/rev_output.cc:186
+#: src/rev_output.cc:203
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -8118,87 +8315,97 @@ msgstr "fel vid stängning av filen '%s'
 msgid "error closing file '%s': %s"
 msgstr "fel vid stängning av filen '%s': %s"
 
-#: src/unix/fs.cc:49 src/win32/fs.cc:26
+#: src/unix/fs.cc:52 src/win32/fs.cc:26
 #, c-format
 msgid "cannot get working directory: %s"
 msgstr "kan inte finna katalogen vi står i: %s"
 
-#: src/unix/fs.cc:61 src/win32/fs.cc:42
+#: src/unix/fs.cc:64 src/win32/fs.cc:42
 #, c-format
 msgid "cannot change to directory '%s': %s"
 msgstr "kan inte byta till katalog '%s': %s"
 
-#: src/unix/fs.cc:83
+#: src/unix/fs.cc:86
 #, c-format
 msgid "could not find home directory for uid %d"
 msgstr "kunde inte finna hemkatalogen för uid %d"
 
-#: src/unix/fs.cc:116
+#: src/unix/fs.cc:119
 #, c-format
 msgid "could not find home directory for user '%s'"
 msgstr "kunde inte finns hemkatalogen för användaren '%s'"
 
-#: src/unix/fs.cc:134
+#: src/unix/fs.cc:137
 #, c-format
 msgid "error accessing file '%s': %s"
 msgstr "fel när jag försökte nå filen '%s': %s"
 
-#: src/unix/fs.cc:143
+#: src/unix/fs.cc:146
 #, c-format
 msgid "cannot handle special file '%s'"
 msgstr "kan inte hantera specialfilen '%s'"
 
-#: src/unix/fs.cc:159 src/win32/fs.cc:172
+#: src/unix/fs.cc:162 src/win32/fs.cc:172
 #, c-format
 msgid "could not open directory '%s': %s"
 msgstr "kunde inte öppna katalogen '%s': %s"
 
-#: src/unix/fs.cc:250
+#: src/unix/fs.cc:253
 #, c-format
 msgid "error accessing '%s/%s': %s"
 msgstr "fel när jag försökte nå '%s/%s': %s"
 
-#: src/unix/fs.cc:272
+#: src/unix/fs.cc:275
 #, c-format
 msgid "stat(%s) failed: %s"
 msgstr "anrop av stat(%s) misslyckades: %s"
 
-#: src/unix/fs.cc:284
+#: src/unix/fs.cc:287
 #, c-format
 msgid "chmod(%s) failed: %s"
 msgstr "anrop av chmod(%s) misslyckades: %s"
 
-#: src/unix/fs.cc:295
+#: src/unix/fs.cc:330
 #, c-format
+msgid "error reading file '%s': %s"
+msgstr "fel vid läsning filen '%s': %s"
+
+#: src/unix/fs.cc:345
+#, c-format
+msgid "error writing file '%s': %s"
+msgstr "fel vid skrivning till fil '%s': %s"
+
+#: src/unix/fs.cc:360
+#, c-format
 msgid "renaming '%s' to '%s' failed: %s"
 msgstr "byta namn på '%s' till '%s' misslyckades: %s"
 
-#: src/unix/fs.cc:308 src/unix/fs.cc:363 src/win32/fs.cc:248
+#: src/unix/fs.cc:374 src/unix/fs.cc:429 src/win32/fs.cc:248
 #, c-format
 msgid "could not remove '%s': %s"
 msgstr "kunde inte ta bort '%s': %s"
 
-#: src/unix/fs.cc:390 src/win32/fs.cc:303
+#: src/unix/fs.cc:456 src/win32/fs.cc:310
 #, c-format
 msgid "could not create directory '%s': %s"
 msgstr "kunde inte skapa katalogen '%s': %s"
 
-#: src/unix/fs.cc:456 src/win32/fs.cc:451
+#: src/unix/fs.cc:522 src/win32/fs.cc:458
 #, c-format
 msgid "cannot create temp file '%s': %s"
 msgstr "kan inte skapa tillfällig fil '%s': %s"
 
-#: src/unix/fs.cc:466
+#: src/unix/fs.cc:532
 #, c-format
 msgid "all %d possible temporary file names are in use"
-msgstr "Alla %d möjliga tillfälliga filnamn används"
+msgstr "alla %d möjliga tillfälliga filnamn används"
 
-#: src/unix/fs.cc:507 src/win32/fs.cc:512
+#: src/unix/fs.cc:573 src/win32/fs.cc:519
 #, c-format
 msgid "error writing to temp file '%s': %s"
 msgstr "fel vid skrivning till tillfällig fil '%s': %s"
 
-#: src/unix/fs.cc:512 src/win32/fs.cc:519
+#: src/unix/fs.cc:578 src/win32/fs.cc:526
 #, c-format
 msgid ""
 "giving up after four zero-length writes to '%s' (%d byte written, %d left)"
@@ -8297,38 +8504,38 @@ msgstr "fel när läste katalog: %s"
 msgid "error while reading directory: %s"
 msgstr "fel när läste katalog: %s"
 
-#: src/win32/fs.cc:291
+#: src/win32/fs.cc:298
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation error code 0x%x"
 msgstr "kunde inte ta bort '%s' och dess innehåll: SHFileOperation felkod 0x%x"
 
-#: src/win32/fs.cc:294
+#: src/win32/fs.cc:301
 #, c-format
 msgid "could not remove '%s' and contents: SHFileOperation partially aborted"
 msgstr ""
 "kunde inte ta bort '%s' och dess innehåll: SHFileOperation delvis avbrutet"
 
-#: src/win32/fs.cc:359
+#: src/win32/fs.cc:366
 #, c-format
 msgid "GetFileAttributes(%s) failed: %s"
 msgstr "anrop av GetFileAttributes(%s) misslyckades: %s"
 
-#: src/win32/fs.cc:364
+#: src/win32/fs.cc:371
 #, c-format
 msgid "SetFileAttributes(%s) failed: %s"
 msgstr "anrop av GetFileAttributes(%s) misslyckades: %s"
 
-#: src/win32/fs.cc:390
+#: src/win32/fs.cc:397
 #, c-format
 msgid "renaming '%s' to '%s' failed: %s (%d)"
 msgstr "namnbyte av '%s' till '%s' misslyckades: %s (%d)"
 
-#: src/win32/fs.cc:459
+#: src/win32/fs.cc:466
 #, c-format
 msgid "cannot find a temporary file (tried %d possibilities)"
 msgstr "kan inte finna någon tillfällig fil (provade %d möjligheter)"
 
-#: src/win32/fs.cc:486
+#: src/win32/fs.cc:493
 #, c-format
 msgid "'%s' will be accessible to all users of this computer\n"
 msgstr "'%s' kommer att vara åtkomlig för alla användare på den här datorn\n"
@@ -8374,31 +8581,51 @@ msgstr "monotone stöder inte Botan 1.7.
 msgid "monotone does not support Botan 1.7.14"
 msgstr "monotone stöder inte Botan 1.7.14"
 
-#: src/monotone.cc:161
+#: src/monotone.cc:163
 #, c-format
+msgid "monotone does not support Botan 1.9.9"
+msgstr "monotone stöder inte Botan 1.9.9"
+
+#: src/monotone.cc:168
+#, c-format
 msgid "this monotone binary requires Botan 1.6.3 or newer"
 msgstr "denna monotone kräver Botan version 1.6.3 eller senare"
 
-#: src/monotone.cc:163
+#: src/monotone.cc:170
 #, c-format
-msgid "this monotone binary does not work with Botan newer than 1.7.6"
-msgstr "denna monotone fungerar inte med Botan version 1.7.6 eller senare"
+msgid "this monotone binary does not work with Botan 1.7.7 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.7.7 eller senare"
 
-#: src/monotone.cc:166
+#: src/monotone.cc:175
 #, c-format
 msgid "this monotone binary requires Botan 1.7.7 or newer"
 msgstr "denna monotone kräver Botan version 1.7.7 eller senare"
 
-#: src/monotone.cc:172 src/monotone.cc:177
+#: src/monotone.cc:182 src/monotone.cc:189
 #, c-format
-msgid "this monotone binary does not work with Botan 1.9.x"
-msgstr "denna monotone fungerar inte med Botan version 1.9.x"
+msgid "this monotone binary does not work with Botan 1.9.4 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.9.4 eller senare"
 
-#: src/monotone.cc:175
+#: src/monotone.cc:187
 #, c-format
 msgid "this monotone binary requires Botan 1.7.22 or newer"
 msgstr "denna monotone kräver Botan version 1.7.22 eller senare"
 
+#: src/monotone.cc:195
+#, c-format
+msgid "this monotone binary requires Botan 1.9.4 or newer"
+msgstr "denna monotone kräver Botan version 1.9.4 eller senare"
+
+#: src/monotone.cc:197
+#, c-format
+msgid "this monotone binary does not work with Botan 1.9.11 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.9.11 eller senare"
+
+#: src/monotone.cc:202
+#, c-format
+msgid "this monotone binary requires Botan 1.9.11 or newer"
+msgstr "denna monotone kräver Botan version 1.9.11 eller senare"
+
 #: src/std_hooks.lua:56
 msgid "Press enter"
 msgstr "Tryck på Enter"
@@ -8407,6 +8634,31 @@ msgstr "Tryck [Retur] när underprocesse
 msgid "Press enter when the subprocess has completed"
 msgstr "Tryck [Retur] när underprocessen är klar"
 
+#~ msgid ""
+#~ "non-recursive add: Files in the directory '%s' will not be added "
+#~ "automatically."
+#~ msgstr ""
+#~ "icke-rekursiv addering: Filer i katalogen '%s' kommer inte att läggas "
+#~ "till automatiskt"
+
+#~ msgid ""
+#~ "content changes to the file '%s'\n"
+#~ "will be ignored during this merge as the file has been\n"
+#~ "removed on one side of the merge.  Affected revisions include:"
+#~ msgstr ""
+#~ "innehållsändringar i filen '%s'\n"
+#~ "kommer att ignoreras i den här ihopslagningen eftersom filen har tagits\n"
+#~ "bort på ena sidan av ihopslagningen.  Följande revisioner är påverkade:"
+
+#~ msgid "Revision: %s"
+#~ msgstr "Revision: %s"
+
+#~ msgid "invalid resolution for duplicate_name '%s'"
+#~ msgstr "ogiltig lösning för duplicate_name '%s'"
+
+#~ msgid "this monotone binary does not work with Botan newer than 1.7.6"
+#~ msgstr "denna monotone fungerar inte med Botan version 1.7.6 eller senare"
+
 #~ msgid "Network error: %s"
 #~ msgstr "Nätverksfel: %s"
 
============================================================
--- src/ancestry.cc	8b3388b690a5f4878bd29d752c3e6e073411739e
+++ src/ancestry.cc	e673b17a5d2fad2716f7f4efe33c2ca11c7c31f9
@@ -374,6 +374,121 @@ erase_ancestors(database & db, set<revis
   erase_ancestors_and_failures(db, revisions, p);
 }
 
+static void
+accumulate_strict_descendants(database & db,
+                              revision_id const & start,
+                              set<revision_id> & all_descendants,
+                              multimap<revision_id, revision_id> const & graph,
+                              rev_height const & max_height)
+{
+  typedef multimap<revision_id, revision_id>::const_iterator gi;
+
+  vector<revision_id> frontier;
+  frontier.push_back(start);
+
+  while (!frontier.empty())
+    {
+      revision_id rid = frontier.back();
+      frontier.pop_back();
+      pair<gi, gi> parents = graph.equal_range(rid);
+      for (gi i = parents.first; i != parents.second; ++i)
+        {
+          revision_id const & parent = i->second;
+          if (all_descendants.find(parent) == all_descendants.end())
+            {
+              // prune if we're above max_height
+              rev_height h;
+              db.get_rev_height(parent, h);
+              if (h <= max_height)
+                {
+                  all_descendants.insert(parent);
+                  frontier.push_back(parent);
+                }
+            }
+        }
+    }
+}
+
+// this call is equivalent to running:
+//   erase(remove_if(candidates.begin(), candidates.end(), p));
+//   erase_descendants(candidates, db);
+// however, by interleaving the two operations, it can in common cases make
+// many fewer calls to the predicate, which can be a significant speed win.
+
+void
+erase_descendants_and_failures(database & db,
+                               std::set<revision_id> & candidates,
+                               is_failure & p,
+                               multimap<revision_id, revision_id> *graph_cache_ptr)
+{
+  // Load up the ancestry graph
+  multimap<revision_id, revision_id> graph;
+
+  if (candidates.empty())
+    return;
+
+  if (graph_cache_ptr == NULL)
+    graph_cache_ptr = &graph;
+  if (graph_cache_ptr->empty())
+  {
+    db.get_forward_ancestry(*graph_cache_ptr);
+  }
+
+  // Keep a set of all descendants that we've traversed -- to avoid
+  // combinatorial explosion.
+  set<revision_id> all_descendants;
+
+  rev_height max_height;
+  db.get_rev_height(*candidates.begin(), max_height);
+  for (std::set<revision_id>::const_iterator it = candidates.begin(); it != candidates.end(); it++)
+    {
+      rev_height h;
+      db.get_rev_height(*it, h);
+      if (h > max_height)
+        max_height = h;
+    }
+
+  vector<revision_id> todo(candidates.begin(), candidates.end());
+  std::random_shuffle(todo.begin(), todo.end());
+
+  size_t predicates = 0;
+  while (!todo.empty())
+    {
+      revision_id rid = todo.back();
+      todo.pop_back();
+      // check if this one has already been eliminated
+      if (all_descendants.find(rid) != all_descendants.end())
+        continue;
+      // and then whether it actually should stay in the running:
+      ++predicates;
+      if (p(rid))
+        {
+          candidates.erase(rid);
+          continue;
+        }
+      // okay, it is good enough that all its descendants should be
+      // eliminated
+      accumulate_strict_descendants(db, rid, all_descendants, *graph_cache_ptr, max_height);
+    }
+
+  // now go and eliminate the ancestors
+  for (set<revision_id>::const_iterator i = all_descendants.begin();
+       i != all_descendants.end(); ++i)
+    candidates.erase(*i);
+
+  L(FL("called predicate %s times") % predicates);
+}
+
+// This function looks at a set of revisions, and for every pair A, B in that
+// set such that A is an descendant of B, it erases A.
+
+void
+erase_descendants(database & db, set<revision_id> & revisions)
+{
+  no_failures p;
+  erase_descendants_and_failures(db, revisions, p);
+}
+
 // This function takes a revision A and a set of revision Bs, calculates the
 // ancestry of each, and returns the set of revisions that are in A's ancestry
 // but not in the ancestry of any of the Bs.  It tells you 'what's new' in A
============================================================
--- src/automate.cc	efa4ecceab7f1e31f71778f325da312bf6aefba5
+++ src/automate.cc	30e9bb3567e320f83ce5c1b4817dc9ad90fe8423
@@ -240,6 +240,39 @@ CMD_AUTOMATE(erase_ancestors, N_("[REV1 
     output << *i << '\n';
 }
 
+// Name: erase_descendants
+// Arguments:
+//   0 or more: revision ids
+// Added in: 13.1
+// Purpose: Prints all arguments, except those that are a descendant of some
+//   other argument.  One way to think about this is that it prints the
+//   minimal elements of the given set, under the ordering imposed by the
+//   "parent of" relation.  Another way to think of it is if the arguments were
+//   a branch, then we print the roots of that branch.
+// Output format: A list of revision ids, in hexadecimal, each followed by a
+//   newline.  Revision ids are printed in alphabetically sorted order.
+// Error conditions: If any of the revisions do not exist, prints nothing to
+//   stdout, prints an error message to stderr, and exits with status 1.
+CMD_AUTOMATE(erase_descendants, N_("[REV1 [REV2 [REV3 [...]]]]"),
+             N_("Erases the descendants in a list of revisions"),
+             "",
+             options::opts::none)
+{
+  database db(app);
+
+  set<revision_id> revs;
+  for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
+    {
+      revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
+      E(db.revision_exists(rid), origin::user,
+        F("no revision %s found in database") % rid);
+      revs.insert(rid);
+    }
+  erase_descendants(db, revs);
+  for (set<revision_id>::const_iterator i = revs.begin(); i != revs.end(); ++i)
+    output << *i << '\n';
+}
+
 // Name: toposort
 // Arguments:
 //   0 or more: revision ids
@@ -1319,15 +1352,15 @@ CMD_AUTOMATE(get_base_revision_id, "",
   E(args.size() == 0, origin::user,
     F("no arguments needed"));
 
-  database db(app);
   workspace work(app);
+  revision_t rev;
 
-  parent_map parents;
-  work.get_parent_rosters(db, parents);
-  E(parents.size() == 1, origin::user,
+  work.get_work_rev(rev);
+
+  E(rev.edges.size() == 1, origin::user,
     F("this command can only be used in a single-parent workspace"));
 
-  output << parent_id(parents.begin()) << '\n';
+  output << rev.edges.begin()->first << '\n';
 }
 
 // Name: get_current_revision_id
============================================================
--- src/automate_reader.cc	f647cff8c945367fbf054eb9fd3a14ff738e330b
+++ src/automate_reader.cc	ac60e48d6902a3cef96bc86a93640936c125beee
@@ -43,7 +43,7 @@ bool automate_reader::get_string(string 
       read(&c, 1);
     }
   E(c == ':', origin::user,
-    F("Bad input to automate stdio: expected ':' after string size"));
+    F("bad input to automate stdio: expected ':' after string size"));
   char *str = new char[size];
   size_t got = 0;
   while(got < size)
@@ -63,7 +63,7 @@ streamsize automate_reader::read(char *b
   rv = in.rdbuf()->sgetn(buf, nbytes);
 
   E(eof_ok || rv > 0, origin::user,
-    F("Bad input to automate stdio: unexpected EOF"));
+    F("bad input to automate stdio: unexpected EOF"));
   return rv;
 }
 void automate_reader::go_to_next_item()
@@ -91,7 +91,7 @@ void automate_reader::go_to_next_item()
     case 'l': loc = cmd; break;
     default:
       E(false, origin::user,
-        F("Bad input to automate stdio: unknown start token '%c'") % c);
+        F("bad input to automate stdio: unknown start token '%c'") % c);
     }
 }
 automate_reader::automate_reader(istream & is) : in(is), loc(none)
@@ -113,14 +113,14 @@ bool automate_reader::get_command(vector
       go_to_next_item();
     }
   E(loc == cmd, origin::user,
-    F("Bad input to automate stdio: expected '%c' token") % cmd);
+    F("bad input to automate stdio: expected '%c' token") % cmd);
   string item;
   while (get_string(item))
     {
       cmdline.push_back(item);
     }
   E(cmdline.size() > 0, origin::user,
-    F("Bad input to automate stdio: command name is missing"));
+    F("bad input to automate stdio: command name is missing"));
   return true;
 }
 void automate_reader::reset()
============================================================
--- src/cmd.cc	077158d4777347710668422f6935bca67125b860
+++ src/cmd.cc	94f7a433246032017e7c9a61645903feef68128e
@@ -456,7 +456,7 @@ namespace commands {
       app.mtn_automate_allowed = false;
 
       E(ll.ok(), origin::user,
-        F("Call to user command '%s' (lua command: '%s') failed.")
+        F("call to user command '%s' (lua command: '%s') failed.")
         % primary_name() % f_name);
     }
   };
@@ -974,7 +974,7 @@ CMD_NO_WORKSPACE(manpage, "manpage", "",
     F("could not execute man page formatter command '%s': %s")
       % cmd % strerror(errno));
 
-  fprintf(fp, ss.str().c_str());
+  fputs(ss.str().c_str(), fp);
   pclose(fp);
 }
 
============================================================
--- src/cmd_conflicts.cc	ad9dc74c27d4d8c50a74e5825ec9e0a12cdc1b09
+++ src/cmd_conflicts.cc	28995825acadb97eaa4b5cda378c66e548e9ad16
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 - 2010 Stephen Leake <address@hidden>
+// Copyright (C) 2008 - 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -50,6 +50,16 @@ static void
 typedef enum {first, remaining} show_conflicts_case_t;
 
 static void
+show_resolution(resolve_conflicts::file_resolution_t resolution, char const * const prefix)
+{
+
+  if (resolution.resolution != resolve_conflicts::none)
+    {
+      P(F(string(prefix).append(image(resolution)).c_str()));
+    }
+}
+
+static void
 show_conflicts(database & db, conflicts_t conflicts, show_conflicts_case_t show_case)
 {
   // Go thru the conflicts we know how to resolve in the same order
@@ -60,7 +70,7 @@ show_conflicts(database & db, conflicts_
     {
       orphaned_node_conflict & conflict = *i;
 
-      if (conflict.resolution.first == resolve_conflicts::none)
+      if (conflict.resolution.resolution == resolve_conflicts::none)
         {
           file_path name;
           if (conflicts.left_roster->has_node(conflict.nid))
@@ -84,14 +94,142 @@ show_conflicts(database & db, conflicts_
         }
     }
 
+  for (std::vector<dropped_modified_conflict>::iterator i = conflicts.result.dropped_modified_conflicts.begin();
+       i != conflicts.result.dropped_modified_conflicts.end();
+       ++i)
+    {
+      dropped_modified_conflict & conflict = *i;
+
+      if ((conflict.left_nid != the_null_node &&
+           conflict.left_resolution.resolution == resolve_conflicts::none) ||
+          (conflict.right_nid != the_null_node &&
+           conflict.right_resolution.resolution == resolve_conflicts::none))
+        {
+          file_path modified_name;
+
+          switch (conflict.dropped_side)
+            {
+            case resolve_conflicts::left_side:
+              conflicts.right_roster->get_name(conflict.right_nid, modified_name);
+              break;
+
+            case resolve_conflicts::right_side:
+              conflicts.left_roster->get_name(conflict.left_nid, modified_name);
+              break;
+            }
+
+          P(F("conflict: file '%s'") % modified_name);
+          if (conflict.orphaned)
+            {
+              switch (conflict.dropped_side)
+                {
+                case resolve_conflicts::left_side:
+                  P(F("orphaned on the left"));
+                  P(F("modified on the right"));
+                  break;
+
+                case resolve_conflicts::right_side:
+                  P(F("modified on the left"));
+                  P(F("orphaned on the right"));
+                }
+            }
+          else
+            {
+              switch (conflict.dropped_side)
+                {
+                case resolve_conflicts::left_side:
+                  if (conflict.left_nid == the_null_node)
+                    P(F("dropped on the left"));
+                  else
+                    {
+                      // we can't distinguish duplicate name from recreated
+                      P(F("dropped and recreated on the left"));
+                    }
+
+                  P(F("modified on the right"));
+                  break;
+
+                case resolve_conflicts::right_side:
+                  P(F("modified on the left"));
+
+                  if (conflict.right_nid == the_null_node)
+                    P(F("dropped on the right"));
+                  else
+                    {
+                      P(F("dropped and recreated on the right"));
+                    }
+                }
+            }
+
+          show_resolution(conflict.left_resolution, "left_");
+          show_resolution(conflict.right_resolution, "right_");
+
+          if (show_case == remaining) return;
+
+          if (conflict.left_nid == the_null_node || conflict.right_nid == the_null_node)
+            {
+              // only one file involved; only need one resolution
+              P(F("possible resolutions:"));
+              P(F("resolve_first drop"));
+              P(F("resolve_first rename"));
+              P(F("resolve_first user_rename \"new_content_name\" \"new_file_name\""));
+
+              if (!conflict.orphaned)
+                {
+                  P(F("resolve_first keep"));
+                  P(F("resolve_first user \"name\""));
+                }
+              return;
+            }
+          else
+            {
+              // recreated or repeated duplicate name; need two resolutions
+
+              P(F("possible resolutions:"));
+
+              if (conflict.left_nid != the_null_node &&
+                  conflict.left_resolution.resolution == resolve_conflicts::none)
+                {
+                  P(F("resolve_first_left drop"));
+                  P(F("resolve_first_left rename"));
+                  P(F("resolve_first_left user_rename \"new_content_name\" \"new_file_name\""));
+
+                  if (!conflict.orphaned &&
+                      conflict.right_resolution.resolution != resolve_conflicts::keep &&
+                      conflict.right_resolution.resolution != resolve_conflicts::content_user)
+                    {
+                      P(F("resolve_first_left keep"));
+                      P(F("resolve_first_left user \"name\""));
+                    }
+                }
+
+              if (conflict.right_nid != the_null_node &&
+                  conflict.right_resolution.resolution == resolve_conflicts::none)
+                {
+                  P(F("resolve_first_right drop"));
+                  P(F("resolve_first_right rename"));
+                  P(F("resolve_first_right user_rename \"new_content_name\" \"new_file_name\""));
+                  if (!conflict.orphaned &&
+                      conflict.left_resolution.resolution != resolve_conflicts::keep &&
+                      conflict.left_resolution.resolution != resolve_conflicts::content_user)
+                    {
+                      P(F("resolve_first_right keep"));
+                      P(F("resolve_first_right user \"name\""));
+                    }
+                }
+              return;
+            }
+        }
+    }
+
   for (std::vector<duplicate_name_conflict>::iterator i = conflicts.result.duplicate_name_conflicts.begin();
        i != conflicts.result.duplicate_name_conflicts.end();
        ++i)
     {
       duplicate_name_conflict & conflict = *i;
 
-      if (conflict.left_resolution.first == resolve_conflicts::none ||
-          conflict.right_resolution.first == resolve_conflicts::none)
+      if (conflict.left_resolution.resolution == resolve_conflicts::none ||
+          conflict.right_resolution.resolution == resolve_conflicts::none)
         {
           file_path left_name;
           conflicts.left_roster->get_name(conflict.left_nid, left_name);
@@ -102,7 +240,7 @@ show_conflicts(database & db, conflicts_
             case first:
               P(F("possible resolutions:"));
 
-              if (conflict.left_resolution.first == resolve_conflicts::none)
+              if (conflict.left_resolution.resolution == resolve_conflicts::none)
                 {
                   P(F("resolve_first_left drop"));
                   P(F("resolve_first_left keep"));
@@ -110,7 +248,7 @@ show_conflicts(database & db, conflicts_
                   P(F("resolve_first_left user \"name\""));
                 }
 
-              if (conflict.right_resolution.first == resolve_conflicts::none)
+              if (conflict.right_resolution.resolution == resolve_conflicts::none)
                 {
                   P(F("resolve_first_right drop"));
                   P(F("resolve_first_right keep"));
@@ -131,7 +269,7 @@ show_conflicts(database & db, conflicts_
     {
       file_content_conflict & conflict = *i;
 
-      if (conflict.resolution.first == resolve_conflicts::none)
+      if (conflict.resolution.resolution == resolve_conflicts::none)
         {
           file_path name;
           conflicts.left_roster->get_name(conflict.nid, name);
@@ -187,6 +325,8 @@ show_conflicts(database & db, conflicts_
               (*conflicts.left_roster, *conflicts.right_roster, adaptor, false, std::cout);
             conflicts.result.report_multiple_name_conflicts
               (*conflicts.left_roster, *conflicts.right_roster, adaptor, false, std::cout);
+            conflicts.result.report_dropped_modified_conflicts
+              (*conflicts.left_roster, *conflicts.right_roster, adaptor, false, std::cout);
             conflicts.result.report_attribute_conflicts
               (*conflicts.left_roster, *conflicts.right_roster, adaptor, false, std::cout);
           }
@@ -241,48 +381,60 @@ static void
 } // do_interactive_merge
 
 static void
-set_duplicate_name_conflict(resolve_conflicts::file_resolution_t & resolution,
-                            resolve_conflicts::file_resolution_t const & other_resolution,
-                            args_vector const & args)
+set_resolution(resolve_conflicts::file_resolution_t &       resolution,
+               resolve_conflicts::file_resolution_t const & other_resolution,
+               args_vector const &                          args)
 {
   if ("drop" == idx(args, 0)())
     {
       E(args.size() == 1, origin::user, F("too many arguments"));
-      resolution.first = resolve_conflicts::drop;
+      resolution.resolution = resolve_conflicts::drop;
     }
   else if ("keep" == idx(args, 0)())
     {
       E(args.size() == 1, origin::user, F("too many arguments"));
-      E(other_resolution.first == resolve_conflicts::none ||
-        other_resolution.first == resolve_conflicts::drop ||
-        other_resolution.first == resolve_conflicts::rename,
+      E(other_resolution.resolution == resolve_conflicts::none ||
+        other_resolution.resolution == resolve_conflicts::drop ||
+        other_resolution.resolution == resolve_conflicts::rename ||
+        other_resolution.resolution == resolve_conflicts::content_user_rename,
         origin::user,
-        F("other resolution must be 'drop' or 'rename'"));
-      resolution.first = resolve_conflicts::keep;
+        F("other resolution is %s; specify 'drop', 'rename', or 'user_rename'") %
+        image(other_resolution.resolution));
+      resolution.resolution = resolve_conflicts::keep;
     }
   else if ("rename" == idx(args, 0)())
     {
       E(args.size() == 2, origin::user, F("wrong number of arguments"));
-      resolution.first  = resolve_conflicts::rename;
-      resolution.second = resolve_conflicts::new_file_path(idx(args,1)());
+      resolution.resolution  = resolve_conflicts::rename;
+      resolution.rename = file_path_external(idx(args,1));
     }
   else if ("user" == idx(args, 0)())
     {
       E(args.size() == 2, origin::user, F("wrong number of arguments"));
-      E(other_resolution.first == resolve_conflicts::none ||
-        other_resolution.first == resolve_conflicts::drop ||
-        other_resolution.first == resolve_conflicts::rename,
+      E(other_resolution.resolution == resolve_conflicts::none ||
+        other_resolution.resolution == resolve_conflicts::drop ||
+        other_resolution.resolution == resolve_conflicts::rename ||
+        other_resolution.resolution == resolve_conflicts::content_user_rename,
         origin::user,
-        F("other resolution must be 'drop' or 'rename'"));
+        F("other resolution is %s; specify 'drop', 'rename', or 'user_rename'") %
+        image(other_resolution.resolution));
 
-      resolution.first  = resolve_conflicts::content_user;
-      resolution.second = new_optimal_path(idx(args,1)(), false);
+      resolution.resolution  = resolve_conflicts::content_user;
+      resolution.content = new_optimal_path(idx(args,1)(), false);
     }
+  else if ("user_rename" == idx(args,0)())
+    {
+      E(args.size() == 3, origin::user, F("wrong number of arguments"));
+
+      resolution.resolution  = resolve_conflicts::content_user_rename;
+      resolution.content = new_optimal_path(idx(args,1)(), false);
+      resolution.rename = file_path_external(idx(args,2));
+    }
   else
     E(false, origin::user,
       F(conflict_resolution_not_supported_msg) % idx(args,0) % "duplicate_name");
 
-} //set_duplicate_name_conflict
+} // set_resolution
 
 static void
 set_first_conflict(database & db,
@@ -291,8 +443,52 @@ set_first_conflict(database & db,
                    args_vector const & args,
                    side_t side)
 {
+  E(args.size() > 0, origin::user, F("wrong number of arguments"));
+
   if (side != neither)
     {
+      for (std::vector<dropped_modified_conflict>::iterator i = conflicts.result.dropped_modified_conflicts.begin();
+           i != conflicts.result.dropped_modified_conflicts.end();
+           ++i)
+        {
+          dropped_modified_conflict & conflict = *i;
+
+          // here we only allow two resolutions; single resolutions are handled below
+
+          switch (side)
+            {
+            case left:
+              if (conflict.left_resolution.resolution == resolve_conflicts::none)
+                {
+                  E(conflict.left_nid != the_null_node, origin::user,
+                    F("must specify resolve_first (not _left or _right)"));
+
+                  if ("keep" == idx(args,0)())
+                    E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                  set_resolution(conflict.left_resolution, conflict.right_resolution, args);
+                  return;
+                }
+              break;
+            case right:
+              if (conflict.right_resolution.resolution == resolve_conflicts::none)
+                {
+                  E(conflict.right_nid != the_null_node, origin::user,
+                    F("must specify resolve_first (not _left or _right)"));
+
+                  if ("keep" == idx(args,0)())
+                    E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                  set_resolution(conflict.right_resolution, conflict.left_resolution, args);
+                  return;
+                }
+              break;
+            case neither:
+              // can't get here
+              break;
+            }
+        }
+
       for (std::vector<duplicate_name_conflict>::iterator i = conflicts.result.duplicate_name_conflicts.begin();
            i != conflicts.result.duplicate_name_conflicts.end();
            ++i)
@@ -302,17 +498,17 @@ set_first_conflict(database & db,
           switch (side)
             {
             case left:
-              if (conflict.left_resolution.first == resolve_conflicts::none)
+              if (conflict.left_resolution.resolution == resolve_conflicts::none)
                 {
-                  set_duplicate_name_conflict(conflict.left_resolution, conflict.right_resolution, args);
+                  set_resolution(conflict.left_resolution, conflict.right_resolution, args);
                   return;
                 }
               break;
 
             case right:
-              if (conflict.right_resolution.first == resolve_conflicts::none)
+              if (conflict.right_resolution.resolution == resolve_conflicts::none)
                 {
-                  set_duplicate_name_conflict(conflict.right_resolution, conflict.left_resolution, args);
+                  set_resolution(conflict.right_resolution, conflict.left_resolution, args);
                   return;
                 }
               break;
@@ -331,20 +527,20 @@ set_first_conflict(database & db,
         {
           orphaned_node_conflict & conflict = *i;
 
-          if (conflict.resolution.first == resolve_conflicts::none)
+          if (conflict.resolution.resolution == resolve_conflicts::none)
             {
               if ("drop" == idx(args,0)())
                 {
                   E(args.size() == 1, origin::user, F("wrong number of arguments"));
 
-                  conflict.resolution.first  = resolve_conflicts::drop;
+                  conflict.resolution.resolution  = resolve_conflicts::drop;
                 }
               else if ("rename" == idx(args,0)())
                 {
                   E(args.size() == 2, origin::user, F("wrong number of arguments"));
 
-                  conflict.resolution.first  = resolve_conflicts::rename;
-                  conflict.resolution.second = new_optimal_path(idx(args,1)(), false);
+                  conflict.resolution.resolution  = resolve_conflicts::rename;
+                  conflict.resolution.rename = file_path_external(idx(args,1));
                 }
               else
                 {
@@ -355,13 +551,129 @@ set_first_conflict(database & db,
             }
         }
 
+      for (std::vector<dropped_modified_conflict>::iterator i = conflicts.result.dropped_modified_conflicts.begin();
+           i != conflicts.result.dropped_modified_conflicts.end();
+           ++i)
+        {
+          dropped_modified_conflict & conflict = *i;
+
+          // Here we only allow single resolutions; two resolutions are handled above
+
+          switch (conflict.dropped_side)
+            {
+            case resolve_conflicts::left_side:
+              E(conflict.left_nid == the_null_node, origin::user,
+                F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
+
+              // the left side stays dropped; we either drop, keep or replace the right side
+              if (conflict.right_resolution.resolution == resolve_conflicts::none)
+                {
+                  if ("drop" == idx(args,0)())
+                    {
+                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
+
+                      conflict.right_resolution.resolution = resolve_conflicts::drop;
+                    }
+                  else if ("keep" == idx(args,0)())
+                    {
+                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
+                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                      conflict.right_resolution.resolution = resolve_conflicts::keep;
+                    }
+                  else if ("user" == idx(args,0)())
+                    {
+                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
+                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                      conflict.right_resolution.resolution  = resolve_conflicts::content_user;
+                      conflict.right_resolution.content = new_optimal_path(idx(args,1)(), false);
+                    }
+                  else if ("rename" == idx(args,0)())
+                    {
+                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
+
+                      conflict.right_resolution.resolution  = resolve_conflicts::rename;
+                      conflict.right_resolution.rename = file_path_external(idx(args,1));
+                    }
+                  else if ("user_rename" == idx(args,0)())
+                    {
+                      E(args.size() == 3, origin::user, F("wrong number of arguments"));
+
+                      conflict.right_resolution.resolution  = resolve_conflicts::content_user_rename;
+                      conflict.right_resolution.content = new_optimal_path(idx(args,1)(), false);
+                      conflict.right_resolution.rename = file_path_external(idx(args,2));
+                    }
+                  else
+                    {
+                      E(false, origin::user,
+                        F(conflict_resolution_not_supported_msg) % idx(args,0) % "dropped_modified");
+                    }
+                  return;
+                }
+              break;
+
+            case resolve_conflicts::right_side:
+              E(conflict.right_nid == the_null_node, origin::user,
+                F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
+
+              // the right side stays dropped; we either drop, keep or replace the left side
+              if (conflict.left_resolution.resolution == resolve_conflicts::none)
+                {
+                  if ("drop" == idx(args,0)())
+                    {
+                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
+
+                      conflict.left_resolution.resolution = resolve_conflicts::drop;
+                    }
+                  else if ("keep" == idx(args,0)())
+                    {
+                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
+                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                      conflict.left_resolution.resolution  = resolve_conflicts::keep;
+                    }
+                  else if ("user" == idx(args,0)())
+                    {
+                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
+                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+                      conflict.left_resolution.resolution  = resolve_conflicts::content_user;
+                      conflict.left_resolution.content = new_optimal_path(idx(args,1)(), false);
+                    }
+                  else if ("rename" == idx(args,0)())
+                    {
+                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
+
+                      conflict.left_resolution.resolution  = resolve_conflicts::rename;
+                      conflict.left_resolution.rename = file_path_external(idx(args,1));
+                    }
+                  else if ("user_rename" == idx(args,0)())
+                    {
+                      E(args.size() == 3, origin::user, F("wrong number of arguments"));
+
+                      conflict.left_resolution.resolution  = resolve_conflicts::content_user_rename;
+                      conflict.left_resolution.content = new_optimal_path(idx(args,1)(), false);
+                      conflict.left_resolution.rename = file_path_external(idx(args,2));
+                    }
+                  else
+                    {
+                      E(false, origin::user,
+                        F(conflict_resolution_not_supported_msg) % idx(args,0) % "dropped_modified");
+                    }
+                  return;
+                }
+              break;
+            }
+        }
+
       for (std::vector<file_content_conflict>::iterator i = conflicts.result.file_content_conflicts.begin();
            i != conflicts.result.file_content_conflicts.end();
            ++i)
         {
           file_content_conflict & conflict = *i;
 
-          if (conflict.resolution.first == resolve_conflicts::none)
+          if (conflict.resolution.resolution == resolve_conflicts::none)
             {
               if ("interactive" == idx(args,0)())
                 {
@@ -396,8 +708,8 @@ set_first_conflict(database & db,
                   if (do_interactive_merge(db, lua, conflicts, conflict.nid,
                                            conflict.ancestor, conflict.left, conflict.right, result_path))
                     {
-                      conflict.resolution.first  = resolve_conflicts::content_user;
-                      conflict.resolution.second = boost::shared_ptr<any_path>(new bookkeeping_path(result_path));
+                      conflict.resolution.resolution  = resolve_conflicts::content_user;
+                      conflict.resolution.content = boost::shared_ptr<any_path>(new bookkeeping_path(result_path));
                       P(F("interactive merge result saved in '%s'") % result_path.as_internal());
                     }
                   else
@@ -407,8 +719,8 @@ set_first_conflict(database & db,
                 {
                   E(args.size() == 2, origin::user, F("wrong number of arguments"));
 
-                  conflict.resolution.first  = resolve_conflicts::content_user;
-                  conflict.resolution.second = new_optimal_path(idx(args,1)(), false);
+                  conflict.resolution.resolution  = resolve_conflicts::content_user;
+                  conflict.resolution.content = new_optimal_path(idx(args,1)(), false);
                 }
               else
                 {
============================================================
--- src/cmd_db.cc	ad043207d9a5014f8137a23782b36a97dc9fc4c0
+++ src/cmd_db.cc	6bc1764d38063b0f5a23dd490f02786daafad0b7
@@ -461,7 +461,7 @@ CMD(register_workspace, "register_worksp
     throw usage(execid);
 
   E(args.size() == 1 || workspace::found, origin::user,
-    F("No workspace given"));
+    F("no workspace given"));
 
   system_path workspace;
   if (args.size() == 1)
@@ -483,7 +483,7 @@ CMD(unregister_workspace, "unregister_wo
     throw usage(execid);
 
   E(args.size() == 1 || workspace::found, origin::user,
-    F("No workspace given"));
+    F("no workspace given"));
 
   system_path workspace;
   if (args.size() == 1)
@@ -627,7 +627,7 @@ CMD_HIDDEN(load_revisions, "load_revisio
 // loading revisions is relatively fast
 
 CMD_HIDDEN(load_revisions, "load_revisions", "", CMD_REF(db), "",
-    N_("load all revisions from the database"),
+    N_("Load all revisions from the database"),
     N_("This command loads all revisions from the database and is "
        "intended to be used for timing revision loading performance."),
     options::opts::none)
@@ -656,7 +656,7 @@ CMD_HIDDEN(load_rosters, "load_rosters",
 // loading rosters is slow compared with files, revisions or certs
 
 CMD_HIDDEN(load_rosters, "load_rosters", "", CMD_REF(db), "",
-    N_("load all roster versions from the database"),
+    N_("Load all roster versions from the database"),
     N_("This command loads all roster versions from the database and is "
        "intended to be used for timing roster reconstruction performance."),
     options::opts::none)
@@ -684,7 +684,7 @@ CMD_HIDDEN(load_files, "load_files", "",
 // loading files is slower than revisions but faster than rosters
 
 CMD_HIDDEN(load_files, "load_files", "", CMD_REF(db), "",
-    N_("load all file versions from the database"),
+    N_("Load all file versions from the database"),
     N_("This command loads all files versions from the database and is "
        "intended to be used for timing file reconstruction performance."),
     options::opts::none)
@@ -710,7 +710,7 @@ CMD_HIDDEN(load_certs, "load_certs", "",
 // loading certs is fast
 
 CMD_HIDDEN(load_certs, "load_certs", "", CMD_REF(db), "",
-    N_("load all certs from the database"),
+    N_("Load all certs from the database"),
     N_("This command loads all certs from the database and is "
        "intended to be used for timing cert loading performance."),
     options::opts::none)
============================================================
--- src/cmd_diff_log.cc	b24dffb0470d057fa1e91ccc5a81627b40252e78
+++ src/cmd_diff_log.cc	73c7b3cba5a9e1af54ff98b44863c631289bfed4
@@ -1,4 +1,4 @@
-// Copyright (C) 2009, 2010 Stephen Leake <address@hidden>
+// Copyright (C) 2009, 2010, 2012 Stephen Leake <address@hidden>
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -32,6 +32,7 @@
 #include "database.hh"
 #include "work.hh"
 #include "roster.hh"
+#include "vocab_cast.hh"
 
 using std::cout;
 using std::make_pair;
@@ -66,6 +67,7 @@ dump_diff(lua_hooks & lua,
           file_path const & left_path, file_path const & right_path,
           file_id const left_id, file_id const right_id,
           data const & left_data, data const & right_data,
+          bool is_manual_merge,
           diff_type const diff_format,
           bool external_diff_args_given,
           string external_diff_args,
@@ -74,9 +76,7 @@ dump_diff(lua_hooks & lua,
 {
   if (diff_format == external_diff)
     {
-      bool is_binary = false;
-      if (guess_binary(left_data()) || guess_binary(right_data()))
-        is_binary = true;
+      bool is_binary = is_manual_merge || guess_binary(left_data()) || guess_binary(right_data());
 
       file_path path = right_path;
       if (path.empty()) // use the left path for deletes
@@ -111,6 +111,7 @@ dump_diff(lua_hooks & lua,
       make_diff(left, right,
                 left_id, right_id,
                 left_data, right_data,
+                is_manual_merge,
                 output, diff_format, encloser);
     }
 
@@ -119,8 +120,9 @@ struct diff_node_data
 {
   file_path left_path;
   file_path right_path;
-  file_id left_id;
-  file_id right_id;
+  file_id   left_id;
+  file_id   right_id;
+  bool      is_manual_merge;
 };
 
 static void
@@ -139,6 +141,7 @@ dump_diffs(lua_hooks & lua,
   // Put all node data in a multimap with the file path of the node as key
   // which gets automatically sorted. For removed nodes the file path is
   // the left_path, for added, patched and renamed nodes it is the right_path.
+  attr_key manual_merge_key = typecast_vocab<attr_key>(utf8("mtn:manual_merge"));
   std::multimap<file_path, diff_node_data> path_node_data;
   parallel::iter<node_map> i(left_roster.all_nodes(), right_roster.all_nodes());
   while (i.next())
@@ -160,6 +163,8 @@ dump_diffs(lua_hooks & lua,
               dat.left_id = downcast_to_file_t(i.left_data())->content;
               // right_id is null
 
+              dat.is_manual_merge = (i.left_data()->attrs.find(manual_merge_key) != i.left_data()->attrs.end());
+
               path_node_data.insert(make_pair(dat.left_path, dat));
           }
           break;
@@ -175,6 +180,8 @@ dump_diffs(lua_hooks & lua,
               // left_id is null
               dat.right_id = downcast_to_file_t(i.right_data())->content;
 
+              dat.is_manual_merge = (i.right_data()->attrs.find(manual_merge_key) != i.right_data()->attrs.end());
+
               path_node_data.insert(make_pair(dat.right_path, dat));
             }
           break;
@@ -193,6 +200,10 @@ dump_diffs(lua_hooks & lua,
               left_roster.get_name(i.left_key(), dat.left_path);
               right_roster.get_name(i.right_key(), dat.right_path);
 
+              dat.is_manual_merge =
+                (i.left_data()->attrs.find(manual_merge_key) != i.left_data()->attrs.end()) or
+                (i.right_data()->attrs.find(manual_merge_key) != i.right_data()->attrs.end());
+
               path_node_data.insert(make_pair(dat.right_path, dat));
             }
           break;
@@ -219,6 +230,7 @@ dump_diffs(lua_hooks & lua,
                 dat.left_path, dat.right_path,
                 dat.left_id, dat.right_id,
                 left_data, right_data,
+                dat.is_manual_merge,
                 diff_format, external_diff_args_given, external_diff_args,
                 encloser, output);
     }
@@ -369,6 +381,9 @@ prepare_diff(app_state & app,
 
       old_from_db = true;
       new_from_db = true;
+
+      header << "# old_revision [" << r_old_id << "]\n";
+      header << "# new_revision [" << r_new_id << "]\n";
     }
   else
     {
============================================================
--- src/cmd_files.cc	f15378efd25e597762776ad6e9c6f78c1a4ff191
+++ src/cmd_files.cc	35ef41ea62233513fe1aa54cedf8c70ade96973a
@@ -132,6 +132,7 @@ CMD(fdiff, "fdiff", "", CMD_REF(debug), 
   make_diff(src_name, dst_name,
             src_id, dst_id,
             src.inner(), dst.inner(),
+            false, // is_manual_merge
             cout, app.opts.diff_format, pattern);
 }
 
============================================================
--- src/cmd_list.cc	5eee1fff3753df893cfc1325d362f6bc8445dd11
+++ src/cmd_list.cc	a0103f85cfb0c0e36fe33f3bad41e321cf1d5dcc
@@ -1,4 +1,5 @@
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
+// Copyright (C) 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -784,6 +785,7 @@ static void get_unknown_ignored(app_stat
 
 static void get_unknown_ignored(app_state & app,
                                 args_vector const & args,
+                                bool recurse,
                                 set<file_path> & unknown,
                                 set<file_path> & ignored)
 {
@@ -798,28 +800,36 @@ static void get_unknown_ignored(app_stat
   if (roots.empty())
     roots.push_back(file_path());
 
-  work.find_unknown_and_ignored(db, mask, roots, unknown, ignored);
+  work.find_unknown_and_ignored(db, mask, recurse, roots, unknown, ignored);
 }
 
+CMD_PRESET_OPTIONS(unknown)
+{
+  opts.recursive=true;
+}
 CMD(unknown, "unknown", "", CMD_REF(list), "[PATH]",
     N_("Lists workspace files that are unknown in the current branch"),
     "",
-    options::opts::depth | options::opts::exclude)
+    options::opts::depth | options::opts::exclude | options::opts::recursive)
 {
   set<file_path> unknown, _;
-  get_unknown_ignored(app, args, unknown, _);
+  get_unknown_ignored(app, args, app.opts.recursive, unknown, _);
 
   copy(unknown.begin(), unknown.end(),
        ostream_iterator<file_path>(cout, "\n"));
 }
 
+CMD_PRESET_OPTIONS(ignored)
+{
+  opts.recursive=true;
+}
 CMD(ignored, "ignored", "", CMD_REF(list), "[PATH]",
     N_("Lists workspace files that are ignored in the current branch"),
     "",
-    options::opts::depth | options::opts::exclude)
+    options::opts::depth | options::opts::exclude | options::opts::recursive)
 {
   set<file_path> _, ignored;
-  get_unknown_ignored(app, args, _, ignored);
+  get_unknown_ignored(app, args, app.opts.recursive, _, ignored);
 
   copy(ignored.begin(), ignored.end(),
        ostream_iterator<file_path>(cout, "\n"));
============================================================
--- src/cmd_merging.cc	84b177469ecb60664be23c42c38cc649d23899a7
+++ src/cmd_merging.cc	0a6aa03896408c4acdb7a1a9cd1682cb98c6f02a
@@ -1,5 +1,5 @@
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
-//               2008, 2010 Stephen Leake <address@hidden>
+//               2008, 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -329,7 +329,7 @@ update(app_state & app,
                                       left_markings, right_markings, paths);
   wca.cache_roster(working_rid, working_roster);
   resolve_merge_conflicts(app.lua, app.opts, *working_roster, chosen_roster,
-                          result, wca, false);
+                          result, wca, nis, false);
 
   // Make sure it worked...
   I(result.is_clean());
@@ -719,6 +719,7 @@ void perform_merge_into_dir(app_state & 
                      right_uncommon_ancestors,
                      result);
 
+        temp_node_id_source nis;
         content_merge_database_adaptor
           dba(db, left_rid, right_rid, left_marking_map, right_marking_map);
 
@@ -728,7 +729,7 @@ void perform_merge_into_dir(app_state & 
           (app.opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given);
 
         resolve_merge_conflicts(app.lua, app.opts, left_roster, right_roster,
-                                result, dba, resolutions_given);
+                                result, dba, nis, resolutions_given);
 
         {
           dir_t moved_root = left_roster.root();
@@ -872,10 +873,11 @@ CMD(merge_into_workspace, "merge_into_wo
   map<file_id, file_path> paths;
   get_content_paths(*working_roster, paths);
 
+  temp_node_id_source nis;
   content_merge_workspace_adaptor wca(db, lca_id, lca.first,
                                       *left.second, *right.second, paths);
   wca.cache_roster(working_rid, working_roster);
-  resolve_merge_conflicts(app.lua, app.opts, *left.first, *right.first, merge_result, wca, false);
+  resolve_merge_conflicts(app.lua, app.opts, *left.first, *right.first, merge_result, wca, nis, false);
 
   // Make sure it worked...
   I(merge_result.is_clean());
@@ -983,8 +985,8 @@ show_conflicts_core (database & db,
     }
   else
     {
-      P(F("[left]  %s") % l_id);
-      P(F("[right] %s") % r_id);
+      P(F("[left]     %s") % l_id);
+      P(F("[right]    %s") % r_id);
     }
 
   if (is_ancestor(db, l_id, r_id))
@@ -1046,12 +1048,17 @@ show_conflicts_core (database & db,
       content_merge_database_adaptor adaptor(db, l_id, r_id,
                                              l_marking, r_marking);
 
-      {
-        basic_io::printer pr;
-        st.push_binary_pair(syms::ancestor, adaptor.lca.inner());
-        pr.print_stanza(st);
-        output.write(pr.buf.data(), pr.buf.size());
-      }
+      if (basic_io)
+        {
+          basic_io::printer pr;
+          st.push_binary_pair(syms::ancestor, adaptor.lca.inner());
+          pr.print_stanza(st);
+          output.write(pr.buf.data(), pr.buf.size());
+        }
+      else
+        {
+          P(F("[ancestor] %s") % adaptor.lca);
+        }
 
       // The basic_io routines in roster_merge.cc access these rosters via
       // the adaptor.
@@ -1064,6 +1071,7 @@ show_conflicts_core (database & db,
 
       result.report_orphaned_node_conflicts(*l_roster, *r_roster, adaptor, basic_io, output);
       result.report_multiple_name_conflicts(*l_roster, *r_roster, adaptor, basic_io, output);
+      result.report_dropped_modified_conflicts(*l_roster, *r_roster, adaptor, basic_io, output);
       result.report_duplicate_name_conflicts(*l_roster, *r_roster, adaptor, basic_io, output);
 
       result.report_attribute_conflicts(*l_roster, *r_roster, adaptor, basic_io, output);
@@ -1404,7 +1412,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
   wca.cache_roster(to_rid, to_roster);
 
   resolve_merge_conflicts(app.lua, app.opts, *working_roster, *to_roster,
-                          result, wca, false);
+                          result, wca, nis, false);
 
   I(result.is_clean());
   // temporary node ids may appear
============================================================
--- src/cmd_netsync.cc	9dd8803cef465c834268105a42cc37dc282af520
+++ src/cmd_netsync.cc	88ca982ea191c22c88b490e87695b359754aff45
@@ -119,7 +119,7 @@ CMD_AUTOMATE_NO_STDIO(remote_stdio,
 
   if (!app.opts.dbname_given)
     {
-      W(F("No database given; assuming '%s' database. This means that\n"
+      W(F("no database given; assuming '%s' database. This means that\n"
           "we can't verify the server key, because we have no record of\n"
           "what it should be.")
           % memory_db_identifier);
@@ -222,7 +222,7 @@ CMD_AUTOMATE_NO_STDIO(remote,
 
   if (!app.opts.dbname_given)
     {
-      W(F("No database given; assuming '%s' database. This means that\n"
+      W(F("no database given; assuming '%s' database. This means that\n"
           "we can't verify the server key, because we have no record of\n"
           "what it should be.")
           % memory_db_identifier);
============================================================
--- src/cmd_ws_commit.cc	d9dbacb820c6d070c4952ee2b0f143e61e85631e
+++ src/cmd_ws_commit.cc	9c041c3ec231af27f63333af4ca73b69dfd9983c
@@ -1,4 +1,4 @@
-// Copyright (C) 2010, 2011 Stephen Leake <address@hidden>
+// Copyright (C) 2010, 2011, 2012 Stephen Leake <address@hidden>
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -530,9 +530,8 @@ revert(app_state & app,
   revision_t remaining;
   make_revision_for_workspace(parent_id(parents.begin()), preserved, remaining);
 
-  // Race.
   work.put_work_rev(remaining);
-  work.maybe_update_inodeprints(db);
+  work.maybe_update_inodeprints(db, mask);
 }
 
 CMD(revert, "revert", "", CMD_REF(workspace), N_("[PATH]..."),
@@ -670,6 +669,8 @@ CMD(disapprove, "disapprove", "", CMD_RE
   unsigned int old_head_size = heads.size();
 
   edge_entry const & old_edge (*rev.edges.begin());
+  E(!null_id(edge_old_revision(old_edge)), origin::user,
+    F("cannot disapprove root revision"));
   db.get_revision_manifest(edge_old_revision(old_edge),
                                rev_inverse.new_manifest);
   {
@@ -750,29 +751,38 @@ void perform_add(app_state & app,
                  workspace & work,
                  vector<file_path> roots)
 {
-  set<file_path> paths;
   bool add_recursive = app.opts.recursive;
   if (app.opts.unknown)
     {
       path_restriction mask(roots, args_to_paths(app.opts.exclude),
                             app.opts.depth, ignored_file(work));
+      set<file_path> unknown;
       set<file_path> ignored;
 
       // if no starting paths have been specified use the workspace root
       if (roots.empty())
         roots.push_back(file_path());
 
-      work.find_unknown_and_ignored(db, mask, roots, paths, ignored);
+      work.find_unknown_and_ignored(db, mask, add_recursive, roots, unknown, ignored);
 
-      work.perform_additions(db, ignored,
-                                 add_recursive, !app.opts.no_ignore);
+      // This does nothing unless --no-ignore is given
+      work.perform_additions(db, ignored, add_recursive, !app.opts.no_ignore);
+
+      // No need for recursion here; all paths to be added are explicit in unknown
+      work.perform_additions(db, unknown, false, true);
     }
   else
-    paths = set<file_path>(roots.begin(), roots.end());
-
-  work.perform_additions(db, paths, add_recursive, !app.opts.no_ignore);
+    {
+      // There are at most two roots in a workspace
+      set<file_path> paths = set<file_path>(roots.begin(), roots.end());
+      work.perform_additions(db, paths, add_recursive, !app.opts.no_ignore);
+    }
 }
 
+CMD_PRESET_OPTIONS(add)
+{
+  opts.recursive=false; // match 'ls unknown' and 'add --unknown --recursive'
+}
 CMD(add, "add", "", CMD_REF(workspace), N_("[PATH]..."),
     N_("Adds files to the workspace"),
     "",
@@ -1319,49 +1329,65 @@ CMD(attr_set, "set", "", CMD_REF(attr), 
 //   1: file / directory name
 // Added in: 1.0
 // Renamed from attributes to get_attributes in: 5.0
+// Changed to also work without a workspace in: 13.1
 // Purpose: Prints all attributes for the specified path
 // Output format: basic_io formatted output, each attribute has its own stanza:
 //
-// 'format_version'
-//         used in case this format ever needs to change.
-//         format: ('format_version', the string "1" currently)
-//         occurs: exactly once
 // 'attr'
 //         represents an attribute entry
 //         format: ('attr', name, value), ('state', [unchanged|changed|added|dropped])
 //         occurs: zero or more times
 //
-// Error conditions: If the path has no attributes, prints only the
-//                   format version, if the file is unknown, escalates
+// Error conditions: If the path has no attributes, prints nothing,
+//                   if the file is unknown, escalates
 CMD_AUTOMATE(get_attributes, N_("PATH"),
              N_("Prints all attributes for the specified path"),
-             "",
-             options::opts::none)
+             N_("If an explicit revision is given, the file's attributes "
+                "at this specific revision are returned."),
+             options::opts::revision)
 {
-  E(!args.empty(), origin::user,
+  E(args.size() == 1, origin::user,
     F("wrong argument count"));
 
+  file_path path = file_path_external(idx(args,0));
+
   database db(app);
-  workspace work(app);
+  roster_t current, base;
 
-  // retrieve the path
-  file_path path = file_path_external(idx(args,0));
+  bool from_database;
+  if (app.opts.revision.size() == 0)
+    {
+      from_database = false;
+      workspace work(app);
 
-  roster_t base, current;
-  parent_map parents;
-  temp_node_id_source nis;
+      parent_map parents;
+      temp_node_id_source nis;
 
-  // get the base and the current roster of this workspace
-  work.get_current_roster_shape(db, nis, current);
-  work.get_parent_rosters(db, parents);
-  E(parents.size() == 1, origin::user,
-    F("this command can only be used in a single-parent workspace"));
-  base = parent_roster(parents.begin());
+      // get the base and the current roster of this workspace
+      work.get_current_roster_shape(db, nis, current);
+      work.get_parent_rosters(db, parents);
+      E(parents.size() == 1, origin::user,
+        F("this command can only be used in a single-parent workspace"));
+      base = parent_roster(parents.begin());
 
-  E(current.has_node(path), origin::user,
-    F("unknown path '%s'") % path);
+      E(current.has_node(path), origin::user,
+        F("unknown path '%s'") % path);
+    }
+  else if (app.opts.revision.size() == 1)
+    {
+      from_database = true;
+      revision_id rid;
 
-  // create the printer
+      project_t project(db);
+      complete(app.opts, app.lua, project, idx(app.opts.revision, 0)(), rid);
+      db.get_roster(rid, current);
+
+      E(current.has_node(path), origin::user,
+        F("unknown path '%s' in %s") % path % rid);
+    }
+  else
+    E(false, origin::user, F("none or only one revision must be given"));
+
   basic_io::printer pr;
 
   // the current node holds all current attributes (unchanged and new ones)
@@ -1370,62 +1396,72 @@ CMD_AUTOMATE(get_attributes, N_("PATH"),
        i != n->attrs.end(); ++i)
   {
     std::string value(i->second.second());
-    std::string state;
+    std::string state = "unchanged";
 
-    // if if the first value of the value pair is false this marks a
-    // dropped attribute
-    if (!i->second.first)
+    if (!from_database)
       {
-        // if the attribute is dropped, we should have a base roster
-        // with that node. we need to check that for the attribute as well
-        // because if it is dropped there as well it was already deleted
-        // in any previous revision
-        I(base.has_node(path));
+        // if the first value of the value pair is false this marks a
+        // dropped attribute
+        if (!i->second.first)
+          {
+            // if the attribute is dropped, we should have a base roster
+            // with that node. we need to check that for the attribute as well
+            // because if it is dropped there as well it was already deleted
+            // in any previous revision
+            I(base.has_node(path));
 
-        const_node_t prev_node = base.get_node(path);
+            const_node_t prev_node = base.get_node(path);
 
-        // find the attribute in there
-        attr_map_t::const_iterator j = prev_node->attrs.find(i->first);
-        I(j != prev_node->attrs.end());
+            // find the attribute in there
+            attr_map_t::const_iterator j = prev_node->attrs.find(i->first);
+            I(j != prev_node->attrs.end());
 
-        // was this dropped before? then ignore it
-        if (!j->second.first) { continue; }
+            // was this dropped before? then ignore it
+            if (!j->second.first) { continue; }
 
-        state = "dropped";
-        // output the previous (dropped) value later
-        value = j->second.second();
-      }
-    // this marks either a new or an existing attribute
-    else
-      {
-        if (base.has_node(path))
+            state = "dropped";
+            // output the previous (dropped) value later
+            value = j->second.second();
+          }
+        // this marks either a new or an existing attribute
+        else
           {
-            const_node_t prev_node = base.get_node(path);
-            attr_map_t::const_iterator j =
-              prev_node->attrs.find(i->first);
+            if (base.has_node(path))
+              {
+                const_node_t prev_node = base.get_node(path);
+                attr_map_t::const_iterator j =
+                  prev_node->attrs.find(i->first);
 
-            // the attribute is new if it either hasn't been found
-            // in the previous roster or has been deleted there
-            if (j == prev_node->attrs.end() || !j->second.first)
-              {
-                state = "added";
+                // the attribute is new if it either hasn't been found
+                // in the previous roster or has been deleted there
+                if (j == prev_node->attrs.end() || !j->second.first)
+                  {
+                    state = "added";
+                  }
+                // check if the attribute's value has been changed
+                else if (i->second.second() != j->second.second())
+                  {
+                    state = "changed";
+                  }
+                else
+                  {
+                    state = "unchanged";
+                  }
               }
-            // check if the attribute's value has been changed
-            else if (i->second.second() != j->second.second())
-              {
-                state = "changed";
-              }
+            // its added since the whole node has been just added
             else
               {
-                state = "unchanged";
+                state = "added";
               }
           }
-        // its added since the whole node has been just added
-        else
-          {
-            state = "added";
-          }
       }
+    else
+      {
+        // skip previously dropped attributes in database mode, because that
+        // has meaning only in uncommitted workspaces.
+        if (!i->second.first)
+          continue;
+      }
 
     basic_io::stanza st;
     st.push_str_triple(basic_io::syms::attr, i->first(), value);
@@ -1773,7 +1809,7 @@ void perform_commit(app_state & app,
       % prog_name);
   }
 
-  work.maybe_update_inodeprints(db);
+  work.maybe_update_inodeprints(db, mask);
 
   {
     // Tell lua what happened. Yes, we might lose some information
============================================================
--- src/database.cc	ec58501c63bd6ba1b75c59f9111a4d26e0d4f19e
+++ src/database.cc	87efeeff2d3263ba98af684a4022f1897434ed2d
@@ -2527,7 +2527,7 @@ database::put_file_version(file_id const
                            delta_direction() == "both");
   if (!make_reverse_deltas && !make_forward_deltas)
     {
-      W(F("Unknown delta direction '%s'; assuming 'reverse'. Valid "
+      W(F("unknown delta direction '%s'; assuming 'reverse'. Valid "
           "values are 'reverse', 'forward', 'both'.") % delta_direction);
       make_reverse_deltas = true;
     }
@@ -3425,9 +3425,8 @@ database::encrypt_rsa(key_id const & pub
   rsa_pub_key pub;
   get_key(pub_id, pub);
 
-  SecureVector<Botan::byte> pub_block;
-  pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()),
-                pub().size());
+  SecureVector<Botan::byte> pub_block
+    (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size());
 
   shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block));
   shared_ptr<RSA_PublicKey> pub_key
@@ -3471,14 +3470,13 @@ database::check_signature(key_id const &
   else
     {
       rsa_pub_key pub;
-      SecureVector<Botan::byte> pub_block;
 
       if (!public_key_exists(id))
         return cert_unknown;
 
       get_key(id, pub);
-      pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()),
-                    pub().size());
+      SecureVector<Botan::byte> pub_block
+        (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size());
 
       L(FL("building verifier for %d-byte pub key") % pub_block.size());
       shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block));
@@ -3486,7 +3484,7 @@ database::check_signature(key_id const &
         = boost::shared_dynamic_cast<RSA_PublicKey>(x509_key);
 
       E(pub_key, id.inner().made_from,
-        F("Failed to get RSA verifying key for %s") % id);
+        F("failed to get RSA verifying key for %s") % id);
 
       verifier.reset(get_pk_verifier(*pub_key, "EMSA3(SHA-1)"));
 
@@ -3625,7 +3623,7 @@ database_impl::oldstyle_results_to_certs
           k_id = key_id(key_res[0][0], origin::database);
         else
           E(false, origin::database,
-            F("Your database contains multiple keys named '%s'") % k_name);
+            F("your database contains multiple keys named '%s'") % k_name);
       }
 
       rsa_sha1_signature sig(res[i][4], origin::database);
============================================================
--- src/database_check.cc	b926df22bc2ec6134600d55072462c9a3df1b8b3
+++ src/database_check.cc	b5c6eb77f74e421e2ad7f86702cf1b49cc38aa22
@@ -1182,14 +1182,14 @@ check_db(database & db)
     extra_branches + bad_branches + missing_branches;
 
   // unreferenced files and rosters and mismatched certs are not actually
-  // serious errors; odd, but nothing will break.
+  // serious errors; odd, but nothing will break. Similarly, missing and
+  // mismatched certs are not serious errors.
   size_t serious = missing_files + missing_or_invalid_file_sizes +
     incomplete_rosters + missing_rosters +
     missing_revisions + incomplete_revisions +
     non_parseable_revisions + non_normalized_revisions +
     mismatched_parents + mismatched_children + manifest_mismatch +
     bad_history +
-    missing_certs +
     unchecked_sigs + bad_sigs +
     missing_keys +
     missing_heights + duplicate_heights + incorrect_heights+
============================================================
--- src/diff_output.cc	8df7c0bec2e64275f6c8e8b6ccb035c8fd0f684f
+++ src/diff_output.cc	78be17ba28d6f26930b6ee36f04b4382450b912b
@@ -1,5 +1,5 @@
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
-//               2008 Stephen Leake <address@hidden>
+//               2008, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -469,11 +469,12 @@ make_diff(string const & filename1,
           file_id const & id2,
           data const & data1,
           data const & data2,
+          bool is_manual_merge,
           ostream & ost,
           diff_type type,
           string const & pattern)
 {
-  if (guess_binary(data1()) || guess_binary(data2()))
+  if (is_manual_merge || guess_binary(data1()) || guess_binary(data2()))
     {
       // If a file has been removed, filename2 will be "/dev/null".
       // It doesn't make sense to output that.
============================================================
--- src/diff_output.hh	9125ccd0d0fa725782c9910b5f34e844048d2da8
+++ src/diff_output.hh	905c550857ce361fd3e0da69840fd95860cc7874
@@ -1,5 +1,5 @@
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
-//               2008 Stephen Leake <address@hidden>
+//               2008, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -22,6 +22,7 @@ void make_diff(std::string const & filen
                file_id const & id2,
                data const & data1,
                data const & data2,
+               bool is_manual_merge,
                std::ostream & ost,
                diff_type type,
                std::string const & pattern);
============================================================
--- src/file_io.cc	3a9cd566f250de51fefd41368c4fc1aaa1e85896
+++ src/file_io.cc	76874e5ca4978bd0fd3ba183cd19edc3447ece0d
@@ -300,7 +300,7 @@ read_data_stdin(data & dat)
 {
   static bool have_consumed_stdin = false;
   E(!have_consumed_stdin, origin::user,
-    F("Cannot read standard input multiple times"));
+    F("cannot read standard input multiple times"));
   have_consumed_stdin = true;
   unfiltered_pipe->start_msg();
   cin >> *unfiltered_pipe;
============================================================
--- src/gzip.cc	e7c19bee910e3d421fd073933810ec52092b1d9b
+++ src/gzip.cc	9da41f6820cdf39707b22c716e3682e0fa0fd745
@@ -110,7 +110,7 @@ Gzip_Compression::Gzip_Compression(u32bi
    if(deflateInit2(&(zlib->stream), level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) != Z_OK)
       {
       delete zlib; zlib = 0;
-      throw Exception("Gzip_Compression: Memory allocation error");
+      throw Memory_Exhaustion();
       }
    }
 
@@ -137,7 +137,7 @@ void Gzip_Compression::start_msg()
 /*************************************************
 * Compress Input with Gzip                       *
 *************************************************/
-void Gzip_Compression::write(const byte input[], u32bit length)
+void Gzip_Compression::write(const byte input[], filter_length_t length)
    {
 
    count += length;
@@ -152,7 +152,7 @@ void Gzip_Compression::write(const byte 
       zlib->stream.avail_out = buffer.size();
       int rc = deflate(&(zlib->stream), Z_NO_FLUSH);
       if (rc != Z_OK && rc != Z_STREAM_END)
-         throw Exception("Internal error in Gzip_Compression deflate.");
+         throw Invalid_State("Internal error in Gzip_Compression deflate.");
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       }
    }
@@ -172,7 +172,7 @@ void Gzip_Compression::end_msg()
       zlib->stream.avail_out = buffer.size();
       rc = deflate(&(zlib->stream), Z_FINISH);
       if (rc != Z_OK && rc != Z_STREAM_END)
-         throw Exception("Internal error in Gzip_Compression finishing deflate.");
+         throw Invalid_State("Internal error in Gzip_Compression finishing deflate.");
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       }
 
@@ -228,7 +228,7 @@ Gzip_Decompression::Gzip_Decompression()
    no_writes(true), pipe(new Hash_Filter("CRC32")), footer(0)
    {
    if (DEFAULT_BUFFERSIZE < sizeof(GZIP::GZIP_HEADER))
-      throw Exception("DEFAULT_BUFFERSIZE is too small");
+      throw Decoding_Error("DEFAULT_BUFFERSIZE is too small");
 
    zlib = new Zlib_Stream;
 
@@ -237,7 +237,7 @@ Gzip_Decompression::Gzip_Decompression()
    if(inflateInit2(&(zlib->stream), -15) != Z_OK)
       {
       delete zlib; zlib = 0;
-      throw Exception("Gzip_Decompression: Memory allocation error");
+      throw Memory_Exhaustion();
       }
    }
 
@@ -256,7 +256,7 @@ void Gzip_Decompression::start_msg()
 void Gzip_Decompression::start_msg()
    {
    if (!no_writes)
-      throw Exception("Gzip_Decompression: start_msg after already writing");
+      throw Decoding_Error("Gzip_Decompression: start_msg after already writing");
 
    pipe.start_msg();
    datacount = 0;
@@ -267,7 +267,7 @@ void Gzip_Decompression::start_msg()
 /*************************************************
 * Decompress Input with Gzip                     *
 *************************************************/
-void Gzip_Decompression::write(const byte input[], u32bit length)
+void Gzip_Decompression::write(const byte input[], filter_length_t length)
    {
    if(length) no_writes = false;
 
@@ -277,15 +277,16 @@ void Gzip_Decompression::write(const byt
          u32bit eat_len = eat_footer(input, length);
          input += eat_len;
          length -= eat_len;
-         if (length == 0)
-            return;
       }
 
+   if (length == 0)
+     return;
+
    // Check the gzip header
    if (pos < sizeof(GZIP::GZIP_HEADER))
       {
-      u32bit len = std::min((u32bit)sizeof(GZIP::GZIP_HEADER)-pos, length);
-      u32bit cmplen = len;
+      filter_length_t len = std::min((filter_length_t)sizeof(GZIP::GZIP_HEADER)-pos, length);
+      filter_length_t cmplen = len;
       // The last byte is the OS flag - we don't care about that
       if (pos + len - 1 >= GZIP::HEADER_POS_OS)
          cmplen--;
@@ -317,8 +318,8 @@ void Gzip_Decompression::write(const byt
          if(rc == Z_NEED_DICT)
             throw Decoding_Error("Gzip_Decompression: Need preset dictionary");
          if(rc == Z_MEM_ERROR)
-            throw Exception("Gzip_Decompression: Memory allocation error");
-         throw Exception("Gzip_Decompression: Unknown decompress error");
+            throw Memory_Exhaustion();
+         throw Decoding_Error("Gzip_Decompression: Unknown decompress error");
          }
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       pipe.write(buffer.begin(), buffer.size() - zlib->stream.avail_out);
@@ -346,8 +347,14 @@ u32bit Gzip_Decompression::eat_footer(co
       if (footer.size() >= GZIP::FOOTER_LENGTH)
          throw Decoding_Error("Gzip_Decompression: Data integrity error in footer");
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      size_t eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(),
+                                static_cast<size_t>(length));
+      footer += std::make_pair(input, eat_len);
+#else
       u32bit eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(), length);
       footer.append(input, eat_len);
+#endif
 
       if (footer.size() == GZIP::FOOTER_LENGTH)
          {
@@ -364,7 +371,7 @@ void Gzip_Decompression::check_footer()
 void Gzip_Decompression::check_footer()
    {
    if (footer.size() != GZIP::FOOTER_LENGTH)
-      throw Exception("Gzip_Decompression: Error finalizing decompression");
+      throw Decoding_Error("Gzip_Decompression: Error finalizing decompression");
 
    pipe.end_msg();
 
@@ -377,7 +384,12 @@ void Gzip_Decompression::check_footer()
   for (int i = 0; i < 4; i++)
      buf[3-i] = tmpbuf[i];
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+  tmpbuf.resize(4);
+  tmpbuf.copy(footer.begin(), 4);
+#else
   tmpbuf.set(footer.begin(), 4);
+#endif
   if (buf != tmpbuf)
       throw Decoding_Error("Gzip_Decompression: Data integrity error - CRC32 error");
 
@@ -400,7 +412,7 @@ void Gzip_Decompression::end_msg()
    // read, clear() will reset no_writes
    if(no_writes) return;
 
-   throw Exception("Gzip_Decompression: didn't find footer");
+   throw Decoding_Error("Gzip_Decompression: didn't find footer");
 
    }
 
@@ -412,7 +424,11 @@ void Gzip_Decompression::clear()
    no_writes = true;
    inflateReset(&(zlib->stream));
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+   footer.clear();
+#else
    footer.destroy();
+#endif
    pos = 0;
    datacount = 0;
    }
============================================================
--- src/gzip.hh	649dfc0b250954f39c0f73870f8bec3f32f7fa43
+++ src/gzip.hh	17093f66e365b3730a49ef1910295f622972c36e
@@ -7,11 +7,25 @@
 #ifndef BOTAN_EXT_GZIP_H__
 #define BOTAN_EXT_GZIP_H__
 
+#include <botan/version.h>
 #include <botan/filter.h>
 #include <botan/pipe.h>
 
 namespace Botan {
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,12) && \
+  BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
+// Botan versions between 1.7.12 and 1.9.3 (including) keep their
+// Memory_Exception private. Give this gzip implementation something
+// compatible to work with.
+class Memory_Exhaustion : public Exception
+{
+public:
+  Memory_Exhaustion() :
+    Exception("Ran out of memory, allocation failed") {}
+};
+#endif
+
 namespace GZIP {
 
    /* A basic header - we only need to set the IDs and compression method */
@@ -30,13 +44,19 @@ namespace GZIP {
 
 }
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+typedef size_t filter_length_t;
+#else
+typedef u32bit filter_length_t;
+#endif
+
 /*************************************************
 * Gzip Compression Filter                        *
 *************************************************/
 class Gzip_Compression : public Filter
    {
    public:
-      void write(const byte input[], u32bit length);
+      void write(const byte input[], filter_length_t length);
       void start_msg();
       void end_msg();
       std::string name() const { return "Gzip_Compression"; }
@@ -60,7 +80,7 @@ class Gzip_Decompression : public Filter
 class Gzip_Decompression : public Filter
    {
    public:
-      void write(const byte input[], u32bit length);
+      void write(const byte input[], filter_length_t length);
       void start_msg();
       void end_msg();
       std::string name() const { return "Gzip_Decompression"; }
============================================================
--- src/key_packet.cc	d1306df89dd684badac02c03744cd446381c07d3
+++ src/key_packet.cc	c97262d161b23c9640972188979669b3e95afe7b
@@ -106,8 +106,8 @@ namespace
     void validate_public_key_data(string const & name, string const & keydata) const
     {
       string decoded = decode_base64_as<string>(keydata, origin::user);
-      Botan::SecureVector<Botan::byte> key_block;
-      key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
+      Botan::SecureVector<Botan::byte> key_block
+        (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
       try
         {
           Botan::X509::load_key(key_block);
============================================================
--- src/key_store.cc	64c4c4bed1fadc26b51207b9f61343f9dd7d3c6e
+++ src/key_store.cc	b7859345f7c665914d16357409bdff24a48b7996
@@ -572,13 +572,21 @@ key_store_state::decrypt_private_key(key
   try // with empty passphrase
     {
       Botan::DataSource_Memory ds(kp.priv());
-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI()));
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
       pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), ""));
 #else
       pkcs8_key.reset(Botan::PKCS8::load_key(ds, ""));
 #endif
     }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+  catch (Passphrase_Required & e)
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+  catch (Botan::Invalid_Argument & e)
+#else
   catch (Botan::Exception & e)
+#endif
     {
       L(FL("failed to load key with no passphrase: %s") % e.what());
 
@@ -605,13 +613,18 @@ key_store_state::decrypt_private_key(key
           {
             Botan::DataSource_Memory ds(kp.priv());
 #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
-            pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), phrase()));
+            pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(),
+                                                   phrase()));
 #else
             pkcs8_key.reset(Botan::PKCS8::load_key(ds, phrase()));
 #endif
             break;
           }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+        catch (Botan::Invalid_Argument)
+#else
         catch (Botan::Exception & e)
+#endif
           {
             cycles++;
             L(FL("decrypt_private_key: failure %d to load encrypted key: %s")
@@ -822,10 +835,14 @@ key_store::decrypt_rsa(key_id const & id
       plaintext = string(reinterpret_cast<char const*>(plain.begin()),
                          plain.size());
     }
-  catch (Botan::Exception & ex)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+  catch (std::exception & e)
+#else
+  catch (Botan::Exception & e)
+#endif
     {
       E(false, ciphertext.made_from,
-        F("Botan error decrypting data: '%s'") % ex.what());
+        F("Botan error decrypting data: '%s'") % e.what());
     }
 }
 
@@ -856,9 +873,9 @@ key_store::make_signature(database & db,
     {
       if (agent.connected()) {
         //grab the monotone public key as an RSA_PublicKey
-        SecureVector<Botan::byte> pub_block;
-        pub_block.set(reinterpret_cast<Botan::byte const *>(key.pub().data()),
-                      key.pub().size());
+        SecureVector<Botan::byte> pub_block
+          (reinterpret_cast<Botan::byte const *>(key.pub().data()),
+           key.pub().size());
         L(FL("make_signature: building %d-byte pub key") % pub_block.size());
         shared_ptr<X509_PublicKey> x509_key =
           shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block));
@@ -1031,8 +1048,14 @@ key_store_state::migrate_old_key_pair
   for (;;)
     try
       {
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+        arc4_key.resize(phrase().size());
+        arc4_key.copy(reinterpret_cast<Botan::byte const *>(phrase().data()),
+                      phrase().size());
+#else
         arc4_key.set(reinterpret_cast<Botan::byte const *>(phrase().data()),
                      phrase().size());
+#endif
 
         Pipe arc4_decryptor(get_cipher("ARC4", arc4_key, Botan::DECRYPTION));
 
@@ -1051,7 +1074,11 @@ key_store_state::migrate_old_key_pair
 #endif
         break;
       }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+    catch (Botan::Invalid_Argument & e)
+#else
     catch (Botan::Exception & e)
+#endif
       {
         L(FL("migrate_old_key_pair: failure %d to load old private key: %s")
           % cycles % e.what());
============================================================
--- src/lua.cc	bb919b7d41842bcc07c2d7c442ef415f7978a83b
+++ src/lua.cc	6787dcbd552c2c8772e511dcd12b8f682868c0b3
@@ -44,7 +44,11 @@ dump_stack(lua_State * st)
     switch (t) {
     case LUA_TSTRING:  /* strings */
       out += '`';
+#ifdef lua_strlen
       out += string(lua_tostring(st, i), lua_strlen(st, i));
+#else
+      out += string(lua_tostring(st, i), lua_rawlen(st, i));
+#endif
       out += '\'';
       break;
 
@@ -95,7 +99,11 @@ Lua::report_error()
 Lua::report_error()
 {
 //  I(lua_isstring(st, -1));
+#ifdef lua_strlen
   string err = string(lua_tostring(st, -1), lua_strlen(st, -1));
+#else
+  string err = string(lua_tostring(st, -1), lua_rawlen(st, -1));
+#endif
   W(i18n_format("%s") % err);
   L(FL("lua stack: %s") % dump_stack(st));
   lua_pop(st, 1);
@@ -107,7 +115,11 @@ Lua::check_stack(int count)
 {
   if (!lua_checkstack(st, count))
     {
+#ifdef LUAI_MAXCSTACK
       fail((FL("lua stack limit '%d' reached") % LUAI_MAXCSTACK).str());
+#else
+      fail((FL("lua stack limit '%d' reached") % LUAI_MAXSTACK).str());
+#endif
       return false;
     }
   return true;
@@ -119,17 +131,27 @@ Lua::get(int idx)
 Lua::get(int idx)
 {
   if (failed) return *this;
-  if (!lua_istable (st, idx))
+  if (lua_gettop (st) < 1)
     {
-      fail("istable() in get");
+      fail("stack top > 0 in get");
       return *this;
     }
-  if (lua_gettop (st) < 1)
+  if (idx)
     {
-      fail("stack top > 0 in get");
-      return *this;
+      if (!lua_istable (st, idx))
+        {
+          fail("istable() in get");
+          return *this;
+        }
+      lua_gettable(st, idx);
     }
-  lua_gettable(st, idx);
+  else
+    {
+      string name;
+      extract_str(name);
+      pop();
+      lua_getglobal(st, name.c_str());
+    }
   return *this;
 }
 
@@ -194,7 +216,11 @@ Lua::extract_str_nolog(string & str)
       fail("isstring() in extract_str");
       return *this;
     }
+#ifdef lua_strlen
   str = string(lua_tostring(st, -1), lua_strlen(st, -1));
+#else
+  str = string(lua_tostring(st, -1), lua_rawlen(st, -1));
+#endif
   return *this;
 }
 
@@ -460,7 +486,7 @@ void add_functions(lua_State * st)
         {
           lua_newtable(st);
           lua_pushvalue(st, -1);
-          lua_setfield(st, LUA_GLOBALSINDEX, table.c_str());
+          lua_setglobal(st, table.c_str());
         }
       for (luaext::fmap::const_iterator j = i->second.begin();
            j != i->second.end(); ++j)
@@ -589,7 +615,7 @@ run_directory(lua_State * st, char const
   switch (get_path_status(path))
     {
     case path::nonexistent:
-      E(false, origin::user, F("Directory '%s' does not exist") % pathstr);
+      E(false, origin::user, F("directory '%s' does not exist") % pathstr);
     case path::file:
       E(false, origin::user, F("'%s' is not a directory") % pathstr);
     case path::directory:
============================================================
--- src/lua.hh	146872f14cc23c6179c37bcda8667a0ecd178826
+++ src/lua.hh	4396421e2bb335241ce33c29a53aeffd3ebf7380
@@ -37,13 +37,13 @@ Lua
   void report_error();
   bool check_stack(int count);
 
-  // getters
-  Lua & get(int idx = LUA_GLOBALSINDEX);
-  Lua & get_fn(int idx = LUA_GLOBALSINDEX);
-  Lua & get_tab(int idx = LUA_GLOBALSINDEX);
-  Lua & get_str(int idx = LUA_GLOBALSINDEX);
-  Lua & get_num(int idx = LUA_GLOBALSINDEX);
-  Lua & get_bool(int idx = LUA_GLOBALSINDEX);
+  // getters (0 is an invalid index in lua, and is used here to represent the global table)
+  Lua & get(int idx = 0);
+  Lua & get_fn(int idx = 0);
+  Lua & get_tab(int idx = 0);
+  Lua & get_str(int idx = 0);
+  Lua & get_num(int idx = 0);
+  Lua & get_bool(int idx = 0);
 
   // extractors
   Lua & extract_str_nolog(std::string & str);
============================================================
--- src/luaext_parse_basic_io.cc	995b37d3cc3eb58a3c6be6db06e38f997ba6845e
+++ src/luaext_parse_basic_io.cc	f7a89950b6355b57d24ccf12331c7e2beae686bd
@@ -23,7 +23,11 @@ LUAEXT(parse_basic_io, )
   // followed by one or more string or hex values. It returns a table of
   // lines.
   vector<pair<string, vector<string> > > res;
+#ifdef lua_strlen
   const string str(luaL_checkstring(LS, -1), lua_strlen(LS, -1));
+#else
+  const string str(luaL_checkstring(LS, -1), lua_rawlen(LS, -1));
+#endif
   basic_io::input_source in(str, "monotone_parse_basic_io_for_lua");
   in.made_from = origin::user;
   basic_io::tokenizer tok(in);
============================================================
--- src/luaext_platform.cc	288a571d7c91fbb4abffb66611b52aac74889aa2
+++ src/luaext_platform.cc	135278a8a971333575a0d8c92ed5d93262723cc7
@@ -118,7 +118,10 @@ static FILE **newfile (lua_State *LS) {
   lua_setmetatable(LS, -2);
 
   lua_pushcfunction(LS, io_fclose);
+#ifdef LUA_ENVIRONINDEX
+  // Lua 5.2 removes C function environments
   lua_setfield(LS, LUA_ENVIRONINDEX, "__close");
+#endif
 
   return pf;
 }
============================================================
--- src/merge_conflict.cc	1c09dc4a20532ce040c429d7fb5ed2a25a199856
+++ src/merge_conflict.cc	b47a70720f836809f06347360ee91ddf587b5721
@@ -1,5 +1,5 @@
-// Copyright (C) 2005 Nathaniel Smith <address@hidden>
-//               2008, 2009 Stephen Leake <address@hidden>
+// Copyright (C) 2005, 2012 Nathaniel Smith <address@hidden>
+//               2008, 2009, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -50,6 +50,7 @@ namespace
     symbol const conflict("conflict");
     symbol const content("content");
     symbol const directory_loop("directory_loop");
+    symbol const dropped_modified("dropped_modified");
     symbol const duplicate_name("duplicate_name");
     symbol const invalid_name("invalid_name");
     symbol const left("left");
@@ -57,6 +58,7 @@ namespace
     symbol const left_attr_value("left_attr_value");
     symbol const left_file_id("left_file_id");
     symbol const left_name("left_name");
+    symbol const left_rev("left_rev");
     symbol const left_type("left_type");
     symbol const missing_root("missing_root");
     symbol const multiple_names("multiple_names");
@@ -77,17 +79,16 @@ namespace
     symbol const right_attr_value("right_attr_value");
     symbol const right_file_id("right_file_id");
     symbol const right_name("right_name");
+    symbol const right_rev("right_rev");
     symbol const right_type("right_type");
   }
 }
 
 namespace resolve_conflicts
 {
-  shared_ptr<any_path>
-  new_file_path(string path)
+  file_path file_path_external(string path)
   {
-    return shared_ptr<any_path>
-      (new file_path(file_path_external(utf8(path, origin::user))));
+    return file_path_external(utf8(path, origin::user));
   };
 }
 
@@ -393,19 +394,17 @@ put_attr_conflict (basic_io::stanza & st
     }
 }
 
-enum side_t {left_side, right_side};
-
 static void
-put_resolution(basic_io::stanza & st,
-               side_t side,
-               resolve_conflicts::file_resolution_t const & resolution)
+put_file_resolution(basic_io::stanza &                           st,
+                    resolve_conflicts::side_t                    side,
+                    resolve_conflicts::file_resolution_t const & resolution)
 {
   // We output any resolution for any conflict; only valid resolutions
   // should get into the data structures. To enforce that, when reading
   // resolutions from files we check that the resolution is valid for the
   // conflict. Hence there is no read_resolution.
 
-  switch (resolution.first)
+  switch (resolution.resolution)
     {
     case resolve_conflicts::none:
       break;
@@ -413,16 +412,31 @@ put_resolution(basic_io::stanza & st,
     case resolve_conflicts::content_user:
       switch (side)
         {
-        case left_side:
-          st.push_str_pair(syms::resolved_user_left, resolution.second->as_external());
+        case resolve_conflicts::left_side:
+          st.push_str_pair(syms::resolved_user_left, resolution.content->as_external());
           break;
 
-        case right_side:
-          st.push_str_pair(syms::resolved_user_right, resolution.second->as_external());
+        case resolve_conflicts::right_side:
+          st.push_str_pair(syms::resolved_user_right, resolution.content->as_external());
           break;
         }
       break;
 
+    case resolve_conflicts::content_user_rename:
+      switch (side)
+        {
+        case resolve_conflicts::left_side:
+          st.push_str_pair(syms::resolved_user_left, resolution.content->as_external());
+          st.push_str_pair(syms::resolved_rename_left, resolution.rename.as_external());
+          break;
+
+        case resolve_conflicts::right_side:
+          st.push_str_pair(syms::resolved_user_right, resolution.content->as_external());
+          st.push_str_pair(syms::resolved_rename_right, resolution.rename.as_external());
+          break;
+        }
+      break;
+
     case resolve_conflicts::content_internal:
       st.push_symbol(syms::resolved_internal);
       break;
@@ -430,12 +444,12 @@ put_resolution(basic_io::stanza & st,
     case resolve_conflicts::rename:
       switch (side)
         {
-        case left_side:
-          st.push_str_pair(syms::resolved_rename_left, resolution.second->as_external());
+        case resolve_conflicts::left_side:
+          st.push_str_pair(syms::resolved_rename_left, resolution.rename.as_external());
           break;
 
-        case right_side:
-          st.push_str_pair(syms::resolved_rename_right, resolution.second->as_external());
+        case resolve_conflicts::right_side:
+          st.push_str_pair(syms::resolved_rename_right, resolution.rename.as_external());
           break;
         }
       break;
@@ -443,11 +457,11 @@ put_resolution(basic_io::stanza & st,
     case resolve_conflicts::drop:
       switch (side)
         {
-        case left_side:
+        case resolve_conflicts::left_side:
           st.push_symbol(syms::resolved_drop_left);
           break;
 
-        case right_side:
+        case resolve_conflicts::right_side:
           st.push_symbol(syms::resolved_drop_right);
           break;
         }
@@ -456,11 +470,11 @@ put_resolution(basic_io::stanza & st,
     case resolve_conflicts::keep:
       switch (side)
         {
-        case left_side:
+        case resolve_conflicts::left_side:
           st.push_symbol(syms::resolved_keep_left);
           break;
 
-        case right_side:
+        case resolve_conflicts::right_side:
           st.push_symbol(syms::resolved_keep_right);
           break;
         }
@@ -518,7 +532,7 @@ put_content_conflict (basic_io::stanza &
       st.push_file_pair(syms::left_name, left_name);
       st.push_file_pair(syms::right_name, right_name);
     }
-  put_resolution (st, left_side, conflict.resolution);
+  put_file_resolution (st, resolve_conflicts::left_side, conflict.resolution);
 }
 
 static void
@@ -984,7 +998,7 @@ roster_merge_result::report_orphaned_nod
 
       if (basic_io)
         {
-          put_resolution (st, left_side, conflict.resolution);
+          put_file_resolution (st, resolve_conflicts::left_side, conflict.resolution);
           put_stanza (st, output);
         }
     }
@@ -1047,7 +1061,224 @@ roster_merge_result::report_multiple_nam
     }
 }
 
+void static
+push_dropped_details(content_merge_database_adaptor & db_adaptor,
+                     symbol                           rev_sym,
+                     symbol                           name_sym,
+                     symbol                           file_id_sym,
+                     revision_id                      rev_id,
+                     node_id                          nid,
+                     basic_io::stanza &               st)
+{
+  revision_id dropped_rev_id;
+  file_path   dropped_name;
+  file_id     dropped_file_id;
+  db_adaptor.get_dropped_details(rev_id, nid, dropped_rev_id, dropped_name, dropped_file_id);
+
+  st.push_binary_pair(rev_sym, dropped_rev_id.inner());
+  st.push_str_pair(name_sym, dropped_name.as_external());
+  st.push_binary_pair(file_id_sym, dropped_file_id.inner());
+}
+
 void
+roster_merge_result::report_dropped_modified_conflicts(roster_t const & left_roster,
+                                                       roster_t const & right_roster,
+                                                       content_merge_adaptor & adaptor,
+                                                       const bool basic_io,
+                                                       std::ostream & output) const
+{
+  MM(left_roster);
+  MM(right_roster);
+
+  for (size_t i = 0; i < dropped_modified_conflicts.size(); ++i)
+    {
+      dropped_modified_conflict const & conflict = dropped_modified_conflicts[i];
+      MM(conflict);
+
+      node_id nid;
+      file_path modified_name;
+
+      switch (conflict.dropped_side)
+        {
+        case resolve_conflicts::left_side:
+          I(!roster.is_attached(conflict.right_nid));
+
+          nid = conflict.right_nid;
+          right_roster.get_name(conflict.right_nid, modified_name);
+          break;
+
+        case resolve_conflicts::right_side:
+          I(!roster.is_attached(conflict.left_nid));
+
+          nid = conflict.left_nid;
+          left_roster.get_name(conflict.left_nid, modified_name);
+          break;
+        }
+
+      shared_ptr<roster_t const> lca_roster;
+      revision_id lca_rid;
+      file_path ancestor_name;
+
+      adaptor.get_ancestral_roster(nid, lca_rid, lca_roster);
+      lca_roster->get_name(nid, ancestor_name);
+
+      if (basic_io)
+        {
+          basic_io::stanza st;
+
+          content_merge_database_adaptor & db_adaptor (dynamic_cast<content_merge_database_adaptor &>(adaptor));
+          file_id fid;
+
+          st.push_str_pair(syms::conflict, syms::dropped_modified);
+          st.push_str_pair(syms::ancestor_name, ancestor_name.as_external());
+          db_adaptor.db.get_file_content (db_adaptor.lca, nid, fid);
+          st.push_binary_pair(syms::ancestor_file_id, fid.inner());
+
+          switch (conflict.dropped_side)
+            {
+            case resolve_conflicts::left_side:
+              if (conflict.orphaned)
+                {
+                   st.push_str_pair(syms::left_type, "orphaned file");
+                   push_dropped_details(db_adaptor, syms::left_rev, syms::left_name, syms::left_file_id,
+                                        db_adaptor.left_rid, nid, st);
+                }
+              else
+                {
+                  if (conflict.left_nid == the_null_node)
+                    {
+                      st.push_str_pair(syms::left_type, "dropped file");
+                      push_dropped_details(db_adaptor, syms::left_rev, syms::left_name, syms::left_file_id,
+                                           db_adaptor.left_rid, nid, st);
+                    }
+                  else
+                    {
+                      st.push_str_pair(syms::left_type, "recreated file");
+                      st.push_str_pair(syms::left_name, modified_name.as_external());
+                      db_adaptor.db.get_file_content (db_adaptor.left_rid, conflict.left_nid, fid);
+                      st.push_binary_pair(syms::left_file_id, fid.inner());
+                    }
+                }
+
+              st.push_str_pair(syms::right_type, "modified file");
+              st.push_str_pair(syms::right_name, modified_name.as_external());
+              db_adaptor.db.get_file_content (db_adaptor.right_rid, nid, fid);
+              st.push_binary_pair(syms::right_file_id, fid.inner());
+              break;
+
+            case resolve_conflicts::right_side:
+              st.push_str_pair(syms::left_type, "modified file");
+              st.push_str_pair(syms::left_name, modified_name.as_external());
+              db_adaptor.db.get_file_content (db_adaptor.left_rid, nid, fid);
+              st.push_binary_pair(syms::left_file_id, fid.inner());
+
+              if (conflict.orphaned)
+                {
+                  st.push_str_pair(syms::right_type, "orphaned file");
+                  push_dropped_details(db_adaptor, syms::right_rev, syms::right_name, syms::right_file_id,
+                                       db_adaptor.right_rid, nid, st);
+                }
+              else
+                {
+                  if (conflict.right_nid == the_null_node)
+                    {
+                      st.push_str_pair(syms::right_type, "dropped file");
+                      push_dropped_details(db_adaptor, syms::right_rev, syms::right_name, syms::right_file_id,
+                                           db_adaptor.right_rid, nid, st);
+                    }
+                  else
+                    {
+                      st.push_str_pair(syms::right_type, "recreated file");
+                      st.push_str_pair(syms::right_name, modified_name.as_external());
+                      db_adaptor.db.get_file_content (db_adaptor.right_rid, conflict.right_nid, fid);
+                      st.push_binary_pair(syms::right_file_id, fid.inner());
+                    }
+                }
+              break;
+            }
+
+          put_file_resolution (st, resolve_conflicts::left_side, conflict.left_resolution);
+          put_file_resolution (st, resolve_conflicts::right_side, conflict.right_resolution);
+
+          put_stanza(st, output);
+        }
+      else
+        {
+          P(F("conflict: file '%s'") % ancestor_name);
+          switch (conflict.dropped_side)
+            {
+            case resolve_conflicts::left_side:
+              if (conflict.orphaned)
+                {
+                  P(F("orphaned on the left"));
+                }
+              else
+                {
+                  if (conflict.left_nid == the_null_node)
+                    P(F("dropped on the left"));
+                  else
+                    P(F("dropped and recreated on the left"));
+                }
+              P(F("modified on the right, named %s") % modified_name);
+              break;
+
+            case resolve_conflicts::right_side:
+              P(F("modified on the left, named %s") % modified_name);
+              if (conflict.orphaned)
+                {
+                  P(F("orphaned on the right"));
+                }
+              else
+                {
+                  if (conflict.right_nid == the_null_node)
+                    P(F("dropped on the right"));
+                  else
+                    P(F("dropped and recreated on the right"));
+                }
+              break;
+            }
+
+          // We can have a resolution from a mtn:resolve_conflict attribute
+          // (so far, that only supports drop).
+          switch (conflict.left_resolution.resolution)
+            {
+            case resolve_conflicts::none:
+              break;
+
+            case resolve_conflicts::content_user:
+            case resolve_conflicts::content_user_rename:
+            case resolve_conflicts::rename:
+            case resolve_conflicts::keep:
+            case resolve_conflicts::content_internal:
+              I(false);
+              break;
+
+            case resolve_conflicts::drop:
+              P(F("left_resolution: drop"));
+              break;
+            }
+          switch (conflict.right_resolution.resolution)
+            {
+            case resolve_conflicts::none:
+              break;
+
+            case resolve_conflicts::content_user:
+            case resolve_conflicts::content_user_rename:
+            case resolve_conflicts::rename:
+            case resolve_conflicts::keep:
+            case resolve_conflicts::content_internal:
+              I(false);
+              break;
+
+            case resolve_conflicts::drop:
+              P(F("right_resolution: drop"));
+              break;
+            }
+        }
+    }
+}
+
+void
 roster_merge_result::report_duplicate_name_conflicts(roster_t const & left_roster,
                                                      roster_t const & right_roster,
                                                      content_merge_adaptor & adaptor,
@@ -1221,8 +1452,8 @@ roster_merge_result::report_duplicate_na
 
       if (basic_io)
         {
-          put_resolution (st, left_side, conflict.left_resolution);
-          put_resolution (st, right_side, conflict.right_resolution);
+          put_file_resolution (st, resolve_conflicts::left_side, conflict.left_resolution);
+          put_file_resolution (st, resolve_conflicts::right_side, conflict.right_resolution);
           put_stanza(st, output);
         }
     }
@@ -1398,9 +1629,9 @@ roster_merge_result::report_file_content
         {
           basic_io::stanza st;
 
-          if (conflict.resolution.first == resolve_conflicts::none)
+          if (conflict.resolution.resolution == resolve_conflicts::none)
             if (auto_merge_succeeds(lua, conflict, adaptor, left_roster, right_roster))
-              conflict.resolution.first = resolve_conflicts::content_internal;
+              conflict.resolution.resolution = resolve_conflicts::content_internal;
 
           st.push_str_pair(syms::conflict, syms::content);
           put_content_conflict (st, left_roster, right_roster, adaptor, conflict);
@@ -1482,6 +1713,7 @@ static char const * const conflict_resol
 
 static char const * const conflicts_mismatch_msg = N_("conflicts file does not match current conflicts");
 static char const * const conflict_resolution_not_supported_msg = N_("%s is not a supported conflict resolution for %s");
+static char const * const history_lost_msg = N_("history for '%s' from %s will be lost; see user manual Merge Conflicts section");
 static char const * const conflict_extra = N_("extra chars at end of conflict");
 
 static void
@@ -1641,14 +1873,14 @@ read_orphaned_node_conflict(basic_io::pa
     {
       if (pars.symp (syms::resolved_drop_left))
         {
-          conflict.resolution.first = resolve_conflicts::drop;
+          conflict.resolution.resolution = resolve_conflicts::drop;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_rename_left))
         {
-          conflict.resolution.first = resolve_conflicts::rename;
+          conflict.resolution.resolution = resolve_conflicts::rename;
           pars.sym();
-          conflict.resolution.second = new_optimal_path(pars.token, true);
+          conflict.resolution.rename = resolve_conflicts::file_path_external(pars.token);
           pars.str();
         }
       else
@@ -1749,6 +1981,241 @@ static void
 } // read_multiple_name_conflicts
 
 static void
+read_dropped_modified_conflict(basic_io::parser &          pars,
+                               dropped_modified_conflict & conflict,
+                               revision_id                 left_rid,
+                               roster_t const &            left_roster,
+                               revision_id                 right_rid,
+                               roster_t const &            right_roster)
+{
+  string tmp;
+
+  pars.esym(syms::ancestor_name); pars.str();
+  pars.esym(syms::ancestor_file_id); pars.hex();
+
+  pars.esym(syms::left_type);
+  pars.str(tmp);
+
+  if (tmp == "dropped file")
+    {
+      conflict.dropped_side = resolve_conflicts::left_side;
+
+      pars.esym(syms::left_rev); pars.hex(tmp);
+      conflict.left_rid = decode_hexenc_as<revision_id>(tmp, pars.tok.in.made_from);
+      pars.esym(syms::left_name); pars.str();
+      pars.esym(syms::left_file_id); pars.hex();
+    }
+  else if (tmp == "orphaned file")
+    {
+      conflict.dropped_side = resolve_conflicts::left_side;
+      conflict.orphaned = true;
+
+      pars.esym(syms::left_rev); pars.hex(tmp);
+      conflict.left_rid = decode_hexenc_as<revision_id>(tmp, pars.tok.in.made_from);
+      pars.esym(syms::left_name); pars.str();
+      pars.esym(syms::left_file_id); pars.hex();
+    }
+  else if (tmp == "recreated file")
+    {
+      conflict.dropped_side = resolve_conflicts::left_side;
+      conflict.left_rid = left_rid;
+
+      pars.esym(syms::left_name); pars.str(tmp);
+      conflict.left_nid = left_roster.get_node(resolve_conflicts::file_path_external(tmp))->self;
+      pars.esym(syms::left_file_id); pars.hex();
+    }
+  else if (tmp == "modified file")
+    {
+      conflict.left_rid = left_rid;
+
+      pars.esym(syms::left_name); pars.str(tmp);
+      conflict.left_nid = left_roster.get_node(resolve_conflicts::file_path_external(tmp))->self;
+      pars.esym(syms::left_file_id); pars.hex();
+    }
+  else
+    I(false);
+
+  pars.esym(syms::right_type);
+  pars.str(tmp);
+
+  if (tmp == "dropped file")
+    {
+      conflict.dropped_side = resolve_conflicts::right_side;
+
+      pars.esym(syms::right_rev); pars.hex(tmp);
+      conflict.right_rid = decode_hexenc_as<revision_id>(tmp, pars.tok.in.made_from);
+      pars.esym(syms::right_name); pars.str();
+      pars.esym(syms::right_file_id); pars.hex();
+    }
+  else if (tmp == "orphaned file")
+    {
+      conflict.dropped_side = resolve_conflicts::right_side;
+      conflict.orphaned = true;
+
+      pars.esym(syms::right_rev); pars.hex(tmp);
+      conflict.right_rid = decode_hexenc_as<revision_id>(tmp, pars.tok.in.made_from);
+      pars.esym(syms::right_name); pars.str();
+      pars.esym(syms::right_file_id); pars.hex();
+    }
+  else if (tmp == "recreated file")
+    {
+      conflict.dropped_side = resolve_conflicts::right_side;
+      conflict.right_rid = right_rid;
+
+      pars.esym(syms::right_name); pars.str(tmp);
+      conflict.right_nid = right_roster.get_node(resolve_conflicts::file_path_external(tmp))->self;
+      pars.esym(syms::right_file_id); pars.hex();
+    }
+  else if (tmp == "modified file")
+    {
+      conflict.right_rid = right_rid;
+
+      pars.esym(syms::right_name); pars.str(tmp);
+      conflict.right_nid = right_roster.get_node(resolve_conflicts::file_path_external(tmp))->self;
+      pars.esym(syms::right_file_id); pars.hex();
+    }
+  else
+    I(false);
+
+  // check for resolutions
+  while ((!pars.symp (syms::conflict)) && pars.tok.in.lookahead != EOF)
+    {
+      if (pars.symp (syms::resolved_drop_left))
+        {
+          conflict.left_resolution.resolution = resolve_conflicts::drop;
+          pars.sym();
+        }
+      else if (pars.symp (syms::resolved_drop_right))
+        {
+          conflict.right_resolution.resolution = resolve_conflicts::drop;
+          pars.sym();
+        }
+      else if (pars.symp (syms::resolved_keep_left))
+        {
+          E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+          conflict.left_resolution.resolution = resolve_conflicts::keep;
+          pars.sym();
+        }
+      else if (pars.symp (syms::resolved_keep_right))
+        {
+          E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
+
+          conflict.right_resolution.resolution = resolve_conflicts::keep;
+          pars.sym();
+        }
+      else if (pars.symp (syms::resolved_rename_left))
+        {
+          if (conflict.left_resolution.resolution == resolve_conflicts::content_user)
+            conflict.left_resolution.resolution = resolve_conflicts::content_user_rename;
+          else
+            conflict.left_resolution.resolution = resolve_conflicts::rename;
+          pars.sym();
+          conflict.left_resolution.rename = resolve_conflicts::file_path_external(pars.token);
+          pars.str();
+        }
+      else if (pars.symp (syms::resolved_rename_right))
+        {
+          if (conflict.right_resolution.resolution == resolve_conflicts::content_user)
+            conflict.right_resolution.resolution = resolve_conflicts::content_user_rename;
+          else
+            conflict.right_resolution.resolution = resolve_conflicts::rename;
+          pars.sym();
+          conflict.right_resolution.rename = resolve_conflicts::file_path_external(pars.token);
+          pars.str();
+        }
+      else if (pars.symp (syms::resolved_user_left))
+        {
+          if (conflict.left_resolution.resolution == resolve_conflicts::rename)
+            conflict.left_resolution.resolution = resolve_conflicts::content_user_rename;
+          else
+            conflict.left_resolution.resolution = resolve_conflicts::content_user;
+          pars.sym();
+          conflict.left_resolution.content = new_optimal_path(pars.token, false);
+          pars.str();
+        }
+      else if (pars.symp (syms::resolved_user_right))
+        {
+          if (conflict.right_resolution.resolution == resolve_conflicts::rename)
+            conflict.right_resolution.resolution = resolve_conflicts::content_user_rename;
+          else
+            conflict.right_resolution.resolution = resolve_conflicts::content_user;
+          pars.sym();
+          conflict.right_resolution.content = new_optimal_path(pars.token, false);
+          pars.str();
+        }
+      else
+        E(false, origin::user,
+          F(conflict_resolution_not_supported_msg) % pars.token % "dropped_modified");
+    }
+} // read_dropped_modified_conflict
+
+static void
+read_dropped_modified_conflicts(basic_io::parser &                       pars,
+                                std::vector<dropped_modified_conflict> & conflicts,
+                                revision_id                              left_rid,
+                                roster_t const &                         left_roster,
+                                revision_id                              right_rid,
+                                roster_t const &                         right_roster)
+{
+  while (pars.tok.in.lookahead != EOF && pars.symp(syms::dropped_modified))
+    {
+      dropped_modified_conflict conflict;
+
+      pars.sym();
+
+      read_dropped_modified_conflict(pars, conflict, left_rid, left_roster, right_rid, right_roster);
+
+      conflicts.push_back(conflict);
+
+      if (pars.tok.in.lookahead != EOF)
+        pars.esym (syms::conflict);
+    }
+} // read_dropped_modified_conflicts
+
+static void
+validate_dropped_modified_conflicts(basic_io::parser &                       pars,
+                                    std::vector<dropped_modified_conflict> & conflicts,
+                                    revision_id                              left_rid,
+                                    roster_t const &                         left_roster,
+                                    revision_id                              right_rid,
+                                    roster_t const &                         right_roster)
+{
+  for (std::vector<dropped_modified_conflict>::iterator i = conflicts.begin();
+       i != conflicts.end();
+       ++i)
+    {
+      dropped_modified_conflict & merge_conflict = *i;
+      dropped_modified_conflict file_conflict (the_null_node, the_null_node);
+
+      pars.esym(syms::dropped_modified);
+
+      read_dropped_modified_conflict(pars, file_conflict, left_rid, left_roster, right_rid, right_roster);
+
+      // Note that we do not confirm the file ids.
+      E(merge_conflict.dropped_side == file_conflict.dropped_side &&
+        merge_conflict.left_nid == file_conflict.left_nid &&
+        merge_conflict.right_nid == file_conflict.right_nid,
+        origin::user,
+        F(conflicts_mismatch_msg));
+
+      merge_conflict.left_rid         = file_conflict.left_rid;
+      merge_conflict.right_rid        = file_conflict.right_rid;
+      merge_conflict.left_resolution  = file_conflict.left_resolution;
+      merge_conflict.right_resolution = file_conflict.right_resolution;
+
+      if (pars.tok.in.lookahead != EOF)
+        pars.esym (syms::conflict);
+      else
+        {
+          std::vector<dropped_modified_conflict>::iterator tmp = i;
+          E(++tmp == conflicts.end(), origin::user,
+             F(conflicts_mismatch_msg));
+        }
+    }
+} // validate_dropped_modified_conflicts
+
+static void
 read_duplicate_name_conflict(basic_io::parser & pars,
                              duplicate_name_conflict & conflict,
                              roster_t const & left_roster,
@@ -1762,50 +2229,50 @@ read_duplicate_name_conflict(basic_io::p
     {
       if (pars.symp (syms::resolved_drop_left))
         {
-          conflict.left_resolution.first = resolve_conflicts::drop;
+          conflict.left_resolution.resolution = resolve_conflicts::drop;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_drop_right))
         {
-          conflict.right_resolution.first = resolve_conflicts::drop;
+          conflict.right_resolution.resolution = resolve_conflicts::drop;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_keep_left))
         {
-          conflict.left_resolution.first = resolve_conflicts::keep;
+          conflict.left_resolution.resolution = resolve_conflicts::keep;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_keep_right))
         {
-          conflict.right_resolution.first = resolve_conflicts::keep;
+          conflict.right_resolution.resolution = resolve_conflicts::keep;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_rename_left))
         {
-          conflict.left_resolution.first = resolve_conflicts::rename;
+          conflict.left_resolution.resolution = resolve_conflicts::rename;
           pars.sym();
-          conflict.left_resolution.second = resolve_conflicts::new_file_path(pars.token);
+          conflict.left_resolution.rename = resolve_conflicts::file_path_external(pars.token);
           pars.str();
         }
       else if (pars.symp (syms::resolved_rename_right))
         {
-          conflict.right_resolution.first = resolve_conflicts::rename;
+          conflict.right_resolution.resolution = resolve_conflicts::rename;
           pars.sym();
-          conflict.right_resolution.second = resolve_conflicts::new_file_path(pars.token);
+          conflict.right_resolution.rename = resolve_conflicts::file_path_external(pars.token);
           pars.str();
         }
       else if (pars.symp (syms::resolved_user_left))
         {
-          conflict.left_resolution.first = resolve_conflicts::content_user;
+          conflict.left_resolution.resolution = resolve_conflicts::content_user;
           pars.sym();
-          conflict.left_resolution.second = new_optimal_path(pars.token, true);
+          conflict.left_resolution.content = new_optimal_path(pars.token, true);
           pars.str();
         }
       else if (pars.symp (syms::resolved_user_right))
         {
-          conflict.right_resolution.first = resolve_conflicts::content_user;
+          conflict.right_resolution.resolution = resolve_conflicts::content_user;
           pars.sym();
-          conflict.right_resolution.second = new_optimal_path(pars.token, true);
+          conflict.right_resolution.content = new_optimal_path(pars.token, true);
           pars.str();
         }
       else
@@ -2010,14 +2477,14 @@ read_file_content_conflict(basic_io::par
     {
       if (pars.symp (syms::resolved_internal))
         {
-          conflict.resolution.first = resolve_conflicts::content_internal;
+          conflict.resolution.resolution = resolve_conflicts::content_internal;
           pars.sym();
         }
       else if (pars.symp (syms::resolved_user_left))
         {
-          conflict.resolution.first = resolve_conflicts::content_user;
+          conflict.resolution.resolution = resolve_conflicts::content_user;
           pars.sym();
-          conflict.resolution.second = new_optimal_path(pars.token, true);
+          conflict.resolution.content = new_optimal_path(pars.token, true);
           pars.str();
         }
       else
@@ -2083,7 +2550,9 @@ read_conflict_file_core(basic_io::parser
 
 static void
 read_conflict_file_core(basic_io::parser pars,
+                        revision_id left_rid,
                         roster_t const & left_roster,
+                        revision_id right_rid,
                         roster_t const & right_roster,
                         roster_merge_result & result,
                         bool validate)
@@ -2110,6 +2579,8 @@ read_conflict_file_core(basic_io::parser
       // order as non-validate, below.
 
       validate_orphaned_node_conflicts(pars, result.orphaned_node_conflicts, left_roster, right_roster);
+      validate_dropped_modified_conflicts
+        (pars, result.dropped_modified_conflicts, left_rid, left_roster, right_rid, right_roster);
       validate_duplicate_name_conflicts(pars, result.duplicate_name_conflicts, left_roster, right_roster);
       validate_file_content_conflicts(pars, result.file_content_conflicts, left_roster, right_roster);
     }
@@ -2122,6 +2593,8 @@ read_conflict_file_core(basic_io::parser
       read_directory_loop_conflicts(pars, result.directory_loop_conflicts, left_roster, right_roster);
       read_orphaned_node_conflicts(pars, result.orphaned_node_conflicts, left_roster, right_roster);
       read_multiple_name_conflicts(pars, result.multiple_name_conflicts, left_roster, right_roster);
+      read_dropped_modified_conflicts
+        (pars, result.dropped_modified_conflicts, left_rid, left_roster, right_rid, right_roster);
       read_duplicate_name_conflicts(pars, result.duplicate_name_conflicts, left_roster, right_roster);
       read_attribute_conflicts(pars, result.attribute_conflicts, left_roster, right_roster);
       read_file_content_conflicts(pars, result.file_content_conflicts, left_roster, right_roster);
@@ -2171,7 +2644,7 @@ roster_merge_result::read_conflict_file(
       db.get_roster(left_rid, left_roster, left_marking);
       db.get_roster(right_rid, right_roster, right_marking);
 
-      read_conflict_file_core(pars, left_roster, right_roster, *this, false);
+      read_conflict_file_core(pars, left_rid, left_roster, right_rid, right_roster, *this, false);
     }
   // else no conflicts
 
@@ -2212,6 +2685,7 @@ roster_merge_result::write_conflict_file
   report_directory_loop_conflicts(*left_roster, *right_roster, adaptor, true, output);
   report_orphaned_node_conflicts(*left_roster, *right_roster, adaptor, true, output);
   report_multiple_name_conflicts(*left_roster, *right_roster, adaptor, true, output);
+  report_dropped_modified_conflicts(*left_roster, *right_roster, adaptor, true, output);
   report_duplicate_name_conflicts(*left_roster, *right_roster, adaptor, true, output);
   report_attribute_conflicts(*left_roster, *right_roster, adaptor, true, output);
   report_file_content_conflicts(lua, *left_roster, *right_roster, adaptor, true, output);
@@ -2234,6 +2708,13 @@ parse_resolve_conflicts_opts (options co
     {
       resolutions_given = true;
 
+      if (!file_exists(system_path(opts.resolve_conflicts_file)))
+        {
+          // user may specify --resolve-conflicts to enable attr
+          // mtn:resolve_conflict, without _MTN/conflicts.
+          return;
+        }
+
       data dat;
 
       read_data (system_path(opts.resolve_conflicts_file), dat);
@@ -2261,9 +2742,12 @@ parse_resolve_conflicts_opts (options co
           pars.sym();
           pars.hex(temp);
 
+          read_conflict_file_core (pars, left_rid, left_roster, right_rid, right_roster, result, true);
+        }
+      else
+        {
           // if there is no ancestor revision, then left is an ancestor of
           // right, or vice versa, and there can be no conflicts.
-          read_conflict_file_core (pars, left_roster, right_roster, result, true);
         }
     }
   else
@@ -2328,7 +2812,7 @@ roster_merge_result::resolve_orphaned_no
           right_roster.get_name(conflict.nid, name);
         }
 
-      switch (conflict.resolution.first)
+      switch (conflict.resolution.resolution)
         {
         case resolve_conflicts::drop:
           if (is_dir_t(roster.get_node(conflict.nid)))
@@ -2342,9 +2826,8 @@ roster_merge_result::resolve_orphaned_no
           break;
 
         case resolve_conflicts::rename:
-          P(F("renaming '%s' to '%s'") % name % *conflict.resolution.second);
-          attach_node
-            (lua, roster, conflict.nid, file_path_internal (conflict.resolution.second->as_internal()));
+          P(F("renaming '%s' to '%s'") % name % conflict.resolution.rename);
+          attach_node (lua, roster, conflict.nid, conflict.resolution.rename);
           break;
 
         case resolve_conflicts::none:
@@ -2361,7 +2844,319 @@ roster_merge_result::resolve_orphaned_no
   orphaned_node_conflicts.clear();
 }
 
+static node_id
+create_new_node(roster_t const &            parent_roster,
+                string const &              side_image,
+                node_id const &             parent_nid,
+                roster_t &                  result_roster,
+                boost::shared_ptr<any_path> new_content,
+                content_merge_adaptor &     adaptor,
+                temp_node_id_source &       nis)
+{
+  file_path parent_name;
+  file_id   parent_fid;
+  file_data parent_data;
+
+  parent_roster.get_file_details(parent_nid, parent_fid, parent_name);
+  adaptor.get_version(parent_fid, parent_data);
+
+  P(F("replacing content of '%s' from %s with '%s'") % parent_name % side_image % new_content->as_external());
+
+  P(F(history_lost_msg) % parent_name % side_image);
+
+  data result_raw_data;
+  read_data(*new_content, result_raw_data);
+
+  file_data result_data = file_data(result_raw_data);
+  file_id result_fid;
+  calculate_ident(result_data, result_fid);
+
+  // User could specify no changes in content
+  if (result_fid != parent_fid)
+    {
+      adaptor.record_file(parent_fid, result_fid, parent_data, result_data);
+    }
+
+  return result_roster.create_file_node(result_fid, nis);
+}
+
 static void
+replace_content(roster_t const &            parent_roster,
+                string const &              side_image,
+                node_id  const &            nid,
+                roster_t &                  result_roster,
+                boost::shared_ptr<any_path> new_content,
+                content_merge_adaptor &     adaptor)
+{
+  file_path parent_name;
+  file_id   parent_fid;
+
+  parent_roster.get_file_details(nid, parent_fid, parent_name);
+
+  P(F("replacing content of '%s' from %s with '%s'") % parent_name % side_image % new_content->as_external());
+
+  file_data parent_data;
+  adaptor.get_version(parent_fid, parent_data);
+
+  data result_raw_data;
+  read_data(*new_content, result_raw_data);
+
+  file_data result_data = file_data(result_raw_data);
+  file_id result_fid;
+  calculate_ident(result_data, result_fid);
+
+  file_t result_node = downcast_to_file_t(result_roster.get_node_for_update(nid));
+  result_node->content = result_fid;
+
+  // User could specify no changes in content
+  if (result_fid != parent_fid)
+    {
+      adaptor.record_file(parent_fid, result_fid, parent_data, result_data);
+    }
+}
+
+static void
+resolve_dropped_modified_one(lua_hooks &                                  lua,
+                             string                                       side_image,
+                             bool                                         handling_dropped_side,
+                             resolve_conflicts::file_resolution_t const & resolution,
+                             resolve_conflicts::file_resolution_t const & other_resolution,
+                             roster_t const &                             side_roster,
+                             file_path const &                            name,
+                             file_id const &                              fid,
+                             node_id const                                nid,
+                             content_merge_database_adaptor &             adaptor,
+                             temp_node_id_source &                        nis,
+                             roster_t &                                   result_roster)
+{
+  if (nid == the_null_node)
+    {
+      E(resolution.resolution == resolve_conflicts::none, origin::user,
+        F("extra %s_resolution provided for dropped_modified '%s'") % side_image % name);
+      return;
+    }
+  else
+    {
+      E(resolution.resolution != resolve_conflicts::none, origin::user,
+        (other_resolution.resolution == resolve_conflicts::none) ?
+        F("no resolution provided for dropped_modified '%s'") % name :
+        F("no %s_resolution provided for dropped_modified '%s'") % side_image % name);
+    }
+
+  switch (resolution.resolution)
+    {
+    case resolve_conflicts::none:
+      // handled above; can't get here
+      break;
+
+    case resolve_conflicts::content_user:
+      // FIXME: check other_resolution for consistency
+      if (handling_dropped_side)
+        {
+          // recreated; replace the contents of the recreated node
+          replace_content(side_roster, side_image, nid, result_roster, resolution.content, adaptor);
+          attach_node(lua, result_roster, nid, name);
+        }
+      else
+        {
+          // modified; drop and create a new node
+          // See comments in keep below on why we drop first
+          result_roster.drop_detached_node(nid);
+
+          node_id new_nid = create_new_node
+            (side_roster, side_image, nid, result_roster, resolution.content, adaptor, nis);
+
+          attach_node(lua, result_roster, new_nid, name);
+        }
+      break;
+
+    case resolve_conflicts::content_internal:
+      // not valid for dropped_modified
+      I(false);
+
+    case resolve_conflicts::drop:
+      // The node is either modified, recreated or duplicate name; in
+      // any case, it is present but detached in the result roster, so drop it
+      P(F("dropping '%s' from %s") % name % side_image);
+      result_roster.drop_detached_node(nid);
+      break;
+
+    case resolve_conflicts::keep:
+      if (handling_dropped_side)
+        {
+          // recreated; keep the recreated contents
+          P(F("keeping '%s' from %s") % name % side_image);
+          attach_node(lua, result_roster, nid, name);
+        }
+      else
+        {
+          // modified; keep the modified contents
+
+          P(F("keeping '%s' from %s") % name % side_image);
+          P(F(history_lost_msg) % name % side_image);
+
+          // We'd like to just attach_node here, but that violates a
+          // fundamental design principle of mtn; nodes are born once,
+          // and die once. If we attach here, the node is born, died,
+          // and then born again.
+          //
+          // So we have to drop the old node, and create a new node with
+          // the same contents. That loses history; 'mtn log <path>'
+          // will end here, not showing the history of the original
+          // node.
+          result_roster.drop_detached_node(nid);
+          node_id nid = result_roster.create_file_node(fid, nis);
+          attach_node (lua, result_roster, nid, name);
+        }
+      break;
+
+    case resolve_conflicts::rename:
+      if (handling_dropped_side)
+        {
+          // recreated; rename the recreated contents
+          P(F("renaming '%s' from %s to '%s'") % name % side_image % resolution.rename.as_external());
+          attach_node(lua, result_roster, nid, resolution.rename);
+        }
+      else
+        {
+          // modified; drop, create new node with the modified contents, rename
+          // See comment in keep above on why we drop first.
+          result_roster.drop_detached_node(nid);
+
+          P(F("renaming '%s' from %s to '%s'") % name % side_image % resolution.rename.as_external());
+          P(F(history_lost_msg) % name % side_image);
+
+          node_id new_nid = result_roster.create_file_node(fid, nis);
+          attach_node (lua, result_roster, new_nid, resolution.rename);
+        }
+      break;
+
+    case resolve_conflicts::content_user_rename:
+      if (handling_dropped_side)
+        {
+          // recreated; rename and replace the recreated contents
+          replace_content(side_roster, side_image, nid, result_roster, resolution.content, adaptor);
+
+          P(F("renaming '%s' from %s to '%s'") % name % side_image % resolution.rename.as_external());
+
+          attach_node (lua, result_roster, nid, resolution.rename);
+        }
+      else
+        {
+          // modified; drop, rename and replace the modified contents
+          result_roster.drop_detached_node(nid);
+
+          node_id new_nid = create_new_node
+            (side_roster, side_image, nid, result_roster, resolution.content, adaptor, nis);
+
+          P(F("renaming '%s' from %s to '%s'") % name % side_image % resolution.rename.as_external());
+
+          attach_node(lua, result_roster, new_nid, resolution.rename);
+        }
+      break;
+    }
+} // resolve_dropped_modified_one
+
+void
+roster_merge_result::resolve_dropped_modified_conflicts(lua_hooks & lua,
+                                                        roster_t const & left_roster,
+                                                        roster_t const & right_roster,
+                                                        content_merge_database_adaptor & adaptor,
+                                                        temp_node_id_source & nis)
+{
+  MM(left_roster);
+  MM(right_roster);
+  MM(this->roster); // New roster
+
+  for (std::vector<dropped_modified_conflict>::iterator i = dropped_modified_conflicts.begin();
+       i != dropped_modified_conflicts.end();
+       ++i)
+    {
+      dropped_modified_conflict & conflict = *i;
+      MM(conflict);
+
+      file_path left_name;
+      file_id   left_fid;
+      file_path right_name;
+      file_id   right_fid;
+
+      if (conflict.left_nid != the_null_node)
+        {
+          if (conflict.left_rid == adaptor.left_rid)
+            {
+              left_roster.get_file_details(conflict.left_nid, left_fid, left_name);
+            }
+          else
+            {
+              if (null_id(conflict.left_rid))
+                {
+                  // attr mtn::resolve_conflict drop does not set rid; find it now
+                  adaptor.get_dropped_details
+                    (adaptor.left_rid, conflict.left_nid, conflict.left_rid, left_name, left_fid);
+                }
+              else
+                {
+                  roster_t tmp;
+                  adaptor.db.get_roster(conflict.left_rid, tmp);
+                  tmp.get_file_details(conflict.left_nid, left_fid, left_name);
+                }
+            }
+        }
+
+      if (conflict.right_nid != the_null_node)
+        {
+          if (conflict.right_rid == adaptor.right_rid)
+            {
+              right_roster.get_file_details(conflict.right_nid, right_fid, right_name);
+            }
+          else
+            {
+              if (null_id(conflict.left_rid))
+                {
+                  adaptor.get_dropped_details
+                    (adaptor.right_rid, conflict.right_nid, conflict.right_rid, right_name, right_fid);
+                }
+              else
+                {
+                  roster_t tmp;
+                  adaptor.db.get_roster(conflict.right_rid, tmp);
+                  tmp.get_file_details(conflict.right_nid, right_fid, right_name);
+                }
+            }
+        }
+
+      resolve_dropped_modified_one (lua,
+                                    string("left"),
+                                    conflict.dropped_side == resolve_conflicts::left_side,
+                                    conflict.left_resolution,
+                                    conflict.right_resolution,
+                                    left_roster,
+                                    left_name,
+                                    left_fid,
+                                    conflict.left_nid,
+                                    adaptor,
+                                    nis,
+                                    roster);
+
+      resolve_dropped_modified_one (lua,
+                                    string("right"),
+                                    conflict.dropped_side == resolve_conflicts::right_side,
+                                    conflict.right_resolution,
+                                    conflict.left_resolution,
+                                    right_roster,
+                                    right_name,
+                                    right_fid,
+                                    conflict.right_nid,
+                                    adaptor,
+                                    nis,
+                                    roster);
+
+    } // end for
+
+  dropped_modified_conflicts.clear();
+}
+
+static void
 resolve_duplicate_name_one_side(lua_hooks & lua,
                                 resolve_conflicts::file_resolution_t const & resolution,
                                 resolve_conflicts::file_resolution_t const & other_resolution,
@@ -2371,23 +3166,23 @@ resolve_duplicate_name_one_side(lua_hook
                                 content_merge_adaptor & adaptor,
                                 roster_t & result_roster)
 {
-  switch (resolution.first)
+  switch (resolution.resolution)
     {
     case resolve_conflicts::content_user:
       {
-        E(other_resolution.first == resolve_conflicts::drop ||
-          other_resolution.first == resolve_conflicts::rename,
+        E(other_resolution.resolution == resolve_conflicts::drop ||
+          other_resolution.resolution == resolve_conflicts::rename,
           origin::user,
           F("inconsistent left/right resolutions for '%s'") % name);
 
-        P(F("replacing content of '%s' with '%s'") % name % resolution.second->as_external());
+        P(F("replacing content of '%s' with '%s'") % name % resolution.content->as_external());
 
         file_id result_fid;
         file_data parent_data, result_data;
         data result_raw_data;
         adaptor.get_version(fid, parent_data);
 
-        read_data(*resolution.second, result_raw_data);
+        read_data(*resolution.content, result_raw_data);
 
         result_data = file_data(result_raw_data);
         calculate_ident(result_data, result_fid);
@@ -2413,8 +3208,8 @@ resolve_duplicate_name_one_side(lua_hook
       break;
 
     case resolve_conflicts::keep:
-      E(other_resolution.first == resolve_conflicts::drop ||
-        other_resolution.first == resolve_conflicts::rename,
+      E(other_resolution.resolution == resolve_conflicts::drop ||
+        other_resolution.resolution == resolve_conflicts::rename,
         origin::user,
         F("inconsistent left/right resolutions for '%s'") % name);
 
@@ -2423,9 +3218,8 @@ resolve_duplicate_name_one_side(lua_hook
       break;
 
     case resolve_conflicts::rename:
-      P(F("renaming '%s' to '%s'") % name % *resolution.second);
-      attach_node
-        (lua, result_roster, nid, file_path_internal (resolution.second->as_internal()));
+      P(F("renaming '%s' to '%s'") % name % resolution.rename);
+      attach_node (lua, result_roster, nid, resolution.rename);
       break;
 
     case resolve_conflicts::none:
@@ -2433,11 +3227,6 @@ resolve_duplicate_name_one_side(lua_hook
         F("no resolution provided for duplicate_name '%s'") % name);
       break;
 
-    case resolve_conflicts::content_internal:
-      E(false, origin::user,
-        F("invalid resolution for duplicate_name '%s'") % name);
-      break;
-
     default:
       I(false);
     }
@@ -2525,7 +3314,7 @@ roster_merge_result::resolve_file_conten
       left_roster.get_name(conflict.nid, left_name);
       right_roster.get_name(conflict.nid, right_name);
 
-      switch (conflict.resolution.first)
+      switch (conflict.resolution.resolution)
         {
           case resolve_conflicts::content_internal:
           case resolve_conflicts::none:
@@ -2547,7 +3336,7 @@ roster_merge_result::resolve_file_conten
           case resolve_conflicts::content_user:
             {
               P(F("replacing content of '%s', '%s' with '%s'") %
-                left_name % right_name % conflict.resolution.second->as_external());
+                left_name % right_name % conflict.resolution.content->as_external());
 
               file_id result_id;
               file_data left_data, right_data, result_data;
@@ -2555,7 +3344,7 @@ roster_merge_result::resolve_file_conten
               adaptor.get_version(conflict.left, left_data);
               adaptor.get_version(conflict.right, right_data);
 
-              read_data(*conflict.resolution.second, result_raw_data);
+              read_data(*conflict.resolution.content, result_raw_data);
 
               result_data = file_data(result_raw_data);
               calculate_ident(result_data, result_id);
============================================================
--- src/merge_content.cc	76d5a0997d9217b309d75806f8059d8f56f2ca49
+++ src/merge_content.cc	095c2d20ac8d8d495806f6463c311d253cb6a686
@@ -1,5 +1,5 @@
 // Copyright (C) 2008 Nathaniel Smith <address@hidden>
-//               2008, 2010 Stephen Leake <address@hidden>
+//               2008, 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -82,6 +82,20 @@ void
 }
 
 void
+content_merge_database_adaptor::record_file(file_id const & ident,
+                                            file_data const & data)
+{
+  L(FL("recording new file %s")
+    % ident);
+
+  transaction_guard guard(db);
+
+  db.put_file(ident, data);
+
+  guard.commit();
+}
+
+void
 content_merge_database_adaptor::record_file(file_id const & parent_ident,
                                             file_id const & merged_ident,
                                             file_data const & parent_data,
@@ -166,6 +180,39 @@ void
 }
 
 void
+content_merge_database_adaptor::get_dropped_details(revision_id & rev_id,
+                                                    node_id       nid,
+                                                    revision_id & dropped_rev_id,
+                                                    file_path   & dropped_name,
+                                                    file_id     & dropped_file_id)
+{
+  set<revision_id> parents;
+  db.get_revision_parents(rev_id, parents);
+
+  while (parents.begin() != parents.end())
+    {
+      set<revision_id>::iterator i = parents.begin();
+      roster_t roster;
+      marking_map marking_map;
+
+      db.get_roster(*i, roster, marking_map);
+      if (roster.has_node(nid))
+        {
+          dropped_rev_id = *i;
+          roster.get_file_details(nid, dropped_file_id, dropped_name);
+          return;
+        }
+      else
+        {
+          parents.erase (i);
+          set<revision_id> more_parents;
+          db.get_revision_parents(*i, more_parents);
+          parents.insert(more_parents.begin(), more_parents.end());
+        }
+    }
+}
+
+void
 content_merge_database_adaptor::get_version(file_id const & ident,
                                             file_data & dat) const
 {
@@ -203,6 +250,18 @@ void
 }
 
 void
+content_merge_workspace_adaptor::record_file(file_id const & id,
+                                             file_data const & data)
+{
+  L(FL("temporarily recording file %s")
+    % id);
+  // this is an insert instead of a safe_insert because it is perfectly
+  // legal (though rare) to have multiple merges resolve to the same file
+  // contents.
+  temporary_store.insert(make_pair(id, data));
+}
+
+void
 content_merge_workspace_adaptor::record_file(file_id const & parent_id,
                                              file_id const & merged_id,
                                              file_data const & parent_data,
@@ -307,6 +366,13 @@ void
 }
 
 void
+content_merge_checkout_adaptor::record_file(file_id const & ident,
+                                            file_data const & data)
+{
+  I(false);
+}
+
+void
 content_merge_checkout_adaptor::get_ancestral_roster(node_id nid,
                                                      revision_id & rid,
                                                      shared_ptr<roster_t const> & anc)
@@ -337,6 +403,13 @@ void
 }
 
 void
+content_merge_empty_adaptor::record_file(file_id const & ident,
+                                         file_data const & data)
+{
+  I(false);
+}
+
+void
 content_merge_empty_adaptor::record_file(file_id const & parent_ident,
                                          file_id const & merged_ident,
                                          file_data const & parent_data,
@@ -644,6 +717,7 @@ resolve_merge_conflicts(lua_hooks & lua,
                         roster_t const & right_roster,
                         roster_merge_result & result,
                         content_merge_adaptor & adaptor,
+                        temp_node_id_source & nis,
                         const bool resolutions_given)
 {
   if (!result.is_clean())
@@ -652,6 +726,9 @@ resolve_merge_conflicts(lua_hooks & lua,
 
       if (resolutions_given)
         {
+          // We require --resolve-conflicts to enable processing attr
+          // mtn:resolve_conflict.
+
           // If there are any conflicts for which we don't currently support
           // resolutions, give a nice error message.
           char const * const msg = "conflict resolution for %s not yet supported";
@@ -667,10 +744,14 @@ resolve_merge_conflicts(lua_hooks & lua,
           E(result.attribute_conflicts.size() == 0, origin::user,
             F(msg) % "attribute_conflicts");
 
-          // resolve the ones we can.
+          // Resolve the ones we can, if they have resolutions specified. Each
+          // conflict list is deleted once all are resolved.
           result.resolve_orphaned_node_conflicts(lua, left_roster, right_roster, adaptor);
+          result.resolve_dropped_modified_conflicts(lua, left_roster, right_roster,
+                                                    dynamic_cast <content_merge_database_adaptor&>(adaptor), nis);
           result.resolve_duplicate_name_conflicts(lua, left_roster, right_roster, adaptor);
-          result.resolve_file_content_conflicts(lua, left_roster, right_roster, adaptor);
+
+          result.resolve_file_content_conflicts (lua, left_roster, right_roster, adaptor);
         }
     }
 
@@ -682,6 +763,7 @@ resolve_merge_conflicts(lua_hooks & lua,
 
       result.report_orphaned_node_conflicts(left_roster, right_roster, adaptor, false, std::cout);
       result.report_multiple_name_conflicts(left_roster, right_roster, adaptor, false, std::cout);
+      result.report_dropped_modified_conflicts(left_roster, right_roster, adaptor, false, std::cout);
       result.report_duplicate_name_conflicts(left_roster, right_roster, adaptor, false, std::cout);
 
       result.report_attribute_conflicts(left_roster, right_roster, adaptor, false, std::cout);
@@ -753,12 +835,13 @@ interactive_merge_and_store(lua_hooks & 
                result);
 
   bool resolutions_given;
+  temp_node_id_source nis;
   content_merge_database_adaptor dba(db, left_rid, right_rid,
                                      left_marking_map, right_marking_map);
 
   parse_resolve_conflicts_opts (opts, left_rid, left_roster, right_rid, right_roster, result, resolutions_given);
 
-  resolve_merge_conflicts(lua, opts, left_roster, right_roster, result, dba, resolutions_given);
+  resolve_merge_conflicts(lua, opts, left_roster, right_roster, result, dba, nis, resolutions_given);
 
   // write new files into the db
   store_roster_merge_result(db,
@@ -777,7 +860,7 @@ store_roster_merge_result(database & db,
 {
   I(result.is_clean());
   roster_t & merged_roster = result.roster;
-  merged_roster.check_sane();
+  merged_roster.check_sane(true); // resolve conflicts can create new nodes
 
   revision_t merged_rev;
   merged_rev.made_for = made_for_database;
============================================================
--- src/merge_content.hh	c74c14bb8031b9bf67f684d9ddfdf6624f424f01
+++ src/merge_content.hh	f9a3388e5d2bd6d873d352dabf896df32827e983
@@ -1,5 +1,5 @@
 // Copyright (C) 2005 Nathaniel Smith <address@hidden>
-//               2008, 2010 Stephen Leake <address@hidden>
+//               2008, 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -12,6 +12,7 @@
 #define __MERGE_HH__
 
 #include "vocab.hh"
+#include "roster.hh"
 #include "rev_types.hh"
 #include "paths.hh"
 
@@ -30,7 +31,10 @@ content_merge_adaptor
                             file_data const & right_data,
                             file_data const & merged_data) = 0;
 
-  // For use when one side of the merge is dropped
+  // dropped_modified conflict resolution of keep or user creates new node
+  virtual void record_file(file_id const & ident,
+                           file_data const & data) = 0;
+
   virtual void record_file(file_id const & parent_ident,
                            file_id const & merged_ident,
                            file_data const & parent_data,
@@ -69,6 +73,9 @@ content_merge_database_adaptor
                     file_data const & right_data,
                     file_data const & merged_data);
 
+  void record_file(file_id const & ident,
+                   file_data const & data);
+
   void record_file(file_id const & parent_ident,
                    file_id const & merged_ident,
                    file_data const & parent_data,
@@ -81,6 +88,14 @@ content_merge_database_adaptor
                             revision_id & rid,
                             boost::shared_ptr<roster_t const> & anc);
 
+  // Search parents of rev_id (which must be left_rid or right_rid); return
+  // rev, file_path, and file_id for nid just before it was dropped.
+  void get_dropped_details(revision_id & rev_id,
+                           node_id       nid,
+                           revision_id & dropped_rev_id,
+                           file_path   & dropped_name,
+                           file_id     & dropped_file_id);
+
   void get_version(file_id const & ident,
                    file_data & dat) const;
 };
@@ -117,6 +132,9 @@ content_merge_workspace_adaptor
                     file_data const & right_data,
                     file_data const & merged_data);
 
+  void record_file(file_id const & ident,
+                   file_data const & data);
+
   void record_file(file_id const & parent_ident,
                    file_id const & merged_ident,
                    file_data const & parent_data,
@@ -146,6 +164,9 @@ content_merge_checkout_adaptor
                     file_data const & right_data,
                     file_data const & merged_data);
 
+  void record_file(file_id const & ident,
+                   file_data const & data);
+
   void record_file(file_id const & parent_ident,
                    file_id const & merged_ident,
                    file_data const & parent_data,
@@ -172,6 +193,9 @@ content_merge_empty_adaptor
                     file_data const & right_data,
                     file_data const & merged_data);
 
+  void record_file(file_id const & ident,
+                   file_data const & data);
+
   void record_file(file_id const & parent_ident,
                    file_id const & merged_ident,
                    file_data const & parent_data,
@@ -259,6 +283,7 @@ resolve_merge_conflicts(lua_hooks & lua,
                         roster_t const & right_roster,
                         roster_merge_result & result,
                         content_merge_adaptor & adaptor,
+                        temp_node_id_source & nis,
                         bool const resolutions_given);
 
 // traditional resolve-all-conflicts-as-you-go style merging with 3-way merge
============================================================
--- src/merge_roster.cc	98297d6264f77d540fc8e1578b1ebc5b2f36ec38
+++ src/merge_roster.cc	c3eb70578a3b8b88c4d1b7af43b7685d6f636c23
@@ -1,4 +1,4 @@
-// Copyright (C) 2008, 2010 Stephen Leake <address@hidden>
+// Copyright (C) 2008, 2010, 2012 Stephen Leake <address@hidden>
 //               2005 Nathaniel Smith <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -14,6 +14,7 @@
 #include "sanity.hh"
 #include "safe_map.hh"
 #include "parallel_iter.hh"
+#include "vocab_cast.hh"
 
 #include <sstream>
 
@@ -25,25 +26,61 @@ enum side_t {left_side, right_side};
 
 enum side_t {left_side, right_side};
 
-static char const *
-image(resolve_conflicts::resolution_t resolution)
+namespace resolve_conflicts
 {
-  switch (resolution)
-    {
-    case resolve_conflicts::none:
-      return "none";
-    case resolve_conflicts::content_user:
-      return "content_user";
-    case resolve_conflicts::content_internal:
-      return "content_internal";
-    case resolve_conflicts::drop:
-      return "drop";
-    case resolve_conflicts::keep:
-      return "keep";
-    case resolve_conflicts::rename:
-      return "rename";
-    }
-  I(false); // keep compiler happy
+  char const *
+  image(side_t item)
+  {
+    switch (item)
+      {
+      case resolve_conflicts::left_side:
+        return "left_side";
+      case resolve_conflicts::right_side:
+        return "right_side";
+      }
+    I(false); // keep compiler happy
+  }
+
+  char const *
+  image(resolution_t resolution)
+  {
+    switch (resolution)
+      {
+      case resolve_conflicts::none:
+        return "none";
+      case resolve_conflicts::content_user:
+        return "content_user";
+      case resolve_conflicts::content_internal:
+        return "content_internal";
+      case resolve_conflicts::drop:
+        return "drop";
+      case resolve_conflicts::keep:
+        return "keep";
+      case resolve_conflicts::rename:
+        return "rename";
+      case resolve_conflicts::content_user_rename:
+        return "content_user_rename";
+      }
+    I(false); // keep compiler happy
+  }
+
+  string
+  image(file_resolution_t res)
+  {
+    if (res.resolution == resolve_conflicts::none)
+      return string("\n");
+    else
+      {
+        ostringstream oss;
+        oss << "resolution: " << image(res.resolution);
+        if (res.content != 0)
+          oss << ", content: '" << res.content->as_external() << "'";
+        if (res.rename.as_internal().length()>0)
+          oss << ", rename: '" << res.rename.as_external() << "'";
+        oss << "\n";
+        return oss.str();
+      }
+  }
 }
 
 template <> void
@@ -89,25 +126,32 @@ template <> void
 }
 
 template <> void
+dump(dropped_modified_conflict const & conflict, string & out)
+{
+  ostringstream oss;
+  oss << "dropped_modified_conflict -\n";
+  oss << " dropped_side    : " << image(conflict.dropped_side) << "\n";
+  oss << " left_nid        : " << conflict.left_nid << "\n";
+  oss << " right_nid       : " << conflict.right_nid << "\n";
+  oss << " orphaned        : " << conflict.orphaned << "\n";
+  oss << " left_rid        : " << conflict.left_rid << "\n";
+  oss << " right_rid       : " << conflict.right_rid << "\n";
+  oss << " left_resolution : " << image(conflict.left_resolution);
+  oss << " right_resolution: " << image(conflict.right_resolution);
+  out = oss.str();
+}
+
+template <> void
 dump(duplicate_name_conflict const & conflict, string & out)
 {
   ostringstream oss;
   oss << "duplicate_name_conflict between left node: " << conflict.left_nid << " "
       << "and right node: " << conflict.right_nid << " "
       << "parent: " << conflict.parent_name.first << " "
-      << "basename: " << conflict.parent_name.second;
-
-  if (conflict.left_resolution.first != resolve_conflicts::none)
-    {
-      oss << " left_resolution: " << image(conflict.left_resolution.first);
-      oss << " left_name: " << conflict.left_resolution.second;
-    }
-  if (conflict.right_resolution.first != resolve_conflicts::none)
-    {
-      oss << " right_resolution: " << image(conflict.right_resolution.first);
-      oss << " right_name: " << conflict.right_resolution.second;
-    }
-  oss << "\n";
+      << "basename: " << conflict.parent_name.second << " "
+      << "left_resolution: " << image(conflict.left_resolution)
+      << "right_resolution: " << image(conflict.right_resolution)
+      << "\n";
   out = oss.str();
 }
 
@@ -127,12 +171,7 @@ dump(file_content_conflict const & confl
 {
   ostringstream oss;
   oss << "file_content_conflict on node: " << conflict.nid;
-
-  if (conflict.resolution.first != resolve_conflicts::none)
-    {
-      oss << " resolution: " << image(conflict.resolution.first);
-      oss << " name: " << conflict.resolution.second;
-    }
+  oss << " resolution: " << image(conflict.resolution);
   oss << "\n";
   out = oss.str();
 }
@@ -146,6 +185,7 @@ roster_merge_result::clear()
 
   orphaned_node_conflicts.clear();
   multiple_name_conflicts.clear();
+  dropped_modified_conflicts.clear();
   duplicate_name_conflicts.clear();
 
   attribute_conflicts.clear();
@@ -175,6 +215,7 @@ roster_merge_result::has_non_content_con
     || !directory_loop_conflicts.empty()
     || !orphaned_node_conflicts.empty()
     || !multiple_name_conflicts.empty()
+    || !dropped_modified_conflicts.empty()
     || !duplicate_name_conflicts.empty()
     || !attribute_conflicts.empty();
 }
@@ -183,6 +224,7 @@ roster_merge_result::count_supported_res
 roster_merge_result::count_supported_resolution() const
 {
   return orphaned_node_conflicts.size()
+    + dropped_modified_conflicts.size()
     + file_content_conflicts.size()
     + duplicate_name_conflicts.size();
 }
@@ -209,6 +251,7 @@ dump_conflicts(roster_merge_result const
 
   dump(result.orphaned_node_conflicts, out);
   dump(result.multiple_name_conflicts, out);
+  dump(result.dropped_modified_conflicts, out);
   dump(result.duplicate_name_conflicts, out);
 
   dump(result.attribute_conflicts, out);
@@ -316,34 +359,71 @@ namespace
                    marking_map const & markings,
                    set<revision_id> const & uncommon_ancestors,
                    roster_t const & parent_roster,
-                   roster_t & new_roster)
+                   side_t const present_in,
+                   roster_merge_result & result)
   {
     const_marking_t const & m = markings.get_marking(n->self);
     revision_id const & birth = m->birth_revision;
     if (uncommon_ancestors.find(birth) != uncommon_ancestors.end())
-      create_node_for(n, new_roster);
+      create_node_for(n, result.roster);
     else
       {
-        // In this branch we are NOT inserting the node into the new roster as it
-        // has been deleted from the other side of the merge.
-        // In this case, output a warning if there are changes to the file on the
-        // side of the merge where it still exists.
+        // The node has been deleted from the other side of the merge. If
+        // there are changes to the file on this side of the merge, insert
+        // it into the new roster, but leave it detached, so the conflict
+        // resolutions can deal with it easily. Note that attaching would be
+        // done later; see roster_merge below.
+        //
+        // We also need to look for another node with the same name; user
+        // may have already 'undeleted' the node. But we have to do that
+        // after all result nodes are created and attached.
         set<revision_id> const & content_marks = m->file_content;
-        bool found_one_ignored_content = false;
-        for (set<revision_id>::const_iterator it = content_marks.begin(); it != content_marks.end(); it++)
+        for (set<revision_id>::const_iterator it = content_marks.begin();
+             it != content_marks.end();
+             it++)
           {
             if (uncommon_ancestors.find(*it) != uncommon_ancestors.end())
               {
-                if (!found_one_ignored_content)
+                dropped_modified_conflict conflict;
+                attr_key a_key = typecast_vocab<attr_key>(utf8("mtn:resolve_conflict"));
+                attr_map_t::const_iterator i = n->attrs.find(a_key);
+
+                create_node_for(n, result.roster);
+
+                switch (present_in)
                   {
-                    file_path fp;
-                    parent_roster.get_name(n->self, fp);
-                    W(F("content changes to the file '%s'\n"
-                        "will be ignored during this merge as the file has been\n"
-                        "removed on one side of the merge.  Affected revisions include:") % fp);
+                  case left_side:
+                    conflict = dropped_modified_conflict(n->self, the_null_node);
+                    break;
+                  case right_side:
+                    conflict = dropped_modified_conflict(the_null_node, n->self);
+                    break;
                   }
-                found_one_ignored_content = true;
-                W(F("Revision: %s") % (*it));
+
+                if (i != n->attrs.end() && i->second.first)
+                  {
+                    if (i->second.second == typecast_vocab<attr_value>(utf8("drop")))
+                      {
+                        switch (present_in)
+                          {
+                          case left_side:
+                            conflict.left_resolution.resolution = resolve_conflicts::drop;
+                            break;
+                          case right_side:
+                            conflict.right_resolution.resolution = resolve_conflicts::drop;
+                            break;
+                          }
+                      }
+                    else
+                      {
+                        E(false, origin::user,
+                          F("unsupported '%s' conflict resolution in mtn:resolve_conflict attribute") %
+                          i->second.first);
+                      }
+                  }
+
+                result.dropped_modified_conflicts.push_back(conflict);
+                return;
               }
           }
       }
@@ -410,14 +490,33 @@ namespace
       }
     else
       {
+        // We need this in two places
+        std::vector<dropped_modified_conflict>::iterator dropped_modified =
+          find(result.dropped_modified_conflicts.begin(),
+               result.dropped_modified_conflicts.end(),
+               nid);
+
         // orphan:
         if (!result.roster.has_node(parent))
           {
-            orphaned_node_conflict c;
-            c.nid = nid;
-            c.parent_name = make_pair(parent, name);
-            result.orphaned_node_conflicts.push_back(c);
-            return;
+            // If the orphaned node is due to the parent directory being
+            // dropped, and the orphaned node is modified, then it already
+            // has a dropped_modified conflict; add the orphaned information
+            // to that.
+
+            if (result.dropped_modified_conflicts.end() != dropped_modified)
+              {
+                dropped_modified->orphaned = true;
+                return;
+              }
+            else
+              {
+                orphaned_node_conflict c;
+                c.nid = nid;
+                c.parent_name = make_pair(parent, name);
+                result.orphaned_node_conflicts.push_back(c);
+                return;
+              }
           }
 
         dir_t p = downcast_to_dir_t(result.roster.get_node_for_update(parent));
@@ -464,6 +563,12 @@ namespace
             result.directory_loop_conflicts.push_back(c);
             return;
           }
+
+        if (result.dropped_modified_conflicts.end() != dropped_modified)
+          {
+            // conflict already entered, just don't attach
+            return;
+          }
       }
     // hey, we actually made it.  attach the node!
     result.roster.attach_node(nid, parent, name);
@@ -515,13 +620,15 @@ roster_merge(roster_t const & left_paren
           case parallel::in_left:
             insert_if_unborn(i.left_data(),
                              left_markings, left_uncommon_ancestors, left_parent,
-                             result.roster);
+                             left_side, // present_in
+                             result);
             break;
 
           case parallel::in_right:
             insert_if_unborn(i.right_data(),
                              right_markings, right_uncommon_ancestors, right_parent,
-                             result.roster);
+                             right_side, // present_in
+                             result);
             break;
 
           case parallel::in_both:
@@ -711,6 +818,84 @@ roster_merge(roster_t const & left_paren
     I(new_i == result.roster.all_nodes().end());
   }
 
+  // now we can look for dropped_modified conflicts with recreated nodes or
+  // duplicate names
+  for (size_t i = 0; i < result.dropped_modified_conflicts.size(); ++i)
+    {
+      dropped_modified_conflict & conflict = result.dropped_modified_conflicts[i];
+
+      // If the file name was recreated, it is present in the result with
+      // the modified_name but different node id; find that and unattach it.
+      // Or, it may now subject to a duplicate_name conflict (see
+      // test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2).
+      // In which case modified_name will be present in the other parent,
+      // but not in the result.
+
+      file_path modified_name;
+      node_id   nid;
+      bool duplicate_name = false;
+
+      switch (conflict.dropped_side)
+        {
+        case resolve_conflicts::left_side:
+          right_parent.get_name(conflict.right_nid, modified_name);
+
+          if (result.roster.has_node(modified_name))
+            {
+              // recreated; we need to detach the node for the conflict
+              // resolution process. We'd like to just do:
+              // result.roster.detach_node(modified_name);
+              // but that doesn't erase result.roster.old_locations properly
+
+              const_node_t const & left_node      = left_parent.get_node(modified_name);
+              node_id              parent         = left_node->parent;
+              path_component       component_name = left_node->name;
+              dir_t                p              = downcast_to_dir_t(result.roster.get_node_for_update(parent));
+              conflict.left_nid                   = left_node->self;
+              p->detach_child(component_name);
+            }
+          else if (left_parent.has_node (modified_name))
+            {
+              conflict.left_nid = left_parent.get_node(modified_name)->self;
+              nid               = conflict.left_nid;
+              duplicate_name    = true;
+            }
+          break;
+
+        case resolve_conflicts::right_side:
+          left_parent.get_name(conflict.left_nid, modified_name);
+
+          if (result.roster.has_node(modified_name))
+            {
+              // recreated; see comment in left_side above
+              const_node_t const & right_node     = right_parent.get_node(modified_name);
+              node_id              parent         = right_node->parent;
+              path_component       component_name = right_node->name;
+              dir_t                p              = downcast_to_dir_t(result.roster.get_node_for_update(parent));
+              conflict.right_nid                  = right_node->self;
+              p->detach_child(component_name);
+            }
+          else if (right_parent.has_node (modified_name))
+            {
+              conflict.right_nid = right_parent.get_node(modified_name)->self;
+              nid                = conflict.right_nid;
+              duplicate_name     = true;
+            }
+          break;
+        }
+
+      if (duplicate_name)
+        {
+          // delete the duplicate name conflict; it will be handled by dropped_modified.
+          std::vector<duplicate_name_conflict>::iterator i =
+            find(result.duplicate_name_conflicts.begin(),
+                 result.duplicate_name_conflicts.end(),
+                 nid);
+
+          result.duplicate_name_conflicts.erase(i);
+        }
+    } // end dropped_modified loop
+
   // now check for the possible global problems
   if (!result.roster.has_root())
     result.missing_root_conflict = true;
============================================================
--- src/merge_roster.hh	cd2da3b06f595187a27622a98580b0636aabea4b
+++ src/merge_roster.hh	c782f7684e380f4583ed7ea88b0b2967f89d1d23
@@ -1,5 +1,5 @@
 // Copyright (C) 2005, 2010 Nathaniel Smith <address@hidden>
-//               2008, 2009 Stephen Leake <address@hidden>
+//               2008, 2009, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -29,12 +29,33 @@ namespace resolve_conflicts
 
 namespace resolve_conflicts
 {
-  enum resolution_t {none, content_user, content_internal, drop, keep, rename};
+  enum resolution_t {none, content_user, content_internal, drop, keep, rename, content_user_rename};
 
-  typedef std::pair<resolve_conflicts::resolution_t, boost::shared_ptr<any_path> > file_resolution_t;
+  char const * image(resolution_t item);
 
-  boost::shared_ptr<any_path> new_file_path(std::string path);
+  enum side_t {left_side, right_side};
 
+  char const * image(side_t item);
+
+  struct file_resolution_t
+  {
+    resolution_t resolution;
+    boost::shared_ptr<any_path> content;
+    file_path rename;
+
+    file_resolution_t() :
+      resolution(none),
+      content(),
+      rename()
+      {}
+  };
+
+  std::string image(file_resolution_t res);
+
+  // For filename read from conflicts file; converts path to utf8. basic_io
+  // parser should return utf8 in the first place.
+  file_path file_path_external(std::string path);
+
 }
 
 // renaming the root dir allows these:
@@ -90,6 +111,61 @@ struct multiple_name_conflict
   std::pair<node_id, path_component> left, right;
 };
 
+// nodes with drop/modified conflicts are left detached in the resulting
+// roster, with null parent and name fields.
+struct dropped_modified_conflict
+{
+  // A dropped_modified conflict can be the result of a repeated
+  // duplicate_name conflict (see
+  // ../test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2)
+  //
+  // If the user has recreated the dropped node, that also looks like a
+  // duplicate name conflict.
+  //
+  // In either case both nids are non-null.
+  //
+  // Dropped_modified can also be due to a dropped directory, in which case
+  // this looks like an orphaned_node conflict.
+  //
+  // If the resolution for the dropped node is 'keep', we need the revision
+  // that contains the node id, which is an ancestor of the merge parent.
+  // That information is also useful for an external front end, that wants to
+  // retreive the file contents for a merge tool.
+
+  resolve_conflicts::side_t dropped_side;
+
+ // If nid is set, it is in corresponding merge parent.
+  node_id left_nid, right_nid;
+
+  bool orphaned; // if true, the dropped side is due to a dropped parent directory
+
+  revision_id                          left_rid, right_rid;
+  resolve_conflicts::file_resolution_t left_resolution, right_resolution;
+
+  dropped_modified_conflict(node_id left_nid, node_id right_nid) :
+    left_nid(left_nid),
+    right_nid(right_nid),
+    orphaned(false),
+    left_rid(),
+    right_rid(),
+    left_resolution(),
+    right_resolution()
+  {dropped_side = (left_nid == the_null_node ? resolve_conflicts::left_side : resolve_conflicts::right_side);}
+
+  dropped_modified_conflict() :
+    left_nid(the_null_node),
+    right_nid(the_null_node),
+    orphaned(false),
+    left_rid(),
+    right_rid(),
+    left_resolution(),
+    right_resolution()
+  {}
+
+  // for find
+  bool operator==(node_id n) {return left_nid == n || right_nid == n;}
+};
+
 // this is when two distinct nodes want to have the same name.  these nodes
 // always each merged their names cleanly.  the nodes in the resulting roster
 // are both detached.
@@ -112,9 +188,10 @@ struct duplicate_name_conflict
   // it may be a bookkeeping or system path if resolution is 'user'.
   resolve_conflicts::file_resolution_t left_resolution, right_resolution;
 
-  duplicate_name_conflict ()
-  {left_resolution.first = resolve_conflicts::none;
-    right_resolution.first = resolve_conflicts::none;};
+  duplicate_name_conflict() {};
+
+  // for find
+  bool operator==(node_id n) {return left_nid == n || right_nid == n;}
 };
 
 // nodes with attribute conflicts are left attached in the resulting tree (unless
@@ -139,12 +216,15 @@ struct file_content_conflict
   file_id ancestor, left, right; // ancestor is set only when reading in a conflicts file
   resolve_conflicts::file_resolution_t resolution;
 
-  file_content_conflict () :
-    nid(the_null_node)
-    {resolution.first = resolve_conflicts::none;};
+  file_content_conflict() :
+    nid(the_null_node),
+    resolution()
+  {};
 
   file_content_conflict(node_id nid) :
-    nid(nid) {resolution.first = resolve_conflicts::none;};
+    nid(nid),
+    resolution()
+  {};
 };
 
 template <> void dump(invalid_name_conflict const & conflict, std::string & out);
@@ -152,6 +232,7 @@ template <> void dump(multiple_name_conf
 
 template <> void dump(orphaned_node_conflict const & conflict, std::string & out);
 template <> void dump(multiple_name_conflict const & conflict, std::string & out);
+template <> void dump(dropped_modified_conflict const & conflict, std::string & out);
 template <> void dump(duplicate_name_conflict const & conflict, std::string & out);
 
 template <> void dump(attribute_conflict const & conflict, std::string & out);
@@ -166,16 +247,18 @@ struct roster_merge_result
   //   - duplicate name conflicts
   //   - orphaned node conflicts
   //   - multiple name conflicts
+  //   - drop/modified conflicts
   //   - directory loop conflicts
   // - attribute conflicts
   // - file content conflicts
 
-  bool missing_root_conflict;
+  bool missing_root_conflict; // there can only be one of these
   std::vector<invalid_name_conflict> invalid_name_conflicts;
   std::vector<directory_loop_conflict> directory_loop_conflicts;
 
   std::vector<orphaned_node_conflict> orphaned_node_conflicts;
   std::vector<multiple_name_conflict> multiple_name_conflicts;
+  std::vector<dropped_modified_conflict> dropped_modified_conflicts;
   std::vector<duplicate_name_conflict> duplicate_name_conflicts;
 
   std::vector<attribute_conflict> attribute_conflicts;
@@ -223,6 +306,17 @@ struct roster_merge_result
                                       bool const basic_io,
                                       std::ostream & output) const;
 
+  void report_dropped_modified_conflicts(roster_t const & left,
+                                         roster_t const & right,
+                                         content_merge_adaptor & adaptor,
+                                         bool const basic_io,
+                                         std::ostream & output) const;
+  void resolve_dropped_modified_conflicts(lua_hooks & lua,
+                                          roster_t const & left_roster,
+                                          roster_t const & right_roster,
+                                          content_merge_database_adaptor & adaptor,
+                                          temp_node_id_source & nis);
+
   void report_duplicate_name_conflicts(roster_t const & left,
                                        roster_t const & right,
                                        content_merge_adaptor & adaptor,
============================================================
--- src/monotone.cc	a25ecdd170a601db798b63a60add7681609a34c4
+++ src/monotone.cc	764bc9ca406b41d21efd552a0d810bc2849e0588
@@ -156,27 +156,53 @@ cpp_main(int argc, char ** argv)
       E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,7,14), origin::system,
         F("monotone does not support Botan 1.7.14"));
 
-#if BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,6)
+      // In Botan 1.9.9, the DataSink_Stream cannot be instantiated per
+      // se. As 1.10.1 is already out, let's simply disable support for
+      // that specific (testing) version of botan.
+      E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,9,9), origin::system,
+        F("monotone does not support Botan 1.9.9"));
+
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,7)
+      // motonote binary compiled against botan younger than 1.7.7
       E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,6,3), origin::system,
         F("this monotone binary requires Botan 1.6.3 or newer"));
-      E(linked_botan_version <= BOTAN_VERSION_CODE_FOR(1,7,6), origin::system,
-        F("this monotone binary does not work with Botan newer than 1.7.6"));
-#elif BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,22)
-      E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,6), origin::system,
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,7,7), origin::system,
+        F("this monotone binary does not work with Botan 1.7.7 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,22)
+      // motonote binary compiled against botan 1.7.7 - 1.7.21
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,7), origin::system,
         F("this monotone binary requires Botan 1.7.7 or newer"));
-      // While compiling against 1.7.22 or newer is recommended, because
-      // it enables new features of Botan, the monotone binary compiled
-      // against Botan 1.7.21 and before should still work with newer Botan
-      // versions, including all of the stable branch 1.8.x.
-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system,
-        F("this monotone binary does not work with Botan 1.9.x"));
-#else
-      E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,22), origin::system,
+      // While compiling against 1.7.22 or newer is recommended, because it
+      // enables new features of Botan, the monotone binary compiled against
+      // Botan 1.7.21 and before should still work with newer Botan version,
+      // including all of the stable branch 1.8.x, up to and including
+      // 1.9.3.
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary does not work with Botan 1.9.4 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
+      // motonote binary compiled against botan 1.7.22 - 1.9.3
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,22), origin::system,
         F("this monotone binary requires Botan 1.7.22 or newer"));
-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system,
-        F("this monotone binary does not work with Botan 1.9.x"));
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary does not work with Botan 1.9.4 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11)
+      // motonote binary compiled against botan 1.9.4 - 1.9.10
+#pragma message ( "The resulting monotone binary won't be able to run with any stable release of botan." )
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary requires Botan 1.9.4 or newer"));
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
+        F("this monotone binary does not work with Botan 1.9.11 or newer"));
+
+#else
+      // motonote binary compiled against botan 1.9.11 and newer
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
+        F("this monotone binary requires Botan 1.9.11 or newer"));
 #endif
 
+
       app_state app;
       try
         {
============================================================
--- src/network/automate_session.cc	2c77f8e025f0d9a0ac4862127944fdebd28425ca
+++ src/network/automate_session.cc	3e42eadbc0379688a0a764ecb957f9e0dfde9adc
@@ -127,7 +127,7 @@ public:
     E(app.lua.hook_get_remote_automate_permitted(remote_identity,
                                                  cmdline, params),
       origin::user,
-      F("Sorry, you aren't allowed to do that."));
+      F("sorry, you aren't allowed to do that."));
   }
 };
 class remote_stdio_log_fn {
============================================================
--- src/network/netsync_session.cc	d2a9eee38bb3018fd84c699070f8e28557da6cc9
+++ src/network/netsync_session.cc	3c89f6b9938ff38e4bb33ed5f9e9fa1681515c4d
@@ -1464,7 +1464,7 @@ netsync_session::rebuild_merkle_trees(se
               if (keys.maybe_get_key_pair(*key, name, kp))
                 project.db.put_key(name, kp.pub);
               else
-                W(F("Cannot find key '%s'") % *key);
+                W(F("cannot find key '%s'") % *key);
             }
           inserted_keys.insert(*key);
           L(FL("including key %s by special request") % *key);
============================================================
--- src/network/session_base.cc	d44057cfd11f195fcfd95abae4d5550bd2402152
+++ src/network/session_base.cc	b5e1c8544dccb3532ca8047cd157f0c209055e6a
@@ -253,7 +253,7 @@ session_base::do_io(Netxx::Probe::ready_
     }
   catch (Netxx::Exception & e)
     {
-      P(F("Network error on peer %s, disconnecting")
+      P(F("network error on peer %s, disconnecting")
         % peer_id);
       ok = false;
     }
============================================================
--- src/netxx/serverbase.cxx	7a9b465ce4b0b02cb8ff126acf86d3896b4eb456
+++ src/netxx/serverbase.cxx	156f2090341d2a36bdb718e7c69df58f9251983e
@@ -44,6 +44,8 @@
 #include "probeinfo.h"
 #include "socket.h"
 
+#include <cerrno>
+
 // standard includes
 #include <map>
 #include <vector>
@@ -167,13 +169,26 @@ void Netxx::ServerBase::bind_to(const Ad
 		if (saun->sun_path[0] == '/') {
 		    files_.push_back(saun->sun_path);
 		} else {
-		    char buffer[MAXPATHLEN];
+		    // BIG FAT WARNING: THIS CODE HAS NOT BEEN TESTED!
+		    // The original code is non-dynamic, depending on
+		    // the value of MAXPATHLEN.  Since that macro isn't
+		    // guaranteed to exist, a more dynamic use if getcwd()
+		    // was written.  However, since monotone doesn't use
+		    // AF_LOCAL sockets, this code will not be reached.
+		    int e = ERANGE;
+		    int n = 4096;
 
-		    if (getcwd(buffer, sizeof(buffer))) {
- 			std::string fullpath = buffer; fullpath += '/'; fullpath += saun->sun_path;
-			files_.push_back(fullpath);
-		    } else {
-			files_.push_back(saun->sun_path);
+		    while (e == ERANGE) {
+			char buffer[n];
+			e = 0;
+			n += 4096;
+
+			if (getcwd(buffer, n)) {
+			    std::string fullpath = buffer; fullpath += '/'; fullpath += saun->sun_path;
+			    files_.push_back(fullpath);
+			} else if ((e = errno) != ERANGE) {
+			    files_.push_back(saun->sun_path);
+			}
 		    }
 		}
 	    }
============================================================
--- src/options_applicator.cc	5407017eb222eb329f9e22fc465d4f36743d37ee
+++ src/options_applicator.cc	4aedb28ed059d5c6edc9a7aba4f5b39929dba70e
@@ -1,4 +1,4 @@
-// Copyright (C) 2010 and later by various people
+// Copyright (C) 2010, 2012 and later by various people
 // see monotone commit logs for details and authors
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -25,14 +25,14 @@ options_applicator::options_applicator(o
 };
 
 options_applicator::options_applicator(options const & opts,
-				       options_applicator::for_what what)
+                                       options_applicator::for_what what)
   : _impl(new options_applicator_impl())
 {
   _impl->what = what;
 
   // --dump is handled in monotone.cc
   // --log is handled in monotone.cc
-  // --debug is handled in monotone.cc
+  // -v is handled in monotone.cc
 
   _impl->were_timestamps_enabled = ui.enable_timestamps(opts.timestamps);
 
@@ -47,15 +47,15 @@ options_applicator::options_applicator(o
   else
     {
       if (opts.ticker == "none")
-	ui.set_tick_write_nothing();
+        ui.set_tick_write_nothing();
       else if (opts.ticker == "dot")
-	ui.set_tick_write_dot();
+        ui.set_tick_write_dot();
       else if (opts.ticker == "count")
-	ui.set_tick_write_count();
+        ui.set_tick_write_count();
       else if (opts.ticker == "stdio")
-	ui.set_tick_write_stdio();
+        ui.set_tick_write_stdio();
       else
-	I(opts.ticker.empty());
+        I(opts.ticker.empty());
     }
 }
 
============================================================
--- src/options_list.hh	0462e302b89179f4acb28ecb91f4255140d4a4a7
+++ src/options_list.hh	27c44e89ebc9a828ac0a7b91505f997884646062
@@ -381,9 +381,9 @@ SIMPLE_OPTION(move_conflicting_paths,
 SIMPLE_OPTION(move_conflicting_paths,
               "move-conflicting-paths/no-move-conflicting-paths",
               bool,
-              (F("move conflicting, unversioned paths into '%s' "
+              strdup((F("move conflicting, unversioned paths into '%s' "
                  "before proceeding with any workspace change") %
-                 bookkeeping_resolutions_dir).str().c_str())
+                      bookkeeping_resolutions_dir).str().c_str()))
 
 OPTSET_REL(globals, ssh_sign)
 SIMPLE_INITIALIZED_OPTION(ssh_sign, "ssh-sign", enum_string, "yes,no,only,check",
============================================================
--- src/packet.cc	f61360ed2524fdf53411bd24d022a2a3c9e6e9c7
+++ src/packet.cc	571ff6eae1d269a146da74f2730b70376957d3bb
@@ -156,8 +156,8 @@ namespace
     void validate_public_key_data(string const & name, string const & keydata) const
     {
       string decoded = decode_base64_as<string>(keydata, origin::user);
-      Botan::SecureVector<Botan::byte> key_block;
-      key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
+      Botan::SecureVector<Botan::byte> key_block
+        (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
       try
         {
           Botan::X509::load_key(key_block);
@@ -175,7 +175,9 @@ namespace
       Botan::DataSource_Memory ds(decoded);
       try
         {
-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+          Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI());
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
           Botan::PKCS8::load_key(ds, lazy_rng::get(), string());
 #else
           Botan::PKCS8::load_key(ds, string());
@@ -189,7 +191,11 @@ namespace
         }
       // since we do not want to prompt for a password to decode it finally,
       // we ignore all other exceptions
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      catch (Passphrase_Required) {}
+#else
       catch (Botan::Invalid_Argument) {}
+#endif
     }
     void validate_certname(string const & cn) const
     {
@@ -460,8 +466,16 @@ read_packets(istream & in, packet_consum
   return count;
 }
 
+// Dummy User_Interface implementation for Botan
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+std::string
+Dummy_UI::get_passphrase(const std::string &, const std::string &,
+                         Botan::User_Interface::UI_Result&) const
+{
+  throw Passphrase_Required("Passphrase required");
+}
+#endif
 
-
 // Local Variables:
 // mode: C++
 // fill-column: 76
============================================================
--- src/packet.hh	0a224e6e92f244e2c3e9a5cdb935eb8613d7e85b
+++ src/packet.hh	9c43d30145f0292d6ceda5e717e366fdead5a4d6
@@ -10,6 +10,10 @@
 #ifndef __PACKET_HH__
 #define __PACKET_HH__
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+#include <botan/ui.h>
+#endif
+
 #include "vocab.hh"
 
 struct cert;
@@ -84,8 +88,23 @@ size_t read_packets(std::istream & in, p
 
 size_t read_packets(std::istream & in, packet_consumer & cons);
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+// A helper class implementing Botan::User_Interface - which doesn't really
+// interface with the user, but provides the necessary plumbing for Botan.
+//
+// See Botan commit 2d09d7d0cd4bd0e7155d001dd65a4f29103b158c
+typedef std::runtime_error Passphrase_Required;
+
+class Dummy_UI : public Botan::User_Interface
+{
+public:
+  virtual std::string get_passphrase(const std::string &, const std::string &,
+                                     Botan::User_Interface::UI_Result &) const;
+};
 #endif
 
+#endif
+
 // Local Variables:
 // mode: C++
 // fill-column: 76
============================================================
--- src/paths.cc	c724539af68eb71b98431d565eade79c2dcadf15
+++ src/paths.cc	f4244d2b15de4c1b8005fa8b244fe8391ce61d1b
@@ -1,5 +1,5 @@
 // Copyright (C) 2005 Nathaniel Smith <address@hidden>
-//               2008, 2010 Stephen Leake <address@hidden>
+//               2008, 2010 - 2011 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -457,7 +457,7 @@ file_path::file_path(file_path::source_t
   : any_path(path.made_from)
 {
   MM(path);
-  E(utf8_validate(path), made_from, F("Invalid utf8"));
+  E(utf8_validate(path), made_from, F("invalid utf8"));
   if (type == external)
     {
       string normalized;
@@ -481,9 +481,9 @@ bookkeeping_path::bookkeeping_path(strin
 
 bookkeeping_path::bookkeeping_path(string const & path, origin::type made_from)
 {
-  E(fully_normalized_path(path), made_from, F("Path is not normalized"));
+  E(fully_normalized_path(path), made_from, F("path is not normalized"));
   E(in_bookkeeping_dir(path), made_from,
-    F("Bookkeeping path is not in bookkeeping dir"));
+    F("bookkeeping path is not in bookkeeping directory"));
   data = ""
 }
 
@@ -555,7 +555,7 @@ any_path::dirname() const
   // dirname() of a direct child of the root is the root
   if (sep == 0 || (sep == 1 && s[1] == '/')
 #ifdef WIN32
-      || (sep == 1 || sep == 2 && s[1] == ':')
+      || (sep == 1 || (sep == 2 && s[1] == ':'))
 #endif
       )
     return any_path(s, 0, sep+1);
@@ -593,7 +593,7 @@ system_path::dirname() const
   // dirname() of a direct child of the root is the root
   if (sep == 0 || (sep == 1 && s[1] == '/')
 #ifdef WIN32
-      || (sep == 1 || sep == 2 && s[1] == ':')
+      || (sep == 1 || (sep == 2 && s[1] == ':'))
 #endif
       )
     return system_path(s, 0, sep+1);
============================================================
--- src/pcrewrap.cc	7f5bd4e7d8d9e02f2b0271fa9a0f64dcbce2467d
+++ src/pcrewrap.cc	59b11bb0076d4724c95c34840409be6d8357a68e
@@ -11,6 +11,7 @@
 #include "pcrewrap.hh"
 #include "sanity.hh"
 #include <cstring>
+#include <map>
 #include <vector>
 
 // This dirty trick is necessary to prevent the 'pcre' typedef defined by
@@ -19,6 +20,9 @@
 #include "pcre.h"
 #undef pcre
 
+using std::make_pair;
+using std::map;
+using std::pair;
 using std::string;
 using std::vector;
 
@@ -69,11 +73,63 @@ namespace pcre
 
 namespace pcre
 {
+  typedef map<char const *,
+              pair<struct real_pcre const *, struct pcre_extra const *> >
+              regex_cache;
+
+  class regex_cache_manager
+  {
+public:
+    regex_cache::const_iterator find(char const * pattern)
+      {
+        return cache.find(pattern);
+      }
+
+    void store(char const * pattern,
+               pair<struct real_pcre const *, struct pcre_extra const *>
+               data)
+      {
+        cache[pattern] = data;
+      }
+
+    regex_cache::const_iterator end()
+      {
+        return cache.end();
+      }
+
+    ~regex_cache_manager()
+      {
+        for (regex_cache::iterator iter = cache.begin();
+             iter != cache.end();
+             ++iter)
+          {
+            if (iter->second.first)
+              pcre_free(const_cast<pcre_t *>(iter->second.first));
+
+            if (iter->second.second)
+              pcre_free(const_cast<pcre_extra *>(iter->second.second));
+          }
+      }
+private:
+    regex_cache cache;
+  };
+
+  regex_cache_manager compiled;
+
   void regex::init(char const * pattern, flags options)
   {
     int errcode;
     int erroff;
     char const * err;
+    // use the cached data if we have it
+    regex_cache::const_iterator iter = compiled.find(pattern);
+    if (iter != compiled.end())
+      {
+        basedat = iter->second.first;
+        extradat = iter->second.second;
+        return;
+      }
+    // not in cache - compile them then store in cache
     basedat = pcre_compile2(pattern, flags_to_internal(options),
                             &errcode, &err, &erroff, 0);
     if (!basedat)
@@ -97,6 +153,8 @@ namespace pcre
     ed->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
     ed->match_limit_recursion = 2000;
     extradat = ed;
+    // store in cache
+    compiled.store(pattern, make_pair(basedat, extradat));
   }
 
   regex::regex(char const * pattern, origin::type whence, flags options)
@@ -113,10 +171,6 @@ namespace pcre
 
   regex::~regex()
   {
-    if (basedat)
-      pcre_free(const_cast<pcre_t *>(basedat));
-    if (extradat)
-      pcre_free(const_cast<pcre_extra *>(extradat));
   }
 
   bool
============================================================
--- src/rcs_file.cc	885b3fbe7b6cfed78816f0e57cd71d44616213c6
+++ src/rcs_file.cc	03cf68912a4a708545ebce3d415c0e970ddead0b
@@ -42,12 +42,12 @@ struct
 
 #ifdef HAVE_MMAP
 struct
-file_handle
+rcs_file_handle
 {
   string const & filename;
   off_t length;
   int fd;
-  file_handle(string const & fn) :
+  rcs_file_handle(string const & fn) :
     filename(fn),
     length(0),
     fd(-1)
@@ -60,13 +60,13 @@ file_handle
       if (fd == -1)
         throw oops("open of " + filename + " failed");
     }
-  ~file_handle()
+  ~rcs_file_handle()
     {
       if (close(fd) == -1)
         throw oops("close of " + filename + " failed");
     }
 };
-struct file_source
+struct rcs_file_source
 {
   string const & filename;
   int fd;
@@ -91,7 +91,7 @@ struct file_source
       ++pos;
     return good();
   }
-  file_source(string const & fn,
+  rcs_file_source(string const & fn,
               int f,
               off_t len) :
     filename(fn),
@@ -104,7 +104,7 @@ struct file_source
     if (mapping == MAP_FAILED)
       throw oops("mmap of " + filename + " failed");
   }
-  ~file_source()
+  ~rcs_file_source()
   {
     if (munmap(mapping, length) == -1)
       throw oops("munmapping " + filename + " failed, after reading RCS file");
@@ -112,12 +112,12 @@ struct
 };
 #elif defined(WIN32)
 struct
-file_handle
+rcs_file_handle
 {
   string const & filename;
   off_t length;
   HANDLE fd;
-  file_handle(string const & fn) :
+  rcs_file_handle(string const & fn) :
     filename(fn),
     length(0),
     fd(NULL)
@@ -134,7 +134,7 @@ file_handle
       if (fd == NULL)
         throw oops("open of " + filename + " failed");
     }
-  ~file_handle()
+  ~rcs_file_handle()
     {
       if (CloseHandle(fd)==0)
         throw oops("close of " + filename + " failed");
@@ -142,7 +142,7 @@ struct
 };
 
 struct
-file_source
+rcs_file_source
 {
   string const & filename;
   HANDLE fd,map;
@@ -167,7 +167,7 @@ file_source
       ++pos;
     return good();
   }
-  file_source(string const & fn,
+  rcs_file_source(string const & fn,
               HANDLE f,
               off_t len) :
     filename(fn),
@@ -183,7 +183,7 @@ file_source
     if (mapping==NULL)
       throw oops("MapViewOfFile of " + filename + " failed");
   }
-  ~file_source()
+  ~rcs_file_source()
   {
     if (UnmapViewOfFile(mapping)==0)
       throw oops("UnmapViewOfFile of " + filename + " failed");
@@ -193,7 +193,7 @@ file_source
 };
 #else
 // no mmap at all
-typedef istream file_source;
+typedef istream rcs_file_source;
 #endif
 
 typedef enum
@@ -220,7 +220,7 @@ static token_type
 }
 
 static token_type
-get_token(file_source & ist,
+get_token(rcs_file_source & ist,
           string & str,
           size_t & line,
           size_t & col)
@@ -303,14 +303,14 @@ struct parser
 
 struct parser
 {
-  file_source & ist;
+  rcs_file_source & ist;
   rcs_file & r;
   string token;
   token_type ttype;
 
   size_t line, col;
 
-  parser(file_source & s,
+  parser(rcs_file_source & s,
          rcs_file & r)
     : ist(s), r(r), line(1), col(1)
   {}
@@ -489,8 +489,8 @@ parse_rcs_file(string const & filename, 
 parse_rcs_file(string const & filename, rcs_file & r)
 {
 #if defined(HAVE_MMAP) || defined(WIN32)
-      file_handle handle(filename);
-      file_source ifs(filename, handle.fd, handle.length);
+      rcs_file_handle handle(filename);
+      rcs_file_source ifs(filename, handle.fd, handle.length);
 #else
       ifstream ifs(filename.c_str());
       ifs.unsetf(ios_base::skipws);
============================================================
--- src/rev_output.cc	a2c70b893b31296917d1a2b974faa1da46c13f1e
+++ src/rev_output.cc	6b9862bfda95d0d558d8335fb2accfc0180e8fbd
@@ -98,6 +98,23 @@ revision_header(revision_id const rid, r
     if (i->name == tag)
       out << _("Tag:      ") << i->value << '\n';
 
+  // Output "custom" certs if we have any, under a heading of "Other certs"
+  bool need_to_output_heading = true;
+  for (vector<cert>::const_iterator i = certs.begin(); i != certs.end(); ++i)
+    {
+      if (i->name != author && i->name != branch && i->name != changelog &&
+          i->name != comment && i->name != date && i->name != tag)
+        {
+          if (need_to_output_heading)
+            {
+              out << _("Other certs:") << '\n';
+              need_to_output_heading = false;
+            }
+
+          out << "  " << i->name << ": " << i->value << '\n';
+        }
+    }
+
   out << "\n";
 
   for (vector<cert>::const_iterator i = certs.begin(); i != certs.end(); ++i)
============================================================
--- src/revision.hh	740c4dd4ee350fcf06af3ba707cef3dadecb46f8
+++ src/revision.hh	8d93883e8a6de779aa199d9b2e1aa58589f0626c
@@ -162,6 +162,15 @@ void
                              std::multimap<revision_id, revision_id> *inverse_graph_cache_ptr = NULL);
 
 void
+erase_descendants(database & db, std::set<revision_id> & revisions);
+
+void
+erase_descendants_and_failures(database & db,
+                               std::set<revision_id> & revisions,
+                               is_failure & p,
+                               std::multimap<revision_id, revision_id> *inverse_graph_cache_ptr = NULL);
+
+void
 ancestry_difference(database & db, revision_id const & a,
                     std::set<revision_id> const & bs,
                     std::set<revision_id> & new_stuff);
============================================================
--- src/roster.cc	b4cec49faa1928388c7ab0ae1e2f389b202270b0
+++ src/roster.cc	b0608d6ec3e3f2d23a5c97bb64c4354eeb01773a
@@ -1188,12 +1188,30 @@ dump(roster_t const & val, string & out)
   out = oss.str();
 }
 
+template <> void
+dump(std::map<node_id, std::pair<node_id, path_component> > const & val, string & out)
+{
+  ostringstream oss;
+  for (std::map<node_id, std::pair<node_id, path_component> >::const_iterator i = val.begin();
+       i != val.end();
+       ++i)
+    {
+      oss << "Node " << i->first;
+      oss << " node " << i->second.first;
+      oss << " path " << i->second.second << "\n";
+    }
+  out = oss.str();
+}
+
 void
 roster_t::check_sane(bool temp_nodes_ok) const
 {
+  MM(*this);
+  MM(old_locations);
+
   node_id parent_id(the_null_node);
   const_dir_t parent_dir;
-  I(old_locations.empty());
+  I(old_locations.empty()); // if fail, some renamed node is still present and detached
   I(has_root());
   size_t maxdepth = nodes.size();
   bool is_first = true;
@@ -1233,7 +1251,7 @@ roster_t::check_sane(bool temp_nodes_ok)
       I(n == get_node(nid));
       I(maxdepth-- > 0);
     }
-  I(maxdepth == 0);
+  I(maxdepth == 0); // if fails, some newly created node is not attached
 }
 
 void
============================================================
--- src/sanity.cc	17e9e70774f064cfb8ef4e25075a1f493b63cd78
+++ src/sanity.cc	95d33b629774a37076959f4e66ca82a16089d093
@@ -188,7 +188,7 @@ sanity::dump_buffer()
     }
   else
     inform_message("discarding debug log, because I have nowhere to write it\n"
-                   "(maybe you want --debug or --dump?)");
+                   "(maybe you want -v -v or --dump?)");
 }
 
 int
============================================================
--- src/selectors.cc	3efba0ce3139290b4088cea0d6e82a912565471e
+++ src/selectors.cc	3fe6662223cd5a5f539189be93cf6652f9374acf
@@ -169,7 +169,7 @@ string preprocess_date_for_selector(stri
 
   if (sel != tmp)
     {
-      P(F("expanded date '%s' -> '%s'") % sel % tmp);
+      P(F("expanded date '%s' to UTC -> '%s'") % sel % tmp);
       sel = tmp;
     }
   if (equals && sel.size() < 19)
@@ -523,6 +523,19 @@ public:
                        inserter(ret, ret.end()));
         return ret;
       }
+    else if (name == "not")
+      {
+        diagnose_wrong_arg_count("not", 1, args.size());
+        set<revision_id> lhs;
+        set<revision_id> rhs = args[0]->complete(project);
+
+        project.db.get_revision_ids(lhs);
+        set<revision_id> ret;
+        set_difference(lhs.begin(), lhs.end(),
+                       rhs.begin(), rhs.end(),
+                       inserter(ret, ret.end()));
+        return ret;
+      }
     else if (name == "lca")
       {
         diagnose_wrong_arg_count("lca", 2, args.size());
@@ -546,6 +559,13 @@ public:
         erase_ancestors(project.db, ret);
         return ret;
       }
+    else if (name == "min")
+      {
+        diagnose_wrong_arg_count("min", 1, args.size());
+        set<revision_id> ret = args[0]->complete(project);
+        erase_descendants(project.db, ret);
+        return ret;
+      }
     else if (name == "ancestors")
       {
         diagnose_wrong_arg_count("ancestors", 1, args.size());
============================================================
--- src/sha1.cc	5e1aa972d7c7d66e06320b039989652b830dcd75
+++ src/sha1.cc	42e48b22fd88b25e0d38d4f91e1f13f8a83c7120
@@ -50,9 +50,12 @@ CMD_HIDDEN(benchmark_sha1, "benchmark_sh
   Botan::Default_Benchmark_Timer timer;
   std::map<std::string, double> results =
     Botan::algorithm_benchmark("SHA-1",  milliseconds, timer, rng, af);
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11)
+  std::map<std::string, double> results =
+    Botan::algorithm_benchmark("SHA-1",  milliseconds, rng, af);
 #else
   std::map<std::string, double> results =
-    Botan::algorithm_benchmark("SHA-1",  milliseconds, rng, af);
+    Botan::algorithm_benchmark("SHA-1",  af, rng, milliseconds, 16);
 #endif
 
   for(std::map<std::string, double>::const_iterator i = results.begin();
============================================================
--- src/ssh_agent.cc	6d188e7012a0b82f782563b09bbd7adf3f70cf75
+++ src/ssh_agent.cc	4a0dcab873559e934e41c5f220b5434d35600d9b
@@ -385,9 +385,9 @@ ssh_agent::has_key(const keypair & key)
 ssh_agent::has_key(const keypair & key)
 {
   //grab the monotone public key as an RSA_PublicKey
-  SecureVector<Botan::byte> pub_block;
-  pub_block.set(reinterpret_cast<Botan::byte const *>((key.pub)().data()),
-                (key.pub)().size());
+  SecureVector<Botan::byte> pub_block
+    (reinterpret_cast<Botan::byte const *>((key.pub)().data()),
+     (key.pub)().size());
   L(FL("has_key: building %d-byte pub key") % pub_block.size());
   shared_ptr<X509_PublicKey> x509_key =
     shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block));
============================================================
--- src/std_hooks.lua	a594ce3c5f5377c8d44c6781d41444a14a64cbb6
+++ src/std_hooks.lua	a2ec9556e5a0d3b3cc47633b14ad226b5c829925
@@ -414,14 +414,11 @@ end
    return true
 end
 
+-- This is only used by migration from old manifest-style ancestry
 function get_manifest_cert_trust(signers, id, name, val)
    return true
 end
 
-function get_file_cert_trust(signers, id, name, val)
-   return true
-end
-
 function accept_testresult_change(old_results, new_results)
    local reqfile = io.open("_MTN/wanted-testresults", "r")
    if (reqfile == nil) then return true end
@@ -1015,21 +1012,21 @@ function expand_date(str)
    if str == "now"
    then
       local t = os.time(os.date('!*t'))
-      return os.date("%Y-%m-%dT%H:%M:%S", t)
+      return os.date("!%Y-%m-%dT%H:%M:%S", t)
    end
 
    -- today don't uses the time         # for xgettext's sake, an extra quote
    if str == "today"
    then
       local t = os.time(os.date('!*t'))
-      return os.date("%Y-%m-%d", t)
+      return os.date("!%Y-%m-%d", t)
    end
 
    -- "yesterday", the source of all hangovers
    if str == "yesterday"
    then
       local t = os.time(os.date('!*t'))
-      return os.date("%Y-%m-%d", t - 86400)
+      return os.date("!%Y-%m-%d", t - 86400)
    end
 
    -- "CVS style" relative dates such as "3 weeks ago"
@@ -1047,9 +1044,9 @@ function expand_date(str)
       local t = os.time(os.date('!*t'))
       if trans[type] <= 3600
       then
-        return os.date("%Y-%m-%dT%H:%M:%S", t - (n * trans[type]))
+        return os.date("!%Y-%m-%dT%H:%M:%S", t - (n * trans[type]))
       else
-        return os.date("%Y-%m-%d", t - (n * trans[type]))
+        return os.date("!%Y-%m-%d", t - (n * trans[type]))
       end
    end
 
============================================================
--- src/transforms.cc	cdfb6854ef4992faba21074145f3c8269b845b11
+++ src/transforms.cc	b99278ffe95c0081bf4986bc74d3699c37a52948
@@ -53,15 +53,16 @@ using Botan::Hash_Filter;
 // paradigm "must" be used. this program is intended for source code
 // control and I make no bones about it.
 
-NORETURN(static inline void error_in_transform(Botan::Exception & e));
+NORETURN(static inline void error_in_transform(std::exception & e));
 
 static inline void
-error_in_transform(Botan::Exception & e, origin::type caused_by)
+error_in_transform(std::exception & e, origin::type caused_by)
 {
   // these classes can all indicate data corruption
   if (typeid(e) == typeid(Botan::Encoding_Error)
       || typeid(e) == typeid(Botan::Decoding_Error)
       || typeid(e) == typeid(Botan::Stream_IO_Error)
+      || typeid(e) == typeid(Botan::Invalid_Argument)
       || typeid(e) == typeid(Botan::Integrity_Failure))
     {
       // clean up the what() string a little: throw away the
@@ -107,7 +108,7 @@ error_in_transform(Botan::Exception & e,
         pipe->process_msg(in);                                  \
         out = pipe->read_all_as_string(Pipe::LAST_MESSAGE);     \
       }                                                         \
-    catch (Botan::Exception & e)                                \
+    catch (std::exception & e)                                   \
       {                                                         \
         pipe.reset(new Pipe(new T(carg)));                      \
         error_in_transform(e, made_from);                       \
@@ -173,7 +174,7 @@ template<> string xform<Botan::Hex_Decod
             {
               throw Botan::Decoding_Error(string("invalid hex character '") + (char)c + "'");
             }
-          catch(Botan::Exception & e)
+          catch(std::exception & e)
             {
               error_in_transform(e, made_from);
             }
@@ -219,7 +220,7 @@ void pack(T const & in, base64< gzip<T> 
       tmp = pipe->read_all_as_string(Pipe::LAST_MESSAGE);
       out = base64< gzip<T> >(tmp, in.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       pipe.reset(new Pipe(new Gzip_Compression,
                           new Base64_Encoder));
@@ -237,7 +238,7 @@ void unpack(base64< gzip<T> > const & in
       pipe->process_msg(in());
       out = T(pipe->read_all_as_string(Pipe::LAST_MESSAGE), in.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       pipe.reset(new Pipe(new Base64_Decoder,
                           new Gzip_Decompression));
@@ -264,7 +265,7 @@ calculate_ident(data const & dat,
       p->process_msg(dat());
       ident = id(p->read_all_as_string(Pipe::LAST_MESSAGE), dat.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       p.reset(new Pipe(new Hash_Filter("SHA-160")));
       error_in_transform(e, dat.made_from);
============================================================
--- src/unix/fs.cc	4a432ccc7d7f5926ba00b108f45960aa013d23b8
+++ src/unix/fs.cc	f51cae4dbc5589b0add4f7b9b649fde3c83d1220
@@ -1,3 +1,4 @@
+// Copyright (C) 2012 Stephe Leake <address@hidden>
 // Copyright (C) 2005 nathaniel smith <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -23,11 +24,13 @@
 #include <stdio.h>
 #include <fcntl.h>
 #include <dirent.h>
+#include <cstdlib>
 
 #include "../sanity.hh"
 #include "../platform.hh"
 #include "../vector.hh"
 
+using std::malloc;
 using std::string;
 using std::vector;
 
@@ -288,11 +291,74 @@ rename_clobberingly(string const & from,
 void
 rename_clobberingly(string const & from, string const & to)
 {
+  // rename doesn't work across devices, which can happen if part of the
+  // workspace is NFS mounted.
+  //
+  // We only check for that if rename fails, to avoid slowing down normal
+  // workspaces.
+
   if (rename(from.c_str(), to.c_str()))
     {
-      const int err = errno;
-      E(false, origin::system,
-        F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
+      // rename failed
+      int err = errno;
+
+      int from_fd = open(from.c_str(), O_RDONLY);
+      int to_fd = open(to.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+      struct stat from_stat;
+      struct stat to_stat;
+      fstat(from_fd, &from_stat);
+      fstat(to_fd, &to_stat);
+
+      if (from_stat.st_dev != to_stat.st_dev)
+        {
+          // different devices; use cp, rm
+          //
+          // except there isn't a C function that does 'cp', so we read in
+          // the file and write it out again.
+
+          char * buffer    = (char * )malloc(from_stat.st_size);
+          char * ptr       = buffer;
+          size_t remaining = from_stat.st_size;
+
+          do
+            {
+              ssize_t read_count = read(from_fd, ptr, remaining);
+
+              err = errno;
+
+              E(read_count >= 0, origin::system,
+                F ("error reading file '%s': %s") % from % os_strerror(err));
+
+              remaining -= read_count;
+              ptr       += read_count;
+            }
+          while (remaining > 0);
+          close(from_fd);
+
+          ptr       = buffer;
+          remaining = from_stat.st_size;
+          do
+            {
+              ssize_t write_count = write(to_fd, ptr, remaining);
+              err = errno;
+              E(write_count >= 0, origin::system,
+                F("error writing file '%s': %s") % to % os_strerror(err));
+
+              remaining -= write_count;
+              ptr       += write_count;
+            }
+          while (remaining > 0);
+          close(to_fd);
+
+          free(buffer);
+
+          remove(from.c_str());
+        }
+      else
+        {
+          E(false, origin::system,
+            F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
+        }
     }
 }
 
@@ -359,7 +425,7 @@ do_remove_recursive(string const & path)
   if (err == ENOENT)
     return; // nothing to delete
 
-  E(err == ENOTEMPTY, origin::system,
+  E((err == ENOTEMPTY) || (err == EEXIST), origin::system,
     F("could not remove '%s': %s") % path % os_strerror(err));
 
   // If we get here, it's a non-empty directory to be recursed through.
============================================================
--- src/uri.cc	ee873c2b7f4cd405ae5a0871cdd6e33341ebec9d
+++ src/uri.cc	f50e7599f6294a9872c055a8b230ea4933bdcc82
@@ -147,10 +147,10 @@ urldecode(string const & in, origin::typ
         {
           char d1, d2;
           ++i;
-          E(i != in.end(), made_from, F("Bad URLencoded string '%s'") % in);
+          E(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
           d1 = *i;
           ++i;
-          E(i != in.end(), made_from, F("Bad URLencoded string '%s'") % in);
+          E(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
           d2 = *i;
 
           char c = 0;
@@ -172,7 +172,7 @@ urldecode(string const & in, origin::typ
             case 'd': case 'D': c += 13; break;
             case 'e': case 'E': c += 14; break;
             case 'f': case 'F': c += 15; break;
-            default: E(false, made_from, F("Bad URLencoded string '%s'") % in);
+            default: E(false, made_from, F("bad URLencoded string '%s'") % in);
             }
           c *= 16;
           switch(d2)
@@ -193,7 +193,7 @@ urldecode(string const & in, origin::typ
             case 'd': case 'D': c += 13; break;
             case 'e': case 'E': c += 14; break;
             case 'f': case 'F': c += 15; break;
-            default: E(false, made_from, F("Bad URLencoded string '%s'") % in);
+            default: E(false, made_from, F("bad URLencoded string '%s'") % in);
             }
           out += c;
         }
============================================================
--- src/vocab.cc	1a4f7c3ab144ead8f4698c7c225c2fac6b161cc3
+++ src/vocab.cc	4c73af08de6dd30f710896835673361ee019466e
@@ -106,7 +106,7 @@ verify(netsync_session_key & val)
 
   E(val().size() == constants::netsync_session_key_length_in_bytes,
     val.made_from,
-    F("Invalid key length of %d bytes") % val().length());
+    F("invalid key length of %d bytes") % val().length());
 }
 
 inline void
@@ -120,7 +120,7 @@ verify(netsync_hmac_value & val)
 
   E(val().size() == constants::netsync_hmac_value_length_in_bytes,
     val.made_from,
-    F("Invalid hmac length of %d bytes") % val().length());
+    F("invalid hmac length of %d bytes") % val().length());
 }
 
 
============================================================
--- src/win32/fs.cc	e524671f74e0644fb08b16e3535fe00f80106328
+++ src/win32/fs.cc	7fe5820033df2ee964aad6ed906dde92d4d46397
@@ -255,6 +255,20 @@ do_remove_recursive(std::string const & 
   //
   // SHFileOperation makes the weird requirement that its pFrom (and pTo)
   // arguments be terminated with *two* ASCII NULs.
+
+  // http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx
+  // warns that the return codes from SHFileOperation are *not* normal
+  // Win32 error codes; so we don't try to do os_strerror on them.
+  //
+  // 0x402 is "unknown error"; it occurs for a non-existing path, which is
+  // not an error in this function. It also occurs for other problems, like
+  // '/' as a directory separator. Sigh.
+  //
+  // On Windows 7, a non-existing path returns some other error.
+  // So we check for an existing path first.
+  if (get_path_status(path) == path::nonexistent)
+    return;
+
   size_t pfLen = path.size();
   LPSTR pFrom = (LPSTR)malloc(pfLen + 2);
   memcpy(pFrom, path.data(), pfLen);
@@ -280,14 +294,7 @@ do_remove_recursive(std::string const & 
   op.lpszProgressTitle = NULL;
 
   int rc = SHFileOperationA(&op);
-  // http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx
-  // warns that the return codes from SHFileOperation are *not* normal
-  // Win32 error codes; so we don't try to do os_strerror on them.
-  //
-  // 0x402 is "unknown error"; it occurs for a non-existing path, which is
-  // not an error in this function. It also occurs for other problems, like
-  // '/' as a directory separator. Sigh.
-  E(rc == 0 || rc == 0x402, origin::system,
+  E(rc == 0, origin::system,
     F("could not remove '%s' and contents: SHFileOperation error code 0x%x")
     % path % rc);
   E(!op.fAnyOperationsAborted, origin::system,
============================================================
--- src/win32/get_system_flavour.cc	504a6ac65967da7d4b4a437d0beebc04ee8f969d
+++ src/win32/get_system_flavour.cc	08c4e014bf680bd9396fe2a70571d215560337a6
@@ -16,7 +16,7 @@ struct table_entry
 struct table_entry
 {
   unsigned long key;
-  char *val;
+  const char *val;
 };
 
 void key_to_string(unsigned long key,
============================================================
--- src/win32/terminal.cc	036785c31b25174a945c09d04030552377394221
+++ src/win32/terminal.cc	8aa0b4610e4683fea74c0378e6d934d2829f2799
@@ -49,8 +49,7 @@ unsigned int terminal_width()
         }
     }
 
-  // default to 80 columns if the width query failed.
-  return 80;
+  return 0;
 }
 
 // Local Variables:
============================================================
--- src/work.cc	36e5dcda8cf09c9054cb88e6165707112ba9ac03
+++ src/work.cc	8d3836724bbef0b606fad9c200d85126c9462565
@@ -1,4 +1,4 @@
-// Copyright (C) 2009, 2010 Stephen Leake <address@hidden>
+// Copyright (C) 2009, 2010, 2012 Stephen Leake <address@hidden>
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -900,15 +900,29 @@ workspace::maybe_update_inodeprints(data
 void
 workspace::maybe_update_inodeprints(database & db)
 {
+  maybe_update_inodeprints(db, node_restriction());
+}
+
+void
+workspace::maybe_update_inodeprints(database & db,
+                                    node_restriction const & mask)
+{
   if (!in_inodeprints_mode())
     return;
 
+  // We update the cache only for files that are included in the
+  // restriction. The only guarantee that inodeprints mode makes is that if
+  // a file's current inodeprint matches its cached inodeprint then it has
+  // not changed. i.e. for a missing file, the cache would not be updated
+  // but the old cached value can't possibly equal the current value since
+  // the file does not exist and cannot have an inodeprint.
+
   inodeprint_map ipm_new;
   temp_node_id_source nis;
   roster_t new_roster;
 
   get_current_roster_shape(db, nis, new_roster);
-  update_current_roster_from_filesystem(new_roster);
+  update_current_roster_from_filesystem(new_roster, mask);
 
   parent_map parents;
   get_parent_rosters(db, parents);
@@ -917,6 +931,10 @@ workspace::maybe_update_inodeprints(data
   for (node_map::const_iterator i = new_nodes.begin(); i != new_nodes.end(); ++i)
     {
       node_id nid = i->first;
+
+      if (!mask.includes(new_roster, nid))
+        continue;
+
       if (!is_file_t(i->second))
         continue;
       file_t new_file = downcast_to_file_t(i->second);
@@ -989,12 +1007,14 @@ struct file_itemizer : public tree_walke
   set<file_path> & unknown;
   set<file_path> & ignored;
   path_restriction const & mask;
+  bool const recurse;
   file_itemizer(database & db, workspace & work,
                 set<file_path> & k,
                 set<file_path> & u,
                 set<file_path> & i,
-                path_restriction const & r)
-    : db(db), work(work), known(k), unknown(u), ignored(i), mask(r) {}
+                path_restriction const & r,
+                bool recurse)
+    : db(db), work(work), known(k), unknown(u), ignored(i), mask(r), recurse(recurse) {}
   virtual bool visit_dir(file_path const & path);
   virtual void visit_file(file_path const & path);
 };
@@ -1004,7 +1024,8 @@ file_itemizer::visit_dir(file_path const
 file_itemizer::visit_dir(file_path const & path)
 {
   this->visit_file(path);
-  return known.find(path) != known.end();
+  // Don't recurse into ignored directories, even for 'ls ignored'.
+  return recurse && ignored.find(path) == ignored.end();
 }
 
 void
@@ -1123,60 +1144,10 @@ addition_builder::visit_dir(file_path co
 bool
 addition_builder::visit_dir(file_path const & path)
 {
-  struct directory_has_unignored_files_exception {};
-  struct directory_has_unignored_files : public dirent_consumer
-  {
-    directory_has_unignored_files(workspace & work, file_path const & p)
-      : work(work), p(p) {}
-    virtual void consume(char const * s)
-    {
-      try
-        {
-          file_path entry = p / path_component(s);
-          if (!work.ignore_file(entry))
-            throw directory_has_unignored_files_exception();
-        }
-      catch (std::logic_error)
-        {
-          // ignore this file for purposes of the warning; this file
-          // wouldn't have been added by a recursive add anyway.
-        }
-    }
-  private:
-    workspace & work;
-    file_path const & p;
-  };
-
-  if (!recursive)
-    {
-      bool warn = false;
-
-      // If the db can ever be stored in a dir
-      // then revisit this logic
-      I(!db.is_dbfile(path));
-
-      if (!respect_ignore)
-        warn = !directory_empty(path);
-      else if (!work.ignore_file(path))
-        {
-          directory_has_unignored_files dhuf(work, path);
-          try
-            {
-              read_directory(path, dhuf, dhuf, dhuf);
-            }
-          catch (directory_has_unignored_files_exception)
-            {
-              warn = true;
-            }
-        }
-
-      if (warn)
-        W(F("non-recursive add: Files in the directory '%s' "
-            "will not be added automatically.") % path);
-    }
-
   this->visit_file(path);
-  return true;
+  // when --recursive, don't recurse into ignored dirs (it would just waste time)
+  // when --no-recursive, this result is ignored (see workspace::perform_additions)
+  return !work.ignore_file(path);
 }
 
 void
@@ -1763,6 +1734,7 @@ workspace::find_unknown_and_ignored(data
 void
 workspace::find_unknown_and_ignored(database & db,
                                     path_restriction const & mask,
+                                    bool recurse,
                                     vector<file_path> const & roots,
                                     set<file_path> & unknown,
                                     set<file_path> & ignored)
@@ -1774,7 +1746,7 @@ workspace::find_unknown_and_ignored(data
   get_current_roster_shape(db, nis, new_roster);
   new_roster.extract_path_set(known);
 
-  file_itemizer u(db, *this, known, unknown, ignored, mask);
+  file_itemizer u(db, *this, known, unknown, ignored, mask, recurse);
   for (vector<file_path>::const_iterator
          i = roots.begin(); i != roots.end(); ++i)
     {
============================================================
--- src/work.hh	00e100f44763cad0019683c16c4a13d53a94d5e0
+++ src/work.hh	b3fd4ec1187a85bd63081775e15471d692be2923
@@ -1,3 +1,4 @@
+// Copyright (C) 2012 Stephen Leake <address@hidden>
 // Copyright (C) 2002 Graydon Hoare <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -18,7 +19,7 @@ class lua_hooks;
 class node_restriction;
 struct content_merge_adaptor;
 class lua_hooks;
-class i18n_format;
+struct i18n_format;
 struct options;
 class app_state;
 
@@ -137,6 +138,7 @@ public:
 
   void find_unknown_and_ignored(database & db,
                                 path_restriction const & mask,
+                                bool recurse,
                                 std::vector<file_path> const & roots,
                                 std::set<file_path> & unknown,
                                 std::set<file_path> & ignored);
@@ -287,6 +289,8 @@ public:
 
   void enable_inodeprints();
   void maybe_update_inodeprints(database &);
+  void maybe_update_inodeprints(database &,
+                                node_restriction const & mask);
 
   // the 'ignore file', .mtn-ignore in the root of the workspace, contains a
   // set of regular expressions that match pathnames.  any file or directory
============================================================
--- test/extra/bash_completion/bashrc	50253c70d06f889a476b8333d5013c5512a1ef57
+++ test/extra/bash_completion/bashrc	dd471a4f720b559295d901a73908cbc667f7227c
@@ -18,6 +18,13 @@ if [ "$BASH_COMPLETION" = "" ]; then
 	. /etc/bash_completion
     elif [ -f /usr/local/etc/bash_completion ]; then
 	. /usr/local/etc/bash_completion
+    elif [ -f /usr/share/bash-completion/.pre -a \
+           -f /usr/share/bash-completion/base ]; then
+        # In Gentoo /etc/profile.d/bash-completion.sh sources required
+        # functions only if enabled with `eselect bashcomp`. We source
+        # required definitions manually.
+        . /usr/share/bash-completion/.pre
+        . /usr/share/bash-completion/base
     else
 	echo No bash completion package present.
 	exit
============================================================
--- test/func/(imp)_merge((patch_foo_a),_(delete_foo_))/__driver__.lua	7369a583460c9839c752d40173538c32ea635a0a
+++ /dev/null	
@@ -1,24 +0,0 @@
-
-mtn_setup()
-
-mkdir("foo")
-addfile("foo/a", "blah blah")
-commit()
-base = base_revision()
-
-check(mtn("drop", "--bookkeep-only", "--recursive", "foo"), 0, false, false)
-commit()
-
-remove("foo")
-revert_to(base)
-
-writefile("foo/a", "some other stuff")
-commit()
-
-check(mtn("--branch=testbranch", "merge"), 0, false, false)
-
-check(mtn("checkout", "--revision", base, "test_dir"), 0, false, false)
-check(indir("test_dir", mtn("update", "--branch=testbranch")), 0, false, false)
-
-check(not exists("test_dir/foo/a"))
-check(not exists("test_dir/bar/a"))
============================================================
--- test/func/add_unknown_recursive/__driver__.lua	5660b8f315d9ced31c4c9115cd7404bce44b7d36
+++ /dev/null	
@@ -1,13 +0,0 @@
-
-mtn_setup()
-
-mkdir("adddir")
-writefile("adddir/test.txt", "A test file that won't be added unless --recursive is used\n")
-
-check(mtn("add", "--unknown"), 0, false, false)
-check(mtn("ls", "known"), 0, true, false)
-check(not qgrep("adddir/test.txt", "stdout"))
-check(mtn("drop", "--bookkeep-only", "adddir"), 0, true, false)
-check(mtn("add", "--unknown", "--recursive"), 0, false, false)
-check(mtn("ls", "known"), 0, true, false)
-check(qgrep("adddir/test.txt", "stdout"))
============================================================
--- test/func/addition_of_files_and_directories/__driver__.lua	0051df02ca4bdb2c88e5931b087aaa6b3b0e67e5
+++ test/func/addition_of_files_and_directories/__driver__.lua	a92d8e5231833e0f5146e04248c30eb31e82029e
@@ -15,6 +15,7 @@ check(qgrep("adding 'file0'", "stderr"))
 check(mtn("add", "file0"), 0, false, true)
 check(qgrep("adding 'file0'", "stderr"))
 
+-- Default is --no-recursive
 check(mtn("add", "dir"), 0, false, true)
 check(not qgrep("adding 'dir/file1'", "stderr"))
 check(not qgrep("adding 'dir/file2'", "stderr"))
@@ -45,36 +46,60 @@ check(not qgrep("file2", "stdout"))
 check(not qgrep("file1", "stdout"))
 check(not qgrep("file2", "stdout"))
 
--- add --unknown should add any files that ls unknown shows you and not ignored
-
 writefile("file3", "file 3\n")
---writefile("file4.ignore", "file 4 ignore\n")
 writefile("dir/file5", "file 5\n")
-writefile("dir/file6.ignore", "file 6\n")
 mkdir("dir2")
 writefile("dir2/file7", "file 7\n")
---writefile(".mtn-ignore", ".*\\.ignore$\n")
 
---check(raw_mtn("ls", "unkown"), 0, true, false)
+-- 'add --unknown --recursive' should add any files that 'ls unknown' shows.
+-- Default for add is --no-recursive, for ls it is --recursive. So dir/* and dir2/* are added.
+check(mtn("ls", "unknown"), 0, true, false)
+check(samelines("stdout",
+{"dir/file5",
+ "dir2",
+ "dir2/file7",
+ "emptyhomedir",
+ "file3",
+ "min_hooks.lua",
+ "stderr",
+ "stdout",
+ "tester.log"}))
 
-check(mtn("add", "--unknown"), 0, false, true)
-check(qgrep("adding 'file3'", "stderr"))
---check(not qgrep("adding 'file4\.ignore'", "stderr"))
-check(qgrep("adding 'dir/file5'", "stderr"))
---check(not qgrep("adding 'dir/file6\.ignore'", "stderr"))
-check(qgrep("adding 'dir2'", "stderr"))
-check(not qgrep("adding 'dir2/file7'", "stderr"))
-check(not qgrep("skipping 'dir2/file7'", "stderr"))
-check(not qgrep("adding 'test_hooks.lua'", "stderr"))
-
+-- Note that 'ls ignored' does not recurse into ignored directory 'keys'
+-- ignored files are _not_ in .mtn-ignore; see ../test_hooks.lua ignore_file
+check(mtn("ls", "ignored"), 0, true, false)
+check(samelines("stdout",
+{"keys",
+ "test.db",
+ "test_hooks.lua",
+ "ts-stderr",
+ "ts-stdin",
+ "ts-stdout"}))
+ 
+check(mtn("add", "--unknown", "--recursive"), 0, false, true)
+check(samelines("stderr",
+{"mtn: skipping ignorable file 'keys'",
+ "mtn: skipping ignorable file 'test.db'",
+ "mtn: skipping ignorable file 'test_hooks.lua'",
+ "mtn: skipping ignorable file 'ts-stderr'",
+ "mtn: skipping ignorable file 'ts-stdin'",
+ "mtn: skipping ignorable file 'ts-stdout'",
+ "mtn: adding 'dir/file5' to workspace manifest",
+ "mtn: adding 'dir2' to workspace manifest",
+ "mtn: adding 'dir2/file7' to workspace manifest",
+ "mtn: adding 'emptyhomedir' to workspace manifest",
+ "mtn: adding 'file3' to workspace manifest",
+ "mtn: adding 'min_hooks.lua' to workspace manifest",
+ "mtn: adding 'stderr' to workspace manifest",
+ "mtn: adding 'stdout' to workspace manifest",
+ "mtn: adding 'tester.log' to workspace manifest"}))
+ 
 check(mtn("status"), 0, true)
 check(not qgrep("file0", "stdout"))
 check(not qgrep("file1", "stdout"))
 check(not qgrep("file2", "stdout"))
 check(qgrep("file3", "stdout"))
---check(not qgrep("file4", "stdout"))
 check(qgrep("file5", "stdout"))
---check(not qgrep("file6", "stdout"))
 
 commit()
 
@@ -83,6 +108,6 @@ check(not qgrep("file3", "stdout"))
 check(not qgrep("file1", "stdout"))
 check(not qgrep("file2", "stdout"))
 check(not qgrep("file3", "stdout"))
---check(not qgrep("file4", "stdout"))
 check(not qgrep("file5", "stdout"))
---check(not qgrep("file6", "stdout"))
+
+-- end of file
============================================================
--- test/func/attr_mtn_execute/__driver__.lua	ac0c1f7ecf54690607e55d5aa43544c023e3700c
+++ test/func/attr_mtn_execute/__driver__.lua	b5bfcf8f4fdb98c59f95da35b93e7d97d08b99e7
@@ -30,7 +30,7 @@ copy("test.db", "test-clone.db")
 -- test clone with mtn:execute
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
 
-check(nodb_mtn("clone", testURI, "clone"), 0, false, true)
+check(nodb_mtn("clone", test_uri, "clone"), 0, false, true)
 check(indir("clone", {"test", "-x","foo"}, 0, false, false))
============================================================
--- /dev/null	
+++ test/func/automate_erase_descendants/__driver__.lua	45830e0a1e9f33e9031ca9953689b3648a9eb04e
@@ -0,0 +1,46 @@
+
+mtn_setup()
+
+-- Make sure we fail when given a non-existent revision
+check(mtn("automate", "erase_descendants", "c7539264e83c5d6af4c792f079b5d46e9c128665"), 1, false, false)
+
+--   A
+--  / \
+-- B   C
+--     |\
+--     D E
+--     \/
+--      F
+includecommon("automate_ancestry.lua")
+
+revs = make_graph()
+
+-- Now do some checks
+
+-- Empty input gives empty output
+revmap("erase_descendants", {}, {})
+
+-- Single revision input gives the same single revision output
+for _,x in pairs(revs) do
+  revmap("erase_descendants", {x}, {x})
+end
+
+-- Whole revision graph should give roots - A in this case
+revmap("erase_descendants", {revs.a, revs.b, revs.c, revs.d, revs.e, revs.f}, {revs.a})
+
+-- Sibling only inputs should give the same output
+revmap("erase_descendants", {revs.b, revs.c}, {revs.b, revs.c})
+revmap("erase_descendants", {revs.d, revs.e}, {revs.d, revs.e})
+
+-- Siblings with descendants should give just the siblings
+revmap("erase_descendants", {revs.b, revs.c, revs.d, revs.e, revs.f}, {revs.b, revs.c})
+revmap("erase_descendants", {revs.d, revs.e, revs.f}, {revs.d, revs.e})
+
+-- Leaves only input should give the same output
+revmap("erase_descendants", {revs.b, revs.f}, {revs.b, revs.f})
+
+-- Revision with its descendants should give just the revision
+revmap("erase_descendants", {revs.c, revs.d, revs.e, revs.f}, {revs.c})
+revmap("erase_descendants", {revs.e, revs.f}, {revs.e})
+
+
============================================================
--- test/func/automate_get_attributes/__driver__.lua	9b89d87cc43aa1c5ba5569d495ebfa812d81305f
+++ test/func/automate_get_attributes/__driver__.lua	3c820fcccbd5102c4bb3a4e9c01233de137aa21a
@@ -28,7 +28,7 @@ parsed = parse_basic_io(readfile("stdout
 check(fsize("stderr") == 0)
 parsed = parse_basic_io(readfile("stdout"))
 -- make sure the output generated 8 stanzas
-check(table.getn(parsed) == 8)
+check(#parsed == 8)
 lastkey = ""
 checked = {}
 for _,l in pairs(parsed) do
@@ -97,3 +97,35 @@ end
     end
 end
 
+-- check that we can query arbitrary attributes from earlier revisions
+check(mtn("automate", "get_attributes", "-r", "0123456789012345678901234567890123456789", "bla"), 1, false, true)
+check(qgrep("no revision 0123456789012345678901234567890123456789 found in database", "stderr"))
+
+rev = base_revision()
+check(mtn("automate", "get_attributes", "foo", "-r", rev), 1, false, true)
+check(qgrep("unknown path 'foo' in " .. rev, "stderr"))
+
+check(mtn("automate", "get_attributes", "testfile", "-r", rev), 0, true, false)
+
+parsed = parse_basic_io(readfile("stdout"))
+check(#parsed == 6)
+
+lastkey = ""
+checked = {}
+for _,l in pairs(parsed) do
+    if l.name == "attr" then
+        lastkey = l.values[1]
+        val = l.values[2]
+        if lastkey == "key1" then check(val == "persists")
+        elseif lastkey == "key3" then check(val == "has_been_changed")
+        elseif lastkey == "key4" then check(val == "has_been_added")
+        else check(false) end
+    end
+    if l.name == "state" then
+        check(l.values[1] == "unchanged")
+        checked[lastkey] = true
+    end
+end
+
+check(checked["key1"] and checked["key3"] and checked["key4"])
+
============================================================
--- test/func/automate_interface_version/__driver__.lua	6fdc200cf0f8c01e6174ebb04f521b0e645198ec
+++ test/func/automate_interface_version/__driver__.lua	8b65eadc6b526d1490ed02dc74a06134612c5c7b
@@ -7,4 +7,4 @@ check(numlines("a_v") == 1)
 -- MinGW's wc produces "      1" as output.  Arithmetic comparison works, string comparison doesn't
 check(numlines("a_v") == 1)
 -- This is really ^[0-9]+\.[0-9]+$, but m4 is obfuscatory.
-check(qgrep("^[0-9]+\.[0-9]+$", "a_v"))
+check(qgrep("^[0-9]+\\.[0-9]+$", "a_v"))
============================================================
--- test/func/automate_inventory_ignore_dirs/__driver__.lua	7afec31b9343b5e6d95f0d0bc30aa661254d7aeb
+++ test/func/automate_inventory_ignore_dirs/__driver__.lua	8b022036bd487f071752e21a3da566bc664c5995
@@ -14,7 +14,7 @@ function sortContentsByLine(input)
   table.insert(lines, string.sub(input, theStart))
   table.sort(lines)
 
-  local len = table.getn(lines)
+  local len = #lines
   local output = lines[1]
   for i = 2, len do
     output = output .. delimiter .. lines[i]
============================================================
--- test/func/automate_put_revision/__driver__.lua	deeeb9cb4ff8625284a4f69846ef9fa561a42ccf
+++ test/func/automate_put_revision/__driver__.lua	e116294fa44da8646b2e41288615035f913b9563
@@ -33,5 +33,5 @@ check(mtn("automate", "put_file", ""), 0
 -- but this should work (tests that we can use put_revision to commit a
 -- single-parent revision)
 check(mtn("automate", "put_file", ""), 0, false, false)
-rev = "format_version \"1\"\n\nnew_manifest [0000000000000000000000000000000000000000]\n\nold_revision [4c2c1d846fa561601254200918fba1fd71e6795d]\n\patch \"foo\"\n from [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145] to [da39a3ee5e6b4b0d3255bfef95601890afd80709]\n"
+rev = "format_version \"1\"\n\nnew_manifest [0000000000000000000000000000000000000000]\n\nold_revision [4c2c1d846fa561601254200918fba1fd71e6795d]\n\npatch \"foo\"\n from [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145] to [da39a3ee5e6b4b0d3255bfef95601890afd80709]\n"
 check(mtn("automate", "put_revision", rev), 0, false, false)
============================================================
--- test/func/automate_set_drop_attribute/__driver__.lua	5a090a94f10ebfa6ddb7378f9a285865ce881245
+++ test/func/automate_set_drop_attribute/__driver__.lua	3d759e4395849775e5194721e6f5b05f50080644
@@ -25,7 +25,7 @@ parsed = parse_basic_io(readfile("stdout
 check(mtn("automate", "get_attributes", "testfile"), 0, true, false)
 parsed = parse_basic_io(readfile("stdout"))
 
-check(table.getn(parsed) == 2)
+check(#parsed == 2)
 for _,l in pairs(parsed) do
     if l.name == "attr" then
         key = l.values[1]
@@ -44,7 +44,7 @@ parsed = parse_basic_io(readfile("stdout
 -- check if it has been really dropped
 check(mtn("automate", "get_attributes", "testfile"), 0, true, false)
 parsed = parse_basic_io(readfile("stdout"))
-check(table.getn(parsed) == 0)
+check(#parsed == 0)
 
 -- check if it escalates properly if there is no such attr to drop
 check(mtn("automate", "drop_attribute", "testfile", "foo"), 1, false, true)
============================================================
--- test/func/automate_show_conflicts/__driver__.lua	f835c5204474b98db1ef43aead8c9c0f97014575
+++ test/func/automate_show_conflicts/__driver__.lua	41adbaaa488c5b3cda193cec8d037b66368f8b55
@@ -1,6 +1,9 @@
 -- Create the various non-content conflict cases, check that
 -- 'automate show_conflict' displays them properly.
 --
+-- Except for dropped/modified; see
+-- ../resolve_conflicts_dropped_modified/__driver__.lua
+--
 -- Cases are created in the same way as in conflict_messages/__driver__.lua
 
 mtn_setup()
============================================================
--- test/func/branch_leaves_sync_bug/__driver__.lua	6b227867aeb3692dba4e68efdfe5c59ff5c15919
+++ test/func/branch_leaves_sync_bug/__driver__.lua	943c3f2d7c3294e5da221d44911c08511058acb2
@@ -46,7 +46,9 @@ chdir(test.root)
 
 -- Create Beth's workspace via checkout, so 'update' works
 chdir(test.root)
-check(abe_mtn("sync", "file://" .. test.root .. "/beth.db?*"), 0, false, false)
+
+test_uri="file://" .. url_encode_path(test.root .. "/beth.db") .. "?*"
+check(abe_mtn("sync", test_uri), 0, false, false)
 check(beth_mtn("checkout", "--branch", "testbranch", "Beth"), 0, false, false)
 chdir("Beth")
 check(beth_mtn("genkey", "address@hidden"), 0, false, false, string.rep("address@hidden", 2))
@@ -64,7 +66,7 @@ rev_b = base_revision()
 rev_b = base_revision()
 
 -- Sync dbs
-check(abe_mtn("sync", "file://" .. test.root .. "/beth.db?*"), 0, false, false)
+check(abe_mtn("sync", test_uri), 0, false, false)
 
 -- Abe merges
 chdir("Abe")
@@ -80,7 +82,8 @@ rev_d = base_revision()
 rev_d = base_revision()
 
 -- Sync dbs (not clear if direction of sync matters)
-check(beth_mtn("sync", "file://" .. test.root .. "/abe.db?*"), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/abe.db") .. "?*"
+check(beth_mtn("sync", test_uri), 0, false, false)
 
 -- bug; rev_d and rev_c are both heads according to branch_leaves table.
 check(beth_mtn("db", "check"), 0, false, false)
============================================================
--- test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua	bf16d8dcec86e4ae012d1c6078082f9d13a9fd80
+++ test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua	e75946886b2b0b4ee301016860238e6315c22a59
@@ -6,9 +6,9 @@ copy("test.db", "test-clone.db")
 commit("mybranch")
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?mybranch*"
 
-check(nodb_mtn("clone", testURI), 1, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?mybranch*"
+check(nodb_mtn("clone", test_uri), 1, false, true)
 check(qgrep("you must specify an unambiguous branch to clone", "stderr"))
 
 -- the branch option is invalid in non-URI mode
@@ -16,7 +16,7 @@ check(qgrep("the '--branch' option is on
 check(qgrep("the '--branch' option is only valid with an URI to clone", "stderr"))
 
 -- finally, this should succeed
-check(nodb_mtn("clone", testURI, "--branch=mybranch"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "--branch=mybranch"), 0, false, false)
 check(exists("mybranch"))
 check(readfile("foo") == readfile("mybranch/foo"))
 
============================================================
--- test/func/clone_branch_no_dir/__driver__.lua	b490cd593cefd9aa0b4dec9ab177eb72c3fb8058
+++ test/func/clone_branch_no_dir/__driver__.lua	1ab33d8f6d1bdc38d3804d8fcd41b6c2f65a6e61
@@ -6,18 +6,18 @@ copy("test.db", "test-clone.db")
 commit("mybranch")
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?mybranch"
 
-check(nodb_mtn("clone", testURI), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?mybranch"
+check(nodb_mtn("clone", test_uri), 0, false, false)
 check(exists("mybranch"))
 check(readfile("foo") == readfile("mybranch/foo"))
 
 -- but now that that directory exists, this clone should fail
-check(nodb_mtn("clone", testURI), 1, false, false)
+check(nodb_mtn("clone", test_uri), 1, false, false)
 
 -- but succeed if given a specific dir
-check(nodb_mtn("clone", testURI, "otherdir"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "otherdir"), 0, false, false)
 
 -- clone into . should not fail, like checkout
 mkdir("test4")
-check(indir("test4", nodb_mtn("clone", testURI, ".")), 0, false, false)
+check(indir("test4", nodb_mtn("clone", test_uri, ".")), 0, false, false)
============================================================
--- test/func/clone_creates__MTN_log/__driver__.lua	5a8fe703d56ea39db22dcfbe6183294c1eb3f01b
+++ test/func/clone_creates__MTN_log/__driver__.lua	b412d2f37df048846fc1f76ab62572d4c39b0796
@@ -13,9 +13,9 @@ copy("test.db", "test-clone.db")
 check(mtn("--branch=testbranch", "--rcfile=commit_log.lua", "commit"), 0, false, false)
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "testbranch"), 0, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "testbranch"), 0, false, true)
 
 check(exists("testbranch/_MTN/log"))
 check(fsize("_MTN/log") == 0)
============================================================
--- test/func/clone_creates_right__MTN_options/__driver__.lua	12e86831366aa0f5573d1ec511872b6f9034aeb2
+++ test/func/clone_creates_right__MTN_options/__driver__.lua	9891e77e30b8830f8040bcb817a0db26a433c9dd
@@ -10,7 +10,7 @@ commit()
 writefile("testfile", "blah")
 commit()
 
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
 
 -- We use RAW_MTN because it used to be that passing --db= (as
 -- MTN does) would hide a bug in this functionality...
@@ -18,16 +18,17 @@ testURI="file://" .. test.root .. "/test
 -- all of these inherit options settings from the current _MTN dir
 -- unless they override them on the command line
 
-check(nodb_mtn("clone", testURI, "test_dir1"), 0, false, false)
-check(nodb_mtn("clone", "--revision", rev, testURI, "test_dir2"), 0, false, false)
-check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", testURI, "test_dir3"), 0, false, false)
-check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", testURI, "--revision", rev, "test_dir4"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir1"), 0, false, false)
+check(nodb_mtn("clone", "--revision", rev, test_uri, "test_dir2"), 0, false, false)
+check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", test_uri, "test_dir3"), 0, false, false)
+check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", test_uri, "--revision", rev, "test_dir4"), 0, false, false)
 
 -- checkout fails if the specified revision is not a member of the specified branch
-testURI="file://" .. test.root .. "/test-clone.db?foobar"
-check(nodb_mtn("clone", testURI, "--revision", rev, "test_dir5"), 1, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?foobar"
+
+check(nodb_mtn("clone", test_uri, "--revision", rev, "test_dir5"), 1, false, false)
 check(nodb_mtn("cert", rev, "branch", "foobar", "-d", "test-clone.db"), 0, false, false)
-check(nodb_mtn("clone", testURI, "--revision", rev, "test_dir6"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "--revision", rev, "test_dir6"), 0, false, false)
 
 
 for i = 1,2 do
============================================================
--- test/func/clone_validates_target_directory/__driver__.lua	1286723ee00ea9ea6831e12575ba7ac32a066645
+++ test/func/clone_validates_target_directory/__driver__.lua	0c6f70282431ed62359ad0b4a827575406889f4b
@@ -6,15 +6,15 @@ copy("test.db", "test-clone.db")
 commit()
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "test_dir1"), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "test_dir1"), 0, false, false)
 
 writefile("test_dir2")
-check(nodb_mtn("clone", testURI, "test_dir2"), 1, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir2"), 1, false, false)
 
 mkdir("test_dir3")
-check(nodb_mtn("clone", testURI, "test_dir3"), 1, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir3"), 1, false, false)
 
 if existsonpath("chmod") and existsonpath("test") then
   -- skip this part if run as root (hi Gentoo!)
@@ -27,9 +27,9 @@ if existsonpath("chmod") and existsonpat
   else
     mkdir("test_dir4")
     check({"chmod", "444", "test_dir4"}, 0, false)
-    check(nodb_mtn("clone", testURI, "test_dir4"),
+    check(nodb_mtn("clone", test_uri, "test_dir4"),
              1, false, false)
-    check(nodb_mtn("clone", testURI, "test_dir4/subdir"),
+    check(nodb_mtn("clone", test_uri, "test_dir4/subdir"),
              1, false, false)
     -- Reset the permissions so Autotest can correctly clean up our
     -- temporary directory.
============================================================
--- test/func/clone_warning_with_multiple_heads/__driver__.lua	4333c6de0518517ff9bc04b4baef0d2d5ff08914
+++ test/func/clone_warning_with_multiple_heads/__driver__.lua	18e8670ea08dcb9602425ebdb97a786b20945ff6
@@ -16,9 +16,9 @@ copy("test.db", "test-clone.db")
 REV3=base_revision()
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "test_dirA"),
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "test_dirA"),
          1, false, true)
 check(qgrep(REV2, "stderr"))
 check(qgrep(REV3, "stderr"))
============================================================
--- test/func/clone_weird_branch_names/__driver__.lua	205c20a2809513b93ee9ab6c1affb24070f284a2
+++ test/func/clone_weird_branch_names/__driver__.lua	e1253c24b2b696483bb621c85e48caa8d5c2cc90
@@ -6,10 +6,11 @@ copy("test.db", "test-clone.db")
 commit("my-branch[1,2]-1^3")
 
 copy("test.db", "test-clone.db")
+
 -- some of the special chars need to get double-escaped to get "through"
-testURI="file://" .. test.root .. "/test-clone.db?my-branch\\\[1,2\\\]-1^3"
-
-check(nodb_mtn("clone", testURI), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") ..
+  "?" .. url_encode_query("my-branch\\[1,2\\]-1^3")
+check(nodb_mtn("clone", test_uri), 0, false, false)
 check(exists("my-branch[1,2]-1^3"))
 check(readfile("foo") == readfile("my-branch[1,2]-1^3/foo"))
 
============================================================
--- test/func/conflict_messages/__driver__.lua	a681cb85649f5e5ce53bad9b8ef8f2300c22d9d8
+++ test/func/conflict_messages/__driver__.lua	33836bd943bbe8c33abff9b8597db9d4c768b2d6
@@ -1,7 +1,10 @@ mtn_setup()
 mtn_setup()
 
--- this test creates the various non-content conflict cases
--- and attempts to merge them to check the various messages
+-- this test creates the various non-content conflict cases and
+-- attempts to merge them to check the various messages.
+--
+-- Except for dropped/modified; see
+-- ../resolve_conflicts_dropped_modified/__driver__.lua
 
 
 function setup(branch)
============================================================
--- test/func/db_opt_fallback_mechanisms/__driver__.lua	09354a970b921effa2850aa4ad722ce95a433ea8
+++ test/func/db_opt_fallback_mechanisms/__driver__.lua	0b0da944f19f7a0be42165069fdc1bb8862fd6ee
@@ -14,4 +14,4 @@ check(raw_mtn("au", "remote", "interface
 -- and some commands should use :memory: as default because they
 -- just need a temporary throw-away database to work properly
 check(raw_mtn("au", "remote", "interface_version", "--remote-stdio-host", "http://code.monotone.ca/monotone", "--key="), 0, false, true)
-check(qgrep("No database given; assuming ':memory:' database", "stderr"))
+check(qgrep("no database given; assuming ':memory:' database", "stderr"))
============================================================
--- /dev/null	
+++ test/func/diff_vs_manual_merge/__driver__.lua	9264cfa19cf1c5998549c4ec902535ea1bad6ebf
@@ -0,0 +1,23 @@
+-- diff should not compute diffs for files with mtn:manual_merge attributes
+-- 
+-- In 1.0 and earlier, it only ignored files that file_io.cc
+-- guess_binary considered to be binary.
+--
+-- Consider a newly added 50 MB text file (Earth gravity
+-- coefficients); this simply hangs the diff engine (it may return
+-- eventually), so the user marks it with mtn:manual_merge.
+
+mtn_setup()
+
+addfile("small_file.text", "small file\n")
+commit("base", "testbranch")
+base = base_revision()
+
+addfile("grav.coef", "50 MB of coefficients\n")
+check(mtn("attr", "set", "grav.coef", "mtn:manual_merge", "true"), 0, nil, false)
+commit("abe_1", "testbranch")
+rev_1 = base_revision()
+
+check(mtn("diff", "-r", base, "-r", rev_1), 0, true, nil)
+check(not qgrep("^\\+\\+\\+ grav.coef", "stdout"))
+check(qgrep("^# grav.coef is binary", "stdout"))
============================================================
--- /dev/null	
+++ test/func/disapprove_root_revision/__driver__.lua	743f82c455ccc4d57b1ee123d0c8fcf7341f8207
@@ -0,0 +1,11 @@
+mtn_setup()
+
+addfile("foo", "bar")
+commit()
+to_disapprove = base_revision()
+addfile("xyzzy", "xyzzy")
+commit()
+addfile("123", "456")
+commit()
+check(mtn("disapprove", to_disapprove), 1, true, true)
+check(qgrep("cannot disapprove root revision", "stderr"))
============================================================
--- test/func/extended-selectors/__driver__.lua	435f44fb1b33bdfb53929fe6bd15ba7fa4c2c1d3
+++ test/func/extended-selectors/__driver__.lua	e80ed8e831bbc9cc346e7722c9877d32887104ef
@@ -1,7 +1,9 @@
 -- selector functions are:
 --   difference(a,b)
+--   not(a)
 --   lca(a,b)
 --   max(a)
+--   min(a)
 --   ancestors(a)
 --   descendants(a)
 --   parents(a)
@@ -78,6 +80,24 @@ expect("b:testbranch|b:otherbranch", roo
 expect("b:testbranch/b:otherbranch", lhs)
 expect("b:testbranch|b:otherbranch", root, lhs, rhs, m, other, other_2)
 
+expect("min(*)", root)
+expect("min(b:testbranch)", root)
+expect("min(b:testbranch/a:Anne)", rhs)
+expect("min(b:otherbranch)", lhs)
+expect("min(a:Jim)", other)
+
+-- now do same tests again with a double not - should get same results
+expect("not(not(b:testbranch))", root, lhs, rhs, m)
+expect("not(not(b:otherbranch))", lhs, other, other_2)
+expect("not(not(b:testbranch/b:otherbranch))", lhs)
+expect("not(not(b:testbranch|b:otherbranch))", root, lhs, rhs, m, other, other_2)
+
+expect("not(b:otherbranch)", root, rhs, m)
+expect("not(b:testbranch)", other, other_2)
+expect("not(h:testbranch)", root, lhs, rhs, other, other_2)
+expect("not(lca(h:testbranch;h:otherbranch))", root, rhs, m, other, other_2)
+expect("b:testbranch/not(a:Joe)", rhs, m)
+
 expect("lca(h:testbranch;h:otherbranch)", lhs)
 expect("max(b:testbranch/a:Joe)", lhs)
 expect("max(b:otherbranch/a:Anne)")
============================================================
--- test/func/imp_test_filesync_confdir/__driver__.lua	5262dae96bcf38a2a27cea3d17523e08ad3e03aa
+++ test/func/imp_test_filesync_confdir/__driver__.lua	19822aa249d9300dc8695f41adbd12cbce5a9234
@@ -18,7 +18,8 @@ end
    rcfile:close()
 end
 
-check(mtn("sync", "file://" .. test.root .. "/test2.db?testbranch"), 0, true, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test2.db") .. "?testbranch"
+check(mtn("sync", test_uri), 0, true, false)
 
 n = 0
 
============================================================
--- test/func/list_databases/__driver__.lua	d78cd923f7f4950590407127854dcd3467b85625
+++ test/func/list_databases/__driver__.lua	9ab31d5e81fbca51ae7a5a919953e79d9c8e6631
@@ -25,15 +25,15 @@ check(mt("ls", "dbs"), 0, true, false)
 check(exists("managed_databases/bar.mtn"))
 
 check(mt("ls", "dbs"), 0, true, false)
-check(qgrep(":bar.mtn.+in.+list_databases\/managed_databases", "stdout"))
+check(qgrep(":bar.mtn.+in.+list_databases/managed_databases", "stdout"))
 check(qgrep("\tno known valid workspaces", "stdout"))
 
 check(mt("setup", "-d", ":bar", "-b", "test.foo.branch", "test_foo"), 0, false, false)
 
 check(mt("ls", "dbs"), 0, true, false)
 check(not qgrep("\tno known valid workspaces", "stdout"))
-check(qgrep("\ttest.foo.branch.+in.+list_databases\/test_foo", "stdout"))
+check(qgrep("\ttest.foo.branch.+in.+list_databases/test_foo", "stdout"))
 
 check(rename("managed_databases/bar.mtn", "managed_databases/bar.db"))
 check(mt("ls", "dbs"), 0, true, false)
-check(qgrep(":bar.db.+in.+list_databases\/managed_databases", "stdout"))
+check(qgrep(":bar.db.+in.+list_databases/managed_databases", "stdout"))
============================================================
--- test/func/list_workspaces/__driver__.lua	d7cc622b5a893fd344653512a434440082dbc247
+++ test/func/list_workspaces/__driver__.lua	e83147fac524181f19720ec74b04a38f7b1c41a7
@@ -10,17 +10,17 @@ check(raw_mtn("ls", "workspaces", "-d", 
 check(raw_mtn("setup", "-d", "test.mtn", "-b", "test.branch1", "work1"), 0, false, false)
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch1.+in.+list_workspaces\/work1", "stdout"))
+check(qgrep("test.branch1.+in.+list_workspaces/work1", "stdout"))
 
 check(raw_mtn("setup", "-d", "test.mtn", "-b", "test.branch2", "work2"), 0, false, false)
 check(rename("work1", "work3"))
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch2.+in.+list_workspaces\/work2", "stdout"))
-check(not qgrep("test.branch1.+in.+list_workspaces\/work1", "stdout"))
+check(qgrep("test.branch2.+in.+list_workspaces/work2", "stdout"))
+check(not qgrep("test.branch1.+in.+list_workspaces/work1", "stdout"))
 
 check(indir("work3", raw_mtn("register_workspace", "-d", "../test.mtn")), 0, false, false)
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch1.+in.+list_workspaces\/work3", "stdout"))
+check(qgrep("test.branch1.+in.+list_workspaces/work3", "stdout"))
 
============================================================
--- test/func/log_--no-files_and_--merges/__driver__.lua	1a7944f904399553b56f8f4cc69b22152d03b851
+++ test/func/log_--no-files_and_--merges/__driver__.lua	7e1b2967179f5b5dec932ee44c0004e41b527bb0
@@ -29,8 +29,8 @@ check(mtn("log"), 0, true, false)
 
 -- check that merge is included by default
 check(mtn("log"), 0, true, false)
-check(qgrep("^[\\|\\\\\/ ]+Revision.*"..R2, "stdout"))
+check(qgrep("^[\\|\\\\/ ]+Revision.*"..R2, "stdout"))
 
 -- and that it is excluded by --no-merges
 check(mtn("log", "--no-merges"), 0, true, false)
-check(not qgrep("^[\\|\\\\\/ ]+Revision.*"..R2, "stdout"))
+check(not qgrep("^[\\|\\\\/ ]+Revision.*"..R2, "stdout"))
============================================================
--- test/func/ls_unknown_in_subdir/__driver__.lua	2d2da6ec91b788419c052f7f8e9168253269589a
+++ test/func/ls_unknown/__driver__.lua	6654ef88997747a089cb73f7c6e7ff7ddd44d6a8
@@ -1,17 +1,71 @@
+-- Test various cases of 'ls unknown'
+
 mtn_setup()
 
+mkdir("known")
+addfile("known/1", "known 1")
+addfile("known/2", "known 2")
+commit()
+
 mkdir("foo")
 writefile("bar", "bar")
 writefile("foo/a", "aaa")
 writefile("foo/b", "bbb")
+writefile("known/3", "unknown 3")
 
-check(mtn("ls", "unknown", "foo"), 0, true, false)
-check(qgrep('foo$', "stdout"), 0, false, false)
-check(not qgrep('foo/a$', "stdout"))
-check(not qgrep('foo/b$', "stdout"))
+-- Default is recurse; recurse into both known and unknown
+-- directories (as inventory does)
+check(mtn("ls", "unknown"), 0, true, nil)
+check(samelines("stdout",
+{"bar",
+ "emptyhomedir",
+ "foo",
+ "foo/a",
+ "foo/b",
+ "known/3",
+ "min_hooks.lua",
+ "tester.log"}))
 
-check(indir("foo", mtn("ls", "unknown")), 0, true, false)
-check(qgrep('foo$', "stdout"))
-check(not qgrep('foo/a$', "stdout"))
-check(not qgrep('foo/b$', "stdout"))
+-- respect --no-recursive
+check(mtn("ls", "unknown", "--no-recursive"), 0, true, nil)
+check(samelines("stdout",
+{"bar",
+ "emptyhomedir",
+ "foo",
+ "min_hooks.lua",
+ "stdout",
+ "tester.log"}))
 
+-- Show contents of unknown directory, when the directory
+-- is specified (issue 148 case 2)
+check(mtn("ls", "unknown", "foo"), 0, true, nil)
+check(samelines("stdout",
+{"foo",
+ "foo/a",
+ "foo/b"}))
+
+-- But not with --no-recursive
+check(mtn("ls", "unknown", "foo", "--no-recursive"), 0, true, nil)
+check(samelines("stdout",
+{"foo"}))
+
+-- Show contents of unknown path in unknown directory, 
+-- when the path is specified (issue 148 case 1)
+check(mtn("ls", "unknown", "foo/a"), 0, true, nil)
+check(samelines("stdout",
+{"foo/a"}))
+
+-- From within an unknown directory, same as executing at root.
+check(indir("foo", mtn("ls", "unknown")), 0, true, nil)
+check(samelines("stdout",
+{"bar",
+ "emptyhomedir",
+ "foo",
+ "foo/a",
+ "foo/b",
+ "known/3",
+ "min_hooks.lua",
+ "stdout",
+ "tester.log"}))
+
+-- end of file
============================================================
--- test/func/ls_unknown_of_unknown_subdir/__driver__.lua	435822c98106eedf895a70cb7ed98763cb99fe3c
+++ /dev/null	
@@ -1,11 +0,0 @@
-mtn_setup()
-
-mkdir("foo")
-writefile("foo/a", "aaa")
-writefile("foo/b", "bbb")
-
-check(mtn("ls", "unknown", "foo"), 0, true, false)
-check(grep('foo$', "stdout"), 0, false, false)
-check(grep('foo/a$', "stdout"), 1, false, false)
-check(grep('foo/b$', "stdout"), 1, false, false)
-
============================================================
--- test/func/manpage/__driver__.lua	a381ef4517c907170547a4984923650617f69c60
+++ test/func/manpage/__driver__.lua	c8d528d2e1dab045cd6115111cceb2d5906296a8
@@ -5,7 +5,7 @@ check(mtn("version"), 0, true, false)
 
 -- check for a proper header line
 check(mtn("version"), 0, true, false)
-local s,e,version = string.find(readfile("stdout"), "(monotone %d+\.%d+%S*)")
+local s,e,version = string.find(readfile("stdout"), "(monotone %d+%.%d+%S*)")
 check(qgrep(".TH \"monotone\" 1 \"[0-9]{4}-[0-9]{2}-[0-9]{2}\" \"" .. version .. "\"", "manpage"))
 
 -- check required sections
============================================================
--- test/func/merge((drop_a),_(rename_a_b,_patch_b))/__driver__.lua	7c6a662fa620c7515804cb6e5e513549429015c5
+++ /dev/null	
@@ -1,27 +0,0 @@
-
-mtn_setup()
-
-writefile("original", "some stuff here")
-
-check(mtn("add", "original"), 0, false, false)
-commit()
-base = base_revision()
-
--- drop it
-check(mtn("drop", "--bookkeep-only", "original"), 0, false, false)
-commit()
-
-revert_to(base)
-
--- patch and rename it
-rename("original", "different")
-check(mtn("rename", "--bookkeep-only", "original", "different"), 0, false, false)
-append("different", "more\n")
-commit()
-
-check(mtn("merge"), 0, false, false)
-check(mtn("checkout", "-b", "testbranch", "clean"), 0, false, false)
-
--- check that the file doesn't exist
-check(not exists("clean/original"))
-check(not exists("clean/different"))
============================================================
--- test/func/merge((patch_a),_(drop_a))/__driver__.lua	336ee81dc87b3f5843cfcbc94b0e2c899f965523
+++ /dev/null	
@@ -1,27 +0,0 @@
-
-mtn_setup()
-
-writefile("base", "foo blah")
-writefile("left", "bar blah")
-
-copy("base", "testfile")
-check(mtn("add", "testfile"), 0, false, false)
-commit()
-base = base_revision()
-
-copy("left", "testfile")
-commit()
-left = base_revision()
-
-revert_to(base)
-
-check(mtn("drop", "testfile"), 0, false, false)
-commit()
-
-check(mtn("merge"), 0, false, true)
-
--- check that we're warned about the changes being dropped...
-
-check(qgrep("content changes to the file", "stderr"))
-check(qgrep(left, "stderr"))
-
============================================================
--- test/func/merge((patch_a),_(drop_a,_add_a))/__driver__.lua	9fa8b98418f195441770ae5069b8417245ace48f
+++ /dev/null	
@@ -1,31 +0,0 @@
-
-mtn_setup()
-
--- In this case, the patch should be completely ignored; we shouldn't
--- even try to do a merge.
-
-writefile("base", "foo blah")
-writefile("left", "bar blah")
-writefile("new_right", "baz blah")
-
-copy("base", "testfile")
-check(mtn("add", "testfile"), 0, false, false)
-commit()
-base = base_revision()
-
-copy("left", "testfile")
-commit()
-
-revert_to(base)
-
-remove("testfile")
-check(mtn("drop", "--bookkeep-only", "testfile"), 0, false, false)
-commit()
-
-copy("new_right", "testfile")
-check(mtn("add", "testfile"), 0, false, false)
-commit()
-
-check(mtn("merge"), 0, false, false)
-check(mtn("update"), 0, false, false)
-check(samefile("testfile", "new_right"))
============================================================
--- test/func/netsync_key_hooks/__driver__.lua	d7fad5a70688d3db512a05ebb0e3643006f8c7e2
+++ test/func/netsync_key_hooks/__driver__.lua	0c2d3f3443fa9ff90615cd5338e322baa5ad44aa
@@ -67,5 +67,10 @@ server({}, 1, "you have multiple private
 end
 
 server({}, 1, "you have multiple private keys")
-server({"--rcfile", "server-hooks.lua"}, -SIGTERM, "beginning service on localhost")
 
+-- SIGTERM gives unreliable process status on Windows
+if(ostype == "Windows") then
+   partial_skip = true
+else         
+   server({"--rcfile", "server-hooks.lua"}, -SIGTERM, "beginning service on localhost")
+end
============================================================
--- test/func/netsync_negotiation/__driver__.lua	38cd5d9df0e16cf05d59f0d9525ae546a9654f5f
+++ test/func/netsync_negotiation/__driver__.lua	0b30d988c62dfc2aa3c4a7e0021b3395faba8609
@@ -87,10 +87,10 @@ function check_same_revs(cmd1, cmd2)
    check(cmd2, 0, true, false)
    local data2 = {}
    for l in io.lines("stdout") do table.insert(data2, l) end
-   L("Command 1 has ", table.getn(data1), " lines.")
-   L("Command 2 has ", table.getn(data2), " lines.")
-   check(table.getn(data1) == table.getn(data2))
-   for i = 1, table.getn(data1) do
+   L("Command 1 has ", #data1, " lines.")
+   L("Command 2 has ", #data2, " lines.")
+   check(#data1 == #data2)
+   for i = 1, #data1 do
       local hash_len = 40
       check(data1[i]:sub(1, hash_len) == data2[i]:sub(1, hash_len))
    end
============================================================
--- test/func/netsync_over_pipes/__driver__.lua	e4ee774912c36ca34a2bfe897daecac570f626a7
+++ test/func/netsync_over_pipes/__driver__.lua	e769e909c59f15351c957a47d98bd7be5868e9f7
@@ -7,6 +7,7 @@ commit()
 addfile("testfile", "foo")
 commit()
 
-check(mtn("sync", "file://" .. test.root .. "/test2.db?testbranch"), 0, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test2.db") .. "?testbranch"
+check(mtn("sync", test_uri), 0, false, true)
 check(not qgrep("error", "stderr"))
 check_same_db_contents("test.db", "test2.db")
============================================================
--- /dev/null	
+++ test/func/netsync_uri_multi_include_exclude/__driver__.lua	d54722eeef8802ba80caa5b9a9f3c355c0763081
@@ -0,0 +1,32 @@
+-- Show that multiple include and exclude patterns are supported
+
+includecommon("netsync.lua")
+mtn_setup()
+netsync.setup()
+
+addfile("file1", "foo")
+commit("branch1")
+
+addfile("file2", "bar")
+commit("branch2")
+
+addfile("file3", "baz")
+commit("branch3")
+
+addfile("file4", "4")
+commit("branch4")
+
+srv = netsync.start()
+
+check(mtn2("pull", srv.url .. "?-branch1;branch2;-branch3;branch4"), 0, nil, true)
+check(qgrep("include pattern  '{branch2,branch4}'", "stderr"))
+check(qgrep("exclude pattern  '{branch1,branch3}'", "stderr"))
+
+check(mtn2("ls", "branches"), 0, true)
+
+check(not (qgrep("^branch1$", "stdout")))
+check(qgrep("^branch2$", "stdout"))
+check(not (qgrep("^branch3", "stdout")))
+check(qgrep("^branch4", "stdout"))
+
+srv:stop()
============================================================
--- /dev/null	
+++ test/func/pull_branch_vs_db_check/__driver__.lua	65e0a47e3dc19cf4d1161f89c8fb7fddfa1de6e3
@@ -0,0 +1,37 @@
+-- Test for issue 201
+--
+-- original problem:
+--
+-- mtn pull with branch pattern does not pull branch certs from
+-- propagate that don't match pattern. So if there are revs that are
+-- pulled because of parent relationships, but only have branch certs
+-- that don't match the pattern, mtn db check reports missing branch
+-- certs as serious problem.
+
+includecommon("netsync.lua")
+mtn_setup("testbranch")
+netsync.setup()
+
+addfile("testfile", "blah stuff")
+commit()
+ver0 = base_revision()
+
+addfile("testfile2", "some more data")
+commit("otherbranch")
+ver1 = base_revision()
+
+check(mtn("propagate", "testbranch", "otherbranch"), 0, nil, true)
+
+netsync.pull("otherbranch")
+
+-- Now ver0 has no branch cert in mtn2:
+check(mtn("ls", "certs", ver0), 0, true, nil)
+check(qgrep("Name  : branch", "stdout"))
+
+check(mtn2("ls", "certs", ver0), 0, true, nil)
+check(not qgrep("Name  : branch", "stdout"))
+
+-- db check now says this is only a minor problem
+check(mtn2("db", "check"), 0, nil, true)
+check(qgrep("missing branch cert", "stderr"))
+check(qgrep("mtn: minor problems detected", "stderr"))
============================================================
--- test/func/resolve_conflicts_all_resolutions/__driver__.lua	0a504a8ecd385dadb9a01b7fc2c836e58dbaf6ff
+++ test/func/resolve_conflicts_all_resolutions/__driver__.lua	e491c1be8ceb2a90b1f80f6e29a4430e4ef8a439
@@ -1,5 +1,8 @@
 -- Test showing and setting all possible conflict resolutions in a
 -- conflict file. Also test 'conflict show_remaining'.
+--
+-- Except for dropped/modified; see
+-- ../resolve_conflicts_dropped_modified/__driver__.lua
 
 mtn_setup()
 get("merge3_hook.lua")
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/__driver__.lua	2c87a2a5810a34019c4ca4148eb2b9bede764267
@@ -0,0 +1,514 @@
+-- Test reporting and resolving drop/modified conflicts
+--
+-- tests for the restrictions imposed by orphan, resoltion consistency
+-- are in resolved_dropped_modified_3
+-- 
+-- other resolve_conflicts_dropped_modified_* tests validate resolving
+-- in extended use cases.
+
+-- Parent nodes can be in several states: dropped, modified,
+-- recreated. Modified nodes can also be renamed, but that is
+-- orthogonal to resolutions; the parent name is used to detect
+-- recreate or duplicate name, and to name the result node if no
+-- rename resolution is specified. Dropped files can also be orphaned,
+-- but that just restricts the allowed resolutions (no keep).
+-- 
+-- We need to test all combinations of left/right, parent node state,
+-- and resolution:
+--
+-- state    resolution      left file       right file
+-- dropped  drop            file_3 etc      file_2 etc
+--          keep            (not supported)
+--          rename          (not supported)
+--          user            (not supported)
+--          user_rename     (not supported)
+-- 
+-- modified drop            file_2      file_3 etc
+--          keep            file_4      file_5
+--          rename          file_14     file_9
+--          user            file_6      file_7
+--          user_rename     file_15     file_10
+-- 
+-- recreated drop           file_16     file_12
+--           keep           file_12     file_14
+--           rename         file_17     file_15
+--           user           file_13     file_16
+--           user_rename    file_18     file_13
+--
+
+mtn_setup()
+
+-- Create conflicts with single resolutions; modify and/or rename file in
+-- one parent, drop in the other.
+-- 
+-- Six conflicts to test three possible resolutions, with drop on
+-- both left and right. 
+
+addfile("file_2", "file_2 base") -- modify/rename left: drop right: drop left, drop right
+addfile("file_3", "file_3 base") -- drop left; modify/rename right: drop left, drop right
+addfile("file_4", "file_4 base") -- modify left; modify, rename, and drop right; keep left, drop right
+addfile("file_5", "file_5 base") -- modify, rename, and drop left; modify right; drop left, keep right
+addfile("file_6", "file_6 base") -- modify/rename left, drop right; user left, drop right
+addfile("file_7", "file_7 base") -- drop left, modify/rename right; drop left, user right
+commit("testbranch", "base")
+base = base_revision()
+
+writefile("file_2", "file_2 left")
+check(mtn("mv", "file_2", "file_2_renamed"), 0, false, false)
+
+check(mtn("drop", "file_3"), 0, false, false)
+
+writefile("file_4", "file_4 left")
+
+writefile("file_5", "file_5 left")
+check(mtn("mv", "file_5", "file_5_renamed"), 0, false, false)
+
+writefile("file_6", "file_6 left")
+check(mtn("mv", "file_6", "file_6_renamed"), 0, false, false)
+
+check(mtn("drop", "file_7"), 0, false, false)
+
+commit("testbranch", "left 1a")
+
+check(mtn("drop", "file_5_renamed"), 0, nil, true)
+commit("testbranch", "left 1b")
+left_1 = base_revision()
+
+revert_to(base)
+
+check(mtn("drop", "file_2"), 0, false, false)
+
+writefile("file_3", "file_3 right")
+check(mtn("mv", "file_3", "file_3_renamed"), 0, false, false)
+
+writefile("file_4", "file_4 right")
+check(mtn("mv", "file_4", "file_4_renamed"), 0, false, false)
+
+writefile("file_5", "file_5 right")
+
+check(mtn("drop", "file_6"), 0, false, false)
+
+writefile("file_7", "file_7 right")
+check(mtn("mv", "file_7", "file_7_renamed"), 0, false, false)
+
+commit("testbranch", "right 1a")
+
+check(mtn("drop", "file_4_renamed"), 0, false, false)
+commit("testbranch", "right 1b")
+right_1 = base_revision()
+
+-- Now start the conflict resolution process. First show the conflicts.
+check(mtn("show_conflicts", left_1, right_1), 0, nil, true)
+canonicalize("stderr")
+check(samefilestd("show_conflicts", "stderr"))
+
+check(mtn("automate", "show_conflicts", left_1, right_1), 0, true, nil)
+canonicalize("stdout")
+check(samefilestd("conflicts", "stdout"))
+
+-- Now store and resolve them one by one.
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+check(samelines("stderr",
+{"mtn: 6 conflicts with supported resolutions.",
+ "mtn: stored in '_MTN/conflicts'"}))
+
+canonicalize("_MTN/conflicts")
+check(samefilestd("conflicts", "_MTN/conflicts"))
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_2_renamed'",
+ "mtn: modified on the left",
+ "mtn: dropped on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+check(mtn("conflicts", "resolve_first", "drop"), 0, nil, true)
+
+-- check for nice error message if not all dropped_modified conflicts are resolved
+-- we have to use explicit_merge to get left/right to match 'conflicts store'
+check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 1, nil, true)
+check(qgrep("no resolution provided for dropped_modified 'file_3_renamed'", "stderr"))
+             
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_3_renamed'",
+ "mtn: dropped on the left",
+ "mtn: modified on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+check(mtn("conflicts", "resolve_first", "drop"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_4'",
+ "mtn: modified on the left",
+ "mtn: dropped on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+check(mtn("conflicts", "resolve_first", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_5'",
+ "mtn: dropped on the left",
+ "mtn: modified on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+check(mtn("conflicts", "resolve_first", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_6_renamed'",
+ "mtn: modified on the left",
+ "mtn: dropped on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+mkdir("_MTN/resolutions")
+writefile("_MTN/resolutions/file_6_resolved", "file_6 resolved")
+check(mtn("conflicts", "resolve_first", "user", "_MTN/resolutions/file_6_resolved"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_7_renamed'",
+ "mtn: dropped on the left",
+ "mtn: modified on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first keep",
+ "mtn: resolve_first user \"name\""}))
+
+writefile("_MTN/resolutions/file_7_resolved", "file_7 resolved")
+check(mtn("conflicts", "resolve_first", "user", "_MTN/resolutions/file_7_resolved"), 0, nil, true)
+
+canonicalize("_MTN/conflicts")
+check(samefilestd("conflicts-resolved", "_MTN/conflicts"))
+
+-- we have to use explicit_merge to get left/right to match 'conflicts store'
+check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: [left]  7b2ef4343b0717bcd122498a1a0b7ff7acffb64c",
+ "mtn: [right] ca7922b510f9daf5c4b28c6788315ee82eb9a7f0",
+ "mtn: dropping 'file_2_renamed' from left",
+ "mtn: dropping 'file_3_renamed' from right",
+ "mtn: keeping 'file_4' from left",
+ "mtn: history for 'file_4' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: keeping 'file_5' from right",
+ "mtn: history for 'file_5' from right will be lost; see user manual Merge Conflicts section",
+ "mtn: replacing content of 'file_6_renamed' from left with '_MTN/resolutions/file_6_resolved'",
+ "mtn: history for 'file_6_renamed' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: replacing content of 'file_7_renamed' from right with '_MTN/resolutions/file_7_resolved'",
+ "mtn: history for 'file_7_renamed' from right will be lost; see user manual Merge Conflicts section",
+ "mtn: [merged] 57bf835ef0434411189dc3eca1650a6bba513c14"}))
+
+-- If a file is renamed (without other change) and dropped,
+-- the rename is ignored:
+
+addfile("file_8", "file_8 base") -- rename left, drop right
+commit("testbranch", "base 2")
+base_2 = base_revision()
+
+check(mtn("mv", "file_8", "file_8_renamed"), 0, false, false)
+commit("testbranch", "left 2")
+left_2 = base_revision()
+
+revert_to(base_2)
+
+check(mtn("drop", "file_8"), 0, false, false)
+commit("testbranch", "right 2")
+right_2 = base_revision()
+
+check(mtn("show_conflicts", left_2, right_2), 0, nil, true)
+check(qgrep("0 conflicts", "stderr"))
+
+-- There is no such thing as a dropped/modified directory; if the
+-- directory is empty, the only possible change is rename, which is
+-- ignored.
+--
+-- If the directory is not empty, that creates a dropped/modified file
+-- conflict (not an orphaned file conflict, although that would also
+-- make sense). This used to be the test
+-- "(imp)_merge((patch_foo_a),_(delete_foo_))"
+--
+-- We create four potential conflicts; one ignored, three with different resolutions:
+
+adddir("dir1") -- empty - drop left; rename right (not a conflict; just dropped)
+mkdir("dir2")  -- not empty - modified left; drop right
+addfile("dir2/file_9", "file_9 base") -- resolution: rename left, drop right
+addfile("dir2/file_10", "file_10 base") -- resolution: user_rename left, drop right
+addfile("dir2/file_11", "file_11 base") -- resolution: drop left, drop right
+commit("testbranch", "base 3")
+base_3 = base_revision()
+
+check(mtn("mv", "dir1", "dir3"), 0, false, false)
+
+writefile("dir2/file_9", "file_9 left")
+writefile("dir2/file_10", "file_10 left")
+writefile("dir2/file_11", "file_11 left")
+commit("testbranch", "left 3")
+left_3 = base_revision()
+
+revert_to(base_3)
+
+check(mtn("drop", "dir1", "--no-recursive"), 0, false, false)
+
+check(mtn("drop", "--recursive", "dir2"), 0, false, false)
+
+commit("testbranch", "right 3")
+right_3 = base_revision()
+
+check(mtn("show_conflicts", left_3, right_3), 0, nil, true)
+canonicalize("stderr")
+check(samefilestd("show_conflicts-orphaned", "stderr"))
+
+-- Show these conflicts can be resolved
+check(mtn("conflicts", "store", left_3, right_3), 0, nil, true)
+
+canonicalize("_MTN/conflicts")
+check(samefilestd("conflicts-orphaned", "_MTN/conflicts"))
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'dir2/file_10'",
+ "mtn: modified on the left",
+ "mtn: orphaned on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first drop",
+ "mtn: resolve_first rename",
+ "mtn: resolve_first user_rename \"new_content_name\" \"new_file_name\""}))
+
+mkdir("_MTN")
+mkdir("_MTN/resolutions")
+writefile("_MTN/resolutions/file_10", "file_10 user")
+check(mtn("conflicts", "resolve_first", "user_rename", "_MTN/resolutions/file_10", "file_10"), 0, nil, true)
+
+-- Test error message from invalid resolution
+check(mtn("conflicts", "resolve_first", "keep"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: orphaned files must be renamed"}))
+
+check(mtn("conflicts", "resolve_first", "user", "foo"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: orphaned files must be renamed"}))
+
+check(mtn("conflicts", "resolve_first", "drop"), 0, nil, nil)
+
+check(mtn("conflicts", "resolve_first", "rename", "file_9"), 0, nil, nil)
+
+check(samefilestd("conflicts-orphaned-resolved", "_MTN/conflicts"))
+
+check(mtn("explicit_merge", "--resolve-conflicts", left_3, right_3, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: [left]  4228fbd8003cdd89e7eea51fcef10c3f91d78f69",
+ "mtn: [right] 6cb6438a490a1ad4c69ff6cac23c75a903cd9cfd",
+ "mtn: replacing content of 'dir2/file_10' from left with '_MTN/resolutions/file_10'",
+ "mtn: history for 'dir2/file_10' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: renaming 'dir2/file_10' from left to 'file_10'",
+ "mtn: dropping 'dir2/file_11' from left",
+ "mtn: renaming 'dir2/file_9' from left to 'file_9'",
+ "mtn: history for 'dir2/file_9' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: [merged] 5cafe5405ed31c81f9061be62e38f25aeaaea9c5"}))
+
+check(mtn("update"), 0, nil, true)
+
+-- Test recreated; drop then re-add vs modify. This used to be the test
+-- "merge((patch_a),_(drop_a,_add_a))"
+addfile("file_12", "file_12 base") -- modify in left; drop, add in right: keep left, drop right
+addfile("file_13", "file_13 base") -- drop, add in left; modify in right: user left, user_rename right
+
+-- Other cases not covered above
+addfile("file_14", "file_14 base") -- modify in left; recreated in right: rename left, keep right
+addfile("file_15", "file_15 base") -- modify in left; recreated in right: user_rename left, rename right
+addfile("file_16", "file_16 base") -- recreated in left; modify in right: drop left, rename right
+addfile("file_17", "file_17 base") -- recreated in left; modify in right: rename left, drop right
+addfile("file_18", "file_18 base") -- recreated in left; modify in right: user_rename left, drop right
+commit("testbranch", "base 4")
+base_4 = base_revision()
+
+writefile("file_12", "file_12 left")
+check(mtn("drop", "file_13"), 0, false, false)
+
+writefile("file_14", "file_14 left")
+writefile("file_15", "file_15 left")
+
+check(mtn("drop", "file_16"), 0, false, false)
+check(mtn("drop", "file_17"), 0, false, false)
+check(mtn("drop", "file_18"), 0, false, false)
+commit("testbranch", "left 4a")
+
+addfile("file_13", "file_13 left re-add")
+addfile("file_16", "file_16 left re-add")
+addfile("file_17", "file_17 left re-add")
+addfile("file_18", "file_18 left re-add")
+commit("testbranch", "left 4b")
+left_4 = base_revision()
+
+revert_to(base_4)
+
+check(mtn("drop", "file_12"), 0, false, false)
+writefile("file_13", "file_13 right")
+check(mtn("drop", "file_14"), 0, false, false)
+check(mtn("drop", "file_15"), 0, false, false)
+writefile("file_16", "file_16 right")
+writefile("file_17", "file_17 right")
+writefile("file_18", "file_18 right")
+commit("testbranch", "right 4a")
+
+addfile("file_12", "file_12 right re-add")
+addfile("file_14", "file_14 right re-add")
+addfile("file_15", "file_15 right re-add")
+commit("testbranch", "right 4b")
+right_4 = base_revision()
+
+check(mtn("show_conflicts", left_4, right_4), 0, nil, true)
+check(samelines("stderr",
+{"mtn: [left]     " .. left_4,
+ "mtn: [right]    " .. right_4,
+ "mtn: [ancestor] " .. base_4,
+ "mtn: conflict: file 'file_12'",
+ "mtn: modified on the left, named file_12",
+ "mtn: dropped and recreated on the right",
+ "mtn: conflict: file 'file_13'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right, named file_13",
+ "mtn: conflict: file 'file_14'",
+ "mtn: modified on the left, named file_14",
+ "mtn: dropped and recreated on the right",
+ "mtn: conflict: file 'file_15'",
+ "mtn: modified on the left, named file_15",
+ "mtn: dropped and recreated on the right",
+ "mtn: conflict: file 'file_16'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right, named file_16",
+ "mtn: conflict: file 'file_17'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right, named file_17",
+ "mtn: conflict: file 'file_18'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right, named file_18",
+ "mtn: 7 conflicts with supported resolutions."}))
+
+check(mtn("conflicts", "store", left_4, right_4), 0, nil, true)
+check(samefilestd("conflicts-recreated", "_MTN/conflicts"))
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_12'",
+ "mtn: modified on the left",
+ "mtn: dropped and recreated on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_left drop",
+ "mtn: resolve_first_left rename",
+ "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first_left keep",
+ "mtn: resolve_first_left user \"name\"",
+ "mtn: resolve_first_right drop",
+ "mtn: resolve_first_right rename",
+ "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first_right keep",
+ "mtn: resolve_first_right user \"name\""}))
+
+-- need to specify both left and right resolutions
+check(mtn("conflicts", "resolve_first", "drop"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"}))
+
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+qgrep("mtn: conflict: file 'file_13'", "stderr")
+qgrep("mtn: dropped and recreated on the left", "stderr")
+qgrep("mtn: modified on the right", "stderr")
+
+mkdir("_MTN")
+mkdir("_MTN/resolutions")
+writefile("_MTN/resolutions/file_13", "file_13 user")
+check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_13"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+check(mtn("conflicts", "resolve_first_left", "rename", "file_14_renamed"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, nil)
+
+writefile("_MTN/resolutions/file_15_left", "file_15 user left")
+check(mtn("conflicts", "resolve_first_left", "user_rename", "_MTN/resolutions/file_15_left", "file_15_renamed_left"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "rename", "file_15_renamed_right"), 0, nil, nil)
+
+check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "rename", "file_16_renamed"), 0, nil, nil)
+
+check(mtn("conflicts", "resolve_first_left", "rename", "file_17_renamed"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+mkdir("_MTN")
+mkdir("_MTN/resolutions")
+writefile("_MTN/resolutions/file_18", "file_18 user")
+check(mtn("conflicts", "resolve_first_left", "user_rename", "_MTN/resolutions/file_18", "file_18_renamed"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+check(samefilestd("conflicts-recreated-resolved", "_MTN/conflicts"))
+
+check(mtn("explicit_merge", "--resolve-conflicts", left_4, right_4, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: [left]  " .. left_4,
+ "mtn: [right] " .. right_4,
+ "mtn: keeping 'file_12' from left",
+ "mtn: history for 'file_12' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: dropping 'file_12' from right",
+ "mtn: replacing content of 'file_13' from left with '_MTN/resolutions/file_13'",
+ "mtn: dropping 'file_13' from right",
+ "mtn: renaming 'file_14' from left to 'file_14_renamed'",
+ "mtn: history for 'file_14' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: keeping 'file_14' from right",
+ "mtn: replacing content of 'file_15' from left with '_MTN/resolutions/file_15_left'",
+ "mtn: history for 'file_15' from left will be lost; see user manual Merge Conflicts section",
+ "mtn: renaming 'file_15' from left to 'file_15_renamed_left'",
+ "mtn: renaming 'file_15' from right to 'file_15_renamed_right'",
+ "mtn: dropping 'file_16' from left",
+ "mtn: renaming 'file_16' from right to 'file_16_renamed'",
+ "mtn: history for 'file_16' from right will be lost; see user manual Merge Conflicts section",
+ "mtn: renaming 'file_17' from left to 'file_17_renamed'",
+ "mtn: dropping 'file_17' from right",
+ "mtn: replacing content of 'file_18' from left with '_MTN/resolutions/file_18'",
+ "mtn: renaming 'file_18' from left to 'file_18_renamed'",
+ "mtn: dropping 'file_18' from right",
+ "mtn: [merged] c6d6dba528110b6aa32572f6939982a1d56b17e0"}))
+
+check(mtn("update"), 0, nil, true)
+check(samelines("file_12", {"file_12 left"}))
+check(samelines("file_13", {"file_13 user"}))
+check(samelines("file_14_renamed", {"file_14 left"}))
+check(samelines("file_14", {"file_14 right re-add"}))
+check(samelines("file_15_renamed_left", {"file_15 user left"}))
+check(samelines("file_15_renamed_right", {"file_15 right re-add"}))
+check(samelines("file_16_renamed", {"file_16 right"}))
+check(samelines("file_17_renamed", {"file_17 left re-add"}))
+check(samelines("file_18_renamed", {"file_18 user"}))
+
+-- end of file
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts	c6a5d84c1e1345aef2a87ad2885fb6b9a03b70b9
@@ -0,0 +1,69 @@
+    left [7b2ef4343b0717bcd122498a1a0b7ff7acffb64c]
+   right [ca7922b510f9daf5c4b28c6788315ee82eb9a7f0]
+ancestor [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+
+        conflict dropped_modified
+   ancestor_name "file_2"
+ancestor_file_id [4fd0fa24812427ee6c13a839d2a90bc0c6fc0091]
+       left_type "modified file"
+       left_name "file_2_renamed"
+    left_file_id [afbd804a8c606a93f9d8bc0fdacc1db9f34b4548]
+      right_type "dropped file"
+       right_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+      right_name "file_2"
+   right_file_id [4fd0fa24812427ee6c13a839d2a90bc0c6fc0091]
+
+        conflict dropped_modified
+   ancestor_name "file_3"
+ancestor_file_id [311aac8e6f1fb6fca84da5153aa6d5a1c6faff79]
+       left_type "dropped file"
+        left_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+       left_name "file_3"
+    left_file_id [311aac8e6f1fb6fca84da5153aa6d5a1c6faff79]
+      right_type "modified file"
+      right_name "file_3_renamed"
+   right_file_id [da7ea65160c9c92f4ed120568229342fe7daa924]
+
+        conflict dropped_modified
+   ancestor_name "file_4"
+ancestor_file_id [861174e6639f2991d9c065785cd9679be0c774f1]
+       left_type "modified file"
+       left_name "file_4"
+    left_file_id [57f26e8057760f356762c405bdc1f89b0a9bfed2]
+      right_type "dropped file"
+       right_rev [4125c3aea991e97a3063c3e3f425a47d58e7c8da]
+      right_name "file_4_renamed"
+   right_file_id [259dbd8291bd18ba3fdb9adb3776eb26f94b1230]
+
+        conflict dropped_modified
+   ancestor_name "file_5"
+ancestor_file_id [d141bda733292622ebce4c231cbb0da44ac59f40]
+       left_type "dropped file"
+        left_rev [b0d6953684d49dd6bd345c312d6a0c8fed3078ce]
+       left_name "file_5_renamed"
+    left_file_id [420cde699a422f7c3d2c8951c46ddfd546db66c0]
+      right_type "modified file"
+      right_name "file_5"
+   right_file_id [e7eb31ab48c2e42126f44ef78ffdb27f388333b0]
+
+        conflict dropped_modified
+   ancestor_name "file_6"
+ancestor_file_id [d5531643d3b5aee3e10eceabbdfecf167148a2d9]
+       left_type "modified file"
+       left_name "file_6_renamed"
+    left_file_id [1f62c734b799474943bfdda12b062f61024dc059]
+      right_type "dropped file"
+       right_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+      right_name "file_6"
+   right_file_id [d5531643d3b5aee3e10eceabbdfecf167148a2d9]
+
+        conflict dropped_modified
+   ancestor_name "file_7"
+ancestor_file_id [1a9d3059360fd5f04d0cec05875c8e376da0eaef]
+       left_type "dropped file"
+        left_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+       left_name "file_7"
+    left_file_id [1a9d3059360fd5f04d0cec05875c8e376da0eaef]
+      right_type "modified file"
+      right_name "file_7_renamed"
+   right_file_id [9b362e2754ea1f943497d5a31de3899271ee5a8b]
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts-orphaned	12fab989ba071fd2babef30ba3aad1744d4cb2fa
@@ -0,0 +1,36 @@
+    left [4228fbd8003cdd89e7eea51fcef10c3f91d78f69]
+   right [6cb6438a490a1ad4c69ff6cac23c75a903cd9cfd]
+ancestor [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+
+        conflict dropped_modified
+   ancestor_name "dir2/file_10"
+ancestor_file_id [7368a4340573dca149c05db6f49638fafee766d0]
+       left_type "modified file"
+       left_name "dir2/file_10"
+    left_file_id [080c590e6e671b1b9ca0e752e1bc468c5167e2a9]
+      right_type "orphaned file"
+       right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+      right_name "dir2/file_10"
+   right_file_id [7368a4340573dca149c05db6f49638fafee766d0]
+
+        conflict dropped_modified
+   ancestor_name "dir2/file_11"
+ancestor_file_id [498b49fddbd0418f62eb19d2096de816f3e34116]
+       left_type "modified file"
+       left_name "dir2/file_11"
+    left_file_id [ea74c930ce75ac43380f520f9cdd4e85f56ed049]
+      right_type "orphaned file"
+       right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+      right_name "dir2/file_11"
+   right_file_id [498b49fddbd0418f62eb19d2096de816f3e34116]
+
+        conflict dropped_modified
+   ancestor_name "dir2/file_9"
+ancestor_file_id [6259d1132e063364597e6ee84a431b432f0e9cf9]
+       left_type "modified file"
+       left_name "dir2/file_9"
+    left_file_id [d1c21ac76fd433b5f1daead0438938b45f9e13a8]
+      right_type "orphaned file"
+       right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+      right_name "dir2/file_9"
+   right_file_id [6259d1132e063364597e6ee84a431b432f0e9cf9]
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts-orphaned-resolved	672fd1e54221b5b6360759b9a9a41426ce36ed6d
@@ -0,0 +1,40 @@
+    left [4228fbd8003cdd89e7eea51fcef10c3f91d78f69]
+   right [6cb6438a490a1ad4c69ff6cac23c75a903cd9cfd]
+ancestor [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+
+            conflict dropped_modified
+       ancestor_name "dir2/file_10"
+    ancestor_file_id [7368a4340573dca149c05db6f49638fafee766d0]
+           left_type "modified file"
+           left_name "dir2/file_10"
+        left_file_id [080c590e6e671b1b9ca0e752e1bc468c5167e2a9]
+          right_type "orphaned file"
+           right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+          right_name "dir2/file_10"
+       right_file_id [7368a4340573dca149c05db6f49638fafee766d0]
+  resolved_user_left "_MTN/resolutions/file_10"
+resolved_rename_left "file_10"
+
+          conflict dropped_modified
+     ancestor_name "dir2/file_11"
+  ancestor_file_id [498b49fddbd0418f62eb19d2096de816f3e34116]
+         left_type "modified file"
+         left_name "dir2/file_11"
+      left_file_id [ea74c930ce75ac43380f520f9cdd4e85f56ed049]
+        right_type "orphaned file"
+         right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+        right_name "dir2/file_11"
+     right_file_id [498b49fddbd0418f62eb19d2096de816f3e34116]
+resolved_drop_left 
+
+            conflict dropped_modified
+       ancestor_name "dir2/file_9"
+    ancestor_file_id [6259d1132e063364597e6ee84a431b432f0e9cf9]
+           left_type "modified file"
+           left_name "dir2/file_9"
+        left_file_id [d1c21ac76fd433b5f1daead0438938b45f9e13a8]
+          right_type "orphaned file"
+           right_rev [44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1]
+          right_name "dir2/file_9"
+       right_file_id [6259d1132e063364597e6ee84a431b432f0e9cf9]
+resolved_rename_left "file_9"
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts-recreated	3f43d9d13d0149e3be0fa3a7a8695182dbc871ea
@@ -0,0 +1,73 @@
+    left [3721cc38b4f98b571d92bd38b2e269f438ed0af8]
+   right [ad9ca7cb1f77fe829269d4ac18763bfb9683a4b0]
+ancestor [a2b0bdd41b1b94e6e580c81c9901af128d299a7f]
+
+        conflict dropped_modified
+   ancestor_name "file_12"
+ancestor_file_id [ec21b6df4e9613a1de985ab44f073a78b1f0b0c1]
+       left_type "modified file"
+       left_name "file_12"
+    left_file_id [831efe7eb30ab2dfecc3b3d9e5b68f4d8d8978ca]
+      right_type "recreated file"
+      right_name "file_12"
+   right_file_id [33f2071587733c13912824370e1ae0e3aa2a296c]
+
+        conflict dropped_modified
+   ancestor_name "file_13"
+ancestor_file_id [833044cd7f5458fe436ddb0058dd9cde0e715715]
+       left_type "recreated file"
+       left_name "file_13"
+    left_file_id [c43d02936229a95d852d699ffb14ee8f02ad5311]
+      right_type "modified file"
+      right_name "file_13"
+   right_file_id [6aaa91015c6fc3b0dc8eeccf2aa22c52fe8dba2a]
+
+        conflict dropped_modified
+   ancestor_name "file_14"
+ancestor_file_id [0e462cd7a936807265ce7c01ce040b79aa2fa4d1]
+       left_type "modified file"
+       left_name "file_14"
+    left_file_id [442ddb4cae7d5cde84983dd60597c966e87645ea]
+      right_type "recreated file"
+      right_name "file_14"
+   right_file_id [963b47ce0f243cbd38b1ae288e6c6d559006ba6b]
+
+        conflict dropped_modified
+   ancestor_name "file_15"
+ancestor_file_id [13afe431eae6774a3b14ce8a2a6c2583ba375383]
+       left_type "modified file"
+       left_name "file_15"
+    left_file_id [8c1962f213226e85231b7b91b1a368f8e2ad8bf4]
+      right_type "recreated file"
+      right_name "file_15"
+   right_file_id [4d28d9df37261e18c1c23108c2ab531b8e535193]
+
+        conflict dropped_modified
+   ancestor_name "file_16"
+ancestor_file_id [b7de9cb0feb57657abcc6a991fdc7d034bfe2e66]
+       left_type "recreated file"
+       left_name "file_16"
+    left_file_id [7a8bca4a66301d480279b187927dcacba4da9f39]
+      right_type "modified file"
+      right_name "file_16"
+   right_file_id [e9d80dfb12b60107455fdf42fcc6beecb33fa7bd]
+
+        conflict dropped_modified
+   ancestor_name "file_17"
+ancestor_file_id [36158b32ea4ca5cbeba77374c9f407adeee91930]
+       left_type "recreated file"
+       left_name "file_17"
+    left_file_id [b5143f8996e5383113d406f263896a75f211e208]
+      right_type "modified file"
+      right_name "file_17"
+   right_file_id [5b5069994101a5bd4f35c9a9eaaf78abdf8e52ee]
+
+        conflict dropped_modified
+   ancestor_name "file_18"
+ancestor_file_id [4d70c0b068124556ad0e2d4f17b2d5994eaf01f5]
+       left_type "recreated file"
+       left_name "file_18"
+    left_file_id [3c2034c53b1882fd16fd943c80a93074932fc220]
+      right_type "modified file"
+      right_name "file_18"
+   right_file_id [c7ef23c4c1ad7b8c977a1caeb9a5830fd1fa1ae7]
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts-recreated-resolved	7937832db9408aeadbbeed472d86f29ef3394a06
@@ -0,0 +1,89 @@
+    left [3721cc38b4f98b571d92bd38b2e269f438ed0af8]
+   right [ad9ca7cb1f77fe829269d4ac18763bfb9683a4b0]
+ancestor [a2b0bdd41b1b94e6e580c81c9901af128d299a7f]
+
+           conflict dropped_modified
+      ancestor_name "file_12"
+   ancestor_file_id [ec21b6df4e9613a1de985ab44f073a78b1f0b0c1]
+          left_type "modified file"
+          left_name "file_12"
+       left_file_id [831efe7eb30ab2dfecc3b3d9e5b68f4d8d8978ca]
+         right_type "recreated file"
+         right_name "file_12"
+      right_file_id [33f2071587733c13912824370e1ae0e3aa2a296c]
+ resolved_keep_left 
+resolved_drop_right 
+
+           conflict dropped_modified
+      ancestor_name "file_13"
+   ancestor_file_id [833044cd7f5458fe436ddb0058dd9cde0e715715]
+          left_type "recreated file"
+          left_name "file_13"
+       left_file_id [c43d02936229a95d852d699ffb14ee8f02ad5311]
+         right_type "modified file"
+         right_name "file_13"
+      right_file_id [6aaa91015c6fc3b0dc8eeccf2aa22c52fe8dba2a]
+ resolved_user_left "_MTN/resolutions/file_13"
+resolved_drop_right 
+
+            conflict dropped_modified
+       ancestor_name "file_14"
+    ancestor_file_id [0e462cd7a936807265ce7c01ce040b79aa2fa4d1]
+           left_type "modified file"
+           left_name "file_14"
+        left_file_id [442ddb4cae7d5cde84983dd60597c966e87645ea]
+          right_type "recreated file"
+          right_name "file_14"
+       right_file_id [963b47ce0f243cbd38b1ae288e6c6d559006ba6b]
+resolved_rename_left "file_14_renamed"
+ resolved_keep_right 
+
+             conflict dropped_modified
+        ancestor_name "file_15"
+     ancestor_file_id [13afe431eae6774a3b14ce8a2a6c2583ba375383]
+            left_type "modified file"
+            left_name "file_15"
+         left_file_id [8c1962f213226e85231b7b91b1a368f8e2ad8bf4]
+           right_type "recreated file"
+           right_name "file_15"
+        right_file_id [4d28d9df37261e18c1c23108c2ab531b8e535193]
+   resolved_user_left "_MTN/resolutions/file_15_left"
+ resolved_rename_left "file_15_renamed_left"
+resolved_rename_right "file_15_renamed_right"
+
+             conflict dropped_modified
+        ancestor_name "file_16"
+     ancestor_file_id [b7de9cb0feb57657abcc6a991fdc7d034bfe2e66]
+            left_type "recreated file"
+            left_name "file_16"
+         left_file_id [7a8bca4a66301d480279b187927dcacba4da9f39]
+           right_type "modified file"
+           right_name "file_16"
+        right_file_id [e9d80dfb12b60107455fdf42fcc6beecb33fa7bd]
+   resolved_drop_left 
+resolved_rename_right "file_16_renamed"
+
+            conflict dropped_modified
+       ancestor_name "file_17"
+    ancestor_file_id [36158b32ea4ca5cbeba77374c9f407adeee91930]
+           left_type "recreated file"
+           left_name "file_17"
+        left_file_id [b5143f8996e5383113d406f263896a75f211e208]
+          right_type "modified file"
+          right_name "file_17"
+       right_file_id [5b5069994101a5bd4f35c9a9eaaf78abdf8e52ee]
+resolved_rename_left "file_17_renamed"
+ resolved_drop_right 
+
+            conflict dropped_modified
+       ancestor_name "file_18"
+    ancestor_file_id [4d70c0b068124556ad0e2d4f17b2d5994eaf01f5]
+           left_type "recreated file"
+           left_name "file_18"
+        left_file_id [3c2034c53b1882fd16fd943c80a93074932fc220]
+          right_type "modified file"
+          right_name "file_18"
+       right_file_id [c7ef23c4c1ad7b8c977a1caeb9a5830fd1fa1ae7]
+  resolved_user_left "_MTN/resolutions/file_18"
+resolved_rename_left "file_18_renamed"
+ resolved_drop_right 
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/conflicts-resolved	b2fe24f2d19a8d539c0c89c305a7b58a36ead63e
@@ -0,0 +1,75 @@
+    left [7b2ef4343b0717bcd122498a1a0b7ff7acffb64c]
+   right [ca7922b510f9daf5c4b28c6788315ee82eb9a7f0]
+ancestor [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+
+          conflict dropped_modified
+     ancestor_name "file_2"
+  ancestor_file_id [4fd0fa24812427ee6c13a839d2a90bc0c6fc0091]
+         left_type "modified file"
+         left_name "file_2_renamed"
+      left_file_id [afbd804a8c606a93f9d8bc0fdacc1db9f34b4548]
+        right_type "dropped file"
+         right_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+        right_name "file_2"
+     right_file_id [4fd0fa24812427ee6c13a839d2a90bc0c6fc0091]
+resolved_drop_left 
+
+           conflict dropped_modified
+      ancestor_name "file_3"
+   ancestor_file_id [311aac8e6f1fb6fca84da5153aa6d5a1c6faff79]
+          left_type "dropped file"
+           left_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+          left_name "file_3"
+       left_file_id [311aac8e6f1fb6fca84da5153aa6d5a1c6faff79]
+         right_type "modified file"
+         right_name "file_3_renamed"
+      right_file_id [da7ea65160c9c92f4ed120568229342fe7daa924]
+resolved_drop_right 
+
+          conflict dropped_modified
+     ancestor_name "file_4"
+  ancestor_file_id [861174e6639f2991d9c065785cd9679be0c774f1]
+         left_type "modified file"
+         left_name "file_4"
+      left_file_id [57f26e8057760f356762c405bdc1f89b0a9bfed2]
+        right_type "dropped file"
+         right_rev [4125c3aea991e97a3063c3e3f425a47d58e7c8da]
+        right_name "file_4_renamed"
+     right_file_id [259dbd8291bd18ba3fdb9adb3776eb26f94b1230]
+resolved_keep_left 
+
+           conflict dropped_modified
+      ancestor_name "file_5"
+   ancestor_file_id [d141bda733292622ebce4c231cbb0da44ac59f40]
+          left_type "dropped file"
+           left_rev [b0d6953684d49dd6bd345c312d6a0c8fed3078ce]
+          left_name "file_5_renamed"
+       left_file_id [420cde699a422f7c3d2c8951c46ddfd546db66c0]
+         right_type "modified file"
+         right_name "file_5"
+      right_file_id [e7eb31ab48c2e42126f44ef78ffdb27f388333b0]
+resolved_keep_right 
+
+          conflict dropped_modified
+     ancestor_name "file_6"
+  ancestor_file_id [d5531643d3b5aee3e10eceabbdfecf167148a2d9]
+         left_type "modified file"
+         left_name "file_6_renamed"
+      left_file_id [1f62c734b799474943bfdda12b062f61024dc059]
+        right_type "dropped file"
+         right_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+        right_name "file_6"
+     right_file_id [d5531643d3b5aee3e10eceabbdfecf167148a2d9]
+resolved_user_left "_MTN/resolutions/file_6_resolved"
+
+           conflict dropped_modified
+      ancestor_name "file_7"
+   ancestor_file_id [1a9d3059360fd5f04d0cec05875c8e376da0eaef]
+          left_type "dropped file"
+           left_rev [c2fe3623ce72d248154425dc7db2ddcc397c9aca]
+          left_name "file_7"
+       left_file_id [1a9d3059360fd5f04d0cec05875c8e376da0eaef]
+         right_type "modified file"
+         right_name "file_7_renamed"
+      right_file_id [9b362e2754ea1f943497d5a31de3899271ee5a8b]
+resolved_user_right "_MTN/resolutions/file_7_resolved"
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/show_conflicts	cce385ec522c8e4885cac7d3375896aaa507f0e0
@@ -0,0 +1,22 @@
+mtn: [left]     7b2ef4343b0717bcd122498a1a0b7ff7acffb64c
+mtn: [right]    ca7922b510f9daf5c4b28c6788315ee82eb9a7f0
+mtn: [ancestor] c2fe3623ce72d248154425dc7db2ddcc397c9aca
+mtn: conflict: file 'file_2'
+mtn: modified on the left, named file_2_renamed
+mtn: dropped on the right
+mtn: conflict: file 'file_3'
+mtn: dropped on the left
+mtn: modified on the right, named file_3_renamed
+mtn: conflict: file 'file_4'
+mtn: modified on the left, named file_4
+mtn: dropped on the right
+mtn: conflict: file 'file_5'
+mtn: dropped on the left
+mtn: modified on the right, named file_5
+mtn: conflict: file 'file_6'
+mtn: modified on the left, named file_6_renamed
+mtn: dropped on the right
+mtn: conflict: file 'file_7'
+mtn: dropped on the left
+mtn: modified on the right, named file_7_renamed
+mtn: 6 conflicts with supported resolutions.
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_1/show_conflicts-orphaned	e343653ac3989164acb2dbb54f3f97b035d28de6
@@ -0,0 +1,13 @@
+mtn: [left]     4228fbd8003cdd89e7eea51fcef10c3f91d78f69
+mtn: [right]    6cb6438a490a1ad4c69ff6cac23c75a903cd9cfd
+mtn: [ancestor] 44c4d408ecf65b6b45fa2c6fa2a51e5b7485d8e1
+mtn: conflict: file 'dir2/file_10'
+mtn: modified on the left, named dir2/file_10
+mtn: orphaned on the right
+mtn: conflict: file 'dir2/file_11'
+mtn: modified on the left, named dir2/file_11
+mtn: orphaned on the right
+mtn: conflict: file 'dir2/file_9'
+mtn: modified on the left, named dir2/file_9
+mtn: orphaned on the right
+mtn: 3 conflicts with supported resolutions.
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_2/__driver__.lua	81b11d9ab24ad470156b95e8be8efd9dc1645156
@@ -0,0 +1,89 @@
+-- Verify that we can resolve this extended use case involving a
+-- dropped_modified conflict:
+-- 
+--     A
+--    / \
+--   M1  D
+--   | \ |
+--   M2  P
+--    \ /
+--     Q
+--
+-- The file is modified and merged into the dropped branch twice.
+
+mtn_setup()
+
+addfile("file_2", "file_2 base") -- modify/rename left, drop right; drop
+commit("testbranch", "base")
+base = base_revision()
+
+writefile("file_2", "file_2 left 1")
+
+commit("testbranch", "left 1")
+left_1 = base_revision()
+
+revert_to(base)
+
+check(mtn("drop", "file_2"), 0, false, false)
+
+commit("testbranch", "right 1")
+right_1 = base_revision()
+
+check(mtn("show_conflicts", left_1, right_1), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     506d8ed51b06c0080e8bb307155a88637045b532",
+  "mtn: [right]    a2889488ed1801a904d0219ec9939dfc2e9be033",
+  "mtn: [ancestor] f80ff103551d0313647d6c84990bc9db6b158dac",
+  "mtn: conflict: file 'file_2'",
+  "mtn: modified on the left, named file_2",
+  "mtn: dropped on the right",
+  "mtn: 1 conflict with supported resolutions."}))
+
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+
+check(mtn("conflicts", "resolve_first", "keep"), 0, nil, true)
+
+check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]  506d8ed51b06c0080e8bb307155a88637045b532",
+  "mtn: [right] a2889488ed1801a904d0219ec9939dfc2e9be033",
+  "mtn: keeping 'file_2' from left",
+  "mtn: history for 'file_2' from left will be lost; see user manual Merge Conflicts section",
+  "mtn: [merged] 3df3126220588440def7b08f488ca35eaa94f1b6"}))
+
+check(mtn("update"), 0, nil, true)
+check(samelines("file_2", {"file_2 left 1"}))
+
+right_2 = base_revision()
+
+-- round 2; modify the file again
+revert_to(left_1)
+
+writefile("file_2", "file_2 left 2")
+
+commit("testbranch", "left 2")
+left_2 = base_revision()
+
+check(mtn("show_conflicts", left_2, right_2), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     5a144a43f03692e389f3ddd4c510a4d9754061d5",
+  "mtn: [right]    3df3126220588440def7b08f488ca35eaa94f1b6",
+  "mtn: [ancestor] 506d8ed51b06c0080e8bb307155a88637045b532",
+  "mtn: conflict: file 'file_2'",
+  "mtn: modified on the left, named file_2",
+  "mtn: dropped and recreated on the right",
+  "mtn: 1 conflict with supported resolutions."}))
+
+check(mtn("conflicts", "store", left_2, right_2), 0, nil, true)
+
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, true)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, true)
+
+check(mtn("explicit_merge", "--resolve-conflicts", left_2, right_2, "testbranch"), 0, nil, true)
+check(qgrep("mtn: keeping 'file_2' from left", "stderr"))
+check(qgrep("mtn: dropping 'file_2' from right", "stderr"))
+
+check(mtn("update"), 0, nil, true)
+check(samelines("file_2", {"file_2 left 2"}))
+
+-- end of file
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_3/__driver__.lua	fd2a4dd0c38dff10bd3ff2f20e983f3f548b3d18
@@ -0,0 +1,276 @@
+-- Test enforcement of consistent resolutions for drop/modified conflicts.
+--
+-- Only invalid combinations are tested here (we verify a good error
+-- message); valid combinations are tested in
+-- resolve_conflicts_dropped_modified_1.
+--
+-- The left and right conflicts chosen by the user must be consistent;
+-- they must give different names for the two sides. 
+--
+-- When one file is in the dropped state, only one resolution can be
+-- specified; that of the modified file.
+--
+-- Rename on both sides is valid, unless the user specifies the same
+-- new name for both; that is tested only once here.
+--
+-- The only inconsistent cases are between modified and recreated
+-- files. A recreated file is detected by having the same name as the
+-- modified file; if the modified file has also been renamed, the
+-- recreated file must have the same name as the renamed file. Thus we
+-- do not need to consider a renamed modified file as a separate case.
+--
+-- Orphaned file resolution cannot be keep or user; those error
+-- messages are tested in resolve_conflicts_dropped_modified_1.
+--
+-- We need to test all invalid combinations of left/right resolution:
+--
+--      left                    right
+-- state    resolution      state       resolution  file    case
+-----------------------------------------------------------
+-- dropped  -               dropped     -           (not a conflict)
+--          -               modified    keep        (valid)
+--          -               modified    rename      (valid)
+--          -               modified    user        (valid)
+--          -               modified    user_rename (valid)
+--          -               recreated   -           (not a conflict)
+--
+-- modified drop            dropped     -           (valid)
+--          keep            dropped     -           (valid)
+--          rename          dropped     -           (valid)
+--          user            dropped     -           (valid)
+--          user_rename     dropped     -           (valid)
+--
+-- modified -               modified    -           (file content conflict)
+--          drop            recreated   drop        (valid)
+--          drop            recreated   keep        (valid)
+--          drop            recreated   rename      (valid)
+--          drop            recreated   user        (valid)
+--          drop            recreated   user_rename (valid)
+--          keep            recreated   drop        (valid)
+--          keep            recreated   keep        file_2  1
+--          keep            recreated   rename      (valid)
+--          keep            recreated   user        file_2  2
+--          keep            recreated   user_rename (valid)
+--          rename          recreated   drop        (valid)
+--          rename          recreated   keep        (valid)
+--          rename          recreated   rename      (valid)
+--          rename          recreated   user        (valid)
+--          rename          recreated   user_rename (valid)
+--          user            recreated   drop        (valid)
+--          user            recreated   keep        file_4  3
+--          user            recreated   rename      (valid) 
+--          user            recreated   user        file_4  4
+--          user            recreated   user_rename (valid)
+--          user_rename     recreated   drop        (valid)
+--          user_rename     recreated   keep        (valid)
+--          user_rename     recreated   rename      (valid)
+--          user_rename     recreated   user        (valid)
+--          user_rename     recreated   user_rename (valid)
+-- 
+-- recreated drop           dropped     -           (valid)
+--           keep           dropped     -           (valid)
+--           rename         dropped     -           (valid)
+--           user           dropped     -           (valid)
+--           user_rename    dropped     -           (valid)
+--           drop           modified    drop        (valid)
+--           drop           modified    keep        (valid)
+--           drop           modified    rename      (valid)
+--           drop           modified    user        (valid)
+--           drop           modified    user_rename (valid)
+--           keep           modified    drop        (valid)
+--           keep           modified    keep        file_3  5
+--           keep           modified    rename      (valid)
+--           keep           modified    user        file_3  6
+--           keep           modified    user_rename (valid)
+--           rename         modified    drop        (valid)
+--           rename         modified    keep        (valid)
+--           rename         modified    rename      (valid)
+--           rename         modified    user        (valid)
+--           rename         modified    user_rename (valid)
+--           user           modified    drop        (valid)
+--           user           modified    keep        file_3  7
+--           user           modified    rename      (valid)
+--           user           modified    user        file_3  8 
+--           user           modified    user_rename (valid)
+--           user_rename    modified    drop        (valid)
+--           user_rename    modified    keep        (valid)
+--           user_rename    modified    rename      (valid)
+--           user_rename    modified    user        (valid)
+--           user_rename    modified    user_rename (valid)
+
+mtn_setup()
+
+-- Create the test files
+
+addfile("file_2", "file_2 base") -- modified left, recreated right
+addfile("file_3", "file_3 base") -- recreated left, modified right
+commit("testbranch", "base")
+base = base_revision()
+
+writefile("file_2", "file_2 left")
+check(mtn("drop", "file_3"), 0, false, false)
+commit("testbranch", "left 1a")
+
+addfile("file_3", "file_3 left recreated")
+commit("testbranch", "left 1b")
+left_1 = base_revision()
+
+revert_to(base)
+
+check(mtn("drop", "file_2"), 0, false, false)
+writefile("file_3", "file_3 right")
+commit("testbranch", "right 1a")
+
+addfile("file_2", "file_2 right recreated")
+commit("testbranch", "right 1b")
+right_1 = base_revision()
+
+-- Store and show inconsistency error messages
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+check(samelines("stderr",
+{"mtn: 2 conflicts with supported resolutions.",
+ "mtn: stored in '_MTN/conflicts'"}))
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_2'",
+ "mtn: modified on the left",
+ "mtn: dropped and recreated on the right",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_left drop",
+ "mtn: resolve_first_left rename",
+ "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first_left keep",
+ "mtn: resolve_first_left user \"name\"",
+ "mtn: resolve_first_right drop",
+ "mtn: resolve_first_right rename",
+ "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
+ "mtn: resolve_first_right keep",
+ "mtn: resolve_first_right user \"name\""}))
+
+-- case 1, 2; keep *
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, false)
+
+-- check that inconsistent resolutions for right are not displayed
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_2'",
+ "mtn: modified on the left",
+ "mtn: dropped and recreated on the right",
+ "mtn: left_resolution: keep",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_right drop",
+ "mtn: resolve_first_right rename",
+ "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""}))
+
+-- check for errors from inconsistent resolutions
+
+-- case 1: keep, keep
+check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- case 2: keep, user
+check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- case 1, 2, but specify right resolution first
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, false)
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_2'",
+ "mtn: modified on the left",
+ "mtn: dropped and recreated on the right",
+ "mtn: right_resolution: keep",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_left drop",
+ "mtn: resolve_first_left rename",
+ "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""}))
+check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- No error if specify right again, but it actually sets file_3 right resolution. so we have to reset
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 0, nil, false)
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(qgrep("right_resolution: content_user, content: '_MTN/resolutions/file_2'", "stderr"))
+
+check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- provide a valid resolution for file_2 so file_3 is first
+check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil)
+
+-- case 3, 4; user *
+check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 0, nil, false)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_3'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right",
+ "mtn: left_resolution: content_user, content: '_MTN/resolutions/file_3'",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_right drop",
+ "mtn: resolve_first_right rename",
+ "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""}))
+
+-- case 3: user, keep
+check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- case 4: user, user
+check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- specify right first
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+-- resolve file_2
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil) 
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+-- file_3
+check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+{"mtn: conflict: file 'file_3'",
+ "mtn: dropped and recreated on the left",
+ "mtn: modified on the right",
+ "mtn: right_resolution: keep",
+ "mtn: possible resolutions:",
+ "mtn: resolve_first_left drop",
+ "mtn: resolve_first_left rename",
+ "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""}))
+check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- reset for case 4 reversed
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+-- resolve file_2
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil) 
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+
+check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true)
+check(samelines("stderr",
+{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
+
+-- Test error from user rename both sides to same new name. The error is at merge time.
+check(mtn("conflicts", "store", left_1, right_1), 0, nil, true)
+check(mtn("conflicts", "resolve_first_left", "rename", "file_2_renamed"), 0, nil, nil) 
+check(mtn("conflicts", "resolve_first_right", "rename", "file_2_renamed"), 0, nil, nil) 
+-- file_3
+check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil)
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil)
+check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 1, nil, true)
+check(qgrep("'file_2_renamed' already exists", "stderr"))
+
+-- end of file
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/__driver__.lua	80f056dd3773dab5d5019d78cbb0f7393d66bde3
@@ -0,0 +1,170 @@
+-- Show a problematic use case involving a dropped_modified conflict,
+-- and how it can be resolved with the 'mtn:resolve_conflict'
+-- attribute.
+--
+-- There is an upstream branch, and a local branch. The local branch
+-- adds a file that the upstream branch adopts. The next merge from
+-- upstream to local encounters a duplicate_name conflict; if we
+-- resolve that the wrong way (keep local instead of upstream), on the
+-- next merge we get a dropped_modified conflict.
+--
+-- In the meantime, we've edited the file locally, illustrating that
+-- the dropped_modified conflict code needs to search thru history for
+-- the rev last containing the dropped node id (this was a bug in an
+-- earlier implementation).
+
+mtn_setup()
+
+addfile("file_1", "file_1 base")
+commit("testbranch", "base")
+base = base_revision()
+
+writefile("file_1", "file_1 upstream 1")
+
+commit("testbranch", "upstream 1")
+upstream_1 = base_revision()
+
+revert_to(base)
+
+addfile("file_2", "file_2 local")
+
+commit("testbranch", "local 1")
+local_1 = base_revision()
+
+revert_to(upstream_1)
+
+addfile("file_2", "file_2 upstream 1")
+
+commit("testbranch", "upstream 2")
+upstream_2 = base_revision()
+
+check(mtn("show_conflicts", upstream_2, local_1), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     27d41ae9f2b3cb73b130d9845d77574a11021b17",
+  "mtn: [right]    3cae692a68fa6710b1db5e73e3e876994c175925",
+  "mtn: [ancestor] 736498437fa91538540dc5fbad750cbc1472d793",
+  "mtn: conflict: duplicate name 'file_2' for the directory ''",
+  "mtn: added as a new file on the left",
+  "mtn: added as a new file on the right",
+  "mtn: 1 conflict with supported resolutions."}))
+
+check(mtn("conflicts", "store", upstream_2, local_1), 0, nil, true)
+
+-- We should keep upstream, and drop local, but we get it backwards
+check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, true)
+check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, true)
+
+check(mtn("explicit_merge", "--resolve-conflicts", upstream_2, local_1, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]  27d41ae9f2b3cb73b130d9845d77574a11021b17",
+  "mtn: [right] 3cae692a68fa6710b1db5e73e3e876994c175925",
+  "mtn: dropping 'file_2'",
+  "mtn: keeping 'file_2'",
+  "mtn: [merged] fce2fe3c327a294209ad695e0658275f104fe12a"}))
+
+check(mtn("update"), 0, nil, true)
+
+-- One more local mod
+writefile("file_2", "file_2 local 2")
+commit("testbranch", "local 2")
+local_2 = base_revision()
+
+-- round 2; upstream modifies the file again, and we try to merge
+revert_to(upstream_2)
+
+writefile("file_2", "file_2 upstream 2")
+
+commit("testbranch", "upstream 3")
+upstream_3 = base_revision()
+
+check(mtn("show_conflicts", upstream_3, local_2), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     48b18ebc7b70733133539384e49a2eedb82e32b2",
+  "mtn: [right]    650057e8a81bd41991dc5ff10b2d60343f1032ae",
+  "mtn: [ancestor] 27d41ae9f2b3cb73b130d9845d77574a11021b17",
+  "mtn: conflict: file 'file_2'",
+  "mtn: modified on the left, named file_2",
+  "mtn: dropped and recreated on the right",
+  "mtn: 1 conflict with supported resolutions."}))
+
+--  There are two nodes with filename 'file_2'; node 4 in upstream,
+--  node 3 in local. At this point, node 4 is modified in upstream and
+--  dropped in local; node 3 is unborn in upstream and modified in
+--  local. Therefore this is a combination of dropped_modified and
+--  duplicate_name conflicts, which we handle as a dropped_modified
+--  conflict.
+check(mtn("conflicts", "store", upstream_3, local_2), 0, nil, true)
+check(samefilestd("conflicts_3_2", "_MTN/conflicts"))
+
+-- since we have a duplicate name conflict, we need to specify both
+-- right and left resolutions, so 'resolve_first' is wrong here
+check(mtn("conflicts", "resolve_first", "keep"), 1, nil, true)
+check(qgrep("must specify 'resolve_first_left' or 'resolve_first_right'", "stderr"))
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: conflict: file 'file_2'",
+  "mtn: modified on the left",
+  "mtn: dropped and recreated on the right",
+  "mtn: possible resolutions:",
+  "mtn: resolve_first_left drop",
+  "mtn: resolve_first_left rename",
+  "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"",
+  "mtn: resolve_first_left keep",
+  "mtn: resolve_first_left user \"name\"",
+  "mtn: resolve_first_right drop",
+  "mtn: resolve_first_right rename",
+  "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"",
+  "mtn: resolve_first_right keep",
+  "mtn: resolve_first_right user \"name\""}))   
+
+-- We want to keep the upstream node to avoid future conflicts
+check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: conflict: file 'file_2'",
+  "mtn: modified on the left",
+  "mtn: dropped and recreated on the right",
+  "mtn: left_resolution: keep",
+  "mtn: possible resolutions:",
+  "mtn: resolve_first_right drop",
+  "mtn: resolve_first_right rename",
+  "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""}))   
+
+check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, true)
+check(samefilestd("conflicts_3_2_resolved", "_MTN/conflicts"))
+
+check(mtn("explicit_merge", "--resolve-conflicts", upstream_3, local_2, "testbranch"), 0, nil, true)
+check(qgrep("mtn: dropping 'file_2'", "stderr"))
+check(qgrep("mtn: \\[merged\\] 864bfab34bcd301828a985f000c6f8ada712b0ca", "stderr")) -- for comparing with below
+
+check(mtn("update"), 0, nil, true)
+check(samelines("file_2", {"file_2 upstream 2"}))
+
+-- Repeat merge with left, right swapped, to test symmetry in code.
+check(mtn("conflicts", "store", local_2, upstream_3), 0, nil, true)
+check(samefilestd("conflicts_2_3", "_MTN/conflicts"))
+
+check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, true)
+
+check(mtn("conflicts", "show_first"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: conflict: file 'file_2'",
+  "mtn: dropped and recreated on the left",
+  "mtn: modified on the right",
+  "mtn: right_resolution: keep",
+  "mtn: possible resolutions:",
+  "mtn: resolve_first_left drop",
+  "mtn: resolve_first_left rename",
+  "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""}))   
+
+check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, true)
+check(samefilestd("conflicts_2_3_resolved", "_MTN/conflicts"))
+
+check(mtn("explicit_merge", "--resolve-conflicts", local_2, upstream_3, "testbranch"), 0, nil, true)
+check(qgrep("mtn: dropping 'file_2'", "stderr"))
+check(qgrep("mtn: \\[merged\\] 864bfab34bcd301828a985f000c6f8ada712b0ca", "stderr"))
+-- same revision as merge in other order
+
+-- end of file
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_2_3	1f257fa6e99abf93229af189109b9efe3cfae88f
@@ -0,0 +1,13 @@
+    left [650057e8a81bd41991dc5ff10b2d60343f1032ae]
+   right [48b18ebc7b70733133539384e49a2eedb82e32b2]
+ancestor [27d41ae9f2b3cb73b130d9845d77574a11021b17]
+
+        conflict dropped_modified
+   ancestor_name "file_2"
+ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+       left_type "recreated file"
+       left_name "file_2"
+    left_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
+      right_type "modified file"
+      right_name "file_2"
+   right_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_2_3_resolved	d8b9a96fdaf210a4d1bc495c62c3dcf40114d39e
@@ -0,0 +1,15 @@
+    left [650057e8a81bd41991dc5ff10b2d60343f1032ae]
+   right [48b18ebc7b70733133539384e49a2eedb82e32b2]
+ancestor [27d41ae9f2b3cb73b130d9845d77574a11021b17]
+
+           conflict dropped_modified
+      ancestor_name "file_2"
+   ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+          left_type "recreated file"
+          left_name "file_2"
+       left_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
+         right_type "modified file"
+         right_name "file_2"
+      right_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
+ resolved_drop_left 
+resolved_keep_right 
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2	bb23f1fbf87e4f1dcb8aa7c4c3fcb90e1fc84fed
@@ -0,0 +1,13 @@
+    left [48b18ebc7b70733133539384e49a2eedb82e32b2]
+   right [650057e8a81bd41991dc5ff10b2d60343f1032ae]
+ancestor [27d41ae9f2b3cb73b130d9845d77574a11021b17]
+
+        conflict dropped_modified
+   ancestor_name "file_2"
+ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+       left_type "modified file"
+       left_name "file_2"
+    left_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
+      right_type "recreated file"
+      right_name "file_2"
+   right_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_2/conflicts_3_2_resolved	4482ad2e755308ce8a546191348cc648ad13d782
@@ -0,0 +1,15 @@
+    left [48b18ebc7b70733133539384e49a2eedb82e32b2]
+   right [650057e8a81bd41991dc5ff10b2d60343f1032ae]
+ancestor [27d41ae9f2b3cb73b130d9845d77574a11021b17]
+
+           conflict dropped_modified
+      ancestor_name "file_2"
+   ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+          left_type "modified file"
+          left_name "file_2"
+       left_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
+         right_type "recreated file"
+         right_name "file_2"
+      right_file_id [6e49d17f382dc2f03d495181490e7653f1a14ad9]
+ resolved_keep_left 
+resolved_drop_right 
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_attr/__driver__.lua	abe2836cc2dfbae368820e3b5515ad587911c71b
@@ -0,0 +1,108 @@
+-- Show a problematic use case involving a dropped_modified conflict,
+-- and how it can be resolved with the 'mtn:resolve_conflict'
+-- attribute.
+--
+-- There is an upstream branch, and a local branch. The local branch
+-- deletes a file that the upstream branch continues to modify. We
+-- periodically merge from upstream to local to get other changes, but
+-- never merge in the other direction.
+--
+-- The dropped file causes new dropped_modified conflicts at each
+-- propagate. We decided to always drop, so we apply the
+-- 'mtn:resolve_conflict' attribute.
+
+mtn_setup()
+
+addfile("file_2", "file_2 base")
+commit("testbranch", "base")
+base = base_revision()
+
+writefile("file_2", "file_2 upstream 1")
+
+commit("testbranch", "upstream 1")
+upstream_1 = base_revision()
+
+revert_to(base)
+
+check(mtn("drop", "file_2"), 0, false, false)
+
+commit("testbranch", "local 1")
+local_1 = base_revision()
+
+check(mtn("show_conflicts", upstream_1, local_1), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     1e700864de7a2cbb1cf85c26f5e1e4ca335d2bc2",
+  "mtn: [right]    a2889488ed1801a904d0219ec9939dfc2e9be033",
+  "mtn: [ancestor] f80ff103551d0313647d6c84990bc9db6b158dac",
+  "mtn: conflict: file 'file_2'",
+  "mtn: modified on the left, named file_2",
+  "mtn: dropped on the right",
+  "mtn: 1 conflict with supported resolutions."}))
+
+check(mtn("conflicts", "store", upstream_1, local_1), 0, nil, true)
+
+check(mtn("conflicts", "resolve_first", "drop"), 0, nil, true)
+
+check(mtn("explicit_merge", "--resolve-conflicts", upstream_1, local_1, "testbranch"), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]  1e700864de7a2cbb1cf85c26f5e1e4ca335d2bc2",
+  "mtn: [right] a2889488ed1801a904d0219ec9939dfc2e9be033",
+  "mtn: dropping 'file_2' from left",
+  "mtn: [merged] dd1ba606b52fddb4431da3760ff65b65f6509a48"}))
+
+check(mtn("update"), 0, nil, true)
+check(not exists("file_2"))
+
+local_2 = base_revision()
+
+-- round 2; upstream modifies the file again, and records the drop
+-- conflict resolution for future merges to downstream.
+revert_to(upstream_1)
+
+writefile("file_2", "file_2 upstream 2")
+
+check(mtn("attr", "set", "file_2", "mtn:resolve_conflict", "drop"), 0, nil, nil)
+
+commit("testbranch", "upstream 2")
+upstream_2 = base_revision()
+
+-- Since the attribute specifies the conflict resolution, we don't need to specify one ourselves
+
+-- We require --resolve-conflicts here, mostly for consistency with
+-- 1.0 behavior (where resolving non-content conflicts requires
+-- --resolve-conflict)
+check(mtn("merge"), 1, nil, true)
+check(qgrep("mtn: misuse: merge failed due to unresolved conflicts", "stderr"))
+
+check(mtn("merge", "--resolve-conflicts"), 0, nil, true)
+check(qgrep("mtn: dropping 'file_2' from left", "stderr"))
+
+check(mtn("update"), 0, nil, true)
+check(not exists("file_2"))
+
+-- Show that 'show_conflicts' reports the attribute resolution properly.
+check(mtn("show_conflicts", upstream_2, local_2), 0, nil, true)
+check(samelines("stderr",
+ {"mtn: [left]     c0ed8c29ffad149af1c948969e8e80d270999b13",
+  "mtn: [right]    dd1ba606b52fddb4431da3760ff65b65f6509a48",
+  "mtn: [ancestor] 1e700864de7a2cbb1cf85c26f5e1e4ca335d2bc2",
+  "mtn: conflict: file 'file_2'",
+  "mtn: modified on the left, named file_2",
+  "mtn: dropped on the right",
+  "mtn: left_resolution: drop",
+  "mtn: 1 conflict with supported resolutions."}))
+
+-- 'conflicts store' is not needed unless there are other conflicts,
+-- or the user wants to override the attribute. Show that it reports
+-- the attr resolution properly.
+check(mtn("conflicts", "store", upstream_2, local_2), 0, nil, true)
+check(samefilestd("conflicts", "_MTN/conflicts"))
+
+-- repeat merge with left, right swapped to verify symmetry in code
+remove("_MTN/conflicts")
+check(mtn("explicit_merge", "--resolve-conflicts", local_2, upstream_2, "testbranch"), 0, nil, true)
+check(qgrep("mtn: dropping 'file_2' from right", "stderr"))
+check(mtn("update"), 0, nil, true)
+check(not exists("file_2"))
+
+-- end of file
============================================================
--- /dev/null	
+++ test/func/resolve_conflicts_dropped_modified_upstream_vs_local_attr/conflicts	0ab94901aaab08fbed7c8a74c8dd4e44dcd85f46
@@ -0,0 +1,15 @@
+    left [c0ed8c29ffad149af1c948969e8e80d270999b13]
+   right [dd1ba606b52fddb4431da3760ff65b65f6509a48]
+ancestor [1e700864de7a2cbb1cf85c26f5e1e4ca335d2bc2]
+
+          conflict dropped_modified
+     ancestor_name "file_2"
+  ancestor_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+         left_type "modified file"
+         left_name "file_2"
+      left_file_id [b7e3240a78dc6afce4507f5a18ab516963e72022]
+        right_type "dropped file"
+         right_rev [1e700864de7a2cbb1cf85c26f5e1e4ca335d2bc2]
+        right_name "file_2"
+     right_file_id [7fc990de4797bd6534a5c1deb344e11964f6b353]
+resolved_drop_left 
============================================================
--- test/func/resolve_conflicts_errors/__driver__.lua	4911dc65645a5af929cd990eef09c97146e60d17
+++ test/func/resolve_conflicts_errors/__driver__.lua	0819ba223855d9814a7420c7412166b1109ed20f
@@ -51,10 +51,11 @@ check(samefilestd("conflicts-attr-store-
 ----------
 -- use old conflicts file for new merge
 
--- get rid of attr conflict, add file content conflict
+-- get rid of attr conflict, add half of file content conflict
 check(mtn("attr", "set", "simple_file", "foo", "1"), 0, nil, nil)
 writefile("simple_file", "simple\ntwo\nthree\nfour\n")
 commit("testbranch", "right 2")
+right_2 = base_revision()
 
 -- attempt merge with old conflict file
 check(mtn("merge", "--resolve-conflicts"), 1, nil, true)
@@ -62,19 +63,33 @@ check(samefilestd("merge-old-conflicts-f
 canonicalize("stdout")
 check(samefilestd("merge-old-conflicts-file", "stdout"))
 
+----------
+-- 'resolve_first' without resolution (issue 202)
 
+-- other half of file content conflict
+revert_to(left_1)
+writefile("simple_file", "simple\none\nthree\nfour\n")
+commit("testbranch", "left 2")
+left_2 = base_revision()
+
+check(mtn("conflicts", "store", left_2, right_2), 0, nil, true)
+
+check(mtn("conflicts", "resolve_first"), 1, nil, true)
+check(qgrep("wrong number of arguments", "stderr"))
+
 ----------
 -- specify inconsistent left and right resolutions for duplicate_name
 
+addfile("checkout.sh", "checkout.sh left 1")
+commit("testbranch", "left 3")
+
+revert_to(right_2)
+
 addfile("checkout.sh", "checkout.sh right 1")
 commit("testbranch", "right 3")
 
-revert_to(left_1)
-addfile("checkout.sh", "checkout.sh left 1")
-commit("testbranch", "left 2")
-
 check(mtn("conflicts", "store"), 0, nil, true)
-check(samelines("stderr", {"mtn: 1 conflict with supported resolutions.",
+check(samelines("stderr", {"mtn: 2 conflicts with supported resolutions.",
                            "mtn: stored in '_MTN/conflicts'"}))
 
 -- invalid number of params
@@ -92,7 +107,8 @@ canonicalize("stdout")
 check(mtn("conflicts", "resolve_first_right", "user", "checkout.sh"), 1, nil, true)
 check(grep("-v", "detected at", "stderr"), 0, true)
 canonicalize("stdout")
-check("mtn: misuse: other resolution must be 'drop' or 'rename'\n" == readfile("stdout"))
+check(samelines("stdout",
+{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"}))
 
 -- not in workspace; report nice error; conflicts file must be under
 -- _MTN, so need workspace. Fixes bug 30473
============================================================
--- test/func/resolve_conflicts_orphaned_file/__driver__.lua	fe6a4618be2793d18ee2f97adf94cd564763164f
+++ test/func/resolve_conflicts_orphaned_file/__driver__.lua	beb41b901c1e08bbef25e87fe0b2ef36e74a2a8b
@@ -1,5 +1,4 @@
 -- Test resolving orphaned_file and orphaned_directory conflicts
-
 mtn_setup()
 
 addfile("foo", "foo base")
============================================================
--- test/func/resolve_conflicts_read_all/__driver__.lua	c8f14848057bb6eff36844cebd24aff6caed9d08
+++ test/func/resolve_conflicts_read_all/__driver__.lua	ccc41061b22420f5b08eea1271a3b5acf6c270d2
@@ -4,6 +4,9 @@ mtn_setup()
 -- that "conflicts show_remaining" can properly process the output of
 -- "conflicts store".
 --
+-- Except for dropped/modified; see
+-- ../resolve_conflicts_dropped_modified/__driver__.lua
+--
 -- test case generation borrowed from conflict_messages test.
 
 
============================================================
--- test/func/restricted_commit_with_inodeprints/__driver__.lua	b11b4fbd4ed1b88ccb61d2b9ea5347c61a360c47
+++ test/func/restricted_commit_with_inodeprints/__driver__.lua	48dda63d86651a117b978054e362f4ed056f3e47
@@ -1,23 +1,13 @@ mtn_setup()
 
 mtn_setup()
 
--- this test is a bug report. the problem is that inodeprints tries to update its
--- cache for all files in the complete manifest, but a restricted commit can
--- succeed with missing files if they are excluded. subsequently the inodeprint
--- update fails because it can't build a complete manifest due to the missing
--- files.
+-- This test is a bug report, now fixed. The problem was:
+-- 
+-- inodeprints tries to update its cache for all files in the complete
+-- manifest, but a restricted commit can succeed with missing files if
+-- they are excluded. subsequently the inodeprint update fails because
+-- it can't build a complete manifest due to the missing files.
 
--- one solution is to let inodeprints update its cache only for files that are
--- included in the restriction, which seems to be safe. the only gaurentee that
--- inodeprints mode makes is that if a file's current inodeprint matches its
--- cached inodprint then it has not changed. i.e. for a missing file, the cache
--- would not be updated but the old cached value can't possibly equal the current
--- value since the file does not exist and cannot have an inodeprint.
-
--- also, it may be a useful feature (?) to allow refresh_inodeprints to update
--- its cache for a restricted set of files by allowing paths on the command line
--- to establish a restriction.
-
 addfile("file1", "file1")
 
 commit()
@@ -32,6 +22,5 @@ remove("file1")
 remove("file1")
 
 -- restricted commit of file2 succeeds with file1 missing
--- but the corresponding inodeprint update fails
 
-xfail_if(true, mtn("commit", "--message=file2", "file2"),  0, false, false)
+check(mtn("commit", "--message=file2", "file2"),  0, false, false)
============================================================
--- /dev/null	
+++ test/func/revert_with_inodeprints/__driver__.lua	d3ad794b0a265fb5fa4eee3e264eefc6931d9340
@@ -0,0 +1,21 @@
+-- Test for issue 207; partial revert succeeds without inodeprints,
+-- fails with. Now fixed.
+
+mtn_setup()
+
+addfile("file1", "file1")
+addfile("file2", "file2")
+
+commit()
+
+-- enable inodeprints mode
+check(mtn("refresh_inodeprints"), 0, false, false)
+
+-- create two missing files
+
+remove("file1")
+remove("file2")
+
+-- revert only one file
+
+check(mtn("revert", "file2"),  0, false, false)
============================================================
--- test/func/schema_migration_new_db/__driver__.lua	b1ed03f18f2480f322746b2e142f21ad005ae9cf
+++ test/func/schema_migration_new_db/__driver__.lua	3c9bd83bd39e98ced7d78a436143968717e11a0a
@@ -9,4 +9,5 @@ check(mtn("db", "migrate"), 0, false, tr
 
 check(get("expected-stderr.txt"))
 check(mtn("db", "migrate"), 0, false, true)
+canonicalize("stderr")
 check(samefile("stderr", "expected-stderr.txt"))
============================================================
--- test/func/serve-automate/__driver__.lua	d41f819fd49060c45bb154dde614699b0cb938e7
+++ test/func/serve-automate/__driver__.lua	1343490c3b79e3d936a5b72ba7561055239235f8
@@ -15,7 +15,7 @@ check(
 local errors = run_remote_stdio(server, "l17:interface_versione", 1, 0, "e")
 check(
     table.maxn(errors) == 1 and
-    errors[1] == "misuse: Sorry, you aren't allowed to do that."
+    errors[1] == "misuse: sorry, you aren't allowed to do that."
 )
 
 server:stop()
@@ -56,7 +56,8 @@ if ostype ~= "Windows" then
 if ostype ~= "Windows" then
 -- 'file:' not supported on Windows
 
-check(mtn2("automate", "remote_stdio", "file://" .. test.root .. "/test.db"),
+test_uri="file://" .. url_encode_path(test.root .. "/test.db")
+check(mtn2("automate", "remote_stdio", test_uri),
       0, true, false, "l17:interface_versione")
 check(parse_stdio(readfile("stdout"), 0, 0, "m") ~= nil)
 end
============================================================
--- test/func/serve-automate-single-run/__driver__.lua	01013ad10150f9056bee7609338cb09b47d8c677
+++ test/func/serve-automate-single-run/__driver__.lua	9ac5e0e67c0a6849289ddfaf175505f674da6410
@@ -28,7 +28,7 @@ check(mtn2("automate", "remote", "--remo
 
 check(mtn2("automate", "remote", "--remote-stdio-host", server.address,
     "interface_version"), 0, true, false)
-check(qgrep("^[0-9]{2,}\.[0-9]+$", "stdout"))
+check(qgrep("^[0-9]{2,}\\.[0-9]+$", "stdout"))
 
 check(mtn2("automate", "remote", "--remote-stdio-host", server.address,
     "leaves"), 0, true, false)
@@ -60,8 +60,9 @@ copy("allow-automate.lua", "custom_test_
 -- 'file:' not supported on Windows
 
 copy("allow-automate.lua", "custom_test_hooks.lua")
+test_uri="file://" .. url_encode_path(test.root .. "/test.db")
 check(mtn2("automate", "remote", "--remote-stdio-host",
-	   "file://"..test.root.."/test.db",
+	   test_uri,
 	   "get_file_of", "--", "-r".. R1, "foo"), 0, true, false)
 check(qgrep("bar", "stdout"))
 end
============================================================
--- test/func/ssh_agent/__driver__.lua	e1e991f96a3289db93574829306b32b20aeba886
+++ test/func/ssh_agent/__driver__.lua	3f28e56f4fe2fa4169a34c5cc16e4039b2bd492a
@@ -81,7 +81,7 @@ for line in io.lines("stdout") do
 
 check({"ssh-agent"}, 0, true, false)
 for line in io.lines("stdout") do
-   for k, v in string.gmatch(line, "([%w_]+)=([%w/\.-]+)") do
+   for k, v in string.gmatch(line, "([%w_]+)=([%w/%.-]+)") do
       set_env(k, v)
    end
 end
@@ -91,7 +91,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
@@ -288,7 +288,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
@@ -338,7 +338,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
============================================================
--- /dev/null	
+++ test/func/status_of_ignored/__driver__.lua	f64919f41c4733dac61b88884b945988faa1c2b0
@@ -0,0 +1,27 @@
+-- Test for issue 193
+--
+-- Original problem:
+--
+-- mtn status foo.bak produces confusing output, assuming '*.bak' is
+-- in the list of ignore file patterns (it is in the default list).
+--
+-- The problem report states this was noticed in mtn 1.0 (released
+-- in 2011), but annotate says the relevant fix was added in 2008.
+
+mtn_setup()
+
+-- add a real file, to see what a 'normal' status report looks like
+addfile("file_1", "file_1")
+commit()
+
+check(mtn("status", "file_1"), 0, true, nil)
+check(qgrep("no changes", "stdout"))
+
+-- Now gives an error:
+check(mtn("status", "foo.bak"), 1, nil, true)
+check(qgrep("warning: restriction includes unknown path 'foo.bak'", "stderr"))
+
+-- Try again with an existing foo.bak
+writefile("foo.bak", "foo.bak")
+check(mtn("status", "foo.bak"), 1, nil, true)
+check(qgrep("warning: restriction includes unknown path 'foo.bak'", "stderr"))
============================================================
--- test/func/syntax_errors_in_.mtn-ignore/mtn-ignore	c46ecd3b4771b7b0af41b6caff2074df0427fbfa
+++ test/func/syntax_errors_in_.mtn-ignore/mtn-ignore	55bfcaa55ef14ee091aa6279251af51121f910b9
@@ -21,7 +21,6 @@ abc\3
 [[:fnord:]]
 \\x{123456}
 (?(0))
-(?<=\C)
 \l
 (?C256)
 (?C1
============================================================
--- test/func/things_in_.mtn-ignore_get_ignored/__driver__.lua	2b1974541199d82c39a4c9529f9d85d2bf5c7106
+++ test/func/things_in_.mtn-ignore_get_ignored/__driver__.lua	e782689702a5ed0d977d1610dd7c06df505cdb1d
@@ -6,6 +6,8 @@ writefile("baz/xyzzy")
 writefile("bar")
 writefile("baz/xyzzy")
 
+-- "*.d" is a bad regexp; nothing to repeat (this is _not_ shell glob syntax)
+-- Show this is not fatal, but does produce an error message.
 writefile(".mtn-ignore", "bar\nbaz\n*.d\n")
 
 check(raw_mtn("ls", "unknown"), 0, true, true)
@@ -18,7 +20,7 @@ check(qgrep("warning", "unknownerr"))
 check(qgrep("warning", "unknownerr"))
 
 
-check(raw_mtn("ls", "ignored"), 0, true, true)
+check(raw_mtn("ls", "ignored", "--no-recursive"), 0, true, true)
 copy("stdout", "ignored")
 copy("stderr", "ignorederr")
 
============================================================
--- test/func/two_parent_workspace_inodeprints/__driver__.lua	cb9175dd15771248cc7d53864fa77c17b9d09802
+++ test/func/two_parent_workspace_inodeprints/__driver__.lua	27930df4f388e02e7fa017e62aa0dd9873ac3d35
@@ -19,13 +19,13 @@ check(mtn("status"), 0, true, false)
 
 -- check that we've got the expected initial status
 check(mtn("status"), 0, true, false)
-check(qgrep("patched[ 	]\+foo", "stdout"))
+check(qgrep("patched[ 	]+foo", "stdout"))
 
 -- enable inodeprints
 writefile("_MTN/inodeprints")
 
 check(mtn("status"), 0, true, false)
-check(qgrep("patched[ 	]\+foo", "stdout"))
+check(qgrep("patched[ 	]+foo", "stdout"))
 
 sleep(5)
 
============================================================
--- test/func/two_parent_workspace_list/__driver__.lua	5d6df31659e888cf21e541121d487d3e5249e2df
+++ test/func/two_parent_workspace_list/__driver__.lua	2a365be32c664d756c0187954ca84c79590558fd
@@ -30,9 +30,26 @@ check(mtn("ls", "known"), 0, "file1\nfil
 -- ignore them all.  if the test suite is ever fixed to use a
 -- subdirectory for the workspace (and therefore to keep it cleaner)
 -- or to ignore them all properly, this will have to change.
-check(mtn("ls", "ignored"), 0, "keys\ntest.db\ntest_hooks.lua\nts-stderr\nts-stdin\nts-stdout\n", nil)
-check(mtn("ls", "unknown"), 0, "_MTN.old\nemptyhomedir\nmin_hooks.lua\npaths-new\npaths-old\nstderr\ntester.log\n", nil)
+check(mtn("ls", "ignored", "--no-recursive"), 0, true, nil)
+check(samelines("stdout",
+{"keys",
+ "test.db",
+ "test_hooks.lua",
+ "ts-stderr",
+ "ts-stdin",
+ "ts-stdout"}))
 
+check(mtn("ls", "unknown", "--no-recursive"), 0, true, nil)
+check(samelines("stdout",
+{"_MTN.old",
+ "emptyhomedir",
+ "min_hooks.lua",
+ "paths-new",
+ "paths-old",
+ "stderr",
+ "stdout",
+ "tester.log"}))
+
 -- we do this after the other tests so it doesn't interfere with them.
 remove("file4")
 check(mtn("ls", "missing"), 0, "file4\n", nil)
============================================================
--- test/func/update_with_pending_modification/__driver__.lua	03be28a852978808341205ba2e2f713ce8dcaf35
+++ test/func/update_with_pending_modification/__driver__.lua	de7b5ac13bfad72bce229ee71f3ae972c741f08b
@@ -1,3 +1,4 @@
+-- Test the case of update where there is a dropped/modified conflict
 
 mtn_setup()
 
@@ -5,28 +6,25 @@ commit()
 addfile("file1", "contents of file1")
 commit()
 
--- store the newly created revision id
 REV1=base_revision()
 
--- check(mtn("--branch", "testbranch", "co", "codir"), 0, false, false)
--- writefile("codir/file2", "contents of file2")
-
--- add another file and commit
+-- add another file, then change it
 addfile("file2", "contents of file2")
 commit()
 
--- change that new file
 writefile("file2", "new contents of file2")
 
--- .. and upadte to the previous revision, which didn't have file2.
--- At the moment, this simply drops file2 and all changes to it.
---
--- See bug #15058
+-- update to the previous revision, which didn't have file2. This
+-- looks like file2 is dropped on one side (in rev 1), and modified on
+-- the other (the workspace), so we get a dropped/modified conflict.
 
-xfail(mtn("update", "-r", REV1), 1, true, true)
+check(mtn("update", "-r", REV1), 1, nil, true)
+check(qgrep("mtn: conflict: file 'file2'", "stderr"))
+check(qgrep("mtn: modified on the left, named file2", "stderr"))
+check(qgrep("mtn: dropped on the right", "stderr"))
+check(qgrep("mtn: misuse: merge failed due to unresolved conflicts", "stderr"))
 
--- IMO, the correct curse of action should be to fail updating due to
--- a conflict.
-check(exists("file2"))
-check(samelines("file2", {"new contents of file2"}))
+-- Since this is a workspace merge, we can't resolve the conflict; the
+-- modified file must be committed first.
 
+-- end of file
============================================================
--- test/func/user_commands/extra_rc	94c90e2f0259bc9905f6be3fcc2580f0c8c2714d
+++ test/func/user_commands/extra_rc	7830e76cf219e92da08c959d7f9e33804be59c5a
@@ -5,7 +5,8 @@ function check_head(...)
       io.stderr:write("automate call failed\n")
       return
     end
-    arghead = unpack(arg)
+    local arg = {...}
+    arghead = arg[1]
     heads = heads:gsub("^%s*(.-)%s*$", "%1")	-- trim leading and trailing whitespace
     if (heads == arghead) then
         io.write("heads are equal\n")
============================================================
--- /dev/null	
+++ test/func/using_packets/__driver__.lua	cbba17e46d782afcc3a2a97b54280a7373588c03
@@ -0,0 +1,107 @@
+-- Test for "Using packets" example in manual; also issue 185
+
+-- We need two databases A and B, and one workspace '.'.
+
+function mtnA(...)
+  return mtn("--db=A.db", ...)
+end
+
+function mtnB(...)
+  return mtn("--db=B.db", ...)
+end
+
+-- initialize the databases, setup the workspace
+
+-- copied from ../../func-testsuite.lua mtn_setup
+check(getstd("test_keys"))
+check(getstd("test_hooks.lua"))
+check(getstd("min_hooks.lua"))
+
+check(mtnA("db", "init"), 0, false, false)
+check(mtnB("db", "init"), 0, false, false)
+
+check(mtnA("read", "test_keys"), 0, false, false)
+remove("test_keys")
+
+check(mtnA("setup", "--branch=test", "."), 0, false, false)
+
+-- add revisions to A
+
+writefile("file", "xyz\n")
+check(mtnA("add", "file"), 0, nil, false)
+check(mtnA("commit", "-m", "One"), 0, nil, false)
+rev_one = base_revision()
+
+writefile("file2", "file 2 getting in\n")
+writefile("file", "ERASE\n")
+check(mtnA("add", "file2"), 0, nil, false)
+check(mtnA("commit", "-m", "Two"), 0, nil, false)
+rev_two = base_revision()
+
+writefile("file", "THIRD\n")
+check(mtnA("commit", "-m", "Three"), 0, nil, false)
+rev_three = base_revision()
+
+-- There's no easy way to pipe the output of one mtn cmd to another
+-- here, so we skip the toposort.
+check(mtnA("automate", "select", "i:"), 0, true, nil)
+check(samelines("stdout", {rev_three, rev_one, rev_two}))
+-- show the rev ids, so we can copy them into monotone.texi
+check(samelines("stdout",
+{"151f1fb125f19ebe11eb8bfe3a5798fcbea4e736", -- rev_three
+ "a423db0ad651c74e41ab2529eca6f17513ccf714", -- rev_one
+ "d14e89582ad9030e1eb62f563c8721be02ca0b65"})) -- rev_two
+
+-- Transfer rev_one to db B
+-- first, get the file id
+file_id_one = "8714e0ef31edb00e33683f575274379955b3526c"
+check(mtnA("automate", "get_revision", rev_one), 0, true, nil)
+check(qgrep(file_id_one, "stdout"))
+
+-- we don't have Lua functions to add lines to files, so we create
+-- several packet files.
+
+check(mtnA("pubkey", "address@hidden"), 0, true, nil)
+rename("stdout", "KEY_PACKETS")
+
+check(mtnA("automate", "packet_for_fdata", file_id_one), 0, true, nil)
+rename("stdout", "PACKET1")
+
+check(mtnA("automate", "packet_for_rdata", rev_one), 0, true, nil)
+rename("stdout", "PACKET2")
+
+check(mtnA("automate", "packets_for_certs", rev_one), 0, true, nil)
+rename("stdout", "PACKET3")
+
+check(mtnB("read", "KEY_PACKETS", "PACKET1", "PACKET2", "PACKET3"), 0, nil, false)
+
+-- Now transfer rev_two
+file_id_two = "8b52d96d4fab6c1e56d6364b0a2673f4111b228e"
+file2_id_two = "d2178687226560032947c1deacb39d16a16ea5c6"
+check(mtnA("automate", "get_revision", rev_two), 0, true, nil)
+check(qgrep(file_id_two, "stdout"))
+check(qgrep(file2_id_two, "stdout"))
+
+check(mtnA("automate", "packet_for_fdata", file2_id_two), 0, true, nil)
+rename("stdout", "PACKET1")
+
+check(mtnA("automate", "packet_for_fdelta", file_id_one, file_id_two), 0, true, nil)
+rename("stdout", "PACKET2")
+
+check(mtnA("automate", "packet_for_rdata", rev_two), 0, true, nil)
+rename("stdout", "PACKET3")
+
+check(mtnA("automate", "packets_for_certs", rev_two), 0, true, nil)
+rename("stdout", "PACKET4")
+
+check(mtnB("read", "PACKET1", "PACKET2", "PACKET3", "PACKET4"), 0, nil, false)
+
+--  Compare checkout of rev_two from db A to rev_two from db B
+check(mtnA("update", "-r", rev_two), 0, nil, false)
+
+check(mtnB("checkout", "--branch", "test", "test-B"), 0, nil, false)
+
+check(samefile("file", "test-B/file"))
+check(samefile("file2", "test-B/file2"))
+
+-- end of file
============================================================
--- test/func/util_mtnopt/__driver__.lua	84307ea94ec302c6d9bbe163955e8f5e86973ce0
+++ test/func/util_mtnopt/__driver__.lua	6981b9fe1aa7800aaaf76bd18f0ddbb73b0e6046
@@ -6,6 +6,11 @@ normalized_testroot = normalize_path (te
 
 normalized_testroot = normalize_path (test.root)
 
+-- Escape regexp special characters to form a proper regexp that correctly
+-- checks for the given path.
+escaped_testroot = string.gsub(normalized_testroot, "([*+.()[\\^$|?])",
+  function (x) return "\\" .. x end)
+
 -- check default operation
 
 -- MinGW does not process the shebang in mtnopt; must invoke sh directly
@@ -13,7 +18,7 @@ check({"sh", "./mtnopt"}, 0, true)
 -- Don't pass the full /bin/sh path, it looks like that doesn't always
 -- work under mingw.
 check({"sh", "./mtnopt"}, 0, true)
-check(qgrep('^MTN_database="' .. normalized_testroot .. '/test.db";$', "stdout"))
+check(qgrep('^MTN_database="' .. escaped_testroot .. '/test.db";$', "stdout"))
 check(qgrep('^MTN_branch="testbranch";$', "stdout"))
 
 -- check operation with a specific key and just returning the value
============================================================
--- test/src/testlib.lua	6d2a308918594226fa6549ed0268ccaea3921038
+++ test/src/testlib.lua	445ed7ee75dfde94af676e7644e29e874aff58d7
@@ -144,6 +144,22 @@ end
   return n
 end
 
+-- encodes a query by percent escaping reserved characters (as defined
+-- in RFC 3986) - except for the directory separator ('/').
+function url_encode_path(path)
+  path = string.gsub(path, "([!*'();:@&=+$,?#[%]])",
+    function (x) return string.format("%%%02X", string.byte(x)) end)
+  return string.gsub(path, " ", "+")
+end
+
+-- encodes a query by percent escaping reserved characters (as defined
+-- in RFC 3986) - except for the ampersand and equal sign ('&', '=')
+function url_encode_query(path)
+  path = string.gsub(path, "([!*'();:@+$,/?#[%]])",
+    function (x) return string.format("%%%02X", string.byte(x)) end)
+  return string.gsub(path, " ", "+")
+end
+
 function open_or_err(filename, mode, depth)
   local file, e = io.open(filename, mode)
   if file == nil then
@@ -310,17 +326,11 @@ function include(name)
 -- to want to include from the dir for the current test,
 -- since in that case it could just go in the driver file.
 function include(name)
-  local func, e = loadfile(testdir.."/"..name)
-  if func == nil then err(e, 2) end
-  setfenv(func, getfenv(2))
-  func()
+  dofile(testdir.."/"..name)
 end
 
 function includecommon(name)
-  local func, e = loadfile(srcdir.."/common/"..name)
-  if func == nil then err(e, 2) end
-  setfenv(func, getfenv(2))
-  func()
+  dofile(srcdir.."/common/"..name)
 end
 
 function trim(str)
@@ -479,12 +489,11 @@ function samelines(f, t)
 function samelines(f, t)
   local fl = {}
   for l in io.lines(f) do table.insert(fl, l) end
-  if not (table.getn(fl) == table.getn(t)) then
-    L(locheader(), string.format("file has %s lines; table has %s\n",
-                                 table.getn(fl), table.getn(t)))
+  if not (#fl == #t) then
+    L(locheader(), string.format("file has %s lines; table has %s\n", #fl, #t))
     return false
   end
-  for i=1,table.getn(t) do
+  for i=1,#t do
     if fl[i] ~= t[i] then
       if fl[i] then
         L(locheader(), string.format("file[%d] = '%s'; table[%d] = '%s'\n",
@@ -502,12 +511,11 @@ function greplines(f, t)
 function greplines(f, t)
   local fl = {}
   for l in io.lines(f) do table.insert(fl, l) end
-  if not (table.getn(fl) == table.getn(t)) then
-    L(locheader(), string.format("file has %s lines; table has %s\n",
-                                 table.getn(fl), table.getn(t)))
+  if not (#fl == #t) then
+    L(locheader(), string.format("file has %s lines; table has %s\n", #fl, #t))
     return false
   end
-  for i=1,table.getn(t) do
+  for i=1,#t do
     if not regex.search(t[i], fl[i]) then
       L(locheader(), string.format("file[i] = '%s'; table[i] = '%s'\n",
                                    fl[i], t[i]))
@@ -577,7 +585,7 @@ function tail(...)
     local mylines = {}
     for l in io.lines(file) do
       table.insert(mylines, l)
-      if table.getn(mylines) > num then
+      if #mylines > num then
         table.remove(mylines, 1)
       end
     end
@@ -932,8 +940,8 @@ function run_tests(debugging, list_only,
     if _1 then
       l = l + 0
       r = r + 0
-      if l < 1 then l = table.getn(tests) + l + 1 end
-      if r < 1 then r = table.getn(tests) + r + 1 end
+      if l < 1 then l = #tests + l + 1 end
+      if r < 1 then r = #tests + r + 1 end
       if l > r then l,r = r,l end
       for j = l,r do
         torun[j] = tests[j]
@@ -941,7 +949,7 @@ function run_tests(debugging, list_only,
       run_all = false
     elseif string.find(a, "^-?%d+$") then
       r = a + 0
-      if r < 1 then r = table.getn(tests) + r + 1 end
+      if r < 1 then r = #tests + r + 1 end
       torun[r] = tests[r]
       run_all = false
     else
============================================================
--- test/unit/tests/xdelta.cc	4aff975cfd9a9cf18c26f70118e2895880ed6100
+++ test/unit/tests/xdelta.cc	ed5f467ebc4755f7521e74a40833181974b43a8f
@@ -8,11 +8,16 @@
 // PURPOSE.
 
 #include "../../../src/base.hh"
+
+// <boost/math/special_functions/detail/lgamma_small.hpp> uses L().
+// This conflicts with a #define in "../../../src/sanity.hh".
+// Workaround: Include BOOST header before "../../../src/xdelta.hh".
+#include <boost/random.hpp>
+
 #include "../unit_tests.hh"
 #include "../../../src/xdelta.hh"
 
 #include "../../../src/adler32.hh"
-#include <boost/random.hpp>
 
 boost::mt19937 xdelta_prng;
 boost::uniform_smallint<char> xdelta_chargen('a', 'z');
============================================================
--- util/audit-includes	d5757fcf83ab116fba16c53221da0f832307a113
+++ util/audit-includes	1c6fc8be30ebfafc67ca03980e7860db35e5d2e9
@@ -11,6 +11,7 @@ egrep -H "$(printf '^[ \t]*#[ \t]*includ
 # Check all C++ source files to make sure they obey the header file rules.
 
 egrep -H "$(printf '^[ \t]*#[ \t]*include\\>')" "$@" |
+  sed -e "$(printf 's/\r$//')" |
   sed -e "$(printf 's/:[ \t]*#[ \t]*include[ \t]*[<\"]/ /')" -e 's/[>"]$//' |
   {
     current=""
============================================================
--- visualc/config.h	58e9c7709f64437fe0f62cf1ca98a9f5906d92be
+++ visualc/config.h	4f5f6370f5e7f3da43b2de50fca73ed4d67c3d85
@@ -2,10 +2,10 @@
 #define CONFIG_H 1
 
 #define PACKAGE "monotone"
-#define PACKAGE_STRING "monotone 1.0"
+#define PACKAGE_STRING "monotone 1.1dev"
 #define PACKAGE_BUGREPORT "address@hidden"
 #define LC_MESSAGES LC_CTYPE
-#define VERSION "1.0"
+#define VERSION "1.1dev"
 
 #ifdef _MSC_VER
 typedef unsigned long pid_t;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]