# # # delete "tests/t_add_inside__MTN.at" # # delete "tests/t_ambiguous_tags.at" # # delete "tests/t_annotate_no_rev.at" # # delete "tests/t_annotate_renames.at" # # delete "tests/t_automate_get_file.at" # # delete "tests/t_automate_get_manifest_of.at" # # delete "tests/t_automate_get_revision.at" # # delete "tests/t_automate_keys.at" # # delete "tests/t_check_db_format.at" # # delete "tests/t_commit_cancelled.at" # # delete "tests/t_commit_log_writeback.at" # # delete "tests/t_config_confdir.at" # # delete "tests/t_database_check_normalized.at" # # delete "tests/t_database_sig_cleanup.at" # # delete "tests/t_diff_external.at" # # delete "tests/t_diff_outside_workspace.at" # # delete "tests/t_drop_execute.at" # # delete "tests/t_explicit_merge_with_anc.at" # # delete "tests/t_key_management_without_db.at" # # delete "tests/t_kill_tag_locally.at" # # delete "tests/t_log_brief.at" # # delete "tests/t_log_outside_workspace.at" # # delete "tests/t_ls_branches.at" # # delete "tests/t_merge_7.at" # # delete "tests/t_merge_add_rename_add.at" # # delete "tests/t_migrate_broken_schema.at" # # delete "tests/t_migrate_rosterify.at" # # delete "tests/t_mixed_case_pwd.at" # # delete "tests/t_mtn_ignore.at" # # delete "tests/t_no_persist_phrase.at" # # delete "tests/t_read_from_file.at" # # delete "tests/t_read_privkey.at" # # delete "tests/t_rename_diff_names.at" # # delete "tests/t_rename_execute.at" # # delete "tests/t_restricted_commands_consistent.at" # # delete "tests/t_restricted_diff_unchanged.at" # # delete "tests/t_restriction_with_exclude.at" # # delete "tests/t_restriction_with_exclude_iprint.at" # # delete "tests/t_revert_ignored.at" # # delete "tests/t_rosterify_attrs.at" # # delete "tests/t_rosterify_drop_attrs.at" # # delete "tests/t_rosterify_one_rev.at" # # delete "tests/t_rosterify_rename.at" # # delete "tests/t_selector_globbing.at" # # delete "tests/t_selectors_b_h.at" # # delete "tests/t_setup_existing_path.at" # # delete "tests/t_unreadable_db.at" # # delete "tests/t_update_branch.at" # # delete "tests/t_update_switch_branch.at" # # add_dir "tester-tests/remove-unwriteable" # # add_dir "tests/--confdir_option_and_get_confdir_lua_function_work" # # add_dir "tests/_MTN_*_handled_correctly_in_aborted_commit" # # add_dir "tests/add_inside__MTN_" # # add_dir "tests/annotate_file_whose_name_changed" # # add_dir "tests/annotate_with_no_revs" # # add_dir "tests/automate_get_file" # # add_dir "tests/automate_get_manifest_of" # # add_dir "tests/automate_get_revision" # # add_dir "tests/automate_keys" # # add_dir "tests/b_and_h_selectors" # # add_dir "tests/b_and_t_selector_globbing" # # add_dir "tests/commit_writes_message_back_to__MTN_log" # # add_dir "tests/database_check_for_normalization" # # add_dir "tests/database_is_closed_on_signal_exit" # # add_dir "tests/db_data_format_checking" # # add_dir "tests/db_kill_tag_locally" # # add_dir "tests/db_migrate_on_bad_schema" # # add_dir "tests/db_rosterify_preserves_renames" # # add_dir "tests/diff_--external" # # add_dir "tests/diff_-rREV1_-rREV2_UNCHANGED-FILE" # # add_dir "tests/diffing_a_file_within_revision_outside_a_workspace" # # add_dir "tests/disallowing_persistence_of_passphrase" # # add_dir "tests/drop_with_actual_removal" # # add_dir "tests/explicit_merge_LEFT_RIGHT_ANC_BRANCH" # # add_dir "tests/fail_cleanly_on_unreadable_db" # # add_dir "tests/filenames_in_diff_after_rename" # # add_dir "tests/key_management_without_a_database" # # add_dir "tests/list_branches" # # add_dir "tests/log_--brief" # # add_dir "tests/logging_a_file_within_revision_outside_a_workspace" # # add_dir "tests/ls_tags_with_ambiguous_tags" # # add_dir "tests/merging_(add_a,_rename_a_b)_with_(add_b)" # # add_dir "tests/migrate_with_rosterify" # # add_dir "tests/mtn_read_FILE" # # add_dir "tests/read_and_convert_old_privkey_packet" # # add_dir "tests/rename_files_into_a_directory" # # add_dir "tests/rename_with_actual_file_rename" # # add_dir "tests/restricted_commands_are_consistent" # # add_dir "tests/restrictions_when_pwd_is_mixed_case" # # add_dir "tests/revert_ignored_files" # # add_dir "tests/rosterify_--drop-attr" # # add_dir "tests/rosterify_migrates_file_dir_attrs" # # add_dir "tests/rosterify_on_a_db_with_1_rev" # # add_dir "tests/setup_on_existing_path" # # add_dir "tests/test_a_merge_7" # # add_dir "tests/things_in_.mtn-ignore_get_ignored" # # add_dir "tests/update_-b_foo_updates__MTN_options_correctly" # # add_dir "tests/update_-b_switches_branches_even_when_noop" # # add_dir "tests/use_restrictions_with_--exclude" # # add_dir "tests/use_restrictions_with_--exclude_and_inodeprints" # # add_file "tester-tests/remove-unwriteable/__driver__.lua" # content [9ed4efcb990e87194d72b207360915a0ccfda85e] # # add_file "tests/--confdir_option_and_get_confdir_lua_function_work/__driver__.lua" # content [5d267f0d0e7d1a52192c30ffa5a26f8fd09faeb8] # # add_file "tests/--confdir_option_and_get_confdir_lua_function_work/myhooks" # content [21d7c52a6fcf875f334b612ca4e29caa10e3ded6] # # add_file "tests/_MTN_*_handled_correctly_in_aborted_commit/__driver__.lua" # content [466c9431afb7310fd266aeba783a22612919b755] # # add_file "tests/_MTN_*_handled_correctly_in_aborted_commit/bad_edit_comment.lua" # content [98cfa1aefd465bf9b3e8169c40c33ccc204fdbfd] # # add_file "tests/add_inside__MTN_/__driver__.lua" # content [cbecfde7ee32cd40177b011b4461489f2f8960ce] # # add_file "tests/annotate_file_whose_name_changed/__driver__.lua" # content [af2dddf5eeb4e8ba59c4860b8de03f92c217ce3b] # # add_file "tests/annotate_with_no_revs/__driver__.lua" # content [feb312a352350ec40f62629a7824c684f72619f7] # # add_file "tests/automate_get_file/__driver__.lua" # content [f4e10eb071b19187a5b8c1d93aed1a72c6bc8d80] # # add_file "tests/automate_get_manifest_of/__driver__.lua" # content [c3fcb95aae09cea5b3017ad98965b4fcf1b743cc] # # add_file "tests/automate_get_manifest_of/expected" # content [407ad1469e65feae6dcecc268e129d9369b69675] # # add_file "tests/automate_get_manifest_of/expected2" # content [f4af30b7dfdc0ce8d35b34e81ca5b98297b50c56] # # add_file "tests/automate_get_revision/__driver__.lua" # content [b5cf65b106d39eba23690f7721ed12e1a1a4618c] # # add_file "tests/automate_get_revision/expected" # content [dae0d8e3f944c82a9688bcd6af99f5b837b41968] # # add_file "tests/automate_get_revision/expected2" # content [6953d15ab21621bd57dd37cdea1bae61a7214d6f] # # add_file "tests/automate_keys/__driver__.lua" # content [8d88368298c3af5b2c7e938d7731cbc045549867] # # add_file "tests/b_and_h_selectors/__driver__.lua" # content [64d7fefa798ddb0eb652c1129c7f84d312f92258] # # add_file "tests/b_and_t_selector_globbing/__driver__.lua" # content [5d742bad413d66d83a0e9cf263de8a02f8058161] # # add_file "tests/commit_writes_message_back_to__MTN_log/__driver__.lua" # content [3adbe4d65dff675b450922a3a49273c17126881a] # # add_file "tests/commit_writes_message_back_to__MTN_log/my_hook.lua" # content [2c27a968d793839ad3c7dade630eb58837ea2f79] # # add_file "tests/database_check_for_normalization/__driver__.lua" # content [bc6bb094618990a3a1f38144ed81febadc860ce4] # # add_file "tests/database_check_for_normalization/bad.db" # content [c9ad82e3e1fd6722a877dc427c4125ef6c47d305] # # add_file "tests/database_is_closed_on_signal_exit/__driver__.lua" # content [cf350161f3676942aadbd58047f71a31193e521a] # # add_file "tests/db_data_format_checking/__driver__.lua" # content [03085676c219d57aba4fbc8c1d8f840632988a62] # # add_file "tests/db_data_format_checking/changesetify.db.dumped" # content [6ef791ff1696617b11dc4e60f091e663d3848b2a] # # add_file "tests/db_data_format_checking/rosterify.db.dumped" # content [3c183f3bfe14b4b88679aa74701683a40e5770f3] # # add_file "tests/db_kill_tag_locally/__driver__.lua" # content [eb96c1472d7ef266ce84d3fcfb4beb75b3c57661] # # add_file "tests/db_migrate_on_bad_schema/__driver__.lua" # content [77d715318de6a775f5debf2bf394db959fa260e7] # # add_file "tests/db_rosterify_preserves_renames/__driver__.lua" # content [2f92e22a54b4ed4f7f8b21b4482f96484ffa215f] # # add_file "tests/db_rosterify_preserves_renames/expout" # content [879f84c3e8b6c3486afcc1ff58295d38984b9862] # # add_file "tests/db_rosterify_preserves_renames/test.db.dumped" # content [ba2e245c125eeb37a03a7fe22b27c8490b31121b] # # add_file "tests/diff_--external/__driver__.lua" # content [411e14004692d964f3b8c5f170702e617cb55994] # # add_file "tests/diff_--external/testhook.lua" # content [f95d8dc471b67ed62015fa8d8648d87326fdd0d5] # # add_file "tests/diff_-rREV1_-rREV2_UNCHANGED-FILE/__driver__.lua" # content [35324bbd1af0ecb068daa4238ce079ba94c09521] # # add_file "tests/diffing_a_file_within_revision_outside_a_workspace/__driver__.lua" # content [a1cb0c55b523bb0d7aad0ff7e011f8651ff8ca12] # # add_file "tests/disallowing_persistence_of_passphrase/__driver__.lua" # content [97caa9c3d7ad9ea19bd32bc45b812e38a94b7917] # # add_file "tests/disallowing_persistence_of_passphrase/persist.lua" # content [0364ff652c5a331f264dbfc99e75317c8d4aa100] # # add_file "tests/drop_with_actual_removal/__driver__.lua" # content [db133ade4e4ac20c8cca33e99e2505447cbee94c] # # add_file "tests/explicit_merge_LEFT_RIGHT_ANC_BRANCH/__driver__.lua" # content [01d988717d007d6dbe2fd3d06a973237dc252f46] # # add_file "tests/fail_cleanly_on_unreadable_db/__driver__.lua" # content [813cc5983532111581d06fbb05eca58e34a63524] # # add_file "tests/filenames_in_diff_after_rename/__driver__.lua" # content [f7d87b46a41ca490c41a8d910705bfb34646227a] # # add_file "tests/key_management_without_a_database/__driver__.lua" # content [c6d438fdfaf3bcf895a4f8bb2754aeb34a0a73c8] # # add_file "tests/list_branches/__driver__.lua" # content [8e6f678eef70f9187fed601e25d14076ba67d17a] # # add_file "tests/list_branches/ignore_branch.lua" # content [8c35a6d05ad5e75f670db805acfaa1d27f9fd277] # # add_file "tests/log_--brief/__driver__.lua" # content [a32dba1a7d96655603759e0d5fe75ce0d36e88e9] # # add_file "tests/logging_a_file_within_revision_outside_a_workspace/__driver__.lua" # content [6ebfa602fc03bcdfbe93676e791c5a6833f083e6] # # add_file "tests/ls_tags_with_ambiguous_tags/__driver__.lua" # content [86ca8c16ab1e8b7c071c1e3dd73f47852059a31e] # # add_file "tests/merging_(add_a,_rename_a_b)_with_(add_b)/__driver__.lua" # content [b37feaf5408df2ec82bf70df8ae3ca74d3199c90] # # add_file "tests/migrate_with_rosterify/1509fd75019aebef5ac3da3a5edf1312393b70e9.mtn.dumped" # content [6b29b8f92c1705172b7bbc60bfd372405a6804d4] # # add_file "tests/migrate_with_rosterify/40369a7bda66463c5785d160819ab6398b9d44f4.mtn.dumped" # content [9715d7942343f2bedfc46dee9d5698a987d44b26] # # add_file "tests/migrate_with_rosterify/__driver__.lua" # content [1ff3b4055bd96ae0e2760d6a3502f98f9611cc7a] # # add_file "tests/migrate_with_rosterify/bd86f9a90b5d552f0be1fa9aee847ea0f317778b.mtn.dumped" # content [bd752686b5ce2506bac6448d86521ef24208fc8e] # # add_file "tests/migrate_with_rosterify/c1e86588e11ad07fa53e5d294edc043ce1d4005a.mtn.dumped" # content [6afa737844d4e8a17385ec2d0d5abbd00a6039b7] # # add_file "tests/migrate_with_rosterify/e372b508bea9b991816d1c74680f7ae10d2a6d94.mtn.dumped" # content [beca91b0380a72b2902bdd6a06b52f4cd46cc67d] # # add_file "tests/migrate_with_rosterify/migrate_keys" # content [38b5ed1b66100385b6d85b91b6bca07482284a00] # # add_file "tests/migrate_with_rosterify/old_revs_propagate_log" # content [88f750aa31297047a4bd81476afdf170ec4fe24c] # # add_file "tests/mtn_read_FILE/__driver__.lua" # content [a6990431b287f4de659451b44d14a7ffaa5f78a2] # # add_file "tests/read_and_convert_old_privkey_packet/__driver__.lua" # content [599cf327cc2832fcbcc2f39e51200084ba951ee2] # # add_file "tests/read_and_convert_old_privkey_packet/old_privkey" # content [e8fcd2b19a2545fe17452873d8c9517ba0207744] # # add_file "tests/rename_files_into_a_directory/__driver__.lua" # content [9080ecca27e1218caf9c7eef651357348a8dcc21] # # add_file "tests/rename_with_actual_file_rename/__driver__.lua" # content [eba1a60bad4f749e7c609d233cc6c4828823622e] # # add_file "tests/restricted_commands_are_consistent/__driver__.lua" # content [19c97e07ddcb3f58553eb07e658ec1605287190c] # # add_file "tests/restricted_commands_are_consistent/ignore.lua" # content [529fff76aa21b0135d387c11acadade05607944c] # # add_file "tests/restrictions_when_pwd_is_mixed_case/__driver__.lua" # content [4a9f7bef46881a48fbeabadcffba9beade10f869] # # add_file "tests/revert_ignored_files/__driver__.lua" # content [52052045f5a5ad9be1b9126be33a51b9441356a6] # # add_file "tests/revert_ignored_files/ignore.lua" # content [b0d06243ccf09fe335fba783cee049f173f0bbec] # # add_file "tests/rosterify_--drop-attr/__driver__.lua" # content [00714d38d59159019cac8b5587417e5ecde89d66] # # add_file "tests/rosterify_--drop-attr/manifest_good" # content [188c69bb6f5e1ac70a6e4b8d02a543722d837d05] # # add_file "tests/rosterify_--drop-attr/test.db.dumped" # content [7b7eceb0dac25861abf838cb7f7d692aa47e7c65] # # add_file "tests/rosterify_migrates_file_dir_attrs/__driver__.lua" # content [ae20dbdc1ff58e8dd3543c77789d5c158165c8ad] # # add_file "tests/rosterify_migrates_file_dir_attrs/first_manifest_good" # content [40cc8615372f67622d13b2dffd8d8953ec74eb48] # # add_file "tests/rosterify_migrates_file_dir_attrs/second_manifest_good" # content [6d0ebeee985dceee21fadbe252e62348ce44f8be] # # add_file "tests/rosterify_migrates_file_dir_attrs/test.db.dumped" # content [7149517db5d4fd54021677c255d3aaaece56c0e5] # # add_file "tests/rosterify_on_a_db_with_1_rev/__driver__.lua" # content [7d553a2f86f34e4c964aa76201f0f7f042646f07] # # add_file "tests/rosterify_on_a_db_with_1_rev/manifest_good" # content [fad486e695284e3d086b283e44171cda59efe3ef] # # add_file "tests/rosterify_on_a_db_with_1_rev/test.db.dumped" # content [45725ca2800737426da29c847d485741ab9ecba3] # # add_file "tests/setup_on_existing_path/__driver__.lua" # content [1b50d361f9693ca080715d27eac680e8ab513072] # # add_file "tests/test_a_merge_7/__driver__.lua" # content [fa8de24b1aa6f6e132e8dceaa4b28b9163d0f9dc] # # add_file "tests/things_in_.mtn-ignore_get_ignored/__driver__.lua" # content [e7b9b6ae892ff496fa72248c63a48520e6c8da64] # # add_file "tests/update_-b_foo_updates__MTN_options_correctly/__driver__.lua" # content [4cf2854af9382b276235f3e13fab78c58b8ef55f] # # add_file "tests/update_-b_switches_branches_even_when_noop/__driver__.lua" # content [ec1aa7f037d9af494dd3a084d3675eeb2462dac4] # # add_file "tests/use_restrictions_with_--exclude/__driver__.lua" # content [1c8a6a20e862a7666be68fa7c5776e1036e91e05] # # add_file "tests/use_restrictions_with_--exclude_and_inodeprints/__driver__.lua" # content [5be7b8c5cc0bc2c4eb0c3de5d2432f14dd34b15f] # # patch "lua.cc" # from [68f25f00b9c93b3d3a443c3eccc799ce8bf18712] # to [3d93064ec4cefc98b2af7e24bc479305bcfe2a8b] # # patch "tester-testsuite.lua" # from [efc8052e5758fde01b30095b8f38c8f7e2c4d371] # to [3153cf2384274b7290226e99383378926d9f64ff] # # patch "tester.cc" # from [545fbaad9a01df3c2ee1f7eea0e49003fd94b5e6] # to [81b805b2be147d30b89455b3825a65506405dfb4] # # patch "tester.lua" # from [aab22309dc5de1e0fe9d3fb38af959db0243648c] # to [e022bef407dd27b45cd0c42fd494a7559b91971a] # # patch "testsuite.at" # from [e4e7b224447c223e5e441071baba7d8360b8da1e] # to [a03205e449eeda082023d77db7813fe8f04bb12d] # # patch "testsuite.lua" # from [1b2b288fe7a790acc82b8f3bf51b4318ac6619c5] # to [32544d62c1f438b1576810816d834daca6ec6f55] # # set "tests/database_check_for_normalization/bad.db" # attr "mtn:manual_merge" # value "true" # ============================================================ --- tester-tests/remove-unwriteable/__driver__.lua 9ed4efcb990e87194d72b207360915a0ccfda85e +++ tester-tests/remove-unwriteable/__driver__.lua 9ed4efcb990e87194d72b207360915a0ccfda85e @@ -0,0 +1,10 @@ + +skip_if(not existsonpath("chmod")) + +mkdir("foo") +writefile("foo/bar", "quux") + +check({"chmod", "a-w", "foo"}) +check({"chmod", "a-w", "foo/bar"}) +remove_recursive("foo") +check(not exists("foo")) ============================================================ --- tests/--confdir_option_and_get_confdir_lua_function_work/__driver__.lua 5d267f0d0e7d1a52192c30ffa5a26f8fd09faeb8 +++ tests/--confdir_option_and_get_confdir_lua_function_work/__driver__.lua 5d267f0d0e7d1a52192c30ffa5a26f8fd09faeb8 @@ -0,0 +1,7 @@ + +mtn_setup() + +getfile("myhooks") +mkdir("fooxyzzybar") +check(mtn("--confdir=fooxyzzybar", "--rcfile=myhooks", "ls", "known")) +check(exists("fooxyzzybar/checkfile")) ============================================================ --- tests/--confdir_option_and_get_confdir_lua_function_work/myhooks 21d7c52a6fcf875f334b612ca4e29caa10e3ded6 +++ tests/--confdir_option_and_get_confdir_lua_function_work/myhooks 21d7c52a6fcf875f334b612ca4e29caa10e3ded6 @@ -0,0 +1,6 @@ +dir = get_confdir() +if string.find(dir, "fooxyzzybar$") then + file = io.open(dir .. "/checkfile", "w") + file:write("foobar") + io.close(file) +end ============================================================ --- tests/_MTN_*_handled_correctly_in_aborted_commit/__driver__.lua 466c9431afb7310fd266aeba783a22612919b755 +++ tests/_MTN_*_handled_correctly_in_aborted_commit/__driver__.lua 466c9431afb7310fd266aeba783a22612919b755 @@ -0,0 +1,26 @@ + +mtn_setup() + +-- _MTN/* means _MTN/revision and _MTN/work + +addfile("testfile", "blah blah") +commit() + +addfile("otherfile", "stuff stuff") + +writefile("_MTN/log", "message message") + +copyfile("_MTN/log", "good_log") +copyfile("_MTN/revision", "good_revision") +copyfile("_MTN/work", "good_work") + +getfile("bad_edit_comment.lua") + +check(mtn("commit", "--rcfile=bad_edit_comment.lua"), 1, false, false) + +-- Since this commit was canceled due to a problem with the log +-- message, the old log message have been preserved +check(samefile("_MTN/log", "good_log")) + +check(samefile("_MTN/revision", "good_revision")) +check(samefile("_MTN/work", "good_work")) ============================================================ --- tests/_MTN_*_handled_correctly_in_aborted_commit/bad_edit_comment.lua 98cfa1aefd465bf9b3e8169c40c33ccc204fdbfd +++ tests/_MTN_*_handled_correctly_in_aborted_commit/bad_edit_comment.lua 98cfa1aefd465bf9b3e8169c40c33ccc204fdbfd @@ -0,0 +1,3 @@ +function edit_comment(basetext, user_log_message) + return "" +end ============================================================ --- tests/add_inside__MTN_/__driver__.lua cbecfde7ee32cd40177b011b4461489f2f8960ce +++ tests/add_inside__MTN_/__driver__.lua cbecfde7ee32cd40177b011b4461489f2f8960ce @@ -0,0 +1,8 @@ + +mtn_setup() + +writefile("testfile1", "blah blah") +writefile("_MTN/testfile2", "blah blah") + +check(indir("_MTN", mtn("add", "testfile2")), 1, false, false) +check(indir("_MTN", mtn("add", "../testfile1")), 0, false, false) ============================================================ --- tests/annotate_file_whose_name_changed/__driver__.lua af2dddf5eeb4e8ba59c4860b8de03f92c217ce3b +++ tests/annotate_file_whose_name_changed/__driver__.lua af2dddf5eeb4e8ba59c4860b8de03f92c217ce3b @@ -0,0 +1,36 @@ + +mtn_setup() +revs = {} + +addfile("foo", "a\nb\nc\n") +writefile("foo.rightnewname", "a\nb\nx\n") + +commit() +revs.base = base_revision() + + +-- do something to a file we don't care about to make a commitable change +addfile("junk", "some junk") +commit() +revs.left = base_revision() + +revert_to(revs.base) +copyfile("foo.rightnewname", "foo") +check(mtn("rename", "-e", "foo", "foo.new"), 0, false, false) +commit() +revs.right = base_revision() + + +check(mtn("merge"), 0, false, false) +check(mtn("update"), 0, false, false) +revs.merged = base_revision() + +-- +-- annotate foo should now be +-- base: a +-- base: b +-- right: x +-- + +check(mtn("annotate", "foo.new"), 0, true, false) +greplines("stdout", {revs.base, revs.base, revs.right}) ============================================================ --- tests/annotate_with_no_revs/__driver__.lua feb312a352350ec40f62629a7824c684f72619f7 +++ tests/annotate_with_no_revs/__driver__.lua feb312a352350ec40f62629a7824c684f72619f7 @@ -0,0 +1,6 @@ + +mtn_setup() + +addfile("testfile", "blah blah") + +check(mtn("annotate", "testfile"), 1, false, false) ============================================================ --- tests/automate_get_file/__driver__.lua f4e10eb071b19187a5b8c1d93aed1a72c6bc8d80 +++ tests/automate_get_file/__driver__.lua f4e10eb071b19187a5b8c1d93aed1a72c6bc8d80 @@ -0,0 +1,23 @@ + +mtn_setup() + +writefile("expected", "blah\n") + +addfile("foo", "blah\n") +check(mtn("commit", "--date=2005-05-21T12:30:51", + "--branch=testbranch", "--message=blah-blah"), 0, false, false) +rev = base_revision() +file = "4cbd040533a2f43fc6691d773d510cda70f4126a" + +-- check that a correct usage produces correctly formatted output +check(mtn("automate", "get_file", file), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) + +-- ensure that missing revisions fail +check(mtn("automate", "get_file", string.rep("0", 40)), 1, true, false) +check(fsize("stdout") == 0) + +-- ensure that revisions are not being completed +check(mtn("automate", "get_file", string.sub(file, 1, 30)), 1, true, false) +check(fsize("stdout") == 0) ============================================================ --- tests/automate_get_manifest_of/__driver__.lua c3fcb95aae09cea5b3017ad98965b4fcf1b743cc +++ tests/automate_get_manifest_of/__driver__.lua c3fcb95aae09cea5b3017ad98965b4fcf1b743cc @@ -0,0 +1,34 @@ + +mtn_setup() + +getfile("expected") +getfile("expected2") + +addfile("foo", "blah\n") +check(mtn("commit", "--date=2005-05-21T12:30:51", + "--branch=testbranch", "--message=blah-blah"), 0, false, false) +rev = base_revision() + +-- check that a correct usage produces correctly formatted output +check(mtn("automate", "get_manifest_of", rev), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) + +-- should work even if we don't specify the manifest ID +check(mtn("automate", "get_manifest_of"), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) + +-- ensure that missing revisions fail +check(mtn("automate", "get_manifest_of", string.rep("0", 40)), 1, true, false) +check(fsize("stdout") == 0) + +-- ensure that revisions are not being completed +check(mtn("automate", "get_revision", string.sub(rev, 1, 30)), 1, true, false) +check(fsize("stdout") == 0) + +-- check that modified working copy manifest is correct +writefile("foo", "bla bla\n") +check(mtn("automate", "get_manifest_of"), 0, true, false) +canonicalize("stdout") +check(samefile("expected2", "stdout")) ============================================================ --- tests/automate_get_manifest_of/expected 407ad1469e65feae6dcecc268e129d9369b69675 +++ tests/automate_get_manifest_of/expected 407ad1469e65feae6dcecc268e129d9369b69675 @@ -0,0 +1,6 @@ +format_version "1" + +dir "" + + file "foo" +content [4cbd040533a2f43fc6691d773d510cda70f4126a] ============================================================ --- tests/automate_get_manifest_of/expected2 f4af30b7dfdc0ce8d35b34e81ca5b98297b50c56 +++ tests/automate_get_manifest_of/expected2 f4af30b7dfdc0ce8d35b34e81ca5b98297b50c56 @@ -0,0 +1,6 @@ +format_version "1" + +dir "" + + file "foo" +content [9fd2be4badf713d640ae46bf4547d1549654dfe5] ============================================================ --- tests/automate_get_revision/__driver__.lua b5cf65b106d39eba23690f7721ed12e1a1a4618c +++ tests/automate_get_revision/__driver__.lua b5cf65b106d39eba23690f7721ed12e1a1a4618c @@ -0,0 +1,28 @@ + +mtn_setup() + +getfile("expected") +getfile("expected2") + +addfile("foo", "blah\n") +check(mtn("commit", "--date=2005-05-21T12:30:51", + "--branch=testbranch", "--message=blah-blah"), 0, false, false) +base = base_revision() + +-- check that a correct usage produces correctly formatted output +check(mtn("automate", "get_revision", base), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) + +-- should work even if we don't specify the revision +check(mtn("automate", "get_revision"), 0, true, false) +canonicalize("stdout") +check(samefile("expected2", "stdout")) + +-- ensure that missing revisions fail +check(mtn("automate", "get_file", string.rep("0", 40)), 1, true, false) +check(fsize("stdout") == 0) + +-- ensure that revisions are not being completed +check(mtn("automate", "get_file", string.sub(base, 1, 30)), 1, true, false) +check(fsize("stdout") == 0) ============================================================ --- tests/automate_get_revision/expected dae0d8e3f944c82a9688bcd6af99f5b837b41968 +++ tests/automate_get_revision/expected dae0d8e3f944c82a9688bcd6af99f5b837b41968 @@ -0,0 +1,10 @@ +format_version "1" + +new_manifest [407ad1469e65feae6dcecc268e129d9369b69675] + +old_revision [] + +add_dir "" + +add_file "foo" + content [4cbd040533a2f43fc6691d773d510cda70f4126a] ============================================================ --- tests/automate_get_revision/expected2 6953d15ab21621bd57dd37cdea1bae61a7214d6f +++ tests/automate_get_revision/expected2 6953d15ab21621bd57dd37cdea1bae61a7214d6f @@ -0,0 +1,5 @@ +format_version "1" + +new_manifest [407ad1469e65feae6dcecc268e129d9369b69675] + +old_revision [dae0d8e3f944c82a9688bcd6af99f5b837b41968] ============================================================ --- tests/automate_keys/__driver__.lua 8d88368298c3af5b2c7e938d7731cbc045549867 +++ tests/automate_keys/__driver__.lua 8d88368298c3af5b2c7e938d7731cbc045549867 @@ -0,0 +1,39 @@ + +mtn_setup() + +addfile("testfile", "foo bar") +check(mtn("ci", "-m", "foobar"), 0, false, false) +check(mtn("genkey", "address@hidden"), 0, false, false, string.rep("address@hidden", 2)) +check(mtn("genkey", "address@hidden"), 0, false, false, string.rep("address@hidden", 2)) +check(mtn("pubkey", "address@hidden"), 0, true) +rename("stdout", "baz") +check(mtn("dropkey", "address@hidden"), 0, false, false) +check(mtn("read"), 0, false, false, {"baz"}) + +-- we now have address@hidden in the keystore, address@hidden in both keystore +-- and database, and address@hidden in only the database +check(mtn("automate", "keys"), 0, true, false) +parsed = parse_basic_io(readfile("stdout")) +locs = {} +for _,line in pairs(parsed) do + if line.name == "name" then + key = line.values[1] + locs[key] = {db = false, ks = false, pub = false, priv = false} + end + if string.find(line.name, "location") then + for _,v in pairs(line.values) do + if v == "keystore" then locs[key].ks = true end + if v == "database" then locs[key].db = true end + end + end + if string.find(line.name, "private") then locs[key].priv = true end + if string.find(line.name, "public") then locs[key].pub = true end +end +check(locs["address@hidden"].db == false) +check(locs["address@hidden"].ks == true) +check(locs["address@hidden"].priv == false) +check(locs["address@hidden"].pub == true) +check(locs["address@hidden"].db == true) +check(locs["address@hidden"].ks == true) +check(locs["address@hidden"].pub == true) +check(locs["address@hidden"].priv == true) ============================================================ --- tests/b_and_h_selectors/__driver__.lua 64d7fefa798ddb0eb652c1129c7f84d312f92258 +++ tests/b_and_h_selectors/__driver__.lua 64d7fefa798ddb0eb652c1129c7f84d312f92258 @@ -0,0 +1,27 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +REV1=base_revision() + +writefile("testfile", "stuff stuff") +commit() +REV2=base_revision() + +writefile("testfile", "chew chew") +commit("otherbranch") +REV3=base_revision() + + +function selmap(sel, revs, sort) + check(raw_mtn("automate", "select", sel), 0, true, false) + samelines("stdout", revs, sort) +end + +selmap("b:testbranch", {REV1, REV2}) +selmap("b:otherbranch", {REV3}) +selmap("b:", {REV3}) +selmap("h:testbranch", {REV2}) +selmap("h:otherbranch", {REV3}) +selmap("h:", {REV3}) ============================================================ --- tests/b_and_t_selector_globbing/__driver__.lua 5d742bad413d66d83a0e9cf263de8a02f8058161 +++ tests/b_and_t_selector_globbing/__driver__.lua 5d742bad413d66d83a0e9cf263de8a02f8058161 @@ -0,0 +1,36 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +R1=base_revision() + +writefile("testfile", "stuff stuff") +commit("otherbranch") +R2=base_revision() + +writefile("testfile", "thing thing") +commit("branch") +R3=base_revision() + +check(mtn("tag", R1, "foo"), 0, false, false) +check(mtn("tag", R2, "bar"), 0, false, false) +check(mtn("tag", R3, "foobarbaz"), 0, false, false) +function selmap(s, res, sort) + if sort == nil then sort = true end + check(mtn("automate", "select", s), 0, true, false) + if sort then table.sort(res) end + check(samelines("stdout", res)) +end + +selmap("b:testbranch", {R1}) +selmap("b:otherbranch", {R2}) +selmap("b:branch", {R3}) +selmap("b:test*", {R1}) +selmap("b:*branch*", {R1, R2, R3}) + +selmap("t:foo", {R1}) +selmap("t:bar", {R2}) +selmap("t:foobarbaz", {R3}) +selmap("t:*bar", {R2}) +selmap("t:*bar*", {R2, R3}) ============================================================ --- tests/commit_writes_message_back_to__MTN_log/__driver__.lua 3adbe4d65dff675b450922a3a49273c17126881a +++ tests/commit_writes_message_back_to__MTN_log/__driver__.lua 3adbe4d65dff675b450922a3a49273c17126881a @@ -0,0 +1,31 @@ + +skip_if(not existsonpath("chmod")) +mtn_setup() + +addfile("testfile", "blah blah") + +-- Make it unwriteable, so our edit_comment hook will have a chance to +-- run, but the overall commit will fail. (How do I know this will +-- work? Well, it did...) +check({"chmod", "a-w", "test.db"}) + +getfile("my_hook.lua") + +check(mtn("commit", "-btestbranch", "--rcfile=my_hook.lua"), 1, false, false) + +check(samelines("_MTN/log", {"foobar"})) + +remove_recursive("_MTN/log") +writefile("_MTN/log", "") + +-- -m messages don't get written out to _MTN/log +-- (if they do, it breaks the workflow: +-- $ mtn commit -m 'foo' +-- +-- +-- $ mtn commit -m 'foo' +-- error, _MTN/log non-empty and -m specified +check(mtn("commit", "-btestbranch", "-m", "blah blah"), 1, false, false) + +-- So _MTN/log should still be empty +check(fsize("_MTN/log") == 0) ============================================================ --- tests/commit_writes_message_back_to__MTN_log/my_hook.lua 2c27a968d793839ad3c7dade630eb58837ea2f79 +++ tests/commit_writes_message_back_to__MTN_log/my_hook.lua 2c27a968d793839ad3c7dade630eb58837ea2f79 @@ -0,0 +1,3 @@ +function edit_comment(basetext, user_log_message) + return "foobar\n" +end ============================================================ --- tests/database_check_for_normalization/__driver__.lua bc6bb094618990a3a1f38144ed81febadc860ce4 +++ tests/database_check_for_normalization/__driver__.lua bc6bb094618990a3a1f38144ed81febadc860ce4 @@ -0,0 +1,24 @@ + +-- the included database is valid except for all paths being "./" prefixed, +-- hence the database doesn't have correctly normalised revisions. + +-- for future reference, it was created with a modified monotone binary, +-- paths.cc was modified. Also, the 'add_dir "."' was added to _MTN/work by hand. + +--old_revision 0 +-- +--add_dir "" +-- +--add_dir "." +-- +--add_file "./file" + +mtn_setup() + +getfile("bad.db") + +check(mtn("db", "migrate", "-d", "bad.db"), 0, false, false) + +check(mtn("db", "check", "-d", "bad.db"), 1, false, true) + +check(qgrep('revisions not parseable', "stderr")) ============================================================ # tests/database_check_for_normalization/bad.db is binary ============================================================ --- tests/database_is_closed_on_signal_exit/__driver__.lua cf350161f3676942aadbd58047f71a31193e521a +++ tests/database_is_closed_on_signal_exit/__driver__.lua cf350161f3676942aadbd58047f71a31193e521a @@ -0,0 +1,45 @@ + +skip_if(ostype == "Windows") +mtn_setup() + +-- SIGTERM and SIGINT can't really be handled on Win32: +-- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_CRT_signal.asp +-- We also don't attempt to install handlers for them in main.cc, but there's +-- little point given the discussion at the MSDN link above. + +-- this test checks that .db-journal files aren't left lying about if the +-- process is killed with SIGTERM or SIGINT + +writefile("testfile", "stuff") +check(mtn("add", "testfile"), 0, false, false) + +-- a hack to make the monotone process hang around with the database locked. + +writefile("wait.lua", "function get_passphrase(key) sleep(1000) end") + + +-- SIGTERM first +process = bg(mtn("--rcfile=wait.lua", "-btestbranch", "ci", "-mx"), false, false, false) +sleep(2) +check(exists("test.db-journal")) +kill(process.pid, 15) +sleep(2) +check(not exists("test.db-journal")) + + +-- and again for SIGINT +process = bg(mtn("--rcfile=wait.lua", "-btestbranch", "ci", "-mx"), false, false, false) +sleep(2) +check(exists("test.db-journal")) +kill(process.pid, 2) +sleep(2) +check(not exists("test.db-journal")) + + +-- should be cleaned up for SIGSEGV +process = bg(mtn("--rcfile=wait.lua", "-btestbranch", "ci", "-mx"), false, false, false) +sleep(2) +check(exists("test.db-journal")) +kill(process.pid, 11) +sleep(2) +xfail_if(true, not exists("test.db-journal")) ============================================================ --- tests/db_data_format_checking/__driver__.lua 03085676c219d57aba4fbc8c1d8f840632988a62 +++ tests/db_data_format_checking/__driver__.lua 03085676c219d57aba4fbc8c1d8f840632988a62 @@ -0,0 +1,24 @@ + +mtn_setup() + +-- A few times in our history we've had to do data migration beyond +-- what the "db migrate" command can handle -- i.e., "db changesetify" +-- and "db rosterify". We would like for it to be the case, that all +-- other commands give a nice error message if these commands need to +-- be run. This test makes sure that monotone exits with an error if +-- given a db that appears to be very old. + +getfile("changesetify.db.dumped", "stdin") +check(mtn("-d", "cs-modern.db", "db", "load"), 0, false, false, true) +check(mtn("-d", "cs-modern.db", "db", "migrate"), 0, false, false) + +check(mtn("-d", "cs-modern.db", "ls", "keys"), 1, false, false) +check(mtn("-d", "cs-modern.db", "serve", "--bind=127.0.0.1:63219", '*'), 1, false, false) + + +getfile("rosterify.db.dumped", "stdin") +check(mtn("-d", "ro-modern.db", "db", "load"), 0, false, false, true) +check(mtn("-d", "ro-modern.db", "db", "migrate"), 0, false, false) + +check(mtn("-d", "ro-modern.db", "ls", "keys"), 1, false, false) +check(mtn("-d", "ro-modern.db", "serve", "--bind=127.0.0.1:63219", '*'), 1, false, false) ============================================================ --- tests/db_data_format_checking/changesetify.db.dumped 6ef791ff1696617b11dc4e60f091e663d3848b2a +++ tests/db_data_format_checking/changesetify.db.dumped 6ef791ff1696617b11dc4e60f091e663d3848b2a @@ -0,0 +1,108 @@ +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) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('1929e9f45b6777c31d067a9f3134a53db506e47c','H4sIAAAAAAAA/ytPzSxKyecCAJMv4PQHAAAA +'); +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 + ); +INSERT INTO manifests VALUES('078ee6a226774641ad23ff4d72f7acdc5ccfd226','H4sIAAAAAAAA/zO0NLJMtUwzMU0yMzc3TzY2TDEwM0+0TDM2NDZJNDVOSTI1MEs1MU9WUEjK +SczgAgC4r3wQLwAAAA== +'); +CREATE TABLE next_roster_node_number +( +node primary key -- only one entry in this table, ever +); +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=='); +CREATE TABLE revision_ancestry + ( + parent not null, -- joins with revisions.id + child not null, -- joins with revisions.id + unique(parent, child) + ); +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) + ); +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 +); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +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) +); +CREATE TABLE rosters +( +id primary key, -- strong hash of the roster +data not null -- compressed, encoded contents of the roster +); +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/db_data_format_checking/rosterify.db.dumped 3c183f3bfe14b4b88679aa74701683a40e5770f3 +++ tests/db_data_format_checking/rosterify.db.dumped 3c183f3bfe14b4b88679aa74701683a40e5770f3 @@ -0,0 +1,133 @@ +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) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('d009dcf2b02e3ddfea0b0f8a3b23649d6f2d85bf','H4sIAAAAAAAA/yvPSCxRSCxKVajML1VIyc/MS1fISC1KtecCAIbX4aYZAAAA +'); +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 + ); +INSERT INTO manifests VALUES('6533b9185b7575ca21886a0beca66ab266bdb008','H4sIAAAAAAAA/0sxMLBMSU4zSjIwSjVOSUlLTTRIMkizSDROMjI2M7FMMUszSrEwTUpTUEjK +SczgAgBuUuhxLwAAAA== +'); +CREATE TABLE next_roster_node_number +( +node primary key -- only one entry in this table, ever +); +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=='); +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('','44240604f9a7e142c21a2ff26637f95341885e64'); +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('b9bf9ed38352eecf5eac2d7658a21d6528f8f47c','44240604f9a7e142c21a2ff26637f95341885e64','branch','dGVzdGJyYW5jaA== +','address@hidden','IxfZFmHzcg6Sfd1C3rt4ba5fSP9YZrXhF2mhdWhwk7D4eIPdPbN/491VB87urmeAi00mVPW5 +H260RW2fY+KZ0mJhV3BMawswR/bajjPW+sH9OS6zCODg8hV1cOVkuRW3KNdbswDcyqpWBszr +4jHU0l2cyM+MLfXQStWEHdQHPRg= +'); +INSERT INTO revision_certs VALUES('82c226073f3e7fd9064480389e8838c52fadfa28','44240604f9a7e142c21a2ff26637f95341885e64','date','MjAwNi0wMS0xOVQwODoyNzoyOA== +','address@hidden','W+YhTmxFyhtsWtHPQXE+lQsp64nhhLrYpABgX6ygL7D2617PAMh9wtXSKYdDPd45AcNhRlvx +9LDqrDuhy2N/nTW3IQA3ZLKF6pP6z+F7vKveJ76J3Og9a6axJHs0VlBE5JEwT9Exyz9YqitE +zu92EWQmJ2Zix+CR+fwAjSliS2A= +'); +INSERT INTO revision_certs VALUES('8e5d0a797f5ba624a07dbf0500d395f20a2e3749','44240604f9a7e142c21a2ff26637f95341885e64','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','NVCaYuJoJqEo4Zzm5gM/WB89Cgy3DKaw7dOn+80uK+IZQx+KvZegL70Ovp0Nyuo9jQ6MHPNw +tbp0wFIABazsYUa3Fx++z7A83tEFTU6TmrcERYb6D8O7iLsjXjGs1oasnwwCsYAs+joIUoUO +vR/DhqQcUQCLTpAEyu1HwlliPi4= +'); +INSERT INTO revision_certs VALUES('cba3103c208098aa73d613aacf87fcc1e13c07fd','44240604f9a7e142c21a2ff26637f95341885e64','changelog','Zm9v +','address@hidden','PHoZrZbgAVn9UWLJx7a2R39Kzxch9Ne1WxRbLG2r1bo7YhNCoA7xVIFANXfBGx7UwwZHY+Ne +NPX+1RsRd9p2I1dc1m7Zp4pbDh9iILmhuXfbr/5m/5I84JBNilNSg3PuIvaU9/0d49b8ZUgN +pZ1KvYOHcBodZyPot49X/ko86Nw= +'); +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 +); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('44240604f9a7e142c21a2ff26637f95341885e64','H4sIAAAAAAAA/0WOUQqDMBAF/3OKxRPEpFnjWURkN5vFgJqiYq9fWyj9HBjevC2/ppW2ovk4 +YcDgPfdtDNyFLiRybYxIlnMiRGKHyMLWxtGYusi056scpW4wjF/+D90CiUxalgwNLzQ3xjzp +TPOPQPe6fjwAOCsMYm0vSR1bl72I5rtqNZJn5/HRC6qT+5aO5g0GAB5vsgAAAA== +'); +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) +); +CREATE TABLE rosters +( +id primary key, -- strong hash of the roster +data not null -- compressed, encoded contents of the roster +); +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/db_kill_tag_locally/__driver__.lua eb96c1472d7ef266ce84d3fcfb4beb75b3c57661 +++ tests/db_kill_tag_locally/__driver__.lua eb96c1472d7ef266ce84d3fcfb4beb75b3c57661 @@ -0,0 +1,57 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +R1=base_revision() + +writefile("testfile", "foo foo") +commit() +R2=base_revision() + +writefile("testfile", "bar bar") +commit() +R3=base_revision() + +writefile("testfile", "baz baz") +commit() +R4=base_revision() + +check(mtn("tag", R1, "ambig_tag"), 0, false, false) +check(mtn("tag", R2, "ambig_tag"), 0, false, false) +check(mtn("tag", R3, "test_tag"), 0, false, false) +check(mtn("tag", R4, "other_tag"), 0, false, false) + +check(mtn("ls", "tags"), 0, true, false) +check(qgrep(R1, "stdout")) +check(qgrep("ambig_tag", "stdout")) +check(qgrep(R2, "stdout")) +check(qgrep("ambig_tag", "stdout")) +check(qgrep(R3, "stdout")) +check(qgrep("test_tag", "stdout")) +check(qgrep(R4, "stdout")) +check(qgrep("other_tag", "stdout")) + +check(mtn("db", "kill_tag_locally", "test_tag"), 0, false, false) + +check(mtn("ls", "tags"), 0, true, false) +check(qgrep(R1, "stdout")) +check(qgrep("ambig_tag", "stdout")) +check(qgrep(R2, "stdout")) +check(qgrep("ambig_tag", "stdout")) +check(not qgrep(R3, "stdout")) +check(not qgrep("test_tag", "stdout")) +check(qgrep(R4, "stdout")) +check(qgrep("other_tag", "stdout")) + +check(mtn("db", "kill_tag_locally", "ambig_tag"), 0, false, false) + +check(mtn("ls", "tags"), 0, true, false) +check(not qgrep(R1, "stdout")) +check(not qgrep("ambig_tag", "stdout")) +check(not qgrep(R2, "stdout")) +check(not qgrep("ambig_tag", "stdout")) +check(not qgrep(R3, "stdout")) +check(not qgrep("test_tag", "stdout")) +check(qgrep(R4, "stdout")) +check(qgrep("other_tag", "stdout")) ============================================================ --- tests/db_migrate_on_bad_schema/__driver__.lua 77d715318de6a775f5debf2bf394db959fa260e7 +++ tests/db_migrate_on_bad_schema/__driver__.lua 77d715318de6a775f5debf2bf394db959fa260e7 @@ -0,0 +1,8 @@ + +mtn_setup() + +check(mtn("db", "migrate"), 0, false, false) + +check(mtn("db", "execute", 'CREATE TABLE foo (bar primary key, baz not null)'), 0, false, false) + +check(mtn("db", "migrate"), 1, false, false) ============================================================ --- tests/db_rosterify_preserves_renames/__driver__.lua 2f92e22a54b4ed4f7f8b21b4482f96484ffa215f +++ tests/db_rosterify_preserves_renames/__driver__.lua 2f92e22a54b4ed4f7f8b21b4482f96484ffa215f @@ -0,0 +1,19 @@ + +mtn_setup() +remove("test.db") +getfile("test.db.dumped", "stdin") +check(mtn("db", "load"), 0, false, false, true) +check(mtn("db", "migrate"), 0, false, false) +check(mtn("db", "rosterify"), 0, false, false) + +check(mtn("automate", "select", "i:"), 0, true) +check(mtn("automate", "toposort", "address@hidden"), 0, true, false, {"stdout"}) +revs = {} +for l in io.lines("stdout") do + table.insert(revs, l) +end + +-- check the second revision +getfile("expout") +check(mtn("automate", "get_revision", revs[2]), 0, true) +check(samefile("stdout", "expout")) ============================================================ --- tests/db_rosterify_preserves_renames/expout 879f84c3e8b6c3486afcc1ff58295d38984b9862 +++ tests/db_rosterify_preserves_renames/expout 879f84c3e8b6c3486afcc1ff58295d38984b9862 @@ -0,0 +1,11 @@ +format_version "1" + +new_manifest [0ee54a587bc4465f17eaf5de2807fbd7d9f46c75] + +old_revision [3ee4662e91afd842e0eb0e6681db790bf8c3e627] + +rename "testdir_start" + to "testdir_end" + +rename "testfile_start" + to "testfile_end" ============================================================ --- tests/db_rosterify_preserves_renames/test.db.dumped ba2e245c125eeb37a03a7fe22b27c8490b31121b +++ tests/db_rosterify_preserves_renames/test.db.dumped ba2e245c125eeb37a03a7fe22b27c8490b31121b @@ -0,0 +1,148 @@ +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) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('6eadeac2dade6347e87c0d24fd455feffa7069f0','H4sIAAAAAAAA/0tKrOICAOE5e8wEAAAA +'); +INSERT INTO files VALUES('e242ed3bffccdf271b7fbaf34ed72d089537b42f','H4sIAAAAAAAA/0tKLOICAOmzogQEAAAA +'); +INSERT INTO files VALUES('f1d2d2f924e986ac86fdf7b36c94bcdf32beec15','H4sIAAAAAAAA/0vLz+cCAKhlMn4EAAAA +'); +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) + ); +INSERT INTO manifest_deltas VALUES('63d6bb05079cda6b36b267cba14260a85355a2c1','44ea1c2d8a30d7d84e38027a12c16c5fae6cc1bd','H4sIAAAAAAAA/x3MSwqAIBAA0P2cYm6QTmm6btUpQudDgVCk9yfoHeBt6NA7gh3XAH2Ud0xP +K6zn3URfMC8kZJkWzSkWTtHE1jpHzktlsZmqKvuAOLQPu5oefwLwAQfJlNpZAAAA +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('44ea1c2d8a30d7d84e38027a12c16c5fae6cc1bd','H4sIAAAAAAAA/yXNSw6DMBAE0T2n8A1ixp/Bp4nsmW6BhEJEuL8SlFXtXlV0RzfxX2rKikUt +umR6LoUgu8baGEM4rhUntx0TJAs8DdLMKToP5ehMGa7icWkl6cjCEC58Lt/OJ17+eO/dsB67 +45w4u7iwSUZbarel0qkjVWt5/MwkA7C5/IV7ehPTF9sltwKtAAAA +'); +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('46ec58576f9e4f34a9eede521422aa5fd299dc50','address@hidden','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6Pz+IvvOCDDqzN9WFO/zOjL7s9dVCS+zn +s/L9jQ2kHfNWXFof4GcgmMu4DfU4sUrRz39QxDlUrxEOvmIc9z3DNuIcbFZx7UZg9DWfdmDm +vbW79bZlVMeIudAIUwa6euX163AK5hacmqJfuB5U7awQM9o3rn8JYULleAoz5QTtawIDAQAB'); +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('','3b4e3027e4476530b391c9c30aa42b2c3869be5a'); +INSERT INTO revision_ancestry VALUES('3b4e3027e4476530b391c9c30aa42b2c3869be5a','2f728f82cca8d20bba38904b3729ed1bcf7b2686'); +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('4c15eb86ba4a9c322089165ccb9b42bac02076ef','3b4e3027e4476530b391c9c30aa42b2c3869be5a','branch','dGVzdGJyYW5jaA== +','address@hidden','jLIJ7GnnskD4zak7zCdLuoxddAM3K+qYUiNXSowQGUDU5AinIZ2TVJOD2lYChCtAko/9Cxjw +miz4CwcaVBjFXYTFQXtvkrrmUDaHaHIqL5c/qu69Fx8fSKGH2F8iRpAqeCnBg2iVGuptyVsG +wJjbf25hYfw5Lek0/Zhg0Bw9yOM= +'); +INSERT INTO revision_certs VALUES('1ca4481cc65916a401e7bbb0932a5c80b6fab5e6','3b4e3027e4476530b391c9c30aa42b2c3869be5a','date','MjAwNS0xMi0yM1QwMDoxMDoyMg== +','address@hidden','Lkls55flSZQ9FyIcN3w2VhCeVoGUAImlF8Y2FwopdOBsIXOXN4HXTnrINWrW4AFtgzN9yS28 +qm75HV5pzTZvOqmYWSZVYARng++WPBxBhyQJfPZGx+vQXyqCbVWo6xvwrtXWQCqVCA+VHw19 +rdUGcZGDEdGZN6VBoO3XSHjXqgI= +'); +INSERT INTO revision_certs VALUES('2d968c612f6075e34794527c2b1144150b86f5cd','3b4e3027e4476530b391c9c30aa42b2c3869be5a','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','CaXxrxV4fKt6eFfq7q5TXIjUzbRSi/+YNxXMh3RY0zXCur/C9uL4joyA0OoStdOBBFSRNULj +85mKFW/Kt4ZWtIOJetC0TmLTVCwt7wSEHyKYxPLMcDQicsEFxTZ9FPRBKS9haNEHavIPJkdZ +/xySkNqIDRLKzUGjOKaKFzA8Hjg= +'); +INSERT INTO revision_certs VALUES('049eef2a84050bb606ac6e4609ffedc74ddbd6e4','3b4e3027e4476530b391c9c30aa42b2c3869be5a','changelog','Zm9v +','address@hidden','ANIl+ZCcRcxxt+p0wb3vsmPHOjoGFub5Oxd/E5r0/CjB6yOfOWr4n51FNQj4w63iX5GoAY/p +FgxTqL0juPb91HBzcteBGIGk5OQHBGZA7Ei1sSXvkitp85SsEx2APHS4/MR0tiOk/jIx/lGN +SGAtORcnEGxMM2Ku3iShaYKI2tQ= +'); +INSERT INTO revision_certs VALUES('250b867f42768be39b5c753ad5487682004372fc','2f728f82cca8d20bba38904b3729ed1bcf7b2686','branch','dGVzdGJyYW5jaA== +','address@hidden','XxwaE0PdbV1DNVCjjb8hNzqWWlKmH+Ii6+Vfvag+wb+5P3erjco9mmCMpGnS/gXetWusFCm+ +yKFpIkdfpujqiXU0khCce6+VubIjNEJNAgYcB1psCBSxd+9+pqYXJ7oKwQZv0m22x+OSIfFY +cybDWur1YO9Arz9A8CvyC7A5WQ4= +'); +INSERT INTO revision_certs VALUES('9b7a7f1963d770bd918688519b6dc0bb85af3e75','2f728f82cca8d20bba38904b3729ed1bcf7b2686','date','MjAwNS0xMi0yM1QwMDoxMToxMA== +','address@hidden','Vml2MWOChbFRKwhPIOYWN71EoroGRnM0sh0qd0kVhei290BgZXN3kChf0N/Niy2U55UZ2psB +3v5JWJE7PxKNCnsQ+r175xyjJV0KHrktZQVIuUu2PO48uDQpo29H9mqu59H5rB1bXSzxpCSA +7yrzBx/e+VbeHirhJF1J15Wjy94= +'); +INSERT INTO revision_certs VALUES('91445c5e83558a349fae6417e148b2cf4dba128c','2f728f82cca8d20bba38904b3729ed1bcf7b2686','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lVa4YxT683zbf+RtcU/Oo5kXa5w9Ia15TrXteZHeTNKH7ogZLLUIFDQvV3gvy3iy7paJXIPM +RRlpSCjZoKGI+2OJurI+HtSUL00uS1eooDosXGCyLIwcDdYHwTzmr+RIhrnQgGW5l1kF/qr4 +yzGWaOKX5Oslfnx/BEpq2hqOQs4= +'); +INSERT INTO revision_certs VALUES('620fae1e68c199d7299bb81e4c702b57d5e08216','2f728f82cca8d20bba38904b3729ed1bcf7b2686','changelog','Zm9v +','address@hidden','OGvvnz0C1smMU67liD3QLmPYGuYOfysjQeYClviRLCc1p85fYP3K9GSljzMQP6nq7LIY5d+7 +NEcLcsMVShGViiZZBD/lDL3Xu7KR02T+V9RX27kA26Xdvpye8dNt01fp1Z3YTWrHfxwBXSPQ +YHMfrU4q7bwtCIbj84cKfiz0Nes= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('3b4e3027e4476530b391c9c30aa42b2c3869be5a','H4sIAAAAAAAA/32QW2rEMAxF/7MKMxuoI7/itQwhyJZEAplkcEy7/TottDNT6Jdel3Mlbfwx +3XBbhI+qrt6QT0k7HWIm9Mn4BD7khL0Fr3FwxjmE3I9dt680FX5fjmXf1HX8qn9BTYBEkywr +q8teZy5nenns1iakpUxHxVLf7itmnhuEyx/VmX3L2uiONc9PTCVlv52WSqm6tyMYiTEDteCN +DTyErAmskHVOWASD9lH0+AP7Z5VXOIMFJpNEciaB0KcgCcVYpgCkh+hMSBbkGf54wStRegIC +iWA5Dh7z4IUktNfnaFPzMJCYc+/G7hPebDAOrAEAAA== +'); +INSERT INTO revisions VALUES('2f728f82cca8d20bba38904b3729ed1bcf7b2686','H4sIAAAAAAAA/12NUYrDMAxE/3OKkBPYli07ZyklSLIChtaBxGyvX6dLt2Xna2Dm8ao+ljvV +surRxov3SlZcTgQmx5y8QjIuknViUcJKiiKW83UYtltedv0pR9nqeAHu1/5U7yMGMAyzlVnA +EHnHTiDhzBro+uI+QoSMzCaYOEsmZEB2GIXJeoeGUoAQqMu7cNdKd13WctNxap0+23I02ts0 +jO+07WvUmqc/MJf9d+rlP/amzukFPQE4RbDpFwEAAA== +'); +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/diff_--external/__driver__.lua 411e14004692d964f3b8c5f170702e617cb55994 +++ tests/diff_--external/__driver__.lua 411e14004692d964f3b8c5f170702e617cb55994 @@ -0,0 +1,48 @@ + +mtn_setup() + +addfile("testfile", "foo bar") +commit() +old = sha1("testfile") +copyfile("testfile", "old_testfile") + +writefile("testfile", "stuff stuff") +new = sha1("testfile") + +getfile("testhook.lua") + +check(mtn("--rcfile=testhook.lua", "diff", "--external"), 0, true, false) +canonicalize("stdout") +canonicalize("old_version") +canonicalize("new_version") +check(qgrep('file_path: testfile', "stdout")) +check(samefile("old_version", "old_testfile")) +check(samefile("new_version", "testfile")) +check(qgrep('diff_args is NIL', "stdout")) +check(qgrep("rev_old: "..old, "stdout")) +check(qgrep("rev_new: "..new, "stdout")) + +check(mtn("--rcfile=testhook.lua", "diff", "--external", "--diff-args=-foobar"), 0, true, false) +canonicalize("stdout") +canonicalize("old_version") +canonicalize("new_version") +check(qgrep('file_path: testfile', "stdout")) +check(samefile("old_version", "old_testfile")) +check(samefile("new_version", "testfile")) +check(qgrep('diff_args: -foobar', "stdout")) +check(qgrep("rev_old: "..old, "stdout")) +check(qgrep("rev_new: "..new, "stdout")) + +check(mtn("--rcfile=testhook.lua", "diff", "--external", "--diff-args="), 0, true, false) +canonicalize("stdout") +canonicalize("old_version") +canonicalize("new_version") +check(qgrep('file_path: testfile', "stdout")) +check(samefile("old_version", "old_testfile")) +check(samefile("new_version", "testfile")) +check(qgrep('^diff_args: $', "stdout")) +check(qgrep("rev_old: "..old, "stdout")) +check(qgrep("rev_new: "..new, "stdout")) + +-- Make sure that --diff-args without --external is an error +check(mtn("diff", "--diff-args=foo"), 1, false, false) ============================================================ --- tests/diff_--external/testhook.lua f95d8dc471b67ed62015fa8d8648d87326fdd0d5 +++ tests/diff_--external/testhook.lua f95d8dc471b67ed62015fa8d8648d87326fdd0d5 @@ -0,0 +1,16 @@ +function external_diff(file_path, data_old, data_new, is_binary, diff_args, rev_old, rev_new) + io.write("file_path: " .. file_path .. "\n") + f = io.open("old_version", "w") + f:write(data_old) + io.close(f) + f = io.open("new_version", "w") + f:write(data_new) + io.close(f) + if diff_args == nil then + io.write("diff_args is NIL\n") + else + io.write("diff_args: " .. diff_args .. "\n") + end + io.write("rev_old: " .. rev_old .. "\n") + io.write("rev_new: " .. rev_new .. "\n") +end ============================================================ --- tests/diff_-rREV1_-rREV2_UNCHANGED-FILE/__driver__.lua 35324bbd1af0ecb068daa4238ce079ba94c09521 +++ tests/diff_-rREV1_-rREV2_UNCHANGED-FILE/__driver__.lua 35324bbd1af0ecb068daa4238ce079ba94c09521 @@ -0,0 +1,22 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +addfile("otherfile", "foo bar") +commit() +R1=base_revision() + +writefile("otherfile", "stuff stuff") +commit() +R2=base_revision() + +check(mtn("diff", "-r", R1, "-r", R2, "testfile"), 0, true, false) +check(qgrep('no changes', "stdout")) +check(not qgrep("testfile", "stdout")) +check(not qgrep("otherfile", "stdout")) + +check(mtn("diff", "-r", R1, "-r", R2), 0, true, false) +check(not qgrep("testfile", "stdout")) +check(qgrep("otherfile", "stdout")) + +check(mtn("diff", "-r", R1, "-r", R2, "badfile"), 1, true, false) ============================================================ --- tests/diffing_a_file_within_revision_outside_a_workspace/__driver__.lua a1cb0c55b523bb0d7aad0ff7e011f8651ff8ca12 +++ tests/diffing_a_file_within_revision_outside_a_workspace/__driver__.lua a1cb0c55b523bb0d7aad0ff7e011f8651ff8ca12 @@ -0,0 +1,18 @@ + +mtn_setup() + +writefile("foo1", "foo file 1") +writefile("foo2", "foo file 2") + +check(mtn("add", "foo1"), 0, false, false) +commit() +parent = base_revision() + +check(mtn("add", "foo2"), 0, false, false) +commit() +second = base_revision() + +remove_recursive("_MTN") +check(mtn("diff", "--revision", parent, "--revision", second), 0, false, false) +-- check it works when specifying files +check(mtn("diff", "--revision", parent, "--revision", second, "foo2"), 0, false, false) ============================================================ --- tests/disallowing_persistence_of_passphrase/__driver__.lua 97caa9c3d7ad9ea19bd32bc45b812e38a94b7917 +++ tests/disallowing_persistence_of_passphrase/__driver__.lua 97caa9c3d7ad9ea19bd32bc45b812e38a94b7917 @@ -0,0 +1,21 @@ + +mtn_setup() + +getfile("persist.lua") + +addfile("input.txt", "version 0 of the file") +writefile("input.txt", "version 1 of the file") + +check(mtn("--branch=testbranch", "--rcfile=persist.lua", + "commit", "--message=blah-blah"), + 1, false, false, "address@hidden") + +check(mtn("--branch=testbranch", "--rcfile=persist.lua", + "commit", "--message=blah-blah"), + 0, false, false, string.rep("address@hidden", 4)) + +check(mtn("ls", "certs", base_revision()), 0, true) +check(qgrep("branch", "stdout")) +check(qgrep("author", "stdout")) +check(qgrep("date", "stdout")) +check(qgrep("changelog", "stdout")) ============================================================ --- tests/disallowing_persistence_of_passphrase/persist.lua 0364ff652c5a331f264dbfc99e75317c8d4aa100 +++ tests/disallowing_persistence_of_passphrase/persist.lua 0364ff652c5a331f264dbfc99e75317c8d4aa100 @@ -0,0 +1,5 @@ +function persist_phrase_ok() + return false +end + +get_passphrase = nil ============================================================ --- tests/drop_with_actual_removal/__driver__.lua db133ade4e4ac20c8cca33e99e2505447cbee94c +++ tests/drop_with_actual_removal/__driver__.lua db133ade4e4ac20c8cca33e99e2505447cbee94c @@ -0,0 +1,14 @@ + +mtn_setup() + +addfile("file0", "file 0") +addfile("file1", "file 1") +addfile("file2", "file 2") + +check(mtn("drop", "file0"), 0, false, false) +check(mtn("drop", "--execute", "file1"), 0, false, false) +check(mtn("drop", "-e", "file2"), 0, false, false) + +check(exists("file0")) +check(not exists("file1")) +check(not exists("file2")) ============================================================ --- tests/explicit_merge_LEFT_RIGHT_ANC_BRANCH/__driver__.lua 01d988717d007d6dbe2fd3d06a973237dc252f46 +++ tests/explicit_merge_LEFT_RIGHT_ANC_BRANCH/__driver__.lua 01d988717d007d6dbe2fd3d06a973237dc252f46 @@ -0,0 +1,32 @@ + +mtn_setup() + +-- This test relies on a command-line mode which has, for the time +-- being, been disabled. Possibly no need to revive it. + +addfile("testfile", "a\nOLD\nc\nd\ne\n") +commit() +bad_anc = base_revision() + +writefile("testfile", "a\nb\nc\nd\ne\n") +commit() +good_anc = base_revision() + +writefile("testfile", "a\nNEW\nc\nd\ne\n") +commit() +left = base_revision() + +revert_to(good_anc) + +writefile("testfile", "a\nb\nc\nNEW\ne\n") +commit() +right = base_revision() + +-- This should fail: +xfail_if(true, mtn("explicit_merge", left, right, bad_anc, "testbranch"), 1, false, false) +-- But this should work: +xfail_if(true, mtn("explicit_merge", left, right, good_anc, "testbranch"), 0, false, false) +-- And produce the logical result: +check(mtn("update"), 0, false, false) +writefile("expected", "a\nNEW\nc\nNEW\ne\n") +check(samefile("expected", "testfile")) ============================================================ --- tests/fail_cleanly_on_unreadable_db/__driver__.lua 813cc5983532111581d06fbb05eca58e34a63524 +++ tests/fail_cleanly_on_unreadable_db/__driver__.lua 813cc5983532111581d06fbb05eca58e34a63524 @@ -0,0 +1,31 @@ + +skip_if(ostype == "Windows") +skip_if(not existsonpath("chmod")) +mtn_setup() + +addfile("testfile", "blah blah") + +-- unreadable file +check({"chmod", "a-rwx", "test.db"}) +check(mtn(), 2, false, false) +check(mtn("ls", "branches"), 1, false, false) +check(mtn("db", "info"), 1, false, false) +check(mtn("db", "version"), 1, false, false) +check(mtn("db", "migrate"), 1, false, false) +check(mtn("commit", "-mfoo"), 1, false, false) +check(mtn("db", "load"), 1, false, false) +check({"chmod", "a+rwx", "test.db"}) + +mkdir("subdir") +check(mtn("--db=subdir/foo.db", "db", "init"), 0, false, false) + +-- unreadable directory +check({"chmod", "a-rwx", "subdir"}) +check(mtn("--db=subdir/foo.db"), 2, false, false) +check(mtn("--db=subdir/foo.db", "ls", "branches"), 1, false, false) +check(mtn("--db=subdir/foo.db", "db", "info"), 1, false, false) +check(mtn("--db=subdir/foo.db", "db", "version"), 1, false, false) +check(mtn("--db=subdir/foo.db", "db", "migrate"), 1, false, false) +check(mtn("--db=subdir/foo.db", "db", "load"), 1, false, false) +check(mtn("--db=subdir/bar.db", "db", "init"), 1, false, false) +check({"chmod", "a+rwx", "subdir"}) ============================================================ --- tests/filenames_in_diff_after_rename/__driver__.lua f7d87b46a41ca490c41a8d910705bfb34646227a +++ tests/filenames_in_diff_after_rename/__driver__.lua f7d87b46a41ca490c41a8d910705bfb34646227a @@ -0,0 +1,20 @@ + +mtn_setup() + +-- If a file is renamed from "testfile" to "otherfile" and has changes, +-- then 'mtn diff' should display: +-- --- testfile +-- +++ otherfile + +addfile("testfile", "blah blah") +commit() + +writefile("testfile", "stuff stuff") +check(mtn("rename", "--execute", "testfile", "otherfile"), 0, false, false) + +check(exists("otherfile")) + +check(mtn("diff"), 0, true, false) + +check(qgrep("--- testfile", "stdout")) +check(qgrep("\\+\\+\\+ otherfile", "stdout")) ============================================================ --- tests/key_management_without_a_database/__driver__.lua c6d438fdfaf3bcf895a4f8bb2754aeb34a0a73c8 +++ tests/key_management_without_a_database/__driver__.lua c6d438fdfaf3bcf895a4f8bb2754aeb34a0a73c8 @@ -0,0 +1,18 @@ + +mtn_setup() + +-- with no database should work +check(raw_mtn("--keydir=keys", "genkey", "foobar"), 0, false, false, + string.rep("foobar\n", 2)) + +check(raw_mtn("--keydir=keys", "chkeypass", "foobar"), 0, false, false, + "foobar\n"..string.rep("barfoo\n", 2)) + +check(raw_mtn("--keydir=keys", "ls", "keys"), 0, false, false) + +check(raw_mtn("--keydir=keys", "pubkey", "foobar"), 0, false, false) + +check(raw_mtn("--keydir=keys", "dropkey", "foobar"), 0, false, false) + +-- with an invalid database should fail +check(raw_mtn("--keydir=keys", "--db=bork", "genkey", "address@hidden"), 1, false, false, string.rep("address@hidden", 2)) ============================================================ --- tests/list_branches/__driver__.lua 8e6f678eef70f9187fed601e25d14076ba67d17a +++ tests/list_branches/__driver__.lua 8e6f678eef70f9187fed601e25d14076ba67d17a @@ -0,0 +1,38 @@ + +mtn_setup() + +-- ls branches on empty db should return successful and empty +check(mtn("ls", "branches"), 0, true, true) +check(fsize("stdout") == 0) +check(fsize("stderr") == 0) + +-- Let's create some branches, so we have stuff to list +writefile("foo.testbranch", "this is the testbranch version") +writefile("foo.otherbranch", "this version goes in otherbranch") + +copyfile("foo.testbranch", "foo") +check(mtn("add", "foo"), 0, false, false) +commit() + +copyfile("foo.otherbranch", "foo") +commit("otherbranch") + +-- ls branches should list 2 branches now +check(mtn("ls", "branches"), 0, true, true) +check(samelines("stdout", {"otherbranch", "testbranch"})) + +check(mtn("ls", "branches", "otherbr*"),0,true,true) +check(samelines("stdout", {"otherbranch"})) + +check(mtn("ls", "branches", "--exclude", "testbr*"), 0, true, true) +check(samelines("stdout", {"otherbranch"})) + +-- Create an ignore_branch hook to pass in +getfile("ignore_branch.lua") + +-- if we make a change in the branch.to.be.ignored it should not turn up in the list +copyfile("foo.testbranch", "in_ignored") +check(mtn("--rcfile=ignore_branch.lua", "add", "in_ignored"), 0, false, false) +commit("branch.to.be.ignored") +check(mtn("--rcfile=ignore_branch.lua", "ls", "branches"),0,true,true) +check(samelines("stdout", {"otherbranch", "testbranch"})) ============================================================ --- tests/list_branches/ignore_branch.lua 8c35a6d05ad5e75f670db805acfaa1d27f9fd277 +++ tests/list_branches/ignore_branch.lua 8c35a6d05ad5e75f670db805acfaa1d27f9fd277 @@ -0,0 +1,4 @@ +function ignore_branch(branchname) + if(branchname == "branch.to.be.ignored") then return true end + return false +end ============================================================ --- tests/log_--brief/__driver__.lua a32dba1a7d96655603759e0d5fe75ce0d36e88e9 +++ tests/log_--brief/__driver__.lua a32dba1a7d96655603759e0d5fe75ce0d36e88e9 @@ -0,0 +1,19 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +check(mtn("commit", "-b", "testbranch", "--date", "2005-08-16T03:16:00", "-m", "foo"), 0, false, false) +R0=base_revision() + +writefile("testfile", "stuff stuff") +check(mtn("commit", "-b", "testbranch", "--date", "2005-08-16T03:16:00", "-m", "foo"), 0, false, false) +R1=base_revision() + +writefile("testfile", "other other") +check(mtn("commit", "-b", "otherbranch", "--date", "2005-08-16T03:16:05", "-m", "foo"), 0, false, false) +R2=base_revision() + +check(mtn("log", "--brief"), 0, true, false) +check(samelines("stdout", {R2.." address@hidden 2005-08-16T03:16:05 otherbranch", + R1.." address@hidden 2005-08-16T03:16:00 testbranch", + R0.." address@hidden 2005-08-16T03:16:00 testbranch"})) ============================================================ --- tests/logging_a_file_within_revision_outside_a_workspace/__driver__.lua 6ebfa602fc03bcdfbe93676e791c5a6833f083e6 +++ tests/logging_a_file_within_revision_outside_a_workspace/__driver__.lua 6ebfa602fc03bcdfbe93676e791c5a6833f083e6 @@ -0,0 +1,12 @@ + +mtn_setup() + +writefile("foo1", "foo file 1") +writefile("foo2", "foo file 2") + +check(mtn("add", "foo1"), 0, false, false) +commit() +rev = base_revision() + +remove_recursive("_MTN") +check(mtn("log", "--revision", rev, "foo1"), 0, false, false) ============================================================ --- tests/ls_tags_with_ambiguous_tags/__driver__.lua 86ca8c16ab1e8b7c071c1e3dd73f47852059a31e +++ tests/ls_tags_with_ambiguous_tags/__driver__.lua 86ca8c16ab1e8b7c071c1e3dd73f47852059a31e @@ -0,0 +1,17 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +R1=base_revision() + +writefile("testfile", "foo foo") +commit() +R2=base_revision() + +check(mtn("tag", R1, "ambig_tag"), 0, false, false) +check(mtn("tag", R2, "ambig_tag"), 0, false, false) + +check(mtn("ls", "tags"), 0, true, false) +check(qgrep(R1, "stdout")) +check(qgrep(R2, "stdout")) ============================================================ --- tests/merging_(add_a,_rename_a_b)_with_(add_b)/__driver__.lua b37feaf5408df2ec82bf70df8ae3ca74d3199c90 +++ tests/merging_(add_a,_rename_a_b)_with_(add_b)/__driver__.lua b37feaf5408df2ec82bf70df8ae3ca74d3199c90 @@ -0,0 +1,35 @@ + +mtn_setup() + +-- A +-- / \ +-- B C +-- \ / +-- D +-- +-- A is the common ancestor, containing 'add foo'. B contains 'rename foo +-- bar'. C contains 'add bar'. D is a conflict. +revs = {} + +writefile("foo", "extra blah blah foo") + +-- produce state A +check(mtn("add", "foo"), 0, false, false) +commit() +revs.a = base_revision() + +-- produce state B +check(mtn("rename", "foo", "bar"), 0, false, false) +rename("foo", "bar") +commit() +revs.b = base_revision() + +-- produce state C +revert_to(revs.a) +check(mtn("add", "bar"), 0, false, false) +commit() +revs.c = base_revision() + +-- merge heads to make D +-- this is a conflict +check(mtn("merge"), 1, false, false) ============================================================ --- tests/migrate_with_rosterify/1509fd75019aebef5ac3da3a5edf1312393b70e9.mtn.dumped 6b29b8f92c1705172b7bbc60bfd372405a6804d4 +++ tests/migrate_with_rosterify/1509fd75019aebef5ac3da3a5edf1312393b70e9.mtn.dumped 6b29b8f92c1705172b7bbc60bfd372405a6804d4 @@ -0,0 +1,262 @@ +BEGIN TRANSACTION; +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','H4sIAAAAAAAAAPNUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAPNUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAPNUMOVKMykz5OICAJpHQpEKAAAA +'); +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','H4sIAAAAAAAAAEszLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAAAEszLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAEszKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAEszKTPiAgCLs8DyBQAAAA== +'); +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) + ); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','c4fb17aca5ca87b49160401282778891a9885a0a','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('c4fb17aca5ca87b49160401282778891a9885a0a','7d1e0aafd07a9403221e7b17070d185f6f857f62','H4sIAAAAAAAAAEXLyw3DMAgA0LunyAg2P8MIHQMMSJV6a/ZXjhngfa7FMpIMrIEkAZ1Xhcs2 +E+UCbfOYewcp+nXd9b/7+6s1UNpAaebpdoApFJBpNZU0FyHPnvvweQ2MiPJsLWQCPVaMiLXX +8QZWXmSKUyrkNTjGAxlvMr+jAAAA +'); +INSERT INTO manifest_deltas VALUES('7d1e0aafd07a9403221e7b17070d185f6f857f62','d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAPNUMDXiSjGxNLJMMzIxSzEyTjQ1TE1KNDO3tDSzME01skizTEwyMDdPMrEw +TlRQKEktLknLzEk15OJyVjBQMDQw4fIEmWBgaWFikWxiZmyYaGSQmGxoZmZsYpJmapFoZJyW +mmpgkmiWbGZilmiCMMGEiwsAMXnsvnwAAAA= +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAEXLwQ3DMAgF0HumyAhgf3/DONhgqVJvzf7qMQO88B1TlD4jo4RczpQZsVaX +I8mGQW/7vp/6PefzLb2O51ALlHaxvcqG9JVpZ0xbyixAJlxf0y5xg22wazSJrWQHzrBo/VQJ +gptg4DW4/kZ/jYecAAAA +'); +INSERT INTO manifests VALUES('d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAEXLyw3DMAgG4HumyAhgHoZxjPktVeqt2V89ZoDvZBvHUrBQ7EIYSXXHsRnF +3lClqcn3/eD3nM8X46rC6hMQ0xE7YSKCyXudYWGsGUKO8tfIxdhwSo88leqjMWyyM9P0rNW8 +ghAdr9HrD/8LfAOcAAAA +'); +CREATE TABLE private_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- as in public_keys (same identifiers, in fact) + keydata not null -- encrypted RSA private params + ); +INSERT INTO private_keys VALUES('64e3c94bac222441c4da11cca2fb0843f7609e82','address@hidden','npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM +PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc +vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw +ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz +jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/ +xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP +cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf +ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp +6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/ +E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW +M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3 +6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0='); +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('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +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('','696ab0232841aece22eb2ac30160c0c0ce879a46'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','c606ed519e48f526bb130fd64fef712f795f0625'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','04fe9ed6642b2e258162f948934726a3085e473f'); +INSERT INTO revision_ancestry VALUES('04fe9ed6642b2e258162f948934726a3085e473f','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('c606ed519e48f526bb130fd64fef712f795f0625','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','9161ca0e2b8df467cdbecaf359f0f56784222755'); +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('ef12547bb10d8771a77614aac5e9f40962bc479c','696ab0232841aece22eb2ac30160c0c0ce879a46','branch','dGVzdGJyYW5jaDE= +','address@hidden','GnE8iraB+eUtgDFX/0UmaT1XM0jpsX1ZtNYayHceuyvdVLfm4hbHo3l887JITAfRr6L7oPgk +QlNnE6UYaXco1Z1ILvhBVCFfcBkmHVJUcLWbgduSPfbEQYzBTBPssBuff1aZGMI2hucN8Pzm +mKsvRlkIOkLfAEYMTI+pfmILUqE= +'); +INSERT INTO revision_certs VALUES('9f7a88847c247683c5f9d6631e407b72b60842c7','696ab0232841aece22eb2ac30160c0c0ce879a46','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lhEU/k0zzSAy566GJGFzoXzBsTVqBxUfgcU6Ji8gzVwjTc+tZc7SZdGtKK+nPegOzfbJpdw4 +UzGXdjS9Ews4d7XnTyk/I6qr5dXzcsFJiuEZQJ7YQsBpos/+xDiq/JdElxBWpn7fY8oy6N58 +M3AvisNOXBdvhyTO2ItbJh40dwk= +'); +INSERT INTO revision_certs VALUES('30a6f24ae37d7b4b49f08ed49179d153f1bbc022','696ab0232841aece22eb2ac30160c0c0ce879a46','changelog','YmxhaC1ibGFo +','address@hidden','YytH693eNB3wWzZy5tuvN+Fv9I5HmCDOQ+AaejT7WHD2eV9Mt7KUBh/onGmpUu/mej+nZCxB +7U7hcYMrS6wTV0kJdLN0IfcGXIZDdvH3rTf99eXbESF+og9dHHWoi1IcAyS+gVNASuQD2Ebd +9pP5soS2Dcbj8awclbSy57NzWkI= +'); +INSERT INTO revision_certs VALUES('4a12d5fd9b7750d8f3f14c8d7df059450c4b58c1','696ab0232841aece22eb2ac30160c0c0ce879a46','somekey','c29tZXZhbHVl +','address@hidden','Wp6ZgxS1lu0RJr7hsfJT73P8V1FecqRpUMwNx33FJY53oeyCLkj0MvwZEL8cv99t9Bs6Okmq +YZv+HjoSBe4IuYmJobY+a2I0a/CA/ZwL3e7icVHFtR4TohnU7oWtNDl05wj7TSD7lPoVYQ9/ +TIvlT2bs3rHAFhy6WZzz0U2CD0A= +'); +INSERT INTO revision_certs VALUES('7c5a9f69aa2b5017507a6d52d921b63985e4fa23','c606ed519e48f526bb130fd64fef712f795f0625','branch','dGVzdGJyYW5jaDI= +','address@hidden','JnpXgS17t6nJTSsODgTP25ysDBxBgESji5IQzsfWehWPkkpUmBBT+Svcq6GphvXq450N9PA1 +WuGsJ0fKGpe78CswhlC2TXJ11USWTJe6yA4MTviB1MtlpdIwvvDDGRIzq+fJOUvvf8EBZL27 +74qubWb16xbzuY5Z97ZntjSuzx4= +'); +INSERT INTO revision_certs VALUES('188cd2a7bf9ac97da6931d71925eb6d97671ca8e','c606ed519e48f526bb130fd64fef712f795f0625','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','iNZTFVhkg58Xo7R80MzIWd3UIh+oaF9Z89FwMnC3NjqTk62qlqjevrNmakiLGd4H2hbxsfqq +7/h7/+mmqRbvazVpkKoedTfyIS1agRhL5fol91TRyo2brppzL4LgaMoGvr+pQbX6MFhDvjg7 +8Wk21MG0Wf38cav8s7UcIDCf3QE= +'); +INSERT INTO revision_certs VALUES('02b5cadd064fb155ac6ec444ac3a90d183eeab9a','c606ed519e48f526bb130fd64fef712f795f0625','changelog','YmxhaC1ibGFo +','address@hidden','NRxSQQR0ELdIWNdsocKUxfYyICyhWxd5Q9LK6JUoJ6wSPsOhWD51GgkdCJ/DxLUMdUOFOm71 +g5eIi0nK/lpS7Ke0/nA9QFpFQ/OLg+lfkwxq+YzL7RW5FRVfa7t8IRONHDy8OS0XqDDZwivF +JYtmUmwX3M8sOqBV68PLO7isalM= +'); +INSERT INTO revision_certs VALUES('edfa6f6e249d898764a4c7814203253a758af4f5','04fe9ed6642b2e258162f948934726a3085e473f','branch','dGVzdGJyYW5jaDE= +','address@hidden','PBZFgFv9UGap/R5OUdDkBCKWkXIP0/0E+iZuiotlr8q7b3z2yGGpQgdZQpAihXA6UFI+s69t +DYG0TP3tfoHvDBkCBZV+oE6lOyz/Yb5xyq6uO2y163Gb+/FoHg/4FlGFey+BWJgKBV7jwe4L +o0fsBlhRPWIi6/QYjm1dBjfOVnU= +'); +INSERT INTO revision_certs VALUES('55794d3f62ad0ba942b029fc4772a9b6c8d7b09e','04fe9ed6642b2e258162f948934726a3085e473f','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','J9xA555Q3T1+uVsgp68LJdlLibQz/ew+C4rFZWTbVtp+28dMN1HOqvlKWL64JiTLMsciQRo2 +87WrtnKiHrKFzpgG+L4CYccgKAB3VcWfIaMXQFQEMAqwkVFjpiQDAyv7G57niWLeNrJUo6pL +ceAs9yhGr3Xml1GnQqNtysUb958= +'); +INSERT INTO revision_certs VALUES('83e6e0c7549fe3887a382064da4bd5148ba765e1','04fe9ed6642b2e258162f948934726a3085e473f','changelog','YmxhaC1ibGFo +','address@hidden','jhZZDvjkM3OkoRhvjy7yAntK1EL8fF8dwavHE7KxXTZMogxrWzYgx64nvpEiZ9+QeSY+0TF+ +kE48zwrO73RZnGuJzpCl04YuBMk+5NPYAE+xfy8sdzbsLsPE+3ZJXIZ/PJ4x+HA8jQwPYdnA +MTDC3Uho+ohdErvqEZCJQxTwmss= +'); +INSERT INTO revision_certs VALUES('76b300accd7bb6b6e278b7f3c9f83801b14b5f0a','758967c8b6c66c95bcf8fad9f3f76278194c01be','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','dy4R3EjKdrbfKJ3xmX0Xj3XH15ClQOFzAuN6iBX07XmZTBk0wF1G+qiLJoYX8EmVOt8f6wEa +w2XUgMbHM7qDY2IJ4fmULfgI+iKGpJU+qR94raOwsu+pkaPZ/n+6zmg6x32PeqoGTo5gNp3s +QOZH0ixftrh1C40vyuHw4WWg/Ps= +'); +INSERT INTO revision_certs VALUES('041a1a99878d5066fc399f85be3c11bb3bf3d27d','758967c8b6c66c95bcf8fad9f3f76278194c01be','branch','dGVzdGJyYW5jaDE= +','address@hidden','DftwXsK6A0Hoi77kKjIuB3wRI9NkfZ20vg5QUAJcb7I30eRZZ+6SwbEm2ourHvc1u6E7jwjO +a4B8QvOmYtGKusCrDX1KXpCqZ0pnJWnxg8vVRk5npO5qhliz1NsWPEpNAKV6/dU6W3Dzgf5J +xl3aAP5+XroLsHXL9/FzNDnfvMg= +'); +INSERT INTO revision_certs VALUES('d908bffb758afe95e4fb380e475fcbb11e91d376','758967c8b6c66c95bcf8fad9f3f76278194c01be','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzYwNmVkNTE5ZTQ4 +ZjUyNmJiMTMwZmQ2NGZlZjcxMmY3OTVmMDYyNSkKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgMDRmZTllZDY2NDJiMmUyNTgxNjJmOTQ4OTM0NzI2YTMwODVl +NDczZikK +','address@hidden','CkAXf32lcw4+JHqG35dDrUZZBH+keMhHX4Y9nGfOgdWVa1Of6usqlFAJZrkMwjBO/qY3Jzdw +1dx47a8LuqDLAY7wUMbF6Ry7HEVXFEeaJrRBFADA7MQGvdt9+UIZMQ9D5FxmDZ6EEIb8XCym ++x+XNAElrfEIognCeTgQ3a/39qs= +'); +INSERT INTO revision_certs VALUES('4a3e67376fc23bfa02ea989936c0736365d831fc','9161ca0e2b8df467cdbecaf359f0f56784222755','branch','dGVzdGJyYW5jaDM= +','address@hidden','UMA2Zxyz0KfA3Y/7ICHrT4czGZgBzQyjFcLqCKaKXxsuwfEOZuHvksKep55NZVra+XHzmMDS +xokNhihk1BTAaR1CH2JTgKWJ5Cf0YAY+8O3Z3WbLuGoW3y/zyyj9dOEJMfiSXwdBpsrXTQvM +yTxVkrwdgFqcxVDO53Xtp93am+8= +'); +INSERT INTO revision_certs VALUES('e50413c2a1972047c2f246de7574c4187cbedce8','9161ca0e2b8df467cdbecaf359f0f56784222755','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','Dvw+2q6syHBdZx2Cc/jNwNxjtOjfk1Ivr7aZgldOnWc9URPVlg4YCxYrHdFR4nFoE4u4I4xN +wBcsbIeGJcw7COh6wZvagrl1bbbesKDfCGpH/uD81mH8MzVJmgI+OG1BenXgSGPjIqTMcsxE +HuSX9pXid9XxU6jBke2cA9vKLJQ= +'); +INSERT INTO revision_certs VALUES('21b01f4e3cb751c0853a852250d57ce5f0491872','9161ca0e2b8df467cdbecaf359f0f56784222755','changelog','YmxhaC1ibGFo +','address@hidden','Cby4qjs1FPRbvf82UJjOUKDoMJQLBIfOy/FIWKVP5EvF67g2RrWOMGAqG33/lXY8NSXwFb9Q +dTkAHvwGvoKKBWwoonU0dMbm4GdocCYBhpsfuwZ25YhS+PJ2KXjm+hn73CROpjMO1tc5lmUQ +cqJSB4VMcru3CuGwEywJ1iyMNE8= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','H4sIAAAAAAAAAG3M0crCMAyG4XOvongFadqlzbWMMdIm5R/oJjr09q2e/IieJS8fz2qP+Szr +0uy2uxE4QABOXAtXyBh9NimaorEHymI2mARP0+GwnXS+2n25Ldvqxun9/0N9IKpzW07mjntP +r8sff1Xs9SJ7/fsYunbdzi/HObdvbhSuksATJ1ExICpMCkmklAANlDAOxFinLwy/sUCNMUfQ +2pogAsWCqmyQY1Yfw9DFVIeOPQEtJDHlHwEAAA== +'); +INSERT INTO revisions VALUES('c606ed519e48f526bb130fd64fef712f795f0625','H4sIAAAAAAAAAF2QQWoDMQxF93MKkxPIki1LZxlCkG2ZDiSZkgzt9et0kULRRgjef3zd/fty +s/s2/HmEtaVRY7FmuZmUmjQyJIgoWIqIRlORbGDnZdmv/fLwr+257fewsrJVQEJJ0bw5ole0 +RjAD2mtcilri8y/3JwQlINCirWoDwRTFrfaSXCOwmHt2ozi5xXq/jO3q4XRM9LXRaVk+7Wgf +f6d4WsJ47LewmjYrU6/FujkwV+UOxaxWggGdMWVWbOclhHDsYe1JUQcm7kiWo1fjosqSHWXo +bFfmQ4Re3f9J6S19h9Xq1oc45YTS1DMReYnNBmbJMakQsNfZ6wdFvbXtgQEAAA== +'); +INSERT INTO revisions VALUES('04fe9ed6642b2e258162f948934726a3085e473f','H4sIAAAAAAAAAGWOQWoDMQxF9z6FyQkkW5bls4QhyLJMB5JMSYb2+p10kS7K33wET+/f/fty +0/s6/bnHcx1UZhPFniEla8oKWHSM7iVjgSIDtJovIWzXcXn41/pct3s8c2PtkHISQnXzlLwn +tQzIYK+41KbEyy/3J4SWIUOrzXozkEQorn1U8obAou7FNePBhWPFZa5Xj6f9QF+NTiF86m4f +f6d0CnE+tls8Z57tWAPD5tSUgKmnMZqDkAykXGBCtWJLiDHuWzzPNgqKkmMGse5SIPcxZJYq +HXk4EVRquPyT0lv6fgbt0BhxRk2ghsyZaBbRlKc7kLIxsdISfgDKoS95gQEAAA== +'); +INSERT INTO revisions VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','H4sIAAAAAAAAAG2RUWpjMQxF/98qHlmBLEuytJYQgmxLNNAmpQ2d7Y87H+kwmT8jkM69x9f4 +dX7z6yXj874f2ywB7jmhuRFUxBKtlwYNZlFOSeWWgqdtu73O80d8XT4vt+t+BMqwmCKEHQNZ +i2AaqVVqKF5BOajVPP3Z+xtInKZeegXEYS4OhX3OHlwLA+sEbyMWcA3PeXmN/XBfq9+veti2 +d7+Pl59ROWx7ftze9qPb8AZFrPn0AJFu8l3L+0IlTEFiMRynbd/3+20/TjK0RJKJ1blEd2lm +soKjpnmH1jpp9dMTtD6gj2O9h8/UqEyow1aZWqOV4bnccCHTChJdnkQOWfPJxYI0GaX3suJO +WX6zFcxmnCDI/4oclOuffDgP1xXUigBBQcXWVK24qbKD/1ckPYvER6cqaagEc2Q6Igh1nNMC +lHQWqrxstsE/ItNWfnWKlVxHD2Wofc5Vp2kvMoMI2gr4LJKeRYItzCCpxRF8FJFKlKyONSOA +XIaQOJ2233wgvJ3KAgAA +'); +INSERT INTO revisions VALUES('9161ca0e2b8df467cdbecaf359f0f56784222755','H4sIAAAAAAAAAEWPUYrEMAxD/3OK0BPEieM4ZymlOInNFjrtMlN2r7+d/Zk/IZCedOjv+pBj +M31dfh65V01DJRpaKEJibbSKAZomlJ66WaucF+fOfaxP/dle23n4uWSuVDo36kS95taNTUa1 +ZIViYajY3yXLf+4DLAM0iNi4YTcmxQhaGpRQwgDORsa5GMUbOHTXS1fbdvXTdaffCibnvuXq +Xx8LJ+fteT78HCojd6QEEoN0IEqIllliMtWAco9FElyc9/46/QzalUIlrvdLpDg05gIEEArV +JgOEg/Lgxf0BzXe4vzcBAAA= +'); +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/migrate_with_rosterify/40369a7bda66463c5785d160819ab6398b9d44f4.mtn.dumped 9715d7942343f2bedfc46dee9d5698a987d44b26 +++ tests/migrate_with_rosterify/40369a7bda66463c5785d160819ab6398b9d44f4.mtn.dumped 9715d7942343f2bedfc46dee9d5698a987d44b26 @@ -0,0 +1,252 @@ +BEGIN TRANSACTION; +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 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','H4sIAAAAAAAAAPNUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAPNUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAPNUMOVKMykz5OICAJpHQpEKAAAA +'); +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','H4sIAAAAAAAAAEszLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAAAEszLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAEszKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAEszKTPiAgCLs8DyBQAAAA== +'); +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) + ); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','c4fb17aca5ca87b49160401282778891a9885a0a','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('c4fb17aca5ca87b49160401282778891a9885a0a','7d1e0aafd07a9403221e7b17070d185f6f857f62','H4sIAAAAAAAAAEXLyw3DMAgA0LunyAg2P8MIHQMMSJV6a/ZXjhngfa7FMpIMrIEkAZ1Xhcs2 +E+UCbfOYewcp+nXd9b/7+6s1UNpAaebpdoApFJBpNZU0FyHPnvvweQ2MiPJsLWQCPVaMiLXX +8QZWXmSKUyrkNTjGAxlvMr+jAAAA +'); +INSERT INTO manifest_deltas VALUES('7d1e0aafd07a9403221e7b17070d185f6f857f62','d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAPNUMDXiSjGxNLJMMzIxSzEyTjQ1TE1KNDO3tDSzME01skizTEwyMDdPMrEw +TlRQKEktLknLzEk15OJyVjBQMDQw4fIEmWBgaWFikWxiZmyYaGSQmGxoZmZsYpJmapFoZJyW +mmpgkmiWbGZilmiCMMGEiwsAMXnsvnwAAAA= +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAEXLwQ3DMAgF0HumyAhgf3/DONhgqVJvzf7qMQO88B1TlD4jo4RczpQZsVaX +I8mGQW/7vp/6PefzLb2O51ALlHaxvcqG9JVpZ0xbyixAJlxf0y5xg22wazSJrWQHzrBo/VQJ +gptg4DW4/kZ/jYecAAAA +'); +INSERT INTO manifests VALUES('d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAEXLyw3DMAgG4HumyAhgHoZxjPktVeqt2V89ZoDvZBvHUrBQ7EIYSXXHsRnF +3lClqcn3/eD3nM8X46rC6hMQ0xE7YSKCyXudYWGsGUKO8tfIxdhwSo88leqjMWyyM9P0rNW8 +ghAdr9HrD/8LfAOcAAAA +'); +CREATE TABLE private_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- as in public_keys (same identifiers, in fact) + keydata not null -- encrypted RSA private params + ); +INSERT INTO private_keys VALUES('64e3c94bac222441c4da11cca2fb0843f7609e82','address@hidden','npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM +PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc +vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw +ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz +jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/ +xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP +cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf +ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp +6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/ +E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW +M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3 +6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0='); +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('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +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('','696ab0232841aece22eb2ac30160c0c0ce879a46'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','c606ed519e48f526bb130fd64fef712f795f0625'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','04fe9ed6642b2e258162f948934726a3085e473f'); +INSERT INTO revision_ancestry VALUES('04fe9ed6642b2e258162f948934726a3085e473f','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('c606ed519e48f526bb130fd64fef712f795f0625','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','9161ca0e2b8df467cdbecaf359f0f56784222755'); +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('ef12547bb10d8771a77614aac5e9f40962bc479c','696ab0232841aece22eb2ac30160c0c0ce879a46','branch','dGVzdGJyYW5jaDE= +','address@hidden','GnE8iraB+eUtgDFX/0UmaT1XM0jpsX1ZtNYayHceuyvdVLfm4hbHo3l887JITAfRr6L7oPgk +QlNnE6UYaXco1Z1ILvhBVCFfcBkmHVJUcLWbgduSPfbEQYzBTBPssBuff1aZGMI2hucN8Pzm +mKsvRlkIOkLfAEYMTI+pfmILUqE= +'); +INSERT INTO revision_certs VALUES('9f7a88847c247683c5f9d6631e407b72b60842c7','696ab0232841aece22eb2ac30160c0c0ce879a46','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lhEU/k0zzSAy566GJGFzoXzBsTVqBxUfgcU6Ji8gzVwjTc+tZc7SZdGtKK+nPegOzfbJpdw4 +UzGXdjS9Ews4d7XnTyk/I6qr5dXzcsFJiuEZQJ7YQsBpos/+xDiq/JdElxBWpn7fY8oy6N58 +M3AvisNOXBdvhyTO2ItbJh40dwk= +'); +INSERT INTO revision_certs VALUES('30a6f24ae37d7b4b49f08ed49179d153f1bbc022','696ab0232841aece22eb2ac30160c0c0ce879a46','changelog','YmxhaC1ibGFo +','address@hidden','YytH693eNB3wWzZy5tuvN+Fv9I5HmCDOQ+AaejT7WHD2eV9Mt7KUBh/onGmpUu/mej+nZCxB +7U7hcYMrS6wTV0kJdLN0IfcGXIZDdvH3rTf99eXbESF+og9dHHWoi1IcAyS+gVNASuQD2Ebd +9pP5soS2Dcbj8awclbSy57NzWkI= +'); +INSERT INTO revision_certs VALUES('4a12d5fd9b7750d8f3f14c8d7df059450c4b58c1','696ab0232841aece22eb2ac30160c0c0ce879a46','somekey','c29tZXZhbHVl +','address@hidden','Wp6ZgxS1lu0RJr7hsfJT73P8V1FecqRpUMwNx33FJY53oeyCLkj0MvwZEL8cv99t9Bs6Okmq +YZv+HjoSBe4IuYmJobY+a2I0a/CA/ZwL3e7icVHFtR4TohnU7oWtNDl05wj7TSD7lPoVYQ9/ +TIvlT2bs3rHAFhy6WZzz0U2CD0A= +'); +INSERT INTO revision_certs VALUES('7c5a9f69aa2b5017507a6d52d921b63985e4fa23','c606ed519e48f526bb130fd64fef712f795f0625','branch','dGVzdGJyYW5jaDI= +','address@hidden','JnpXgS17t6nJTSsODgTP25ysDBxBgESji5IQzsfWehWPkkpUmBBT+Svcq6GphvXq450N9PA1 +WuGsJ0fKGpe78CswhlC2TXJ11USWTJe6yA4MTviB1MtlpdIwvvDDGRIzq+fJOUvvf8EBZL27 +74qubWb16xbzuY5Z97ZntjSuzx4= +'); +INSERT INTO revision_certs VALUES('188cd2a7bf9ac97da6931d71925eb6d97671ca8e','c606ed519e48f526bb130fd64fef712f795f0625','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','iNZTFVhkg58Xo7R80MzIWd3UIh+oaF9Z89FwMnC3NjqTk62qlqjevrNmakiLGd4H2hbxsfqq +7/h7/+mmqRbvazVpkKoedTfyIS1agRhL5fol91TRyo2brppzL4LgaMoGvr+pQbX6MFhDvjg7 +8Wk21MG0Wf38cav8s7UcIDCf3QE= +'); +INSERT INTO revision_certs VALUES('02b5cadd064fb155ac6ec444ac3a90d183eeab9a','c606ed519e48f526bb130fd64fef712f795f0625','changelog','YmxhaC1ibGFo +','address@hidden','NRxSQQR0ELdIWNdsocKUxfYyICyhWxd5Q9LK6JUoJ6wSPsOhWD51GgkdCJ/DxLUMdUOFOm71 +g5eIi0nK/lpS7Ke0/nA9QFpFQ/OLg+lfkwxq+YzL7RW5FRVfa7t8IRONHDy8OS0XqDDZwivF +JYtmUmwX3M8sOqBV68PLO7isalM= +'); +INSERT INTO revision_certs VALUES('edfa6f6e249d898764a4c7814203253a758af4f5','04fe9ed6642b2e258162f948934726a3085e473f','branch','dGVzdGJyYW5jaDE= +','address@hidden','PBZFgFv9UGap/R5OUdDkBCKWkXIP0/0E+iZuiotlr8q7b3z2yGGpQgdZQpAihXA6UFI+s69t +DYG0TP3tfoHvDBkCBZV+oE6lOyz/Yb5xyq6uO2y163Gb+/FoHg/4FlGFey+BWJgKBV7jwe4L +o0fsBlhRPWIi6/QYjm1dBjfOVnU= +'); +INSERT INTO revision_certs VALUES('55794d3f62ad0ba942b029fc4772a9b6c8d7b09e','04fe9ed6642b2e258162f948934726a3085e473f','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','J9xA555Q3T1+uVsgp68LJdlLibQz/ew+C4rFZWTbVtp+28dMN1HOqvlKWL64JiTLMsciQRo2 +87WrtnKiHrKFzpgG+L4CYccgKAB3VcWfIaMXQFQEMAqwkVFjpiQDAyv7G57niWLeNrJUo6pL +ceAs9yhGr3Xml1GnQqNtysUb958= +'); +INSERT INTO revision_certs VALUES('83e6e0c7549fe3887a382064da4bd5148ba765e1','04fe9ed6642b2e258162f948934726a3085e473f','changelog','YmxhaC1ibGFo +','address@hidden','jhZZDvjkM3OkoRhvjy7yAntK1EL8fF8dwavHE7KxXTZMogxrWzYgx64nvpEiZ9+QeSY+0TF+ +kE48zwrO73RZnGuJzpCl04YuBMk+5NPYAE+xfy8sdzbsLsPE+3ZJXIZ/PJ4x+HA8jQwPYdnA +MTDC3Uho+ohdErvqEZCJQxTwmss= +'); +INSERT INTO revision_certs VALUES('76b300accd7bb6b6e278b7f3c9f83801b14b5f0a','758967c8b6c66c95bcf8fad9f3f76278194c01be','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','dy4R3EjKdrbfKJ3xmX0Xj3XH15ClQOFzAuN6iBX07XmZTBk0wF1G+qiLJoYX8EmVOt8f6wEa +w2XUgMbHM7qDY2IJ4fmULfgI+iKGpJU+qR94raOwsu+pkaPZ/n+6zmg6x32PeqoGTo5gNp3s +QOZH0ixftrh1C40vyuHw4WWg/Ps= +'); +INSERT INTO revision_certs VALUES('041a1a99878d5066fc399f85be3c11bb3bf3d27d','758967c8b6c66c95bcf8fad9f3f76278194c01be','branch','dGVzdGJyYW5jaDE= +','address@hidden','DftwXsK6A0Hoi77kKjIuB3wRI9NkfZ20vg5QUAJcb7I30eRZZ+6SwbEm2ourHvc1u6E7jwjO +a4B8QvOmYtGKusCrDX1KXpCqZ0pnJWnxg8vVRk5npO5qhliz1NsWPEpNAKV6/dU6W3Dzgf5J +xl3aAP5+XroLsHXL9/FzNDnfvMg= +'); +INSERT INTO revision_certs VALUES('d908bffb758afe95e4fb380e475fcbb11e91d376','758967c8b6c66c95bcf8fad9f3f76278194c01be','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzYwNmVkNTE5ZTQ4 +ZjUyNmJiMTMwZmQ2NGZlZjcxMmY3OTVmMDYyNSkKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgMDRmZTllZDY2NDJiMmUyNTgxNjJmOTQ4OTM0NzI2YTMwODVl +NDczZikK +','address@hidden','CkAXf32lcw4+JHqG35dDrUZZBH+keMhHX4Y9nGfOgdWVa1Of6usqlFAJZrkMwjBO/qY3Jzdw +1dx47a8LuqDLAY7wUMbF6Ry7HEVXFEeaJrRBFADA7MQGvdt9+UIZMQ9D5FxmDZ6EEIb8XCym ++x+XNAElrfEIognCeTgQ3a/39qs= +'); +INSERT INTO revision_certs VALUES('4a3e67376fc23bfa02ea989936c0736365d831fc','9161ca0e2b8df467cdbecaf359f0f56784222755','branch','dGVzdGJyYW5jaDM= +','address@hidden','UMA2Zxyz0KfA3Y/7ICHrT4czGZgBzQyjFcLqCKaKXxsuwfEOZuHvksKep55NZVra+XHzmMDS +xokNhihk1BTAaR1CH2JTgKWJ5Cf0YAY+8O3Z3WbLuGoW3y/zyyj9dOEJMfiSXwdBpsrXTQvM +yTxVkrwdgFqcxVDO53Xtp93am+8= +'); +INSERT INTO revision_certs VALUES('e50413c2a1972047c2f246de7574c4187cbedce8','9161ca0e2b8df467cdbecaf359f0f56784222755','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','Dvw+2q6syHBdZx2Cc/jNwNxjtOjfk1Ivr7aZgldOnWc9URPVlg4YCxYrHdFR4nFoE4u4I4xN +wBcsbIeGJcw7COh6wZvagrl1bbbesKDfCGpH/uD81mH8MzVJmgI+OG1BenXgSGPjIqTMcsxE +HuSX9pXid9XxU6jBke2cA9vKLJQ= +'); +INSERT INTO revision_certs VALUES('21b01f4e3cb751c0853a852250d57ce5f0491872','9161ca0e2b8df467cdbecaf359f0f56784222755','changelog','YmxhaC1ibGFo +','address@hidden','Cby4qjs1FPRbvf82UJjOUKDoMJQLBIfOy/FIWKVP5EvF67g2RrWOMGAqG33/lXY8NSXwFb9Q +dTkAHvwGvoKKBWwoonU0dMbm4GdocCYBhpsfuwZ25YhS+PJ2KXjm+hn73CROpjMO1tc5lmUQ +cqJSB4VMcru3CuGwEywJ1iyMNE8= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','H4sIAAAAAAAAAG3M0crCMAyG4XOvongFadqlzbWMMdIm5R/oJjr09q2e/IieJS8fz2qP+Szr +0uy2uxE4QABOXAtXyBh9NimaorEHymI2mARP0+GwnXS+2n25Ldvqxun9/0N9IKpzW07mjntP +r8sff1Xs9SJ7/fsYunbdzi/HObdvbhSuksATJ1ExICpMCkmklAANlDAOxFinLwy/sUCNMUfQ +2pogAsWCqmyQY1Yfw9DFVIeOPQEtJDHlHwEAAA== +'); +INSERT INTO revisions VALUES('c606ed519e48f526bb130fd64fef712f795f0625','H4sIAAAAAAAAAF2QQWoDMQxF93MKkxPIki1LZxlCkG2ZDiSZkgzt9et0kULRRgjef3zd/fty +s/s2/HmEtaVRY7FmuZmUmjQyJIgoWIqIRlORbGDnZdmv/fLwr+257fewsrJVQEJJ0bw5ole0 +RjAD2mtcilri8y/3JwQlINCirWoDwRTFrfaSXCOwmHt2ozi5xXq/jO3q4XRM9LXRaVk+7Wgf +f6d4WsJ47LewmjYrU6/FujkwV+UOxaxWggGdMWVWbOclhHDsYe1JUQcm7kiWo1fjosqSHWXo +bFfmQ4Re3f9J6S19h9Xq1oc45YTS1DMReYnNBmbJMakQsNfZ6wdFvbXtgQEAAA== +'); +INSERT INTO revisions VALUES('04fe9ed6642b2e258162f948934726a3085e473f','H4sIAAAAAAAAAGWOQWoDMQxF9z6FyQkkW5bls4QhyLJMB5JMSYb2+p10kS7K33wET+/f/fty +0/s6/bnHcx1UZhPFniEla8oKWHSM7iVjgSIDtJovIWzXcXn41/pct3s8c2PtkHISQnXzlLwn +tQzIYK+41KbEyy/3J4SWIUOrzXozkEQorn1U8obAou7FNePBhWPFZa5Xj6f9QF+NTiF86m4f +f6d0CnE+tls8Z57tWAPD5tSUgKmnMZqDkAykXGBCtWJLiDHuWzzPNgqKkmMGse5SIPcxZJYq +HXk4EVRquPyT0lv6fgbt0BhxRk2ghsyZaBbRlKc7kLIxsdISfgDKoS95gQEAAA== +'); +INSERT INTO revisions VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','H4sIAAAAAAAAAG2RUWpjMQxF/98qHlmBLEuytJYQgmxLNNAmpQ2d7Y87H+kwmT8jkM69x9f4 +dX7z6yXj874f2ywB7jmhuRFUxBKtlwYNZlFOSeWWgqdtu73O80d8XT4vt+t+BMqwmCKEHQNZ +i2AaqVVqKF5BOajVPP3Z+xtInKZeegXEYS4OhX3OHlwLA+sEbyMWcA3PeXmN/XBfq9+veti2 +d7+Pl59ROWx7ftze9qPb8AZFrPn0AJFu8l3L+0IlTEFiMRynbd/3+20/TjK0RJKJ1blEd2lm +soKjpnmH1jpp9dMTtD6gj2O9h8/UqEyow1aZWqOV4bnccCHTChJdnkQOWfPJxYI0GaX3suJO +WX6zFcxmnCDI/4oclOuffDgP1xXUigBBQcXWVK24qbKD/1ckPYvER6cqaagEc2Q6Igh1nNMC +lHQWqrxstsE/ItNWfnWKlVxHD2Wofc5Vp2kvMoMI2gr4LJKeRYItzCCpxRF8FJFKlKyONSOA +XIaQOJ2233wgvJ3KAgAA +'); +INSERT INTO revisions VALUES('9161ca0e2b8df467cdbecaf359f0f56784222755','H4sIAAAAAAAAAEWPUYrEMAxD/3OK0BPEieM4ZymlOInNFjrtMlN2r7+d/Zk/IZCedOjv+pBj +M31dfh65V01DJRpaKEJibbSKAZomlJ66WaucF+fOfaxP/dle23n4uWSuVDo36kS95taNTUa1 +ZIViYajY3yXLf+4DLAM0iNi4YTcmxQhaGpRQwgDORsa5GMUbOHTXS1fbdvXTdaffCibnvuXq +Xx8LJ+fteT78HCojd6QEEoN0IEqIllliMtWAco9FElyc9/46/QzalUIlrvdLpDg05gIEEArV +JgOEg/Lgxf0BzXe4vzcBAAA= +'); +COMMIT; ============================================================ --- tests/migrate_with_rosterify/__driver__.lua 1ff3b4055bd96ae0e2760d6a3502f98f9611cc7a +++ tests/migrate_with_rosterify/__driver__.lua 1ff3b4055bd96ae0e2760d6a3502f98f9611cc7a @@ -0,0 +1,92 @@ + +mtn_setup() + +-- This test takes databases in all the old pre-roster formats, and +-- checks that migrating them forward then rosterifying them works. + +-- 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. + +-------------------------------------------------------------------------------------------------------------------------------------------- +---- Do not touch this code; you'll have to regenerate all the test +---- databases if you do! +-------------------------------------------------------------------------------------------------------------------------------------------- + +-- We don't want the standard db, we want full control ourselves +remove("test.db") +remove_recursive("keys") +check(mtn("db", "init")) + +-- Put some random keys in, with and without corresponding private keys +getfile("migrate_keys") +check(mtn("read"), 0, false, false, {"migrate_keys"}) + +addfile("testfile1", "f1v1\n") +addfile("testfile2", "f2v1\n") +commit("testbranch1") +rev=base_revision() + +check(mtn("cert", rev, "somekey", "somevalue"), 0, false, false) + +writefile("testfile1", "f1v2\n") +addfile("testfile3", "f3v1\n") +commit("testbranch2") + +revert_to(rev) + +writefile("testfile2", "f2v2\n") +addfile("testfile4", "f4v1\n") +commit("testbranch1") + +getfile("old_revs_propagate_log") +check(mtn("propagate", "testbranch2", "testbranch1", + "--message-file=old_revs_propagate_log"), 0, false, false) +check(mtn("update"), 0, false, false) + +check(mtn("drop", "testfile1"), 0, false, false) +writefile("testfile4", "f4v2\n") +commit("testbranch3") + +-- Exception to this code being untouchable: +-- This line may have to be modified at a later date; this won't cause +-- any problem, as long as it's replaced by code with the same effect. +check(mtn("db", "execute", "DELETE FROM revision_certs WHERE name = 'date'"), 0, false, false) + +copyfile("test.db", "latest.mtn") + +if debugging then + check(mtn("--db=latest.mtn", "db", "dump"), 0, true, false) + rename("stdout", "latest.mtn.dumped") + check(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(mtn("--db="..id..".mtn", "db", "load"), 0, false, false, true) + -- check that the version's correct + check(mtn("--db="..id..".mtn", "db", "version"), 0, true, false) + check(qgrep(id, "stdout")) + -- migrate it + check(mtn("--db="..id..".mtn", "db", "migrate"), 0, false, false) + check(mtn("--db="..id..".mtn", "db", "rosterify"), 0, false, false) + check_same_db_contents(id..".mtn", "latest.mtn") +end + + +check_migrate_from("c1e86588e11ad07fa53e5d294edc043ce1d4005a") +check_migrate_from("40369a7bda66463c5785d160819ab6398b9d44f4") +check_migrate_from("e372b508bea9b991816d1c74680f7ae10d2a6d94") +check_migrate_from("1509fd75019aebef5ac3da3a5edf1312393b70e9") +check_migrate_from("bd86f9a90b5d552f0be1fa9aee847ea0f317778b") ============================================================ --- tests/migrate_with_rosterify/bd86f9a90b5d552f0be1fa9aee847ea0f317778b.mtn.dumped bd752686b5ce2506bac6448d86521ef24208fc8e +++ tests/migrate_with_rosterify/bd86f9a90b5d552f0be1fa9aee847ea0f317778b.mtn.dumped bd752686b5ce2506bac6448d86521ef24208fc8e @@ -0,0 +1,242 @@ +BEGIN TRANSACTION; +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) + ); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','c4fb17aca5ca87b49160401282778891a9885a0a','H4sIAAAAAAAA/03LwQ2AIAwF0DtTMMKnlEJHcIxCaWLiTfePHn33d+QCTqbLOopoN7cNkani +6GZzVgRciJsorZyffT9xXrukKqE0GL4ijAjCk9x1Y/DwwrV9sa/2O5TSC/rOjaZvAAAA +'); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAA/03LwQ2AIAwF0DtTMMKnlEJHcIxCaWLiTfePHn33d+QCTqbLOopoN7cNkani +6GZzVgRciJsorZyffT9xXrukKqE0GL4ijAjCk9x1Y/DwwrV9sa/2O5TSC/rOjaZvAAAA +'); +INSERT INTO manifest_deltas VALUES('c4fb17aca5ca87b49160401282778891a9885a0a','7d1e0aafd07a9403221e7b17070d185f6f857f62','H4sIAAAAAAAA/0XLuw3EMAgA0N5TZATMzzDCjYENSJGuu+yvK/P697mm6Eh29EbWRAqZtUOX +u5oUWntsWGuzUVzXU7+n72/NQdqOxpCnOxBBeWOmFxhbTiaBhnXkvAfH3hXZViSMdryEiGrN +E41iMtmNQGvre2iMPxlvMr+jAAAA +'); +INSERT INTO manifest_deltas VALUES('7d1e0aafd07a9403221e7b17070d185f6f857f62','d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAA/0XMsQ3EMAgF0J4pPALG3xjqqzIGdrAUKV2yv05X3RvgHaULnXDxLdBTWvSa +M3S4q/UU2x6Tx5iwFqW8+bz7urMSfQqXyqDjN7AbbEFbDeFYVbUBu1tI25mM0KXQwH8A0Rcx +eey+fAAAAA== +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAA/0XLsQ3DMAwEwN5TeARSer3IcSiRAgKki/dHSl9/4TumKH1GRgm5nCkzYq0u +R5INg972fT/1e87nW3odz6EWKO1ie5UN6SvTzpi2lFmATLi+p13iBttg12gSW8kOnGHR+qkS +BDfBwHtw/QFGf42HnAAAAA== +'); +INSERT INTO manifests VALUES('d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAA/0XLuw3DMAwFwN5TeARS/IgcRxSfgADp4v2R0tffyTaOpWCh2IUwkuqOYzOK +vaFKU5Pv+8HvOZ8vxlWF1ScgpiN2wkQEk/c6w8JYM4Qc5e+Ri7HhlB55KtVHY9hkZ6bpWat5 +BSE63qPXH/8LfAOcAAAA +'); +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('','696ab0232841aece22eb2ac30160c0c0ce879a46'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','c606ed519e48f526bb130fd64fef712f795f0625'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','04fe9ed6642b2e258162f948934726a3085e473f'); +INSERT INTO revision_ancestry VALUES('04fe9ed6642b2e258162f948934726a3085e473f','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('c606ed519e48f526bb130fd64fef712f795f0625','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','9161ca0e2b8df467cdbecaf359f0f56784222755'); +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('ef12547bb10d8771a77614aac5e9f40962bc479c','696ab0232841aece22eb2ac30160c0c0ce879a46','branch','dGVzdGJyYW5jaDE= +','address@hidden','GnE8iraB+eUtgDFX/0UmaT1XM0jpsX1ZtNYayHceuyvdVLfm4hbHo3l887JITAfRr6L7oPgk +QlNnE6UYaXco1Z1ILvhBVCFfcBkmHVJUcLWbgduSPfbEQYzBTBPssBuff1aZGMI2hucN8Pzm +mKsvRlkIOkLfAEYMTI+pfmILUqE= +'); +INSERT INTO revision_certs VALUES('9f7a88847c247683c5f9d6631e407b72b60842c7','696ab0232841aece22eb2ac30160c0c0ce879a46','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lhEU/k0zzSAy566GJGFzoXzBsTVqBxUfgcU6Ji8gzVwjTc+tZc7SZdGtKK+nPegOzfbJpdw4 +UzGXdjS9Ews4d7XnTyk/I6qr5dXzcsFJiuEZQJ7YQsBpos/+xDiq/JdElxBWpn7fY8oy6N58 +M3AvisNOXBdvhyTO2ItbJh40dwk= +'); +INSERT INTO revision_certs VALUES('30a6f24ae37d7b4b49f08ed49179d153f1bbc022','696ab0232841aece22eb2ac30160c0c0ce879a46','changelog','YmxhaC1ibGFo +','address@hidden','YytH693eNB3wWzZy5tuvN+Fv9I5HmCDOQ+AaejT7WHD2eV9Mt7KUBh/onGmpUu/mej+nZCxB +7U7hcYMrS6wTV0kJdLN0IfcGXIZDdvH3rTf99eXbESF+og9dHHWoi1IcAyS+gVNASuQD2Ebd +9pP5soS2Dcbj8awclbSy57NzWkI= +'); +INSERT INTO revision_certs VALUES('4a12d5fd9b7750d8f3f14c8d7df059450c4b58c1','696ab0232841aece22eb2ac30160c0c0ce879a46','somekey','c29tZXZhbHVl +','address@hidden','Wp6ZgxS1lu0RJr7hsfJT73P8V1FecqRpUMwNx33FJY53oeyCLkj0MvwZEL8cv99t9Bs6Okmq +YZv+HjoSBe4IuYmJobY+a2I0a/CA/ZwL3e7icVHFtR4TohnU7oWtNDl05wj7TSD7lPoVYQ9/ +TIvlT2bs3rHAFhy6WZzz0U2CD0A= +'); +INSERT INTO revision_certs VALUES('7c5a9f69aa2b5017507a6d52d921b63985e4fa23','c606ed519e48f526bb130fd64fef712f795f0625','branch','dGVzdGJyYW5jaDI= +','address@hidden','JnpXgS17t6nJTSsODgTP25ysDBxBgESji5IQzsfWehWPkkpUmBBT+Svcq6GphvXq450N9PA1 +WuGsJ0fKGpe78CswhlC2TXJ11USWTJe6yA4MTviB1MtlpdIwvvDDGRIzq+fJOUvvf8EBZL27 +74qubWb16xbzuY5Z97ZntjSuzx4= +'); +INSERT INTO revision_certs VALUES('188cd2a7bf9ac97da6931d71925eb6d97671ca8e','c606ed519e48f526bb130fd64fef712f795f0625','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','iNZTFVhkg58Xo7R80MzIWd3UIh+oaF9Z89FwMnC3NjqTk62qlqjevrNmakiLGd4H2hbxsfqq +7/h7/+mmqRbvazVpkKoedTfyIS1agRhL5fol91TRyo2brppzL4LgaMoGvr+pQbX6MFhDvjg7 +8Wk21MG0Wf38cav8s7UcIDCf3QE= +'); +INSERT INTO revision_certs VALUES('02b5cadd064fb155ac6ec444ac3a90d183eeab9a','c606ed519e48f526bb130fd64fef712f795f0625','changelog','YmxhaC1ibGFo +','address@hidden','NRxSQQR0ELdIWNdsocKUxfYyICyhWxd5Q9LK6JUoJ6wSPsOhWD51GgkdCJ/DxLUMdUOFOm71 +g5eIi0nK/lpS7Ke0/nA9QFpFQ/OLg+lfkwxq+YzL7RW5FRVfa7t8IRONHDy8OS0XqDDZwivF +JYtmUmwX3M8sOqBV68PLO7isalM= +'); +INSERT INTO revision_certs VALUES('edfa6f6e249d898764a4c7814203253a758af4f5','04fe9ed6642b2e258162f948934726a3085e473f','branch','dGVzdGJyYW5jaDE= +','address@hidden','PBZFgFv9UGap/R5OUdDkBCKWkXIP0/0E+iZuiotlr8q7b3z2yGGpQgdZQpAihXA6UFI+s69t +DYG0TP3tfoHvDBkCBZV+oE6lOyz/Yb5xyq6uO2y163Gb+/FoHg/4FlGFey+BWJgKBV7jwe4L +o0fsBlhRPWIi6/QYjm1dBjfOVnU= +'); +INSERT INTO revision_certs VALUES('55794d3f62ad0ba942b029fc4772a9b6c8d7b09e','04fe9ed6642b2e258162f948934726a3085e473f','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','J9xA555Q3T1+uVsgp68LJdlLibQz/ew+C4rFZWTbVtp+28dMN1HOqvlKWL64JiTLMsciQRo2 +87WrtnKiHrKFzpgG+L4CYccgKAB3VcWfIaMXQFQEMAqwkVFjpiQDAyv7G57niWLeNrJUo6pL +ceAs9yhGr3Xml1GnQqNtysUb958= +'); +INSERT INTO revision_certs VALUES('83e6e0c7549fe3887a382064da4bd5148ba765e1','04fe9ed6642b2e258162f948934726a3085e473f','changelog','YmxhaC1ibGFo +','address@hidden','jhZZDvjkM3OkoRhvjy7yAntK1EL8fF8dwavHE7KxXTZMogxrWzYgx64nvpEiZ9+QeSY+0TF+ +kE48zwrO73RZnGuJzpCl04YuBMk+5NPYAE+xfy8sdzbsLsPE+3ZJXIZ/PJ4x+HA8jQwPYdnA +MTDC3Uho+ohdErvqEZCJQxTwmss= +'); +INSERT INTO revision_certs VALUES('76b300accd7bb6b6e278b7f3c9f83801b14b5f0a','758967c8b6c66c95bcf8fad9f3f76278194c01be','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','dy4R3EjKdrbfKJ3xmX0Xj3XH15ClQOFzAuN6iBX07XmZTBk0wF1G+qiLJoYX8EmVOt8f6wEa +w2XUgMbHM7qDY2IJ4fmULfgI+iKGpJU+qR94raOwsu+pkaPZ/n+6zmg6x32PeqoGTo5gNp3s +QOZH0ixftrh1C40vyuHw4WWg/Ps= +'); +INSERT INTO revision_certs VALUES('041a1a99878d5066fc399f85be3c11bb3bf3d27d','758967c8b6c66c95bcf8fad9f3f76278194c01be','branch','dGVzdGJyYW5jaDE= +','address@hidden','DftwXsK6A0Hoi77kKjIuB3wRI9NkfZ20vg5QUAJcb7I30eRZZ+6SwbEm2ourHvc1u6E7jwjO +a4B8QvOmYtGKusCrDX1KXpCqZ0pnJWnxg8vVRk5npO5qhliz1NsWPEpNAKV6/dU6W3Dzgf5J +xl3aAP5+XroLsHXL9/FzNDnfvMg= +'); +INSERT INTO revision_certs VALUES('d908bffb758afe95e4fb380e475fcbb11e91d376','758967c8b6c66c95bcf8fad9f3f76278194c01be','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzYwNmVkNTE5ZTQ4 +ZjUyNmJiMTMwZmQ2NGZlZjcxMmY3OTVmMDYyNSkKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgMDRmZTllZDY2NDJiMmUyNTgxNjJmOTQ4OTM0NzI2YTMwODVl +NDczZikK +','address@hidden','CkAXf32lcw4+JHqG35dDrUZZBH+keMhHX4Y9nGfOgdWVa1Of6usqlFAJZrkMwjBO/qY3Jzdw +1dx47a8LuqDLAY7wUMbF6Ry7HEVXFEeaJrRBFADA7MQGvdt9+UIZMQ9D5FxmDZ6EEIb8XCym ++x+XNAElrfEIognCeTgQ3a/39qs= +'); +INSERT INTO revision_certs VALUES('4a3e67376fc23bfa02ea989936c0736365d831fc','9161ca0e2b8df467cdbecaf359f0f56784222755','branch','dGVzdGJyYW5jaDM= +','address@hidden','UMA2Zxyz0KfA3Y/7ICHrT4czGZgBzQyjFcLqCKaKXxsuwfEOZuHvksKep55NZVra+XHzmMDS +xokNhihk1BTAaR1CH2JTgKWJ5Cf0YAY+8O3Z3WbLuGoW3y/zyyj9dOEJMfiSXwdBpsrXTQvM +yTxVkrwdgFqcxVDO53Xtp93am+8= +'); +INSERT INTO revision_certs VALUES('e50413c2a1972047c2f246de7574c4187cbedce8','9161ca0e2b8df467cdbecaf359f0f56784222755','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','Dvw+2q6syHBdZx2Cc/jNwNxjtOjfk1Ivr7aZgldOnWc9URPVlg4YCxYrHdFR4nFoE4u4I4xN +wBcsbIeGJcw7COh6wZvagrl1bbbesKDfCGpH/uD81mH8MzVJmgI+OG1BenXgSGPjIqTMcsxE +HuSX9pXid9XxU6jBke2cA9vKLJQ= +'); +INSERT INTO revision_certs VALUES('21b01f4e3cb751c0853a852250d57ce5f0491872','9161ca0e2b8df467cdbecaf359f0f56784222755','changelog','YmxhaC1ibGFo +','address@hidden','Cby4qjs1FPRbvf82UJjOUKDoMJQLBIfOy/FIWKVP5EvF67g2RrWOMGAqG33/lXY8NSXwFb9Q +dTkAHvwGvoKKBWwoonU0dMbm4GdocCYBhpsfuwZ25YhS+PJ2KXjm+hn73CROpjMO1tc5lmUQ +cqJSB4VMcru3CuGwEywJ1iyMNE8= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','H4sIAAAAAAAA/23MQYrDMAyF4X1PYXoCWXZk6ywhBNmSmUCbDG1or19nNkNpd9LP41vtOV9l +XZrddzcCBwjAiWvhChmjzyZFUzT2QFnMBpPgaTqdtovON3ss92Vb3Tj9/f9QH4jq3JaLufPe +03H587eKvf7KXn/ehq7dtuvhOOf2zY3CVRJ44iQqBkSFSSGJlBKggRLGgRjr9IHhJxaoMeYI +WlsTRKBYUJUNcszqYxi6mOrQsRctJDHlHwEAAA== +'); +INSERT INTO revisions VALUES('c606ed519e48f526bb130fd64fef712f795f0625','H4sIAAAAAAAA/12QQWoDMQxF93MKkxPIki1LZxlCkG2ZDiSZkg7t9et0kUDRRgj+fzzd/edy +s/s2/OsIa0ujxmLNcjMpNWlkSBBRsBQRjaYi2cDOy7Jf++Xh39vXtt/DyspWAQklRfPmiF7R +GsEsaM9xKWqJz3+5NxCUgECLtqoNBFMUt9pLco3AYu7ZjeLMLdb7ZWxXD6djRp8bnZbl0472 +8T7F0xLGY7+F1bRZmXgt1s2BuSp3KGa1EgzojCmzYjsvIYRjD2tPijowcUeyHL0aF1WW7ChD +p12ZDxF6uv+D0gv6KqvVrQ9xygmlqWci8hKbDcySY1IhYK/T6xdFvbXtgQEAAA== +'); +INSERT INTO revisions VALUES('04fe9ed6642b2e258162f948934726a3085e473f','H4sIAAAAAAAA/2WOQWoDMQxF9z6FyQkkW5bls4QhyLJMB5JMSYf2+p10kSzK34gPT+/f/edy +0/s6/WuP5zqozCaKPUNK1pQVsOgY3UvGAkUGaDVfQtiu4/Lw7/Vr3e7xzI21Q8pJCNXNU/Ke +1DIggz3jUpsSL3/cWwgtQ4ZWm/VmIIlQXPuo5A2BRd2La8aDC8eKy1yvHk/7gT4vOoXwqbt9 +vKt0CnE+tls8Z57tWAPD5tSUgKmnMZqDkAykXGBCtWJLiDHuWzzPNgqKkmMGse5SIPcxZJYq +HXk4EVRquPyT0kv6egbt0BhxRk2ghsyZaBbRlKc7kLIxsdISfgHKoS95gQEAAA== +'); +INSERT INTO revisions VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','H4sIAAAAAAAA/22RUW5jMQhF/98qnrICjAHDWqIowjZoIrXJqI062x93PtJR0z8LCZ97D9f4 +c3716yXj/b4f2ywB7jmhuRFUxBKtlwYNZlFOSeWWgqdtu73M81t8XN4vt+t+BMqwmCKEHQNZ +i2AaqVVqKF5BOajVPP3b+x9InKZeegXEYS4OhX3OHlwLA+sEbyMWcA3PeXmJ/XBfq5+veti2 +334fv75G5bDt+XZ73Y9uwxsUsebTA0S6yWct7wuVMAWJxXCctn3f77f9OMnQEkkmVucS3aWZ +yQqOmuYdWuuk1U9P0PqAPj7rPXymRmVCHbbK1BqtDM/lhguZVpDo8iRyyJpPLhakySi9lxV3 +yvKbrWA24wRB/i5yUK47+XAeriuoFQGCgoqtqVpxU2UH/1EkPYvER6cqaagEc2Q6Igh1nNMC +lHQWqrxstsFfItNWfnWKlVxHD2Wofc5Vp2kvMoMI2gr4LJKeRYItzCCpxRF8FJFKlKyONSOA +XIaQOJ22v3wgvJ3KAgAA +'); +INSERT INTO revisions VALUES('9161ca0e2b8df467cdbecaf359f0f56784222755','H4sIAAAAAAAA/0WPUWrEMAxE/30KkxNYtizLZwkhyLZEA9mk7Ib2+s32Z/+GgZk3c+jv+pBj +M31dfh65V01DJRpaKEJibbSKAZomlJ66WaucF+fOfaxP/dle23n4uWSuVDo36kS95taNTUa1 +ZIViYajY3yXLf+4DLAM0iNi4YTcmxQhaGpRQwgDORsa5GMUbOHTXS1fbdvXTdaffCibnvuXq +Xx8LJ+fteT78HCojd6QEEoN0IEqIllliMtWAco9FElyc9/46/QzalUIlrvdLpDg05gIEEArV +JgOEg/Lgxf0BzXe4vzcBAAA= +'); +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/migrate_with_rosterify/c1e86588e11ad07fa53e5d294edc043ce1d4005a.mtn.dumped 6afa737844d4e8a17385ec2d0d5abbd00a6039b7 +++ tests/migrate_with_rosterify/c1e86588e11ad07fa53e5d294edc043ce1d4005a.mtn.dumped 6afa737844d4e8a17385ec2d0d5abbd00a6039b7 @@ -0,0 +1,255 @@ +BEGIN TRANSACTION; +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','H4sIAAAAAAAAAPNUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAPNUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAPNUMOVKMykz5OICAJpHQpEKAAAA +'); +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','H4sIAAAAAAAAAEszLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAAAEszLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAEszKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAEszKTPiAgCLs8DyBQAAAA== +'); +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) + ); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','c4fb17aca5ca87b49160401282778891a9885a0a','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('c4fb17aca5ca87b49160401282778891a9885a0a','7d1e0aafd07a9403221e7b17070d185f6f857f62','H4sIAAAAAAAAAEXLyw3DMAgA0LunyAg2P8MIHQMMSJV6a/ZXjhngfa7FMpIMrIEkAZ1Xhcs2 +E+UCbfOYewcp+nXd9b/7+6s1UNpAaebpdoApFJBpNZU0FyHPnvvweQ2MiPJsLWQCPVaMiLXX +8QZWXmSKUyrkNTjGAxlvMr+jAAAA +'); +INSERT INTO manifest_deltas VALUES('7d1e0aafd07a9403221e7b17070d185f6f857f62','d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAPNUMDXiSjGxNLJMMzIxSzEyTjQ1TE1KNDO3tDSzME01skizTEwyMDdPMrEw +TlRQKEktLknLzEk15OJyVjBQMDQw4fIEmWBgaWFikWxiZmyYaGSQmGxoZmZsYpJmapFoZJyW +mmpgkmiWbGZilmiCMMGEiwsAMXnsvnwAAAA= +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAEXLwQ3DMAgF0HumyAhgf3/DONhgqVJvzf7qMQO88B1TlD4jo4RczpQZsVaX +I8mGQW/7vp/6PefzLb2O51ALlHaxvcqG9JVpZ0xbyixAJlxf0y5xg22wazSJrWQHzrBo/VQJ +gptg4DW4/kZ/jYecAAAA +'); +INSERT INTO manifests VALUES('d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAEXLyw3DMAgG4HumyAhgHoZxjPktVeqt2V89ZoDvZBvHUrBQ7EIYSXXHsRnF +3lClqcn3/eD3nM8X46rC6hMQ0xE7YSKCyXudYWGsGUKO8tfIxdhwSo88leqjMWyyM9P0rNW8 +ghAdr9HrD/8LfAOcAAAA +'); +CREATE TABLE merkle_nodes + ( + type not null, -- "key", "mcert", "fcert", "rcert" + collection not null, -- name chosen by user + level not null, -- tree level this prefix encodes + prefix not null, -- label identifying node in tree + body not null, -- binary, base64'ed node contents + unique(type, collection, level, prefix) + ); +CREATE TABLE private_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- as in public_keys (same identifiers, in fact) + keydata not null -- encrypted RSA private params + ); +INSERT INTO private_keys VALUES('64e3c94bac222441c4da11cca2fb0843f7609e82','address@hidden','npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM +PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc +vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw +ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz +jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/ +xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP +cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf +ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp +6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/ +E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW +M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3 +6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0='); +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('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +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('','696ab0232841aece22eb2ac30160c0c0ce879a46'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','c606ed519e48f526bb130fd64fef712f795f0625'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','04fe9ed6642b2e258162f948934726a3085e473f'); +INSERT INTO revision_ancestry VALUES('04fe9ed6642b2e258162f948934726a3085e473f','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('c606ed519e48f526bb130fd64fef712f795f0625','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','9161ca0e2b8df467cdbecaf359f0f56784222755'); +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('ef12547bb10d8771a77614aac5e9f40962bc479c','696ab0232841aece22eb2ac30160c0c0ce879a46','branch','dGVzdGJyYW5jaDE= +','address@hidden','GnE8iraB+eUtgDFX/0UmaT1XM0jpsX1ZtNYayHceuyvdVLfm4hbHo3l887JITAfRr6L7oPgk +QlNnE6UYaXco1Z1ILvhBVCFfcBkmHVJUcLWbgduSPfbEQYzBTBPssBuff1aZGMI2hucN8Pzm +mKsvRlkIOkLfAEYMTI+pfmILUqE= +'); +INSERT INTO revision_certs VALUES('9f7a88847c247683c5f9d6631e407b72b60842c7','696ab0232841aece22eb2ac30160c0c0ce879a46','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lhEU/k0zzSAy566GJGFzoXzBsTVqBxUfgcU6Ji8gzVwjTc+tZc7SZdGtKK+nPegOzfbJpdw4 +UzGXdjS9Ews4d7XnTyk/I6qr5dXzcsFJiuEZQJ7YQsBpos/+xDiq/JdElxBWpn7fY8oy6N58 +M3AvisNOXBdvhyTO2ItbJh40dwk= +'); +INSERT INTO revision_certs VALUES('30a6f24ae37d7b4b49f08ed49179d153f1bbc022','696ab0232841aece22eb2ac30160c0c0ce879a46','changelog','YmxhaC1ibGFo +','address@hidden','YytH693eNB3wWzZy5tuvN+Fv9I5HmCDOQ+AaejT7WHD2eV9Mt7KUBh/onGmpUu/mej+nZCxB +7U7hcYMrS6wTV0kJdLN0IfcGXIZDdvH3rTf99eXbESF+og9dHHWoi1IcAyS+gVNASuQD2Ebd +9pP5soS2Dcbj8awclbSy57NzWkI= +'); +INSERT INTO revision_certs VALUES('4a12d5fd9b7750d8f3f14c8d7df059450c4b58c1','696ab0232841aece22eb2ac30160c0c0ce879a46','somekey','c29tZXZhbHVl +','address@hidden','Wp6ZgxS1lu0RJr7hsfJT73P8V1FecqRpUMwNx33FJY53oeyCLkj0MvwZEL8cv99t9Bs6Okmq +YZv+HjoSBe4IuYmJobY+a2I0a/CA/ZwL3e7icVHFtR4TohnU7oWtNDl05wj7TSD7lPoVYQ9/ +TIvlT2bs3rHAFhy6WZzz0U2CD0A= +'); +INSERT INTO revision_certs VALUES('7c5a9f69aa2b5017507a6d52d921b63985e4fa23','c606ed519e48f526bb130fd64fef712f795f0625','branch','dGVzdGJyYW5jaDI= +','address@hidden','JnpXgS17t6nJTSsODgTP25ysDBxBgESji5IQzsfWehWPkkpUmBBT+Svcq6GphvXq450N9PA1 +WuGsJ0fKGpe78CswhlC2TXJ11USWTJe6yA4MTviB1MtlpdIwvvDDGRIzq+fJOUvvf8EBZL27 +74qubWb16xbzuY5Z97ZntjSuzx4= +'); +INSERT INTO revision_certs VALUES('188cd2a7bf9ac97da6931d71925eb6d97671ca8e','c606ed519e48f526bb130fd64fef712f795f0625','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','iNZTFVhkg58Xo7R80MzIWd3UIh+oaF9Z89FwMnC3NjqTk62qlqjevrNmakiLGd4H2hbxsfqq +7/h7/+mmqRbvazVpkKoedTfyIS1agRhL5fol91TRyo2brppzL4LgaMoGvr+pQbX6MFhDvjg7 +8Wk21MG0Wf38cav8s7UcIDCf3QE= +'); +INSERT INTO revision_certs VALUES('02b5cadd064fb155ac6ec444ac3a90d183eeab9a','c606ed519e48f526bb130fd64fef712f795f0625','changelog','YmxhaC1ibGFo +','address@hidden','NRxSQQR0ELdIWNdsocKUxfYyICyhWxd5Q9LK6JUoJ6wSPsOhWD51GgkdCJ/DxLUMdUOFOm71 +g5eIi0nK/lpS7Ke0/nA9QFpFQ/OLg+lfkwxq+YzL7RW5FRVfa7t8IRONHDy8OS0XqDDZwivF +JYtmUmwX3M8sOqBV68PLO7isalM= +'); +INSERT INTO revision_certs VALUES('edfa6f6e249d898764a4c7814203253a758af4f5','04fe9ed6642b2e258162f948934726a3085e473f','branch','dGVzdGJyYW5jaDE= +','address@hidden','PBZFgFv9UGap/R5OUdDkBCKWkXIP0/0E+iZuiotlr8q7b3z2yGGpQgdZQpAihXA6UFI+s69t +DYG0TP3tfoHvDBkCBZV+oE6lOyz/Yb5xyq6uO2y163Gb+/FoHg/4FlGFey+BWJgKBV7jwe4L +o0fsBlhRPWIi6/QYjm1dBjfOVnU= +'); +INSERT INTO revision_certs VALUES('55794d3f62ad0ba942b029fc4772a9b6c8d7b09e','04fe9ed6642b2e258162f948934726a3085e473f','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','J9xA555Q3T1+uVsgp68LJdlLibQz/ew+C4rFZWTbVtp+28dMN1HOqvlKWL64JiTLMsciQRo2 +87WrtnKiHrKFzpgG+L4CYccgKAB3VcWfIaMXQFQEMAqwkVFjpiQDAyv7G57niWLeNrJUo6pL +ceAs9yhGr3Xml1GnQqNtysUb958= +'); +INSERT INTO revision_certs VALUES('83e6e0c7549fe3887a382064da4bd5148ba765e1','04fe9ed6642b2e258162f948934726a3085e473f','changelog','YmxhaC1ibGFo +','address@hidden','jhZZDvjkM3OkoRhvjy7yAntK1EL8fF8dwavHE7KxXTZMogxrWzYgx64nvpEiZ9+QeSY+0TF+ +kE48zwrO73RZnGuJzpCl04YuBMk+5NPYAE+xfy8sdzbsLsPE+3ZJXIZ/PJ4x+HA8jQwPYdnA +MTDC3Uho+ohdErvqEZCJQxTwmss= +'); +INSERT INTO revision_certs VALUES('76b300accd7bb6b6e278b7f3c9f83801b14b5f0a','758967c8b6c66c95bcf8fad9f3f76278194c01be','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','dy4R3EjKdrbfKJ3xmX0Xj3XH15ClQOFzAuN6iBX07XmZTBk0wF1G+qiLJoYX8EmVOt8f6wEa +w2XUgMbHM7qDY2IJ4fmULfgI+iKGpJU+qR94raOwsu+pkaPZ/n+6zmg6x32PeqoGTo5gNp3s +QOZH0ixftrh1C40vyuHw4WWg/Ps= +'); +INSERT INTO revision_certs VALUES('041a1a99878d5066fc399f85be3c11bb3bf3d27d','758967c8b6c66c95bcf8fad9f3f76278194c01be','branch','dGVzdGJyYW5jaDE= +','address@hidden','DftwXsK6A0Hoi77kKjIuB3wRI9NkfZ20vg5QUAJcb7I30eRZZ+6SwbEm2ourHvc1u6E7jwjO +a4B8QvOmYtGKusCrDX1KXpCqZ0pnJWnxg8vVRk5npO5qhliz1NsWPEpNAKV6/dU6W3Dzgf5J +xl3aAP5+XroLsHXL9/FzNDnfvMg= +'); +INSERT INTO revision_certs VALUES('d908bffb758afe95e4fb380e475fcbb11e91d376','758967c8b6c66c95bcf8fad9f3f76278194c01be','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzYwNmVkNTE5ZTQ4 +ZjUyNmJiMTMwZmQ2NGZlZjcxMmY3OTVmMDYyNSkKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgMDRmZTllZDY2NDJiMmUyNTgxNjJmOTQ4OTM0NzI2YTMwODVl +NDczZikK +','address@hidden','CkAXf32lcw4+JHqG35dDrUZZBH+keMhHX4Y9nGfOgdWVa1Of6usqlFAJZrkMwjBO/qY3Jzdw +1dx47a8LuqDLAY7wUMbF6Ry7HEVXFEeaJrRBFADA7MQGvdt9+UIZMQ9D5FxmDZ6EEIb8XCym ++x+XNAElrfEIognCeTgQ3a/39qs= +'); +INSERT INTO revision_certs VALUES('4a3e67376fc23bfa02ea989936c0736365d831fc','9161ca0e2b8df467cdbecaf359f0f56784222755','branch','dGVzdGJyYW5jaDM= +','address@hidden','UMA2Zxyz0KfA3Y/7ICHrT4czGZgBzQyjFcLqCKaKXxsuwfEOZuHvksKep55NZVra+XHzmMDS +xokNhihk1BTAaR1CH2JTgKWJ5Cf0YAY+8O3Z3WbLuGoW3y/zyyj9dOEJMfiSXwdBpsrXTQvM +yTxVkrwdgFqcxVDO53Xtp93am+8= +'); +INSERT INTO revision_certs VALUES('e50413c2a1972047c2f246de7574c4187cbedce8','9161ca0e2b8df467cdbecaf359f0f56784222755','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','Dvw+2q6syHBdZx2Cc/jNwNxjtOjfk1Ivr7aZgldOnWc9URPVlg4YCxYrHdFR4nFoE4u4I4xN +wBcsbIeGJcw7COh6wZvagrl1bbbesKDfCGpH/uD81mH8MzVJmgI+OG1BenXgSGPjIqTMcsxE +HuSX9pXid9XxU6jBke2cA9vKLJQ= +'); +INSERT INTO revision_certs VALUES('21b01f4e3cb751c0853a852250d57ce5f0491872','9161ca0e2b8df467cdbecaf359f0f56784222755','changelog','YmxhaC1ibGFo +','address@hidden','Cby4qjs1FPRbvf82UJjOUKDoMJQLBIfOy/FIWKVP5EvF67g2RrWOMGAqG33/lXY8NSXwFb9Q +dTkAHvwGvoKKBWwoonU0dMbm4GdocCYBhpsfuwZ25YhS+PJ2KXjm+hn73CROpjMO1tc5lmUQ +cqJSB4VMcru3CuGwEywJ1iyMNE8= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','H4sIAAAAAAAAAG3M0crCMAyG4XOvongFadqlzbWMMdIm5R/oJjr09q2e/IieJS8fz2qP+Szr +0uy2uxE4QABOXAtXyBh9NimaorEHymI2mARP0+GwnXS+2n25Ldvqxun9/0N9IKpzW07mjntP +r8sff1Xs9SJ7/fsYunbdzi/HObdvbhSuksATJ1ExICpMCkmklAANlDAOxFinLwy/sUCNMUfQ +2pogAsWCqmyQY1Yfw9DFVIeOPQEtJDHlHwEAAA== +'); +INSERT INTO revisions VALUES('c606ed519e48f526bb130fd64fef712f795f0625','H4sIAAAAAAAAAF2QQWoDMQxF93MKkxPIki1LZxlCkG2ZDiSZkgzt9et0kULRRgjef3zd/fty +s/s2/HmEtaVRY7FmuZmUmjQyJIgoWIqIRlORbGDnZdmv/fLwr+257fewsrJVQEJJ0bw5ole0 +RjAD2mtcilri8y/3JwQlINCirWoDwRTFrfaSXCOwmHt2ozi5xXq/jO3q4XRM9LXRaVk+7Wgf +f6d4WsJ47LewmjYrU6/FujkwV+UOxaxWggGdMWVWbOclhHDsYe1JUQcm7kiWo1fjosqSHWXo +bFfmQ4Re3f9J6S19h9Xq1oc45YTS1DMReYnNBmbJMakQsNfZ6wdFvbXtgQEAAA== +'); +INSERT INTO revisions VALUES('04fe9ed6642b2e258162f948934726a3085e473f','H4sIAAAAAAAAAGWOQWoDMQxF9z6FyQkkW5bls4QhyLJMB5JMSYb2+p10kS7K33wET+/f/fty +0/s6/bnHcx1UZhPFniEla8oKWHSM7iVjgSIDtJovIWzXcXn41/pct3s8c2PtkHISQnXzlLwn +tQzIYK+41KbEyy/3J4SWIUOrzXozkEQorn1U8obAou7FNePBhWPFZa5Xj6f9QF+NTiF86m4f +f6d0CnE+tls8Z57tWAPD5tSUgKmnMZqDkAykXGBCtWJLiDHuWzzPNgqKkmMGse5SIPcxZJYq +HXk4EVRquPyT0lv6fgbt0BhxRk2ghsyZaBbRlKc7kLIxsdISfgDKoS95gQEAAA== +'); +INSERT INTO revisions VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','H4sIAAAAAAAAAG2RUWpjMQxF/98qHlmBLEuytJYQgmxLNNAmpQ2d7Y87H+kwmT8jkM69x9f4 +dX7z6yXj874f2ywB7jmhuRFUxBKtlwYNZlFOSeWWgqdtu73O80d8XT4vt+t+BMqwmCKEHQNZ +i2AaqVVqKF5BOajVPP3Z+xtInKZeegXEYS4OhX3OHlwLA+sEbyMWcA3PeXmN/XBfq9+veti2 +d7+Pl59ROWx7ftze9qPb8AZFrPn0AJFu8l3L+0IlTEFiMRynbd/3+20/TjK0RJKJ1blEd2lm +soKjpnmH1jpp9dMTtD6gj2O9h8/UqEyow1aZWqOV4bnccCHTChJdnkQOWfPJxYI0GaX3suJO +WX6zFcxmnCDI/4oclOuffDgP1xXUigBBQcXWVK24qbKD/1ckPYvER6cqaagEc2Q6Igh1nNMC +lHQWqrxstsE/ItNWfnWKlVxHD2Wofc5Vp2kvMoMI2gr4LJKeRYItzCCpxRF8FJFKlKyONSOA +XIaQOJ2233wgvJ3KAgAA +'); +INSERT INTO revisions VALUES('9161ca0e2b8df467cdbecaf359f0f56784222755','H4sIAAAAAAAAAEWPUYrEMAxD/3OK0BPEieM4ZymlOInNFjrtMlN2r7+d/Zk/IZCedOjv+pBj +M31dfh65V01DJRpaKEJibbSKAZomlJ66WaucF+fOfaxP/dle23n4uWSuVDo36kS95taNTUa1 +ZIViYajY3yXLf+4DLAM0iNi4YTcmxQhaGpRQwgDORsa5GMUbOHTXS1fbdvXTdaffCibnvuXq +Xx8LJ+fteT78HCojd6QEEoN0IEqIllliMtWAco9FElyc9/46/QzalUIlrvdLpDg05gIEEArV +JgOEg/Lgxf0BzXe4vzcBAAA= +'); +COMMIT; ============================================================ --- tests/migrate_with_rosterify/e372b508bea9b991816d1c74680f7ae10d2a6d94.mtn.dumped beca91b0380a72b2902bdd6a06b52f4cd46cc67d +++ tests/migrate_with_rosterify/e372b508bea9b991816d1c74680f7ae10d2a6d94.mtn.dumped beca91b0380a72b2902bdd6a06b52f4cd46cc67d @@ -0,0 +1,259 @@ +BEGIN TRANSACTION; +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','H4sIAAAAAAAAAPNUMOVKMywz5OICAOrIolkKAAAA +'); +INSERT INTO file_deltas VALUES('36f92840dcffa22064b2dd9e0848d14350f07c5c','f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAPNUMOVKMyoz5OICADqyAh4KAAAA +'); +INSERT INTO file_deltas VALUES('09848c4631a20ac166344f58a23fee04a6c646a4','1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAPNUMOVKMykz5OICAJpHQpEKAAAA +'); +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','H4sIAAAAAAAAAEszLDPiAgC5Qx7FBQAAAA== +'); +INSERT INTO files VALUES('bbeadf8e35428c9e5333e71caf25851498306eb6','H4sIAAAAAAAAAEszLjPkAgDx2DpEBQAAAA== +'); +INSERT INTO files VALUES('f9d518a4e1308cbe8503bdd8f578b16de4407491','H4sIAAAAAAAAAEszKjPiAgBX7KvXBQAAAA== +'); +INSERT INTO files VALUES('1ece609689fb9462de25716110769bad1a80e8d8','H4sIAAAAAAAAAEszKTPiAgCLs8DyBQAAAA== +'); +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) + ); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','c4fb17aca5ca87b49160401282778891a9885a0a','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('093030979cb9c082418eabd74e91068aee5ea316','7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAPNUMDQw4Uq0TE40NzA0szRPTElMNTAzS7I0SzEwT0xMSjI2SDNIMTMyMTWz +NEpWUChJLS5Jy8xJNeQyNkuzNLIwMUhJTktLNDIyMDNJMkpJsUw1sDCxSDE0MTYFajRPNkXS +Y8TFBQD6zo2mbwAAAA== +'); +INSERT INTO manifest_deltas VALUES('c4fb17aca5ca87b49160401282778891a9885a0a','7d1e0aafd07a9403221e7b17070d185f6f857f62','H4sIAAAAAAAAAEXLyw3DMAgA0LunyAg2P8MIHQMMSJV6a/ZXjhngfa7FMpIMrIEkAZ1Xhcs2 +E+UCbfOYewcp+nXd9b/7+6s1UNpAaebpdoApFJBpNZU0FyHPnvvweQ2MiPJsLWQCPVaMiLXX +8QZWXmSKUyrkNTjGAxlvMr+jAAAA +'); +INSERT INTO manifest_deltas VALUES('7d1e0aafd07a9403221e7b17070d185f6f857f62','d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAPNUMDXiSjGxNLJMMzIxSzEyTjQ1TE1KNDO3tDSzME01skizTEwyMDdPMrEw +TlRQKEktLknLzEk15OJyVjBQMDQw4fIEmWBgaWFikWxiZmyYaGSQmGxoZmZsYpJmapFoZJyW +mmpgkmiWbGZilmiCMMGEiwsAMXnsvnwAAAA= +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('7d45f98a1b3022c9a6a015addbe5315058d0a7ce','H4sIAAAAAAAAAEXLwQ3DMAgF0HumyAhgf3/DONhgqVJvzf7qMQO88B1TlD4jo4RczpQZsVaX +I8mGQW/7vp/6PefzLb2O51ALlHaxvcqG9JVpZ0xbyixAJlxf0y5xg22wazSJrWQHzrBo/VQJ +gptg4DW4/kZ/jYecAAAA +'); +INSERT INTO manifests VALUES('d5c9e3dea2f4f07a6afbdb9401be34ac3cffb985','H4sIAAAAAAAAAEXLyw3DMAgG4HumyAhgHoZxjPktVeqt2V89ZoDvZBvHUrBQ7EIYSXXHsRnF +3lClqcn3/eD3nM8X46rC6hMQ0xE7YSKCyXudYWGsGUKO8tfIxdhwSo88leqjMWyyM9P0rNW8 +ghAdr9HrD/8LfAOcAAAA +'); +CREATE TABLE private_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- as in public_keys (same identifiers, in fact) + keydata not null -- encrypted RSA private params + ); +INSERT INTO private_keys VALUES('64e3c94bac222441c4da11cca2fb0843f7609e82','address@hidden','npy0jyqbZdylFkMjdR9OvlqmDHuBGXpGFPt94h96aG+Lp+OdBCmWx8GueHk8FKkexwPqhRBM +PPopUeuwqxuSX+yEodMl5IHBmin0nLnbOeBjtasjemBFEmdNl/jPDF/AeQ2WHhanB731dSQc +vzLOQfKAYmfk56PPULi9oJJNUxaCkvsWtvaI+HUHZrjyyV7dA4Vsc6Jvx2Yf1+MdDAEGk/Rw +ZtP0LmuoiyvRDFqBF8aTmnotyb4kRKohnJ7VF+y6hYvmtMpM3TKnpR7EbojBzNPqKuO7nPUz +jGxA7F84O24Vbf128PNSI5vj4istow26aPjn28qPjfRrkV30WLL/dXfYJkfkTqglYnoEXvF/ +xZoVxxNeAX58mgy0A1ErVxv8U7TwuP983GHEpLwy3gbiP+9akAJCr8r823DHmQqq5QDELibP +cuXZfOttpfVRkcbMhjeF0M6czc4HoKgHTAnf/18hzdZwGX/WWvRIBHImbUJ+mDbp2ByDTfKf +ErGXSvZ3HxCqBD8yx1SnXhV8IDHaBmV9wwYcN+H2cxOWGZk7g7xJS19+a3UQB3c3sSXQVJBp +6QpCZgysxkZwzuXDzzLZPT9SLZz4K2p7+7BwMbpy9ZxcyAzmiEtpA24UP06jtjFN7WcXAdx/ +E5Gmoe9b1EiXWdReHjUGpc6k0LQ0PPXAwqrcGdwYbOLDZ5xsQ5AsEYSFtyTS60D1nHBcdNmW +M0eOUJFdJf/uNe/2EApc3a8TyEkZtVqiYtOVV3qDB9NmU4bVOkDqzl1F7zJwATWbmasSdkM3 +6lxDkczBfCrEjH5p5Y8DU+ge4e4LRtknY9oBOJ7EQO0twYJg3k0='); +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('c9d80250e944708aab7fe960c1136b517fd30772','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCfN/cAMabgb6T7m8ksGnpQ7LO6hOdnc/7V +yivrRGtmpwSItljht1bmgLQF37KiSPoMEDUb1stfKxaMsYiy8iTyoQ+M2EVFP37n2rtnNZ0H +oVcQd2sRsCerQFh9nslRPymlkQXUlOiNFN6RlFNcdjkucqNe+YorFX21EYw7XuT5XwIBEQ=='); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC54vVjrrqYoTfPTgWm6JpuL+kOERcN2OSc +BsWq6cb4Wm3nlymwVqJJywq6cbfygUYwmqyiRLPxRosfLGu228AhEzaM4JbAH1pgg7CwvvVd +fHRXNAXEMgO89gBjkkecxLi4U/T67DrLjkRPAilCgWLZNv8YeOG9XAPegWyr7hNA9wIBEQ=='); +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('','696ab0232841aece22eb2ac30160c0c0ce879a46'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','c606ed519e48f526bb130fd64fef712f795f0625'); +INSERT INTO revision_ancestry VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','04fe9ed6642b2e258162f948934726a3085e473f'); +INSERT INTO revision_ancestry VALUES('04fe9ed6642b2e258162f948934726a3085e473f','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('c606ed519e48f526bb130fd64fef712f795f0625','758967c8b6c66c95bcf8fad9f3f76278194c01be'); +INSERT INTO revision_ancestry VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','9161ca0e2b8df467cdbecaf359f0f56784222755'); +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('ef12547bb10d8771a77614aac5e9f40962bc479c','696ab0232841aece22eb2ac30160c0c0ce879a46','branch','dGVzdGJyYW5jaDE= +','address@hidden','GnE8iraB+eUtgDFX/0UmaT1XM0jpsX1ZtNYayHceuyvdVLfm4hbHo3l887JITAfRr6L7oPgk +QlNnE6UYaXco1Z1ILvhBVCFfcBkmHVJUcLWbgduSPfbEQYzBTBPssBuff1aZGMI2hucN8Pzm +mKsvRlkIOkLfAEYMTI+pfmILUqE= +'); +INSERT INTO revision_certs VALUES('9f7a88847c247683c5f9d6631e407b72b60842c7','696ab0232841aece22eb2ac30160c0c0ce879a46','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','lhEU/k0zzSAy566GJGFzoXzBsTVqBxUfgcU6Ji8gzVwjTc+tZc7SZdGtKK+nPegOzfbJpdw4 +UzGXdjS9Ews4d7XnTyk/I6qr5dXzcsFJiuEZQJ7YQsBpos/+xDiq/JdElxBWpn7fY8oy6N58 +M3AvisNOXBdvhyTO2ItbJh40dwk= +'); +INSERT INTO revision_certs VALUES('30a6f24ae37d7b4b49f08ed49179d153f1bbc022','696ab0232841aece22eb2ac30160c0c0ce879a46','changelog','YmxhaC1ibGFo +','address@hidden','YytH693eNB3wWzZy5tuvN+Fv9I5HmCDOQ+AaejT7WHD2eV9Mt7KUBh/onGmpUu/mej+nZCxB +7U7hcYMrS6wTV0kJdLN0IfcGXIZDdvH3rTf99eXbESF+og9dHHWoi1IcAyS+gVNASuQD2Ebd +9pP5soS2Dcbj8awclbSy57NzWkI= +'); +INSERT INTO revision_certs VALUES('4a12d5fd9b7750d8f3f14c8d7df059450c4b58c1','696ab0232841aece22eb2ac30160c0c0ce879a46','somekey','c29tZXZhbHVl +','address@hidden','Wp6ZgxS1lu0RJr7hsfJT73P8V1FecqRpUMwNx33FJY53oeyCLkj0MvwZEL8cv99t9Bs6Okmq +YZv+HjoSBe4IuYmJobY+a2I0a/CA/ZwL3e7icVHFtR4TohnU7oWtNDl05wj7TSD7lPoVYQ9/ +TIvlT2bs3rHAFhy6WZzz0U2CD0A= +'); +INSERT INTO revision_certs VALUES('7c5a9f69aa2b5017507a6d52d921b63985e4fa23','c606ed519e48f526bb130fd64fef712f795f0625','branch','dGVzdGJyYW5jaDI= +','address@hidden','JnpXgS17t6nJTSsODgTP25ysDBxBgESji5IQzsfWehWPkkpUmBBT+Svcq6GphvXq450N9PA1 +WuGsJ0fKGpe78CswhlC2TXJ11USWTJe6yA4MTviB1MtlpdIwvvDDGRIzq+fJOUvvf8EBZL27 +74qubWb16xbzuY5Z97ZntjSuzx4= +'); +INSERT INTO revision_certs VALUES('188cd2a7bf9ac97da6931d71925eb6d97671ca8e','c606ed519e48f526bb130fd64fef712f795f0625','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','iNZTFVhkg58Xo7R80MzIWd3UIh+oaF9Z89FwMnC3NjqTk62qlqjevrNmakiLGd4H2hbxsfqq +7/h7/+mmqRbvazVpkKoedTfyIS1agRhL5fol91TRyo2brppzL4LgaMoGvr+pQbX6MFhDvjg7 +8Wk21MG0Wf38cav8s7UcIDCf3QE= +'); +INSERT INTO revision_certs VALUES('02b5cadd064fb155ac6ec444ac3a90d183eeab9a','c606ed519e48f526bb130fd64fef712f795f0625','changelog','YmxhaC1ibGFo +','address@hidden','NRxSQQR0ELdIWNdsocKUxfYyICyhWxd5Q9LK6JUoJ6wSPsOhWD51GgkdCJ/DxLUMdUOFOm71 +g5eIi0nK/lpS7Ke0/nA9QFpFQ/OLg+lfkwxq+YzL7RW5FRVfa7t8IRONHDy8OS0XqDDZwivF +JYtmUmwX3M8sOqBV68PLO7isalM= +'); +INSERT INTO revision_certs VALUES('edfa6f6e249d898764a4c7814203253a758af4f5','04fe9ed6642b2e258162f948934726a3085e473f','branch','dGVzdGJyYW5jaDE= +','address@hidden','PBZFgFv9UGap/R5OUdDkBCKWkXIP0/0E+iZuiotlr8q7b3z2yGGpQgdZQpAihXA6UFI+s69t +DYG0TP3tfoHvDBkCBZV+oE6lOyz/Yb5xyq6uO2y163Gb+/FoHg/4FlGFey+BWJgKBV7jwe4L +o0fsBlhRPWIi6/QYjm1dBjfOVnU= +'); +INSERT INTO revision_certs VALUES('55794d3f62ad0ba942b029fc4772a9b6c8d7b09e','04fe9ed6642b2e258162f948934726a3085e473f','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','J9xA555Q3T1+uVsgp68LJdlLibQz/ew+C4rFZWTbVtp+28dMN1HOqvlKWL64JiTLMsciQRo2 +87WrtnKiHrKFzpgG+L4CYccgKAB3VcWfIaMXQFQEMAqwkVFjpiQDAyv7G57niWLeNrJUo6pL +ceAs9yhGr3Xml1GnQqNtysUb958= +'); +INSERT INTO revision_certs VALUES('83e6e0c7549fe3887a382064da4bd5148ba765e1','04fe9ed6642b2e258162f948934726a3085e473f','changelog','YmxhaC1ibGFo +','address@hidden','jhZZDvjkM3OkoRhvjy7yAntK1EL8fF8dwavHE7KxXTZMogxrWzYgx64nvpEiZ9+QeSY+0TF+ +kE48zwrO73RZnGuJzpCl04YuBMk+5NPYAE+xfy8sdzbsLsPE+3ZJXIZ/PJ4x+HA8jQwPYdnA +MTDC3Uho+ohdErvqEZCJQxTwmss= +'); +INSERT INTO revision_certs VALUES('76b300accd7bb6b6e278b7f3c9f83801b14b5f0a','758967c8b6c66c95bcf8fad9f3f76278194c01be','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','dy4R3EjKdrbfKJ3xmX0Xj3XH15ClQOFzAuN6iBX07XmZTBk0wF1G+qiLJoYX8EmVOt8f6wEa +w2XUgMbHM7qDY2IJ4fmULfgI+iKGpJU+qR94raOwsu+pkaPZ/n+6zmg6x32PeqoGTo5gNp3s +QOZH0ixftrh1C40vyuHw4WWg/Ps= +'); +INSERT INTO revision_certs VALUES('041a1a99878d5066fc399f85be3c11bb3bf3d27d','758967c8b6c66c95bcf8fad9f3f76278194c01be','branch','dGVzdGJyYW5jaDE= +','address@hidden','DftwXsK6A0Hoi77kKjIuB3wRI9NkfZ20vg5QUAJcb7I30eRZZ+6SwbEm2ourHvc1u6E7jwjO +a4B8QvOmYtGKusCrDX1KXpCqZ0pnJWnxg8vVRk5npO5qhliz1NsWPEpNAKV6/dU6W3Dzgf5J +xl3aAP5+XroLsHXL9/FzNDnfvMg= +'); +INSERT INTO revision_certs VALUES('d908bffb758afe95e4fb380e475fcbb11e91d376','758967c8b6c66c95bcf8fad9f3f76278194c01be','changelog','cHJvcGFnYXRlIGZyb20gYnJhbmNoICd0ZXN0YnJhbmNoMicgKGhlYWQgYzYwNmVkNTE5ZTQ4 +ZjUyNmJiMTMwZmQ2NGZlZjcxMmY3OTVmMDYyNSkKICAgICAgICAgICAgdG8gYnJhbmNoICd0 +ZXN0YnJhbmNoMScgKGhlYWQgMDRmZTllZDY2NDJiMmUyNTgxNjJmOTQ4OTM0NzI2YTMwODVl +NDczZikK +','address@hidden','CkAXf32lcw4+JHqG35dDrUZZBH+keMhHX4Y9nGfOgdWVa1Of6usqlFAJZrkMwjBO/qY3Jzdw +1dx47a8LuqDLAY7wUMbF6Ry7HEVXFEeaJrRBFADA7MQGvdt9+UIZMQ9D5FxmDZ6EEIb8XCym ++x+XNAElrfEIognCeTgQ3a/39qs= +'); +INSERT INTO revision_certs VALUES('4a3e67376fc23bfa02ea989936c0736365d831fc','9161ca0e2b8df467cdbecaf359f0f56784222755','branch','dGVzdGJyYW5jaDM= +','address@hidden','UMA2Zxyz0KfA3Y/7ICHrT4czGZgBzQyjFcLqCKaKXxsuwfEOZuHvksKep55NZVra+XHzmMDS +xokNhihk1BTAaR1CH2JTgKWJ5Cf0YAY+8O3Z3WbLuGoW3y/zyyj9dOEJMfiSXwdBpsrXTQvM +yTxVkrwdgFqcxVDO53Xtp93am+8= +'); +INSERT INTO revision_certs VALUES('e50413c2a1972047c2f246de7574c4187cbedce8','9161ca0e2b8df467cdbecaf359f0f56784222755','author','dGVzdGVyQHRlc3QubmV0 +','address@hidden','Dvw+2q6syHBdZx2Cc/jNwNxjtOjfk1Ivr7aZgldOnWc9URPVlg4YCxYrHdFR4nFoE4u4I4xN +wBcsbIeGJcw7COh6wZvagrl1bbbesKDfCGpH/uD81mH8MzVJmgI+OG1BenXgSGPjIqTMcsxE +HuSX9pXid9XxU6jBke2cA9vKLJQ= +'); +INSERT INTO revision_certs VALUES('21b01f4e3cb751c0853a852250d57ce5f0491872','9161ca0e2b8df467cdbecaf359f0f56784222755','changelog','YmxhaC1ibGFo +','address@hidden','Cby4qjs1FPRbvf82UJjOUKDoMJQLBIfOy/FIWKVP5EvF67g2RrWOMGAqG33/lXY8NSXwFb9Q +dTkAHvwGvoKKBWwoonU0dMbm4GdocCYBhpsfuwZ25YhS+PJ2KXjm+hn73CROpjMO1tc5lmUQ +cqJSB4VMcru3CuGwEywJ1iyMNE8= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('696ab0232841aece22eb2ac30160c0c0ce879a46','H4sIAAAAAAAAAG3M0crCMAyG4XOvongFadqlzbWMMdIm5R/oJjr09q2e/IieJS8fz2qP+Szr +0uy2uxE4QABOXAtXyBh9NimaorEHymI2mARP0+GwnXS+2n25Ldvqxun9/0N9IKpzW07mjntP +r8sff1Xs9SJ7/fsYunbdzi/HObdvbhSuksATJ1ExICpMCkmklAANlDAOxFinLwy/sUCNMUfQ +2pogAsWCqmyQY1Yfw9DFVIeOPQEtJDHlHwEAAA== +'); +INSERT INTO revisions VALUES('c606ed519e48f526bb130fd64fef712f795f0625','H4sIAAAAAAAAAF2QQWoDMQxF93MKkxPIki1LZxlCkG2ZDiSZkgzt9et0kULRRgjef3zd/fty +s/s2/HmEtaVRY7FmuZmUmjQyJIgoWIqIRlORbGDnZdmv/fLwr+257fewsrJVQEJJ0bw5ole0 +RjAD2mtcilri8y/3JwQlINCirWoDwRTFrfaSXCOwmHt2ozi5xXq/jO3q4XRM9LXRaVk+7Wgf +f6d4WsJ47LewmjYrU6/FujkwV+UOxaxWggGdMWVWbOclhHDsYe1JUQcm7kiWo1fjosqSHWXo +bFfmQ4Re3f9J6S19h9Xq1oc45YTS1DMReYnNBmbJMakQsNfZ6wdFvbXtgQEAAA== +'); +INSERT INTO revisions VALUES('04fe9ed6642b2e258162f948934726a3085e473f','H4sIAAAAAAAAAGWOQWoDMQxF9z6FyQkkW5bls4QhyLJMB5JMSYb2+p10kS7K33wET+/f/fty +0/s6/bnHcx1UZhPFniEla8oKWHSM7iVjgSIDtJovIWzXcXn41/pct3s8c2PtkHISQnXzlLwn +tQzIYK+41KbEyy/3J4SWIUOrzXozkEQorn1U8obAou7FNePBhWPFZa5Xj6f9QF+NTiF86m4f +f6d0CnE+tls8Z57tWAPD5tSUgKmnMZqDkAykXGBCtWJLiDHuWzzPNgqKkmMGse5SIPcxZJYq +HXk4EVRquPyT0lv6fgbt0BhxRk2ghsyZaBbRlKc7kLIxsdISfgDKoS95gQEAAA== +'); +INSERT INTO revisions VALUES('758967c8b6c66c95bcf8fad9f3f76278194c01be','H4sIAAAAAAAAAG2RUWpjMQxF/98qHlmBLEuytJYQgmxLNNAmpQ2d7Y87H+kwmT8jkM69x9f4 +dX7z6yXj874f2ywB7jmhuRFUxBKtlwYNZlFOSeWWgqdtu73O80d8XT4vt+t+BMqwmCKEHQNZ +i2AaqVVqKF5BOajVPP3Z+xtInKZeegXEYS4OhX3OHlwLA+sEbyMWcA3PeXmN/XBfq9+veti2 +d7+Pl59ROWx7ftze9qPb8AZFrPn0AJFu8l3L+0IlTEFiMRynbd/3+20/TjK0RJKJ1blEd2lm +soKjpnmH1jpp9dMTtD6gj2O9h8/UqEyow1aZWqOV4bnccCHTChJdnkQOWfPJxYI0GaX3suJO +WX6zFcxmnCDI/4oclOuffDgP1xXUigBBQcXWVK24qbKD/1ckPYvER6cqaagEc2Q6Igh1nNMC +lHQWqrxstsE/ItNWfnWKlVxHD2Wofc5Vp2kvMoMI2gr4LJKeRYItzCCpxRF8FJFKlKyONSOA +XIaQOJ2233wgvJ3KAgAA +'); +INSERT INTO revisions VALUES('9161ca0e2b8df467cdbecaf359f0f56784222755','H4sIAAAAAAAAAEWPUYrEMAxD/3OK0BPEieM4ZymlOInNFjrtMlN2r7+d/Zk/IZCedOjv+pBj +M31dfh65V01DJRpaKEJibbSKAZomlJ66WaucF+fOfaxP/dle23n4uWSuVDo36kS95taNTUa1 +ZIViYajY3yXLf+4DLAM0iNi4YTcmxQhaGpRQwgDORsa5GMUbOHTXS1fbdvXTdaffCibnvuXq +Xx8LJ+fteT78HCojd6QEEoN0IEqIllliMtWAco9FElyc9/46/QzalUIlrvdLpDg05gIEEArV +JgOEg/Lgxf0BzXe4vzcBAAA= +'); +COMMIT; ============================================================ --- tests/migrate_with_rosterify/migrate_keys 38b5ed1b66100385b6d85b91b6bca07482284a00 +++ tests/migrate_with_rosterify/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] ============================================================ --- tests/migrate_with_rosterify/old_revs_propagate_log 88f750aa31297047a4bd81476afdf170ec4fe24c +++ tests/migrate_with_rosterify/old_revs_propagate_log 88f750aa31297047a4bd81476afdf170ec4fe24c @@ -0,0 +1,2 @@ +propagate from branch 'testbranch2' (head c606ed519e48f526bb130fd64fef712f795f0625) + to branch 'testbranch1' (head 04fe9ed6642b2e258162f948934726a3085e473f) ============================================================ --- tests/mtn_read_FILE/__driver__.lua a6990431b287f4de659451b44d14a7ffaa5f78a2 +++ tests/mtn_read_FILE/__driver__.lua a6990431b287f4de659451b44d14a7ffaa5f78a2 @@ -0,0 +1,14 @@ + +mtn_setup() + +check(mtn("db", "init", "--db=foo.mtn"), 0, false, false) +mkdir("foo") +check(mtn("--db=foo.mtn", "--keydir=foo", "genkey", "foo"), 0, false, false, string.rep("foo\n", 2)) + +check(mtn("--db=foo.mtn", "--keydir=foo", "pubkey", "foo"), 0, true, false) +rename("stdout", "foo.keyfile") +check(mtn("read", "nonexistent"), 1, false, false) +check(mtn("read", "foo.keyfile"), 0, false, false) + +check(mtn("ls", "keys"), 0, true, false) +check(qgrep("foo", "stdout")) ============================================================ --- tests/read_and_convert_old_privkey_packet/__driver__.lua 599cf327cc2832fcbcc2f39e51200084ba951ee2 +++ tests/read_and_convert_old_privkey_packet/__driver__.lua 599cf327cc2832fcbcc2f39e51200084ba951ee2 @@ -0,0 +1,18 @@ + +mtn_setup() + +-- this is an old privkey generated with 0.23 + +getfile("old_privkey", "pkt") + +check(mtn("read", "pkt"), 0, false, true) +check(qgrep("read 1 packet", "stderr")) +check(mtn("ls", "keys"), 0, true) +check(qgrep("address@hidden", "stdout")) + +addfile("foo", "foo") + +-- check that we can use the key we just read +-- if it imported wrong, it'll fail by not accepting the passphrase + +check(mtn("ci", "-bfoo", "-mbar"), 0, false, false, string.rep("address@hidden", 2)) ============================================================ --- tests/read_and_convert_old_privkey_packet/old_privkey e8fcd2b19a2545fe17452873d8c9517ba0207744 +++ tests/read_and_convert_old_privkey_packet/old_privkey e8fcd2b19a2545fe17452873d8c9517ba0207744 @@ -0,0 +1,14 @@ +[privkey address@hidden +LKWvWrFPIkgZbnvBr/ZUFYHUE33psk0itcGSVbVK8BFGJz+M34Ys/OxizUNtkHRey6ttZg65 +/sCeKWjfJ8eV5zcyNC+V6KwZiG5EooOu+7fRN8ksIeiMvvgCM4RFPokmPrT9P4REEZ0CfVKr +m4CUlyDF94uq/gBEuhXuuzAJVchzfw+j6dt3krB4btgDdHAu6Wo9vKbJnJrd6hGqJPWs/Emb +6n/5ObzL8EiqOMRlfjUYw8rWmQoRPtTCKtj4hvfnsnvOhX3E/TWdm7keSpK/mfHNx8ldWdII +/dZgBHXWfUreALln2ZCm4/dPPfFEnZHEIjY/NcCmoVLzh4vZol/6e6VLCyQAS155VlDN2/vY +R3MFDBv6qX45+sAMX8KPebiVrxBT+eyt3uXGQQLnarTBQQ6/4QSe/MCaIXTc/IP4f6kxriLo +e0r66zpKFFQmP9jBWQaIcD/QW26L5Xr2DI1ANKE8ynulzHMSBdbEASFA5ZHFQgwJvqKgOZ1T +UG6cSKzRPSqCYGwKhoRjwwYWvC57E3bsgXDnSdrLhBr7Fxt318UeDr7qOmcrzIHQyC6sw3AQ +FKPvBENrfkDI5nbEW3Nd//wCFm374sozh4eleg5KLQbmgD0EJ1TqEaPb9jB/iBKq/tXcSTBJ +cEKrXluN07CjYLhmr0gSVMtA60O8lnvxtgQNLOWrVziA+mqa9sq88zaIC7nXYOsiE5IdHAbh +GPY/hCVVdq/jZOX1dCmh923NWZfTHOXK3lNzcYkUZjx9CUHoiUh4eUpq3XMJBy63BRQ7z5Ry +vvQ+v3hYrpSnBocemFP1/aDAKUYlvvuzh5ojgvHXVKeEbgaXf/E9IQ== +[end] ============================================================ --- tests/rename_files_into_a_directory/__driver__.lua 9080ecca27e1218caf9c7eef651357348a8dcc21 +++ tests/rename_files_into_a_directory/__driver__.lua 9080ecca27e1218caf9c7eef651357348a8dcc21 @@ -0,0 +1,92 @@ + +mtn_setup() + +addfile("gnat", "gnat") +addfile("mosquito", "mosquito") +addfile("termite", "termite") +addfile("ant", "ant") + +-- will force foo/, bar/ and foo/gnat/ to be created +mkdir("foo") +mkdir("bar") +mkdir("foo/gnat") +addfile("foo/dummy", "... ... ...") +addfile("bar/dummy", "a b c") +addfile("foo/gnat/dummmy", "la la la") + +commit() + +-- checkout in a clean dir and cd there +function co() + remove_recursive(test.root.."/checkout") + check(mtn("checkout", "-b", "testbranch", test.root.."/checkout"), + 0, false, false) +end + +co() + +-- basics +check(indir("checkout", mtn("rename", "ant", "foo")), 0, false, false) +check(indir("checkout", mtn("rename", "mosquito", "termite", "foo")), + 0, false, false) + +co() + +-- with --execute +check(indir("checkout", mtn("--execute", "rename", "ant", "foo")), 0, false, false) +check(indir("checkout", mtn("--execute", "rename", "mosquito", "termite", "foo")), + 0, false, false) +for _,x in pairs{"ant", "mosquito", "termite"} do + check(exists("checkout/foo/"..x)) + check(not exists("checkout/"..x)) +end + +-- to root +check(indir("checkout", mtn("--execute", "rename", "foo/ant", ".")), + 0, false, false) +check(indir("checkout", mtn("rename", "foo/termite", ".")), 0, false, false) +check(exists("checkout/ant") and exists("checkout/foo/termite")) +check(not exists("checkout/foo/ant") and not exists("checkout/termite")) + +co() + +-- conflicts +check(indir("checkout", mtn("rename", "gnat", "foo")), 1, false, false) +check(indir("checkout", mtn("rename", "gnat", "termite", "foo")), 1, false, false) +check(indir("checkout", mtn("rename", "termite", "foo")), 0, false, false) + +check(indir("checkout", mtn("rename", "mosquito", "foo/ant")), 0, false, false) +check(indir("checkout", mtn("rename", "ant", "foo")), 1, false, false) + +co() + +check(indir("checkout", mtn("--execute", "rename", "gnat", "foo")), 1, false, false) +check(indir("checkout", mtn("--execute", "rename", "gnat", "termite", "foo")), 1, false, false) +check(indir("checkout", mtn("--execute", "rename", "termite", "foo")), 0, false, false) +check(exists("checkout/foo/termite") and not exists("checkout/termite")) +check(exists("checkout/gnat") and exists("checkout/foo/gnat/.")) +check(not exists("foo/gnat/gnat")) + +co() + +---- TODO: +-- issues with missing files, should usually be allowed? +-- rename to self +-- rename root node + +-- rename to non-existing dir path: "foo->blweorih/o4thoihs" (this isn't a destdir case, but needs testing somewhere). + +-- file0->bar, file0 doesn't exist + +-- file0->bar, file0 exists, -e + +-- file0->bar, file0 doesn't exist, -e + +-- check that nothing happens if any would fail +-- file0->bar file1->bar, file0 exists, file1 doesn't + +-- file0->bar file1->bar, file0 exists, file1 doesn't, -e + +-- file0->bar, bar/file0 exists in working, file0 doesn't -e + +-- file0->bar ============================================================ --- tests/rename_with_actual_file_rename/__driver__.lua eba1a60bad4f749e7c609d233cc6c4828823622e +++ tests/rename_with_actual_file_rename/__driver__.lua eba1a60bad4f749e7c609d233cc6c4828823622e @@ -0,0 +1,17 @@ + +mtn_setup() + +addfile("file0", "file 0") +addfile("file1", "file 1") +addfile("file2", "file 2") + +check(mtn("rename", "file0", "newfile0"), 0, false, false) +check(mtn("rename", "--execute", "file1", "newfile1"), 0, false, false) +check(mtn("rename", "-e", "file2", "newfile2"), 0, false, false) + +check(exists("file0")) +check(not exists("file1")) +check(not exists("file2")) +check(not exists("newfile0")) +check(exists("newfile1")) +check(exists("newfile2")) ============================================================ --- tests/restricted_commands_are_consistent/__driver__.lua 19c97e07ddcb3f58553eb07e658ec1605287190c +++ tests/restricted_commands_are_consistent/__driver__.lua 19c97e07ddcb3f58553eb07e658ec1605287190c @@ -0,0 +1,143 @@ + +mtn_setup() + +-- the following commands accept file arguments and --exclude and --depth +-- options used to define a restriction on the files that will be processed: +-- +-- ls unknown +-- ls ignored +-- ls missing +-- ls known +-- status +-- diff +-- commit +-- revert +-- + +-- this test ensures that these commands operate on the same set of files given +-- the same restriction specification. maintaining consistency across these +-- commands allows for destructive commands (commit and revert) to be "tested" +-- first with non-destructive commands (ls unknown/ignored/missing/known, status, +-- diff) + +-- macros for running and verifying tests + +function patch_files(dat) +writefile("file1", "file1 "..dat) +writefile("file2", "file2 "..dat) +writefile("foo/foo1", "foo1 "..dat) +writefile("foo/foo2", "foo2 "..dat) +writefile("foo/bar/bar1", "bar1 "..dat) +writefile("foo/bar/bar2", "bar2 "..dat) +end + +allfiles = {"file1", "file2", "foo/foo1", "foo/foo2", "foo/bar/bar1", "foo/bar/bar2"} + +function lookfor(file, want, nowant) + for _,x in ipairs(want) do check(qgrep(x, file)) end + for _,x in ipairs(nowant) do check(not qgrep(x, file)) end +end + +function chk(cmd, where, want, nowant) + check(mtn(unpack(cmd)), 0, true, true) + lookfor(where, want, nowant) +end + +-- test restrictions and associated lists of included/excluded files + +data = {} + +data.root = {} +data.root.args = {"."} +data.root.included = allfiles +data.root.excluded = {} + +data.include = {} +data.include.args = {"file1", "foo/foo1", "foo/bar/bar1"} +data.include.included = {"file1", "foo/foo1", "foo/bar/bar1"} +data.include.excluded = {"file2", "foo/foo2", "foo/bar/bar2"} + +data.exclude = {} +data.exclude.args = {".", "--exclude", "file1", "--exclude", "foo/foo1", "--exclude", "foo/bar/bar1"} +data.exclude.included = {"file2", "foo/foo2", "foo/bar/bar2"} +data.exclude.excluded = {"file1", "foo/foo1", "foo/bar/bar1"} + +data.both = {} +data.both.args = {"foo", "--exclude", "foo/foo1", "--exclude", "foo/bar/bar1"} +data.both.included = {"foo/foo2", "foo/bar/bar2"} +data.both.excluded = {"file1", "file2", "foo/foo1", "foo/bar/bar1"} + +data.depth = {} +data.depth.args = {".", "--depth", "1"} +data.depth.included = {"file1", "file2", "foo/foo1", "foo/foo2"} +data.depth.excluded = {"foo/bar/bar1", "foo/bar/bar2"} + +function checkall(cmd, where, precmd) + local what = "" + for _,x in ipairs(cmd) do what = what..tostring(x).." " end + for name,t in pairs(data) do + L("Now checking: ", what, name, "\n") + local args = {} + for _,x in ipairs(cmd) do table.insert(args,x) end + for _,x in ipairs(t.args) do table.insert(args,x) end + if precmd ~= nil then precmd(name) end + chk(args, where, t.included, t.excluded) + end +end + +-- setup workspace +mkdir("foo") +mkdir("foo/bar") +patch_files("initial addition of files") +check(mtn("add", "file1", "file2", "foo"), 0, false, false) +commit() + +-- check that ls unknown/ignored/missing/known, status, diff, revert and commit +-- all agree on what is included/excluded by various restrictions + +-- ls unknown +-- dropped files are valid for restriction but are unknown in the post-state +check(mtn("drop", unpack(allfiles)), 0, false, false) +checkall({"ls", "unknown"}, "stdout") +check(mtn("revert", "."), 0, false, false) + +-- ls ignored +getfile("ignore.lua") +-- only unknown files are considered by ls ignored +check(mtn("drop", unpack(allfiles)), 0, false, false) +checkall({"ls", "ignored", "--rcfile=ignore.lua"}, "stdout") +check(mtn("revert", "."), 0, false, false) + +-- ls missing +for _,x in pairs(allfiles) do remove(x) end +checkall({"ls", "missing"}, "stdout") +check(mtn("revert", "."), 0, false, false) + + +patch_files("changes for testing ls known, status, diff") + +-- ls known +checkall({"ls", "known"}, "stdout") + +-- status +checkall({"status"}, "stdout") + +-- diff +checkall({"diff"}, "stdout") + +-- revert +checkall({"revert"}, "stderr", function(x) patch_files("revert "..x) end) + +-- commit +for name,t in pairs(data) do + local args = {"commit", "-m", name} + for _,x in ipairs(t.args) do table.insert(args,x) end + + local old = base_revision() + patch_files("commit "..name) + check(mtn(unpack(args)), 0, false, false) + local new = base_revision() + + chk({"status"}, "stdout", t.excluded, t.included) + chk({"diff", "-r", old, "-r", new}, "stdout", t.included, t.excluded) +end ============================================================ --- tests/restricted_commands_are_consistent/ignore.lua 529fff76aa21b0135d387c11acadade05607944c +++ tests/restricted_commands_are_consistent/ignore.lua 529fff76aa21b0135d387c11acadade05607944c @@ -0,0 +1,5 @@ +function ignore_file(name) + if (string.find(name, "1$")) then return true end + if (string.find(name, "2$")) then return true end + return false +end ============================================================ --- tests/restrictions_when_pwd_is_mixed_case/__driver__.lua 4a9f7bef46881a48fbeabadcffba9beade10f869 +++ tests/restrictions_when_pwd_is_mixed_case/__driver__.lua 4a9f7bef46881a48fbeabadcffba9beade10f869 @@ -0,0 +1,16 @@ + +mtn_setup() + +-- This is trivial on case-sensitive filesystems, but a little trickier +-- on case-preserving ones. + +mkdir("FooBar") +addfile("FooBar/testfile", "blah blah") +commit() + +writefile("FooBar/testfile", "stuff stuff") + +check(indir("FooBar", mtn("commit", ".", "-mfoo")), 0, false, false) + +check(mtn("diff"), 0, true, false) +check(qgrep("no changes", "stdout")) ============================================================ --- tests/revert_ignored_files/__driver__.lua 52052045f5a5ad9be1b9126be33a51b9441356a6 +++ tests/revert_ignored_files/__driver__.lua 52052045f5a5ad9be1b9126be33a51b9441356a6 @@ -0,0 +1,40 @@ + +mtn_setup() + +-- revert, with only ignored files listed on the command line, should not +-- revert anything + +addfile("foo", "foo") +addfile("bar", "bar") +addfile("baz", "baz") + +writefile("foo.ignored", "foo.ignored") +writefile("bar.ignored", "bar.ignored") +writefile("baz.ignored", "baz.ignored") + +getfile("ignore.lua") + +commit() + +writefile("foo", "foofoo") +writefile("bar", "barbar") +writefile("baz", "bazbaz") + +check(mtn("status", "--rcfile=ignore.lua"), 0, true, false) +check(qgrep("foo", "stdout")) +check(qgrep("bar", "stdout")) +check(qgrep("baz", "stdout")) + +check(mtn("status", "--rcfile=ignore.lua", "foo.ignored", "bar.ignored", "baz.ignored"), 0, true, false) +check(not qgrep("foo", "stdout")) +check(not qgrep("bar", "stdout")) +check(not qgrep("baz", "stdout")) + +-- revert with nothing but ignored files should do nothing + +check(mtn("revert", "--rcfile=ignore.lua", "foo.ignored", "bar.ignored", "baz.ignored")) + +check(mtn("status", "--rcfile=ignore.lua"), 0, true, false) +check(qgrep("foo", "stdout")) +check(qgrep("bar", "stdout")) +check(qgrep("baz", "stdout")) ============================================================ --- tests/revert_ignored_files/ignore.lua b0d06243ccf09fe335fba783cee049f173f0bbec +++ tests/revert_ignored_files/ignore.lua b0d06243ccf09fe335fba783cee049f173f0bbec @@ -0,0 +1,4 @@ +function ignore_file(name) + if (string.find(name, "%.ignored$")) then return true end + return false +end ============================================================ --- tests/rosterify_--drop-attr/__driver__.lua 00714d38d59159019cac8b5587417e5ecde89d66 +++ tests/rosterify_--drop-attr/__driver__.lua 00714d38d59159019cac8b5587417e5ecde89d66 @@ -0,0 +1,34 @@ + +mtn_setup() + +-- This is a db containing two revisions. The first revision contains the +-- file "testfile", and has a .mt-attrs file that contains: +------ +-- file "testfile" +-- foo "bar" +--execute "yes" +------ +-- The second revision is identical, except it also contains the file +-- "otherfile". The existence of the second revision is purely to work +-- around a current bug in rosterify, in which it breaks for revisions +-- which have no parents and no children. (It hits an invariant; +-- without the invariant, it would silently throw such revisions away.) + +remove("test.db") +getfile("test.db.dumped", "stdin") +check(mtn("db", "load"), 0, false, false, true) +check(mtn("db", "migrate"), 0, false, false) + +check(mtn("db", "rosterify"), 1, false, false) +check(mtn("db", "rosterify", "--drop-attr", "foo"), 0, false, false) + +check(mtn("automate", "select", "i:"), 0, true) +check(mtn("automate", "toposort", "address@hidden"), 0, true, false, {"stdout"}) +revs = {} +for l in io.lines("stdout") do + table.insert(revs, l) +end + +getfile("manifest_good") +check(mtn("automate", "get_manifest_of", revs[1]), 0, true) +check(samefile("stdout", "manifest_good")) ============================================================ --- tests/rosterify_--drop-attr/manifest_good 188c69bb6f5e1ac70a6e4b8d02a543722d837d05 +++ tests/rosterify_--drop-attr/manifest_good 188c69bb6f5e1ac70a6e4b8d02a543722d837d05 @@ -0,0 +1,7 @@ +format_version "1" + +dir "" + + file "testfile" +content [f572d396fae9206628714fb2ce00f72e94f2258f] + attr "mtn:execute" "yes" ============================================================ --- tests/rosterify_--drop-attr/test.db.dumped 7b7eceb0dac25861abf838cb7f7d692aa47e7c65 +++ tests/rosterify_--drop-attr/test.db.dumped 7b7eceb0dac25861abf838cb7f7d692aa47e7c65 @@ -0,0 +1,148 @@ +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) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('d500a60c5b4090fcaa24a0aa4e61ceac62bedc87','H4sIAAAAAAAA/1NQUEjLzElVUCpJLS4BsZS4FIAgLT9fQSkpsUiJK7UiNbm0BKigMrVYiQsA +jWWseS8AAAA= +'); +INSERT INTO files VALUES('f572d396fae9206628714fb2ce00f72e94f2258f','H4sIAAAAAAAA/8tIzcnJ5wIAIDA6NgYAAAA= +'); +INSERT INTO files VALUES('4cbd040533a2f43fc6691d773d510cda70f4126a','H4sIAAAAAAAA/0vKSczgAgAtMsRQBQAAAA== +'); +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) + ); +INSERT INTO manifest_deltas VALUES('3f30a82c7014cbd03ff76a432122fead01c8184f','a44c350fcc9f420d7434e6138ac81ded204b2863','H4sIAAAAAAAA/wXBMRKAIAwEwJ5X5AM6B5KotRXPOAJ2Npr/j7tNNKehAA2uveLE7WSpBFmn +ZZ90K30OP3aR9YmFEe+XLsnYREv6AZgZG4xCAAAA +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('a44c350fcc9f420d7434e6138ac81ded204b2863','H4sIAAAAAAAA/x3LywnDMAwA0Hum8AINsixL9jiyPrTQUki8P4W++/MOoAzWF8GENFUkBVUK +rhZqjCvchpRyfvZD977ug2w5EPTWFJNaGvOsLtK8VzBXgaSKrKV89zOufL3jyC7obXJqTARm +HFIpF1oApGBMSsQ+spQd9/6XH28WJuCbAAAA +'); +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=='); +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('','bf59016928d6c5575b644c51b2c9a2abf93a599c'); +INSERT INTO revision_ancestry VALUES('bf59016928d6c5575b644c51b2c9a2abf93a599c','c373065ed5b08610f105d78ee098023ac9edd3bd'); +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('12b1bda699161948a1596f69c9b3c1eeff6231b8','bf59016928d6c5575b644c51b2c9a2abf93a599c','branch','dGVzdGJyYW5jaA== +','address@hidden','dzqOyPMQLJJDIPk+UZKTazWNozQFM08P/Zk5BXMTIzKcG557MKkXn1SSdsYmurTKZMiznlnT +Wzvtz6IQSU/cY5n72Aa++4lmHdinqdf2j7mlLDjYN4pqhZQ/LqOyIpmar9v1ESuwFskLZFS+ +XFxOpofMh65SJ3gSQVPvGYvN7Kk= +'); +INSERT INTO revision_certs VALUES('f3979520824678355552d5d235753094b5b93a01','bf59016928d6c5575b644c51b2c9a2abf93a599c','date','MjAwNi0wMS0wOVQwODoxNzoxNg== +','address@hidden','rBvC4YvYORkkgLls7YzisSGhCZoi1M9YZeQ0+dtWy+ITGhdY3tklxLkG7hEOYgnm3L0NURXs +gR7UhfGzk/zTytVGBmsoIDQAJSqDBwrEhcrG5OafVDJQ14Wxus++H6SyfkK1oqS9y6ugQ/HY +b1qIh5YO2kjuffVnP6NBB72wIYs= +'); +INSERT INTO revision_certs VALUES('e0d42cfe73c3c521c5bf0cdc618bac64efc5f7bd','bf59016928d6c5575b644c51b2c9a2abf93a599c','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','LBujAhXnUbDur7CHIR3RSsMAHtb6Ga3Nm+XSoiXS0mls66V4YhbaX1W9f8wDX01XMrhX2asv +KM3yNtt4iuhs4Ul63MeYl+vdjV0ynn87ORIAwCIoIJhLL3VIfxC43FoZ/Ztb2Y71qitEca/i +CqaXotjW5Kd8+PmTuLAUggURy7w= +'); +INSERT INTO revision_certs VALUES('a6666f2c15ff96fbf8714f0520f3e3a8f174c386','bf59016928d6c5575b644c51b2c9a2abf93a599c','changelog','YmxhaGJsYWg= +','address@hidden','nLQXezDc6s5aDd2lCCD1gopyuIi5V/vzvi2U4Usla6U11ZjyJM2j6Z3vW3VaAOvWnc/7QOUE +Nr4pPSPz/cfjiEMTibO27e8zkOo2EmWh1LShvChXXtmi/6sgdPZF4A60EcEmZJzC66Sp75y+ +edUlEWU+59h6erC2myzrQ2vk8u4= +'); +INSERT INTO revision_certs VALUES('5d718fdfb0e4c77d4231ef47bead30724f099952','c373065ed5b08610f105d78ee098023ac9edd3bd','branch','dGVzdGJyYW5jaA== +','address@hidden','BGdR9h5+rDj8uciSyriZKLxee7GCdD/x10X13ckLTQlzeNRfZ/Sx98rIPoeEi328wao8daqo +14NNYA8aAAhcnOCsAxnkHvRqTlvyGrMUSqsKGmt03ouWNITkExWQN9KxCw3BX4ZcGqYfy044 +kfaShsr3p+jm/mSuSTH+vvMBzQ8= +'); +INSERT INTO revision_certs VALUES('24dafa409b849e5f048bacbad9972b3043bf9dbc','c373065ed5b08610f105d78ee098023ac9edd3bd','date','MjAwNi0wMS0wOVQwODo1MzowMA== +','address@hidden','icjMCHRw7HYxBIdayFHSXHkCpeBmo+PzsfO5xRMgbZQmGum0zoRQ9vQE9ephlm1pA8wsxBUB +V+aX+YqeCnga2BEIARvu0PyLqW+tq21D5eg8+1nN9dtBA011xj5sW4638elDsOjICwu4m7BX +pKOZ5vyzFg06GMZIx6QRdcPpKDQ= +'); +INSERT INTO revision_certs VALUES('0f2b060fb754f9512f7354ca64ad94a660a5cb7e','c373065ed5b08610f105d78ee098023ac9edd3bd','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','QaI1e5WHraP+tJpV8JaDfQZ3/fSeBy7NSs27D/G14yYjaTaH38aS8zwM238nOwtsoa6qwjSB +sWbPbNtqLEHKIxV9E63P1HDjzLhmV964f+cZYUBuMc0bRRMzgvyfbFZXUtcvnebZX+jS/TTA +96A9Ep140bzke8MYXT1w8T+FGwU= +'); +INSERT INTO revision_certs VALUES('1279123a0ec6678327961bd6592fb4c4ca040e4f','c373065ed5b08610f105d78ee098023ac9edd3bd','changelog','YmxhaGJsYWg= +','address@hidden','Mg6tVIqSO+nEQ7sY6dZtVKoQdd+7amGx219+l0xrOXAktrlCTd5nACdWAW6HE6towDEOIwTp +fBy+DCszpZjG+yeWJU88o446wU5VH5IqYoalWOB7YC8Cjen5cwHKuqT5fZbLvASDaKM1co9G +ujDXUiqo9X7F1Z/Ry3bSsjvemsI= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('bf59016928d6c5575b644c51b2c9a2abf93a599c','H4sIAAAAAAAA/12PzQqDMBCE732K0HvLZhOT+Cwism52qVC1aGhfv9pD/24zw8cHM8mjG2ka +VNZiGqcOKCFHsJ77DE41BvIOLaIKZbCcbPLaHg7zNXeL3Id1mCfTtK/+EW0A5dzpcBVzPI/l +RKUs6/F7LRu4p228UeHLD2d0mcddY4wps2lyBUABuOo91KBMhJ6AyEuwLMQBe8mcYvuWffT/ +Lq0iZlcHJakRQsAUrdceWQA0otReEau0nXwCoOTA4x0BAAA= +'); +INSERT INTO revisions VALUES('c373065ed5b08610f105d78ee098023ac9edd3bd','H4sIAAAAAAAA/1WNW4rDMAxF/70K0xXYkvxaSwhBliwaaJMhDZ3tT6Y/w/xdDtxztvG9PHlb +bbxOPzGRYAom0owgaCGkkSNWlhp1KATqUDPOzu0PXY7xXl/rvvmpW2oh5gZVs6RUUs+XKsUO +0hi4W0NOrcn8+f0F0TBwBSkhknQNaFYyE0IEsMEa4hWuZFeQVRdbH8Pf9vM+jt95c+6LT7n/ +Q96O/emn2Xnvz91PHy+FhMhghCY5t6iloKYYRLkEowiZZ/cDP0khSAwBAAA= +'); +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/rosterify_migrates_file_dir_attrs/__driver__.lua ae20dbdc1ff58e8dd3543c77789d5c158165c8ad +++ tests/rosterify_migrates_file_dir_attrs/__driver__.lua ae20dbdc1ff58e8dd3543c77789d5c158165c8ad @@ -0,0 +1,44 @@ + +mtn_setup() + +-- This is a db containing two revisions. Both contain the files +-- "testfile" and "testdir/otherfile". The first has a .mt-attrs file +-- that contains: +------ +-- file "testfile" +--execute "true" +-- +-- file "testdir" +--manual_merge "yes" +-- +-- file "nonexistent" +--execute "true" +------ +-- The second is the same, except that "yes" and "true" have been +-- swapped in all places. +-- (I know it makes no sense to have manual_merge on a directory, but +-- we want to test attrs on directories, and manual_merge and execute +-- are the only two attrs that get migrated directly...) + +remove("test.db") +getfile("test.db.dumped", "stdin") +check(mtn("db", "load"), 0, false, false, true) + +check(mtn("db", "migrate"), 0, false, false) +check(mtn("db", "rosterify"), 0, false, false) + +check(mtn("automate", "select", "i:"), 0, true) +check(mtn("automate", "toposort", "address@hidden"), 0, true, false, {"stdout"}) +revs = {} +for l in io.lines("stdout") do + table.insert(revs, l) +end +-- check the first manifest +getfile("first_manifest_good") +check(mtn("automate", "get_manifest_of", revs[1]), 0, true) +check(samefile("stdout", "first_manifest_good")) + +-- check the second manifest +getfile("second_manifest_good") +check(mtn("automate", "get_manifest_of", revs[2]), 0, true) +check(samefile("stdout", "second_manifest_good")) ============================================================ --- tests/rosterify_migrates_file_dir_attrs/first_manifest_good 40cc8615372f67622d13b2dffd8d8953ec74eb48 +++ tests/rosterify_migrates_file_dir_attrs/first_manifest_good 40cc8615372f67622d13b2dffd8d8953ec74eb48 @@ -0,0 +1,13 @@ +format_version "1" + +dir "" + + dir "testdir" +attr "mtn:manual_merge" "yes" + + file "testdir/otherfile" +content [ee9e51458f4642f48efe956962058245ee7127b1] + + file "testfile" +content [55ca6286e3e4f4fba5d0448333fa99fc5a404a73] + attr "mtn:execute" "true" ============================================================ --- tests/rosterify_migrates_file_dir_attrs/second_manifest_good 6d0ebeee985dceee21fadbe252e62348ce44f8be +++ tests/rosterify_migrates_file_dir_attrs/second_manifest_good 6d0ebeee985dceee21fadbe252e62348ce44f8be @@ -0,0 +1,13 @@ +format_version "1" + +dir "" + + dir "testdir" +attr "mtn:manual_merge" "true" + + file "testdir/otherfile" +content [ee9e51458f4642f48efe956962058245ee7127b1] + + file "testfile" +content [55ca6286e3e4f4fba5d0448333fa99fc5a404a73] + attr "mtn:execute" "yes" ============================================================ --- tests/rosterify_migrates_file_dir_attrs/test.db.dumped 7149517db5d4fd54021677c255d3aaaece56c0e5 +++ tests/rosterify_migrates_file_dir_attrs/test.db.dumped 7149517db5d4fd54021677c255d3aaaece56c0e5 @@ -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, -- rdiff to construct current from base + unique(id, base) + ); +INSERT INTO file_deltas VALUES('5576c85cbfa8770932caa8d01411286f67013f3e','03024287ec276ff6893d9bb7fef7652cb0f6bb15','H4sIAAAAAAAA//NUMDQ05VJQUEjLzElVUCpJLS4BsZS4UitSk0tLQEJFpUAuSAkYINSlZBYp +ceUm5pUm5sTnphalA4UrU4shSiGq8vLzUisyi0tS80owDQQAl841yXoAAAA= +'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('ee9e51458f4642f48efe956962058245ee7127b1','H4sIAAAAAAAA/0uqTOUCALfFFBMEAAAA +'); +INSERT INTO files VALUES('55ca6286e3e4f4fba5d0448333fa99fc5a404a73','H4sIAAAAAAAA/8vI5AIAenpv7QMAAAA= +'); +INSERT INTO files VALUES('03024287ec276ff6893d9bb7fef7652cb0f6bb15','H4sIAAAAAAAA/12MQQqAMAwE73lFyMek6CqBNkKbQP29lgqCexqGYZl51wwWR/NBQuhYwx91 +oQkRv/uyTatQSRYpLwX1GLoGZjszOw1dm8P8f3gDz1+AGHIAAAA= +'); +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) + ); +INSERT INTO manifest_deltas VALUES('aa1a5dc0a155fa44f160964054816556c3e8afd5','598dc864af1811332c3fd4ee249cadddba8ebdcd','H4sIAAAAAAAA/w3KuQGAQAgEwJwqrgQWjsfYyDIQpf8SdOK51mYyC++0vqcygg+VrsqHsQFJ +Hw+Gjr50/ntBlD5R4GPBNwAAAA== +'); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +INSERT INTO manifests VALUES('598dc864af1811332c3fd4ee249cadddba8ebdcd','H4sIAAAAAAAA/yXLyw3CMAwA0HunyAJA4l/sceLUFpVASG32FxK8+6tYgUB7TOiSKWq4m3vP +yC4M02uKe+NS7u91G2ud1xZhwY1Yk4QgSSPDWEygsgJxRG/QvZWy4lr7cT4+6xlnHq/YmOcQ +UAkMSkofvFciRcQcZjl5UKXR8X9/5QtV3crQowAAAA== +'); +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=='); +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('','be6329dabe85b0bc850f2923166d449cb10d4997'); +INSERT INTO revision_ancestry VALUES('be6329dabe85b0bc850f2923166d449cb10d4997','40b16687d983f5bafaf4225dacfbe9b426d17dab'); +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('c358d633b790ad7c9ec78b763942807bb8a1a7d3','be6329dabe85b0bc850f2923166d449cb10d4997','branch','dGVzdGJyYW5jaA== +','address@hidden','IosOv++xnwJbUfs0axMC50hsnHlRSuMRd08pW+1wGuafwY5Ne5g4aif1rWoxt9IR/yCYUk1T +iV+GDnXANmBRQ8ChoFHFoO50fmY4wcZ8bCtsCUuSi807/0Uqp8MwBN8+tnIvAF5CTl0nXopQ +o+IZyVqkc5qP9sIvw0Zmpy2D1aM= +'); +INSERT INTO revision_certs VALUES('21d750e884f427f5d8aa3f1e4616e45cc0ec0a13','be6329dabe85b0bc850f2923166d449cb10d4997','date','MjAwNS0xMi0yM1QxMDo1MjoyOA== +','address@hidden','lJgZfgMtvvaB+TI9gDOxLyzXKZJgOT+5nhGAfVxHLPMnfENRU5OyDWMmw2hJBaZDXy4YrjZC +ZLysmQj63G/d5WKBUJvjNwcx9kyEP17XqLDuLv/ekdzBAPTKBPldajORUpgVYSYcwVcWbqvE +7TteZQhLGZUORXDQAqAcA04EVpo= +'); +INSERT INTO revision_certs VALUES('8075ed60e0ff43afdba58ad2210b52bf37f16333','be6329dabe85b0bc850f2923166d449cb10d4997','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','PhjaV0i4WrJ6KZk97lNM4FnuK9nLXvoeKC2RYQgikxI2BaBWtRnw9xQ9gQNMT/OYR2WYWRSL +1HsWBuhE6zTOV3EbR3mKFP2gvW20b3hQ+zFldEf4Fc+IpM8nqdM4tGnLzfKgohx+va7yVWOf +qU27voyGoHUMu2qXMcRwAJMOJ6o= +'); +INSERT INTO revision_certs VALUES('b8a3117a005ea82b8543e12e3e9ab0874f8bc9f8','be6329dabe85b0bc850f2923166d449cb10d4997','changelog','Zm9v +','address@hidden','Cuff2kmJ5erYw5GQASoke0oE0kBQRmsQBiE7kYd0NkXgPICquwtsR+2VLhEN2dGNduAhWy6T +do8neqe5Y74XJed2WiHhB9AqiTTrBnw7+vcoDVAMkuBkKiJB3EdKwgdJFwjR6to7rf7jBbKh +22HwBfi5YAYVm8bbjJcOn4JTSJA= +'); +INSERT INTO revision_certs VALUES('069f94a1abee5aee684d89204b71a49aa5c65a10','40b16687d983f5bafaf4225dacfbe9b426d17dab','branch','dGVzdGJyYW5jaA== +','address@hidden','Eik4xN4ZPbbP7NzRBvXcG24jNg8Rr1VKfneS/oajim6jtxIHjDeV5XozE/GS3hpntSoav8K5 +sXVkjKQks0lz5uk1XpvavBpdQfNGikjF3URSgAO0gX9cnDlb8q3KGi0Ze7Ck4ES92/YnZsUK +JZnKEB26Okgt7E0dDbpQZjm/dPc= +'); +INSERT INTO revision_certs VALUES('d76f195efcffe68024aa851390efc85efcba2fa7','40b16687d983f5bafaf4225dacfbe9b426d17dab','date','MjAwNS0xMi0yM1QxMDo1Mjo0Ng== +','address@hidden','om3Aj5uwzWwdGw5Wh9ATnfymeXRpI2t/8xVsCCLnyt2koCmnY6NYPhXuiSqnysGgP7Rfc9Qo +gP2ehSg5ymlOpG87nY/BVOQ95wqR6xli28EaXz3hCgxXRqiwxTN+CM7Sgo15cPJ6Imk+OJSg +0rBJC/hWAqerQDjTeIaOUy6QYiY= +'); +INSERT INTO revision_certs VALUES('820e89f071954266b2a77935bd1cf366ea81cd68','40b16687d983f5bafaf4225dacfbe9b426d17dab','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','r09AAP18N7bhquw/OnCrJ2/Sh2c++a5rnzJ9wN4N98wTgrn/2llAbKsoOyWTbKd0HiyJRSOw +VBxBK3c7n26FEyYsUk67g+/Xhs5JdwsutqGrXq+/BpFZ/MCUq9DdRJUfIgSrDeXjenjbrykm +fzX3XsMuNpDSDfwSLwNfhQm00aE= +'); +INSERT INTO revision_certs VALUES('f272e44391121d2270c238180f120b091315aec0','40b16687d983f5bafaf4225dacfbe9b426d17dab','changelog','Zm9v +','address@hidden','Qu7CoipxdeqhWQ6G1v81EB+goJsG1fVuCIyGgQqlpmMbzf+rXcNGp2fEzlk9QkoJzbKNVzQh +Wg2bChbTu548nXZxOa4oQdEiGopW3NOgySC7wZfwzsJXuf253CFXRtSMCV6LnCzNFgWBOmPD +U9jqCLj4V66OpYP0pika378eOow= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('be6329dabe85b0bc850f2923166d449cb10d4997','H4sIAAAAAAAA/22Q3U7DMAxG7/sU0e6BOLHz8yxVVbmJrVVaV9RG8Pp0CAGDXfr40/ksX+V9 +XPg6q+zN9MzAVItlIFJGVAg2B7SECQJRKF4Sa6Wh69ZLHTd5m/d5vZp++Jx/REeAax11vog5 +PS/tiVvb9tNv2o5gnbeXtZ1lu6F/2y/4yq2c7yxGt3W5lRhj2mp6ohhKojIppxht9q4wp2oB +AVwKGqIFr16Gb9mD8r9SkSwESEkxoFNMopIp5OAsJYckEsHFCe6lj11EhcNxiXhBRZ2OJ1vE +5L1XzlkLMVrk6IfuAzJHTqSQAQAA +'); +INSERT INTO revisions VALUES('40b16687d983f5bafaf4225dacfbe9b426d17dab','H4sIAAAAAAAA/0XOTWrEMAxA4X1OYWbfYvlHls8SwiBZFg00k5KY9vo13fQAj++9+s/z4Ndu +/R5uzZW0ESY2IIAYQ4umqfeQamNVFaYu2nRblvNTn1f/3u/9fLlVOsZQlaVTFi+NsrdQQwRE +TTMW8JpqLdtf9w8yA2dtniFn45QM0FdMPicCzBlb7MSmeYJfPNqHe7wf443HuO7H4uw6jzmd +C06wiTGV4uu8Zib1kAACoWHxEC32bXHOjdOtPvqQApXeQkEzpBq1ihTrVjCHJt5QBCb6C4GK +35oeAQAA +'); +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/rosterify_on_a_db_with_1_rev/__driver__.lua 7d553a2f86f34e4c964aa76201f0f7f042646f07 +++ tests/rosterify_on_a_db_with_1_rev/__driver__.lua 7d553a2f86f34e4c964aa76201f0f7f042646f07 @@ -0,0 +1,23 @@ + +mtn_setup() + +-- This is a db containing only one revision. The revision contains +-- two files; "testfile" and "testdir/otherfile". + +remove("test.db") + +getfile("test.db.dumped", "stdin") +check(mtn("db", "load"), 0, false, false, true) +check(mtn("db", "migrate"), 0, false, false) +check(mtn("db", "rosterify"), 0, false, false) + +check(mtn("automate", "select", "i:"), 0, true) +check(mtn("automate", "toposort", "address@hidden"), 0, true, false, {"stdout"}) +revs = {} +for l in io.lines("stdout") do + table.insert(revs, l) +end + +getfile("manifest_good") +check(mtn("automate", "get_manifest_of", revs[1]), 0, true) +check(samefile("stdout", "manifest_good")) ============================================================ --- tests/rosterify_on_a_db_with_1_rev/manifest_good fad486e695284e3d086b283e44171cda59efe3ef +++ tests/rosterify_on_a_db_with_1_rev/manifest_good fad486e695284e3d086b283e44171cda59efe3ef @@ -0,0 +1,11 @@ +format_version "1" + +dir "" + +dir "testdir" + + file "testdir/otherfile" +content [a5de1b65f54b120f5986028af3f83632f4c65470] + + file "testfile" +content [c0eff70406a3aeed4a50e0772c0ee1f8919d9988] ============================================================ --- tests/rosterify_on_a_db_with_1_rev/test.db.dumped 45725ca2800737426da29c847d485741ab9ecba3 +++ tests/rosterify_on_a_db_with_1_rev/test.db.dumped 45725ca2800737426da29c847d485741ab9ecba3 @@ -0,0 +1,117 @@ +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) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('a5de1b65f54b120f5986028af3f83632f4c65470','H4sIAAAAAAAA/8tMU6jML1VITsxTKEpNTFEoycgs1lEoz0gsUYhPLEqNB8um5GfmpdtzAQAG +ubkCLAAAAA== +'); +INSERT INTO files VALUES('c0eff70406a3aeed4a50e0772c0ee1f8919d9988','H4sIAAAAAAAA/ytOTS5KLVHITS0uTkxPVeQCANb0C7UQAAAA +'); +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 + ); +INSERT INTO manifests VALUES('27b0525617c99793c45b7a7f135676c09113528d','H4sIAAAAAAAA/yXLwQnDMAwF0HunyAaVbUmWxlHsLxooFFLvT0J7fryQibKrpPBeKqW4KVWL +bGlNW00eKtxp2xa+ax7n87NeOPN44zEImZ2YNFoAk0MI1Hu9ASXNi093s//9lQuN3ZOKbwAA +AA== +'); +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=='); +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('','707047e1627d3e9da02be34f8742e653f131c3dc'); +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('e2f9d168dc3e776868a9268acce560035c798f1b','707047e1627d3e9da02be34f8742e653f131c3dc','branch','dGVzdGJyYW5jaA== +','address@hidden','FCD3vGbF9/RGh/Vogn0rYimY4k0XrC5bJaSD4B6uhPZsoRNHlS+TbTbafa5MEQegmaMFq2p3 +CXkj6Ne0szcdGGFDpM7X5Q2zFdQPJQVfCSj633ChxzF6m3cTN5lcVEbXxRhsg2kmTeu+DG75 +Fqa0drbFnS21axHXnhHGFMQ2IBQ= +'); +INSERT INTO revision_certs VALUES('7ae21e6a353ee5e26752a879d9d87366177fff18','707047e1627d3e9da02be34f8742e653f131c3dc','date','MjAwNi0wMS0xMFQwMTozOToxNQ== +','address@hidden','giFYo0udYUMdT8EFSJP31lql7KmkRbXWACZUrHVPkP9ZuR30pFTKBk90xMb3J6Dm4wbSg2v5 +Wtwf8LOSg29D14A2g1zwg7u8GyNxG7W/9x1aquNXAlL5bUvSCHbOYbfpoiqV3GmNLCNmheRy +r4P56tK4uP0YxmzANtWv1Li7YxM= +'); +INSERT INTO revision_certs VALUES('cc339984b4981499f5e3bf0571d6ecae323ced0c','707047e1627d3e9da02be34f8742e653f131c3dc','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','N9KyN8My8hKfayzwirsp99DIHw+r84K5a/I6r9mC+K4dMacySOtPkMGT9upUu+TvmR9FAVSB +WKiLClzUEcNA9mQMWr2D8Gawihux1iggzTcbx8v82NWAf4bOKSsWYDBCkVlnYN/PKB3uWbjx +GW3RXH6ntXYs2wI2Ne0pXEBjWNY= +'); +INSERT INTO revision_certs VALUES('646ee0d4edd4f346855a996a259a88249805235d','707047e1627d3e9da02be34f8742e653f131c3dc','changelog','YmxhaGJsYWg= +','address@hidden','jNp5S9PGMlrYQcIN71jJ/4m+cpQ3VKoFEd+TcuFZTg3VM5hTWVAciVAtdOsNgGRDoy/yNPHS +yfrYYyv9Wg+UIsg6E1lhxiQqdL7Qf/Cx40VcS7W3HcdXqMygjd1EU1tcqqgfO+psqYOhBTgd +HlQw6t4Kzqkwu8v0ZuLiAuws3Wo= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('707047e1627d3e9da02be34f8742e653f131c3dc','H4sIAAAAAAAA/22MbWrDMBBE//sUIhfo6mO10lmMMWtplwgSqziivX6dUigt+TfzZni7fK53 +3pvKY5jZ0QboMFoqOVP2JeBGTGo9RooFsj2TS3WZpn6r6yEf7dH6bublu/+KzgPXumq7ibmM +E9V2vPVxleOJLv/XH/jOo1xf/o0e/f7UGmNGNzNjFbtFVAybdaCYUwSXWL0mH73TUCIGguWP +9LWrgKgSBIjsWaQGRhAgcucgVlO2ueac0jJ9AVMt2GYtAQAA +'); +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/setup_on_existing_path/__driver__.lua 1b50d361f9693ca080715d27eac680e8ab513072 +++ tests/setup_on_existing_path/__driver__.lua 1b50d361f9693ca080715d27eac680e8ab513072 @@ -0,0 +1,10 @@ + +mtn_setup() + +writefile("foo", "blah blah") +check(mtn("setup", "--branch=testbranch", "foo"), 1, false, false) +mkdir("bar") +check(mtn("setup", "--branch=testbranch", "bar"), 0, false, false) +check(exists("bar/_MTN")) +remove_recursive("bar/_MTN") +check(indir("bar", mtn("setup", "--branch=testbranch")), 0, false, false) ============================================================ --- tests/test_a_merge_7/__driver__.lua fa8de24b1aa6f6e132e8dceaa4b28b9163d0f9dc +++ tests/test_a_merge_7/__driver__.lua fa8de24b1aa6f6e132e8dceaa4b28b9163d0f9dc @@ -0,0 +1,52 @@ + +mtn_setup() + +-- this used to be a test for the --lca option to merge and propagate. +-- this option is no longer needed in 0.26, so has since been removed. +-- --lca was a temporary workaround for 3-way merge suckiness. + +-- arguably the issue is now fixed with mark-merge. I've changed +-- the test to do a successful merge of E and F, since, well, +-- extra merge cases never hurt. + +-- A +-- / \ +-- B C +-- |\ /| +-- D X | +-- |/ \| +-- E F +revs = {} + +addfile("testfile", "foo bar") +commit() +revs.a = base_revision() + +addfile("otherfile1", "blah blah") +commit() +revs.b = base_revision() + +revert_to(revs.a) + +writefile("testfile", "new stuff") +commit() +revs.c = base_revision() + +check(mtn("merge"), 0, false, false) +check(mtn("update"), 0, false, false) +revs.f = base_revision() + +revert_to(revs.b) + +addfile("otherfile2", "blah blah") +commit() +revs.d = base_revision() + +check(mtn("explicit_merge", revs.d, revs.c, "testbranch"), 0, false, false) +check(mtn("update"), 0, false, false) +revs.e = base_revision() + +check(mtn("merge"), 0, false, true) +check(not qgrep(revs.a, "stderr")) +check(qgrep(revs.e, "stderr")) +check(qgrep(revs.f, "stderr")) ============================================================ --- tests/things_in_.mtn-ignore_get_ignored/__driver__.lua e7b9b6ae892ff496fa72248c63a48520e6c8da64 +++ tests/things_in_.mtn-ignore_get_ignored/__driver__.lua e7b9b6ae892ff496fa72248c63a48520e6c8da64 @@ -0,0 +1,35 @@ + +mtn_setup() + +mkdir("baz") +writefile("foo") +writefile("bar") +writefile("baz/xyzzy") + +writefile(".mtn-ignore", "bar\nbaz\n*.d\n") + +check(raw_mtn("ls", "unknown"), 0, true, true) +copyfile("stdout", "unknown") +copyfile("stderr", "unknownerr") + +check(qgrep("foo", "unknown")) +check(not qgrep("bar", "unknown")) +check(not qgrep("baz", "unknown")) +check(qgrep("WARNING", "unknownerr")) + + +check(raw_mtn("ls", "ignored"), 0, true, true) +copyfile("stdout", "ignored") +copyfile("stderr", "ignorederr") + +check(not qgrep("foo", "ignored")) +check(qgrep("bar", "ignored")) +check(qgrep("xyzzy", "ignored")) +check(qgrep("WARNING", "ignorederr")) +check(grep("-qv", "WARNING|ignoring", "ignorederr"), 1) + +remove(".mtn-ignore") +check(raw_mtn("ls", "ignored"), 0, true, true) +check(qgrep("test.db", "stdout")) +check(not qgrep("WARNING", "stderr")) +check(grep("-qv", "WARNING|ignoring", "ignorederr"), 1) ============================================================ --- tests/update_-b_foo_updates__MTN_options_correctly/__driver__.lua 4cf2854af9382b276235f3e13fab78c58b8ef55f +++ tests/update_-b_foo_updates__MTN_options_correctly/__driver__.lua 4cf2854af9382b276235f3e13fab78c58b8ef55f @@ -0,0 +1,24 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +rev = base_revision() + +writefile("testfile", "other other") +commit("otherbranch") + +-- This update should fail (because not only does it have no update +-- candidate, but it's currently at an off-branch revision); and should +-- not update the _MTN/options +check(mtn("update", "-b", "testbranch"), 1, false, false) +check(qgrep("otherbranch", "_MTN/options")) +check(not qgrep("testbranch", "_MTN/options")) + +revert_to(rev, "testbranch") +check(not qgrep("otherbranch", "_MTN/options")) +check(qgrep("testbranch", "_MTN/options")) + +check(mtn("update", "-b", "otherbranch"), 0, false, false) +check(qgrep("otherbranch", "_MTN/options")) +check(not qgrep("testbranch", "_MTN/options")) ============================================================ --- tests/update_-b_switches_branches_even_when_noop/__driver__.lua ec1aa7f037d9af494dd3a084d3675eeb2462dac4 +++ tests/update_-b_switches_branches_even_when_noop/__driver__.lua ec1aa7f037d9af494dd3a084d3675eeb2462dac4 @@ -0,0 +1,19 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() + +RID1=base_revision() + +check(mtn("cert", RID1, "branch", "otherbranch"), 0, false, false) + +check(qgrep("testbranch", "_MTN/options")) +check(not qgrep("otherbranch", "_MTN/options")) + +check(mtn("update", "-b", "otherbranch"), 0, false, false) +RID2=base_revision() +check(RID1 == RID2) + +check(not qgrep("testbranch", "_MTN/options")) +check(qgrep("otherbranch", "_MTN/options")) ============================================================ --- tests/use_restrictions_with_--exclude/__driver__.lua 1c8a6a20e862a7666be68fa7c5776e1036e91e05 +++ tests/use_restrictions_with_--exclude/__driver__.lua 1c8a6a20e862a7666be68fa7c5776e1036e91e05 @@ -0,0 +1,46 @@ + +mtn_setup() + +mkdir("foo") +writefile("file1", "x") +writefile("foo/bar", "y") + +check(mtn("add", "file1"), 0, false, false) +check(mtn("add", "foo/bar"), 0, false, false) + +check(mtn("ci", "--exclude", ".", "-m", 'x'), 1, false, false) + +-- this is dumb. excluding the whole tree and including file1 is +-- equivalent to just including file1. except that at this point +-- the root dir has not been created and excluding the whole tree +-- excludes this creation. this causes the commit to fail because +-- file1 has no parent. +-- +-- check(MTN ci --exclude . file1 -m 'x', 0, false, false) +-- check(MTN status --brief | grep "foo/bar", 0, false, false) +-- check(MTN status --brief | grep "file1", 1, false, false) +-- check(echo a >>file1) + +check(mtn("ci", "--exclude", "foo", "-m", 'x'), 0, false, false) +check(mtn("status", "--brief"), 0, true) +check(qgrep("foo/bar", "stdout")) +check(not qgrep("file1", "stdout")) +append("file1", "a") + +check(mtn("ci", ".", "--exclude", "file1", "-m", 'x'), 0, false, false) +check(mtn("status", "--brief"), 0, true) +check(not qgrep("foo/bar", "stdout")) +check(qgrep("file1", "stdout")) +append("foo/bar", "b") + +check(mtn("ci", ".", "--exclude", "foo", "foo/bar", "-m", 'x'), 0, false, false) +check(mtn("status", "--brief"), 0, true) +check(not qgrep("foo/bar", "stdout")) +check(not qgrep("file1", "stdout")) +append("file1", "a") +append("foo/bar", "b") + +check(mtn("ci", "--exclude", "foo", "foo/bar", "-m", 'x'), 0, false, false) +check(mtn("status", "--brief"), 0, true) +check(not qgrep("foo/bar", "stdout")) +check(qgrep("file1", "stdout")) ============================================================ --- tests/use_restrictions_with_--exclude_and_inodeprints/__driver__.lua 5be7b8c5cc0bc2c4eb0c3de5d2432f14dd34b15f +++ tests/use_restrictions_with_--exclude_and_inodeprints/__driver__.lua 5be7b8c5cc0bc2c4eb0c3de5d2432f14dd34b15f @@ -0,0 +1,18 @@ + +mtn_setup() + +mkdir("foo") +writefile("file1", "x") +writefile("foo/bar", "y") + +check(mtn("add", "file1"), 0, false, false) +check(mtn("add", "foo/bar"), 0, false, false) +check(mtn("ci", "-m", "x"), 0, false, false) + +check(mtn("refresh_inodeprints")) +append("file1", "a") +append("foo/bar", "b") +check(mtn("ci", "--exclude", "foo", "-m", 'x'), 0, false, false) +check(mtn("status", "--brief"), 0, true) +check(qgrep("foo/bar", "stdout")) +check(not qgrep("file1", "stdout")) ============================================================ --- lua.cc 68f25f00b9c93b3d3a443c3eccc799ce8bf18712 +++ lua.cc 3d93064ec4cefc98b2af7e24bc479305bcfe2a8b @@ -108,7 +108,7 @@ void Lua::report_error() { - I(lua_isstring(st, -1)); +// I(lua_isstring(st, -1)); string err = string(lua_tostring(st, -1), lua_strlen(st, -1)); W(i18n_format("%s") % err); L(FL("lua stack: %s") % dump_stack(st)); ============================================================ --- tester-testsuite.lua efc8052e5758fde01b30095b8f38c8f7e2c4d371 +++ tester-testsuite.lua 3153cf2384274b7290226e99383378926d9f64ff @@ -1,5 +1,8 @@ +testdir = srcdir.."/tester-tests" + +table.insert(tests, "isolated-1") +table.insert(tests, "isolated-2") +table.insert(tests, "cleanup-1") +table.insert(tests, "cleanup-2") +table.insert(tests, "remove-unwriteable") -table.insert(tests, "tester-tests/isolated-1") -table.insert(tests, "tester-tests/isolated-2") -table.insert(tests, "tester-tests/cleanup-1") -table.insert(tests, "tester-tests/cleanup-2") ============================================================ --- tester.cc 545fbaad9a01df3c2ee1f7eea0e49003fd94b5e6 +++ tester.cc 81b805b2be147d30b89455b3825a65506405dfb4 @@ -110,6 +110,7 @@ } #else #include +#include namespace redirect {typedef int savetype;} int set_redirect(redirect::what what, string where) { @@ -169,7 +170,7 @@ bool ok = (stat(name.c_str(), &st) == 0); if (!ok) return false; - ok = )chmod(name.c_str(), st.st_mode | S_IREAD | S_IWRITE | S_IEXEC) == 0); + return (chmod(name.c_str(), st.st_mode | S_IREAD | S_IWRITE | S_IEXEC) == 0); } #endif namespace redirect ============================================================ --- tester.lua aab22309dc5de1e0fe9d3fb38af959db0243648c +++ tester.lua e022bef407dd27b45cd0c42fd494a7559b91971a @@ -498,6 +498,7 @@ end function post_cmd(result, ret, stdout, stderr, ident) + if ret == nil then ret = 0 end if ident == nil then ident = "ts-" end L("stdout:\n") log_file_contents(ident .. "stdout") @@ -798,11 +799,19 @@ else setfenv(driver, env) r,e = xpcall(driver, debug.traceback) - if type(env.cleanup) == "function" then - pcall(env.cleanup) + for i,b in pairs(test.bglist) do + local a,b = pcall(function () b:finish(0) end) + if r and not a then + r = a + e = b + end end - for i,b in pairs(test.bglist) do - b:finish(0) + if type(env.cleanup) == "function" then + local a,b = pcall(env.cleanup) + if r and not a then + r = a + e = b + end end restore_env() end @@ -832,6 +841,7 @@ counts.success = counts.success + 1 end else + if test.errline == nil then test.errline = -1 end if type(e) ~= "table" then local tbl = {e = e, bt = {"no backtrace; type(err) = "..type(e)}} e = tbl ============================================================ --- testsuite.at e4e7b224447c223e5e441071baba7d8360b8da1e +++ testsuite.at a03205e449eeda082023d77db7813fe8f04bb12d @@ -608,55 +608,6 @@ # include all the sub-tests we're going to use -m4_include(tests/t_ambiguous_tags.at) -m4_include(tests/t_kill_tag_locally.at) -m4_include(tests/t_restricted_diff_unchanged.at) -m4_include(tests/t_selector_globbing.at) -m4_include(tests/t_diff_external.at) -m4_include(tests/t_migrate_broken_schema.at) -m4_include(tests/t_ls_branches.at) -m4_include(tests/t_database_check_normalized.at) -m4_include(tests/t_annotate_no_rev.at) -m4_include(tests/t_merge_add_rename_add.at) -m4_include(tests/t_update_branch.at) -m4_include(tests/t_commit_cancelled.at) -m4_include(tests/t_merge_7.at) -m4_include(tests/t_commit_log_writeback.at) -m4_include(tests/t_log_brief.at) -m4_include(tests/t_explicit_merge_with_anc.at) -m4_include(tests/t_drop_execute.at) -m4_include(tests/t_rename_execute.at) -m4_include(tests/t_read_from_file.at) -m4_include(tests/t_setup_existing_path.at) -m4_include(tests/t_mtn_ignore.at) -m4_include(tests/t_automate_get_file.at) -m4_include(tests/t_automate_get_manifest_of.at) -m4_include(tests/t_automate_get_revision.at) -m4_include(tests/t_unreadable_db.at) -m4_include(tests/t_restriction_with_exclude.at) -m4_include(tests/t_restriction_with_exclude_iprint.at) -m4_include(tests/t_rename_diff_names.at) -m4_include(tests/t_key_management_without_db.at) -m4_include(tests/t_automate_keys.at) -m4_include(tests/t_diff_outside_workspace.at) -m4_include(tests/t_log_outside_workspace.at) -m4_include(tests/t_add_inside__MTN.at) -m4_include(tests/t_annotate_renames.at) -m4_include(tests/t_config_confdir.at) -m4_include(tests/t_database_sig_cleanup.at) -m4_include(tests/t_update_switch_branch.at) -m4_include(tests/t_migrate_rosterify.at) -m4_include(tests/t_rosterify_attrs.at) -m4_include(tests/t_rosterify_rename.at) -m4_include(tests/t_mixed_case_pwd.at) -m4_include(tests/t_read_privkey.at) -m4_include(tests/t_restricted_commands_consistent.at) -m4_include(tests/t_rosterify_drop_attrs.at) -m4_include(tests/t_rosterify_one_rev.at) -m4_include(tests/t_selectors_b_h.at) -m4_include(tests/t_revert_ignored.at) -m4_include(tests/t_no_persist_phrase.at) -m4_include(tests/t_check_db_format.at) m4_include(tests/t_rename_destdir.at) m4_include(tests/t_ls_changed.at) m4_include(tests/t_revert_new_project.at) ============================================================ --- testsuite.lua 1b2b288fe7a790acc82b8f3bf51b4318ac6619c5 +++ testsuite.lua 32544d62c1f438b1576810816d834daca6ec6f55 @@ -508,3 +508,53 @@ table.insert(tests, "get_netsync_read_permitted") table.insert(tests, "serve_pull_with_--exclude") table.insert(tests, "netsync,--exclude,defaults") +table.insert(tests, "ls_tags_with_ambiguous_tags") +table.insert(tests, "db_kill_tag_locally") +table.insert(tests, "diff_-rREV1_-rREV2_UNCHANGED-FILE") +table.insert(tests, "b_and_t_selector_globbing") +table.insert(tests, "diff_--external") +table.insert(tests, "db_migrate_on_bad_schema") +table.insert(tests, "list_branches") +table.insert(tests, "database_check_for_normalization") +table.insert(tests, "annotate_with_no_revs") +table.insert(tests, "merging_(add_a,_rename_a_b)_with_(add_b)") +table.insert(tests, "update_-b_foo_updates__MTN_options_correctly") +table.insert(tests, "_MTN_*_handled_correctly_in_aborted_commit") +table.insert(tests, "test_a_merge_7") +table.insert(tests, "commit_writes_message_back_to__MTN_log") +table.insert(tests, "log_--brief") +table.insert(tests, "explicit_merge_LEFT_RIGHT_ANC_BRANCH") +table.insert(tests, "drop_with_actual_removal") +table.insert(tests, "rename_with_actual_file_rename") +table.insert(tests, "mtn_read_FILE") +table.insert(tests, "setup_on_existing_path") +table.insert(tests, "things_in_.mtn-ignore_get_ignored") +table.insert(tests, "automate_get_file") +table.insert(tests, "automate_get_manifest_of") +table.insert(tests, "automate_get_revision") +table.insert(tests, "fail_cleanly_on_unreadable_db") +table.insert(tests, "use_restrictions_with_--exclude") +table.insert(tests, "use_restrictions_with_--exclude_and_inodeprints") +table.insert(tests, "filenames_in_diff_after_rename") +table.insert(tests, "key_management_without_a_database") +table.insert(tests, "automate_keys") +table.insert(tests, "diffing_a_file_within_revision_outside_a_workspace") +table.insert(tests, "logging_a_file_within_revision_outside_a_workspace") +table.insert(tests, "add_inside__MTN_") +table.insert(tests, "annotate_file_whose_name_changed") +table.insert(tests, "--confdir_option_and_get_confdir_lua_function_work") +table.insert(tests, "database_is_closed_on_signal_exit") +table.insert(tests, "update_-b_switches_branches_even_when_noop") +table.insert(tests, "migrate_with_rosterify") +table.insert(tests, "rosterify_migrates_file_dir_attrs") +table.insert(tests, "db_rosterify_preserves_renames") +table.insert(tests, "restrictions_when_pwd_is_mixed_case") +table.insert(tests, "read_and_convert_old_privkey_packet") +table.insert(tests, "restricted_commands_are_consistent") +table.insert(tests, "rosterify_--drop-attr") +table.insert(tests, "rosterify_on_a_db_with_1_rev") +table.insert(tests, "b_and_h_selectors") +table.insert(tests, "revert_ignored_files") +table.insert(tests, "disallowing_persistence_of_passphrase") +table.insert(tests, "db_data_format_checking") +table.insert(tests, "rename_files_into_a_directory")