From dfe55279e1a6bc3e27617b39597958fccc9ad0f1 Mon Sep 17 00:00:00 2001
From: drebs <drebs@leap.se>
Date: Thu, 25 Aug 2016 08:24:57 -0300
Subject: [PATCH] [pkg] couch migrate script removes transactions from inside
 documents

---
 .../0.8.2/migrate_couch_schema/__init__.py    | 20 +++++++++++++++++++
 scripts/migration/0.8.2/tests/conftest.py     | 10 ++++++++--
 scripts/migration/0.8.2/tests/test_migrate.py | 14 +++++++++++++
 3 files changed, 42 insertions(+), 2 deletions(-)

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 7af2e537..97757b32 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 61f6c7ee..f28accf9 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 10c8b906..e060a204 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'
-- 
GitLab