--- 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]