bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 1 | #! /usr/bin/env python
 | 
| 2 | ||
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | ||
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | ||
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 17 | ||
| 18 | from bzrlib.xml import ElementTree, SubElement, Element, Serializer | |
| 19 | from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry | |
| 1311
by Martin Pool - remove RevisionReference; just hold parent ids directly | 20 | from bzrlib.revision import Revision | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 21 | from bzrlib.errors import BzrError | 
| 22 | ||
| 23 | ||
| 24 | ||
| 25 | ||
| 26 | ||
| 27 | class Serializer_v5(Serializer): | |
| 28 | """Version 5 serializer | |
| 29 | ||
| 30 |     Packs objects into XML and vice versa.
 | |
| 31 |     """
 | |
| 32 | ||
| 33 | __slots__ = [] | |
| 34 | ||
| 35 | def _pack_inventory(self, inv): | |
| 36 | """Convert to XML Element""" | |
| 37 | e = Element('inventory') | |
| 38 | e.text = '\n' | |
| 39 | if inv.root.file_id not in (None, ROOT_ID): | |
| 40 | e.set('file_id', inv.root.file_id) | |
| 41 | for path, ie in inv.iter_entries(): | |
| 42 | e.append(self._pack_entry(ie)) | |
| 43 | return e | |
| 44 | ||
| 45 | ||
| 46 | def _pack_entry(self, ie): | |
| 47 | """Convert InventoryEntry to XML element""" | |
| 48 | assert ie.kind == 'directory' or ie.kind == 'file' | |
| 49 | e = Element(ie.kind) | |
| 50 | e.set('name', ie.name) | |
| 51 | e.set('file_id', ie.file_id) | |
| 52 | ||
| 53 | if ie.text_size != None: | |
| 54 | e.set('text_size', '%d' % ie.text_size) | |
| 55 | ||
| 1305
by Martin Pool - rename entry_version to name_version | 56 | for f in ['text_version', 'text_sha1', 'name_version']: | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 57 | v = getattr(ie, f) | 
| 58 | if v != None: | |
| 59 | e.set(f, v) | |
| 60 | ||
| 61 |         # to be conservative, we don't externalize the root pointers
 | |
| 62 |         # for now, leaving them as null in the xml form.  in a future
 | |
| 63 |         # version it will be implied by nested elements.
 | |
| 64 | if ie.parent_id != ROOT_ID: | |
| 65 | assert isinstance(ie.parent_id, basestring) | |
| 66 | e.set('parent_id', ie.parent_id) | |
| 67 | ||
| 68 | e.tail = '\n' | |
| 69 | ||
| 70 | return e | |
| 71 | ||
| 72 | ||
| 73 | def _pack_revision(self, rev): | |
| 74 | """Revision object -> xml tree""" | |
| 75 | root = Element('revision', | |
| 76 | committer = rev.committer, | |
| 77 | timestamp = '%.9f' % rev.timestamp, | |
| 78 | revision_id = rev.revision_id, | |
| 79 | inventory_sha1 = rev.inventory_sha1, | |
| 80 |                        )
 | |
| 81 | if rev.timezone: | |
| 82 | root.set('timezone', str(rev.timezone)) | |
| 83 | root.text = '\n' | |
| 84 | ||
| 85 | msg = SubElement(root, 'message') | |
| 86 | msg.text = rev.message | |
| 87 | msg.tail = '\n' | |
| 88 | ||
| 1313
by Martin Pool - rename to Revision.parent_ids to avoid confusion with old usage | 89 | if rev.parent_ids: | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 90 | pelts = SubElement(root, 'parents') | 
| 91 | pelts.tail = pelts.text = '\n' | |
| 1313
by Martin Pool - rename to Revision.parent_ids to avoid confusion with old usage | 92 | for parent_id in rev.parent_ids: | 
| 1311
by Martin Pool - remove RevisionReference; just hold parent ids directly | 93 | assert isinstance(parent_id, basestring) | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 94 | p = SubElement(pelts, 'revision_ref') | 
| 95 | p.tail = '\n' | |
| 1311
by Martin Pool - remove RevisionReference; just hold parent ids directly | 96 | p.set('revision_id', parent_id) | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 97 | return root | 
| 98 | ||
| 99 | ||
| 100 | ||
| 101 | def _unpack_inventory(self, elt): | |
| 102 | """Construct from XML Element | |
| 103 |         """
 | |
| 104 | assert elt.tag == 'inventory' | |
| 105 | root_id = elt.get('file_id') or ROOT_ID | |
| 106 | inv = Inventory(root_id) | |
| 107 | for e in elt: | |
| 108 | ie = self._unpack_entry(e) | |
| 109 | if ie.parent_id == ROOT_ID: | |
| 110 | ie.parent_id = root_id | |
| 111 | inv.add(ie) | |
| 112 | return inv | |
| 113 | ||
| 114 | ||
| 115 | def _unpack_entry(self, elt): | |
| 116 | kind = elt.tag | |
| 117 | assert kind == 'directory' or kind == 'file' | |
| 118 | ||
| 119 | parent_id = elt.get('parent_id') | |
| 120 | if parent_id == None: | |
| 121 | parent_id = ROOT_ID | |
| 122 | ||
| 123 | ie = InventoryEntry(elt.get('file_id'), | |
| 124 | elt.get('name'), | |
| 125 | kind, | |
| 126 | parent_id) | |
| 127 | ie.text_version = elt.get('text_version') | |
| 1305
by Martin Pool - rename entry_version to name_version | 128 | ie.name_version = elt.get('name_version') | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 129 | ie.text_sha1 = elt.get('text_sha1') | 
| 130 | v = elt.get('text_size') | |
| 131 | ie.text_size = v and int(v) | |
| 132 | ||
| 133 | return ie | |
| 134 | ||
| 135 | ||
| 136 | def _unpack_revision(self, elt): | |
| 137 | """XML Element -> Revision object""" | |
| 138 | assert elt.tag == 'revision' | |
| 139 | ||
| 140 | rev = Revision(committer = elt.get('committer'), | |
| 141 | timestamp = float(elt.get('timestamp')), | |
| 142 | revision_id = elt.get('revision_id'), | |
| 143 | inventory_sha1 = elt.get('inventory_sha1') | |
| 144 |                        )
 | |
| 145 | ||
| 146 | parents = elt.find('parents') or [] | |
| 147 | for p in parents: | |
| 148 | assert p.tag == 'revision_ref', \ | |
| 149 | "bad parent node tag %r" % p.tag | |
| 1313
by Martin Pool - rename to Revision.parent_ids to avoid confusion with old usage | 150 | rev.parent_ids.append(p.get('revision_id')) | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 151 | |
| 152 | v = elt.get('timezone') | |
| 153 | rev.timezone = v and int(v) | |
| 154 | ||
| 155 | rev.message = elt.findtext('message') # text of <message> | |
| 156 | return rev | |
| 157 | ||
| 158 | ||
| 159 | ||
| 160 | serializer_v5 = Serializer_v5() |