comparison mercurial/destutil.py @ 28137:b54c0246295b

destutil: add an 'action' layer to the destmerge message dictionary We'll introduce messages for 'rebase' soon, so we introduce a way to select a message based on the action being performed.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Mon, 08 Feb 2016 17:53:44 +0100
parents 1fc7b5363871
children 5ad2017454ee
comparison
equal deleted inserted replaced
28136:5853878bbc2a 28137:b54c0246295b
135 return rev, movemark, activemark 135 return rev, movemark, activemark
136 136
137 msgdestmerge = { 137 msgdestmerge = {
138 # too many matching divergent bookmark 138 # too many matching divergent bookmark
139 'toomanybookmarks': 139 'toomanybookmarks':
140 (_("multiple matching bookmarks to merge -" 140 {'merge':
141 " please merge with an explicit rev or bookmark"), 141 (_("multiple matching bookmarks to merge -"
142 _("run 'hg heads' to see all heads")), 142 " please merge with an explicit rev or bookmark"),
143 _("run 'hg heads' to see all heads")),
144 },
143 # no other matching divergent bookmark 145 # no other matching divergent bookmark
144 'nootherbookmarks': 146 'nootherbookmarks':
145 (_("no matching bookmark to merge - " 147 {'merge':
146 "please merge with an explicit rev or bookmark"), 148 (_("no matching bookmark to merge - "
147 _("run 'hg heads' to see all heads")), 149 "please merge with an explicit rev or bookmark"),
150 _("run 'hg heads' to see all heads")),
151 },
148 # branch have too many unbookmarked heads, no obvious destination 152 # branch have too many unbookmarked heads, no obvious destination
149 'toomanyheads': 153 'toomanyheads':
150 (_("branch '%s' has %d heads - please merge with an explicit rev"), 154 {'merge':
151 _("run 'hg heads .' to see heads")), 155 (_("branch '%s' has %d heads - please merge with an explicit rev"),
156 _("run 'hg heads .' to see heads")),
157 },
152 # branch have no other unbookmarked heads 158 # branch have no other unbookmarked heads
153 'bookmarkedheads': 159 'bookmarkedheads':
154 (_("heads are bookmarked - please merge with an explicit rev"), 160 {'merge':
155 _("run 'hg heads' to see all heads")), 161 (_("heads are bookmarked - please merge with an explicit rev"),
162 _("run 'hg heads' to see all heads")),
163 },
156 # branch have just a single heads, but there is other branches 164 # branch have just a single heads, but there is other branches
157 'nootherbranchheads': 165 'nootherbranchheads':
158 (_("branch '%s' has one head - please merge with an explicit rev"), 166 {'merge':
159 _("run 'hg heads' to see all heads")), 167 (_("branch '%s' has one head - please merge with an explicit rev"),
168 _("run 'hg heads' to see all heads")),
169 },
160 # repository have a single head 170 # repository have a single head
161 'nootherheads': 171 'nootherheads':
162 (_('nothing to merge'), 172 {'merge':
173 (_('nothing to merge'),
163 None), 174 None),
175 },
164 # repository have a single head and we are not on it 176 # repository have a single head and we are not on it
165 'nootherheadsbehind': 177 'nootherheadsbehind':
166 (_('nothing to merge'), 178 {'merge':
167 _("use 'hg update' instead")), 179 (_('nothing to merge'),
180 _("use 'hg update' instead")),
181 },
168 # We are not on a head 182 # We are not on a head
169 'notatheads': 183 'notatheads':
170 (_('working directory not at a head revision'), 184 {'merge':
171 _("use 'hg update' or merge with an explicit revision")) 185 (_('working directory not at a head revision'),
172 } 186 _("use 'hg update' or merge with an explicit revision"))
173 187 },
174 def _destmergebook(repo): 188 }
189
190 def _destmergebook(repo, action='merge'):
175 """find merge destination in the active bookmark case""" 191 """find merge destination in the active bookmark case"""
176 node = None 192 node = None
177 bmheads = repo.bookmarkheads(repo._activebookmark) 193 bmheads = repo.bookmarkheads(repo._activebookmark)
178 curhead = repo[repo._activebookmark].node() 194 curhead = repo[repo._activebookmark].node()
179 if len(bmheads) == 2: 195 if len(bmheads) == 2:
180 if curhead == bmheads[0]: 196 if curhead == bmheads[0]:
181 node = bmheads[1] 197 node = bmheads[1]
182 else: 198 else:
183 node = bmheads[0] 199 node = bmheads[0]
184 elif len(bmheads) > 2: 200 elif len(bmheads) > 2:
185 msg, hint = msgdestmerge['toomanybookmarks'] 201 msg, hint = msgdestmerge['toomanybookmarks'][action]
186 raise error.Abort(msg, hint=hint) 202 raise error.Abort(msg, hint=hint)
187 elif len(bmheads) <= 1: 203 elif len(bmheads) <= 1:
188 msg, hint = msgdestmerge['nootherbookmarks'] 204 msg, hint = msgdestmerge['nootherbookmarks'][action]
189 raise error.Abort(msg, hint=hint) 205 raise error.Abort(msg, hint=hint)
190 assert node is not None 206 assert node is not None
191 return node 207 return node
192 208
193 def _destmergebranch(repo): 209 def _destmergebranch(repo, action='merge'):
194 """find merge destination based on branch heads""" 210 """find merge destination based on branch heads"""
195 node = None 211 node = None
196 parent = repo.dirstate.p1() 212 parent = repo.dirstate.p1()
197 branch = repo.dirstate.branch() 213 branch = repo.dirstate.branch()
198 bheads = repo.branchheads(branch) 214 bheads = repo.branchheads(branch)
201 if parent not in bheads: 217 if parent not in bheads:
202 # Case A: working copy if not on a head. 218 # Case A: working copy if not on a head.
203 # 219 #
204 # This is probably a user mistake We bailout pointing at 'hg update' 220 # This is probably a user mistake We bailout pointing at 'hg update'
205 if len(repo.heads()) <= 1: 221 if len(repo.heads()) <= 1:
206 msg, hint = msgdestmerge['nootherheadsbehind'] 222 msg, hint = msgdestmerge['nootherheadsbehind'][action]
207 else: 223 else:
208 msg, hint = msgdestmerge['notatheads'] 224 msg, hint = msgdestmerge['notatheads'][action]
209 raise error.Abort(msg, hint=hint) 225 raise error.Abort(msg, hint=hint)
210 elif len(nbhs) > 2: 226 elif len(nbhs) > 2:
211 # Case B: There is more than 2 anonymous heads 227 # Case B: There is more than 2 anonymous heads
212 # 228 #
213 # This means that there will be more than 1 candidate. This is 229 # This means that there will be more than 1 candidate. This is
214 # ambiguous. We abort asking the user to pick as explicit destination 230 # ambiguous. We abort asking the user to pick as explicit destination
215 # instead. 231 # instead.
216 msg, hint = msgdestmerge['toomanyheads'] 232 msg, hint = msgdestmerge['toomanyheads'][action]
217 msg %= (branch, len(bheads)) 233 msg %= (branch, len(bheads))
218 raise error.Abort(msg, hint=hint) 234 raise error.Abort(msg, hint=hint)
219 elif len(nbhs) <= 1: 235 elif len(nbhs) <= 1:
220 # Case B: There is no other anonymous head that the one we are one 236 # Case B: There is no other anonymous head that the one we are one
221 # 237 #
222 # This means that there is no natural candidate to merge with. 238 # This means that there is no natural candidate to merge with.
223 # We abort, with various messages for various cases. 239 # We abort, with various messages for various cases.
224 if len(bheads) > 1: 240 if len(bheads) > 1:
225 msg, hint = msgdestmerge['bookmarkedheads'] 241 msg, hint = msgdestmerge['bookmarkedheads'][action]
226 elif len(repo.heads()) > 1: 242 elif len(repo.heads()) > 1:
227 msg, hint = msgdestmerge['nootherbranchheads'] 243 msg, hint = msgdestmerge['nootherbranchheads'][action]
228 msg %= branch 244 msg %= branch
229 else: 245 else:
230 msg, hint = msgdestmerge['nootherheads'] 246 msg, hint = msgdestmerge['nootherheads'][action]
231 raise error.Abort(msg, hint=hint) 247 raise error.Abort(msg, hint=hint)
232 elif parent == nbhs[0]: 248 elif parent == nbhs[0]:
233 node = nbhs[-1] 249 node = nbhs[-1]
234 else: 250 else:
235 node = nbhs[0] 251 node = nbhs[0]
236 assert node is not None 252 assert node is not None
237 return node 253 return node
238 254
239 def destmerge(repo): 255 def destmerge(repo, action='merge'):
256 """return the default destination for a merge
257
258 (or raise exception about why it can't pick one)
259
260 :action: the action being performed, controls emitted error message
261 """
240 if repo._activebookmark: 262 if repo._activebookmark:
241 node = _destmergebook(repo) 263 node = _destmergebook(repo, action=action)
242 else: 264 else:
243 node = _destmergebranch(repo) 265 node = _destmergebranch(repo, action=action)
244 return repo[node].rev() 266 return repo[node].rev()
245 267
246 histeditdefaultrevset = 'reverse(only(.) and not public() and not ::merge())' 268 histeditdefaultrevset = 'reverse(only(.) and not public() and not ::merge())'
247 269
248 def desthistedit(ui, repo): 270 def desthistedit(ui, repo):