4 # |
4 # |
5 # This software may be used and distributed according to the terms |
5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 import sys, struct, os |
8 import sys, struct, os |
9 from mercurial import lock |
9 from revlog import * |
10 from mercurial.transaction import * |
10 from demandload import * |
11 from mercurial.revlog import * |
11 demandload(globals(), "re lock urllib urllib2 transaction time socket") |
12 from difflib import SequenceMatcher |
12 demandload(globals(), "tempfile byterange difflib") |
13 |
13 |
14 class filelog(revlog): |
14 class filelog(revlog): |
15 def __init__(self, opener, path): |
15 def __init__(self, opener, path): |
16 revlog.__init__(self, opener, |
16 revlog.__init__(self, opener, |
17 os.path.join("data", path + ".i"), |
17 os.path.join("data", path + ".i"), |
30 def strip(annotation): |
30 def strip(annotation): |
31 return [e[1] for e in annotation] |
31 return [e[1] for e in annotation] |
32 |
32 |
33 def pair(parent, child): |
33 def pair(parent, child): |
34 new = [] |
34 new = [] |
35 sm = SequenceMatcher(None, strip(parent), strip(child)) |
35 sm = difflib.SequenceMatcher(None, strip(parent), strip(child)) |
36 for o, m, n, s, t in sm.get_opcodes(): |
36 for o, m, n, s, t in sm.get_opcodes(): |
37 if o == 'equal': |
37 if o == 'equal': |
38 new += parent[m:n] |
38 new += parent[m:n] |
39 else: |
39 else: |
40 new += child[s:t] |
40 new += child[s:t] |
136 def read(self, node): |
136 def read(self, node): |
137 return self.extract(self.revision(node)) |
137 return self.extract(self.revision(node)) |
138 |
138 |
139 def add(self, manifest, list, desc, transaction, p1=None, p2=None, |
139 def add(self, manifest, list, desc, transaction, p1=None, p2=None, |
140 user=None, date=None): |
140 user=None, date=None): |
141 import socket, time |
|
142 user = (user or |
141 user = (user or |
143 os.environ.get("HGUSER") or |
142 os.environ.get("HGUSER") or |
144 os.environ.get("EMAIL") or |
143 os.environ.get("EMAIL") or |
145 os.environ.get("LOGNAME", "unknown") + '@' + socket.getfqdn()) |
144 os.environ.get("LOGNAME", "unknown") + '@' + socket.getfqdn()) |
146 date = date or "%d %d" % (time.time(), time.timezone) |
145 date = date or "%d %d" % (time.time(), time.timezone) |
356 |
354 |
357 def transaction(self): |
355 def transaction(self): |
358 # save dirstate for undo |
356 # save dirstate for undo |
359 ds = self.opener("dirstate").read() |
357 ds = self.opener("dirstate").read() |
360 self.opener("undo.dirstate", "w").write(ds) |
358 self.opener("undo.dirstate", "w").write(ds) |
361 return transaction(self.opener, self.join("journal"), |
359 |
362 self.join("undo")) |
360 return transaction.transaction(self.opener, self.join("journal"), |
|
361 self.join("undo")) |
363 |
362 |
364 def recover(self): |
363 def recover(self): |
365 lock = self.lock() |
364 lock = self.lock() |
366 if os.path.exists(self.join("recover")): |
365 if os.path.exists(self.join("recover")): |
367 self.ui.status("attempting to rollback interrupted transaction\n") |
366 self.ui.status("attempting to rollback interrupted transaction\n") |
368 return rollback(self.opener, self.join("recover")) |
367 return transaction.rollback(self.opener, self.join("recover")) |
369 else: |
368 else: |
370 self.ui.warn("no interrupted transaction available\n") |
369 self.ui.warn("no interrupted transaction available\n") |
371 |
370 |
372 def undo(self): |
371 def undo(self): |
373 lock = self.lock() |
372 lock = self.lock() |
374 if os.path.exists(self.join("undo")): |
373 if os.path.exists(self.join("undo")): |
375 self.ui.status("attempting to rollback last transaction\n") |
374 self.ui.status("attempting to rollback last transaction\n") |
376 rollback(self.opener, self.join("undo")) |
375 transaction.rollback(self.opener, self.join("undo")) |
377 self.dirstate = None |
376 self.dirstate = None |
378 os.rename(self.join("undo.dirstate"), self.join("dirstate")) |
377 os.rename(self.join("undo.dirstate"), self.join("dirstate")) |
379 self.dirstate = dirstate(self.opener, self.ui, self.root) |
378 self.dirstate = dirstate(self.opener, self.ui, self.root) |
380 else: |
379 else: |
381 self.ui.warn("no undo information available\n") |
380 self.ui.warn("no undo information available\n") |
950 self.dirstate.update(remove, 'r') |
949 self.dirstate.update(remove, 'r') |
951 |
950 |
952 def merge3(self, fn, my, other): |
951 def merge3(self, fn, my, other): |
953 """perform a 3-way merge in the working directory""" |
952 """perform a 3-way merge in the working directory""" |
954 |
953 |
955 import tempfile |
|
956 |
|
957 def temp(prefix, node): |
954 def temp(prefix, node): |
958 pre = "%s~%s." % (os.path.basename(fn), prefix) |
955 pre = "%s~%s." % (os.path.basename(fn), prefix) |
959 (fd, name) = tempfile.mkstemp("", pre) |
956 (fd, name) = tempfile.mkstemp("", pre) |
960 f = os.fdopen(fd, "w") |
957 f = os.fdopen(fd, "w") |
961 f.write(fl.revision(node)) |
958 f.write(fl.revision(node)) |
1162 yield zd.decompress(d) |
1159 yield zd.decompress(d) |
1163 self.ui.note("%d bytes of data transfered\n" % bytes) |
1160 self.ui.note("%d bytes of data transfered\n" % bytes) |
1164 |
1161 |
1165 def repository(ui, path=None, create=0): |
1162 def repository(ui, path=None, create=0): |
1166 if path and path[:7] == "http://": |
1163 if path and path[:7] == "http://": |
1167 import urllib, urllib2 |
|
1168 return remoterepository(ui, path) |
1164 return remoterepository(ui, path) |
1169 if path and path[:5] == "hg://": |
1165 if path and path[:5] == "hg://": |
1170 import urllib, urllib2 |
|
1171 return remoterepository(ui, path.replace("hg://", "http://")) |
1166 return remoterepository(ui, path.replace("hg://", "http://")) |
1172 if path and path[:11] == "old-http://": |
1167 if path and path[:11] == "old-http://": |
1173 import urllib, urllib2 |
|
1174 from mercurial import byterange |
|
1175 return localrepository(ui, path.replace("old-http://", "http://")) |
1168 return localrepository(ui, path.replace("old-http://", "http://")) |
1176 else: |
1169 else: |
1177 return localrepository(ui, path, create) |
1170 return localrepository(ui, path, create) |
1178 |
1171 |
1179 class httprangereader: |
1172 class httprangereader: |