[Pkg-bazaar-commits] ./bzr/unstable r236: - Experiments in inventory performance

mbp at sourcefrog.net mbp at sourcefrog.net
Fri Apr 10 07:43:58 UTC 2009


------------------------------------------------------------
revno: 236
committer: mbp at sourcefrog.net
timestamp: Mon 2005-04-11 12:44:45 +1000
message:
  - Experiments in inventory performance
added:
  bzrlib/textinv.py
modified:
  bzrlib/commands.py
-------------- next part --------------
=== modified file 'bzrlib/commands.py'
--- a/bzrlib/commands.py	2005-04-11 01:58:58 +0000
+++ b/bzrlib/commands.py	2005-04-11 02:44:45 +0000
@@ -488,7 +488,20 @@
     import bzrlib.newinventory
     inv = Branch('.').basis_tree().inventory
     bzrlib.newinventory.write_slacker_inventory(inv, sys.stdout)
-                
+
+
+
+def cmd_dump_text_inventory():
+    import bzrlib.textinv
+    inv = Branch('.').basis_tree().inventory
+    bzrlib.textinv.write_text_inventory(inv, sys.stdout)
+
+
+def cmd_load_text_inventory():
+    import bzrlib.textinv
+    inv = bzrlib.textinv.read_text_inventory(sys.stdin)
+    print 'loaded %d entries' % len(inv)
+    
     
 
 def cmd_root(filename=None):
@@ -1016,7 +1029,9 @@
         ## traceback.print_exc(None, sys.stderr)
         return 1
 
-    # TODO: Maybe nicer handling of IOError?
+    ## TODO: Trap AssertionError
+
+    # TODO: Maybe nicer handling of IOError especially for broken pipe.
 
 
 

=== added file 'bzrlib/textinv.py'
--- a/bzrlib/textinv.py	1970-01-01 00:00:00 +0000
+++ b/bzrlib/textinv.py	2005-04-11 02:44:45 +0000
@@ -0,0 +1,93 @@
+# (C) 2005 Canonical Ltd
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+from errors import BzrError
+from inventory import InventoryEntry, Inventory
+
+
+START_MARK = "# bzr inventory format 3\n"
+END_MARK = "# end of inventory\n"
+
+
+def escape(s):
+    """Very simple URL-like escaping.
+    
+    (Why not just use backslashes?  Because then we couldn't parse
+    lines just by splitting on spaces.)"""
+    return (s.replace('\\', r'\x5c')
+            .replace(' ', r'\x20')
+            .replace('\t', r'\x09')
+            .replace('\n', r'\x0a'))
+
+
+
+def unescape(s):
+    assert s.find(' ') == -1
+    s = (s.replace(r'\x20', ' ')
+         .replace(r'\x09', '\t')
+         .replace(r'\x0a', '\n')
+         .replace(r'\x5c', '\\'))
+
+    # TODO: What if there's anything else?
+
+    return s
+    
+                     
+
+
+def write_text_inventory(inv, outf):
+    """Write out inv in a simple trad-unix text format."""
+    outf.write(START_MARK)
+    for path, ie in inv.iter_entries():
+        if ie.kind == 'root_directory':
+            continue
+        
+        outf.write(ie.file_id + ' ')
+        outf.write(escape(ie.name) + ' ')
+        outf.write(ie.kind + ' ')
+        outf.write(ie.parent_id + ' ')
+        
+        if ie.kind == 'file':
+            outf.write(ie.text_id)
+            outf.write(' ' + ie.text_sha1)
+            outf.write(' ' + str(ie.text_size))
+        outf.write("\n")
+    outf.write(END_MARK)
+
+
+
+
+def read_text_inventory(tf):
+    """Return an inventory read in from tf"""
+    if tf.readline() != START_MARK:
+        raise BzrError("missing start mark")
+    
+    inv = Inventory()
+
+    for l in tf:
+        fields = l.split(' ')
+        if fields[0] == '#':
+            break
+        ie = {'file_id': fields[0],
+              'name': unescape(fields[1]),
+              'kind': fields[2],
+              'parent_id': fields[3]}
+        ##inv.add(ie)
+        
+    if l != END_MARK:
+        raise BzrError("missing end mark")
+    return inv



More information about the Pkg-bazaar-commits mailing list