[PATCH 1 of 3] dirstate: don't check state of subrepo directories

durin42 at gmail.com durin42 at gmail.com
Thu Dec 10 10:29:58 CST 2009


# HG changeset patch
# User Augie Fackler <durin42 at gmail.com>
# Date 1260390227 21600
# Node ID 58972474c3eb72dec11dbe0232e9100f2d1b8fa8
# Parent  15fbbc939373b7aded977a8b6fa757f8bbfe3dd8
dirstate: don't check state of subrepo directories

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -7,7 +7,7 @@
 
 from node import nullid
 from i18n import _
-import util, ignore, osutil, parsers
+import util, ignore, osutil, parsers, subrepo
 import struct, os, stat, errno
 import cStringIO
 
@@ -483,7 +483,13 @@
         files = set(match.files())
         if not files or '.' in files:
             files = ['']
-        results = {'.hg': None}
+        subfile = join('.hgsub')
+        if os.path.exists(subfile):
+            substate = subrepo.parsesub(subfile, open(subfile).read())
+        else:
+            substate = {}
+        removekeys = substate.keys() + ['.hg']
+        results = dict.fromkeys(removekeys)
 
         # step 1: find all explicit files
         for ff in sorted(files):
@@ -562,7 +568,7 @@
                     st = None
                 results[nf] = st
 
-        del results['.hg']
+        map(results.pop, removekeys)
         return results
 
     def status(self, match, ignored, clean, unknown):
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -12,19 +12,12 @@
 
 nullstate = ('', '')
 
-def state(ctx):
+def parsesub(file, data, ctx=None):
     p = config.config()
-    def read(f, sections=None, remap=None):
-        if f in ctx:
-            try:
-                p.parse(f, ctx[f].data(), sections, remap)
-            except IOError, err:
-                if err.errno != errno.ENOENT:
-                    raise
-    read('.hgsub')
+    p.parse(file, data, None, None)
 
     rev = {}
-    if '.hgsubstate' in ctx:
+    if ctx and '.hgsubstate' in ctx:
         try:
             for l in ctx['.hgsubstate'].data().splitlines():
                 revision, path = l.split(" ", 1)
@@ -39,6 +32,16 @@
 
     return state
 
+
+def state(ctx):
+    if '.hgsub' in ctx:
+        try:
+            return parsesub('.hgsub', ctx['.hgsub'].data(), ctx=ctx)
+        except IOError, err:
+            if err.errno != errno.ENOENT:
+                raise
+    return {}
+
 def writestate(repo, state):
     repo.wwrite('.hgsubstate',
                 ''.join(['%s %s\n' % (state[s][1], s)


More information about the Mercurial-devel mailing list