Rev 1532: Split up FileBuildEditor. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Sat Aug 2 20:52:44 BST 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/trunk

------------------------------------------------------------
revno: 1532
revision-id: jelmer at samba.org-20080802195243-d1khyb28f5csk636
parent: jelmer at samba.org-20080802194718-hpy10qwh6usxua6a
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Sat 2008-08-02 21:52:43 +0200
message:
  Split up FileBuildEditor.
modified:
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
=== modified file 'fetch.py'
--- a/fetch.py	2008-08-02 19:47:18 +0000
+++ b/fetch.py	2008-08-02 19:52:43 +0000
@@ -195,25 +195,14 @@
 
 
 class FileBuildEditor(object):
-    def __init__(self, editor, path, file_id, file_parents=[], data="", 
-                 is_symlink=False):
+    def __init__(self, editor, path):
         self.path = path
         self.editor = editor
-        self.file_id = file_id
-        self.file_data = data
-        self.is_symlink = is_symlink
+        self.is_executable = None
         self.is_special = None
-        self.file_parents = file_parents
-        self.is_executable = None
-        self.file_stream = None
 
     def apply_textdelta(self, base_checksum=None):
-        actual_checksum = md5.new(self.file_data).hexdigest()
-        assert (base_checksum is None or base_checksum == actual_checksum,
-            "base checksum mismatch: %r != %r" % (base_checksum, 
-                                                  actual_checksum))
-        self.file_stream = StringIO()
-        return apply_txdelta_handler(self.file_data, self.file_stream)
+        return self._apply_textdelta(base_checksum)
 
     def change_prop(self, name, value):
         if name == properties.PROP_EXECUTABLE: 
@@ -242,47 +231,7 @@
 
     def close(self, checksum=None):
         assert isinstance(self.path, unicode)
-        if self.file_stream is not None:
-            self.file_stream.seek(0)
-            lines = osutils.split_lines(self.file_stream.read())
-        else:
-            # Data didn't change or file is new
-            lines = osutils.split_lines(self.file_data)
-
-        actual_checksum = md5_strings(lines)
-        assert checksum is None or checksum == actual_checksum
-
-        self.editor.texts.add_lines((self.file_id, self.editor.revid), 
-                [(self.file_id, revid) for revid in self.file_parents], lines)
-
-        if self.is_special is not None:
-            self.is_symlink = (self.is_special and len(lines) > 0 and lines[0].startswith("link "))
-
-        assert self.is_symlink in (True, False)
-
-        if self.file_id in self.editor.inventory:
-            if self.is_executable is None:
-                self.is_executable = self.editor.inventory[self.file_id].executable
-            del self.editor.inventory[self.file_id]
-
-        if self.is_symlink:
-            ie = self.editor.inventory.add_path(self.path, 'symlink', self.file_id)
-            ie.symlink_target = "".join(lines)[len("link "):]
-            ie.text_sha1 = None
-            ie.text_size = None
-            ie.executable = False
-            ie.revision = self.editor.revid
-        else:
-            ie = self.editor.inventory.add_path(self.path, 'file', self.file_id)
-            ie.revision = self.editor.revid
-            ie.kind = 'file'
-            ie.symlink_target = None
-            ie.text_sha1 = osutils.sha_strings(lines)
-            ie.text_size = sum(map(len, lines))
-            assert ie.text_size is not None
-            ie.executable = self.is_executable
-
-        self.file_stream = None
+        return self._close()
 
 
 class DirectoryRevisionBuildEditor(DirectoryBuildEditor):
@@ -371,7 +320,7 @@
             self.editor._premature_deletes.add(copyfrom_path)
             # No need to rename if it's already in the right spot
             self.editor._rename(file_id, self.new_id, copyfrom_path, path, 'file')
-        return FileBuildEditor(self.editor, path, file_id)
+        return FileRevisionBuildEditor(self.editor, path, file_id)
 
     def _open_file(self, path, base_revnum):
         base_file_id = self.editor._get_old_id(self.old_id, path)
@@ -386,10 +335,72 @@
             # Replace with historical version
             del self.editor.inventory[base_file_id]
             file_parents = []
-        return FileBuildEditor(self.editor, path, file_id, 
+        return FileRevisionBuildEditor(self.editor, path, file_id, 
                                file_parents, file_data, is_symlink=is_symlink)
 
 
+class FileRevisionBuildEditor(FileBuildEditor):
+    def __init__(self, editor, path, file_id, file_parents=[], data="", 
+                 is_symlink=False):
+        super(FileRevisionBuildEditor, self).__init__(editor, path)
+        self.file_id = file_id
+        self.file_data = data
+        self.is_symlink = is_symlink
+        self.file_parents = file_parents
+        self.file_stream = None
+
+    def _apply_textdelta(self, base_checksum=None):
+        actual_checksum = md5.new(self.file_data).hexdigest()
+        assert (base_checksum is None or base_checksum == actual_checksum,
+            "base checksum mismatch: %r != %r" % (base_checksum, 
+                                                  actual_checksum))
+        self.file_stream = StringIO()
+        return apply_txdelta_handler(self.file_data, self.file_stream)
+
+    def _close(self, checksum=None):
+        if self.file_stream is not None:
+            self.file_stream.seek(0)
+            lines = osutils.split_lines(self.file_stream.read())
+        else:
+            # Data didn't change or file is new
+            lines = osutils.split_lines(self.file_data)
+
+        actual_checksum = md5_strings(lines)
+        assert checksum is None or checksum == actual_checksum
+
+        self.editor.texts.add_lines((self.file_id, self.editor.revid), 
+                [(self.file_id, revid) for revid in self.file_parents], lines)
+
+        if self.is_special is not None:
+            self.is_symlink = (self.is_special and len(lines) > 0 and lines[0].startswith("link "))
+
+        assert self.is_symlink in (True, False)
+
+        if self.file_id in self.editor.inventory:
+            if self.is_executable is None:
+                self.is_executable = self.editor.inventory[self.file_id].executable
+            del self.editor.inventory[self.file_id]
+
+        if self.is_symlink:
+            ie = self.editor.inventory.add_path(self.path, 'symlink', self.file_id)
+            ie.symlink_target = "".join(lines)[len("link "):]
+            ie.text_sha1 = None
+            ie.text_size = None
+            ie.executable = False
+            ie.revision = self.editor.revid
+        else:
+            ie = self.editor.inventory.add_path(self.path, 'file', self.file_id)
+            ie.revision = self.editor.revid
+            ie.kind = 'file'
+            ie.symlink_target = None
+            ie.text_sha1 = osutils.sha_strings(lines)
+            ie.text_size = sum(map(len, lines))
+            assert ie.text_size is not None
+            ie.executable = self.is_executable
+
+        self.file_stream = None
+
+
 class RevisionBuildEditor(DeltaBuildEditor):
     """Implementation of the Subversion commit editor interface that builds a 
     Bazaar revision.




More information about the bazaar-commits mailing list