diff -r 5b4f963d21cc -r 95b9c6149e17 mercurial/merge.py --- a/mercurial/merge.py Wed Nov 06 17:02:07 2013 -0600 +++ b/mercurial/merge.py Wed Jan 15 16:41:18 2014 -0600 @@ -696,6 +696,34 @@ node = repo.lookup("tip") # update to tip else: raise util.Abort(_("branch %s not found") % wc.branch()) + + if p1.obsolete() and not p1.children(): + # allow updating to successors + successors = obsolete.successorssets(repo, p1.node()) + + # behavior of certain cases is as follows, + # + # divergent changesets: update to highest rev, similar to what + # is currently done when there are more than one head + # (i.e. 'tip') + # + # replaced changesets: same as divergent except we know there + # is no conflict + # + # pruned changeset: no update is done; though, we could + # consider updating to the first non-obsolete parent, + # similar to what is current done for 'hg prune' + + if successors: + # flatten the list here handles both divergent (len > 1) + # and the usual case (len = 1) + successors = [n for sub in successors for n in sub] + + # get the max revision for the given successors set, + # i.e. the 'tip' of a set + node = repo.revs("max(%ln)", successors)[0] + pa = p1 + overwrite = force and not branchmerge p2 = repo[node]