mercurial/transaction.py
author mpm@selenic.com
Tue, 21 Jun 2005 19:31:13 -0800
changeset 419 28511fc21073
parent 162 5dcbe4d9a30c
child 421 43b8da7420a9
child 429 688d03d6997a
permissions -rw-r--r--
[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-----
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    15
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    16
class transaction:
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    17
    def __init__(self, opener, journal, after = None):
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    18
        self.journal = None
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    19
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    20
        # abort here if the journal already exists
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    21
        if os.path.exists(journal):
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    22
            raise "journal already exists - run hg recover"
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    23
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    24
        self.opener = opener
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    25
        self.after = after
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    26
        self.entries = []
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
    27
        self.map = {}
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    28
        self.journal = journal
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    29
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    30
        self.file = open(self.journal, "w")
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
    def __del__(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    33
        if self.entries: self.abort()
13
eb87b7dc4236 Fix empty transaction destruction
mpm@selenic.com
parents: 12
diff changeset
    34
        try: os.unlink(self.journal)
eb87b7dc4236 Fix empty transaction destruction
mpm@selenic.com
parents: 12
diff changeset
    35
        except: pass
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    36
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    37
    def add(self, file, offset):
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
    38
        if file in self.map: return
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    39
        self.entries.append((file, offset))
42
91f1fa847158 Fix multiple changes to file per transaction
mpm@selenic.com
parents: 13
diff changeset
    40
        self.map[file] = 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    41
        # 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
    42
        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
    43
        self.file.flush()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    44
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    45
    def close(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    46
        self.file.close()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    47
        self.entries = []
95
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    48
        if self.after:
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    49
            os.rename(self.journal, self.after)
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    50
        else:
589f507bb259 Beginnings of transaction undo support
mpm@selenic.com
parents: 43
diff changeset
    51
            os.unlink(self.journal)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    52
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    53
    def abort(self):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    54
        if not self.entries: return
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    55
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    56
        print "transaction abort!"
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
        for f, o in self.entries:
108
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
    59
            try:
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
    60
                self.opener(f, "a").truncate(o)
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
    61
            except:
8d55c2d72c7c Warn if we fail to truncate something
mpm@selenic.com
parents: 95
diff changeset
    62
                print "failed to truncate", f
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    63
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    64
        self.entries = []
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    65
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    66
        print "rollback completed"
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    67
        
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    68
def rollback(opener, file):
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    69
    for l in open(file).readlines():
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    70
        f, o = l.split('\0')
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    71
        opener(f, "a").truncate(int(o))
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 108
diff changeset
    72
    os.unlink(file)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    73