# HG changeset patch # User Pierre-Yves David # Date 1675758995 -3600 # Node ID f93bccadcf42773810b9c12e94564ea6933b086b # Parent 115510658219633a517c7bd640a449fbcaa751bb mq: properly take the wlock during the full qfold operation Otherwise the operation could be raced… for unknown result. diff -r 115510658219 -r f93bccadcf42 hgext/mq.py --- a/hgext/mq.py Sat Feb 04 11:46:57 2023 +0100 +++ b/hgext/mq.py Tue Feb 07 09:36:35 2023 +0100 @@ -1153,7 +1153,7 @@ sortedseries.append((idx, p)) sortedseries.sort(reverse=True) - for (i, p) in sortedseries: + for i, p in sortedseries: if i != -1: del self.fullseries[i] else: @@ -1177,7 +1177,6 @@ firstrev = repo[self.applied[0].node].rev() patches = [] for i, rev in enumerate(revs): - if rev < firstrev: raise error.Abort(_(b'revision %d is not managed') % rev) @@ -3225,45 +3224,46 @@ raise error.Abort(_(b'qfold requires at least one patch name')) if not q.checktoppatch(repo)[0]: raise error.Abort(_(b'no patches applied')) - q.checklocalchanges(repo) - - message = cmdutil.logmessage(ui, opts) - - parent = q.lookup(b'qtip') - patches = [] - messages = [] - for f in files: - p = q.lookup(f) - if p in patches or p == parent: - ui.warn(_(b'skipping already folded patch %s\n') % p) - if q.isapplied(p): - raise error.Abort( - _(b'qfold cannot fold already applied patch %s') % p - ) - patches.append(p) - - for p in patches: + + with repo.wlock(): + q.checklocalchanges(repo) + + message = cmdutil.logmessage(ui, opts) + + parent = q.lookup(b'qtip') + patches = [] + messages = [] + for f in files: + p = q.lookup(f) + if p in patches or p == parent: + ui.warn(_(b'skipping already folded patch %s\n') % p) + if q.isapplied(p): + raise error.Abort( + _(b'qfold cannot fold already applied patch %s') % p + ) + patches.append(p) + + for p in patches: + if not message: + ph = patchheader(q.join(p), q.plainmode) + if ph.message: + messages.append(ph.message) + pf = q.join(p) + (patchsuccess, files, fuzz) = q.patch(repo, pf) + if not patchsuccess: + raise error.Abort(_(b'error folding patch %s') % p) + if not message: - ph = patchheader(q.join(p), q.plainmode) - if ph.message: - messages.append(ph.message) - pf = q.join(p) - (patchsuccess, files, fuzz) = q.patch(repo, pf) - if not patchsuccess: - raise error.Abort(_(b'error folding patch %s') % p) - - if not message: - ph = patchheader(q.join(parent), q.plainmode) - message = ph.message - for msg in messages: - if msg: - if message: - message.append(b'* * *') - message.extend(msg) - message = b'\n'.join(message) - - diffopts = q.patchopts(q.diffopts(), *patches) - with repo.wlock(): + ph = patchheader(q.join(parent), q.plainmode) + message = ph.message + for msg in messages: + if msg: + if message: + message.append(b'* * *') + message.extend(msg) + message = b'\n'.join(message) + + diffopts = q.patchopts(q.diffopts(), *patches) q.refresh( repo, msg=message,