Mercurial > public > mercurial-scm > hg
annotate mercurial/state.py @ 45171:5322e738be0f
state: support validated declaration of nested unfinished ops
This enables extensions to define commands that delgate to rebase, evolve, etc. one or more times to also have their own unfinished states for the full sequence of operations without monkey-patching _unfinishedstates.
Differential Revision: https://phab.mercurial-scm.org/D8714
author | Daniel Ploch <dploch@google.com> |
---|---|
date | Tue, 14 Jul 2020 13:36:57 -0700 |
parents | 7b14d649af1b |
children | a253ded5b03d |
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): |
38103
a2f83661f721
state: import the file to write state files from evolve extension
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff
changeset
|
58 """ repo is the repo object |
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, |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
108 histedit, bisect, update etc and check whether such commands |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
109 are in an unfinished conditition or not and return appropriate message |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
110 and hint. |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
111 It also has the ability to register and determine the states of any new |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
112 multistep operation or multistep command extension. |
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: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 return _(b"use 'hg %s --continue' or 'hg %s --abort'") % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
168 self._opname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
169 self._opname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
170 ) |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
171 return self._cmdhint |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
172 |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
173 def msg(self): |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
174 """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
|
175 if not self._cmdmsg: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
176 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
|
177 return self._cmdmsg |
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
178 |
42533
0231032729c4
statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42532
diff
changeset
|
179 def continuemsg(self): |
0231032729c4
statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42532
diff
changeset
|
180 """ 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
|
181 return _(b'hg %s --continue') % (self._opname) |
42533
0231032729c4
statecheck: added support for cmdutil.afterresolvedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42532
diff
changeset
|
182 |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
183 def isunfinished(self, repo): |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
184 """determines whether a multi-step operation is in progress |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
185 or not |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
186 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
187 if self._opname == b'merge': |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
188 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
|
189 elif self._delegating: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
190 return False |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
191 else: |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
192 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
|
193 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
194 |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
195 # 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
|
196 _unfinishedstates = [] |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
197 _unfinishedstatesbyname = {} |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
198 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
199 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
200 def addunfinished( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
201 opname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
202 fname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
203 clearable=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
204 allowcommit=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
205 reportonly=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
206 continueflag=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
207 stopflag=False, |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
208 childopnames=None, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
209 cmdmsg=b"", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
210 cmdhint=b"", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
211 statushint=b"", |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
212 abortfunc=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
213 continuefunc=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
214 ): |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
215 """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
|
216 opname is the name the command or operation |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
217 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
|
218 It is None for merge command. |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
219 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
|
220 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
|
221 state file. |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
222 allowcommit boolean decides whether commit is allowed during interrupted |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
223 state or not. |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
224 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
|
225 need to detect the operation using 'hg status --verbose' |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
226 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
|
227 `--continue` option or not. |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
228 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
|
229 --stop flag |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
230 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
|
231 own execution. They must already be added. |
42534
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
232 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
|
233 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
|
234 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
|
235 message of the format "To continue: hg cmdname --continue |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
236 To abort: hg cmdname --abort" is not desired. |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
237 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
|
238 message of the format ('To continue: hg cmdname --continue' |
faec09d89435
statecheck: shifted defaults to addunfinished()
Taapas Agrawal <taapas2897@gmail.com>
parents:
42533
diff
changeset
|
239 '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
|
240 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
|
241 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
|
242 operation. |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
243 """ |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
244 childopnames = childopnames or [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
245 statecheckobj = _statecheck( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
246 opname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
247 fname, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
248 clearable, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
249 allowcommit, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
250 reportonly, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
251 continueflag, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
252 stopflag, |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
253 childopnames, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
254 cmdmsg, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
255 cmdhint, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
256 statushint, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
257 abortfunc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
258 continuefunc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
259 ) |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
260 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
261 if opname == b'merge': |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
262 _unfinishedstates.append(statecheckobj) |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
263 else: |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
264 # 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
|
265 # '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
|
266 # 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
|
267 for childopname in childopnames: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
268 if childopname not in _unfinishedstatesbyname: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
269 raise error.ProgrammingError( |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
270 _(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
|
271 ) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
272 |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
273 _unfinishedstates.insert(0, statecheckobj) |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
274 |
45171
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
275 if opname in _unfinishedstatesbyname: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
276 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
|
277 _unfinishedstatesbyname[opname] = statecheckobj |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
278 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
279 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
280 def _getparentandchild(opname, childopname): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
281 p = _unfinishedstatesbyname.get(opname, None) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
282 if not p: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
283 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
|
284 if childopname not in p._childopnames: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
285 raise error.ProgrammingError( |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
286 _(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
|
287 ) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
288 c = _unfinishedstatesbyname[childopname] |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
289 return p, c |
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 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
292 @contextlib.contextmanager |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
293 def delegating(repo, opname, childopname): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
294 """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
|
295 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
296 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
|
297 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
298 Usage: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
299 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
|
300 ... |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
301 with state.delegating(repo, 'foo', 'rebase'): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
302 _run_rebase(...) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
303 ... |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
304 """ |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
305 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
306 p, c = _getparentandchild(opname, childopname) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
307 if p._delegating: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
308 raise error.ProgrammingError( |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
309 _(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
|
310 ) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
311 p._delegating = True |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
312 try: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
313 yield |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
314 except error.ConflictResolutionRequired as e: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
315 # 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
|
316 if e.opname == childopname: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
317 raise error.ConflictResolutionRequired(opname) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
318 raise e |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
319 finally: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
320 p._delegating = False |
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 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
323 def ischildunfinished(repo, opname, childopname): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
324 """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
|
325 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
326 p, c = _getparentandchild(opname, childopname) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
327 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
|
328 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
329 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
330 def continuechild(ui, repo, opname, childopname): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
331 """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
|
332 |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
333 p, c = _getparentandchild(opname, childopname) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
334 if not ischildunfinished(repo, opname, childopname): |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
335 raise error.ProgrammingError( |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
336 _(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
|
337 % (childopname, opname) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
338 ) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
339 if not c.continuefunc: |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
340 raise error.ProgrammingError( |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
341 _(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
|
342 ) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
343 return c.continuefunc(ui, repo) |
5322e738be0f
state: support validated declaration of nested unfinished ops
Daniel Ploch <dploch@google.com>
parents:
43773
diff
changeset
|
344 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
345 |
42530
dc3fdd1b5af4
state: created new class statecheck to handle unfinishedstates
Taapas Agrawal <taapas2897@gmail.com>
parents:
42529
diff
changeset
|
346 addunfinished( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
347 b'update', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 fname=b'updatestate', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
349 clearable=True, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
350 cmdmsg=_(b'last update was interrupted'), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
351 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
|
352 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
|
353 ) |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
354 addunfinished( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
355 b'bisect', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
356 fname=b'bisect.state', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
357 allowcommit=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
358 reportonly=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
359 statushint=_( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
360 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
|
361 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
|
362 b'To abort: hg bisect --reset\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
363 ), |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
364 ) |
42531
5bddd2244814
state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents:
42530
diff
changeset
|
365 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43045
diff
changeset
|
366 |
42531
5bddd2244814
state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents:
42530
diff
changeset
|
367 def getrepostate(repo): |
5bddd2244814
state: moved cmdutil.STATES and utilities to state.py
Taapas Agrawal <taapas2897@gmail.com>
parents:
42530
diff
changeset
|
368 # experimental config: commands.status.skipstates |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
369 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
|
370 for state in _unfinishedstates: |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
371 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
|
372 continue |
42532
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
373 if state.isunfinished(repo): |
12243f15d53e
statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents:
42531
diff
changeset
|
374 return (state._opname, state.statusmsg()) |