annotate mercurial/state.py @ 48488:f8540fe4be0f

procutil: avoid an uninitialized variable usage on tempfile exception If `pycompat.unnamedtempfile()` raises an exception, it would have called `stdin.close()` in the `finally` block without it being initialized first. Differential Revision: https://phab.mercurial-scm.org/D11928
author Matt Harbison <matt_harbison@yahoo.com>
date Tue, 14 Dec 2021 17:29:30 -0500
parents f38bf44e077f
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
1 # state.py - writing and reading state files in Mercurial
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
2 #
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
3 # Copyright 2018 Pulkit Goyal <pulkitmgoyal@gmail.com>
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
4 #
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
7
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
8 """
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
9 This file contains class to wrap the state for commands and other
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
10 related logic.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
11
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
12 All the data related to the command state is stored as dictionary in the object.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
13 The class has methods using which the data can be stored to disk in a file under
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
14 .hg/ directory.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
15
41135
050ea8eb42a5 state: update comment about use of CBOR
Augie Fackler <augie@google.com>
parents: 39451
diff changeset
16 We store the data on disk in cbor, for which we use the CBOR format to encode
050ea8eb42a5 state: update comment about use of CBOR
Augie Fackler <augie@google.com>
parents: 39451
diff changeset
17 the data.
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
18 """
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
19
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
20 from __future__ import absolute_import
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
21
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
22 import contextlib
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
23
42529
5f2f6912c9e6 states: moved cmdutil.unfinishedstates to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 41135
diff changeset
24 from .i18n import _
5f2f6912c9e6 states: moved cmdutil.unfinishedstates to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 41135
diff changeset
25
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
26 from . import (
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
27 error,
43773
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43702
diff changeset
28 pycompat,
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
29 util,
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
30 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
31 from .utils import cborutil
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
32
43773
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43702
diff changeset
33 if pycompat.TYPE_CHECKING:
43702
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
34 from typing import (
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
35 Any,
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
36 Dict,
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
37 )
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
38
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
39 for t in (Any, Dict):
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
40 assert t
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
41
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
42
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
43 class cmdstate(object):
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
44 """a wrapper class to store the state of commands like `rebase`, `graft`,
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
45 `histedit`, `shelve` etc. Extensions can also use this to write state files.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
46
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
47 All the data for the state is stored in the form of key-value pairs in a
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
48 dictionary.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
49
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
50 The class object can write all the data to a file in .hg/ directory and
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
51 can populate the object data reading that file.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
52
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
53 Uses cbor to serialize and deserialize data while writing and reading from
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
54 disk.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
55 """
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
56
38145
6f67bfe4b82f state: removing remaining instances of opts class variable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38133
diff changeset
57 def __init__(self, repo, fname):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
58 """repo is the repo object
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
59 fname is the file name in which data should be stored in .hg directory
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
60 """
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
61 self._repo = repo
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
62 self.fname = fname
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
63
38104
36a5a1239a15 state: don't have a dict like interface for cmdstate class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38103
diff changeset
64 def read(self):
43702
127d46468a45 state: add a pytype annotation
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
65 # type: () -> Dict[bytes, Any]
38104
36a5a1239a15 state: don't have a dict like interface for cmdstate class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38103
diff changeset
66 """read the existing state file and return a dict of data stored"""
36a5a1239a15 state: don't have a dict like interface for cmdstate class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38103
diff changeset
67 return self._read()
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
68
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
69 def save(self, version, data):
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
70 """write all the state data stored to .hg/<filename> file
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
71
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
72 we use third-party library cbor to serialize data to write in the file.
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
73 """
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
74 if not isinstance(version, int):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
75 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
76 b"version of state file should be an integer"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
77 )
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
78
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
79 with self._repo.vfs(self.fname, b'wb', atomictemp=True) as fp:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
80 fp.write(b'%d\n' % version)
39451
5bfab9400daf state: use our CBOR module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38145
diff changeset
81 for chunk in cborutil.streamencode(data):
5bfab9400daf state: use our CBOR module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38145
diff changeset
82 fp.write(chunk)
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
83
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
84 def _read(self):
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
85 """reads the state file and returns a dictionary which contain
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
86 data in the same format as it was before storing"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
87 with self._repo.vfs(self.fname, b'rb') as fp:
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
88 try:
38127
b7e5c53a779e state: temporary silence pyflakes warning by removing variable assignment
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38126
diff changeset
89 int(fp.readline())
38106
a0e4d654bceb state: write the version number in plain text on top of state files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38105
diff changeset
90 except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
91 raise error.CorruptedState(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
92 b"unknown version of state file found"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
93 )
39451
5bfab9400daf state: use our CBOR module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38145
diff changeset
94
5bfab9400daf state: use our CBOR module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38145
diff changeset
95 return cborutil.decodeall(fp.read())[0]
38103
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
96
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
97 def delete(self):
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
98 """drop the state file if exists"""
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
99 util.unlinkpath(self._repo.vfs.join(self.fname), ignoremissing=True)
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
100
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
101 def exists(self):
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
102 """check whether the state file exists or not"""
a2f83661f721 state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
103 return self._repo.vfs.exists(self.fname)
42529
5f2f6912c9e6 states: moved cmdutil.unfinishedstates to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 41135
diff changeset
104
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
105
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
106 class _statecheck(object):
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
107 """a utility class that deals with multistep operations like graft,
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
108 histedit, bisect, update etc and check whether such commands
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
109 are in an unfinished conditition or not and return appropriate message
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
110 and hint.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
111 It also has the ability to register and determine the states of any new
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
112 multistep operation or multistep command extension.
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
113 """
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
114
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
115 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
116 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
117 opname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
118 fname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
119 clearable,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
120 allowcommit,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
121 reportonly,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
122 continueflag,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
123 stopflag,
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
124 childopnames,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
125 cmdmsg,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
126 cmdhint,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
127 statushint,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
128 abortfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
129 continuefunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
130 ):
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
131 self._opname = opname
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
132 self._fname = fname
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
133 self._clearable = clearable
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
134 self._allowcommit = allowcommit
42534
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
135 self._reportonly = reportonly
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
136 self._continueflag = continueflag
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
137 self._stopflag = stopflag
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
138 self._childopnames = childopnames
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
139 self._delegating = False
42534
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
140 self._cmdmsg = cmdmsg
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
141 self._cmdhint = cmdhint
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
142 self._statushint = statushint
42581
bb135a784b70 abort: added logic for of hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 42541
diff changeset
143 self.abortfunc = abortfunc
42612
3c16b9c0b099 continue: added logic for hg continue
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
144 self.continuefunc = continuefunc
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
145
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
146 def statusmsg(self):
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
147 """returns the hint message corresponding to the command for
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
148 hg status --verbose
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
149 """
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
150 if not self._statushint:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
151 hint = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
152 b'To continue: hg %s --continue\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
153 b'To abort: hg %s --abort'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
154 ) % (self._opname, self._opname)
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
155 if self._stopflag:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
156 hint = hint + (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
157 _(b'\nTo stop: hg %s --stop') % (self._opname)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
158 )
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
159 return hint
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
160 return self._statushint
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
161
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
162 def hint(self):
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
163 """returns the hint message corresponding to an interrupted
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
164 operation
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
165 """
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
166 if not self._cmdhint:
45215
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
167 if not self._stopflag:
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
168 return _(b"use 'hg %s --continue' or 'hg %s --abort'") % (
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
169 self._opname,
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
170 self._opname,
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
171 )
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
172 else:
45244
d4a28b76fa54 cleanup: fix bad formatting of state.py from D8811
Martin von Zweigbergk <martinvonz@google.com>
parents: 45215
diff changeset
173 return _(
d4a28b76fa54 cleanup: fix bad formatting of state.py from D8811
Martin von Zweigbergk <martinvonz@google.com>
parents: 45215
diff changeset
174 b"use 'hg %s --continue', 'hg %s --abort', "
d4a28b76fa54 cleanup: fix bad formatting of state.py from D8811
Martin von Zweigbergk <martinvonz@google.com>
parents: 45215
diff changeset
175 b"or 'hg %s --stop'"
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
176 ) % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
177 self._opname,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
178 self._opname,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
179 self._opname,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45244
diff changeset
180 )
45215
a253ded5b03d morestatus: mention --stop even if not using --verbose
Kyle Lippincott <spectral@google.com>
parents: 45171
diff changeset
181
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
182 return self._cmdhint
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
183
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
184 def msg(self):
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
185 """returns the status message corresponding to the command"""
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
186 if not self._cmdmsg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
187 return _(b'%s in progress') % (self._opname)
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
188 return self._cmdmsg
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
189
42533
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42532
diff changeset
190 def continuemsg(self):
47062
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 45942
diff changeset
191 """returns appropriate continue message corresponding to command"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 return _(b'hg %s --continue') % (self._opname)
42533
0231032729c4 statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42532
diff changeset
193
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
194 def isunfinished(self, repo):
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
195 """determines whether a multi-step operation is in progress
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
196 or not
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
197 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
198 if self._opname == b'merge':
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
199 return len(repo[None].parents()) > 1
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
200 elif self._delegating:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
201 return False
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
202 else:
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
203 return repo.vfs.exists(self._fname)
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
205
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
206 # A list of statecheck objects for multistep operations like graft.
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
207 _unfinishedstates = []
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
208 _unfinishedstatesbyname = {}
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
210
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
211 def addunfinished(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
212 opname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
213 fname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
214 clearable=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
215 allowcommit=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
216 reportonly=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
217 continueflag=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
218 stopflag=False,
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
219 childopnames=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
220 cmdmsg=b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
221 cmdhint=b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
222 statushint=b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
223 abortfunc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
224 continuefunc=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
225 ):
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
226 """this registers a new command or operation to unfinishedstates
42534
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
227 opname is the name the command or operation
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
228 fname is the file name in which data should be stored in .hg directory.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
229 It is None for merge command.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
230 clearable boolean determines whether or not interrupted states can be
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
231 cleared by running `hg update -C .` which in turn deletes the
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
232 state file.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
233 allowcommit boolean decides whether commit is allowed during interrupted
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
234 state or not.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
235 reportonly flag is used for operations like bisect where we just
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
236 need to detect the operation using 'hg status --verbose'
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
237 continueflag is a boolean determines whether or not a command supports
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
238 `--continue` option or not.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
239 stopflag is a boolean that determines whether or not a command supports
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
240 --stop flag
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
241 childopnames is a list of other opnames this op uses as sub-steps of its
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
242 own execution. They must already be added.
42534
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
243 cmdmsg is used to pass a different status message in case standard
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
244 message of the format "abort: cmdname in progress" is not desired.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
245 cmdhint is used to pass a different hint message in case standard
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
246 message of the format "To continue: hg cmdname --continue
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
247 To abort: hg cmdname --abort" is not desired.
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
248 statushint is used to pass a different status message in case standard
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
249 message of the format ('To continue: hg cmdname --continue'
faec09d89435 statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
250 'To abort: hg cmdname --abort') is not desired
42581
bb135a784b70 abort: added logic for of hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 42541
diff changeset
251 abortfunc stores the function required to abort an unfinished state.
42612
3c16b9c0b099 continue: added logic for hg continue
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
252 continuefunc stores the function required to finish an interrupted
3c16b9c0b099 continue: added logic for hg continue
Taapas Agrawal <taapas2897@gmail.com>
parents: 42600
diff changeset
253 operation.
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
254 """
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
255 childopnames = childopnames or []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
256 statecheckobj = _statecheck(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
257 opname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
258 fname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
259 clearable,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
260 allowcommit,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
261 reportonly,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
262 continueflag,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
263 stopflag,
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
264 childopnames,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
265 cmdmsg,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
266 cmdhint,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
267 statushint,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
268 abortfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
269 continuefunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
270 )
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
271
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
272 if opname == b'merge':
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
273 _unfinishedstates.append(statecheckobj)
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
274 else:
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
275 # This check enforces that for any op 'foo' which depends on op 'bar',
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
276 # 'foo' comes before 'bar' in _unfinishedstates. This ensures that
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
277 # getrepostate() always returns the most specific applicable answer.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
278 for childopname in childopnames:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
279 if childopname not in _unfinishedstatesbyname:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
280 raise error.ProgrammingError(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
281 _(b'op %s depends on unknown op %s') % (opname, childopname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
282 )
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
283
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
284 _unfinishedstates.insert(0, statecheckobj)
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
285
45171
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
286 if opname in _unfinishedstatesbyname:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
287 raise error.ProgrammingError(_(b'op %s registered twice') % opname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
288 _unfinishedstatesbyname[opname] = statecheckobj
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
289
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
290
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
291 def _getparentandchild(opname, childopname):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
292 p = _unfinishedstatesbyname.get(opname, None)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
293 if not p:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
294 raise error.ProgrammingError(_(b'unknown op %s') % opname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
295 if childopname not in p._childopnames:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
296 raise error.ProgrammingError(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
297 _(b'op %s does not delegate to %s') % (opname, childopname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
298 )
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
299 c = _unfinishedstatesbyname[childopname]
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
300 return p, c
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
301
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
302
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
303 @contextlib.contextmanager
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
304 def delegating(repo, opname, childopname):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
305 """context wrapper for delegations from opname to childopname.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
306
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
307 requires that childopname was specified when opname was registered.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
308
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
309 Usage:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
310 def my_command_foo_that_uses_rebase(...):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
311 ...
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
312 with state.delegating(repo, 'foo', 'rebase'):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
313 _run_rebase(...)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
314 ...
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
315 """
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
316
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
317 p, c = _getparentandchild(opname, childopname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
318 if p._delegating:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
319 raise error.ProgrammingError(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
320 _(b'cannot delegate from op %s recursively') % opname
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
321 )
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
322 p._delegating = True
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
323 try:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
324 yield
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
325 except error.ConflictResolutionRequired as e:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
326 # Rewrite conflict resolution advice for the parent opname.
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
327 if e.opname == childopname:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
328 raise error.ConflictResolutionRequired(opname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
329 raise e
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
330 finally:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
331 p._delegating = False
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
332
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
333
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
334 def ischildunfinished(repo, opname, childopname):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
335 """Returns true if both opname and childopname are unfinished."""
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
336
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
337 p, c = _getparentandchild(opname, childopname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
338 return (p._delegating or p.isunfinished(repo)) and c.isunfinished(repo)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
339
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
340
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
341 def continuechild(ui, repo, opname, childopname):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
342 """Checks that childopname is in progress, and continues it."""
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
343
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
344 p, c = _getparentandchild(opname, childopname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
345 if not ischildunfinished(repo, opname, childopname):
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
346 raise error.ProgrammingError(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
347 _(b'child op %s of parent %s is not unfinished')
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
348 % (childopname, opname)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
349 )
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
350 if not c.continuefunc:
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
351 raise error.ProgrammingError(
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
352 _(b'op %s has no continue function') % childopname
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
353 )
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
354 return c.continuefunc(ui, repo)
5322e738be0f state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents: 43773
diff changeset
355
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
356
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
357 addunfinished(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 b'update',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
359 fname=b'updatestate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
360 clearable=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
361 cmdmsg=_(b'last update was interrupted'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
362 cmdhint=_(b"use 'hg update' to get a consistent checkout"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
363 statushint=_(b"To continue: hg update ."),
42530
dc3fdd1b5af4 state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents: 42529
diff changeset
364 )
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
365 addunfinished(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 b'bisect',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
367 fname=b'bisect.state',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
368 allowcommit=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
369 reportonly=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
370 statushint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 b'To mark the changeset good: hg bisect --good\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
372 b'To mark the changeset bad: hg bisect --bad\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
373 b'To abort: hg bisect --reset\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
374 ),
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
375 )
42531
5bddd2244814 state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
376
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43045
diff changeset
377
42531
5bddd2244814 state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
378 def getrepostate(repo):
5bddd2244814 state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
379 # experimental config: commands.status.skipstates
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 skip = set(repo.ui.configlist(b'commands', b'status.skipstates'))
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
381 for state in _unfinishedstates:
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
382 if state._opname in skip:
42531
5bddd2244814 state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
383 continue
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
384 if state.isunfinished(repo):
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42531
diff changeset
385 return (state._opname, state.statusmsg())