mercurial/hg.py
changeset 363 ae96b7e1318d
parent 360 10519e4cbd02
child 372 4b0f562c61f4
child 377 e5d769afd3ef
equal deleted inserted replaced
362:410373162036 363:ae96b7e1318d
   202         self.root = root
   202         self.root = root
   203         self.dirty = 0
   203         self.dirty = 0
   204         self.ui = ui
   204         self.ui = ui
   205         self.map = None
   205         self.map = None
   206         self.pl = None
   206         self.pl = None
       
   207         self.copies = {}
   207 
   208 
   208     def __del__(self):
   209     def __del__(self):
   209         if self.dirty:
   210         if self.dirty:
   210             self.write()
   211             self.write()
   211 
   212 
   251         while pos < len(st):
   252         while pos < len(st):
   252             e = struct.unpack(">cllll", st[pos:pos+17])
   253             e = struct.unpack(">cllll", st[pos:pos+17])
   253             l = e[4]
   254             l = e[4]
   254             pos += 17
   255             pos += 17
   255             f = st[pos:pos + l]
   256             f = st[pos:pos + l]
       
   257             if '\0' in f: 
       
   258                 f, c = f.split('\0')
       
   259                 self.copies[f] = c
   256             self.map[f] = e[:4]
   260             self.map[f] = e[:4]
   257             pos += l
   261             pos += l
       
   262 
       
   263     def copy(self, source, dest):
       
   264         self.read()
       
   265         self.dirty = 1
       
   266         self.copies[dest] = source
       
   267 
       
   268     def copied(self, file):
       
   269         return self.copies.get(file, None)
   258         
   270         
   259     def update(self, files, state):
   271     def update(self, files, state):
   260         ''' current states:
   272         ''' current states:
   261         n  normal
   273         n  normal
   262         m  needs merging
   274         m  needs merging
   290 
   302 
   291     def write(self):
   303     def write(self):
   292         st = self.opener("dirstate", "w")
   304         st = self.opener("dirstate", "w")
   293         st.write("".join(self.pl))
   305         st.write("".join(self.pl))
   294         for f, e in self.map.items():
   306         for f, e in self.map.items():
       
   307             c = self.copied(f)
       
   308             if c:
       
   309                 f = f + "\0" + c
   295             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
   310             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
   296             st.write(e + f)
   311             st.write(e + f)
   297         self.dirty = 0
   312         self.dirty = 0
   298 
   313 
   299     def copy(self):
   314     def dup(self):
   300         self.read()
   315         self.read()
   301         return self.map.copy()
   316         return self.map.copy()
   302 
   317 
   303 # used to avoid circular references so destructors work
   318 # used to avoid circular references so destructors work
   304 def opener(base):
   319 def opener(base):
   554                 t = file(fp).read()
   569                 t = file(fp).read()
   555             except IOError:
   570             except IOError:
   556                 self.warn("trouble committing %s!\n" % f)
   571                 self.warn("trouble committing %s!\n" % f)
   557                 raise
   572                 raise
   558 
   573 
       
   574             meta = {}
       
   575             cp = self.dirstate.copied(f)
       
   576             if cp:
       
   577                 meta["copy"] = cp
       
   578                 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
       
   579                 self.ui.debug(" %s: copy %s:%s\n" % (f, cp, meta["copyrev"])) 
       
   580 
   559             r = self.file(f)
   581             r = self.file(f)
   560             fp1 = m1.get(f, nullid)
   582             fp1 = m1.get(f, nullid)
   561             fp2 = m2.get(f, nullid)
   583             fp2 = m2.get(f, nullid)
   562             new[f] = r.add(t, {}, tr, linkrev, fp1, fp2)
   584             new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
   563 
   585 
   564         # update manifest
   586         # update manifest
   565         m1.update(new)
   587         m1.update(new)
   566         for f in remove: del m1[f]
   588         for f in remove: del m1[f]
   567         mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0])
   589         mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0])
   598             dc = dict.fromkeys(mf)
   620             dc = dict.fromkeys(mf)
   599         else:
   621         else:
   600             changeset = self.dirstate.parents()[0]
   622             changeset = self.dirstate.parents()[0]
   601             change = self.changelog.read(changeset)
   623             change = self.changelog.read(changeset)
   602             mf = self.manifest.read(change[0])
   624             mf = self.manifest.read(change[0])
   603             dc = self.dirstate.copy()
   625             dc = self.dirstate.dup()
   604 
   626 
   605         def fcmp(fn):
   627         def fcmp(fn):
   606             t1 = self.wfile(fn).read()
   628             t1 = self.wfile(fn).read()
   607             t2 = self.file(fn).revision(mf[fn])
   629             t2 = self.file(fn).revision(mf[fn])
   608             return cmp(t1, t2)
   630             return cmp(t1, t2)
   686                 self.ui.warn("%s still exists!\n" % f)
   708                 self.ui.warn("%s still exists!\n" % f)
   687             elif f not in self.dirstate:
   709             elif f not in self.dirstate:
   688                 self.ui.warn("%s not tracked!\n" % f)
   710                 self.ui.warn("%s not tracked!\n" % f)
   689             else:
   711             else:
   690                 self.dirstate.update([f], "r")
   712                 self.dirstate.update([f], "r")
       
   713 
       
   714     def copy(self, source, dest):
       
   715         p = self.wjoin(dest)
       
   716         if not os.path.isfile(dest):
       
   717             self.ui.warn("%s does not exist!\n" % dest)
       
   718         else:
       
   719             if self.dirstate.state(dest) == '?':
       
   720                 self.dirstate.update([dest], "a")
       
   721             self.dirstate.copy(source, dest)
   691 
   722 
   692     def heads(self):
   723     def heads(self):
   693         return self.changelog.heads()
   724         return self.changelog.heads()
   694 
   725 
   695     def branches(self, nodes):
   726     def branches(self, nodes):