# # # add_file "tests/t_rosterify_drop_attrs.at" # # patch "app_state.hh" # from [46c9db4bd798b0b4f6a626d8c163006bd3b7dea1] # to [703372dfe26dbead6b36e26b2d729f59d917e2b2] # # patch "commands.cc" # from [51c1ada21a497834c5b76fba46561516c88332c4] # to [641908036ba04947ffe8d58dd96ab464288fba8a] # # patch "monotone.cc" # from [19b5a87f886cb86d8632319973ba25e4dd86f48d] # to [510ce2ee55b92a5b09c8fe086be42967573517c8] # # patch "options.hh" # from [7d90588b90ca771e06d433e2649d766690b2ed31] # to [b6606c914815dd8bd757c8f4b17a7fbce9275447] # # patch "revision.cc" # from [1ea5d2059887284613a88232c5415004df7bfd0e] # to [0f62e7efffece6e153c8da0c3a1d64e9d4b13f0c] # # patch "tests/t_rosterify_drop_attrs.at" # from [] # to [f61d5a48ec42d5f34ae66b1664f6c862237c221a] # # patch "testsuite.at" # from [af3f0a86558a0e67c56060aaf486e0c5b83560fd] # to [44169e5abbfba7f70877c5b1f26bab8ba0e9a8dd] # ============================================================ --- app_state.hh 46c9db4bd798b0b4f6a626d8c163006bd3b7dea1 +++ app_state.hh 703372dfe26dbead6b36e26b2d729f59d917e2b2 @@ -71,6 +71,7 @@ std::vector keys_to_push; system_path confdir; bool have_set_key_dir; + std::set attrs_to_drop; std::map explicit_option_map; // set if the value of the flag was explicitly given on the command line void set_is_explicit_option (int option_id); ============================================================ --- commands.cc 51c1ada21a497834c5b76fba46561516c88332c4 +++ commands.cc 641908036ba04947ffe8d58dd96ab464288fba8a @@ -2110,7 +2110,7 @@ "rosterify\n" "set_epoch BRANCH EPOCH\n"), N_("manipulate database state"), - OPT_NONE) + OPT_DROP_ATTR) { if (args.size() == 1) { ============================================================ --- monotone.cc 19b5a87f886cb86d8632319973ba25e4dd86f48d +++ monotone.cc 510ce2ee55b92a5b09c8fe086be42967573517c8 @@ -72,6 +72,7 @@ {"missing", 0, POPT_ARG_NONE, NULL, OPT_MISSING, gettext_noop("perform the operations for files missing from working directory"), NULL}, {"unknown", 0, POPT_ARG_NONE, NULL, OPT_UNKNOWN, gettext_noop("perform the operations for unknown files from working directory"), NULL}, {"key-to-push", 0, POPT_ARG_STRING, &argstr, OPT_KEY_TO_PUSH, gettext_noop("push the specified key even if it hasn't signed anything"), NULL}, + {"drop-attr", 0, POPT_ARG_STRING, &argstr, OPT_DROP_ATTR, gettext_noop("when rosterifying, drop attrs entries with the given key"), NULL}, { NULL, 0, 0, NULL, 0, NULL, NULL } }; @@ -509,6 +510,10 @@ } break; + case OPT_DROP_ATTR: + app.attrs_to_drop.insert(string(argstr)); + break; + case OPT_HELP: default: requested_help = true; ============================================================ --- options.hh 7d90588b90ca771e06d433e2649d766690b2ed31 +++ options.hh b6606c914815dd8bd757c8f4b17a7fbce9275447 @@ -49,3 +49,4 @@ #define OPT_UNKNOWN 40 #define OPT_KEY_TO_PUSH 41 #define OPT_CONF_DIR 42 +#define OPT_DROP_ATTR 43 ============================================================ --- revision.cc 1ea5d2059887284613a88232c5415004df7bfd0e +++ revision.cc 0f62e7efffece6e153c8da0c3a1d64e9d4b13f0c @@ -1248,15 +1248,18 @@ k != fattrs.end(); ++k) { std::string key = k->first; - if (key == "execute" || key == "manual_merge") - key = "mtn:" + key; + if (app.attrs_to_drop.find(key) != app.attrs_to_drop.end()) + { + // ignore it + } + else if (key == "execute" || key == "manual_merge") + child_roster.set_attr(sp, + attr_key("mtn:" + key), + attr_value(k->second)); else E(false, F("unknown attribute %s on path %s\n" "please contact %s so we can work out the right way to migrate this") % key % file_path(sp) % PACKAGE_BUGREPORT); - child_roster.set_attr(sp, - attr_key(key), - attr_value(k->second)); } } } @@ -1371,17 +1374,32 @@ require_password(key, app); } + // cross-check that we're getting everything + // in fact the code in this function is wrong, because if a revision has no + // parents and no children (it is a root revision, and no children have been + // committed under it), then we will simply drop it! + // This code at least causes this case to throw an assertion; FIXME: make + // this case actually work. + std::set all_rev_ids; + app.db.get_revision_ids(all_rev_ids); + app.db.get_revision_ancestry(existing_graph); for (std::multimap::const_iterator i = existing_graph.begin(); i != existing_graph.end(); ++i) { + // FIXME: insert for the null id as well, and do the same for the + // changesetify code, and then reach rebuild_ancestry how to deal with + // such things. (I guess u64(0) should represent the null parent?) if (!null_id(i->first)) { u64 parent_node = graph.add_node_for_oldstyle_revision(i->first); + all_rev_ids.erase(i->first); u64 child_node = graph.add_node_for_oldstyle_revision(i->second); + all_rev_ids.erase(i->second); graph.add_node_ancestry(child_node, parent_node); } } + I(all_rev_ids.empty()); global_sanity.set_relaxed(false); graph.rebuild_ancestry(); ============================================================ --- tests/t_rosterify_drop_attrs.at +++ tests/t_rosterify_drop_attrs.at f61d5a48ec42d5f34ae66b1664f6c862237c221a @@ -0,0 +1,105 @@ +AT_SETUP([rosterify --drop-attr]) +MONOTONE_SETUP +NEED_UNGZB64 + +# This is a db containing two revisions. The first revision contains the +# file "testfile", and has a .mt-attrs file that contains: +### +# file "testfile" +# foo "bar" +#execute "yes" +### +# The second revision is identical, except it also contains the file +# "otherfile". The existence of the second revision is purely to work +# around a current bug in rosterify, in which it breaks for revisions +# which have no parents and no children. (It hits an invariant; +# without the invariant, it would silently throw such revisions away.) + +AT_DATA([test.db.dump.gz.b64], [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 +]) + +AT_CHECK(rm -f test.db) + +UNGZB64(test.db.dump.gz.b64, test.db.dump) +AT_CHECK(MONOTONE db load < test.db.dump, [], [ignore], [ignore]) +AT_CHECK(MONOTONE db migrate, [], [ignore], [ignore]) + +AT_CHECK(MONOTONE db rosterify, [1], [ignore], [ignore]) +AT_CHECK(MONOTONE db rosterify --drop-attr foo, [], [ignore], [ignore]) + +AT_DATA([manifest_good], [format_version "1" + +dir "" + + file "testfile" +content @<:@f572d396fae9206628714fb2ce00f72e94f2258f@:>@ + attr "mtn:execute" "yes" +]) +CHECK_SAME_CANONICALISED_STDOUT(cat manifest_good, MONOTONE automate select i: | monotone automate toposort address@hidden | head -1 | monotone automate get_manifest_of address@hidden) + +AT_CLEANUP ============================================================ --- testsuite.at af3f0a86558a0e67c56060aaf486e0c5b83560fd +++ testsuite.at 44169e5abbfba7f70877c5b1f26bab8ba0e9a8dd @@ -752,3 +752,4 @@ m4_include(tests/t_mixed_case_pwd.at) m4_include(tests/t_read_privkey.at) m4_include(tests/t_restricted_commands_consistent.at) +m4_include(tests/t_rosterify_drop_attrs.at)