32 def __init__(self, repo, name): |
33 def __init__(self, repo, name): |
33 self._repo = repo |
34 self._repo = repo |
34 self._active = False |
35 self._active = False |
35 self._closed = False |
36 self._closed = False |
36 self._backupname = 'dirstate.backup.%s.%d' % (name, id(self)) |
37 self._backupname = 'dirstate.backup.%s.%d' % (name, id(self)) |
37 self._narrowspecbackupname = ('narrowspec.backup.%s.%d' % |
38 self._narrowspecbackupname = 'narrowspec.backup.%s.%d' % ( |
38 (name, id(self))) |
39 name, |
|
40 id(self), |
|
41 ) |
39 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname) |
42 repo.dirstate.savebackup(repo.currenttransaction(), self._backupname) |
40 narrowspec.savewcbackup(repo, self._narrowspecbackupname) |
43 narrowspec.savewcbackup(repo, self._narrowspecbackupname) |
41 self._active = True |
44 self._active = True |
42 |
45 |
43 def __del__(self): |
46 def __del__(self): |
44 if self._active: # still active |
47 if self._active: # still active |
45 # this may occur, even if this class is used correctly: |
48 # this may occur, even if this class is used correctly: |
46 # for example, releasing other resources like transaction |
49 # for example, releasing other resources like transaction |
47 # may raise exception before ``dirstateguard.release`` in |
50 # may raise exception before ``dirstateguard.release`` in |
48 # ``release(tr, ....)``. |
51 # ``release(tr, ....)``. |
49 self._abort() |
52 self._abort() |
50 |
53 |
51 def close(self): |
54 def close(self): |
52 if not self._active: # already inactivated |
55 if not self._active: # already inactivated |
53 msg = (_("can't close already inactivated backup: %s") |
56 msg = ( |
54 % self._backupname) |
57 _("can't close already inactivated backup: %s") |
|
58 % self._backupname |
|
59 ) |
55 raise error.Abort(msg) |
60 raise error.Abort(msg) |
56 |
61 |
57 self._repo.dirstate.clearbackup(self._repo.currenttransaction(), |
62 self._repo.dirstate.clearbackup( |
58 self._backupname) |
63 self._repo.currenttransaction(), self._backupname |
|
64 ) |
59 narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) |
65 narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) |
60 self._active = False |
66 self._active = False |
61 self._closed = True |
67 self._closed = True |
62 |
68 |
63 def _abort(self): |
69 def _abort(self): |
64 narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) |
70 narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) |
65 self._repo.dirstate.restorebackup(self._repo.currenttransaction(), |
71 self._repo.dirstate.restorebackup( |
66 self._backupname) |
72 self._repo.currenttransaction(), self._backupname |
|
73 ) |
67 self._active = False |
74 self._active = False |
68 |
75 |
69 def release(self): |
76 def release(self): |
70 if not self._closed: |
77 if not self._closed: |
71 if not self._active: # already inactivated |
78 if not self._active: # already inactivated |
72 msg = (_("can't release already inactivated backup: %s") |
79 msg = ( |
73 % self._backupname) |
80 _("can't release already inactivated backup: %s") |
|
81 % self._backupname |
|
82 ) |
74 raise error.Abort(msg) |
83 raise error.Abort(msg) |
75 self._abort() |
84 self._abort() |