Mercurial > hg > pyhgsh
view mercurial/transaction.py @ 419:28511fc21073
[PATCH] file seperator handling for the other 'OS'
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[PATCH] file seperator handling for the other 'OS'
From: K Thananchayan <thananck@yahoo.com>
The following patch maintains repo root relative source file names in
canonical form (with '/' as file seperator).
Mercurial calls os.path.join, os.path.normpath, os.path.walk that use
platform's file seperator. This patch does not change seperator in
these circumstances (except when the result refer to source files).
manifest hash: 2fbb4cb0d3d0bc4f4de5c7c8803fb738072ec6c5
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCuNuBywK+sNU5EO8RAhAZAKCV8cz11+rdof9n1tHb0uDScF34GgCeITNi
4aVikToPXqXyReN9kFP5pnY=
=xcV5
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Tue, 21 Jun 2005 19:31:13 -0800 |
parents | 5dcbe4d9a30c |
children | 43b8da7420a9 688d03d6997a |
line wrap: on
line source
# transaction.py - simple journalling scheme for mercurial # # This transaction scheme is intended to gracefully handle program # errors and interruptions. More serious failures like system crashes # can be recovered with an fsck-like tool. As the whole repository is # effectively log-structured, this should amount to simply truncating # anything that isn't referenced in the changelog. # # Copyright 2005 Matt Mackall <mpm@selenic.com> # # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. import os class transaction: def __init__(self, opener, journal, after = None): self.journal = None # abort here if the journal already exists if os.path.exists(journal): raise "journal already exists - run hg recover" self.opener = opener self.after = after self.entries = [] self.map = {} self.journal = journal self.file = open(self.journal, "w") def __del__(self): if self.entries: self.abort() try: os.unlink(self.journal) except: pass def add(self, file, offset): if file in self.map: return self.entries.append((file, offset)) self.map[file] = 1 # add enough data to the journal to do the truncate self.file.write("%s\0%d\n" % (file, offset)) self.file.flush() def close(self): self.file.close() self.entries = [] if self.after: os.rename(self.journal, self.after) else: os.unlink(self.journal) def abort(self): if not self.entries: return print "transaction abort!" for f, o in self.entries: try: self.opener(f, "a").truncate(o) except: print "failed to truncate", f self.entries = [] print "rollback completed" def rollback(opener, file): for l in open(file).readlines(): f, o = l.split('\0') opener(f, "a").truncate(int(o)) os.unlink(file)