diff --git a/scripts/migration/0.8.2/migrate_couch_schema/__init__.py b/scripts/migration/0.8.2/migrate_couch_schema/__init__.py index 7af2e537f014e970db591b982d8535a39462ecdf..97757b32946b207eae5a5069178be96764f17cc5 100644 --- a/scripts/migration/0.8.2/migrate_couch_schema/__init__.py +++ b/scripts/migration/0.8.2/migrate_couch_schema/__init__.py @@ -86,6 +86,7 @@ def migrate(args, target_version): def _migrate_user_db(db, do_migrate): _migrate_transaction_log(db, do_migrate) + _remove_transactions_from_documents(db, do_migrate) _migrate_sync_docs(db, do_migrate) _delete_design_docs(db, do_migrate) _migrate_config_doc(db, do_migrate) @@ -113,6 +114,25 @@ def _migrate_transaction_log(db, do_migrate): db.save(doc) +def _remove_transactions_from_documents(db, do_migrate): + logger.info('[%s] removing transactions from all docs' % db.name) + view = db.view('_all_docs', include_docs='true') + for row in view.rows: + doc = row['doc'] + doc_id = doc['_id'] + # skip metadata documents + for s in ['sync_', 'gen-', 'u1db_config', '_design']: + if doc_id.startswith(s): + continue + # actually remove the u1db transactions from the document + if 'u1db_transactions' in doc: + del doc['u1db_transactions'] + logger.debug('[%s] removing transactions from doc: %s' + % (db.name, doc_id)) + if do_migrate: + db.save(doc) + + def _migrate_config_doc(db, do_migrate): old_doc = db['u1db_config'] new_doc = { diff --git a/scripts/migration/0.8.2/tests/conftest.py b/scripts/migration/0.8.2/tests/conftest.py index 61f6c7eee7e545852b5d313480a002b10d1d5169..f28accf9e354ee17a95ab0640bc722bd1429ab47 100644 --- a/scripts/migration/0.8.2/tests/conftest.py +++ b/scripts/migration/0.8.2/tests/conftest.py @@ -27,8 +27,10 @@ initial_docs = [ 'transaction_id': ''}, {'_id': 'u1db_sync_B', 'generation': 2, 'replica_uid': 'B', 'transaction_id': 'X'}, - {'_id': 'doc1', 'u1db_transactions': [(1, 'trans-1'), (3, 'trans-3')]}, - {'_id': 'doc2', 'u1db_transactions': [(2, 'trans-2'), (4, 'trans-4')]}, + {'_id': 'doc1', 'u1db_transactions': [(1, 'trans-1'), (3, 'trans-3')], + 'u1db_rev': 'doc1-rev'}, + {'_id': 'doc2', 'u1db_transactions': [(2, 'trans-2'), (4, 'trans-4')], + 'u1db_rev': 'doc2-rev'}, {'_id': '_design/docs'}, {'_id': '_design/syncs'}, {'_id': '_design/transactions', @@ -50,5 +52,9 @@ def db(request): db = server.create(dbname) for doc in initial_docs: db.save(doc) + # add an attachment to ensure it's untouched + for doc_id in ['doc1', 'doc2']: + doc = db.get(doc_id) + db.put_attachment(doc, 'untouched', filename='u1db_content') request.addfinalizer(lambda: server.delete(dbname)) return db diff --git a/scripts/migration/0.8.2/tests/test_migrate.py b/scripts/migration/0.8.2/tests/test_migrate.py index 10c8b9069d50850a5cfdf5e18227c19871c1e49f..e060a204f388410adeb2f0e77763ed0c74ef2351 100644 --- a/scripts/migration/0.8.2/tests/test_migrate.py +++ b/scripts/migration/0.8.2/tests/test_migrate.py @@ -65,3 +65,17 @@ def test__migrate_user_db(db): assert gen_4[DOC_ID_KEY] == 'doc2' assert gen_4[GENERATION_KEY] == 4 assert gen_4[TRANSACTION_ID_KEY] == 'trans-4' + + # assert normal doc contents + doc1 = db.get('doc1') + attachment1 = db.get_attachment(doc1, 'u1db_content') + assert 'u1db_rev' in doc1 + assert 'u1db_transactions' not in doc1 + assert doc1['u1db_rev'] == 'doc1-rev' + assert attachment1.read() == 'untouched' + doc2 = db.get('doc2') + attachment2 = db.get_attachment(doc2, 'u1db_content') + assert 'u1db_rev' in doc2 + assert 'u1db_transactions' not in doc2 + assert doc2['u1db_rev'] == 'doc2-rev' + assert attachment2.read() == 'untouched'