11 from i18n import gettext as _ |
11 from i18n import gettext as _ |
12 from demandload import * |
12 from demandload import * |
13 demandload(globals(), "re lock transaction tempfile stat mdiff errno") |
13 demandload(globals(), "re lock transaction tempfile stat mdiff errno") |
14 |
14 |
15 class localrepository(object): |
15 class localrepository(object): |
|
16 def __del__(self): |
|
17 self.transhandle = None |
16 def __init__(self, ui, path=None, create=0): |
18 def __init__(self, ui, path=None, create=0): |
17 if not path: |
19 if not path: |
18 p = os.getcwd() |
20 p = os.getcwd() |
19 while not os.path.isdir(os.path.join(p, ".hg")): |
21 while not os.path.isdir(os.path.join(p, ".hg")): |
20 oldp = p |
22 oldp = p |
35 self.changelog = changelog.changelog(self.opener) |
37 self.changelog = changelog.changelog(self.opener) |
36 self.tagscache = None |
38 self.tagscache = None |
37 self.nodetagscache = None |
39 self.nodetagscache = None |
38 self.encodepats = None |
40 self.encodepats = None |
39 self.decodepats = None |
41 self.decodepats = None |
|
42 self.transhandle = None |
40 |
43 |
41 if create: |
44 if create: |
42 os.mkdir(self.path) |
45 os.mkdir(self.path) |
43 os.mkdir(self.join("data")) |
46 os.mkdir(self.join("data")) |
44 |
47 |
213 if fd: |
216 if fd: |
214 return fd.write(data) |
217 return fd.write(data) |
215 return self.wopener(filename, 'w').write(data) |
218 return self.wopener(filename, 'w').write(data) |
216 |
219 |
217 def transaction(self): |
220 def transaction(self): |
|
221 tr = self.transhandle |
|
222 if tr != None and tr.running(): |
|
223 return tr.nest() |
|
224 |
218 # save dirstate for undo |
225 # save dirstate for undo |
219 try: |
226 try: |
220 ds = self.opener("dirstate").read() |
227 ds = self.opener("dirstate").read() |
221 except IOError: |
228 except IOError: |
222 ds = "" |
229 ds = "" |
223 self.opener("journal.dirstate", "w").write(ds) |
230 self.opener("journal.dirstate", "w").write(ds) |
224 |
231 |
225 def after(): |
232 tr = transaction.transaction(self.ui.warn, self.opener, |
226 util.rename(self.join("journal"), self.join("undo")) |
233 self.join("journal"), |
227 util.rename(self.join("journal.dirstate"), |
234 aftertrans(self.path)) |
228 self.join("undo.dirstate")) |
235 self.transhandle = tr |
229 |
236 return tr |
230 return transaction.transaction(self.ui.warn, self.opener, |
|
231 self.join("journal"), after) |
|
232 |
237 |
233 def recover(self): |
238 def recover(self): |
234 l = self.lock() |
239 l = self.lock() |
235 if os.path.exists(self.join("journal")): |
240 if os.path.exists(self.join("journal")): |
236 self.ui.status(_("rolling back interrupted transaction\n")) |
241 self.ui.status(_("rolling back interrupted transaction\n")) |
1877 (files, changesets, revisions)) |
1882 (files, changesets, revisions)) |
1878 |
1883 |
1879 if errors[0]: |
1884 if errors[0]: |
1880 self.ui.warn(_("%d integrity errors encountered!\n") % errors[0]) |
1885 self.ui.warn(_("%d integrity errors encountered!\n") % errors[0]) |
1881 return 1 |
1886 return 1 |
|
1887 |
|
1888 # used to avoid circular references so destructors work |
|
1889 def aftertrans(base): |
|
1890 p = base |
|
1891 def a(): |
|
1892 util.rename(os.path.join(p, "journal"), os.path.join(p, "undo")) |
|
1893 util.rename(os.path.join(p, "journal.dirstate"), |
|
1894 os.path.join(p, "undo.dirstate")) |
|
1895 return a |
|
1896 |