annotate mercurial/transaction.py @ 859:6390c377a9e6

Trap OSError when deleting env vars On the other OS, it seems that case insensitivity for environment vars can bite users when using some unknown combination of python 2.4.1 and win2kSP4+minsys (and probably other vversions of these softwares). The best way to avoid problems in those weird cases is to ignore OSError exception during env var deletion.
author Edouard Gomez <ed.gomez@free.fr>
date Tue, 09 Aug 2005 09:36:34 -0800
parents 0902ffece4b4
children 6d5a62a549fa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1 # transaction.py - simple journalling scheme for mercurial
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
3 # This transaction scheme is intended to gracefully handle program
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 # errors and interruptions. More serious failures like system crashes
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 # can be recovered with an fsck-like tool. As the whole repository is
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
6 # effectively log-structured, this should amount to simply truncating
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
7 # anything that isn't referenced in the changelog.
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
8 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
9 # Copyright 2005 Matt Mackall <mpm@selenic.com>
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
10 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
11 # This software may be used and distributed according to the terms
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
12 # of the GNU General Public License, incorporated herein by reference.
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
13
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14 import os
421
43b8da7420a9 [PATCH] rename under the other OS
mpm@selenic.com
parents: 162
diff changeset
15 import util
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
16
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
17 class transaction:
582
df8a5a0098d4 Remove all remaining print statements
mpm@selenic.com
parents: 573
diff changeset
18 def __init__(self, report, opener, journal, after = None):
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
19 self.journal = None
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
20
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
21 # abort here if the journal already exists
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
22 if os.path.exists(journal):
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
23 raise "journal already exists - run hg recover"
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
24
582
df8a5a0098d4 Remove all remaining print statements
mpm@selenic.com
parents: 573
diff changeset
25 self.report = report
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
26 self.opener = opener
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
27 self.after = after
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
28 self.entries = []
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
29 self.map = {}
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
30 self.journal = journal
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
31
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
32 self.file = open(self.journal, "w")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
33
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
34 def __del__(self):
558
0ceea19182a9 transaction: __del__ should do nothing if the journal already exists
mpm@selenic.com
parents: 515
diff changeset
35 if self.journal:
0ceea19182a9 transaction: __del__ should do nothing if the journal already exists
mpm@selenic.com
parents: 515
diff changeset
36 if self.entries: self.abort()
0ceea19182a9 transaction: __del__ should do nothing if the journal already exists
mpm@selenic.com
parents: 515
diff changeset
37 self.file.close()
0ceea19182a9 transaction: __del__ should do nothing if the journal already exists
mpm@selenic.com
parents: 515
diff changeset
38 try: os.unlink(self.journal)
0ceea19182a9 transaction: __del__ should do nothing if the journal already exists
mpm@selenic.com
parents: 515
diff changeset
39 except: pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
40
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
41 def add(self, file, offset):
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
42 if file in self.map: return
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
43 self.entries.append((file, offset))
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
44 self.map[file] = 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
45 # add enough data to the journal to do the truncate
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
46 self.file.write("%s\0%d\n" % (file, offset))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
47 self.file.flush()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
48
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
49 def close(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
50 self.file.close()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
51 self.entries = []
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
52 if self.after:
785
46a8dd3145cc Fix undo after aborted commit bug
mpm@selenic.com
parents: 582
diff changeset
53 self.after()
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
54 else:
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
55 os.unlink(self.journal)
573
fbfbd4e506c3 transaction: nullify journal after close()
mpm@selenic.com
parents: 558
diff changeset
56 self.journal = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
57
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
58 def abort(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
59 if not self.entries: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
60
582
df8a5a0098d4 Remove all remaining print statements
mpm@selenic.com
parents: 573
diff changeset
61 self.report("transaction abort!\n")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
62
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
63 for f, o in self.entries:
108
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
64 try:
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
65 self.opener(f, "a").truncate(o)
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
66 except:
582
df8a5a0098d4 Remove all remaining print statements
mpm@selenic.com
parents: 573
diff changeset
67 self.report("failed to truncate %s\n" % f)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
68
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
69 self.entries = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
70
582
df8a5a0098d4 Remove all remaining print statements
mpm@selenic.com
parents: 573
diff changeset
71 self.report("rollback completed\n")
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 429
diff changeset
72
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
73 def rollback(opener, file):
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
74 for l in open(file).readlines():
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
75 f, o = l.split('\0')
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
76 opener(f, "a").truncate(int(o))
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
77 os.unlink(file)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
78