Exemple #1
0
    def run(self, data_dir=None):
        flaskg.add_lineno_attr = False
        flaskg.item_name2id = {}
        userid_old2new = {}
        indexer = app.storage
        backend = indexer.backend  # backend without indexing

        print("\nConverting Users...\n")
        for rev in UserBackend(os.path.join(data_dir, 'user')):  # assumes user/ below data_dir
            global user_names
            user_names.append(rev.meta['name'][0])
            userid_old2new[rev.uid] = rev.meta['itemid']  # map old userid to new userid
            backend.store(rev.meta, rev.data)

        print("\nConverting Pages/Attachments...\n")
        for rev in PageBackend(data_dir, deleted_mode=DELETED_MODE_KILL, default_markup='wiki'):
            for user_name in user_names:
                if rev.meta['name'][0] == user_name or rev.meta['name'][0].startswith(user_name + '/'):
                    rev.meta['namespace'] = 'users'
                    break
            backend.store(rev.meta, rev.data)
            # item_name to itemid xref required for migrating user subscriptions
            flaskg.item_name2id[rev.meta['name'][0]] = rev.meta['itemid']

        print("\nConverting Revision Editors...\n")
        for mountpoint, revid in backend:
            meta, data = backend.retrieve(mountpoint, revid)
            if USERID in meta:
                try:
                    meta[USERID] = userid_old2new[meta[USERID]]
                except KeyError:
                    # user profile lost, but userid referred by revision
                    print(("Missing userid {0!r}, editor of {1} revision {2}".format(meta[USERID], meta[NAME][0], revid)).encode('utf-8'))
                    del meta[USERID]
                backend.store(meta, data)
            elif meta.get(CONTENTTYPE) == CONTENTTYPE_USER:
                meta.pop(UID_OLD, None)  # not needed any more
                backend.store(meta, data)

        print("\nConverting last revision of Moin 1.9 items to Moin 2.0")
        self.conv_in = conv_in()
        self.conv_out = conv_out()
        reg = default_registry
        refs_conv = reg.get(type_moin_document, type_moin_document, items='refs')
        for item_name, (revno, namespace) in sorted(last_moin19_rev.items()):
            print('    Processing item "{0}", namespace "{1}", revision "{2}"'.format(item_name, namespace, revno))
            if namespace == '':
                namespace = 'default'
            meta, data = backend.retrieve(namespace, revno)
            data_in = ''.join(data.readlines())
            dom = self.conv_in(data_in, 'text/x.moin.wiki;format=1.9;charset=utf-8')
            out = self.conv_out(dom)
            out = out.encode(CHARSET)
            iri = Iri(scheme='wiki', authority='', path='/' + item_name)
            dom.set(moin_page.page_href, str(iri))
            refs_conv(dom)
            meta[ITEMLINKS] = refs_conv.get_links()
            meta[ITEMTRANSCLUSIONS] = refs_conv.get_transclusions()
            meta[EXTERNALLINKS] = refs_conv.get_external_links()
            size, hash_name, hash_digest = hash_hexdigest(out)
            out = BytesIO(out)
            meta[hash_name] = hash_digest
            meta[SIZE] = size
            meta[PARENTID] = meta[REVID]
            meta[REVID] = make_uuid()
            meta[REV_NUMBER] = meta[REV_NUMBER] + 1
            meta[MTIME] = int(time.time())
            meta[COMMENT] = 'Convert moin 1.9 markup to 2.0'
            meta[CONTENTTYPE] = 'text/x.moin.wiki;charset=utf-8'
            del meta['dataid']
            out.seek(0)
            backend.store(meta, out)

        print("\nRebuilding the index...")
        indexer.close()
        indexer.destroy()
        indexer.create()
        indexer.rebuild()
        indexer.open()

        print("Finished conversion!")
Exemple #2
0
 def setup_class(self):
     self.conv_in = conv_in()
     self.conv_out = conv_out()