comparison mercurial/cmdutil.py @ 17811:a8aba2921456

amend: add noise in extra to avoid creating obsolescence cycle (issue3664) Obsolescence cycle are bad and should be avoided as much as possible. The current amend implemented touch changeset meta data as few as possible. This make is easy for amend to result in the same node than a precursors. We add some deterministic noise in extra to avoid this. In practice, the hex of the amended changeset is stored in 'amend_source' extra key.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Thu, 18 Oct 2012 22:12:15 +0200
parents 9912baaae7df
children 578fcc22b469
comparison
equal deleted inserted replaced
17810:2894d180afa1 17811:a8aba2921456
9 from i18n import _ 9 from i18n import _
10 import os, sys, errno, re, tempfile 10 import os, sys, errno, re, tempfile
11 import util, scmutil, templater, patch, error, templatekw, revlog, copies 11 import util, scmutil, templater, patch, error, templatekw, revlog, copies
12 import match as matchmod 12 import match as matchmod
13 import subrepo, context, repair, bookmarks, graphmod, revset, phases, obsolete 13 import subrepo, context, repair, bookmarks, graphmod, revset, phases, obsolete
14 import changelog
14 import lock as lockmod 15 import lock as lockmod
15 16
16 def parsealiases(cmd): 17 def parsealiases(cmd):
17 return cmd.lstrip("^").split("|") 18 return cmd.lstrip("^").split("|")
18 19
1694 user = opts.get('user') or old.user() 1695 user = opts.get('user') or old.user()
1695 date = opts.get('date') or old.date() 1696 date = opts.get('date') or old.date()
1696 if not message: 1697 if not message:
1697 message = old.description() 1698 message = old.description()
1698 1699
1700 pureextra = extra.copy()
1701 extra['amend_source'] = old.hex()
1702
1699 new = context.memctx(repo, 1703 new = context.memctx(repo,
1700 parents=[base.node(), nullid], 1704 parents=[base.node(), nullid],
1701 text=message, 1705 text=message,
1702 files=files, 1706 files=files,
1703 filectxfn=filectxfn, 1707 filectxfn=filectxfn,
1704 user=user, 1708 user=user,
1705 date=date, 1709 date=date,
1706 extra=extra) 1710 extra=extra)
1707 new._text = commitforceeditor(repo, new, []) 1711 new._text = commitforceeditor(repo, new, [])
1712
1713 newdesc = changelog.stripdesc(new.description())
1714 if ((not node)
1715 and newdesc == old.description()
1716 and user == old.user()
1717 and date == old.date()
1718 and pureextra == old.extra()):
1719 # nothing changed. continuing here would create a new node
1720 # anyway because of the amend_source noise.
1721 #
1722 # This not what we expect from amend.
1723 return old.node()
1724
1708 ph = repo.ui.config('phases', 'new-commit', phases.draft) 1725 ph = repo.ui.config('phases', 'new-commit', phases.draft)
1709 try: 1726 try:
1710 repo.ui.setconfig('phases', 'new-commit', old.phase()) 1727 repo.ui.setconfig('phases', 'new-commit', old.phase())
1711 newid = repo.commitctx(new) 1728 newid = repo.commitctx(new)
1712 finally: 1729 finally: