Show More
@@ -239,6 +239,92 b' def pushbookmark(repo, key, old, new):' | |||
|
239 | 239 | finally: |
|
240 | 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 | 328 | def updatefromremote(ui, repo, remotemarks, path): |
|
243 | 329 | ui.debug("checking for updated bookmarks\n") |
|
244 | 330 | changed = False |
General Comments 0
You need to be logged in to leave comments.
Login now