mercurial/hg.py
changeset 244 43105253cf5e
parent 241 afe895fcc0d0
child 247 863b508c5b36
equal deleted inserted replaced
243:9a9ea2d1d3c4 244:43105253cf5e
   148         l = [hex(manifest), user, date] + list + ["", desc]
   148         l = [hex(manifest), user, date] + list + ["", desc]
   149         text = "\n".join(l)
   149         text = "\n".join(l)
   150         return self.addrevision(text, transaction, self.count(), p1, p2)
   150         return self.addrevision(text, transaction, self.count(), p1, p2)
   151 
   151 
   152 class dirstate:
   152 class dirstate:
   153     def __init__(self, opener, ui):
   153     def __init__(self, opener, ui, root):
   154         self.opener = opener
   154         self.opener = opener
       
   155         self.root = root
   155         self.dirty = 0
   156         self.dirty = 0
   156         self.ui = ui
   157         self.ui = ui
   157         self.map = None
   158         self.map = None
   158         self.pl = None
   159         self.pl = None
   159 
   160 
   221         for f in files:
   222         for f in files:
   222             if state == "r":
   223             if state == "r":
   223                 self.map[f] = ('r', 0, 0, 0)
   224                 self.map[f] = ('r', 0, 0, 0)
   224             else:
   225             else:
   225                 try:
   226                 try:
   226                     s = os.stat(f)
   227                     s = os.stat(os.path.join(self.root, f))
   227                     self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime)
   228                     self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime)
   228                 except OSError:
   229                 except OSError:
   229                     if state != "i": raise
   230                     if state != "i": raise
   230                     self.map[f] = ('r', 0, 0, 0)
   231                     self.map[f] = ('r', 0, 0, 0)
   231 
   232 
   309         self.changelog = changelog(self.opener)
   310         self.changelog = changelog(self.opener)
   310         self.ignorelist = None
   311         self.ignorelist = None
   311         self.tags = None
   312         self.tags = None
   312 
   313 
   313         if not self.remote:
   314         if not self.remote:
   314             self.dirstate = dirstate(self.opener, ui)
   315             self.dirstate = dirstate(self.opener, ui, self.root)
   315 
   316 
   316     def ignore(self, f):
   317     def ignore(self, f):
   317         if self.ignorelist is None:
   318         if self.ignorelist is None:
   318             self.ignorelist = []
   319             self.ignorelist = []
   319             try:
   320             try:
   341         except KeyError:
   342         except KeyError:
   342             return self.changelog.lookup(key)
   343             return self.changelog.lookup(key)
   343 
   344 
   344     def join(self, f):
   345     def join(self, f):
   345         return os.path.join(self.path, f)
   346         return os.path.join(self.path, f)
       
   347 
       
   348     def wjoin(self, f):
       
   349         return os.path.join(self.root, f)
   346 
   350 
   347     def file(self, f):
   351     def file(self, f):
   348         if f[0] == '/': f = f[1:]
   352         if f[0] == '/': f = f[1:]
   349         return filelog(self.opener, f)
   353         return filelog(self.opener, f)
   350 
   354 
   418         commit = []
   422         commit = []
   419         remove = []
   423         remove = []
   420         if files:
   424         if files:
   421             for f in files:
   425             for f in files:
   422                 s = self.dirstate.state(f)
   426                 s = self.dirstate.state(f)
   423                 if s in 'cai':
   427                 if s in 'nmai':
   424                     commit.append(f)
   428                     commit.append(f)
   425                 elif s == 'r':
   429                 elif s == 'r':
   426                     remove.append(f)
   430                     remove.append(f)
   427                 else:
   431                 else:
   428                     self.warn("%s not tracked!\n")
   432                     self.ui.warn("%s not tracked!\n" % f)
   429         else:
   433         else:
   430             (c, a, d, u) = self.diffdir(self.root)
   434             (c, a, d, u) = self.diffdir(self.root)
   431             commit = c + a
   435             commit = c + a
   432             remove = d
   436             remove = d
   433 
   437 
   448         linkrev = self.changelog.count()
   452         linkrev = self.changelog.count()
   449         commit.sort()
   453         commit.sort()
   450         for f in commit:
   454         for f in commit:
   451             self.ui.note(f + "\n")
   455             self.ui.note(f + "\n")
   452             try:
   456             try:
   453                 t = file(f).read()
   457                 t = file(self.wjoin(f)).read()
   454             except IOError:
   458             except IOError:
   455                 self.warn("trouble committing %s!\n" % f)
   459                 self.warn("trouble committing %s!\n" % f)
   456                 raise
   460                 raise
   457 
   461 
   458             r = self.file(f)
   462             r = self.file(f)
   491         for f,n in l:
   495         for f,n in l:
   492             if f[0] == "/": continue
   496             if f[0] == "/": continue
   493             self.ui.note(f, "\n")
   497             self.ui.note(f, "\n")
   494             t = self.file(f).revision(n)
   498             t = self.file(f).revision(n)
   495             try:
   499             try:
   496                 file(f, "w").write(t)
   500                 file(self.wjoin(f), "w").write(t)
   497             except IOError:
   501             except IOError:
   498                 os.makedirs(os.path.dirname(f))
   502                 os.makedirs(os.path.dirname(f))
   499                 file(f, "w").write(t)
   503                 file(self.wjoin(f), "w").write(t)
   500 
   504 
   501         self.dirstate.setparents(node)
   505         self.dirstate.setparents(node)
   502         self.dirstate.clear()
   506         self.dirstate.clear()
   503         self.dirstate.update([f for f,n in l], "n")
   507         self.dirstate.update([f for f,n in l], "n")
   504 
   508 
   517             change = self.changelog.read(changeset)
   521             change = self.changelog.read(changeset)
   518             mf = self.manifest.read(change[0])
   522             mf = self.manifest.read(change[0])
   519             dc = self.dirstate.copy()
   523             dc = self.dirstate.copy()
   520 
   524 
   521         def fcmp(fn):
   525         def fcmp(fn):
   522             t1 = file(os.path.join(self.root, fn)).read()
   526             t1 = file(self.wjoin(fn)).read()
   523             t2 = self.file(fn).revision(mf[fn])
   527             t2 = self.file(fn).revision(mf[fn])
   524             return cmp(t1, t2)
   528             return cmp(t1, t2)
   525 
   529 
   526         for dir, subdirs, files in os.walk(self.root):
   530         for dir, subdirs, files in os.walk(self.root):
   527             d = dir[len(self.root)+1:]
   531             d = dir[len(self.root)+1:]
   583     
   587     
   584         return (changed, added, deleted)
   588         return (changed, added, deleted)
   585 
   589 
   586     def add(self, list):
   590     def add(self, list):
   587         for f in list:
   591         for f in list:
   588             p = os.path.join(self.root, f)
   592             p = self.wjoin(f)
   589             if not os.path.isfile(p):
   593             if not os.path.isfile(p):
   590                 self.ui.warn("%s does not exist!\n" % f)
   594                 self.ui.warn("%s does not exist!\n" % f)
   591             elif self.dirstate.state(f) == 'n':
   595             elif self.dirstate.state(f) == 'n':
   592                 self.ui.warn("%s already tracked!\n" % f)
   596                 self.ui.warn("%s already tracked!\n" % f)
   593             else:
   597             else:
   600             else:
   604             else:
   601                 self.dirstate.forget([f])
   605                 self.dirstate.forget([f])
   602 
   606 
   603     def remove(self, list):
   607     def remove(self, list):
   604         for f in list:
   608         for f in list:
   605             p = os.path.join(self.root, f)
   609             p = self.wjoin(f)
   606             if os.path.isfile(p):
   610             if os.path.isfile(p):
   607                 self.ui.warn("%s still exists!\n" % f)
   611                 self.ui.warn("%s still exists!\n" % f)
   608             elif f not in self.dirstate:
   612             elif f not in self.dirstate:
   609                 self.ui.warn("%s not tracked!\n" % f)
   613                 self.ui.warn("%s not tracked!\n" % f)
   610             else:
   614             else:
   933         for f in files:
   937         for f in files:
   934             if f[0] == "/": continue
   938             if f[0] == "/": continue
   935             self.ui.note(f, "\n")
   939             self.ui.note(f, "\n")
   936             t = self.file(f).revision(get[f])
   940             t = self.file(f).revision(get[f])
   937             try:
   941             try:
   938                 file(f, "w").write(t)
   942                 file(self.wjoin(f), "w").write(t)
   939             except IOError:
   943             except IOError:
   940                 os.makedirs(os.path.dirname(f))
   944                 os.makedirs(os.path.dirname(f))
   941                 file(f, "w").write(t)
   945                 file(self.wjoin(f), "w").write(t)
   942 
   946 
   943         # we have to remember what files we needed to get/change
   947         # we have to remember what files we needed to get/change
   944         # because any file that's different from either one of its
   948         # because any file that's different from either one of its
   945         # parents must be in the changeset
   949         # parents must be in the changeset
   946         self.dirstate.update(files, 'm')
   950         self.dirstate.update(files, 'm')
   971             f.close()
   975             f.close()
   972             return name
   976             return name
   973 
   977 
   974         fl = self.file(fn)
   978         fl = self.file(fn)
   975         base = fl.ancestor(my, other)
   979         base = fl.ancestor(my, other)
   976         a = fn
   980         a = self.wjoin(fn)
   977         b = temp("other", other)
   981         b = temp("other", other)
   978         c = temp("base", base)
   982         c = temp("base", base)
   979 
   983 
   980         self.ui.note("resolving %s\n" % fn)
   984         self.ui.note("resolving %s\n" % fn)
   981         self.ui.debug("file %s: other %s ancestor %s\n" %
   985         self.ui.debug("file %s: other %s ancestor %s\n" %