mercurial/hg.py
changeset 363 ae96b7e1318d
parent 360 10519e4cbd02
child 372 4b0f562c61f4
child 377 e5d769afd3ef
--- a/mercurial/hg.py	Wed Jun 15 15:50:28 2005 -0800
+++ b/mercurial/hg.py	Wed Jun 15 15:57:07 2005 -0800
@@ -204,6 +204,7 @@
         self.ui = ui
         self.map = None
         self.pl = None
+        self.copies = {}
 
     def __del__(self):
         if self.dirty:
@@ -253,8 +254,19 @@
             l = e[4]
             pos += 17
             f = st[pos:pos + l]
+            if '\0' in f: 
+                f, c = f.split('\0')
+                self.copies[f] = c
             self.map[f] = e[:4]
             pos += l
+
+    def copy(self, source, dest):
+        self.read()
+        self.dirty = 1
+        self.copies[dest] = source
+
+    def copied(self, file):
+        return self.copies.get(file, None)
         
     def update(self, files, state):
         ''' current states:
@@ -292,11 +304,14 @@
         st = self.opener("dirstate", "w")
         st.write("".join(self.pl))
         for f, e in self.map.items():
+            c = self.copied(f)
+            if c:
+                f = f + "\0" + c
             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
             st.write(e + f)
         self.dirty = 0
 
-    def copy(self):
+    def dup(self):
         self.read()
         return self.map.copy()
 
@@ -556,10 +571,17 @@
                 self.warn("trouble committing %s!\n" % f)
                 raise
 
+            meta = {}
+            cp = self.dirstate.copied(f)
+            if cp:
+                meta["copy"] = cp
+                meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
+                self.ui.debug(" %s: copy %s:%s\n" % (f, cp, meta["copyrev"])) 
+
             r = self.file(f)
             fp1 = m1.get(f, nullid)
             fp2 = m2.get(f, nullid)
-            new[f] = r.add(t, {}, tr, linkrev, fp1, fp2)
+            new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
 
         # update manifest
         m1.update(new)
@@ -600,7 +622,7 @@
             changeset = self.dirstate.parents()[0]
             change = self.changelog.read(changeset)
             mf = self.manifest.read(change[0])
-            dc = self.dirstate.copy()
+            dc = self.dirstate.dup()
 
         def fcmp(fn):
             t1 = self.wfile(fn).read()
@@ -689,6 +711,15 @@
             else:
                 self.dirstate.update([f], "r")
 
+    def copy(self, source, dest):
+        p = self.wjoin(dest)
+        if not os.path.isfile(dest):
+            self.ui.warn("%s does not exist!\n" % dest)
+        else:
+            if self.dirstate.state(dest) == '?':
+                self.dirstate.update([dest], "a")
+            self.dirstate.copy(source, dest)
+
     def heads(self):
         return self.changelog.heads()