##// END OF EJS Templates
Teach import to understand git diff extensions....
Teach import to understand git diff extensions. Vanilla patch chokes on git patches that include files that are copied or renamed, then modified. So this code detects that case and rewrites the patch if necessary.

File last commit:

r2859:345bac2b default
r2860:b3d1145e default
Show More
transaction.py
107 lines | 3.0 KiB | text/x-python | PythonLexer
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 # 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.
Vadim Gelfer
use demandload more.
r2470 from demandload import demandload
Benoit Boissinot
i18n first part: make '_' available for files who need it
r1400 from i18n import gettext as _
Vadim Gelfer
use demandload more.
r2470 demandload(globals(), 'os')
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class transaction(object):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def __init__(self, report, opener, journal, after=None):
mpm@selenic.com
Implement recover and undo commands...
r162 self.journal = None
# abort here if the journal already exists
if os.path.exists(journal):
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise AssertionError(_("journal already exists - run hg recover"))
mpm@selenic.com
Implement recover and undo commands...
r162
mason@suse.com
Automatic nesting into running transactions in the same repository....
r1806 self.count = 1
mpm@selenic.com
Remove all remaining print statements...
r582 self.report = report
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 self.opener = opener
mpm@selenic.com
Beginnings of transaction undo support
r95 self.after = after
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 self.entries = []
mpm@selenic.com
Fix multiple changes to file per transaction
r42 self.map = {}
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 self.journal = journal
self.file = open(self.journal, "w")
def __del__(self):
mpm@selenic.com
transaction: __del__ should do nothing if the journal already exists...
r558 if self.journal:
if self.entries: self.abort()
self.file.close()
try: os.unlink(self.journal)
except: pass
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Chris Mason
...
r2084 def add(self, file, offset, data=None):
mpm@selenic.com
Fix multiple changes to file per transaction
r42 if file in self.map: return
Chris Mason
...
r2084 self.entries.append((file, offset, data))
self.map[file] = len(self.entries) - 1
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 # add enough data to the journal to do the truncate
self.file.write("%s\0%d\n" % (file, offset))
self.file.flush()
Chris Mason
...
r2084 def find(self, file):
if file in self.map:
return self.entries[self.map[file]]
return None
def replace(self, file, offset, data=None):
if file not in self.map:
raise KeyError(file)
index = self.map[file]
self.entries[index] = (file, offset, data)
self.file.write("%s\0%d\n" % (file, offset))
self.file.flush()
mason@suse.com
Automatic nesting into running transactions in the same repository....
r1806 def nest(self):
self.count += 1
return self
def running(self):
return self.count > 0
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 def close(self):
mason@suse.com
Automatic nesting into running transactions in the same repository....
r1806 self.count -= 1
if self.count != 0:
return
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 self.file.close()
self.entries = []
mpm@selenic.com
Beginnings of transaction undo support
r95 if self.after:
mpm@selenic.com
Fix undo after aborted commit bug...
r785 self.after()
mpm@selenic.com
Beginnings of transaction undo support
r95 else:
os.unlink(self.journal)
mpm@selenic.com
transaction: nullify journal after close()...
r573 self.journal = None
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
def abort(self):
if not self.entries: return
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.report(_("transaction abort!\n"))
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Chris Mason
...
r2084 for f, o, ignore in self.entries:
mpm@selenic.com
Warn if we fail to truncate something
r108 try:
self.opener(f, "a").truncate(o)
except:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.report(_("failed to truncate %s\n") % f)
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
self.entries = []
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.report(_("rollback completed\n"))
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Implement recover and undo commands...
r162 def rollback(opener, file):
Chris Mason
...
r2084 files = {}
mpm@selenic.com
Implement recover and undo commands...
r162 for l in open(file).readlines():
f, o = l.split('\0')
Chris Mason
...
r2084 files[f] = o
for f in files:
o = files[f]
mpm@selenic.com
Implement recover and undo commands...
r162 opener(f, "a").truncate(int(o))
os.unlink(file)
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0