# # # delete "tests/t_delete_dir.at" # # delete "tests/t_dump_load.at" # # delete "tests/t_fmerge_normalize.at" # # delete "tests/t_migrate_schema.at" # # delete "tests/t_no_change_deltas.at" # # add_dir "tests/(imp)_deleting_directories" # # add_dir "tests/database_dump_load" # # add_dir "tests/first_extent_normalization_pass" # # add_dir "tests/no-change_deltas_disappear" # # add_dir "tests/schema_migration" # # add_file "tests/(imp)_deleting_directories/__driver__.lua" # content [0d3603c80d9a1a050583306a4518952ae46f3422] # # add_file "tests/database_dump_load/__driver__.lua" # content [26b6f8e0b8497fde25cd9d432edd1f4ac5c7dcfd] # # add_file "tests/first_extent_normalization_pass/__driver__.lua" # content [59f5d1bc8ca96a2da85b7f3639471ff4cb4acaf9] # # add_file "tests/first_extent_normalization_pass/left" # content [c52d4352b7a15f92d9f25128567699f68aedd2b2] # # add_file "tests/first_extent_normalization_pass/right" # content [1115fe31e248649810940ff2cd4f9f222f638e6f] # # add_file "tests/no-change_deltas_disappear/__driver__.lua" # content [6bedf84a5390a8ebf2bbc3b03cfb99c7948da842] # # add_file "tests/schema_migration/1db80c7cee8fa966913db1a463ed50bf1b0e5b0e.mtn.dumped" # content [a5d394c98eaa100d8107df53b3f69e9264347088] # # add_file "tests/schema_migration/9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df.mtn.dumped" # content [484712edf1c56f3aaef06cb5b42df25abcdd74bf] # # add_file "tests/schema_migration/__driver__.lua" # content [8e0ee3155b00e70efcd15f5b210330388ddf5b9f] # # add_file "tests/schema_migration/migrate_keys" # content [38b5ed1b66100385b6d85b91b6bca07482284a00] # # patch "tester.lua" # from [a0d28846349bf1c93501f5fb4bb0bb5b9d76dce0] # to [545636f81c2c6b65c5b79671aef4f9179ee28bde] # # patch "testsuite.at" # from [eea978faa60452bacefc4df9597bbc7b0a56645f] # to [52399f271c1496a2836dc4dc9b609c7dbe7793ab] # # patch "testsuite.lua" # from [03425ee5785ef783a5f6b86bdac9e82e2553432e] # to [359e2064fbe1caf24a83e54de731684341da2f01] # ============================================================ --- tests/(imp)_deleting_directories/__driver__.lua 0d3603c80d9a1a050583306a4518952ae46f3422 +++ tests/(imp)_deleting_directories/__driver__.lua 0d3603c80d9a1a050583306a4518952ae46f3422 @@ -0,0 +1,61 @@ + +mtn_setup() + +revs = {} + +mkdir("groundzero") +addfile("groundzero/preexisting", "1") +addfile("groundzero/rename-out", "2") +addfile("rename-in", "3") +addfile("groundzero/double-kill", "4") +addfile("bystander1", "5") +commit() +revs.base = base_revision() + +addfile("bystander2", "6") +addfile("groundzero/new-file", "7") +rename("rename-in", "groundzero/rename-in") +check(cmd(mtn("rename", "rename-in", "groundzero/rename-in")), 0, false, false) +rename("groundzero/rename-out", "rename-out") +check(cmd(mtn("rename", "groundzero/rename-out", "rename-out")), 0, false, false) +check(cmd(mtn("drop", "-e", "groundzero/double-kill")), 0, false, false) +commit() +revs.other = base_revision() + +revert_to(revs.base) + +-- update doesn't remove files... +remove("groundzero/rename-in") +remove("groundzero/new-file") + +check(cmd(mtn("drop", "-e", "groundzero")), 1, false, false) +check(cmd(mtn("drop", "--recursive", "-e", "groundzero")), 0, false, false) +commit() +revs.dir_del = base_revision() + + +-- orphaned node conflicts on rename-in and new-file +check(cmd(mtn("merge")), 1, false, false) + +check(cmd(mtn("update", "-r", revs.other)), 0, false, false) +check(cmd(mtn("drop", "groundzero/new-file")), 0, false, false) +check(cmd(mtn("drop", "groundzero/rename-in")), 0, false, false) +commit() +check(cmd(mtn("merge")), 0, false, false) + + +check(cmd(mtn("checkout", "--revision", revs.base, "clean")), 0, false, false) +chdir("clean") +check(cmd(mtn("--branch=testbranch", "update")), 0, false, false) +chdir("..") + +check(not exists("clean/rename-out")) +check(exists("clean/bystander1")) +check(exists("clean/bystander2")) +check(not exists("clean/groundzero/rename-in")) +check(not exists("clean/groundzero/preexisting")) +check(not exists("clean/groundzero/double-kill")) +check(not exists("clean/groundzero/new-file")) +-- Just in case: +check(not exists("clean/rename-in")) +check(not exists("clean/groundzero/rename-out")) ============================================================ --- tests/database_dump_load/__driver__.lua 26b6f8e0b8497fde25cd9d432edd1f4ac5c7dcfd +++ tests/database_dump_load/__driver__.lua 26b6f8e0b8497fde25cd9d432edd1f4ac5c7dcfd @@ -0,0 +1,25 @@ + +mtn_setup() + +write_large_file("largish", 1) + +check(cmd(mtn("genkey", "foo")), 0, false, false, "foo\nfoo\n") +addfile("testfile1", "blah balh") +commit("branch1") +writefile("testfile1", "stuff stuff") +addfile("testfile2", "foo foo") + +-- include a largish file in the dump, so we can test for iostream breakage on +-- MinGW wrt sync_with_stdio(). +check(cmd(mtn("add", "largish")), 0, false, false) +commit("branch2") + +-- run a db analyze so that SQLite creates any internal tables and indices, +-- because we want to make sure we don't attempt to dump and load these. +check(cmd(mtn("db", "execute", "analyze;")), 0, false, false) + +check(cmd(mtn("db", "dump")), 0, true, false) +rename("stdout", "stdin") +check(cmd(mtn("db", "load", "--db=test2.db")), 0, false, false, true) + +check_same_db_contents("test.db", "test2.db") ============================================================ --- tests/first_extent_normalization_pass/__driver__.lua 59f5d1bc8ca96a2da85b7f3639471ff4cb4acaf9 +++ tests/first_extent_normalization_pass/__driver__.lua 59f5d1bc8ca96a2da85b7f3639471ff4cb4acaf9 @@ -0,0 +1,15 @@ + +mtn_setup() + +getfile("left") +getfile("right") + +copyfile("left", "stdin") +check(cmd(mtn("fload")), 0, false, false, true) +copyfile("right", "stdin") +check(cmd(mtn("fload")), 0, false, false, true) +left = sha1("left") +right = sha1("right") +check(cmd(mtn("fmerge", left, left, right)), 0, true, false) +canonicalize("stdout") +check(samefile("right", "stdout")) ============================================================ --- tests/first_extent_normalization_pass/left c52d4352b7a15f92d9f25128567699f68aedd2b2 +++ tests/first_extent_normalization_pass/left c52d4352b7a15f92d9f25128567699f68aedd2b2 @@ -0,0 +1,3 @@ +A +B +B ============================================================ --- tests/first_extent_normalization_pass/right 1115fe31e248649810940ff2cd4f9f222f638e6f +++ tests/first_extent_normalization_pass/right 1115fe31e248649810940ff2cd4f9f222f638e6f @@ -0,0 +1,4 @@ +A +B +A +B ============================================================ --- tests/no-change_deltas_disappear/__driver__.lua 6bedf84a5390a8ebf2bbc3b03cfb99c7948da842 +++ tests/no-change_deltas_disappear/__driver__.lua 6bedf84a5390a8ebf2bbc3b03cfb99c7948da842 @@ -0,0 +1,43 @@ + +mtn_setup() + +-- If we have a changeset representing a reversion, like +-- changeset_1: patch "a" [id1] -> [id2] +-- changeset_2: patch "a" [id2] -> [id1] +-- then concatenating these revisions should _not_ create a changeset +-- like +-- changeset_c: patch "a" [id1] -> [id1] + +revs = {} +files = {} + +addfile("testfile", "version 1") +addfile("start_file", "start file") +commit() +revs.base = base_revision() +files.base = sha1("testfile") +files.base_other = sha1("start_file") + +writefile("testfile", "version 2") +commit() + +writefile("testfile", "version 1") +addfile("end_file", "end file") +check(cmd(mtn("drop", "start_file")), 0, true, false) +commit() +revs.new = base_revision() +files.new = sha1("testfile") +files.new_other = sha1("end_file") + +check(files.base == files.new) + +check(cmd(mtn("diff", "--revision", revs.base, + "--revision", revs.new)), + 0, true, false) +check(qgrep(files.new_other, "stdout")) +check(not qgrep(files.base, "stdout")) +check(cmd(mtn("diff", "--revision", revs.new, + "--revision", revs.base)), + 0, true, false) +check(qgrep(files.base_other, "stdout")) +check(not qgrep(files.base, "stdout")) ============================================================ --- tests/schema_migration/1db80c7cee8fa966913db1a463ed50bf1b0e5b0e.mtn.dumped a5d394c98eaa100d8107df53b3f69e9264347088 +++ tests/schema_migration/1db80c7cee8fa966913db1a463ed50bf1b0e5b0e.mtn.dumped a5d394c98eaa100d8107df53b3f69e9264347088 @@ -0,0 +1,307 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA//NUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA//NUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA//NUMOVKMykz5OICAJpHQpEKAAAA +'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a','H4sIAAAAAAAA/0szLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAA/0szLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAA/0szKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAA/0szKTPiAgCLs8DyBQAAAA== +'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch','dGVzdGJyYW5jaDE= +','address@hidden','CjgQqP1r/1DVkgSCaz7jKvgdPJ1WJ3EbC8jyeARxqs2w1tgM7iAGNs0961Y8+rBVZuCBcGLl +S/W1F1ZVAlseVT2NmBVOhu0OlmWhZ2V1JPklyIkFk3krJjSJxP1bt8D6IHCVxxdnhEDUrf8O +Cc4Z0gOzDznJ2qUnFfM3ZZUCAjI= +'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date','MTk5OS0wMS0wMVQxMjowMDowMA== +','address@hidden','ZBHfnu/Gi6S90RN4GpIuQsflSL2JPU3QISuVIejxWCxK54V6zieOZ6ZHI8GECfWCqJWtD3L+ +wFEhpgg3oSSsZrQRM8mdpqZM5sTEOKja5td72dPkISp0ysJE4KLmuDVv88aSCrcsXDxyEZU8 +jUEGaii+JwAfFdP4OTrfL2sH1JI= +'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','HZsa3yyBrQGi+Gl4/jL6pJhrjz6ef3ASrg6YNjONW5ypegj2DIcZpQN4jLGJGKzTPQUI+RBg +SFn3G2dTEA1T/ul8STkuIc/mqZmKvMeMPStq3ezjSKYCyLey5QbTvm0HkpISY3nTmsXetcsc +mhBDuUA9GjZHgj9CIEVOrYfkKQc= +'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog','YmxhaC1ibGFo +','address@hidden','NKIdKEogyd3DKwjJfUk0BoqfgRfE8e5HrRahLsMSf/j6XD8XQ00qVW9hmrn/CaBTdByZ5ZZu +TH+ByLcXDAHVhITHYaRALxTx34Wl+GpPBdguXgI3hgy5V+FI9JN1m2cBl89nkVG6GW0o78nG +Fo1x73vpmYqa5WPWwCrAOwJm7ZQ= +'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey','c29tZXZhbHVl +','address@hidden','GAfv6ovoLebquWhqqUnZmHCpnzdLCfneH4mWmfIajdivhBu+hPFV6yi++xSv83crepDtVJYe +Fd1RI50PYZntUF4rzW3JOOlJlwAhairzx0saEpHJiSY+zBLNXDWbsFRnDwWwACd5TsSwdPVV +AF4ZtPvUfCg2oG4qinL+JoUNcWI= +'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch','dGVzdGJyYW5jaDI= +','address@hidden','l8RLneTmbvJraUlwzqqNi4pjoMDIV4rQlR2ShOIbmFR1FjyOvRaN6Q4rj36kYaeMlVasCjHR +K5dMMnmhEGcjwUmtc6z4+HKbvO5BjbHC7HeMsc7e+nKpz94cmbVVT0fJ5/vCqzI3awnKi3jT +9TT9v384x5OTWhukmV7C7VSwrns= +'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date','MjAwMC0wMS0wMVQxMjowMDowMA== +','address@hidden','L77126IRXEDbZjhtv5FFNoTF2zxZdCTWMb0r9X2FD//BX5uPPfQLR70dk19KzkZPHcWzNyRd +iwcSYJmDSuV7blTtLvrvG66RjLcZRHJdrBL6u7heyhMqL+7lWJq273aFvvP+XjbuJq5LbXyr +jQeu69/Demh7LWJlnzfwel4KUgo= +'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','hqMs692uyOaM7i3vI71OrU/0Y0a+wmFBnIs5kfH/iJqH7phcRYm34WDFFnZCLaKuBkzaj5wu +6ftkEPwNYFwlhzKzoGf1XkNGj50vGuo2ZR7ksAO6gtQLhU8FSBUhc1im6tmBvFDWQa0h9J9g +b4mifWttew/gS8b5Sv3pq4FxewI= +'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog','YmxhaC1ibGFo +','address@hidden','MprtSWnltZ1+tRKIwOku8QM0+yJA1x22UiFuDgnF3iVuR3lePSNWilzObMzGuYRLvbJ5fXY9 +blnKDPZe8JlCQVgamunYCjpok4u8SEcSa0abGvCPSfIjX8UY4YBY+hNj0zmQBfrVvOORwSVR +SUQmoqylhIUgDr1+azI7w8OgEXM= +'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch','dGVzdGJyYW5jaDE= +','address@hidden','aOq1Ecb9GZfbcUHQyRcbLa+AeEs4dfnAUyP008eIYkt2tX+nHgoEPiY8k87cpo8KurjDZlt7 +6Rjom0NEH8vkfml57WbcejYxq/7TSG7qlIiQ0uKmkON+sT6MR8k+1yCcmkK4e0pjfCtK/TCh +Ac7oy1iF0WgbfS6dmQ3zPpmqrGI= +'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date','MjAwMS0wMS0wMVQxMjowMDowMA== +','address@hidden','CKFR6o8w5ewVdO27QwTs2Q0MvnZSWWtWrnJO/FNGre0CTpVwAo0cj1ZfAt4oQYN9+bYOiFJv +so886hP7b65h/gQlBjY4hVTKgsXfW+CYhJcO/xicA8dSuHyGQMqWzd0wKkORRassF8FYQ7aN +w9I2aW54oWHc5kYHlnkNnFcnxCw= +'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','OsgLCmG7U9ZPHM4QgiwNFHB9taJmo1F08bCNXO7vUNhTJygeR6by6jlxIZzZLdVwlDZ2QlNY +l4KluIftqFpYj81w0gxA0cNgf2YSfpLDUU6YlsmvjtGhUDu8m2EX46oDhWC+kV1uDhQjuZQW +niDaS0V3tAr7151DiBU4CivDoCM= +'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog','YmxhaC1ibGFo +','address@hidden','CZdbbLXvcETdez6wt9Jz1l+IX5b8xOcEcgNNO4IhE5qL92jY0uJYD19YT7krv4wSEyqGr+UM +vS71Lns1A87MnvaaYqLDzWJKLfpKCTLbXmvXkxVFot+d1NjrapHyxDWkzsWYvpMDv+QsLFjB +JYBFpdy5EDj1g5cKN2+dbYojLWg= +'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date','MjAwMi0wMS0wMVQxMjowMDowMA== +','address@hidden','DPd17dv2lhHUrM5XBA5/28ygytUeoHs12/SDB9mzoUpfSByEAgR6ONCy8RRcboz58V/5sc02 +gMDwaQ6VFpMqeQs8mQ1ng/Y3RCbPhgDwilatA4vrn7bn4J3vxuTr8giy9m1R6EDAGIdLBt6y +shx9joHN4G7zutOmRgtr7U5xYUY= +'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','bKe9iSJ7+z3xoq1GqC4VvO4DqnIaYKK3EGdXPxtk4xRdIGNkNRbcwIr9+YvxknZaCBhyDJQy +q+5Smfw34N59CEO5CcfylWcAS4gcpmjDNWFMDDxGxof/vN+OwDQTNFRpAn6PVPnuHbKkBs6J +F3fuS5ooLxfVLKF6Iu8ljXcyPtI= +'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch','dGVzdGJyYW5jaDE= +','address@hidden','l2qifuBN5jBbGr04fu/xC7HGbp1h890kboHv7VVw+rejuWM46DLluAE4NaoaE1qxlAZmWiCV +l382q/q9vAR4nWFkmsXInj1myKGyvK2CHpTtaxDSUAORNnrkYOOc4uSbjRWuiQtefhSUNWyx +1WgxAsCSsEksUkE3gntXBcGZ5Mw= +'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzgxNzIyYjAyMzYz +MDM2ODVlMzQxZTE2ZjAwNzNkNjY1MDkwZmI3MykKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgNDNhMjIzNTYxNjQ1MmRjYTc0ZWVjZjM5ZDY0NWE2OWRhOGUw +YmRkMCkK +','address@hidden','ilQqoBOBBjdPbRC0UOplwSuv1wHAv4HKAyZL40QspeWv/qlG3fqYZTRfOcXiG/Ey43/lRUPg +Q9KqaNmDAfD1sQzBLiWmpdi31Qdzb2XI383VSc2kZxwwrK7GzCc7WXTWW6Mm9vyUb7N4Xo1U +Tc7Y3obkFE+VPmYLTjD+6S1xwf0= +'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch','dGVzdGJyYW5jaDM= +','address@hidden','AgZdq7S2Skb6vekOGl/GknzDlVsCsQShdAClWGSjxfNeu8ISaO91MgFXeT1QQZZ9Vmu2ln9H +8YFu5NlAlcgL1xX2d8JMTDadlnk48xWxKhLS2pKNpFzfA5LS6yO5t2NOVGEI5016SfU3UWxD +pWg/TyjvXAl9LHkve8bT2k6wGek= +'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date','MjAwMy0wMS0wMVQxMjowMDowMA== +','address@hidden','O3ORIe1YVt/fEz0uHf4wZKZ2K7HfjGJHeSPyhf1RGfdSCv2pfWhfGlfagM2V1Lzsyl4TkikZ +YS+H+6sC6FbN32zpeE/9+iisdaRHGACWXdOebKWdEJaBGRTNc6w3ablmkhvXAqK36FjFJSbj +wD1XGZbqq/VilnTZ5cr5GqYRGNs= +'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','H/C6jJ1fyAdu3QF+rLt3FuhWJm5lsapfV8mYkETKuu2gjbTecx3So8MCsP2WhE+Itvc7LMu4 +j0oAk9VePu5q4o1h3x5Nezc8zx9L2igJqko9HFenu6QAj3SbE6AUMYNolk+nmAj/jUPvT3R8 +1/+SlGe42S1TzlDxTv8Exk7UcUY= +'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog','YmxhaC1ibGFo +','address@hidden','Xrbz1t1qJYpFKoWfRP1ijeGXiS3Y0Mxy/oc54CvZ1x+yBicMSPldPb7GZsLklb8du939pUuv +jtKDDdK/nm5Byo+svmz6eP0orqLJIh5VIAmY9tN8h78eMdLrm+yUmN41OwVxHv3oNrUbwo3S +euGYk7NjxhWm+XFPoQbayRLZfgM= +'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe'); +INSERT INTO revision_roster VALUES('c81722b0236303685e341e16f0073d665090fb73','330548314b7c980863e65195d0f82aab4cd7e355'); +INSERT INTO revision_roster VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28'); +INSERT INTO revision_roster VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','74185a2d2c138df730096e0e92b8e43dfec2aa94'); +INSERT INTO revision_roster VALUES('75810233cc39b62341d669b610e9416fd6352869','c8b35398ca2282fb9b893c47245920870a475c4b'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','H4sIAAAAAAAA/32PUYrDMAxE/3MK4xM4jq3YZynFKJYEZlMHUjfL3n6dFko/lv0bCc2bkWz7 +DVs6eL+XrSo96mGo/J1uWIvwvanL6HkiDxkmycYAGRcEA2UHQnbx3rEQxjBfh2FbKe18lCfq +0hdIlKjsSuuXlrKy0q1zT9WzVN5q49pjMGaczQhxRkI2AEvsWTPiskxGDIF1HqLN179I9pM0 +gUQbnKEsgtYacIslimyCCzS6yXfcnP1JUurO7WynsLVes3dNX/yjhwPXR+eXWlrBNT1H/b7/ +fOBlfG/+s/8CTv6BAGwBAAA= +'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73','H4sIAAAAAAAA/1VQW27EIAz85xQoJwADBs4SrSKDjRo1m1QJ3aq3b7KV+vgbeeR5tW2/U58e +sh/zturBDkqt8jHdaZ2bHF2PJTp0JMBRPGAhSGDAJK4tBrKlXhQbgJtS28LTLo/5KTWW5jEJ +VgCWmsE4aui9JY4MpiBxomZ8pvORmKc2L6KHfnpeyA1K123tsl4RihC3JC54SDVLcM5JtJUa +hBSsz8kZlIKn0hv1+vIrc9bRbd/ueqRcKRqLORKTGMSSkU0kKsWZZhjBB8xQb0pr3Tc9ss+Q +G3hkcBSsFMKYM6YgkFqmYmIsPrkrfl2E9v+m1Pvfy/Qqn+eyWh/S9fDD87x/Mw9a3s/21/JP +OKgvDhQZ/pkBAAA= +'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','H4sIAAAAAAAA/0XPQW7EMAgF0H1OYeUEGGNinyWqImxAjTSTVJloev263XTH5r//8fN6yr29 +7Xrt5xHmOE/TYd/bU47d7XWH1UDRoqbc2oIgtWBsS+kZIRfmxtAxdVzixzSdD90ue+9/1Nqc +uBh3RLVeEZI4E0XRRREaixZxoCojKKqb7w8L8z06fy+ap9DP47ZjTIBaqHTiFGUs6JE5EXku +gsnNgIQ7EwsN6Uvu/vnP4GD8Op9hTewVC4F2d0EEpoaq1WDQGillcFh67h9TCOE+w+pVcyxC +FhOU3qxkSE21eF5Ki6xGBAvV8fcPP3EP60QBAAA= +'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','H4sIAAAAAAAA/22S3Y4bIQyF7+cp0DyBwcaYZ4lWkcFGjZrNVJNpqr59yVba3f7cGSzOOf7M +2PZXPc4P3++X7RbWuC7LzX+cX/V2GX4/wql6qzU69gaxinjuERhLL2OwcSQRGZIgvizLdrXz +7o/Lm9SJUFPCzJEpJ+tayL0PrDbPytVUHJoZzIdqdh6Xq4f1mJ7PCtcl9O12+G1GaM3Vhjhm +StKrZ0T0EruOlCVHqoLA3ngqfdOjf/mQmeOEsW+v4aR1JoDItaipA3OrbFBUW0MYYJwoc039 +ZQkhHFs4GdVURyK2hJqjN+VSK0v2JKNqg1IaCeo07VfX/U9TPY7PN+ev/nOSDeHuR1jf+3bZ +f3ceev0+p3+SfyvXv2F2iSWlBgkZAZ8pkKJHHgAFjTlDhdEK/hcmfYYJVUg6MUZNoD0yI9HI +ogmHO5ByZ2Klf2Gmd5jIoyYhsD7GXDIwtWRWHaa0RcI8iZaeP2COajmKkkcE6c0lA87dy8hF +WmRzIihU5yf6Bb/ZGwSRAgAA +'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869','H4sIAAAAAAAA/0WOS27DMAwF9zqF4BNQFkVRZzECg5JI1IA/hSMk12/aTbcPmJln133IWF96 +P7fr9FOYnDv1vR5ybqbP4ZeeEDkkwciZGCDWZia1citSsWsWxgIED+euva+3vrY/1YIS5owW +E4dZqCSNKTfS3HLrBIZYDJp0+YBddx3qp/Ep2rbr74tvGe3rf8LJebuvwy9QGLkhxSAzSAtE +EdESyxxNFVCoEZLgw3nvx+WXoE0JCnGxWpDmrnPKgUKATKVKD8Kg3PnhfgC2AzoCDgEAAA== + +'); +CREATE TABLE roster_deltas + ( + id not null, -- strong hash of the roster + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','330548314b7c980863e65195d0f82aab4cd7e355','H4sIAAAAAAAA/5WPTWoDMQxG9z6F8AkkjSOP11n1DCEM8h+YTKaQuIXevjN0GgLdNFoJCX1P +7wgIMpo38KYtrTedzRE8AQ2HdUijM7E6GYsk5lxSYBy0inOk2WfGKJpHreiCno2BvWqbC9he +7n3ryP4s0vvSy9LhpCGpR5LgNWtBkRgko1eNccCKWdgdJHA6/wa2vN1Ztg+C9n57IkyX8mXB +7gbTp84fZfUYvAPizY6IXxDZAdNVb5c/lNN/c9YHhBywBPMNbVnlwmYBAAA= +'); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','H4sIAAAAAAAA/xXLsRUEIQgFwJwqKAHxixpvtEVsgCD9l3DvJp+HhW0avQyhbrV1QTKqXFUM +RzP3lYWVDX1IyYwR9PBsxg3j/5ROwda1UM0bW6V7GdA8Z6oc81xegu0f0Q+YPBTccAAAAA== + +'); +INSERT INTO roster_deltas VALUES('cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/5WPTWrEMAxG9z6F8AksWSPH61n1DMMQ5D8wk6Yw4xZ6+yY0LYVuWq0+JKSn +dwYHMpknCKavfXRdzBkCAvrT1sSJTWosU5VMVGqO5Lw2YUYtoZBLomXS5jjq1Rg4qvWlgh31 +MfaE9nOQX9ZR1wEXjVmDQ4lBi1YnkqIUF1RT8q65IsQniZSvXwd72fcs2W+CjnH/QZhv9d2C +PQzmN11e6+bhAwPSbodI/xA5APOz3m+/KJe/3tkeEGSgSFtCDB6I2XwA8hU3MHEBAAA= +'); +INSERT INTO roster_deltas VALUES('330548314b7c980863e65195d0f82aab4cd7e355','74185a2d2c138df730096e0e92b8e43dfec2aa94','H4sIAAAAAAAA/yXLsREDMQgEwFxVUAJC6B7ij1wGAtF/CfaMN9+XmLAxPqQ8FtrFlCu7Q4Sh +R6r8sqnV1LW5+cmd4yU4aOr+v9MKu0iRuunCKxqqM+op4YMoi2b1+D2zSQIfX8XZRk14AAAA + +'); +INSERT INTO roster_deltas VALUES('74185a2d2c138df730096e0e92b8e43dfec2aa94','c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/03NPW7DMAyG4V2nIHwC/omS5kw9QxEYtH6AII0DJFp6+9rtUm4c3ue7AAIn +Ch9AKIGWAOfV5z77PuGzaeEyWK2xeKS+uaVSLMfOeRTfMKVNs/j1rwO4tbNbeAnt+Xr4Plef +8wXL7O85bl+d1nv/DhcQjUCcj12LoWZKzBuymKCcuih1soGYpJlFLDi2JL8rp7c+/HX/hx4g +lQLGcoCKAUvWXNWEnNErmYnqiNlZRu+obtXUXI8uGwNpPDsOKs4s0cg0cquetPc6pLTjdyvN +c8etNbyG8APg9u/sOQEAAA== +'); +CREATE TABLE rosters + ( + id primary key, -- strong hash of the roster + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('c8b35398ca2282fb9b893c47245920870a475c4b','H4sIAAAAAAAA/6WSYWojMQyF/+cUw5xAsmxZPksIQbZlOrRNymTaZW9fJ00oGVhIt/4l+fGM +3ie34/yqy/7D5tN0PAwjjpvNcDl1modxvDRTtcNy0S6KLkuXur5/tr/jMB7sz/5DX97tS8/T +vDwN29w8i3FxrlpJDkgbe49aY3WQWatoA590t3nT5Wn/qvPzT0znIb5M35Nsi2B0LoMjJiCW +YOTRkBtApMocIEHLkXa3kMPQphcbxsVOy7ly14jleFjOmbct1YCi3pBASjYJQLlWaSFKRq7m +PUSfcHd78MqKxtvFj3F0z38Ruc589XlS5ygwsg+uFo3erDRKtffKqaoY9CDwTxS0RpGzaW1i +FLyTkiwQkUUs2lyQgD4JAVvmNQq/RvH4lu5RPO67R/HrX+HXKNCKMSSW1HLy3FfjQkRGhMgp +a0UVMKmyRhHWKB7f0j2Kx333KGIQ7ByoFEqZXefQ8/cKwZLvRCpTcMJpt/kEwROOuxkEAAA= + +'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +COMMIT; ============================================================ --- tests/schema_migration/9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df.mtn.dumped 484712edf1c56f3aaef06cb5b42df25abcdd74bf +++ tests/schema_migration/9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df.mtn.dumped 484712edf1c56f3aaef06cb5b42df25abcdd74bf @@ -0,0 +1,153 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- compressed rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('a9ca701697adae066b96d07aabb30f0d6245692c','d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000fff35430e54a332c33e4e20200eac8a2590a000000'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000fff35430e54a332a33e4e202003ab2021e0a000000'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000fff35430e54a332933e4e202009a4742910a000000'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed contents of a file + ); +INSERT INTO files VALUES('d4929f246d23a51eba6799685e28f9ab077b483a',X'1f8b08000000000000ff4b332c33e20200b9431ec505000000'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6',X'1f8b08000000000000ff4b332e33e40200f1d83a4405000000'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491',X'1f8b08000000000000ff4b332a33e2020057ecabd705000000'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8',X'1f8b08000000000000ff4b332933e202008bb3c0f205000000'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('5'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden',X'30819d300d06092a864886f70d010101050003818b0030818702818100b9e2f563aeba98a137cf4e05a6e89a6e2fe90e11170dd8e49c06c5aae9c6f85a6de79729b056a249cb0aba71b7f28146309aaca244b3f1468b1f2c6bb6dbc02113368ce096c01f5a6083b0b0bef55d7c74573405c43203bcf6006392479cc4b8b853f4faec3acb8e444f0229428162d936ff1878e1bd5c03de816cabee1340f7020111'); +INSERT INTO public_keys VALUES('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden',X'30819d300d06092a864886f70d010101050003818b00308187028181009f37f70031a6e06fa4fb9bc92c1a7a50ecb3ba84e76773fed5ca2beb446b66a70488b658e1b756e680b405dfb2a248fa0c10351bd6cb5f2b168cb188b2f224f2a10f8cd845453f7ee7dabb67359d07a15710776b11b027ab40587d9ec9513f29a59105d494e88d14de9194535c76392e72a35ef98a2b157db5118c3b5ee4f95f020111'); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +INSERT INTO revision_ancestry VALUES('','bf468e6c22dec9203af6441ad7d20b6ad8af049a'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','c81722b0236303685e341e16f0073d665090fb73'); +INSERT INTO revision_ancestry VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','43a2235616452dca74eecf39d645a69da8e0bdd0'); +INSERT INTO revision_ancestry VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('c81722b0236303685e341e16f0073d665090fb73','4a1274f35812a695e357c6e7c7cd60f449f0cada'); +INSERT INTO revision_ancestry VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','75810233cc39b62341d669b610e9416fd6352869'); +CREATE TABLE revision_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with revisions.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +INSERT INTO revision_certs VALUES('6f938572483d4f73bf952c3666dace09f95ebd50','bf468e6c22dec9203af6441ad7d20b6ad8af049a','branch',X'746573746272616e636831','address@hidden',X'0a3810a8fd6bff50d59204826b3ee32af81d3c9d5627711b0bc8f2780471aacdb0d6d80cee200636cd3deb563cfab05566e0817062e54bf5b5175655025b1e553d8d98154e86ed0e9665a167657524f925c8890593792b263489c4fd5bb7c0fa207095c717678440d4adff0e09ce19d203b30f39c9daa52715f3376595020232'); +INSERT INTO revision_certs VALUES('6ac4524843235b44ca2dfc2696d38f2b90239109','bf468e6c22dec9203af6441ad7d20b6ad8af049a','date',X'313939392d30312d30315431323a30303a3030','address@hidden',X'6411df9eefc68ba4bdd113781a922e42c7e548bd893d4dd0212b9521e8f1582c4ae7857ace278e67a64723c18409f582a895ad0f72fec05121a60837a124ac66b41133c99da6a64ce6c4c438a8dae6d77bd9d3e4212a74cac244e0a2e6b8356ff3c6920ab72c5c3c7211953c8d41066a28be27001f15d3f8393adf2f6b07d492'); +INSERT INTO revision_certs VALUES('d77b687d8c619078e80721658a6d99dcfe7e32e5','bf468e6c22dec9203af6441ad7d20b6ad8af049a','author',X'74657374657240746573742e6e6574','address@hidden',X'1d9b1adf2c81ad01a2f86978fe32faa4986b8f3e9e7f7012ae0e9836338d5b9ca97a08f60c8719a503788cb18918acd33d0508f910604859f71b6753100d53fee97c49392e21cfe6a9998abcc78c3d2b6addece348a602c8b7b2e506d3be6d079292126379d39ac5deb5cb1c9a1043b9403d1a3647823f4220454ead87e42907'); +INSERT INTO revision_certs VALUES('2dda1c13436be7c2f10271c210a2bd0c885f313c','bf468e6c22dec9203af6441ad7d20b6ad8af049a','changelog',X'626c61682d626c6168','address@hidden',X'34a21d284a20c9ddc32b08c97d4934068a9f8117c4f1ee47ad16a12ec3127ff8fa5c3f17434d2a556f619ab9ff09a053741c99e5966e4c7f81c8b7170c01d58484c761a4402f14f1df85a5f86a4f05d82e5e0237860cb957e148f493759b670197cf679151ba196d28efc9c6168d71ef7be9998a9ae563d6c02ac03b0266ed94'); +INSERT INTO revision_certs VALUES('c50226beb7e3d289d38e9f613021c380f89ab011','bf468e6c22dec9203af6441ad7d20b6ad8af049a','somekey',X'736f6d6576616c7565','address@hidden',X'1807efea8be82de6eab9686aa949d99870a99f374b09f9de1f899699f21a8dd8af841bbe84f155eb28befb14aff3772b7a90ed54961e15dd51239d0f6199ed505e2bcd6dc938e9499700216a2af3c74b1a1291c989263ecc12cd5c359bb054670f05b00027794ec4b074f555005e19b4fbd47c2836a06e2a8a72fe26850d7162'); +INSERT INTO revision_certs VALUES('628a294256cbb30fa29665cba0ce9a58c02e57b0','c81722b0236303685e341e16f0073d665090fb73','branch',X'746573746272616e636832','address@hidden',X'97c44b9de4e66ef26b694970ceaa8d8b8a63a0c0c8578ad0951d9284e21b985475163c8ebd168de90e2b8f7ea461a78c9556ac0a31d12b974c3279a1106723c149ad73acf8f8729bbcee418db1c2ec778cb1cedefa72a9cfde1c99b5554f47c9e7fbc2ab32376b09ca8b78d3f534fdbf7f38c793935a1ba4995ec2ed54b0ae7b'); +INSERT INTO revision_certs VALUES('70c013d2ba0e97f5e706dcc27e8eb32920f09c6f','c81722b0236303685e341e16f0073d665090fb73','date',X'323030302d30312d30315431323a30303a3030','address@hidden',X'2fbef5dba2115c40db66386dbf91453684c5db3c597424d631bd2bf57d850fffc15f9b8f3df40b47bd1d935f4ace464f1dc5b337245d8b07126099834ae57b6e54ed2efaef1bae918cb71944725dac12fabbb85eca132a2feee5589ab6ef7685bef3fe5e36ee26ae4b6d7cab8d07aeebdfc37a687b2d62659f37f07a5e0a520a'); +INSERT INTO revision_certs VALUES('e70e1cc3843fe732d6ee20d25749f98c8862166b','c81722b0236303685e341e16f0073d665090fb73','author',X'74657374657240746573742e6e6574','address@hidden',X'86a32cebddaec8e68cee2def23bd4ead4ff46346bec261419c8b3991f1ff889a87ee985c4589b7e160c51676422da2ae064cda8f9c2ee9fb6410fc0d605c258732b3a067f55e43468f9d2f1aea36651ee4b003ba82d40b854f054815217358a6ead981bc50d641ad21f49f606f89a27d6b6d7b0fe04bc6f94afde9ab81717b02'); +INSERT INTO revision_certs VALUES('55d537c81d3e6db852813076cbb476aa7bfb8e6d','c81722b0236303685e341e16f0073d665090fb73','changelog',X'626c61682d626c6168','address@hidden',X'329aed4969e5b59d7eb51288c0e92ef10334fb2240d71db652216e0e09c5de256e47795e3d23568a5cce6cccc6b9844bbdb2797d763d6e59ca0cf65ef0994241581a9ae9d80a3a68938bbc4847126b469b1af08f49f2235fc518e18058fa1363d3399005fad5bce391c12551494426a2aca58485200ebd7e6b323bc3c3a01173'); +INSERT INTO revision_certs VALUES('b8207be46ed175205466998210bab3b6c30fa06b','43a2235616452dca74eecf39d645a69da8e0bdd0','branch',X'746573746272616e636831','address@hidden',X'68eab511c6fd1997db7141d0c9171b2daf80784b3875f9c05323f4d3c788624b76b57fa71e0a043e263c93cedca68f0abab8c3665b7be918e89b43441fcbe47e6979ed66dc7a3631abfed3486eea948890d2e2a690e37eb13e8c47c93ed7209c9a42b87b4a637c2b4afd30a101cee8cb5885d1681b7d2e9d990df33e99aaac62'); +INSERT INTO revision_certs VALUES('c2e926d430da9903c918ee15b2b2dfe99ee58463','43a2235616452dca74eecf39d645a69da8e0bdd0','date',X'323030312d30312d30315431323a30303a3030','address@hidden',X'08a151ea8f30e5ec1574edbb4304ecd90d0cbe7652596b56ae724efc5346aded024e9570028d1c8f565f02de2841837df9b60e88526fb28f3cea13fb6fae61fe04250636388554ca82c5df5be09884970eff189c03c752b87c8640ca96cddd302a439145ab2c17c15843b68dc3d236696e78a161dce6460796790d9c5727c42c'); +INSERT INTO revision_certs VALUES('eaa39fc163b0d38cded5270f60bc9570e7f4e1b0','43a2235616452dca74eecf39d645a69da8e0bdd0','author',X'74657374657240746573742e6e6574','address@hidden',X'3ac80b0a61bb53d64f1cce10822c0d14707db5a266a35174f1b08d5ceeef50d85327281e47a6f2ea3971219cd92dd5709436764253589782a5b887eda85a588fcd70d20c40d1c3607f66127e92c3514e9896c9af8ed1a1503bbc9b6117e3aa038560be915d6e0e1423b994169e20da4b4577b40afbd79d438815380a2bc3a023'); +INSERT INTO revision_certs VALUES('9d9472e1be171031fee0ff82f41d752e8124742e','43a2235616452dca74eecf39d645a69da8e0bdd0','changelog',X'626c61682d626c6168','address@hidden',X'09975b6cb5ef7044dd7b3eb0b7d273d65f885f96fcc4e70472034d3b8221139a8bf768d8d2e2580f5f584fb92bbf8c12132a86afe50cbd2ef52e7b3503cecc9ef69a62a2c3cd624a2dfa4a0932db5e6bd7931545a2df9dd4d8eb6a91f2c435a4cec598be9303bfe42c2c58c1258045a5dcb91038f583970a376f9d6d8a232d68'); +INSERT INTO revision_certs VALUES('884d60e16e31cf3621191bd2dab0caf39a0283fe','4a1274f35812a695e357c6e7c7cd60f449f0cada','date',X'323030322d30312d30315431323a30303a3030','address@hidden',X'0cf775eddbf69611d4acce57040e7fdbcca0cad51ea07b35dbf48307d9b3a14a5f481c8402047a38d0b2f1145c6e8cf9f15ff9b1cd3680c0f0690e9516932a790b3c990d6783f6374426cf8600f08a56ad038beb9fb6e7e09defc6e4ebf208b2f66d51e840c018874b06deb2b21c7d8e81cde06ef3bad3a6460b6bed4e716146'); +INSERT INTO revision_certs VALUES('2724dd7883fb44a58d40eba12808ed5b9e09f7b6','4a1274f35812a695e357c6e7c7cd60f449f0cada','author',X'74657374657240746573742e6e6574','address@hidden',X'6ca7bd89227bfb3df1a2ad46a82e15bcee03aa721a60a2b71067573f1b64e3145d2063643516dcc08afdf98bf192765a0818720c9432abee5299fc37e0de7d0843b909c7f29567004b881ca668c335614c0c3c46c687ffbcdf8ec03413345469027e8f54f9ee1db2a406ce891777ee4b9a282f17d52ca17a22ef258d77323ed2'); +INSERT INTO revision_certs VALUES('1288aa1a3c351fd0528aa95ddaae309cc5eec3e2','4a1274f35812a695e357c6e7c7cd60f449f0cada','branch',X'746573746272616e636831','address@hidden',X'976aa27ee04de6305b1abd387eeff10bb1c66e9d61f3dd246e81efed5570fab7a3b96338e832e5b8013835aa1a135ab19406665a2095977f36abfabdbc04789d61649ac5c89e3d66c8a1b2bcad821e94ed6b10d2500391367ae460e39ce2e49b8d15ae890b5e7e1494356cb1d5683102c092b0492c524137827b5705c199e4cc'); +INSERT INTO revision_certs VALUES('27e8a71b0fa56a551e72aed26861ba404d02fd32','4a1274f35812a695e357c6e7c7cd60f449f0cada','changelog',X'70726f7061676174652066726f6d206272616e63682027746573746272616e636832272028686561642063383137323262303233363330333638356533343165313666303037336436363530393066623733290a202020202020202020202020746f206272616e63682027746573746272616e636831272028686561642034336132323335363136343532646361373465656366333964363435613639646138653062646430290a','address@hidden',X'8a542aa0138106374f6d10b450ea65c12bafd701c0bf81ca03264be3442ca5e5affea946ddfa9865345f39c5e21bf132e37fe54543e043d2aa68d98301f0f5b10cc12e25a6a5d8b7d507736f65c8dfcdd549cda4671c30acaec6cc273b5974d65ba326f6fc946fb3785e8d544dced8de86e4144f953e660b4e30fee92d71c1fd'); +INSERT INTO revision_certs VALUES('5b44cd5cd32f3e8f268ac1cd30ccfa27d16667c6','75810233cc39b62341d669b610e9416fd6352869','branch',X'746573746272616e636833','address@hidden',X'02065dabb4b64a46fabde90e1a5fc6927cc3955b02b104a17400a55864a3c5f35ebbc21268ef75320157793d5041967d566bb6967f47f1816ee4d94095c80bd715f677c24c4c369d967938f315b12a12d2da928da45cdf0392d2eb23b9b7634e546108e74d7a49f537516c43a5683f4f28ef5c097d2c792f7bc6d3da4eb019e9'); +INSERT INTO revision_certs VALUES('b0f324986982bdf443036f061977a7895ae94f84','75810233cc39b62341d669b610e9416fd6352869','date',X'323030332d30312d30315431323a30303a3030','address@hidden',X'3b739121ed5856dfdf133d2e1dfe3064a6762bb1df8c62477923f285fd5119f7520afda97d685f1a57da80cd95d4bcecca5e13922919612f87fbab02e856cddf6ce9784ffdfa28ac75a4471800965dd39e6ca59d1096811914cd73ac3769b966921bd702a2b7e858c52526e3c03d571996eaabf5629674d9e5caf91aa61118db'); +INSERT INTO revision_certs VALUES('7a8a589d30fc17ee317ff9bacecac0d30524003a','75810233cc39b62341d669b610e9416fd6352869','author',X'74657374657240746573742e6e6574','address@hidden',X'1ff0ba8c9d5fc8076edd017eacbb7716e856266e65b1aa5f57c9989044cabaeda08db4de731dd2a3c302b0fd96844f88b6f73b2ccbb88f4a0093d55e3eee6ae28d61df1e4d7b373ccf1f4bda2809aa4a3d1c57a7bba4008f749b13a014318368964fa79808ff8d43ef4f747cd7ff929467b8d92d53ce50f14eff04c64ed47146'); +INSERT INTO revision_certs VALUES('98640622c14a2ecbe23b7251b960d8bc78dec4a2','75810233cc39b62341d669b610e9416fd6352869','changelog',X'626c61682d626c6168','address@hidden',X'5eb6f3d6dd6a258a452a859f44fd628de197892dd8d0cc72fe8739e02bd9d71fb206270c48f95d3dbec666c2e495bf1dbbddfda54baf8ed2830dd2bf9e6e41ca8facbe6cfa78fd28aea2c9221e55200998f6d37c87bf1e31d2eb9bec9498de353b05711efde836b51bc28dd27ae19893b363c615a6f9714fa106dac912d97e03'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a','e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe'); +INSERT INTO revision_roster VALUES('c81722b0236303685e341e16f0073d665090fb73','330548314b7c980863e65195d0f82aab4cd7e355'); +INSERT INTO revision_roster VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28'); +INSERT INTO revision_roster VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada','74185a2d2c138df730096e0e92b8e43dfec2aa94'); +INSERT INTO revision_roster VALUES('75810233cc39b62341d669b610e9416fd6352869','c8b35398ca2282fb9b893c47245920870a475c4b'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf468e6c22dec9203af6441ad7d20b6ad8af049a',X'1f8b08000000000000ff7d8f518ac3300c44ff730ae313388eadd86729c52896046653075237cbde7e9d164a3f96fd1b09cd9b916cfb0d5b3a78bf97ad2a3dea61a8fc9d6e588bf0bda9cbe879220f1926c9c6001917040365074276f1deb110c6305f87615b29ed7c9427ead2174894a8ec4aeb9796b2b2d2ad734fd5b354de6ae3da6330669ccd0871464236004bec5933e2b24c460c81751ea2cdd7bf48f6933481441b9ca12c82d61a708b258a6c820b34bac977dc9cfd4952eaceed6ca7b0b55eb3774d5ffca38703d747e7975a5ac1353d47fdbeff7ce0657c6ffeb3ff024efe81006c010000'); +INSERT INTO revisions VALUES('c81722b0236303685e341e16f0073d665090fb73',X'1f8b08000000000000ff55505b6ec4200cfce7142827000306ce12ad22838d1a359b5409ddaab76fb295faf81b79e479b56dbf539f1eb21ff3b6eac10e4aadf231dd699d9b1c5d8f253a7424c0513c60214860c024ae2d06b2a55e141b809b52dbc2d32e8ff9293596e631095600969ac1386ae8bd258e0ca62071a2667ca6f39198a7362fa2877e7a5ec80d4ad76dedb25e118a10b7242e7848354b70ce49b4951a8414accfc9199482a7d21bf5faf22b73d6d16ddfee7aa45c291a8b39129318c492914d242ac5996618c107cc506f4a6bdd373db2cf901b78647014ac14c29833a620905aa662622c3eb92b7e5d84f6ffa6d4fbdfcbf42a9fe7b25a1fd2f5f0c3f3bc7f330f5adecff6d7f24f38a82f0e1419fe99010000'); +INSERT INTO revisions VALUES('43a2235616452dca74eecf39d645a69da8e0bdd0',X'1f8b08000000000000ff45cf416ec4300805d07d4e61e5041863629f25aa226c408d34935499687afdbadd74c7e6bffff1f37acabdbded7aede711e6384fd361dfdb538edded7587d540d1a2a6dcda8220b5606c4be9192117e6c6d031755ce2c7349d0fdd2e7bef7fd4da9cb8187744b55e1192381345d145111a8b1671a02a2328aa9bef0f0bf33d3a7f2f9aa7d0cfe3b6634c805aa874e214652ce8913911792e82c9cd80843b130b0de94beefef9cfe060fc3a9f614dec150b8176774104a686aad560d01a296570587aee1f5308e13ec3ea55732c42161394deac64484db5785e4a8bac46040bd5f1f70f3f710feb44010000'); +INSERT INTO revisions VALUES('4a1274f35812a695e357c6e7c7cd60f449f0cada',X'1f8b08000000000000ff6d92dd8e1b210c85efe729d03c81c1c69867895691c1468d9acd549369aabe7dc956daddfedc192cce39feccd8f6573dce0fdfef97ed16d6b82ecbcd7f9c5ff576197e3fc2a97aab353af606b18a78ee11184b2f63b0712411199220be2ccb76b5f3ee8fcb9bd4895053c2cc912927eb5ac8bd0fac36cfcad5541c9a19cc876a761e97ab87f5989ecf0ad725f4ed76f86d4668cdd58638664ad2ab6744f412bb8e942547aa82c0de782a7dd3a37ff99099e384b16fafe1a4752680c8b5a8a90373ab6c50545b4318609c28734dfd6509211c5b3819d5544722b6849aa337e5522b4bf624a36a83521a09ea34ed57d7fd4f533d8ecf37e7affe73920de1ee4758dffb76d97f771e7afd3ea77f927f2bd7bf61768925a5060919019f2990a2471e00058d394385d10afe17267d860955483a31464da03d3223d1c8a209873b90726762a57f61a67798c8a32621b03ec65c3230b564561da6b445c23c89969e3f608e6a398a924704e9cd2503ceddcbc8455a6473222854e727fa05bfd91b0491020000'); +INSERT INTO revisions VALUES('75810233cc39b62341d669b610e9416fd6352869',X'1f8b08000000000000ff458e4b6ec3300c05f73a85e01350164551673102839248d4803f852324d76fda4db70f989967d77dc8585f7a3fb7ebf453989c3bf5bd1e726ea6cfe1979e103924c1c8991820d66626b5722b52b16b16c602040fe7aebdafb7beb63fd58212e68c16138759a8248d2937d2dc72eb0486580c9a74f9805d771deaa7f129dab6ebef8b6f19edeb7fc2c979bbafc32f5018b921c52033480b4411d112cb1c4d1550a81192e0c379efc7e597a04d090a71b15a90e6ae73ca8142804ca54a0fc2a0dcf9e17e00b6033a020e010000'); +CREATE TABLE roster_deltas + ( + id not null, -- strong hash of the roster + base not null, -- joins with either rosters.id or roster_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','330548314b7c980863e65195d0f82aab4cd7e355',X'1f8b08000000000000ff958f4d6a03310c46f73e85f009248d238fd759f50c210cf21f984ca690b885debe33741a02dd345a09097d4fef0808329a37f0a62dad379dcd113c010d877548a333b13a198b24e65c52601cb48a73a4d967c6289a47ade8829e8d81bd6a9b0bd85eee7debc8fe2cd2fbd2cbd2e1a421a94792e0356b41911824a3578d71c08a59d81d24703aff06b6bcdd59b60f82f67e7b224c97f265c1ee06d3a7ce1f65f518bc03e2cd8e885f10d901d3556f973f94d37f73d607841cb004f30d6d59e5c266010000'); +INSERT INTO roster_deltas VALUES('e63f3fbaa205e1d3117d3ee9b056b1edcd95cbbe','cb81e62f9e18a8b3f16fb714fd8b564813e5ab28',X'1f8b08000000000000ff15cbb11504210805c09c2a2801f18b1a6fb4456c8020fd9770ef269f87856d1abd0ca16eb5754132aa5c550c4733f79585950d7d48c98c11f4f06cc60de3ff944ec1d6b550cd1b5ba57b19d03c67aa1cf35c5e82ed1fd10f983c14dc70000000'); +INSERT INTO roster_deltas VALUES('cb81e62f9e18a8b3f16fb714fd8b564813e5ab28','74185a2d2c138df730096e0e92b8e43dfec2aa94',X'1f8b08000000000000ff958f4d6ac4300c46f73e85f0092c5923c7eb59f50cc310e43f3093a630e3167afb26342d856e5aad3e24a4a777060732992708a6af7d745dcc190202fad3d6c4894d6a2c53954c546a8ee4bc3661462da1904ba265d2e638ead51838aaf5a5821df531f684f673905fd651d701178d59834389418b562792a214175453f2aeb922c4278994af5f077bd9f72cd96f828e71ff41986ff5dd823d0ce6375d5eebe6e10303d26e8748ff103900f3b3de6fbf2897bfded91e1064a0485b420c1e88d97c00f215373071010000'); +INSERT INTO roster_deltas VALUES('330548314b7c980863e65195d0f82aab4cd7e355','74185a2d2c138df730096e0e92b8e43dfec2aa94',X'1f8b08000000000000ff25cbb11103310804c05c55500242e81ee28f5c0602d17f09f68c37df9798b0313ea43c16dac5942bbb4384a147aafcb2a9d5d4b5b9f9c99de3253868eafebfd30abb4891bae9c22b1aaa33ea29e183288b66f5f83db349021f5fc5d9464d78000000'); +INSERT INTO roster_deltas VALUES('74185a2d2c138df730096e0e92b8e43dfec2aa94','c8b35398ca2282fb9b893c47245920870a475c4b',X'1f8b08000000000000ff4dcd3d6ec3300c86e15da7207c02fe8992e64c3d431118b47e80208d03245a7afbdaed526e1cdee7bb0002270a1f4028819600e7d5e73efb3ee1b369e13258adb178a4beb9a5522cc7ce7914df30a54db3f8f5af03b8b5b35b7809edf97af83e579ff305cbecef396e5f9dd67bff0e17108d409c8f5d8ba1664acc1bb298a09cba2875b28198a499452c38b624bf2ba7b73efc75ff871e209502c672808a014bd65cd5849cd12b9989ea88d95946efa86ed5d45c8f2e1b03693c3b0e2ace2cd1c83472ab9eb4f73aa4b4e3772bcd73c7ad35bc86f003e0f6efec39010000'); +CREATE TABLE rosters + ( + id primary key, -- strong hash of the roster + data not null -- compressed, encoded contents of the roster + ); +INSERT INTO rosters VALUES('c8b35398ca2282fb9b893c47245920870a475c4b',X'1f8b08000000000000ffa592616a23310c85ffe714c39c40b26c593e4b0841b6653ab44dca64da656f5f274d28195848b7fe25f9f18cde27b7e3fcaacbfec3e6d3743c0c238e9bcd7039759a8771bc3453b5c372d12e8a2e4b97babe7fb6bfe3301eeccffe435fdeed4bcfd3bc3c0ddbdc3c8b7171ae5a490e481b7b8f5a63759059ab68039f74b779d3e569ffaaf3f34f4ce721be4cdf936c8b60742e832326209660e4d1901b40a4ca1c2041cb9176b790c3d0a6171bc6c54ecbb972d788e57858ce99b72dd580a2de90404a360940b95669214a46aee63d449f70777bf0ca8ac6dbc58f7174cf7f11b9ce7cf57952e72830b20fae168ddeac344ab5f7caa9aa18f420f04f14b44691b3696d6214bc93922c1091452cda5c90803e09015be6350abf46f1f896ee513ceebb47f1eb5fe1d728d08a312496d472f2dc57e342444684c8296b451530a9b24611d6281edfd23d8ac77df7286210ec1ca8144a995de7d0f3f70ac192ef442a5370c269b7f904c1138ebb19040000'); +CREATE INDEX revision_ancestry__child ON revision_ancestry (child); +CREATE INDEX revision_certs__id ON revision_certs (id); +CREATE INDEX revision_certs__name_value ON revision_certs (name, value); +COMMIT; ============================================================ --- tests/schema_migration/__driver__.lua 8e0ee3155b00e70efcd15f5b210330388ddf5b9f +++ tests/schema_migration/__driver__.lua 8e0ee3155b00e70efcd15f5b210330388ddf5b9f @@ -0,0 +1,93 @@ + +-- This test ensures that 'monotone migrate' can take any old-format +-- database and bring it forward to the current time; it is basically a +-- compatibility test. We actually don't test against old-format +-- databases directly, because some old-format databases can't be read +-- at all by a modern monotone -- you have to do a dump/load first. So +-- instead we store pre-dumped old-format databases. So technically +-- we're not checking that 'db migrate' can handle things, we're just +-- checking that 'dump | load; db migrate' can handle things. But that +-- should be good enough. + +-- This means that every time the database schema is changed, you need +-- to add a new piece to this test, for the new schema. The way you do +-- this is to run this test with the -d option, like so: +-- $ ./testsuite -d schema_migration +-- this will cause autotest to leave behind the temporary files the test +-- generates. You want 'tester_dir/schema_migration/.db.dumped'. +-- Copy that file to this directory, and add a line +-- check_migrate_from("") +-- to the end of this file, with the being the same +-- that was in the filename (it's the schema id, if you were wondering). + +-------------------------------------------------------------------------------------------------------------------------------------------- +---- Do not touch this code; you'll have to regenerate all the test +---- databases if you do! +-------------------------------------------------------------------------------------------------------------------------------------------- + +mtn_setup() +-- We don't want the standard db, we want full control ourselves +remove("test.db") +remove_recursive("keys") +check(cmd(mtn("db", "init"))) + +-- Put some random keys in, with and without corresponding private keys +getfile("migrate_keys", "stdin") +check(cmd(mtn("read")), 0, false, false, true) + +addfile("testfile1", "f1v1\n") +addfile("testfile2", "f2v1\n") +check(cmd(mtn("attr", "set", "testfile1", "testfile1_key", "initial_value")), 0, false, false) +check(cmd(mtn("attr", "set", ".", "dir_key", "initial_value")), 0, false, false) +check(cmd(mtn("commit", "--branch=testbranch1", "--date=1999-01-01T12:00:00", "--message=blah-blah")), 0, false, false) +rev = base_revision() + +check(cmd(mtn("cert", rev, "somekey", "somevalue")), 0, false, false) + +writefile("testfile1", "f1v2\n") +addfile("testfile3", "f3v1\n") +check(cmd(mtn("attr", "drop", "testfile1", "testfile1_key")), 0, false, false) +check(cmd(mtn("attr", "set", ".", "dir_key", "new_value")), 0, false, false) +check(cmd(mtn("commit", "--branch=testbranch2", "--date=2000-01-01T12:00:00", "--message=blah-blah")), 0, false, false) + +revert_to(rev) + +writefile("testfile2", "f2v2\n") +addfile("testfile4", "f4v1\n") +check(cmd(mtn("commit", "--branch=testbranch1", "--date=2001-01-01T12:00:00", "--message=blah-blah")), 0, false, false) + +check(cmd(mtn("propagate", "--date=2002-01-01T12:00:00", "testbranch2", "testbranch1")), 0, false, false) +check(cmd(mtn("update")), 0, false, false) + +check(cmd(mtn("drop", "testfile1")), 0, false, false) +writefile("testfile4", "f4v2\n") +check(cmd(mtn("commit", "--branch=testbranch3", "--date=2003-01-01T12:00:00", "--message=blah-blah")), 0, false, false) + +rename("test.db", "latest.mtn") + +if debugging then + check(cmd(mtn("--db=latest.mtn", "db", "dump")), 0, true, false) + rename("stdout", "latest.mtn.dumped") + check(cmd(mtn("--db=latest.mtn", "db", "version")), 0, true, false) + local ver = string.gsub(readfile("stdout"), "^.*: (.*)%s$", "%1") + rename("latest.mtn.dumped", ver..".mtn.dumped") +end + +-------------------------------------------------------------------------------------------------------------------------------------------- +---- End untouchable code +-------------------------------------------------------------------------------------------------------------------------------------------- + +function check_migrate_from(id) + -- id.dumped is a 'db dump' of a db with schema "id" + getfile(id..".mtn.dumped", "stdin") + check(cmd(mtn("--db="..id..".mtn", "db", "load")), 0, false, false, true) + -- check that the version's correct + check(cmd(mtn("--db="..id..".mtn", "db", "version")), 0, true, false) + check(qgrep(id, "stdout")) + -- migrate it + check(cmd(mtn("--db="..id..".mtn", "db", "migrate")), 0, false, false) + check_same_db_contents(id..".mtn", "latest.mtn") +end + +check_migrate_from("1db80c7cee8fa966913db1a463ed50bf1b0e5b0e") +check_migrate_from("9d2b5d7b86df00c30ac34fe87a3c20f1195bb2df") ============================================================ --- tests/schema_migration/migrate_keys 38b5ed1b66100385b6d85b91b6bca07482284a00 +++ tests/schema_migration/migrate_keys 38b5ed1b66100385b6d85b91b6bca07482284a00 @@ -0,0 +1,24 @@ +[pubkey address@hidden +MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ== +[end] +[keypair address@hidden +MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ==# +MIICyTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIefgT/1vcuRoCAggAAgEYMBQG +CCqGSIb3DQMHBAjBYTCc+TuEIQSCAoDbSxK5UeaBREeMlP8ZBFihsxyapmrUs/ZYbieJIq+j +ZQJ+OX15hzpbk2/jqfUgYaV7uFBf8JVglWLw6SfQe3KrvFEH1K3FsIIVf2SzEvERiWUd9YuT +P6pxTwT0zUbyiKQJl+43BSYb8UWRBOsuAAJXUJ1KPRSd9BYSvysmc1CSJd+6TKsxCSH+3bFx +gH07FOzE/Q20bv8duk8AcM+9X/0Ob8hfW8Nt5/QSrc/fdutMKPrJOIaQRvOa9wulXbbmn28E +uQd8+21t22QvMPif/39VwvbDpX6a77Rg1ZOL0o2pFvpObmMnwTMAKq6ayJU+qhNpXh5T5HOw +8jUYt5GU2YCaxMczFvJousYi+5lN+rldwIxMyx9Z3pFFnbxYI5n9VuJUnqz0ZlCsf785/NXy +gZaYt7HCKgnCw4jUEK9aAqHIzsJCNOvM60dW92ZyhU6iycs9uzlW87hWC3mwEG518JShdAyX +hk0LhprJd4OEj/LJarLaTveePkFWJm4XyP5R+ByJgWOVqPdn7ILl2rRRlmpIsyTzBisOf/Aw +DF3oO2zlOPSCtPgVblQnUujuhrWy4/uldwSQC+78klzmcNG4z6UTDkThUiAKMoT27z9AOR3a +qv7e+C2ExR7ykk9lRz4836i4wMJddw5d1+AARpxGjidw5FjaTRss6NLB0k9Wo7fChFIlEjYc +N+BGMiMbkGiXLFtATQKEDqx/kDAlecN0FpljC5g6x6FYHxouaulEY0L7RkYSfVUvKQU2r6Lu +vTlEEZeNPdRtYwOz4ogqysHgZzDmbJ/AOt23u5R+O+vipNaYpv0S/vlGMJPtj2TcpgIn2ooZ +KLqSDA8igs89M3oRnyvz +[end] ============================================================ --- tester.lua a0d28846349bf1c93501f5fb4bb0bb5b9d76dce0 +++ tester.lua 545636f81c2c6b65c5b79671aef4f9179ee28bde @@ -1,5 +1,6 @@ tests = {} srcdir = get_source_dir() +debugging = false test_root = nil testname = nil @@ -444,7 +445,6 @@ function run_tests(args) local torun = {} local run_all = true - local debugging = false local list_only = false for i,a in pairs(args) do local _1,_2,l,r = string.find(a, "^(-?%d+)%.%.(-?%d+)$") ============================================================ --- testsuite.at eea978faa60452bacefc4df9597bbc7b0a56645f +++ testsuite.at 52399f271c1496a2836dc4dc9b609c7dbe7793ab @@ -608,11 +608,6 @@ # include all the sub-tests we're going to use -m4_include(tests/t_fmerge_normalize.at) -m4_include(tests/t_delete_dir.at) -m4_include(tests/t_migrate_schema.at) -m4_include(tests/t_dump_load.at) -m4_include(tests/t_no_change_deltas.at) m4_include(tests/t_drop_rename_patch.at) m4_include(tests/t_cmdline_options.at) m4_include(tests/t_log_nonexistent.at) ============================================================ --- testsuite.lua 03425ee5785ef783a5f6b86bdac9e82e2553432e +++ testsuite.lua 359e2064fbe1caf24a83e54de731684341da2f01 @@ -185,14 +185,74 @@ end end +function check_same_db_contents(db1, db2) + check_same_stdout(cmd(mtn("--db", db1, "ls", "keys")), + cmd(mtn("--db", db2, "ls", "keys"))) + + check(cmd(mtn("--db", db1, "complete", "revision", "")), 0, true, false) + rename("stdout", "revs") + check(cmd(mtn("--db", db2, "complete", "revision", "")), 0, true, false) + check(samefile("stdout", "revs")) + for rev in io.lines("revs") do + rev = trim(rev) + check_same_stdout(cmd(mtn("--db", db1, "automate", "certs", rev)), + cmd(mtn("--db", db2, "automate", "certs", rev))) + check_same_stdout(cmd(mtn("--db", db1, "automate", "get_revision", rev)), + cmd(mtn("--db", db2, "automate", "get_revision", rev))) + check_same_stdout(cmd(mtn("--db", db1, "automate", "get_manifest_of", rev)), + cmd(mtn("--db", db2, "automate", "get_manifest_of", rev))) + end + + check(cmd(mtn("--db", db1, "complete", "file", "")), 0, true, false) + rename("stdout", "files") + check(cmd(mtn("--db", db2, "complete", "file", "")), 0, true, false) + check(samefile("stdout", "files")) + for file in io.lines("files") do + file = trim(file) + check_same_stdout(cmd(mtn("--db", db1, "automate", "get_file", file)), + cmd(mtn("--db", db2, "automate", "get_file", file))) + end +end + -- maybe this one should go in tester.lua? function check_same_stdout(cmd1, cmd2) check(cmd1, 0, true, false) rename_over("stdout", "stdout-first") check(cmd2, 0, true, false) - check(samefile("stdout", "stdout-first")) + rename_over("stdout", "stdout-second") + check(samefile("stdout-first", "stdout-second")) end +function write_large_file(name, size) + local file = io.open(name, "wb") + for i = 1,size do + for j = 1,128 do -- write 1MB + local str8k = "" + for k = 1,256 do + -- 32 + str8k = str8k .. string.char(math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255), + math.random(255), math.random(255)) + end + file:write(str8k) + end + end + file:close() +end + ------------------------------------------------------------------------ --====================================================================-- ------------------------------------------------------------------------ @@ -267,3 +327,8 @@ table.insert(tests, "tests/--rcfile_requires_extant_file") table.insert(tests, "tests/persistent_netsync_server_-_revs_&_certs") table.insert(tests, "tests/persistent_netsync_server_-_keys") +table.insert(tests, "tests/first_extent_normalization_pass") +table.insert(tests, "tests/(imp)_deleting_directories") +table.insert(tests, "tests/schema_migration") +table.insert(tests, "tests/database_dump_load") +table.insert(tests, "tests/no-change_deltas_disappear")