changeset 227:f57519cddd3d

move repo.current to dirstate.parents() -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 move repo.current to dirstate.parents() dirstate now tracks the parents for the working dir add a parents command to show them manifest hash: cd69237838c3f69f7937723c4a6803d47cb27cfa -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCoMGuywK+sNU5EO8RAg5UAKCVLUrsJtkoIOTM+e0BLqEVN3Ni3gCeNDyy ZF8jD728cl9K7S4sIN4gX4Y= =P4bu -----END PGP SIGNATURE-----
author mpm@selenic.com
date Fri, 03 Jun 2005 12:46:38 -0800
parents 1536ccac47e9
children 2502aa663484
files hg mercurial/commands.py mercurial/hg.py
diffstat 3 files changed, 34 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/hg
+++ b/hg
@@ -66,9 +66,8 @@ def diff(files = None, node1 = None, nod
     else:
         date2 = time.asctime()
         if not node1:
-            node1 = repo.current
+            node1 = repo.dirstate.parents()[0]
         (c, a, d, u) = repo.diffdir(repo.root, node1)
-        a = [] # ignore unknown files in repo, by popular request
         def read(f): return file(os.path.join(repo.root, f)).read()
 
     change = repo.changelog.read(node1)
@@ -139,9 +138,9 @@ elif cmd == "remove" or cmd == "rm" or c
 elif cmd == "commit" or cmd == "checkin" or cmd == "ci":
     if 1:
         if len(args) > 0:
-            repo.commit(repo.current, args)
+            repo.commit(args)
         else:
-            repo.commit(repo.current)
+            repo.commit()
 elif cmd == "rawcommit":
     "raw commit interface"
     rc = {}
@@ -204,7 +203,7 @@ elif cmd == "import" or cmd == "patch":
         if files:
             if os.system("patch -p%d < %s %s" % (strip, pf, quiet)):
                 raise "patch failed!"
-        repo.commit(repo.current, files, text)
+        repo.commit(files, text)
 
 elif cmd == "diff":
     revs = []
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -102,7 +102,7 @@ def annotate(u, repo, *args, **ops):
         ops['number'] = 1
 
     args = relpath(repo, args)
-    node = repo.current
+    node = repo.dirstate.parents()[0]
     if ops['revision']:
         node = repo.changelog.lookup(ops['revision'])
     change = repo.changelog.read(node)
@@ -142,6 +142,17 @@ def heads(ui, repo):
         print "description:"
         print changes[4]
 
+def parents(ui, repo, node = None):
+    '''show the parents of the current working dir'''
+    if node:
+        p = repo.changelog.parents(repo.lookup(hg.bin(node)))
+    else:
+        p = repo.dirstate.parents()
+
+    for n in p:
+        if n != hg.nullid:
+            ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
+
 def status(ui, repo):
     '''show changed files in the working directory
 
@@ -172,6 +183,7 @@ table = {
                       ('n', 'number', None, 'show revision number'),
                       ('c', 'changeset', None, 'show changeset')],
                      'hg annotate [-u] [-c] [-n] [-r id] [files]'),
+    "parents": (parents, [], 'hg parents [node]'),
     "status": (status, [], 'hg status'),
     "undo": (undo, [], 'hg undo'),
     }
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -155,6 +155,7 @@ class dirstate:
         self.dirty = 0
         self.ui = ui
         self.map = None
+        self.pl = None
 
     def __del__(self):
         if self.dirty:
@@ -171,6 +172,15 @@ class dirstate:
         if not self.map: self.read()
         return key in self.map
 
+    def parents(self):
+        if not self.pl:
+            self.read()
+        return self.pl
+
+    def setparents(self, p1, p2 = nullid):
+        self.dirty = 1
+        self.pl = p1, p2
+
     def state(self, key):
         try:
             return self[key][0]
@@ -181,11 +191,14 @@ class dirstate:
         if self.map is not None: return self.map
 
         self.map = {}
+        self.pl = [nullid, nullid]
         try:
             st = self.opener("dirstate").read()
         except: return
 
-        pos = 0
+        self.pl = [st[:20], st[20: 40]]
+
+        pos = 40
         while pos < len(st):
             e = struct.unpack(">cllll", st[pos:pos+17])
             l = e[4]
@@ -232,6 +245,7 @@ class dirstate:
 
     def write(self):
         st = self.opener("dirstate", "w")
+        st.write("".join(self.pl))
         for f, e in self.map.items():
             e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
             st.write(e + f)
@@ -297,15 +311,7 @@ class localrepository:
 
         if not self.remote:
             self.dirstate = dirstate(self.opener, ui)
-            try:
-                self.current = bin(self.opener("current").read())
-            except IOError:
-                self.current = None
 
-    def setcurrent(self, node):
-        self.current = node
-        self.opener("current", "w").write(hex(node))
-      
     def ignore(self, f):
         if self.ignorelist is None:
             self.ignorelist = []
@@ -366,7 +372,7 @@ class localrepository:
             node = self.changelog.tip()
             f.sort()
 
-            self.setcurrent(node)
+            self.dirstate.setparents(node)
             self.dirstate.update(f, 'i')
         
         else:
@@ -486,7 +492,7 @@ class localrepository:
                 os.makedirs(os.path.dirname(f))
                 file(f, "w").write(t)
 
-        self.setcurrent(node)
+        self.dirstate.setparents(node)
         self.dirstate.clear()
         self.dirstate.update([f for f,n in l], "n")