22 util, |
22 util, |
23 ) |
23 ) |
24 from .utils import stringutil |
24 from .utils import stringutil |
25 |
25 |
26 version = 2 |
26 version = 2 |
27 |
|
28 # These are the file generators that should only be executed after the |
|
29 # finalizers are done, since they rely on the output of the finalizers (like |
|
30 # the changelog having been written). |
|
31 postfinalizegenerators = { |
|
32 b'bookmarks', |
|
33 b'dirstate-0-key-pre', |
|
34 b'dirstate-1-main', |
|
35 b'dirstate-2-key-post', |
|
36 } |
|
37 |
27 |
38 GEN_GROUP_ALL = b'all' |
28 GEN_GROUP_ALL = b'all' |
39 GEN_GROUP_PRE_FINALIZE = b'prefinalize' |
29 GEN_GROUP_PRE_FINALIZE = b'prefinalize' |
40 GEN_GROUP_POST_FINALIZE = b'postfinalize' |
30 GEN_GROUP_POST_FINALIZE = b'postfinalize' |
41 |
31 |
337 """ |
327 """ |
338 self._addbackupentry((location, b'', tmpfile, False)) |
328 self._addbackupentry((location, b'', tmpfile, False)) |
339 |
329 |
340 @active |
330 @active |
341 def addfilegenerator( |
331 def addfilegenerator( |
342 self, genid, filenames, genfunc, order=0, location=b'' |
332 self, |
|
333 genid, |
|
334 filenames, |
|
335 genfunc, |
|
336 order=0, |
|
337 location=b'', |
|
338 post_finalize=False, |
343 ): |
339 ): |
344 """add a function to generates some files at transaction commit |
340 """add a function to generates some files at transaction commit |
345 |
341 |
346 The `genfunc` argument is a function capable of generating proper |
342 The `genfunc` argument is a function capable of generating proper |
347 content of each entry in the `filename` tuple. |
343 content of each entry in the `filename` tuple. |
360 generator will be executed. |
356 generator will be executed. |
361 |
357 |
362 The `location` arguments may be used to indicate the files are located |
358 The `location` arguments may be used to indicate the files are located |
363 outside of the the standard directory for transaction. It should match |
359 outside of the the standard directory for transaction. It should match |
364 one of the key of the `transaction.vfsmap` dictionary. |
360 one of the key of the `transaction.vfsmap` dictionary. |
|
361 |
|
362 The `post_finalize` argument can be set to `True` for file generation |
|
363 that must be run after the transaction has been finalized. |
365 """ |
364 """ |
366 # For now, we are unable to do proper backup and restore of custom vfs |
365 # For now, we are unable to do proper backup and restore of custom vfs |
367 # but for bookmarks that are handled outside this mechanism. |
366 # but for bookmarks that are handled outside this mechanism. |
368 self._filegenerators[genid] = (order, filenames, genfunc, location) |
367 entry = (order, filenames, genfunc, location, post_finalize) |
|
368 self._filegenerators[genid] = entry |
369 |
369 |
370 @active |
370 @active |
371 def removefilegenerator(self, genid): |
371 def removefilegenerator(self, genid): |
372 """reverse of addfilegenerator, remove a file generator function""" |
372 """reverse of addfilegenerator, remove a file generator function""" |
373 if genid in self._filegenerators: |
373 if genid in self._filegenerators: |
383 skip_pre = group == GEN_GROUP_POST_FINALIZE |
383 skip_pre = group == GEN_GROUP_POST_FINALIZE |
384 skip_post = group == GEN_GROUP_PRE_FINALIZE |
384 skip_post = group == GEN_GROUP_PRE_FINALIZE |
385 |
385 |
386 for id, entry in sorted(pycompat.iteritems(self._filegenerators)): |
386 for id, entry in sorted(pycompat.iteritems(self._filegenerators)): |
387 any = True |
387 any = True |
388 order, filenames, genfunc, location = entry |
388 order, filenames, genfunc, location, post_finalize = entry |
389 |
389 |
390 # for generation at closing, check if it's before or after finalize |
390 # for generation at closing, check if it's before or after finalize |
391 is_post = id in postfinalizegenerators |
391 if skip_post and post_finalize: |
392 if skip_post and is_post: |
|
393 continue |
392 continue |
394 elif skip_pre and not is_post: |
393 elif skip_pre and not post_finalize: |
395 continue |
394 continue |
396 |
395 |
397 vfs = self._vfsmap[location] |
396 vfs = self._vfsmap[location] |
398 files = [] |
397 files = [] |
399 try: |
398 try: |