Show More
@@ -239,6 +239,92 b' def pushbookmark(repo, key, old, new):' | |||||
239 | finally: |
|
239 | finally: | |
240 | w.release() |
|
240 | w.release() | |
241 |
|
241 | |||
|
242 | def compare(repo, srcmarks, dstmarks, | |||
|
243 | srchex=None, dsthex=None, targets=None): | |||
|
244 | '''Compare bookmarks between srcmarks and dstmarks | |||
|
245 | ||||
|
246 | This returns tuple "(addsrc, adddst, advsrc, advdst, diverge, | |||
|
247 | differ, invalid)", each are list of bookmarks below: | |||
|
248 | ||||
|
249 | :addsrc: added on src side (removed on dst side, perhaps) | |||
|
250 | :adddst: added on dst side (removed on src side, perhaps) | |||
|
251 | :advsrc: advanced on src side | |||
|
252 | :advdst: advanced on dst side | |||
|
253 | :diverge: diverge | |||
|
254 | :differ: changed, but changeset referred on src is unknown on dst | |||
|
255 | :invalid: unknown on both side | |||
|
256 | ||||
|
257 | Each elements of lists in result tuple is tuple "(bookmark name, | |||
|
258 | changeset ID on source side, changeset ID on destination | |||
|
259 | side)". Each changeset IDs are 40 hexadecimal digit string or | |||
|
260 | None. | |||
|
261 | ||||
|
262 | Changeset IDs of tuples in "addsrc", "adddst", "differ" or | |||
|
263 | "invalid" list may be unknown for repo. | |||
|
264 | ||||
|
265 | This function expects that "srcmarks" and "dstmarks" return | |||
|
266 | changeset ID in 40 hexadecimal digit string for specified | |||
|
267 | bookmark. If not so (e.g. bmstore "repo._bookmarks" returning | |||
|
268 | binary value), "srchex" or "dsthex" should be specified to convert | |||
|
269 | into such form. | |||
|
270 | ||||
|
271 | If "targets" is specified, only bookmarks listed in it are | |||
|
272 | examined. | |||
|
273 | ''' | |||
|
274 | if not srchex: | |||
|
275 | srchex = lambda x: x | |||
|
276 | if not dsthex: | |||
|
277 | dsthex = lambda x: x | |||
|
278 | ||||
|
279 | if targets: | |||
|
280 | bset = set(targets) | |||
|
281 | else: | |||
|
282 | srcmarkset = set(srcmarks) | |||
|
283 | dstmarkset = set(dstmarks) | |||
|
284 | bset = srcmarkset ^ dstmarkset | |||
|
285 | for b in srcmarkset & dstmarkset: | |||
|
286 | if srchex(srcmarks[b]) != dsthex(dstmarks[b]): | |||
|
287 | bset.add(b) | |||
|
288 | ||||
|
289 | results = ([], [], [], [], [], [], []) | |||
|
290 | addsrc = results[0].append | |||
|
291 | adddst = results[1].append | |||
|
292 | advsrc = results[2].append | |||
|
293 | advdst = results[3].append | |||
|
294 | diverge = results[4].append | |||
|
295 | differ = results[5].append | |||
|
296 | invalid = results[6].append | |||
|
297 | ||||
|
298 | for b in sorted(bset): | |||
|
299 | if b not in srcmarks: | |||
|
300 | if b in dstmarks: | |||
|
301 | adddst((b, None, dsthex(dstmarks[b]))) | |||
|
302 | else: | |||
|
303 | invalid((b, None, None)) | |||
|
304 | elif b not in dstmarks: | |||
|
305 | addsrc((b, srchex(srcmarks[b]), None)) | |||
|
306 | else: | |||
|
307 | scid = srchex(srcmarks[b]) | |||
|
308 | dcid = dsthex(dstmarks[b]) | |||
|
309 | if scid in repo and dcid in repo: | |||
|
310 | sctx = repo[scid] | |||
|
311 | dctx = repo[dcid] | |||
|
312 | if sctx.rev() < dctx.rev(): | |||
|
313 | if validdest(repo, sctx, dctx): | |||
|
314 | advdst((b, scid, dcid)) | |||
|
315 | else: | |||
|
316 | diverge((b, scid, dcid)) | |||
|
317 | else: | |||
|
318 | if validdest(repo, dctx, sctx): | |||
|
319 | advsrc((b, scid, dcid)) | |||
|
320 | else: | |||
|
321 | diverge((b, scid, dcid)) | |||
|
322 | else: | |||
|
323 | # it is too expensive to examine in detail, in this case | |||
|
324 | differ((b, scid, dcid)) | |||
|
325 | ||||
|
326 | return results | |||
|
327 | ||||
242 | def updatefromremote(ui, repo, remotemarks, path): |
|
328 | def updatefromremote(ui, repo, remotemarks, path): | |
243 | ui.debug("checking for updated bookmarks\n") |
|
329 | ui.debug("checking for updated bookmarks\n") | |
244 | changed = False |
|
330 | changed = False |
General Comments 0
You need to be logged in to leave comments.
Login now