# # # patch "policy.cc" # from [5fedc35e968f7666c5174fff32e1fd7a827d4d28] # to [e68e4275728721bd97b39c69c520f565d8b13eaa] # # patch "policy.hh" # from [d1ac47aba3f5f99d6d3b0a24ce31010777809fa9] # to [b089b8a6e7d898cc9ab6c7fc3bb37999ede3b456] # # patch "project.cc" # from [a5b5306c4f6ef39330ceeb6a6c5a44e38ef2fa6c] # to [cd6eb9166e06ec2a89797ba09e9084fdab99a482] # # patch "tests/policy-basic/__driver__.lua" # from [93a00f0043ffc206da000997587303011189c364] # to [8255551f13efd5e894e099b42b73a7b96a845a40] # ============================================================ --- policy.cc 5fedc35e968f7666c5174fff32e1fd7a827d4d28 +++ policy.cc e68e4275728721bd97b39c69c520f565d8b13eaa @@ -346,7 +346,18 @@ get_branch_heads(branch_policy const & p return ret; } +bool +revision_is_in_branch(branch_policy const & pol, + revision_id const & rid, + database & db) +{ + not_in_managed_branch p(db, + cert_value(pol.branch_cert_value()), + pol.committers); + return !p(rid); +} + bool maybe_get_policy_branch_head(branch_uid const & name, set const & trusted_signers, database & db, ============================================================ --- policy.hh d1ac47aba3f5f99d6d3b0a24ce31010777809fa9 +++ policy.hh b089b8a6e7d898cc9ab6c7fc3bb37999ede3b456 @@ -64,6 +64,10 @@ get_branch_heads(branch_policy const & p std::multimap * inverse_graph_cache_ptr); +bool +revision_is_in_branch(branch_policy const & pol, + revision_id const & rid, + database & db); class policy_revision; ============================================================ --- project.cc a5b5306c4f6ef39330ceeb6a6c5a44e38ef2fa6c +++ project.cc cd6eb9166e06ec2a89797ba09e9084fdab99a482 @@ -311,25 +311,31 @@ project_t::revision_is_in_branch(revisio project_t::revision_is_in_branch(revision_id const & id, branch_name const & branch) { - branch_uid bid; if (project_policy->passthru) - bid = branch_uid(branch()); - else - bid = translate_branch(branch); - vector > certs; - db.get_revision_certs(id, branch_cert_name, cert_value(branch()), certs); + { + branch_uid bid = branch_uid(branch()); + vector > certs; + db.get_revision_certs(id, branch_cert_name, cert_value(bid()), certs); - int num = certs.size(); + int num = certs.size(); - erase_bogus_certs(db, certs); + erase_bogus_certs(db, certs); - L(FL("found %d (%d valid) %s branch certs on revision %s") - % num - % certs.size() - % branch - % id); + L(FL("found %d (%d valid) %s branch certs on revision %s") + % num + % certs.size() + % branch + % id); - return !certs.empty(); + return !certs.empty(); + } + else + { + shared_ptr bp; + bp = project_policy->policy.maybe_get_branch_policy(branch); + E(bp, F("Cannot find policy for branch %s.") % branch); + return ::revision_is_in_branch(*bp, id, db); + } } void ============================================================ --- tests/policy-basic/__driver__.lua 93a00f0043ffc206da000997587303011189c364 +++ tests/policy-basic/__driver__.lua 8255551f13efd5e894e099b42b73a7b96a845a40 @@ -39,6 +39,7 @@ check(mtn("merge", "--branch=test_projec check(mtn("merge", "--branch=test_project.__policy__", "--policy-revision=test_project@" .. base), 0, false, false) +check(mtn("update", "-r", base), 0, false, false) check(mtn("up"), 0, false, false) check(base ~= base_revision())