comparison hgext/mq.py @ 47597:4b76f5ca79c4

mq: update the dirstate and its parent within a `parentchange` context This is more correct, and move our plan of separated API for different dirstate usage forward. note: maybe the `parentchange` context manager should replace the dirstateguard entirely ? (in this case we should probably deprecated dirstateguard). Differential Revision: https://phab.mercurial-scm.org/D11017
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 08 Jul 2021 03:42:14 +0200
parents d55b71393907
children 305356a7ec99
comparison
equal deleted inserted replaced
47596:791e2333d3d3 47597:4b76f5ca79c4
2000 files.update(x) 2000 files.update(x)
2001 match = scmutil.matchfiles(repo, files) 2001 match = scmutil.matchfiles(repo, files)
2002 2002
2003 bmlist = repo[top].bookmarks() 2003 bmlist = repo[top].bookmarks()
2004 2004
2005 dsguard = None 2005 with repo.dirstate.parentchange():
2006 try: 2006 # XXX do we actually need the dirstateguard
2007 dsguard = dirstateguard.dirstateguard(repo, b'mq.refresh') 2007 dsguard = None
2008 if diffopts.git or diffopts.upgrade: 2008 try:
2009 copies = {} 2009 dsguard = dirstateguard.dirstateguard(repo, b'mq.refresh')
2010 for dst in a: 2010 if diffopts.git or diffopts.upgrade:
2011 src = repo.dirstate.copied(dst) 2011 copies = {}
2012 # during qfold, the source file for copies may 2012 for dst in a:
2013 # be removed. Treat this as a simple add. 2013 src = repo.dirstate.copied(dst)
2014 if src is not None and src in repo.dirstate: 2014 # during qfold, the source file for copies may
2015 copies.setdefault(src, []).append(dst) 2015 # be removed. Treat this as a simple add.
2016 repo.dirstate.add(dst) 2016 if src is not None and src in repo.dirstate:
2017 # remember the copies between patchparent and qtip 2017 copies.setdefault(src, []).append(dst)
2018 for dst in aaa: 2018 repo.dirstate.add(dst)
2019 src = ctx[dst].copysource() 2019 # remember the copies between patchparent and qtip
2020 if src: 2020 for dst in aaa:
2021 copies.setdefault(src, []).extend( 2021 src = ctx[dst].copysource()
2022 copies.get(dst, []) 2022 if src:
2023 ) 2023 copies.setdefault(src, []).extend(
2024 if dst in a: 2024 copies.get(dst, [])
2025 copies[src].append(dst) 2025 )
2026 # we can't copy a file created by the patch itself 2026 if dst in a:
2027 if dst in copies: 2027 copies[src].append(dst)
2028 del copies[dst] 2028 # we can't copy a file created by the patch itself
2029 for src, dsts in pycompat.iteritems(copies): 2029 if dst in copies:
2030 for dst in dsts: 2030 del copies[dst]
2031 repo.dirstate.copy(src, dst) 2031 for src, dsts in pycompat.iteritems(copies):
2032 else: 2032 for dst in dsts:
2033 for dst in a: 2033 repo.dirstate.copy(src, dst)
2034 repo.dirstate.add(dst) 2034 else:
2035 # Drop useless copy information 2035 for dst in a:
2036 for f in list(repo.dirstate.copies()): 2036 repo.dirstate.add(dst)
2037 repo.dirstate.copy(None, f) 2037 # Drop useless copy information
2038 for f in r: 2038 for f in list(repo.dirstate.copies()):
2039 repo.dirstate.remove(f) 2039 repo.dirstate.copy(None, f)
2040 # if the patch excludes a modified file, mark that 2040 for f in r:
2041 # file with mtime=0 so status can see it. 2041 repo.dirstate.remove(f)
2042 mm = [] 2042 # if the patch excludes a modified file, mark that
2043 for i in pycompat.xrange(len(m) - 1, -1, -1): 2043 # file with mtime=0 so status can see it.
2044 if not match1(m[i]): 2044 mm = []
2045 mm.append(m[i]) 2045 for i in pycompat.xrange(len(m) - 1, -1, -1):
2046 del m[i] 2046 if not match1(m[i]):
2047 for f in m: 2047 mm.append(m[i])
2048 repo.dirstate.normal(f) 2048 del m[i]
2049 for f in mm: 2049 for f in m:
2050 repo.dirstate.normallookup(f) 2050 repo.dirstate.normal(f)
2051 for f in forget: 2051 for f in mm:
2052 repo.dirstate.drop(f) 2052 repo.dirstate.normallookup(f)
2053 2053 for f in forget:
2054 user = ph.user or ctx.user() 2054 repo.dirstate.drop(f)
2055 2055
2056 oldphase = repo[top].phase() 2056 user = ph.user or ctx.user()
2057 2057
2058 # assumes strip can roll itself back if interrupted 2058 oldphase = repo[top].phase()
2059 repo.setparents(*cparents) 2059
2060 self.applied.pop() 2060 # assumes strip can roll itself back if interrupted
2061 self.applieddirty = True 2061 repo.setparents(*cparents)
2062 strip(self.ui, repo, [top], update=False, backup=False) 2062 self.applied.pop()
2063 dsguard.close() 2063 self.applieddirty = True
2064 finally: 2064 strip(self.ui, repo, [top], update=False, backup=False)
2065 release(dsguard) 2065 dsguard.close()
2066 finally:
2067 release(dsguard)
2066 2068
2067 try: 2069 try:
2068 # might be nice to attempt to roll back strip after this 2070 # might be nice to attempt to roll back strip after this
2069 2071
2070 defaultmsg = b"[mq]: %s" % patchfn 2072 defaultmsg = b"[mq]: %s" % patchfn