mercurial/hg.py
changeset 262 3db700146536
parent 256 649ed23e4661
child 263 e8eb427c6d71
equal deleted inserted replaced
261:3dae0296551d 262:3db700146536
     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)
   308 
   307 
   309         if not self.remote:
   308         if not self.remote:
   310             self.dirstate = dirstate(self.opener, ui, self.root)
   309             self.dirstate = dirstate(self.opener, ui, self.root)
   311 
   310 
   312     def ignore(self, f):
   311     def ignore(self, f):
   313         import re
       
   314         if self.ignorelist is None:
   312         if self.ignorelist is None:
   315             self.ignorelist = []
   313             self.ignorelist = []
   316             try:
   314             try:
   317                 l = open(os.path.join(self.root, ".hgignore"))
   315                 l = open(os.path.join(self.root, ".hgignore"))
   318                 for pat in l:
   316                 for pat in l:
   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: