# # # delete "tests/t_approve.at" # # delete "tests/t_automate_common_ancestors.at" # # delete "tests/t_automate_get_base_revision_id.at" # # delete "tests/t_automate_get_current_revision_id.at" # # delete "tests/t_case_insensitive__MTN.at" # # delete "tests/t_checkout_heads.at" # # delete "tests/t_cvsimport_branch.at" # # delete "tests/t_db_init_info.at" # # delete "tests/t_db_kill_rev_locally_2.at" # # delete "tests/t_disapprove_branch.at" # # delete "tests/t_escaped_selectors.at" # # delete "tests/t_executable_umask.at" # # delete "tests/t_help.at" # # delete "tests/t_hook_helpers.at" # # delete "tests/t_invalid_root.at" # # delete "tests/t_log_diffs.at" # # delete "tests/t_log_dir.at" # # delete "tests/t_log_nofiles_nomerges.at" # # delete "tests/t_log_selectors.at" # # delete "tests/t_log_to_file.at" # # delete "tests/t_ls_changed.at" # # delete "tests/t_ls_epochs.at" # # delete "tests/t_merge_binary.at" # # delete "tests/t_merge_into_dir.at" # # delete "tests/t_netsync_no_include.at" # # delete "tests/t_netsync_notes.at" # # delete "tests/t_netsync_pipe.at" # # delete "tests/t_no_log_password.at" # # delete "tests/t_pidfile.at" # # delete "tests/t_pidfile_log_permissions.at" # # delete "tests/t_pivot_root.at" # # delete "tests/t_pivot_root_revert.at" # # delete "tests/t_pivot_root_update.at" # # delete "tests/t_quiet.at" # # delete "tests/t_reallyquiet.at" # # delete "tests/t_rename_destdir.at" # # delete "tests/t_restriction_excludes_parent.at" # # delete "tests/t_revert_file_blocked_by_dir.at" # # delete "tests/t_revert_move_to_renamed_dir.at" # # delete "tests/t_revert_new_project.at" # # delete "tests/t_rosterify_empty_manifest.at" # # delete "tests/t_rosterify_mt_ignore.at" # # delete "tests/t_rosterify_on_rosterified_db.at" # # delete "tests/t_rosterify_root_suture.at" # # delete "tests/t_serve_ignores_mt_options.at" # # delete "tests/t_setup_workspace_in_workspace.at" # # delete "tests/t_show_conflicts.at" # # delete "tests/t_sink_has_extra_epochs.at" # # delete "tests/t_update_inodeprints.at" # # delete "testsuite.at" # # add_dir "tests/_MTN_case-folding_security_patch" # # add_dir "tests/automate_common_ancestors" # # add_dir "tests/automate_get_base_revision_id" # # add_dir "tests/automate_get_current_revision_id" # # add_dir "tests/branch_handling_in_disapprove" # # add_dir "tests/check_--log" # # add_dir "tests/checking_that_certain_commands_ignores_the_contents_of__MTN_options" # # add_dir "tests/checkout_fails_with_multiple_heads" # # add_dir "tests/db_info_of_new_database" # # add_dir "tests/db_kill_rev_locally_command_2" # # add_dir "tests/db_rosterify_on_a_db_with_a_root_suture" # # add_dir "tests/db_rosterify_twice_gives_an_error_second_time" # # add_dir "tests/do_not_log_the_result_of_hook_get_passphrase" # # add_dir "tests/escaped_selectors" # # add_dir "tests/exchanging_work_via_netsync,_with_notes" # # add_dir "tests/importing_cvs_branches_with_correct_ancestory" # # add_dir "tests/invalid_--root_settings" # # add_dir "tests/listing_changed_files" # # add_dir "tests/log_--diffs" # # add_dir "tests/log_--no-files_and_--merges" # # add_dir "tests/log_and_selectors_returning_multiple_rids" # # add_dir "tests/log_dir" # # add_dir "tests/ls_epochs" # # add_dir "tests/merge_a_project_into_a_subdirectory_of_an_unrelated_project" # # add_dir "tests/mtn_execute_attr_respects_umask" # # add_dir "tests/netsync_over_pipes" # # add_dir "tests/one-way_netsync_where_the_sink_has_more_epochs" # # add_dir "tests/pid_file_and_log_handles_open_failures" # # add_dir "tests/pid_file_cleanup" # # add_dir "tests/pivot_root" # # add_dir "tests/quiet_turns_off_tickers_but_not_warnings" # # add_dir "tests/reallyquiet_turns_off_tickers_and_warnings" # # add_dir "tests/restriction_excludes_parent_dir" # # add_dir "tests/revert_file_blocked_by_unversioned_directory" # # add_dir "tests/revert_file_in_new_project" # # add_dir "tests/revert_moving_a_file_to_a_renamed_directory" # # add_dir "tests/reverting_a_pivot_root" # # add_dir "tests/rosterify_handles_.mt-ignore_files" # # add_dir "tests/rosterify_on_a_db_with_an_empty_manifest" # # add_dir "tests/setup_in_subdirectory" # # add_dir "tests/show_conflicts" # # add_dir "tests/sync_server_--exclude_foo" # # add_dir "tests/test_some_hook_helper_functions" # # add_dir "tests/test_the_approve_command" # # add_dir "tests/test_the_help_command" # # add_dir "tests/updating_through_a_pivot_root" # # add_file "tests/_MTN_case-folding_security_patch/__driver__.lua" # content [fa5a8eafccfee73cd5570d08ce1be8c79598edc4] # # add_file "tests/_MTN_case-folding_security_patch/dirs.db.dumped" # content [650e5281f84011cf988fd03c332f3803ade68a37] # # add_file "tests/_MTN_case-folding_security_patch/files.db.dumped" # content [173ee8bcad6711eaa8edd76476778bda4a1e1aa0] # # add_file "tests/automate_common_ancestors/__driver__.lua" # content [160e7f614d29d06f1a49223a1448a5e427b9c6a1] # # add_file "tests/automate_get_base_revision_id/__driver__.lua" # content [a511ebdbea39db76f4f163737107f6c2af0133b6] # # add_file "tests/automate_get_current_revision_id/__driver__.lua" # content [e47ff08a045482db81b698d51752069bbffb2a56] # # add_file "tests/branch_handling_in_disapprove/__driver__.lua" # content [1533e4cebd83688f47181f642f8978a072735a23] # # add_file "tests/check_--log/__driver__.lua" # content [ab40c2b60c45d6ad8b93b59f047d144993fbd143] # # add_file "tests/checking_that_certain_commands_ignores_the_contents_of__MTN_options/__driver__.lua" # content [3a257af1220ae308c17fde97812de135b92c3d32] # # add_file "tests/checkout_fails_with_multiple_heads/__driver__.lua" # content [d21aac3328a5cdbd778233e7fd2bec37b8646070] # # add_file "tests/common/selectors.lua" # content [e5d3a4b956aa0678cd726adab3acc8ab6a6be578] # # add_file "tests/db_info_of_new_database/__driver__.lua" # content [20121e4c20a5876bce7e042c59e8f3824eb1e66c] # # add_file "tests/db_kill_rev_locally_command_2/__driver__.lua" # content [328a569a373fa17abb515aad284828a541f0273a] # # add_file "tests/db_rosterify_on_a_db_with_a_root_suture/__driver__.lua" # content [a08231bb0dc29d71df538ffe0d88947e497afea3] # # add_file "tests/db_rosterify_on_a_db_with_a_root_suture/test.db.dumped" # content [9ef65c422d4ce59c308f24c8b0114ec7d51e56fa] # # add_file "tests/db_rosterify_twice_gives_an_error_second_time/__driver__.lua" # content [2ffaa4cc771ce7d3504c52ce806dd7d41fa30b5d] # # add_file "tests/db_rosterify_twice_gives_an_error_second_time/test.db.dumped" # content [45725ca2800737426da29c847d485741ab9ecba3] # # add_file "tests/do_not_log_the_result_of_hook_get_passphrase/__driver__.lua" # content [3f69878a00280486d1122f1581736689bf505c15] # # add_file "tests/do_not_log_the_result_of_hook_get_passphrase/hook.lua" # content [34e4243946a16d6d776ee5a9db624d14ab7870b8] # # add_file "tests/escaped_selectors/__driver__.lua" # content [09f94c4bd46c11ba2f68263c92369f4e729d0c42] # # add_file "tests/exchanging_work_via_netsync,_with_notes/__driver__.lua" # content [3689c4ab690ea782b21ebc052534cebe428c135f] # # add_file "tests/exchanging_work_via_netsync,_with_notes/testnotes.test" # content [29346c085f9aeb1b1cd4f4756ef0927ca83cf617] # # add_file "tests/exchanging_work_via_netsync,_with_notes/testnotes2.test" # content [9535c4e90bbd9d7f16182ed64af26684a9a64e5e] # # add_file "tests/importing_cvs_branches_with_correct_ancestory/__driver__.lua" # content [fa31cd63b45c828bf4a6461a13d661571e6bca2a] # # add_file "tests/invalid_--root_settings/__driver__.lua" # content [26934fdd5e8c6fe71b0e8ff17750e64ee58304dc] # # add_file "tests/listing_changed_files/__driver__.lua" # content [9c8c71b62aa71fd7ef57fc655b78b281be785811] # # add_file "tests/log_--diffs/__driver__.lua" # content [e81a3d8b812cda99c84d13cdfb04dfc098d2a285] # # add_file "tests/log_--diffs/expect_full" # content [643465f483a5682c482871c2c7cffb2b7fa1d1c2] # # add_file "tests/log_--diffs/expect_restrict" # content [3c5d7b38c1a92689daea6f5c6fec4125e2cbc255] # # add_file "tests/log_--no-files_and_--merges/__driver__.lua" # content [97e503a87b53611a14dd7c89eb909da313471588] # # add_file "tests/log_and_selectors_returning_multiple_rids/__driver__.lua" # content [8a725c9ac622ec550d86cfe1e4fbd6f5d7f167e2] # # add_file "tests/log_dir/__driver__.lua" # content [36ad41079e722c42c45f34e6643799c2cc7ca751] # # add_file "tests/ls_epochs/__driver__.lua" # content [44903563c5c09b46495d1913003634b558dd7e2b] # # add_file "tests/merge_a_project_into_a_subdirectory_of_an_unrelated_project/__driver__.lua" # content [de58b432ec25caef87549001c2acfd91266eab49] # # add_file "tests/mtn_execute_attr_respects_umask/__driver__.lua" # content [6e90db48ddc768b25e87c7c12d9fdfd6c8f8be3f] # # add_file "tests/netsync_over_pipes/__driver__.lua" # content [c7ff47e60f1a2891a1b58071b208d98e21bddc29] # # add_file "tests/one-way_netsync_where_the_sink_has_more_epochs/__driver__.lua" # content [a1568c8d83ddc35101ce36a75babe23cb9597884] # # add_file "tests/pid_file_and_log_handles_open_failures/__driver__.lua" # content [3efad657fe70fa93eb9d23de7a82164e54752b0c] # # add_file "tests/pid_file_cleanup/__driver__.lua" # content [76cfad28c2ee03cfaf2c0b6f227d2e98f88f1797] # # add_file "tests/pivot_root/__driver__.lua" # content [6db1fd6434d76a4df4a2ecca9b739f0439616b7b] # # add_file "tests/quiet_turns_off_tickers_but_not_warnings/__driver__.lua" # content [71014ee89d9c0bb2e0da4fdcac979691488dccab] # # add_file "tests/reallyquiet_turns_off_tickers_and_warnings/__driver__.lua" # content [460f28ce4b648802659aae6be44412ed20b52c8b] # # add_file "tests/restriction_excludes_parent_dir/__driver__.lua" # content [ac9bfe2bc86af9d0fb04002bce621ba5d8309918] # # add_file "tests/revert_file_blocked_by_unversioned_directory/__driver__.lua" # content [2d44447cc9210396b96b166837449336da5d007c] # # add_file "tests/revert_file_in_new_project/__driver__.lua" # content [bbf5e4937c37e0d903a1678be2a446c6b2850687] # # add_file "tests/revert_moving_a_file_to_a_renamed_directory/__driver__.lua" # content [f8a5e9e2519fa8eda989d08d9c2e47dca89e36f7] # # add_file "tests/reverting_a_pivot_root/__driver__.lua" # content [d11e7f97a7d980f9443cd77a32ead852f4237ffb] # # add_file "tests/rosterify_handles_.mt-ignore_files/__driver__.lua" # content [82dc2eba7c40d3536811a444559a5085c18d0be9] # # add_file "tests/rosterify_handles_.mt-ignore_files/ignore-1.db.dump" # content [db86bca6ed016f0fc17382859f5da6970bed7b5f] # # add_file "tests/rosterify_handles_.mt-ignore_files/ignore-2.db.dump" # content [5682979900db2e2eba892259f9cf25b61545bdd8] # # add_file "tests/rosterify_on_a_db_with_an_empty_manifest/__driver__.lua" # content [37d865c3cb405c4e6167fb61540f2f5cac13fd91] # # add_file "tests/rosterify_on_a_db_with_an_empty_manifest/manifest_good" # content [ec9ef3a345b0766c1e03c47c1e22b1fe174395e7] # # add_file "tests/rosterify_on_a_db_with_an_empty_manifest/revision_good" # content [8b182249d66c7d6e0c8a04eb5de1227cdece8a1e] # # add_file "tests/rosterify_on_a_db_with_an_empty_manifest/test.db.dumped" # content [7ef471b392624689211d204a1a36caf77fb3b357] # # add_file "tests/setup_in_subdirectory/__driver__.lua" # content [5634b3a59b8c6c46bfe3d11ece82d2a856146dd5] # # add_file "tests/show_conflicts/__driver__.lua" # content [e46639299f55d6d83e9962004a89319a70d1f52e] # # add_file "tests/sync_server_--exclude_foo/__driver__.lua" # content [37cb1e68298180c666139072b024dc6722fc467d] # # add_file "tests/test_some_hook_helper_functions/__driver__.lua" # content [81fbf51b9219a9c619c44a0bc36245c86e25ed07] # # add_file "tests/test_some_hook_helper_functions/testhooks" # content [2d4a8847698e79a88670c7f293fca602ae1ac246] # # add_file "tests/test_the_approve_command/__driver__.lua" # content [3a9fb5c2a95d632689c4e29f0d0196bf4c5fcb98] # # add_file "tests/test_the_help_command/__driver__.lua" # content [5f63518108dcb12f51f0c79a0b1143ec0e67168b] # # add_file "tests/updating_through_a_pivot_root/__driver__.lua" # content [2555334a28851c69f93f7b319bc4dde71ed44903] # # patch "Makefile.am" # from [2eb7e30dace0d99e2dbd40d171fae1a1253946d6] # to [187d55bb6b310d48536a8619be534e46585a7c5d] # # patch "lua.cc" # from [3d93064ec4cefc98b2af7e24bc479305bcfe2a8b] # to [98e5a6000daf34102028fbeeca92ddcea37e4aad] # # patch "tester.cc" # from [2a01916b7886c81318ab70c0cceb8ea8aa66e7c0] # to [1ac2adebde2bcc20c59561c7da404e4c51f78b68] # # patch "tester.lua" # from [95b3e31ff1c496e153cf5fcef3ee0e4521b50242] # to [5c7149203f3d3735c07ccc7fd348672bd6a50d27] # # patch "tests/README" # from [76d708d4fb952bb644fb947d89d171f1920eb031] # to [12d9db8fcdf5969f20b31e691f4964d0329c06bd] # # patch "tests/b_and_h_selectors/__driver__.lua" # from [64d7fefa798ddb0eb652c1129c7f84d312f92258] # to [fd8e8fcdfd103194f65c97f8bc42847a17d860ee] # # patch "tests/b_and_t_selector_globbing/__driver__.lua" # from [5d742bad413d66d83a0e9cf263de8a02f8058161] # to [16b00a3f25d17dae660103fa319edb856399df4d] # # patch "tests/check_later_and_earlier_selectors/__driver__.lua" # from [2031d0dab707632b8d11460c7bde09f60df08b95] # to [f3ab1f5511f5367c72993bbff9d19d7b002b3835] # # patch "tests/test_hooks.lua" # from [ce6008e93ec7c8931517ff0173925418e4c6dd6f] # to [b4b22761bc0ad96cc8af40b8c7a74f2afa0ee2f3] # # patch "testsuite.lua" # from [1583c485e887b9b132e73086e51e3e1985539790] # to [cd8450c491bf6b6a1a0e80de26bd35674f4e2847] # ============================================================ --- tests/_MTN_case-folding_security_patch/__driver__.lua fa5a8eafccfee73cd5570d08ce1be8c79598edc4 +++ tests/_MTN_case-folding_security_patch/__driver__.lua fa5a8eafccfee73cd5570d08ce1be8c79598edc4 @@ -0,0 +1,40 @@ + +mtn_setup() + +-- The patch for this security issue is to treat all case-folded +-- versions of _MTN as being bookkeeping files (and thus illegal +-- file_paths). Make sure it's working. + +names = {"_mtn", "_mtN", "_mTn", "_Mtn", "_MTn", "_MtN", "_mTN", "_MTN"} + +-- bookkeeping files are an error for add +for _,i in pairs(names) do if not exists(i) then writefile(i) end end +for _,i in pairs(names) do + check(mtn("add", i), 1, false, false) +end +check(mtn("ls", "known"), 0) +for _,i in pairs(names) do remove(i) end + +-- run setup again, because we've removed our bookkeeping dir. +check(mtn("--branch=testbranch", "setup", ".")) + +-- files in bookkeeping dirs are also ignored by add +-- (mkdir -p used because the directories already exist on case-folding FSes) +for _,i in pairs(names) do + if not exists(i) then mkdir(i) end + writefile(i.."/foo", "") +end +for _,i in pairs(names) do + check(mtn("add", i), 1, false, false) +end +check(mtn("ls", "known"), 0) +for _,i in pairs(names) do remove(i) end + +-- assert trips if we have a db that already has a file with this sort +-- of name in it. +for _,i in {"files", "dirs"} do + get(i..".db.dumped", "stdin") + check(mtn("db", "load", "-d", i..".mtn"), 0, false, false, true) + check(mtn("db", "migrate", "-d", i..".mtn"), 0, false, false) + check(mtn("-d", i..".mtn", "co", "-b", "testbranch", i.."-co-dir"), 3, false, false) +end ============================================================ --- tests/_MTN_case-folding_security_patch/dirs.db.dumped 650e5281f84011cf988fd03c332f3803ade68a37 +++ tests/_MTN_case-folding_security_patch/dirs.db.dumped 650e5281f84011cf988fd03c332f3803ade68a37 @@ -0,0 +1,111 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- compressed rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed contents of a file + ); +INSERT INTO files VALUES('da39a3ee5e6b4b0d3255bfef95601890afd80709',X'1f8b08000000000000ff03000000000000000000'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('15'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden',X'30819d300d06092a864886f70d010101050003818b0030818702818100b9e2f563aeba98a137cf4e05a6e89a6e2fe90e11170dd8e49c06c5aae9c6f85a6de79729b056a249cb0aba71b7f28146309aaca244b3f1468b1f2c6bb6dbc02113368ce096c01f5a6083b0b0bef55d7c74573405c43203bcf6006392479cc4b8b853f4faec3acb8e444f0229428162d936ff1878e1bd5c03de816cabee1340f7020111'); +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('','14845db36e32be94d00111b1b8ce1f1c6ae31eae'); +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('56c7d5384f1b8090389b5f5b3014934ca905a4ee','14845db36e32be94d00111b1b8ce1f1c6ae31eae','branch',X'746573746272616e6368','address@hidden',X'7028744db77b8bc564ff05aba2b36e79aa499e03751dc7ff548046b49d0ef955b5392b208e215a5c022c820b56e7b262209f8d1834e46e69788243b6377c14ae832b969c63f71c29aa155ef8a9aa176e56ea5801a25a08b272519e3207759df9bb2d62ce5b889b43d0a3cba5622a06cd6e87d27231515e2ba5bcb67cf4b3ca8c'); +INSERT INTO revision_certs VALUES('d88bde33f3708976bbd1c516c6c7676ccbc76333','14845db36e32be94d00111b1b8ce1f1c6ae31eae','date',X'323030362d30332d32395430343a34353a3437','address@hidden',X'573be9fd955f979444233a691e2927c1a54d3d38d7012a117f71415d8f04dc6958e997dd125ec22999835d5001bb70f7d999b9a7712cdb97c0cab56324d7a448f5e11f36cd8c4ac759aa2770677bb984782976fd6356fb090386b3a56bdec17f5380249565772dba4790e06f822505be97d52e14d5e4fe23440bcc1d57d9ca61'); +INSERT INTO revision_certs VALUES('9a657295205c9f8dce9ba007a1b3ce3a1ec9d3f7','14845db36e32be94d00111b1b8ce1f1c6ae31eae','author',X'6e6a7340706f626f782e636f6d','address@hidden',X'370f1b82979322058ebc149a3991847174c3a0bf616651a3fa5ae6f4b8aa8cacb9806804915f23a7d23e3ae01f80497045583de7a52086b6f02de9848712693b76bd7d8d34a5cad0ee0686671a4812920025859198a327fa1d8cd25ab2046b33307904785a3f37fe7a970b75382c303200c45a4ae43c086133e9149ccd443043'); +INSERT INTO revision_certs VALUES('42d5b9a94113b93a697afacea43d47d1deaae3e7','14845db36e32be94d00111b1b8ce1f1c6ae31eae','changelog',X'666f6f','address@hidden',X'5ca711d1e9827c95dfdaf24277e225e77fbf51cbb876763645cd07bdc9ffcf58ff691be0fbb6ddd25a12226346e5f89977b97a016b334d55f010badd7a0a3c7f22b905f3caa194cc369dc805a85eaba3bd394c186180043636bbce0d5a90d3583d49ab6553dad9bd4395e8271fbd2a5d83c601e9af0ee0a5cc7ac6db599f85fa'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('14845db36e32be94d00111b1b8ce1f1c6ae31eae','782a5f0a87bd8d67777ce2e1c7608846519fbec0'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('14845db36e32be94d00111b1b8ce1f1c6ae31eae',X'1f8b08000000000000ffad91418a03211045f79e42bc4034addded219255766110abad02212a7424b97e9c3019e85e067796c57ffeffa5b2265fdd03d77b2c990b2518cbf874c9e74878affc2aad34d3341300e851a396a49665b06684a3999402d2a00d68f5c358b905b7e223be51d776e1437021ae5c34eaffd99d2e793bd7f36edeeed365bb4f3b7ddae953fde829de908bdf070f548a607c29b9626ea9821fac1f100d8ea04186e1680c1052cb25d56ca5a730cb49dabf101f503df7027572d4bae9e3a895da09d4aba3f68ddf3b7a01b5bdb495d8020000'); +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 + ); +INSERT INTO rosters VALUES('782a5f0a87bd8d67777ce2e1c7608846519fbec0',X'1f8b08000000000000ffd595416ec3201444f73e05f205ca37c6814334abeca2c802f351506bbb7251cf5fdb6151b2ab8b8a60871068f84f3363e76554beffc2e5d3cd13a9a1ae2ab22fe31652d7fbc6199cfc7eb69d68b7f83bb9422b5a6e34eb90351a656b2805000d5a0c0816864e21035478ab3e94bff7a35ade7e73e9a78afef532454a9ac7ee5f951062dd3b927a13f362e7f921810cf3e4b7e95c8d625231448e9d6e3535ace15c5bb492771484a4ca1a414f54dec2cf4898aa0c0f1d18ec0ae3d06c83e63f32f1e78809cbcac49f5332015a2c94d8286d5e28498d026b36edc9549a53c64bec149e13ca2a26a95342141fe985acf1353e554a97174a5aa7842c2e0fca53a79cb24249dc29218b0b8412778ac80b25ad5342169700e51b645f6045ab0b0000'); +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/_MTN_case-folding_security_patch/files.db.dumped 173ee8bcad6711eaa8edd76476778bda4a1e1aa0 +++ tests/_MTN_case-folding_security_patch/files.db.dumped 173ee8bcad6711eaa8edd76476778bda4a1e1aa0 @@ -0,0 +1,111 @@ +BEGIN EXCLUSIVE; +CREATE TABLE branch_epochs + ( + hash not null unique, -- hash of remaining fields separated by ":" + branch not null unique, -- joins with revision_certs.value + epoch not null -- random hex-encoded id + ); +CREATE TABLE db_vars + ( + domain not null, -- scope of application of a var + name not null, -- var key + value not null, -- var value + unique(domain, name) + ); +CREATE TABLE file_deltas + ( + id not null, -- strong hash of file contents + base not null, -- joins with files.id or file_deltas.id + delta not null, -- compressed rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed contents of a file + ); +INSERT INTO files VALUES('da39a3ee5e6b4b0d3255bfef95601890afd80709',X'1f8b08000000000000ff03000000000000000000'); +CREATE TABLE manifest_certs + ( + hash not null unique, -- hash of remaining fields separated by ":" + id not null, -- joins with manifests.id or manifest_deltas.id + name not null, -- opaque string chosen by user + value not null, -- opaque blob + keypair not null, -- joins with public_keys.id + signature not null, -- RSA/SHA1 signature of "address@hidden:val]" + unique(name, id, value, keypair, signature) + ); +CREATE TABLE manifest_deltas + ( + id not null, -- strong hash of all the entries in a manifest + base not null, -- joins with either manifest.id or manifest_deltas.id + delta not null, -- rdiff to construct current from base + unique(id, base) + ); +CREATE TABLE manifests + ( + id primary key, -- strong hash of all the entries in a manifest + data not null -- compressed, encoded contents of a manifest + ); +CREATE TABLE next_roster_node_number + ( + node primary key -- only one entry in this table, ever + ); +INSERT INTO next_roster_node_number VALUES('8'); +CREATE TABLE public_keys + ( + hash not null unique, -- hash of remaining fields separated by ":" + id primary key, -- key identifier chosen by user + keydata not null -- RSA public params + ); +INSERT INTO public_keys VALUES('de84b575d5e47254393eba49dce9dc4db98ed42d','address@hidden',X'30819d300d06092a864886f70d010101050003818b0030818702818100b9e2f563aeba98a137cf4e05a6e89a6e2fe90e11170dd8e49c06c5aae9c6f85a6de79729b056a249cb0aba71b7f28146309aaca244b3f1468b1f2c6bb6dbc02113368ce096c01f5a6083b0b0bef55d7c74573405c43203bcf6006392479cc4b8b853f4faec3acb8e444f0229428162d936ff1878e1bd5c03de816cabee1340f7020111'); +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('','df9e90b0c3804f3af7891a50efc948ca2ab5d18b'); +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('f638dca870eba57c4e0763ec1d71d149c14fc0ff','df9e90b0c3804f3af7891a50efc948ca2ab5d18b','branch',X'746573746272616e6368','address@hidden',X'55046113cae6a51c700bed6cc6d5f2566447a27e46664d0d100ecb90c55d93a8418d5b94230e131b6bda609fccec6607e06d10a6df8c365f22286bb07cc64097e7fc1a90342022a411eb7c22daebb91756bbabbbd4b02ab9279e26fb6030a3fccddc52d1871e7669312f16413376bc868fe550bc8d7c00c7305220773fe19d99'); +INSERT INTO revision_certs VALUES('ef6bcf968947f679b69f122644ce22327cf557e5','df9e90b0c3804f3af7891a50efc948ca2ab5d18b','date',X'323030362d30332d32395430343a34343a3537','address@hidden',X'2f6e4ecc38a25c75471143a247652e07c968222b1053802f705f37191940ef4adc310c8241d2bf8cd2944309560efda97c970a16b450ee4421b026b558eb747fe5feec56a98ef5d184bc416e799196c009ea8d227eadb5ca4f5fcab68c6e82909628ea4072dfbaeb45046ec0ff7ee624852c05778a883c4293b1461e6f29c9e3'); +INSERT INTO revision_certs VALUES('7f7937d757c4b98cf0e77b4c40b723a1f541ebbb','df9e90b0c3804f3af7891a50efc948ca2ab5d18b','author',X'6e6a7340706f626f782e636f6d','address@hidden',X'8611c8dd2e156f4f19471d7bb52f8ec4aa37a71683bb2dd6eaa72e806e46d264c03269e6fef74d69faaeec56452db6b0e57c0816ee377f8feda74e33fb80520ae783c1bfb02b91b0bf5f975588cf80b151cb02a4ae68a1817f50571b899bc466f8f566342f12a24de05e9516b26ed3ab9253ad110741b41896d492f78047a6d6'); +INSERT INTO revision_certs VALUES('3edd37b8b210802a3de6ff5a5a8c6c22f7dbb134','df9e90b0c3804f3af7891a50efc948ca2ab5d18b','changelog',X'666f6f','address@hidden',X'a9e0255ee299d40de7be3ab3b941257e15fb60d88ff9d0328edba02b438b6cd27e2394f987ba3737bbbb4cd7a5868a12fdb82f4043edd5aa4cdd55c7d58a5d734cd688fc9ed4f1cd84ba29f027dfafe5c2b35388656d95b476f2523c1421a9866c06a0f207d36213ce89f2ebbc93a0cd9a2990ab53b2a9d2cc923b6e906879b3'); +CREATE TABLE revision_roster + ( + rev_id primary key, -- joins with revisions.id + roster_id not null -- joins with either rosters.id or roster_deltas.id + ); +INSERT INTO revision_roster VALUES('df9e90b0c3804f3af7891a50efc948ca2ab5d18b','04a7ab1f5e2bffcb96472d30f65dacb3168341ac'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('df9e90b0c3804f3af7891a50efc948ca2ab5d18b',X'1f8b08000000000000ffad90410ac3201045f79e423c8126d138876857d98522263382100d24925ebfb6b41728eefefcc59bcf0bfb917c71171d67dc33174a3096e9e992cf31d059f8ac941d5769ba014083d16041d553ae81b437e362653fa01dd13e18db3774075df1839a6be1111dc6838b4a7de71037e2c2dda62c185ff75c28d70fe87bf03d9126b30c8bc4bed37a0914401ba92c481fd0ca51c217f883947b0b488325696ab024b570925a3849e54f272fbd97645d4c020000'); +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 + ); +INSERT INTO rosters VALUES('04a7ab1f5e2bffcb96472d30f65dacb3168341ac',X'1f8b08000000000000ffd594418e83300c45f79c22ca090c21901c6266d55d552187d86a34035469d4f3b7507a8061b289779665ebffa72ff312274cc383e23d2cb390b5ac2ab1950f5148b935c1d39cb6d93a7121a6ab387bb664c1c1a80cb4ac907b636bd4403cdad68cd8a0d3be36ee52dd305d8709e3cf5f9676154270f8252187afd3fc1623c6654eab9eb34765511169ea5cebc0ab466bc7c45677501b0bc8de400ff6f2b9b5fb68f64307acbcec1f72b36bfe3f85f49d8b822a9942b62cb4e552984ed9b2a04ba6902d0b5dc114f2fd85be640ad9b260caa1f004be33f4cdc3070000'); +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/automate_common_ancestors/__driver__.lua 160e7f614d29d06f1a49223a1448a5e427b9c6a1 +++ tests/automate_common_ancestors/__driver__.lua 160e7f614d29d06f1a49223a1448a5e427b9c6a1 @@ -0,0 +1,27 @@ + +include("common/automate_ancestry.lua") +mtn_setup() + +-- A +-- / \ +-- B C +-- |\ +-- D E +-- \/ +-- F +revs = make_graph() + +-- Now do some checks +check(mtn("automate", "common_ancestors", + "c7539264e83c5d6af4c792f079b5d46e9c128665"), 1, false, false) +check(mtn("automate", "common_ancestors", revs.a, + "c7539264e83c5d6af4c792f079b5d46e9c128665"), 1, false, false) + +revmap("common_ancestors", {revs.a}, {revs.a}) +revmap("common_ancestors", {revs.a, revs.a}, {revs.a}) +revmap("common_ancestors", {revs.a, revs.b}, {revs.a}) +revmap("common_ancestors", {revs.a, revs.f}, {revs.a}) +revmap("common_ancestors", {revs.f, revs.f}, {revs.a, revs.c, revs.d, revs.e, revs.f}) +revmap("common_ancestors", {revs.b, revs.f}, {revs.a}) +revmap("common_ancestors", {revs.f, revs.d, revs.e}, {revs.a, revs.c}) +revmap("common_ancestors", {revs.b, revs.e}, {revs.a}) ============================================================ --- tests/automate_get_base_revision_id/__driver__.lua a511ebdbea39db76f4f163737107f6c2af0133b6 +++ tests/automate_get_base_revision_id/__driver__.lua a511ebdbea39db76f4f163737107f6c2af0133b6 @@ -0,0 +1,26 @@ + +mtn_setup() + +-- note: do not compare to base_revision() here, because nothing says that +-- that can't be implemented using this + +-- check an empty base revision id + +check(mtn("automate", "get_base_revision_id"), 0, true, false) +check(trim(readfile("stdout")) == trim(readfile("_MTN/revision"))) + +addfile("foo", "this is file foo") + +-- check a non-empty base reivision id + +commit() + +check(mtn("automate", "get_base_revision_id"), 0, true, false) +check(trim(readfile("stdout")) == trim(readfile("_MTN/revision"))) + +-- check that pending changes don't affect the base revision id + +addfile("foo", "this is foo") + +check(mtn("automate", "get_base_revision_id"), 0, true, false) +check(trim(readfile("stdout")) == trim(readfile("_MTN/revision"))) ============================================================ --- tests/automate_get_current_revision_id/__driver__.lua e47ff08a045482db81b698d51752069bbffb2a56 +++ tests/automate_get_current_revision_id/__driver__.lua e47ff08a045482db81b698d51752069bbffb2a56 @@ -0,0 +1,32 @@ + +mtn_setup() + +function chk() + check(mtn("automate", "get_current_revision_id"), 0, true, false) + rename("stdout", "current") + check(mtn("automate", "get_revision"), 0, true) + check(mtn("identify"), 0, true, nil, {"stdout"}) + check(trim(readfile("current")) == trim(readfile("stdout"))) +end + +-- check an empty base revision id + +chk() + +-- check pending changes against an empty base + +addfile("foo", "this is file foo") + +chk() + +commit() + +-- check no changes against a non-empty base + +chk() + +-- check changes against a non-empty base + +addfile("bar", "this is file bar") + +chk() ============================================================ --- tests/branch_handling_in_disapprove/__driver__.lua 1533e4cebd83688f47181f642f8978a072735a23 +++ tests/branch_handling_in_disapprove/__driver__.lua 1533e4cebd83688f47181f642f8978a072735a23 @@ -0,0 +1,16 @@ + +mtn_setup() + +-- 1) if no --branch is specified, disapprove should use the branch +-- cert on the rev being disapproved. if there are multiple such +-- certs, it should fail. the working copy's branch (if any) is +-- irrelevant. +-- 2) if --branch is specified, dispprove should use the branch given, +-- and ignore the branch cert on the rev being disapproved. + +-- This test is a bug report. + +-- From reading the disapprove code; this is obviously broken. I don't +-- have time to write a real test right now. So this is a todo to even +-- write the bug report... +xfail_if(true, false) ============================================================ --- tests/check_--log/__driver__.lua ab40c2b60c45d6ad8b93b59f047d144993fbd143 +++ tests/check_--log/__driver__.lua ab40c2b60c45d6ad8b93b59f047d144993fbd143 @@ -0,0 +1,11 @@ + +mtn_setup() + +writefile("input.txt", "random content") + +check(mtn("add", "input.txt"), 0, false, false) + +check(mtn("--branch=testbranch", "--log=log.log", "commit", "-m", "test"), 0, true, false) + +check(not qgrep('^mtn:', "stdout")) +check(qgrep('^mtn:', "log.log")) ============================================================ --- tests/checking_that_certain_commands_ignores_the_contents_of__MTN_options/__driver__.lua 3a257af1220ae308c17fde97812de135b92c3d32 +++ tests/checking_that_certain_commands_ignores_the_contents_of__MTN_options/__driver__.lua 3a257af1220ae308c17fde97812de135b92c3d32 @@ -0,0 +1,20 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup() + +-- Now, commit something to transfer +writefile("testfile", "version 0 of test file") +check(mtn("add", "testfile"), 0, false, false) +commit() + +-- Hack _MTN/options +opts = readfile("_MTN/options") +writefile("_MTN/options", string.gsub(opts, 'key ".*"', 'key "address@hidden"')) +-- Double-check that _MTN/options was correctly hacked +check(not qgrep('key "address@hidden"', "_MTN/options")) +check(qgrep('key "address@hidden"', "_MTN/options")) + +srv = netsync.start("testbranch") +srv:push({"testbranch", "address@hidden"}) +srv:stop() ============================================================ --- tests/checkout_fails_with_multiple_heads/__driver__.lua d21aac3328a5cdbd778233e7fd2bec37b8646070 +++ tests/checkout_fails_with_multiple_heads/__driver__.lua d21aac3328a5cdbd778233e7fd2bec37b8646070 @@ -0,0 +1,20 @@ + +mtn_setup() + +addfile("testfile", "foo") +commit() +REV1=base_revision() + +addfile("file2", "bar") +commit() +REV2=base_revision() + +check(mtn("update", "-r", REV1), 0, false, false) +addfile("otherfile", "splork") +commit() +REV3=base_revision() + +check(mtn("--branch=testbranch", "checkout", "test_dir1"), + 1, false, true) +check(qgrep(REV2, "stderr")) +check(qgrep(REV3, "stderr")) ============================================================ --- tests/common/selectors.lua e5d3a4b956aa0678cd726adab3acc8ab6a6be578 +++ tests/common/selectors.lua e5d3a4b956aa0678cd726adab3acc8ab6a6be578 @@ -0,0 +1,5 @@ +function selmap(sel, revs, sort) + check(raw_mtn("automate", "select", sel), 0, true, false) + if sort ~= false then table.sort(revs) end + check(samelines("stdout", revs)) +end ============================================================ --- tests/db_info_of_new_database/__driver__.lua 20121e4c20a5876bce7e042c59e8f3824eb1e66c +++ tests/db_info_of_new_database/__driver__.lua 20121e4c20a5876bce7e042c59e8f3824eb1e66c @@ -0,0 +1,6 @@ + +mtn_setup() + +-- check that db info of a new database works + +check(mtn("db", "info"), 0, false, false) ============================================================ --- tests/db_kill_rev_locally_command_2/__driver__.lua 328a569a373fa17abb515aad284828a541f0273a +++ tests/db_kill_rev_locally_command_2/__driver__.lua 328a569a373fa17abb515aad284828a541f0273a @@ -0,0 +1,27 @@ + +mtn_setup() + +-- start off with three revisions +addfile("testfile", "blah blah") +commit() +anc = base_revision() + +writefile("testfile", "stuff stuff") +commit() +child1 = base_revision() + +writefile("testfile", "blahdy blah blay") +commit() +child2 = base_revision() + +-- kill head revision +check(mtn("automate", "get_revision", child2), 0, false, false) +check(mtn("db", "kill_rev_locally", child2), 0, false, false) +check(mtn("automate", "get_revision", child2), 1, false, false) +check(mtn("db", "check"), 0, false, false) + +-- head is an older revision now, let's kill that too +check(mtn("automate", "get_revision", child1), 0, false, false) +check(mtn("db", "kill_rev_locally", child1), 0, false, false) +check(mtn("automate", "get_revision", child1), 1, false, false) +check(mtn("db", "check"), 0, false, false) ============================================================ --- tests/db_rosterify_on_a_db_with_a_root_suture/__driver__.lua a08231bb0dc29d71df538ffe0d88947e497afea3 +++ tests/db_rosterify_on_a_db_with_a_root_suture/__driver__.lua a08231bb0dc29d71df538ffe0d88947e497afea3 @@ -0,0 +1,21 @@ + +mtn_setup() + +remove("test.db") + +get("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) + +found_del = false +found_add = false +check(mtn("automate", "select", "i:"), 0, true) +rename("stdout", "revs") +for r in io.lines("revs") do + check(mtn("automate", "get_revision", r), 0, true) + if qgrep('delete ""', "stdout") then found_del = true end + if qgrep('add_dir ""', "stdout") then found_add = true end +end + +check(found_del and found_add) ============================================================ --- tests/db_rosterify_on_a_db_with_a_root_suture/test.db.dumped 9ef65c422d4ce59c308f24c8b0114ec7d51e56fa +++ tests/db_rosterify_on_a_db_with_a_root_suture/test.db.dumped 9ef65c422d4ce59c308f24c8b0114ec7d51e56fa @@ -0,0 +1,207 @@ +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('f572d396fae9206628714fb2ce00f72e94f2258f','e2fb5f2139d086ded2cb600d5a91a196e76bf020','H4sIAAAAAAAA//NUMOPKSM3JyefiAgDT89fRCwAAAA== +'); +CREATE TABLE files + ( + id primary key, -- strong hash of file contents + data not null -- compressed, encoded contents of a file + ); +INSERT INTO files VALUES('e7d9b82b45d5833c9dada13f2379e7b66c823434','H4sIAAAAAAAA/0vPz09JqkzlAgBuPLJlCAAAAA== +'); +INSERT INTO files VALUES('e2fb5f2139d086ded2cb600d5a91a196e76bf020','H4sIAAAAAAAA/8vNT8lMy0xN4QIAPILo7QkAAAA= +'); +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('f4c341cfb770496ec3c12f0d22f0966d971e4997','492ff106da7726fc4e0483800102a88d322ebdce','H4sIAAAAAAAA//NUMLHgSjM1N0oxtjRLS0y1NDIwMzOyMDc0SUsySk41MEgzN0q1NEkzMjK1 +SFNQyEjNycnn4gIAisaDYzYAAAA= +'); +INSERT INTO manifest_deltas VALUES('a7496a3ec60dcb2ee3e0b5837c8856fc1793f697','492ff106da7726fc4e0483800102a88d322ebdce','H4sIAAAAAAAA/wXBuQGAMAgAwJ4pGEF5AozgGCEQy9Ru792DekFbRTqlaKkzr6hZ8+ZNbNGW +YywnFhbE95zKrwF+6tecBDgAAAA= +'); +INSERT INTO manifest_deltas VALUES('492ff106da7726fc4e0483800102a88d322ebdce','9db92b4636584742e9f25a8bad0ffafbb0367f70','H4sIAAAAAAAA/wXByxXEIAgAwLtVUIIB5FPClqECySHveU73O/MDt5YavgwXjxhGtD1mzIsK +ST11iWxDYmKA+5xYX7YaikEuNdOxi6DpxbVwZ++lmM6FOKwAnnzf09ofh6pH/mgAAAA= +'); +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('9db92b4636584742e9f25a8bad0ffafbb0367f70','H4sIAAAAAAAA/wXBwRHAIAgEwL9VWAKCopQjHiYPZ3yn++xGh/lgrw1tiCzDxCyyWbpFd9U1 +WKrUnJ974V+k4O1tcxEDDUWAlysR2rQyi2l09U1MOb9xzk0/U+0QPWIAAAA= +'); +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('','952c79269034dc8a6308aa74e1b0d5cfdc6d7477'); +INSERT INTO revision_ancestry VALUES('','d126e604ce259a08263d4cb10165c29fd63f921b'); +INSERT INTO revision_ancestry VALUES('952c79269034dc8a6308aa74e1b0d5cfdc6d7477','da971f0449b38fb90524226177d54cb72aa7faa1'); +INSERT INTO revision_ancestry VALUES('d126e604ce259a08263d4cb10165c29fd63f921b','da971f0449b38fb90524226177d54cb72aa7faa1'); +INSERT INTO revision_ancestry VALUES('da971f0449b38fb90524226177d54cb72aa7faa1','6da7f9626a3072ee58c3da98baac7c2e9eaee314'); +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('530de059cb464f7753c29b2029d84d0b1a9a6cc7','952c79269034dc8a6308aa74e1b0d5cfdc6d7477','branch','dGVzdGJyYW5jaA== +','address@hidden','eeBp92e5cEvuZF24760TR1lzzcfzfDhAT2hwjmQec/AWBORm6+7YOJrLHa+IRedtnm34vd0H +GYp7j4S+xu+71/de80RF0FNRrwzm/IpGgLTOUVoZIDeMLxZpkIKoyAJqIUxu2ZkQlfA6kcI0 +g+bGw5YDQJcgOdsxRFS2Nj9BmUs= +'); +INSERT INTO revision_certs VALUES('a629f47c5b43491b2ba2b50902d1bb34b99b05ae','952c79269034dc8a6308aa74e1b0d5cfdc6d7477','date','MjAwNi0wMi0yNVQxMTo1MDo0NQ== +','address@hidden','Hr2kprqlUhZTpbbpJ79wH9vlBk2jRrTFqeiPsNIbxvbNQTnhXqugLYw8+P5sCCJUtHLhym96 +QOHQghrlmfWPTjqnONn1gOyLaOBL2pqSvemH8EPRjmk1Ci9GSdgKry94RtE/DfCmliY4USxT +1AhIPe5MufDWZTHyKTNx7acrQvo= +'); +INSERT INTO revision_certs VALUES('7442852117b3aeace0af29b8acc47e7488e58be5','952c79269034dc8a6308aa74e1b0d5cfdc6d7477','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','RJvHpqM5U4wmw8MDF7B9l5Ftz+6wxDJaHGmU6N0kHawpUiwpsRarXvdzHiAu7GwNBJmu0Uk1 +lk8J+0uMKoOJfDSBdcQArZQXLbINsPjw4qeAluqXkRmt39t78I281Ope3Za/xGO5HkocFvW0 +q0CCtdBwx/3b0h8XUO1CseT6esc= +'); +INSERT INTO revision_certs VALUES('65d041a97684d1c669a4302d2242fb830111ad1a','952c79269034dc8a6308aa74e1b0d5cfdc6d7477','changelog','Zm9v +','address@hidden','XmvG5Kaj9GBxpom7mJyYG6YzZu+ZIfvtduhcyu1oyRVNy/IMiVCeooNWsFSllC2yNtimQihj +iAQakOCQxNNYpc2mps1bLOi+5i0wEBYpm4d0M8CtBGWcaoAkurhWDPN6Jp6gTIp/uhIY/gOz +A+ZQQWDOsLuQ0zzYK/NGnrLpGe0= +'); +INSERT INTO revision_certs VALUES('8882d2b4a351d70243e1378e7515f51aeefc35be','d126e604ce259a08263d4cb10165c29fd63f921b','branch','dGVzdGJyYW5jaA== +','address@hidden','eaR+YHwUuZDKOCj0cc8dXuJPpOGLXmEuszsxULa8kp7tDJi2YhxVVCwvkDMPycmh00NJb5ci +AKKnK+CyNyw7WuGwooZrSN0hidwzPVCEkUuWfEzlPB8HxdY/mL1dFQzl6cf1SIuSU8oKfzvC +sjC04QRj0XgzgpAvY933mplgnxE= +'); +INSERT INTO revision_certs VALUES('5708d24a4a62c219e5e2ea3904ba68cec44deb45','d126e604ce259a08263d4cb10165c29fd63f921b','date','MjAwNi0wMi0yNVQxMTo1MTowOA== +','address@hidden','MYseNgIdV62oHTVoZ+V+rfE9PJeD7QGolkXNg6j7TwcIn9QZ7L5ISbibOYVgA9X2SmZpRIEC +cklTiOokYd/G8kwf20AsmS3LgilmsKAtCAWnOlVmc7j2RnDvlaZ8rjWbWNGofPxeo5IGjgS/ +YKWKY7lkHkQdRqT0e+S7nHOH7tY= +'); +INSERT INTO revision_certs VALUES('a71569321af2865bf9c1de3b681e301b7a676b45','d126e604ce259a08263d4cb10165c29fd63f921b','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','TwIcLIuRSG0QqfNJxRk01UJwQonmTu0D7/TpUAY+yrED8XR6394gw1X8tCFo0U+rmdwZr51Y +bjhGcSJaI+PJKnjA7L3C7Y6HQtZdPUfNjdEK8MGCJkPiKTrjGtmzzMEQ6V4mKDml4llNBijz +gNMhe/g6pDpCPLefdFpjJj87i+U= +'); +INSERT INTO revision_certs VALUES('2f37a129aedf97765851417b25a5e771f798b45c','d126e604ce259a08263d4cb10165c29fd63f921b','changelog','Zm9v +','address@hidden','nXJ0z/lGXCu4LR0J5pfJnjtYFqpAqVhm6tbxIXmUglwOTfCfvK2K0796hep5UiQUazZwkhhX +bXOOGLhlPdxNM2fYQtpLqI1aniv++T9+1V4C/EbhUiB+jmd77eh3DlSm65cCWhw/RZphbmo6 +UJGKTWizQiy9sL+Dq6TvCadket0= +'); +INSERT INTO revision_certs VALUES('615be28cfcd35fc8e725e828d1aca02568804cf8','da971f0449b38fb90524226177d54cb72aa7faa1','date','MjAwNi0wMi0yNVQxMTo1MToxMg== +','address@hidden','dHEx4FwUXqnD8pSqnmKwezNuRlAxd5Qz5ZEZ1l1krQlogm4LORhXzZX41ZU/aOeSj6LSA3kt +hQEzepuiIzmcXtuhaXZzRYuENMLPheKIqcSGScQ+G0EFeoFMimuM2mQy7ESnLJlanEtjEZXB +EalVE45qBmXSoH7RsVSjOjO5zbU= +'); +INSERT INTO revision_certs VALUES('ee8582739a422322618988b4e31187564debf724','da971f0449b38fb90524226177d54cb72aa7faa1','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','Ew2BW6v7M/SRWOdU9H0QL8Bokuc1txPuppgYPSjaPqv2zB6w8sN+ThUsU/GP3SL7xwSZgx3R +eWJg1bY6NRearNgzHL1y1Y/aWVBuchi7bW0Hx+GRaaspOEmL/+S86G706wjRhzYJAu+ng0o2 +qe6kD0oZobGpsmnMZeT3a1qh/Xc= +'); +INSERT INTO revision_certs VALUES('a813d2418758abb526831fa6baa1f8766cbafa6a','da971f0449b38fb90524226177d54cb72aa7faa1','branch','dGVzdGJyYW5jaA== +','address@hidden','e8vq6KqVpk022T+2fKson6HnH66aUxj3rC8z3wqMevHCcywiLOQJ95UUGW3a1MnYXnL7D20l +AxvKbtgHhk8eveOgz2m5DchHYVzPx/pEj/0C0WupKbqa8M2MVjFkdB1m1snAha7Tb3q+8E7o +gwwRfuQ4KYoutm/M5WVfhepbrLg= +'); +INSERT INTO revision_certs VALUES('3937aced1de4481cbdc8f814e310e84dfda82d6c','da971f0449b38fb90524226177d54cb72aa7faa1','changelog','bWVyZ2Ugb2YgOTUyYzc5MjY5MDM0ZGM4YTYzMDhhYTc0ZTFiMGQ1Y2ZkYzZkNzQ3NwogICAg +IGFuZCBkMTI2ZTYwNGNlMjU5YTA4MjYzZDRjYjEwMTY1YzI5ZmQ2M2Y5MjFiCg== +','address@hidden','Z2KtNjHQc9D+bcXqs2fFMd/5f6/JA6fkMppNc/E7RRVEPEzOtAiCkqiS89KTi8aoJZ33CaIk +aQ3/moo9sTfWQnt9bQOnH0ymQpX1wuKMnAhKG7B5yo3xi8FsMMiykqYNo2Z9wK6bkrOSVvp+ +B5tV3/9yTrk7LAaZUIfYcPUn9QA= +'); +INSERT INTO revision_certs VALUES('c2184e1f49dc1b7a962218598e0087cb8b67a22a','6da7f9626a3072ee58c3da98baac7c2e9eaee314','branch','dGVzdGJyYW5jaA== +','address@hidden','Poj7YKCMU1IT98GM50QagW2SDGMjser34VwGw1KAPV9+EaBESLK8we1Jbm9oej0hAZKTVFof +IOZdO+m4WSm5l5PvF6yregLhZDehX29i1GgzdbF2wdOrqBHU1ZNmrigJKtj/N3vAwFw1VDaD +Ymet3gI1KX4Iv55XyckMNgEr1hY= +'); +INSERT INTO revision_certs VALUES('b2e0f8decb819e71a2cd97baa86882a313c668e5','6da7f9626a3072ee58c3da98baac7c2e9eaee314','date','MjAwNi0wMi0yNVQxMTo1MTo1Ng== +','address@hidden','jVvDvG10YfpoLngtTAyU/deBgb5EF7SkCSxkdganLVTCQR+AuP1wwOxa2qkEQ5+1hm9U0YW5 +dSbgA6N+ZGiuYkt5PXW4K12EYpytmQpRnUEMPtpnIpC6iSyfVP0Ea+Xa7C2p3LU0vzx6XQOb +OedzF5gz85E4pCGLJChEZBQViWw= +'); +INSERT INTO revision_certs VALUES('4ab61c613afb005fe3c89aa4510e559f56d4a9a2','6da7f9626a3072ee58c3da98baac7c2e9eaee314','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','ADsAsJsWdwfqRg/rE+goBYJY/K2sGpxXxUYZulFzCeGg2tCB7eagDkhSQ7+M2FDoYr/xW/Ll +n0UIDyK1CqN/4wHG8ol/VLrmRWUvMUWASuECdAkRlKTgosrFypW4IP+mSOE8WmivrmxqvhCC +7kmSJIWhEZ92C08sjlRhLPZQ0Pg= +'); +INSERT INTO revision_certs VALUES('228ba4a1b8a06b2c43e17a5ed1865ce44fb1b343','6da7f9626a3072ee58c3da98baac7c2e9eaee314','changelog','Zm9v +','address@hidden','UGJt2ra5+lPrVYfBhO1qoJqpdQEQRCdiKaNVqmmIZSiaFLHvol6tg2D3JoPuj4kF4deBB9dx +52r2226LNbzjqI6mnDZvOsOX0VcK8OHxitszm+pVhxCO8OvUeG3UUgOY0jMN2MEhLVa+hwd+ +SbMKSypFhllIM7mIhmzoDVp0htY= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('952c79269034dc8a6308aa74e1b0d5cfdc6d7477','H4sIAAAAAAAA/0WNQQqDMBBF9zlF8ATJGDPOWURCTGYwEE1Raa9f20W7+fDg8f7Or7DFvQif +l57Epd7ZJAuiceQ59cmCmAz3kPeZ0LIjwlmpVnM4+FnO0nY9zV/+h24h5hykVNbdyrW2TqlH +vNL6Qy1H2z6m1vpq9/eAkHvyEpnAeA8jWicLJDZGEJicAAyjzOoNukWqJLQAAAA= +'); +INSERT INTO revisions VALUES('d126e604ce259a08263d4cb10165c29fd63f921b','H4sIAAAAAAAA/02NSw6DMAwF9zmFxQkgDvmcBSGU2E4bCUgFiKq3L+2mXc7T6M0qz2mJa8my +HzBEZ4KNKGRbpqRFUNrUe3TkfW8zdS5gtsGNStWZp03Ospe6wjB++Xd0CZF5ymUWaG61cnpJ +o9QjHnT/GyBvdfnYAHBUGMRxSF4n0/NVRQocOXaYNbogLllLXqNBM6o3BAL9a7gAAAA= +'); +INSERT INTO revisions VALUES('da971f0449b38fb90524226177d54cb72aa7faa1','H4sIAAAAAAAA/2XQXWpbQQwF4Pe7iiEr0Egz0mgtxpgZ/TQGx7ckpqW77yUEUtwXgQSHw6d7 +/L68zfs14+NRTk0xswL7FEFOawFt0ACogHMMJ8RYbnHetv3ml/f4df247vdy0o4miqxAzW1M +JhhzSou6wLulG7s0kfNn7rswm1GrlksEmnIYWcUEx2Mos6vUaKpHbpvul7zeorz82Hdff+Jl +237Oh73+cyj5vr+V03krpTz2cgpxXQNX694HkalPn5USSTRkMdtAatT+83hFDoZmgV0nDGTy +ZqtC5W6o6UypWNez5yArTwpjcFsYQQHrqBYbox8PraKU/OR5jdtt/9Z8rc+W7IJOyjlDEZhx +SG250AIgBUNbIvaR5+0vM12TPdQBAAA= +'); +INSERT INTO revisions VALUES('6da7f9626a3072ee58c3da98baac7c2e9eaee314','H4sIAAAAAAAA/0WPwW3DMAwA/55CyAQUJZHSLEYQkCaJGHDsIjHa9Wv00wEOd7f7z+Ml+xr+ +OdM8TAdqpUKtV67oI7BJVzGIkFCFQhwM92k6Nnu8/Xv9rMeeZpPBOaDWoaWHDmhYESkzW6uL +MopwiOT7H/cvrAMjMpAJM1Is1aH20gEyoPRuBdHVFr+EX3Iuz3R7+rYdtynF+3ilORqjlUEh +PhCIsHOuobg4QPDVXwOx9bhPKaXzSLNjaAvMZRh0MjdclACsyciSBzmTBuB1+AsLYDh3GgEA +AA== +'); +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_rosterify_twice_gives_an_error_second_time/__driver__.lua 2ffaa4cc771ce7d3504c52ce806dd7d41fa30b5d +++ tests/db_rosterify_twice_gives_an_error_second_time/__driver__.lua 2ffaa4cc771ce7d3504c52ce806dd7d41fa30b5d @@ -0,0 +1,13 @@ + +mtn_setup() + +remove("test.db") + +get("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("db", "rosterify"), 1, false, true) +check(qgrep("already", "stderr")) ============================================================ --- tests/db_rosterify_twice_gives_an_error_second_time/test.db.dumped 45725ca2800737426da29c847d485741ab9ecba3 +++ tests/db_rosterify_twice_gives_an_error_second_time/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/do_not_log_the_result_of_hook_get_passphrase/__driver__.lua 3f69878a00280486d1122f1581736689bf505c15 +++ tests/do_not_log_the_result_of_hook_get_passphrase/__driver__.lua 3f69878a00280486d1122f1581736689bf505c15 @@ -0,0 +1,15 @@ + +mtn_setup() + +addfile("input.txt", "version 0 of the file") + +-- can't use passphrase == keyname here, because +-- it's OK for the keyname to be logged. +get("hook.lua") +pass = "xyzzypassphrasexyzzy" +check(mtn("genkey", "quux"), 0, false, false, string.rep(pass.."\n", 2)) + +check(mtn("--branch=testbranch", "--debug", "commit", "-m", "foo", + "--rcfile=hook.lua", "-k", "quux"), 0, false, true) + +check(not qgrep("xyzzypassphrasexyzzy", "stderr")) ============================================================ --- tests/do_not_log_the_result_of_hook_get_passphrase/hook.lua 34e4243946a16d6d776ee5a9db624d14ab7870b8 +++ tests/do_not_log_the_result_of_hook_get_passphrase/hook.lua 34e4243946a16d6d776ee5a9db624d14ab7870b8 @@ -0,0 +1,4 @@ +function get_passphrase(keyid) + if keyid == "quux" then return "xyzzypassphrasexyzzy" end + return keyid +end ============================================================ --- tests/escaped_selectors/__driver__.lua 09f94c4bd46c11ba2f68263c92369f4e729d0c42 +++ tests/escaped_selectors/__driver__.lua 09f94c4bd46c11ba2f68263c92369f4e729d0c42 @@ -0,0 +1,22 @@ + +include("common/selectors.lua") +mtn_setup() + +addfile("testfile", "blah blah") +commit("test/branch") +REV1=base_revision() + +writefile("testfile", "stuff stuff") +commit("test/branch") +REV2=base_revision() + +writefile("testfile", "chew chew") +commit("other/branch") +REV3=base_revision() + +selmap("b:test\\/branch", {REV1, REV2}) +selmap("b:other\\/branch", {REV3}) +selmap("b:", {REV3}) +selmap("h:test\\/branch", {REV2}) +selmap("h:other\\/branch", {REV3}) +selmap("h:", {REV3}) ============================================================ --- tests/exchanging_work_via_netsync,_with_notes/__driver__.lua 3689c4ab690ea782b21ebc052534cebe428c135f +++ tests/exchanging_work_via_netsync,_with_notes/__driver__.lua 3689c4ab690ea782b21ebc052534cebe428c135f @@ -0,0 +1,62 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup_with_notes() +revs = {} + +function noterev() + local t = {} + t.f = sha1("testfile") + t.rev = base_revision() + t.man = base_manifest() + t.date = certvalue(t.rev, "date") + table.insert(revs, t) +end + +function evaluate(filename) + local dat = readfile(filename) + dat = string.gsub(dat, "REV1", revs[1].rev) + dat = string.gsub(dat, "MAN1", revs[1].man) + dat = string.gsub(dat, "FILE1", revs[1].f) + dat = string.gsub(dat, "DATE1", revs[1].date) + dat = string.gsub(dat, "REV2", revs[2].rev) + dat = string.gsub(dat, "MAN2", revs[2].man) + dat = string.gsub(dat, "FILE2", revs[2].f) + dat = string.gsub(dat, "DATE2", revs[2].date) + writefile(filename, dat) +end + +-- Checking the effect of a new revisions +writefile("testfile", "version 0 of test file") +check(mtn("add", "testfile"), 0, false, false) +commit() +noterev() + +writefile("testfile", "version 1 of test file") +check(mtn("commit", "--message", "blah-blah"), 0, false, false) +noterev() + +netsync.pull("testbranch") + +get("testnotes.test") +evaluate("testnotes.test") +canonicalize("testnotes.log") +check(samefile("testnotes.log", "testnotes.test")) + +-- Checking the effect of a simple cert change +check(mtn("tag", revs[1].rev, "testtag"), 0, false, false) + +netsync.pull("testbranch") + +get("testnotes2.test", "testnotes.test") +evaluate("testnotes.test") +canonicalize("testnotes.log") +check(samefile("testnotes.log", "testnotes.test")) + +-- Checking that a netsync with nothing new will not trigger the +-- note_netsync hooks +remove("testnotes.log") +remove("testnotes.test") +netsync.pull("testbranch") + +check(not exists("testnotes.log")) ============================================================ --- tests/exchanging_work_via_netsync,_with_notes/testnotes.test 29346c085f9aeb1b1cd4f4756ef0927ca83cf617 +++ tests/exchanging_work_via_netsync,_with_notes/testnotes.test 29346c085f9aeb1b1cd4f4756ef0927ca83cf617 @@ -0,0 +1,49 @@ +start --------------------------------------------------- +revision: new_id = REV1 +revision: revision = format_version "1" + +new_manifest [MAN1] + +old_revision [] + +add_dir "" + +add_file "testfile" + content [FILE1] + +revision: cert.name = branch +revision: cert.value = testbranch +revision: cert.key = address@hidden +revision: cert.name = changelog +revision: cert.value = blah-blah +revision: cert.key = address@hidden +revision: cert.name = date +revision: cert.value = DATE1 +revision: cert.key = address@hidden +revision: cert.name = author +revision: cert.value = address@hidden +revision: cert.key = address@hidden +revision: new_id = REV2 +revision: revision = format_version "1" + +new_manifest [MAN2] + +old_revision [REV1] + +patch "testfile" + from [FILE1] + to [FILE2] + +revision: cert.name = branch +revision: cert.value = testbranch +revision: cert.key = address@hidden +revision: cert.name = changelog +revision: cert.value = blah-blah +revision: cert.key = address@hidden +revision: cert.name = date +revision: cert.value = DATE2 +revision: cert.key = address@hidden +revision: cert.name = author +revision: cert.value = address@hidden +revision: cert.key = address@hidden +end ----------------------------------------------------- ============================================================ --- tests/exchanging_work_via_netsync,_with_notes/testnotes2.test 9535c4e90bbd9d7f16182ed64af26684a9a64e5e +++ tests/exchanging_work_via_netsync,_with_notes/testnotes2.test 9535c4e90bbd9d7f16182ed64af26684a9a64e5e @@ -0,0 +1,6 @@ +start --------------------------------------------------- +cert: rev_id = REV1 +cert: name = tag +cert: value = testtag +cert: key = address@hidden +end ----------------------------------------------------- ============================================================ --- tests/importing_cvs_branches_with_correct_ancestory/__driver__.lua fa31cd63b45c828bf4a6461a13d661571e6bca2a +++ tests/importing_cvs_branches_with_correct_ancestory/__driver__.lua fa31cd63b45c828bf4a6461a13d661571e6bca2a @@ -0,0 +1,88 @@ + +include("common/cvs.lua") +mtn_setup() + +writefile("file1.0", "version 0 of test file1") +writefile("file1.1", "version 1 of test file1") +writefile("file1.2", "version 2 of test file1") +writefile("file2.0", "version 0 of test file2") +writefile("file2.1", "version 1 of test file2") + +writefile("changelog.0", "first changelog entry\n") + +writefile("changelog.1", "second changelog\n\n"..readfile("changelog.0")) +writefile("changelog.2", "third changelog -not on branch-\n\n"..readfile("changelog.1")) +writefile("changelog.3", "third changelog -on branch-\n\n"..readfile("changelog.1")) + +F1SHA0=sha1("file1.0") +F1SHA1=sha1("file1.1") +F1SHA2=sha1("file1.2") +F2SHA0=sha1("file2.0") +T2SHA1=sha1("file2.1") +CSHA0=sha1("changelog.0") +CSHA1=sha1("changelog.1") +CSHA2=sha1("changelog.2") +CSHA3=sha1("changelog.3") + +-- build the cvs repository + +cvs_setup() + +-- checkout the empty repository and commit some files + +check(cvs("co", "."), 0, false, false) +mkdir("testdir") +writefile("testdir/file1", readfile("file1.0")) +writefile("testdir/file2", readfile("file2.0")) +writefile("testdir/changelog", readfile("changelog.0")) +check(cvs("add", "testdir"), 0, false, false) +check(cvs("add", "testdir/file1"), 0, false, false) +check(cvs("add", "testdir/file2"), 0, false, false) +check(cvs("add", "testdir/changelog"), 0, false, false) +check(cvs("commit", "-m", 'initial import', "testdir/file1", "testdir/file2", "testdir/changelog"), 0, false, false) + +-- commit first changes +writefile("testdir/file1", readfile("file1.1")) +writefile("testdir/changelog", readfile("changelog.1")) +check(cvs("commit", "-m", 'first commit', "testdir/file1", "testdir/changelog"), 0, false, false) + +-- now we create a branch +check(indir("testdir", cvs("tag", "-b", "branched")), 0, false, false) +check(indir("testdir", cvs("up", "-r", "branched")), 0, false, false) + +-- alter the files on the branch +writefile("testdir/file2", readfile("file2.1")) +writefile("testdir/changelog", readfile("changelog.3")) +check(cvs("commit", "-m", 'commit on branch', "testdir/file2", "testdir/changelog"), 0, false, false) + +-- and create some mainline changes after the branch +check(cvs("up", "-A"), 0, false, false) +writefile("testdir/file1", readfile("file1.2")) +writefile("testdir/changelog", readfile("changelog.2")) +check(cvs("commit", "-m", 'commit on mainline after branch', "testdir/file1", "testdir/changelog"), 0, false, false) + +-- import into monotone and check presence of files +check(mtn("--branch=test", "cvs_import", cvsroot.."/testdir"), 0, false, false) + +-- check if all branches were imported +check(mtn("list", "branches"), 0, true, false) +check(samelines("stdout", {"test", "test.branched"})) + +-- checkout the imported repository into maindir and branchdir +check(mtn("checkout", "--branch=test", "maindir"), 0, false, false) +check(mtn("checkout", "--branch=test.branched", "branchdir"), 0, false, false) + +-- check for correctness of the files in the main tree +check(samefile("file1.2", "maindir/file1")) +check(samefile("file2.0", "maindir/file2")) +check(samefile("changelog.2", "maindir/changelog")) + +-- check for correctness of the files in the branch +check(samefile("file1.1", "branchdir/file1")) +check(samefile("file2.1", "branchdir/file2")) +check(samefile("changelog.3", "branchdir/changelog")) + +-- get the log of the branch to check for correct branchpoint +check(indir("branchdir", mtn("log")), 0, true, false) +check(grep("commit on branch", "stdout"), 0, false, false) +xfail_if(true, grep("initial import", "stdout"), 0, false, false) ============================================================ --- tests/invalid_--root_settings/__driver__.lua 26934fdd5e8c6fe71b0e8ff17750e64ee58304dc +++ tests/invalid_--root_settings/__driver__.lua 26934fdd5e8c6fe71b0e8ff17750e64ee58304dc @@ -0,0 +1,16 @@ + +mtn_setup() + +mkdir("foo") + +check(mtn("status"), 0, false, false) +check(mtn("status", "--root", "."), 0, false, false) + +check(indir("foo", mtn("status", "--root", "..")), 0, false, false) +check(indir("foo", mtn("status", "--root", ".")), 1, false, false) + +-- workspace outside of root +check(mtn("status", "--root", "/tmp"), 1, false, false) + +-- root below workspace +check(mtn("status", "--root", "foo"), 1, false, false) ============================================================ --- tests/listing_changed_files/__driver__.lua 9c8c71b62aa71fd7ef57fc655b78b281be785811 +++ tests/listing_changed_files/__driver__.lua 9c8c71b62aa71fd7ef57fc655b78b281be785811 @@ -0,0 +1,33 @@ + +mtn_setup() + +addfile("foo", "the foo file") +addfile("bar", "the bar file") +addfile("baz", "the baz file") +commit() + +check(mtn("ls", "changed"), 0, "") + +check(mtn("drop", "foo"), 0, false, false) +check(mtn("rename", "--execute", "bar", "bartender"), 0, false, false) +check(mtn("ls", "changed"), 0, true, 0) +check(samelines("stdout", {"bar", "foo"})) +commit() + +check(mtn("ls", "changed"), 0, "") + +writefile("baz", "the baz file, modified") +check(mtn("ls", "changed"), 0, true, 0) +check(samelines("stdout", {"baz"})) +commit() + +check(mtn("ls", "changed"), 0, "") + +addfile("piano", "earplugs") +mkdir("guitar") +check(mtn("add", "guitar"), 0, false, false) +check(mtn("ls", "changed"), 0, true, 0) +check(samelines("stdout", {"guitar", "piano"})) + +commit() +check(mtn("ls", "changed"), 0, "") ============================================================ --- tests/log_--diffs/__driver__.lua e81a3d8b812cda99c84d13cdfb04dfc098d2a285 +++ tests/log_--diffs/__driver__.lua e81a3d8b812cda99c84d13cdfb04dfc098d2a285 @@ -0,0 +1,40 @@ + +mtn_setup() + +addfile("foo", "foo\n") +addfile("bar", "bar\n") + +commit() +REV1=base_revision() + +writefile("foo", "foo changed\n") + +commit() +REV2=base_revision() + +addfile("quux", "quux\n") + +commit() +REV3=base_revision() + +writefile("foo", "foo again\n") +writefile("bar", "bar again\n") + +check(mtn("rename", "-e", "foo", "foo2"), 0, false, false) + +commit() +REV4=base_revision() + +-- without restrictions +check(mtn("log", "--diffs"), 0, true, false) +check(grep('^(---|\\+\\+\\+) ', "stdout"), 0, true, false) +rename("stdout", "full") +get("expect_full") +check(samefile("expect_full", "full")) + +-- restrict to foo2 and quux +check(mtn("log", "quux", "--diffs", "foo2"), 0, true, false) +check(grep("^(---|\\+\\+\\+) ", "stdout"), 0, true, false) +rename("stdout", "restrict") +get("expect_restrict") +check(samefile("expect_restrict", "restrict")) ============================================================ --- tests/log_--diffs/expect_full 643465f483a5682c482871c2c7cffb2b7fa1d1c2 +++ tests/log_--diffs/expect_full 643465f483a5682c482871c2c7cffb2b7fa1d1c2 @@ -0,0 +1,12 @@ +--- bar e242ed3bffccdf271b7fbaf34ed72d089537b42f ++++ bar 17ecc84b62b35bcf309c0b246cba8641426ad35d +--- foo 5527e63e7193ef5fadbc8fd40cc8092d742602e7 ++++ foo2 6d0789008812dd091f3e0c97d6606bf427cf82e4 +--- quux f3d9ae4aeea6946a8668445395ba10b7399523a0 ++++ quux f3d9ae4aeea6946a8668445395ba10b7399523a0 +--- foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ++++ foo 5527e63e7193ef5fadbc8fd40cc8092d742602e7 +--- bar e242ed3bffccdf271b7fbaf34ed72d089537b42f ++++ bar e242ed3bffccdf271b7fbaf34ed72d089537b42f +--- foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ++++ foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ============================================================ --- tests/log_--diffs/expect_restrict 3c5d7b38c1a92689daea6f5c6fec4125e2cbc255 +++ tests/log_--diffs/expect_restrict 3c5d7b38c1a92689daea6f5c6fec4125e2cbc255 @@ -0,0 +1,8 @@ +--- foo 5527e63e7193ef5fadbc8fd40cc8092d742602e7 ++++ foo2 6d0789008812dd091f3e0c97d6606bf427cf82e4 +--- quux f3d9ae4aeea6946a8668445395ba10b7399523a0 ++++ quux f3d9ae4aeea6946a8668445395ba10b7399523a0 +--- foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ++++ foo 5527e63e7193ef5fadbc8fd40cc8092d742602e7 +--- foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ++++ foo f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ============================================================ --- tests/log_--no-files_and_--merges/__driver__.lua 97e503a87b53611a14dd7c89eb909da313471588 +++ tests/log_--no-files_and_--merges/__driver__.lua 97e503a87b53611a14dd7c89eb909da313471588 @@ -0,0 +1,36 @@ + +mtn_setup() + +addfile("testfile", "blah blah") +commit() +R1=base_revision() + +-- check that changed (added) file is listed in the log output +check(mtn("log"), 0, true, false) +check(qgrep("testfile", "stdout")) + +-- and that it has been excluded by --no-files +check(mtn("log", "--no-files"), 0, true, false) +check(not qgrep("testfile", "stdout")) + +-- add create some divergence... +writefile("testfile", "stuff stuff") +commit() + +revert_to(R1) + +addfile("nufile", "moo moo") +commit() + +-- ...and now merge it cleanly +check(mtn("merge"), 0, false, false) +check(mtn("update"), 0, false, false) +R2=base_revision() + +-- check that merge is included by default +check(mtn("log"), 0, true, false) +check(qgrep("^Revision.*"..R2, "stdout")) + +-- and that it is excluded by --no-merges +check(mtn("log", "--no-merges"), 0, true, false) +check(not qgrep("^Revision.*"..R2, "stdout")) ============================================================ --- tests/log_and_selectors_returning_multiple_rids/__driver__.lua 8a725c9ac622ec550d86cfe1e4fbd6f5d7f167e2 +++ tests/log_and_selectors_returning_multiple_rids/__driver__.lua 8a725c9ac622ec550d86cfe1e4fbd6f5d7f167e2 @@ -0,0 +1,22 @@ + +mtn_setup() + +-- testcase for bug --15877 + +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", "testbranch", "--date=2005-08-16T03:16:05", "-m", "foo"), 0, false, false) +R2=base_revision() + +check(raw_mtn("--db", test.root.."/test.db", "--root", test.root, + "log", "--brief", "--revision", "d:2005-08-16"), 0, true, false) +check(qgrep(R0, "stdout")) +check(qgrep(R1, "stdout")) +check(qgrep(R2, "stdout")) ============================================================ --- tests/log_dir/__driver__.lua 36ad41079e722c42c45f34e6643799c2cc7ca751 +++ tests/log_dir/__driver__.lua 36ad41079e722c42c45f34e6643799c2cc7ca751 @@ -0,0 +1,58 @@ + +mtn_setup() +revs = {} + +addfile("foo", "foo") +addfile("bar", "bar") + +commit() +revs[1] = base_revision() + +mkdir("dir1") +mkdir("dir2") +addfile("dir1/file1", "dir1/file1") + +commit() +revs[2] = base_revision() + +addfile("dir2/file2", "dir2/file2") + +commit() +revs[3] = base_revision() + +writefile("foo", "foofoo") +writefile("bar", "barbar") +writefile("dir1/file1", "dir1/file1 asdf") +writefile("dir2/file2", "dir2/file2 asdf") + +commit() +revs[4] = base_revision() + +writefile("dir1/file1", "dir1/file1 asdf asdf") + +commit() +revs[5] = base_revision() + +writefile("dir2/file2", "dir2/file2 asdf asdf") + +commit() +revs[6] = base_revision() + +check(mtn("attr", "set", "dir2/", "myattr", "myval"), 0, false, false) +commit() +revs[7] = base_revision() + +for n,x in pairs{[""] = {0,0,0,0,0,0,0}, + ["."] = {0,0,0,0,0,0,0}, + dir1 = {1,0,1,0,0,1,1}, + dir2 = {1,1,0,0,1,0,0}} do + if n == "" then + check(mtn("log"), 0, true) + else + check(mtn("log", n), 0, true) + end + for i,v in pairs(x) do + L("Checking log of '", n, "' for revision ", i, "\n") + check((v == 0) == qgrep("^Revision: "..revs[i], "stdout")) + end +end ============================================================ --- tests/ls_epochs/__driver__.lua 44903563c5c09b46495d1913003634b558dd7e2b +++ tests/ls_epochs/__driver__.lua 44903563c5c09b46495d1913003634b558dd7e2b @@ -0,0 +1,19 @@ + +mtn_setup() + +addfile("testfile", "version 0 data") +commit() + +addfile("testfile2", "other data") +commit("otherbranch") + +check(mtn("db", "set_epoch", "testbranch", "12345"), 1, false, false) +check(mtn("db", "set_epoch", "testbranch", string.rep("a", 40)), 0, false, false) +check(mtn("db", "set_epoch", "otherbranch", string.rep("b", 40)), 0, false, false) + +check(mtn("list", "epochs"), 0, true) +check(qgrep("testbranch", "stdout")) +check(qgrep("otherbranch", "stdout")) +check(mtn("list", "epochs", "testbranch"), 0, true) +check(qgrep("testbranch", "stdout")) +check(not qgrep("otherbranch", "stdout")) ============================================================ --- tests/merge_a_project_into_a_subdirectory_of_an_unrelated_project/__driver__.lua de58b432ec25caef87549001c2acfd91266eab49 +++ tests/merge_a_project_into_a_subdirectory_of_an_unrelated_project/__driver__.lua de58b432ec25caef87549001c2acfd91266eab49 @@ -0,0 +1,23 @@ + +mtn_setup() + +copy("_MTN", "_MTN.orig") +addfile("file1", "foo") +commit("b1") + +remove("_MTN") +copy("_MTN.orig", "_MTN") +remove("file1") +addfile("file2", "bar") +mkdir("dir") +addfile("dir/quux", "baz") +commit("b2") + +check(mtn("merge_into_dir", "b1", "b2", "dir/zuul"), 0, false, false) + +check(mtn("checkout", "-b", "b2", "checkout")) +check(exists("checkout/file2")) +check(isdir("checkout/dir")) +check(exists("checkout/dir/quux")) +check(isdir("checkout/dir/zuul")) +check(exists("checkout/dir/zuul/file1")) ============================================================ --- tests/mtn_execute_attr_respects_umask/__driver__.lua 6e90db48ddc768b25e87c7c12d9fdfd6c8f8be3f +++ tests/mtn_execute_attr_respects_umask/__driver__.lua 6e90db48ddc768b25e87c7c12d9fdfd6c8f8be3f @@ -0,0 +1,37 @@ + +skip_if(ostype == "Windows") +mtn_setup() + +-- I don't know why this fails! When I set umask 077 and check out +-- this tree by hand, it works fine; when I run this test, though, then +-- for some reason the foo file is checked out with permission 600! + +addfile("foo", "blah blah") +addfile("bar", "blah blah") +check(mtn("attr", "set", "foo", "mtn:execute", "true")) +commit() +R=base_revision() + +posix_umask(077) + +-- log +L(posix_umask(077), "\n") +check(mtn("co", "-r", R, "077-co"), 0, false, false) +xfail_if(true, is_executable("077-co/foo")) +check(not is_executable("077-co/bar")) +--check(stat -c '%a' 077-co/foo, 0, [700 +--]) +--check(stat -c '%a' 077-co/bar, 0, [600 +--]) + +posix_umask(577) + +-- log +L(posix_umask(577), "\n") +check(mtn("co", "-r", R, "577-co"), 0, false, false) +check(not is_executable("577-co/foo")) +check(not is_executable("577-co/bar")) +--check(stat -c '%a' 577-co/foo, 0, [200 +--]) +--check(stat -c '%a' 577-co/bar, 0, [200 +--]) ============================================================ --- tests/netsync_over_pipes/__driver__.lua c7ff47e60f1a2891a1b58071b208d98e21bddc29 +++ tests/netsync_over_pipes/__driver__.lua c7ff47e60f1a2891a1b58071b208d98e21bddc29 @@ -0,0 +1,10 @@ + +mtn_setup() + +copy("test.db", "test2.db") + +addfile("testfile", "foo") +commit() + +check(mtn("sync", "file:test2.db", "testbranch"), 0, false, false) +check_same_db_contents("test.db", "test2.db") ============================================================ --- tests/one-way_netsync_where_the_sink_has_more_epochs/__driver__.lua a1568c8d83ddc35101ce36a75babe23cb9597884 +++ tests/one-way_netsync_where_the_sink_has_more_epochs/__driver__.lua a1568c8d83ddc35101ce36a75babe23cb9597884 @@ -0,0 +1,32 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup() + +-- If the sink has more epochs than the source (say, on branches that are +-- included in the include glob, but only exist on the sink), then the epoch +-- refiner on the source will say we have items to receive. But since we're in +-- source-only mode, we won't actually be receiving any items. So our epoch +-- refiner will forever say we have items to receive, and we don't want to hang +-- forever waiting for them. + +addfile("foo", "foo") +commit() +check(mtn("db", "set_epoch", "testbranch", string.rep("1234567890", 4))) +remove("_MTN") +check(mtn2("setup", "-b", "otherbranch", "."), 0, false, false) +writefile("bar", "bar") +check(mtn2("add", "bar"), 0, false, false) +check(mtn2("commit", "-m", "blah-blah"), 0, false, false) + +srv = netsync.start("*branch") + +-- We don't want the standard function, because we don't want to hang if it hangs. +-- srv.push("*branch") +cli = bg(mtn2("--rcfile=netsync.lua", "push", srv.address, "*branch"), 0, false, false) +check(cli:wait(20)) -- give it 20 seconds. +srv:stop() + +check(mtn("ls", "branches"), 0, true, false) +check(qgrep("testbranch", "stdout"), 0, false, false) +check(qgrep("otherbranch", "stdout"), 0, false, false) ============================================================ --- tests/pid_file_and_log_handles_open_failures/__driver__.lua 3efad657fe70fa93eb9d23de7a82164e54752b0c +++ tests/pid_file_and_log_handles_open_failures/__driver__.lua 3efad657fe70fa93eb9d23de7a82164e54752b0c @@ -0,0 +1,32 @@ + +skip_if(not existsonpath("chmod")) +mtn_setup() + +-- --log should fail if it can't open the file. +writefile("inaccessible.log", "") +check({"chmod", "000", "inaccessible.log"}) +check(mtn("--log=inaccessible.log", "status"), 1, false, false) + +-- and it should fail if the specified file is read only. +writefile("ro.log", "") +check({"chmod", "400", "ro.log"}) +check(mtn("--log=ro.log", "status"), 1, false, false) + +mkdir("noaccess") +-- skip part of the test on win32 for now as the permission restrictions +-- don't map to the NT permissions we need. +if ostype == "Windows" then + test.partial_skip = true +else + -- it should also fail if a parent directory of the file is not accessible. + check({"chmod", "100", "noaccess"}) + check(mtn("--log=noaccess/my.log", "status"), 1, false, false) + + srv = bg(mtn("serve", "--bind=127.0.0.2:55597", "testbranch", "--pid-file=noaccess/my.pid"), 1, false, false) + + check(srv:wait(5)) +end + +remove("noaccess") +remove("ro.log") +remove("inaccessible.log") ============================================================ --- tests/pid_file_cleanup/__driver__.lua 76cfad28c2ee03cfaf2c0b6f227d2e98f88f1797 +++ tests/pid_file_cleanup/__driver__.lua 76cfad28c2ee03cfaf2c0b6f227d2e98f88f1797 @@ -0,0 +1,24 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup() + +-- This test currently fails because monotone does not clean up it's pid file. +-- This happens because when the monotone server is terminated with a signal it +-- calls its signal handler which then performs a siglongjmp(). The pid file +-- is deleted in the destructor for a pid_file object, and because of the +-- siglongjmp() the destructor is never called. +-- +-- Severaly possible solutions exist: +-- - Clean up the pid file manually after handling the signal. +-- - Have the signal handler set a flag (global var or singleton) that is +-- checked periodically that triggers and exception if set instead of using +-- siglongjmp() (my favorite). +-- - Something I have not considered yet. +-- +-- -- Matthew Nicholson + +srv = netsync.start({"{*}", "--pid-file=mtn.pid"}) +check(exists("mtn.pid")) +srv:finish(0) +xfail_if(true, not exists("mtn.pid")) ============================================================ --- tests/pivot_root/__driver__.lua 6db1fd6434d76a4df4a2ecca9b739f0439616b7b +++ tests/pivot_root/__driver__.lua 6db1fd6434d76a4df4a2ecca9b739f0439616b7b @@ -0,0 +1,49 @@ + +mtn_setup() + +-- possible problems: +-- -- the new root doesn't exist +-- -- the new root is not a dir +-- -- the new root has an _MTN in it +-- -- the directory the old root is supposed to end up in doesn't exist +-- -- the directory the old root is supposed to end up in is not a directory +-- -- the directory the old root is supposed to end up in already +-- contains something with the given name +-- then make sure --execute puts things in the right place... + +mkdir("workspace") +check(indir("workspace", mtn("setup", ".", "-b", "testbranch")), 0, false, false) + +mkdir("workspace/dir1") +mkdir("workspace/dir1/dir2") +writefile("workspace/dir1/file1", "blah blah") +mkdir("workspace/dir3") +mkdir("workspace/dir3/_MTN") +check(indir("workspace", mtn("add", ".")), 0, false, false) + +check(indir("workspace", mtn("commit", "-m", "foo")), 0, false, false) + +check(indir("workspace", mtn("pivot_root", "nosuchdir", "foo")), 1, false, false) +check(indir("workspace", mtn("pivot_root", "dir1/file1", "foo")), 1, false, false) +check(indir("workspace", mtn("pivot_root", "dir3", "old_root")), 1, false, false) +check(indir("workspace", mtn("pivot_root", "dir1", "nosuchdir/old_root")), 1, false, false) +check(indir("workspace", mtn("pivot_root", "dir1", "file1/old_root")), 1, false, false) +check(indir("workspace", mtn("pivot_root", "dir1", "dir2")), 1, false, false) + +check(indir("workspace", mtn("ls", "changed")), 0) +check(indir("workspace", mtn("ls", "missing")), 0) +check(indir("workspace", mtn("ls", "unknown")), 0) + +check(indir("workspace", mtn("pivot_root", "--execute", "dir1", "old_root")), 0, false, false) + +check(isdir("workspace/_MTN")) +check(isdir("workspace/dir2")) +check(exists("workspace/file1")) +check(isdir("workspace/old_root")) +check(isdir("workspace/old_root/dir3")) +check(isdir("workspace/old_root/dir3/_MTN")) + +check(indir("workspace", mtn("ls", "missing")), 0) +check(indir("workspace", mtn("ls", "unknown")), 0) + +check(indir("workspace", mtn("commit", "-m", "foo")), 0, false, false) ============================================================ --- tests/quiet_turns_off_tickers_but_not_warnings/__driver__.lua 71014ee89d9c0bb2e0da4fdcac979691488dccab +++ tests/quiet_turns_off_tickers_but_not_warnings/__driver__.lua 71014ee89d9c0bb2e0da4fdcac979691488dccab @@ -0,0 +1,20 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup() + +addfile("input.txt", "version 0 of the file") +commit() + +-- check that tickers are quiet +srv = netsync.start("testbranch") + +check(mtn2("--rcfile=netsync.lua", "pull", srv.address, "testbranch", "--quiet"), 0, nil, true) +check(qgrep(': warning: ', "stderr")) + +srv:stop() + +-- check that warnings aren't... +-- (list keys with a pattern that doesn't match anything generates a warning) +check(mtn("--quiet", "list", "keys", "foo"), 0, false, true) +check(qgrep(': warning: ', "stderr")) ============================================================ --- tests/reallyquiet_turns_off_tickers_and_warnings/__driver__.lua 460f28ce4b648802659aae6be44412ed20b52c8b +++ tests/reallyquiet_turns_off_tickers_and_warnings/__driver__.lua 460f28ce4b648802659aae6be44412ed20b52c8b @@ -0,0 +1,18 @@ + +include("common/netsync.lua") +mtn_setup() +netsync.setup() + +addfile("input.txt", "version 0 of the file") +commit() + +-- check that tickers are quiet +srv = netsync.start("testbranch") + +check(mtn2("--rcfile=netsync.lua", "pull", srv.address, "testbranch", "--reallyquiet")) + +srv:stop() + +-- check that warnings aren't... +-- (list keys with a pattern that doesn't match anything generates a warning) +check(mtn("--reallyquiet", "list", "keys", "foo")) ============================================================ --- tests/restriction_excludes_parent_dir/__driver__.lua ac9bfe2bc86af9d0fb04002bce621ba5d8309918 +++ tests/restriction_excludes_parent_dir/__driver__.lua ac9bfe2bc86af9d0fb04002bce621ba5d8309918 @@ -0,0 +1,29 @@ + +mtn_setup() + +-- - restricting a new project excludes the root directory addition +-- - restricting to things below a newly added directory excludes the directory +-- - excluding added directories but including things they contain is bad +-- +-- we should issue a nice error indicating that such a restriction must +-- be expanded to include the containing directories. +-- we should also provide some way to include only these directories and not +-- all of their contents. +-- +-- --depth=0 should probably mean "directory without contents" rather than +-- "directory and all immediate children" + +addfile("file", "file") + +-- exclude newly added root dir but include file below it +check(mtn("st", "file"), 1, false, false) + +commit() + +mkdir("foo") + +addfile("foo/bar", "foobar") + + +-- exclude newly added foo dir but include bar below it +check(mtn("st", "foo/bar"), 1, false, false) ============================================================ --- tests/revert_file_blocked_by_unversioned_directory/__driver__.lua 2d44447cc9210396b96b166837449336da5d007c +++ tests/revert_file_blocked_by_unversioned_directory/__driver__.lua 2d44447cc9210396b96b166837449336da5d007c @@ -0,0 +1,20 @@ + +mtn_setup() + +-- this test is a bug report +-- +-- reverting a file that has been replaced by a (non-versioned) directory +-- should do something sensible. I'm not sure what that is though. +-- this is almost a working copy conflict but it seems silly that revert +-- would ever encounter a conflict. + +addfile("foo", "foo") + +commit() + +check(mtn("--execute", "mv", "foo", "bar"), 0, false, false) + +-- create directory blocking revert of foo +mkdir("foo") + +xfail_if(true, mtn("revert", "."), 0, false, false) ============================================================ --- tests/revert_file_in_new_project/__driver__.lua bbf5e4937c37e0d903a1678be2a446c6b2850687 +++ tests/revert_file_in_new_project/__driver__.lua bbf5e4937c37e0d903a1678be2a446c6b2850687 @@ -0,0 +1,21 @@ + +mtn_setup() + + +-- reverting one of one files +writefile("testfile0", "version 0 of first test file") + +check(mtn("add", "testfile0"), 0, false, false) +check(mtn("revert", "testfile0"), 0, false, false) +check(mtn("status"), 0, true, false) +check(not qgrep("testfile0", "stdout")) + + +-- reverting one of two files +writefile("testfile0", "version 0 of first test file") +writefile("testfile1", "version 0 of second test file") + +check(mtn("add", "testfile0", "testfile1"), 0, false, false) +check(mtn("revert", "testfile0"), 0, false, false) +check(mtn("status"), 0, true, false) +check(not qgrep("testfile0", "stdout")) ============================================================ --- tests/revert_moving_a_file_to_a_renamed_directory/__driver__.lua f8a5e9e2519fa8eda989d08d9c2e47dca89e36f7 +++ tests/revert_moving_a_file_to_a_renamed_directory/__driver__.lua f8a5e9e2519fa8eda989d08d9c2e47dca89e36f7 @@ -0,0 +1,13 @@ + +mtn_setup() + +addfile("file", "file") + +mkdir("dir") +check(mtn("add", "dir"), 0, false, false) + +commit() + +check(mtn("--execute", "mv", "file", "dir"), 0, false, false) +check(mtn("--execute", "mv", "dir", "foo"), 0, false, false) +check(mtn("revert", "dir"), 0, false, false) ============================================================ --- tests/reverting_a_pivot_root/__driver__.lua d11e7f97a7d980f9443cd77a32ead852f4237ffb +++ tests/reverting_a_pivot_root/__driver__.lua d11e7f97a7d980f9443cd77a32ead852f4237ffb @@ -0,0 +1,43 @@ + +mtn_setup() + +-- This test is a bug report +-- I think the problem is just generally that revert does not do a good +-- job cleaning up after renames? + +mkdir("workspace") +check(indir("workspace", mtn("setup", ".", "-b", "testbranch")), 0, false, false) + +mkdir("workspace/dir1") +mkdir("workspace/dir1/dir2") +writefile("workspace/dir1/file1", "blah blah") +mkdir("workspace/dir3") +mkdir("workspace/dir3/_MTN") +check(indir("workspace", mtn("add", ".")), 0, false, false) + +check(indir("workspace", mtn("commit", "-m", "foo")), 0, false, false) + +check(indir("workspace", mtn("pivot_root", "--execute", "dir1", "old_root")), 0, false, false) + +check(isdir("workspace/_MTN")) +check(isdir("workspace/dir2")) +check(exists("workspace/file1")) +check(isdir("workspace/old_root")) +check(isdir("workspace/old_root/dir3")) +check(isdir("workspace/old_root/dir3/_MTN")) + +check(indir("workspace", mtn("ls", "missing")), 0) +check(indir("workspace", mtn("ls", "unknown")), 0) + +check(indir("workspace", mtn("revert", ".")), 0, false, false) + +check(isdir("workspace/_MTN")) +check(isdir("workspace/dir1")) +check(isdir("workspace/dir1/dir2")) +check(exists("workspace/dir1/file1")) +check(isdir("workspace/dir3")) +check(isdir("workspace/dir3/_MTN")) + +check(indir("workspace", mtn("ls", "changed")), 0) +check(indir("workspace", mtn("ls", "missing")), 0) +xfail_if(true, indir("workspace", mtn("ls", "unknown")), 0) ============================================================ --- tests/rosterify_handles_.mt-ignore_files/__driver__.lua 82dc2eba7c40d3536811a444559a5085c18d0be9 +++ tests/rosterify_handles_.mt-ignore_files/__driver__.lua 82dc2eba7c40d3536811a444559a5085c18d0be9 @@ -0,0 +1,35 @@ + +mtn_setup() + +writefile("foo", "foo") +writefile("bar", "bar") + +-- the first db has a single rev, containing a file ".mt-ignore", with +-- contents "foo". rosterify should turn it into .mtn-ignore. + +remove("test.db") +get("ignore-1.db.dump", "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("co", "-b", "testbranch", "codir-1"), 0, false, false) +check(exists("codir-1/.mtn-ignore")) +check(trim(readfile("codir-1/.mtn-ignore")) == "foo") +check(not exists("codir-1/.mt-ignore")) + +-- the second db has a single rev, containing a file ".mt-ignore" with +-- contents "foo", and a file ".mtn-ignore" with contents "bar". +-- rosterify should leave them both alone. +remove("test.db") +get("ignore-2.db.dump", "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("co", "-b", "testbranch", "codir-2"), 0, false, false) +check(exists("codir-2/.mtn-ignore")) +check(trim(readfile("codir-2/.mtn-ignore")) == "bar") +check(exists("codir-2/.mt-ignore")) +check(trim(readfile("codir-2/.mt-ignore")) == "foo") ============================================================ --- tests/rosterify_handles_.mt-ignore_files/ignore-1.db.dump db86bca6ed016f0fc17382859f5da6970bed7b5f +++ tests/rosterify_handles_.mt-ignore_files/ignore-1.db.dump db86bca6ed016f0fc17382859f5da6970bed7b5f @@ -0,0 +1,113 @@ +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('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) + ); +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('f36c35761bda269f78541f4e9184b4f0981849f5','H4sIAAAAAAAA/0szTDFKMUqzNDJJtbQwS0y2MEtLSTNPMjZLtjRJSk5JMzZKSk1NNjRVUNDL +LdHNTM/LL0rlAgB8Lm8cNQAAAA== +'); +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('','a00bc0fd9eff0631bee6158cf26a216a62ca4630'); +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('e68de6f050e3727c86c417aac9113a013c106f87','a00bc0fd9eff0631bee6158cf26a216a62ca4630','branch','dGVzdGJyYW5jaA== +','address@hidden','QwMhcKmZBJu5gPSPth8PD+NwXPegq+5RoJvB5LQavveoILihPrTcFm6O8NXWmdXaT/4yeXQn +QPmOlr+xZ2BGg23cBXBdk37Zdg5cVHyvqiV1LcZilNkqP3QnXuPTMLEC7G/syQIj7PGgZqAe +7f26MHUy04esSCKXBuUJzpKkfk8= +'); +INSERT INTO revision_certs VALUES('f85e62031f6f3c77ad17a1e229ea550fbf275635','a00bc0fd9eff0631bee6158cf26a216a62ca4630','date','MjAwNi0wMy0yOVQwNjo0MTozMg== +','address@hidden','WhB5SBcNpXw1D73NaO5RE1rrH1beujdgxHslh7crGJGGlNF+ZaYyyrMU3IU/ZmXI7F1G/4Y/ +hG1atNyleJJV321cu1aHw+liaEbRhjOtkMkVJpIjera6Qv7oklD+J9JmzkPUyXLZKW9EPKgC +0mikscC7u7PAqjhYiPogAe/uLW4= +'); +INSERT INTO revision_certs VALUES('cd8bd8d38d82ab58e2984dc99bf099b77f89a23d','a00bc0fd9eff0631bee6158cf26a216a62ca4630','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','ucmm6o5taPlXtu+SvzaF8zrRJXK/b4sbdOedovYX/nAo4Gh3wefiFhuklGCZj6hhWi86Rgdl +oV26WmLrbKjILM3BisP/m3FQXtYgXqz7KR5YwfCT38w9G9z9a3psxVDY1z3eJxwBUPDoeY3V +8Odp6VzdUds0DeXpfltbniT/nV8= +'); +INSERT INTO revision_certs VALUES('d2f7eed8d5885d173cdf5ea5bc13c09053eb0371','a00bc0fd9eff0631bee6158cf26a216a62ca4630','changelog','Zm9v +','address@hidden','ihtldViRDcJoj+H3Gu1njVWHHdR4SecuofpqDsDUMYq5rvfD1dKRYWns/RvVAbJLL4lTqn/U +rHIf1rq6oIss+iMfOtLRIB/aFn4SLgyTwybOrEM5xR3NHl3w6Wfz/iD9nFpKKKzvdvIHwBYx +g1TEXqK4ukHozr6qTVngm4TTCIo= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('a00bc0fd9eff0631bee6158cf26a216a62ca4630','H4sIAAAAAAAA/1WOwQ7CIBBE73zFpneNUErhW5qmAXZXSVpoWqK/L3ox3mYmM7sv02vZfE5M +Z4WJexP7YTQyoFfG8WgHLVmTk1YHzTdnm3A8zEKUFZeDnulMJcM0f/3vUCt4xIXTStBdt3pJ +91wO6oTYfY2P/wz4KNtnAwC1NAqJChU71R5b46M1jDyGxuZ0iMi9CkRRNoo3ZujwV74AAAA= + +'); +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_handles_.mt-ignore_files/ignore-2.db.dump 5682979900db2e2eba892259f9cf25b61545bdd8 +++ tests/rosterify_handles_.mt-ignore_files/ignore-2.db.dump 5682979900db2e2eba892259f9cf25b61545bdd8 @@ -0,0 +1,116 @@ +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('f1d2d2f924e986ac86fdf7b36c94bcdf32beec15','H4sIAAAAAAAA/0vLz+cCAKhlMn4EAAAA +'); +INSERT INTO files VALUES('e242ed3bffccdf271b7fbaf34ed72d089537b42f','H4sIAAAAAAAA/0tKLOICAOmzogQEAAAA +'); +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('99970351c0134c8e5f1fe1a610490568dbe4497b','H4sIAAAAAAAA/zXLSwrCQBAFwL2nyAUU53VneuY46c+TLBJBvD+K4L6KLZHghNYcfYvRmTSX +HlM9kgKvirYuy+14X/fH+XzVpaCoFCfjS2DNjb5RtNKQ9zFXMVfwl87/+gAlwY5iawAAAA== + +'); +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('','b283b778201b0e861694437710832da29f94e43e'); +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('fdb2b361d1b742f3c1a2e9b6f112cfde058d13f3','b283b778201b0e861694437710832da29f94e43e','branch','dGVzdGJyYW5jaA== +','address@hidden','Mv5IBQF/GRcgOl1uRtUDQWkUKY50B9Bh6D/r5CRxZH/yiVTtrm9vDghmFfCUxdae9z4dl3fA +9V26uLAXyThqzVFvaVT5e1UnRWWUItqGo5MFLvyOIhBCVCOE42vCIoSareuxWyTEDCNFyJBi +AQV1Pv0ExSvy+3mnlmWmHtouI3s= +'); +INSERT INTO revision_certs VALUES('898971fc9a88a9b02af5f5f3232698de972faaa5','b283b778201b0e861694437710832da29f94e43e','date','MjAwNi0wMy0yOVQwNjo0MTo1NQ== +','address@hidden','mMBymfSfH+y0Ja6qBaHgWD+wCf8U/ob0i+DEipU1IFMHbN67S9FW/z3drE649u9LJ/rIG57p +ehMPS6ZMbzDof9G9i2t0Kj8CSYHDNA4QTluSIMVCDvda4cj/JJD6caiJcaLhajSBmcl9AvID +VzF61OvslyaN18SKTUgoiDFGWaU= +'); +INSERT INTO revision_certs VALUES('48c9a809224b03161c5997afb3f3d587abd07bf2','b283b778201b0e861694437710832da29f94e43e','author','bmpzQHBvYm94LmNvbQ== +','address@hidden','IYwVpgGKSrFS5JmzvgOIdQPCB8X8wZupa5dyg0Ak2hYSJQB6eEAyxDTOilKa1xvAYDTCn9EV +BcoEP6EWUAkWAHBW1UQP5zv8NCT2qq99jeb298LSbxM2TTrXVRVPX/n4a/ptH644WaHSuBPX +Xd5NMp08fwJgzzFCKqnEYbBHWWk= +'); +INSERT INTO revision_certs VALUES('cd03b4688d69a61d411c9151972376650e6004b2','b283b778201b0e861694437710832da29f94e43e','changelog','Zm9v +','address@hidden','WJp4ulmN1df78TD4A/gYx+hT4qYdfdGUZN3o/5uhmiju4kPl5GoWS10790eCM8AconzxFhcA +cqfd8Oprzqe5ikDrOX4kwNve9DyP79Gj5kD0I/DAC8zItY+vE09Pu6QqjFg+2IBtwyc6sQ6p +CQvBFHC8wG/5MvEKOgk47yhUkFQ= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('b283b778201b0e861694437710832da29f94e43e','H4sIAAAAAAAA/3WMy2rDMBBF9/4KkX2DNBq9vsUYI2lmWkEsFcc0v5+0m7SFLO/h3NP5tm65 +N+HroeaUUtDWmaqNxRrZiRE22RuNSTsfqTBiCmWZpnGhdeevdm2jq3n52c/QQ8hEq7QLq9N5 +O97aex87n/7h/uSf+agff10l+9i+W0qpY6hZDAGBJEBO0ecavZCEYn1NWCqJhcJcjVt+1/rL +HAMCky0i9XGGYEqQksUiUwDSMTkbCoIs0x3xOpIuJQEAAA== +'); +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_an_empty_manifest/__driver__.lua 37d865c3cb405c4e6167fb61540f2f5cac13fd91 +++ tests/rosterify_on_a_db_with_an_empty_manifest/__driver__.lua 37d865c3cb405c4e6167fb61540f2f5cac13fd91 @@ -0,0 +1,22 @@ + +mtn_setup() + +-- This is a db containing two revisions. The first adds a single file (afile). +-- The second revision deletes that file, leaving an empty manifest. + +remove("test.db") + +get("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", "h:testbranch"), 0, true) +rev = trim(readfile("stdout")) + +get("revision_good") +check(mtn("automate", "get_revision", rev), 0, {"revision_good"}) + +get("manifest_good") +check(mtn("automate", "get_manifest_of", rev), 0, {"manifest_good"}) ============================================================ --- tests/rosterify_on_a_db_with_an_empty_manifest/manifest_good ec9ef3a345b0766c1e03c47c1e22b1fe174395e7 +++ tests/rosterify_on_a_db_with_an_empty_manifest/manifest_good ec9ef3a345b0766c1e03c47c1e22b1fe174395e7 @@ -0,0 +1,3 @@ +format_version "1" + +dir "" ============================================================ --- tests/rosterify_on_a_db_with_an_empty_manifest/revision_good 8b182249d66c7d6e0c8a04eb5de1227cdece8a1e +++ tests/rosterify_on_a_db_with_an_empty_manifest/revision_good 8b182249d66c7d6e0c8a04eb5de1227cdece8a1e @@ -0,0 +1,7 @@ +format_version "1" + +new_manifest [ec9ef3a345b0766c1e03c47c1e22b1fe174395e7] + +old_revision [9a0e6637605966d7a125f7c8932bed02ee930207] + +delete "afile" ============================================================ --- tests/rosterify_on_a_db_with_an_empty_manifest/test.db.dumped 7ef471b392624689211d204a1a36caf77fb3b357 +++ tests/rosterify_on_a_db_with_an_empty_manifest/test.db.dumped 7ef471b392624689211d204a1a36caf77fb3b357 @@ -0,0 +1,140 @@ +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('003d0450f6f7e6db635a04d23245b68e13365463','H4sIAAAAAAAA/ysuKU1L4wIAwFrv8wYAAAA= +'); +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('03d49f88c40d4bda3646489c13a2657f799e1f69','da39a3ee5e6b4b0d3255bfef95601890afd80709','H4sIAAAAAAAA/wXBwQ3AMAgEsD9TMALNwSUrZIxEgFSp+79rb/UlZkjzsGbPYl4ijnkODI/L +VQ/AcEL19PuVyA+SDvR7NgAAAA== +'); +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('da39a3ee5e6b4b0d3255bfef95601890afd80709','H4sIAAAAAAAA/wMAAAAAAAAAAAA= +'); +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('0d607d8724f015664fa0ca0e1a282fe708f2674b','address@hidden','MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDVDpfM3J04uKiIY1O+jviCfMxZqESiJEgF +XNU3DhOey2gHcpmpjAZtz3d1S20dC0OdiRa6ZoEVo4zml/ZEHiGgvT+h7+B3WXuqOEYUDLxe +e/AzLT/E6QufH3IrXcJUKTFxXudUhjbM6g0LnmDy+rxelRR4Em5mbuhNL2JizxhZrQIBEQ=='); +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('','e5366789f0aada26d68f1506c97286ba141a6640'); +INSERT INTO revision_ancestry VALUES('e5366789f0aada26d68f1506c97286ba141a6640','6862b03affabd13cb3de75b6fb84532bde4c2981'); +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('8a80d5396d6671b353053e5de08c3259f2824b9e','e5366789f0aada26d68f1506c97286ba141a6640','branch','dGVzdGJyYW5jaA== +','address@hidden','OEQ8mMMTJtXz3yYNVGFFjg7R+WRJZMR5PgU6Slr/9QP2fYiXiAKwfKGwnzlq9lAJ7dyjF/Dl +8y7TpxSYdg2Z60g3nK97n2YJGNXoiiAchgJ3Uy9jZVAcIPb169QaMagpYQojaMPfHLnKADVm +YS6TAi/GbuzLQMNA+0H9jpkLoeI= +'); +INSERT INTO revision_certs VALUES('0af1abd088a2896fd94e16cb0836088b859a3023','e5366789f0aada26d68f1506c97286ba141a6640','date','MjAwNi0wNC0wNFQxMjoyNToxOA== +','address@hidden','nHkwIeyWZ2B5YlK1Szjjpkb/SctOzHHUj6/OXiEEEBCAQUkWF4OeiPdMNNWmSsQie+McfPqb +S/9Bl5w86iYNZ2xv5uQNEZkKwuEY8okTSnSme4dl0FAGnx23g61yGaOe3keeEsSPMGq0cwC8 +pQha66ziLUtfCbd7LIk00+NBntA= +'); +INSERT INTO revision_certs VALUES('a6b6dd1a015555e238e2186f5fe3582ac79b711c','e5366789f0aada26d68f1506c97286ba141a6640','author','TWF0dCBKb2huc3RvbiA8bWF0dEB1Y2MuYXNuLmF1Pg== +','address@hidden','MMJhrTe1joj60xTyzOSbxU6Qiv43UDy58iCbBpj3lwD49Iks85DAu5fsK3m6u7tVl+I/ln5n +JTpte7qWnBe25O9i1dmlSUq27UFPbp6NLwfb5L9IPhJiKV0i/tsFEIt8rfCiHtEyTRMVgGGW +hTRFnTrhg1nA3KVO+JhSovCsdfQ= +'); +INSERT INTO revision_certs VALUES('a6baa38826f27c2dc30c49d649f3ab8b9eddf805','e5366789f0aada26d68f1506c97286ba141a6640','changelog','YSBmaWxlLgo= +','address@hidden','GzhQub0TG2jV/iW66LNZlhfyauZAG3mqBmTKaOm1k769U5tBaVjD6wyarGA3eQK0YAiwOwGu +tjscAKruhdH+fSAbVY9XKouU19cjeg7IUxruo4cAvr0NA7E7Rz4QS5OtdJqXlRbEQpA0yTCT +2IOrKQe6wXv5rVXm2hfLWUPy2Ec= +'); +INSERT INTO revision_certs VALUES('e9b66964a4bec65462322d8fd47128f533386bb8','6862b03affabd13cb3de75b6fb84532bde4c2981','branch','dGVzdGJyYW5jaA== +','address@hidden','EHj/P1AtVIclo5/VJLPMqMQMfq2Swko/QNOdXRW/L0iW+auWrVeC2ugMIjjkJDecnLomJhb2 +OcIGI++qbvugzt8IUyR2l1nM8EBw/OUdX103wFJUM+mNlzkGLKtEilvPCZ1bk7iPtP6B4do4 +c7GR3KEHkMDcmP5kXo2NNFPTFPg= +'); +INSERT INTO revision_certs VALUES('5bdf148284bb06f9baad5088d65de7effa23a2f5','6862b03affabd13cb3de75b6fb84532bde4c2981','date','MjAwNi0wNC0wNFQxMjoyNTo0Nw== +','address@hidden','OOLmL7Clykfoo3dFWTRxGiLO1ea0IssBRP1+GfYuiPgX+Y7ie1TnGs1e/2eI0CttNyzs3FQc +UdqSZNTt7Uc2FUJnqzMaE9lc5AUd0SaEgTt/4e3JSxxjf0Wg2VCJ4NWLKnjHBmyuKgFwcKW4 +8/I2l5ovbEG02XybLc9L8XQfZyA= +'); +INSERT INTO revision_certs VALUES('a9a24227618e4583ad354254ee105a7d174477c8','6862b03affabd13cb3de75b6fb84532bde4c2981','author','TWF0dCBKb2huc3RvbiA8bWF0dEB1Y2MuYXNuLmF1Pg== +','address@hidden','0STpiJIFNnPgCoxb9nDlKC7n76LR0FDjLmpQXpUOr+7k7YxZJ1JiUjPq0XIAbyvZYDMkNAva +gKxwAR2UrCYnGRpY6r1aE80I0uHvO7UjaMiG0yLkTnhccx57HGbfwwfvC7wWymGI36fQGuTh +LqGW4/2/c7nbabvD6UrENAt2UlU= +'); +INSERT INTO revision_certs VALUES('f1095e0c955299afd6797a918932324a8fa3220a','6862b03affabd13cb3de75b6fb84532bde4c2981','changelog','cmVtb3ZlIHRoZSBvbmx5IGZpbGUK +','address@hidden','COl+0zyCLzVovWzjKGeM1h4FpIp9vT64y6ajLTJyjcrgEKjA4AH7bgmYO9xfbn3wvE0gXL66 +f+265IGYSZJvSIZmSFgh0zvcls1T4fbE2NAefGOMtOAP8l0FRX5unp2t+u/+qUuvv3Jd3bjw +O8LQ49F2xGSglB0dSTkzrpILWGA= +'); +CREATE TABLE revisions + ( + id primary key, -- SHA1(text of revision) + data not null -- compressed, encoded contents of a revision + ); +INSERT INTO revisions VALUES('e5366789f0aada26d68f1506c97286ba141a6640','H4sIAAAAAAAA/0WNQQqDMBBF9zlF8ATRmYzJWUQkOjM0oKZoaK9f7aJdfR48/tvlPW1pzypn +tYMDxqghLOgYZ05ASBji0kLqyPfaxyitUhyNKStPh7zymctuh/HL/6NLSMyT5lVsk+5pjHmm +ujx+aPUo221aa2u52lfcoXdK2gvxTOCTQ+6gQz9TkBaAPBKM5gOm8UbktAAAAA== +'); +INSERT INTO revisions VALUES('6862b03affabd13cb3de75b6fb84532bde4c2981','H4sIAAAAAAAA/0XNQQ6DMAxE0T2nQJzAIY4TnwVVyMG2FImCVFB7/UI3Xc3qz9vsMz9la27H +2U8qkSWaJaOKFTSOKVU350QQCoO4FsjAj67bV51f9m5H27d+shSJcmEHEZWRlIqHBLRwHgtV +CRiECOHx6/4gREX2UhYExXrxhISFlxCvk5Q9M1twukG11U6bva3WD3LP0H0BHEyqE74AAAA= + +'); +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_in_subdirectory/__driver__.lua 5634b3a59b8c6c46bfe3d11ece82d2a856146dd5 +++ tests/setup_in_subdirectory/__driver__.lua 5634b3a59b8c6c46bfe3d11ece82d2a856146dd5 @@ -0,0 +1,9 @@ + +mtn_setup() + +-- Set up a project +check(mtn("setup", "--branch=testbranch", "foo"), 0, false, false) + +-- Then set up another project in a subdirectory without giving a database +-- or branch. mtn SHOULD fail on this. +check(indir("foo", safe_mtn("setup", "bar")), 1, false, false) ============================================================ --- tests/show_conflicts/__driver__.lua e46639299f55d6d83e9962004a89319a70d1f52e +++ tests/show_conflicts/__driver__.lua e46639299f55d6d83e9962004a89319a70d1f52e @@ -0,0 +1,28 @@ + +mtn_setup() + +addfile("foo", "file foo\n") +addfile("bar", "file bar\n") +commit("branch") +base = base_revision() + +check(mtn("mv", "-e", "foo", "baz"), 0, false, false) +append("bar", "xxx\n") +commit("branch") +left = base_revision() + +check(mtn("update", "-r", base), 0, false, false) +check(mtn("mv", "-e", "foo", "quux"), 0, false, false) +append("bar", "yyy\n") +commit("branch") +right = base_revision() + +check(mtn("show_conflicts", left, right), 0, false, true) +rename("stderr", "conflicts") + +check(qgrep("There are 1 node_name_conflicts", "conflicts")) +check(qgrep("There are 1 file_content_conflicts", "conflicts")) +check(qgrep("There are 0 node_attr_conflicts", "conflicts")) +check(qgrep("There are 0 orphaned_node_conflicts", "conflicts")) +check(qgrep("There are 0 rename_target_conflicts", "conflicts")) +check(qgrep("There are 0 directory_loop_conflicts", "conflicts")) ============================================================ --- tests/sync_server_--exclude_foo/__driver__.lua 37cb1e68298180c666139072b024dc6722fc467d +++ tests/sync_server_--exclude_foo/__driver__.lua 37cb1e68298180c666139072b024dc6722fc467d @@ -0,0 +1,5 @@ + +mtn_setup() + +-- check that sync with no includes doesn't I() +check(mtn("sync", "127.0.0.9:65528", "--exclude=foo"), 1, false, false) ============================================================ --- tests/test_some_hook_helper_functions/__driver__.lua 81fbf51b9219a9c619c44a0bc36245c86e25ed07 +++ tests/test_some_hook_helper_functions/__driver__.lua 81fbf51b9219a9c619c44a0bc36245c86e25ed07 @@ -0,0 +1,7 @@ + +mtn_setup() + +get("testhooks") + +check(raw_mtn("--rcfile=testhooks", "ls", "unknown"), 0, false, false) +check(exists("outfile")) ============================================================ --- tests/test_some_hook_helper_functions/testhooks 2d4a8847698e79a88670c7f293fca602ae1ac246 +++ tests/test_some_hook_helper_functions/testhooks 2d4a8847698e79a88670c7f293fca602ae1ac246 @@ -0,0 +1,16 @@ +function ignore_file (name) + ok = true + + filename = write_to_temporary_file("foo") + dat = read_contents_of_file(filename, "r") + if dat ~= "foo" then ok = false end + + if globish_match("a*b", "abc") then ok = false end + if not globish_match("a*b", "acb") then ok = false end + if globish_match("a{b", "abc") ~= nil then ok = false end + + if ok then execute ("touch", "outfile") end + + ignore_file = function (name) return true end +return true +end ============================================================ --- tests/test_the_approve_command/__driver__.lua 3a9fb5c2a95d632689c4e29f0d0196bf4c5fcb98 +++ tests/test_the_approve_command/__driver__.lua 3a9fb5c2a95d632689c4e29f0d0196bf4c5fcb98 @@ -0,0 +1,10 @@ + +mtn_setup() + +addfile("foo", "bar") +commit() +key = "address@hidden" +check(mtn("genkey", key), 0, false, false, string.rep(key.."\n", 2)) +check(mtn("approve", "-k", key, base_revision()), 0, false, false) +check(mtn("ls", "certs", base_revision()), 0, true, false) +check(qgrep(key, "stdout")) ============================================================ --- tests/test_the_help_command/__driver__.lua 5f63518108dcb12f51f0c79a0b1143ec0e67168b +++ tests/test_the_help_command/__driver__.lua 5f63518108dcb12f51f0c79a0b1143ec0e67168b @@ -0,0 +1,7 @@ + +mtn_setup() + +check(mtn("help", "mv"), 2, true, 0) +rename("stdout", "out") +check(mtn("--help", "mv"), 2, true, 0) +check(samefile("stdout", "out")) ============================================================ --- tests/updating_through_a_pivot_root/__driver__.lua 2555334a28851c69f93f7b319bc4dde71ed44903 +++ tests/updating_through_a_pivot_root/__driver__.lua 2555334a28851c69f93f7b319bc4dde71ed44903 @@ -0,0 +1,39 @@ + +mtn_setup() + +mkdir("workspace") +check(indir("workspace", mtn("setup", "-b", "testbranch")), 0, false, false) + +mkdir("workspace/dir1") +writefile("workspace/old_root_file", "I'm in the root to start off with!") +writefile("workspace/dir1/new_root_file", "I'm in the subdir to start off with.") +check(indir("workspace", mtn("add", ".")), 0, false, false) +check(indir("workspace", mtn("commit", "-m", "foo")), 0, false, false) +base = indir("workspace", {base_revision})[1]() + +check(indir("workspace", mtn("pivot_root", "--execute", "dir1", "old_root")), 0, false, false) +check(indir("workspace", mtn("commit", "-m", "foo")), 0, false, false) + +check(mtn("co", "-r", base, "testspace"), 0, false, false) +writefile("new_old_root_file", "old root file modified") +writefile("new_new_root_file", "new root file modified") +writefile("new_unversioned_root_file", "newly placed in root dir, unversioned") +writefile("new_unversioned_subdir_file", "newly placed in sub dir, unversioned") +writefile("new_versioned_root_file", "newly placed in root dir, versioned") +writefile("new_versioned_subdir_file", "newly placed in sub dir, versioned") +check(copy("new_old_root_file", "testspace/old_root_file")) +check(copy("new_new_root_file", "testspace/dir1/new_root_file")) +check(copy("new_unversioned_root_file", "testspace")) +check(copy("new_unversioned_subdir_file", "testspace/dir1")) +check(copy("new_versioned_root_file", "testspace")) +check(copy("new_versioned_subdir_file", "testspace/dir1")) + +check(indir("testspace", mtn("add", "new_versioned_root_file", "dir1/new_versioned_subdir_file")), 0, false, false) +check(indir("testspace", mtn("update")), 0, false, false) + +check(samefile("new_old_root_file", "testspace/old_root/old_root_file")) +check(samefile("new_new_root_file", "testspace/new_root_file")) +check(samefile("new_unversioned_root_file", "testspace/old_root/new_unversioned_root_file")) +check(samefile("new_unversioned_subdir_file", "testspace/new_unversioned_subdir_file")) +check(samefile("new_versioned_root_file", "testspace/old_root/new_versioned_root_file")) +check(samefile("new_versioned_subdir_file", "testspace/new_versioned_subdir_file")) ============================================================ --- Makefile.am 2eb7e30dace0d99e2dbd40d171fae1a1253946d6 +++ Makefile.am 187d55bb6b310d48536a8619be534e46585a7c5d @@ -396,11 +396,8 @@ texinfo.css \ schema.sql views.sql \ std_hooks.lua test_hooks.lua tester.lua \ - testsuite.at \ - $(wildcard $(srcdir)/tests/t_*.at) \ - testsuite.lua \ - $(wildcard $(srcdir)/tests/*/*) \ - testsuite \ + testsuite.lua $(srcdir)/tests/ \ + tester-testsuite.lua $(srcdir)/tester-tests/ \ tests/atconfig.in \ tests/atlocal.in \ package.m4 \ @@ -455,15 +452,15 @@ # testsuite stuff (could this possibly be more ugly?) if BUILD_UNIT_TESTS -TESTS = unit_tests $(srcdir)/testsuite run_lua_tests +TESTS = unit_tests run_lua_tests else -TESTS = $(srcdir)/testsuite run_lua_tests +TESTS = run_lua_tests endif TESTS_ENVIRONMENT=AUTOTEST_PATH="." mostlyclean-local: - rm -rf testsuite.dir testsuite.log package_full_revision.txt + rm -rf tester_dir package_full_revision.txt DISTCLEANFILES = tests/atconfig mt-stdint.h xgettext.opts pch-build.hh.gch.dep @@ -488,11 +485,6 @@ echo 'm4_define([AT_PACKAGE_BUGREPORT], address@hidden@])'; \ } >$(srcdir)/package.m4 -$(srcdir)/testsuite: $(srcdir)/testsuite.at $(wildcard $(srcdir)/tests/t_*.at) \ - $(srcdir)/package.m4 - autom4te --language=Autotest -I $(srcdir) $< -o address@hidden - mv -f address@hidden $@ - run_lua_tests: Makefile echo '#!/bin/sh' > $@ ; \ echo 'PATH=$(top_builddir):$$PATH' >> $@ ; \ ============================================================ --- lua.cc 3d93064ec4cefc98b2af7e24bc479305bcfe2a8b +++ lua.cc 98e5a6000daf34102028fbeeca92ddcea37e4aad @@ -715,7 +715,7 @@ catch (informative_failure & e) {// there was a syntax error in our string lua_pushnil(L); - return 0; + return 1; } lua_newtable(L); int n = 1; ============================================================ --- tester.cc 2a01916b7886c81318ab70c0cceb8ea8aa66e7c0 +++ tester.cc 1ac2adebde2bcc20c59561c7da404e4c51f78b68 @@ -256,12 +256,17 @@ fs::remove(rem); } -void do_copy_recursive(fs::path const &from, fs::path const &to) +void do_copy_recursive(fs::path const &from, fs::path to) { if (!fs::exists(from)) throw fs::filesystem_error("Source for copy does not exist", from, 0); if (fs::exists(to)) - do_remove_recursive(to); + { + if (fs::is_directory(to)) + to = to / from.leaf(); + else + do_remove_recursive(to); + } if (fs::is_directory(from)) { fs::create_directory(to); @@ -275,6 +280,22 @@ extern "C" { static int + posix_umask(lua_State * L) + { +#ifdef WIN32 + lua_pushnil(L); + return 1; +#else + int from = luaL_checknumber(L, -1); + mode_t mask = 64*((from / 100) % 10) + 8*((from / 10) % 10) + (from % 10); + mode_t oldmask = umask(mask); + int res = 100*(oldmask/64) + 10*((oldmask/8) % 8) + (oldmask % 8); + lua_pushnumber(L, res); + return 1; +#endif + } + + static int go_to_test_dir(lua_State * L) { char const * testname = luaL_checkstring(L, -1); @@ -298,7 +319,7 @@ dir = fs::current_path() / dir; if (!fs::exists(dir) || !fs::is_directory(dir)) { - lua_pushboolean(L, false); + lua_pushnil(L); return 1; } go_to_workspace(dir.native_file_string()); @@ -574,6 +595,8 @@ lua_register(st, "restore_env", do_restore_env); lua_register(st, "set_env", do_set_env); lua_register(st, "timed_wait", timed_wait); + + lua_register(st, "posix_umask", posix_umask); lua_pushstring(st, "initial_dir"); lua_pushstring(st, firstdir.c_str()); ============================================================ --- tester.lua 95b3e31ff1c496e153cf5fcef3ee0e4521b50242 +++ tester.lua 5c7149203f3d3735c07ccc7fd348672bd6a50d27 @@ -150,6 +150,10 @@ return readfile_q(filename) end +function readstdfile(filename) + return readfile(testdir.."/"..filename) +end + function writefile_q(filename, dat) local file,e if dat == nil then @@ -574,7 +578,7 @@ if pid == -1 then err("Failed to start background process\n", 2) end out.pid = pid test.bglist[test.bgid] = out - out.id = bgid + out.id = test.bgid out.retval = nil out.locstr = locheader() out.cmd = torun @@ -601,9 +605,9 @@ end end - table.remove(test.bglist, obj.id) + test.bglist[obj.id] = nil L(locheader(), "checking background command from ", out.locstr, - table.concat(out.cmd, " ")) + table.concat(out.cmd, " "), "\n") post_cmd(obj.retval, out.expret, out.expout, out.experr, obj.prefix) return true end @@ -619,7 +623,7 @@ return false end end - table.remove(test.bglist, obj.id) + test.bglist[obj.id] = nil L(locheader(), "checking background command from ", out.locstr, table.concat(out.cmd, " "), "\n") post_cmd(obj.retval, out.expret, out.expout, out.experr, obj.prefix) @@ -645,6 +649,9 @@ end local function do_indir() local savedir = chdir(dir) + if savedir == nil then + err("Cannot chdir to "..dir) + end local ok, res if type(what[1]) == "function" then ok, res = pcall(unpack(what)) @@ -757,6 +764,8 @@ counts.noxfail = 0 counts.fail = 0 counts.total = 0 + counts.of_interest = 0 + local of_interest = {} local function runtest(i, tname) local env = {} @@ -781,12 +790,16 @@ test.errline = -1 test.bglist = {} - if i < 100 then P(" ") end - if i < 10 then P(" ") end - P(i, " ", shortname, " ") + local test_header = "" + if i < 100 then test_header = test_header .. " " end + if i < 10 then test_header = test_header .. " " end + test_header = test_header .. i .. " " .. shortname .. " " local spacelen = 45 - string.len(shortname) local spaces = string.rep(" ", 50) - if spacelen > 0 then P(string.sub(spaces, 1, spacelen)) end + if spacelen > 0 then + test_header = test_header .. string.sub(spaces, 1, spacelen) + end + P(test_header) local tlog = test.root .. "/tester.log" test.log = io.open(tlog, "w") @@ -800,12 +813,17 @@ e = "Could not load driver file " .. driverfile .. " .\n" .. e else setfenv(driver, env) + local oldmask = posix_umask(0) + posix_umask(oldmask) r,e = xpcall(driver, debug.traceback) + local errline = test.errline for i,b in pairs(test.bglist) do - local a,b = pcall(function () b:finish(0) end) + local a,x = pcall(function () b:finish(0) end) if r and not a then r = a - e = b + e = x + elseif not a then + L("Error cleaning up background processes: ", tostring(b.locstr), "\n") end end if type(env.cleanup) == "function" then @@ -815,7 +833,9 @@ e = b end end + test.errline = errline restore_env() + posix_umask(oldmask) end -- set our functions back to the proper environment @@ -832,6 +852,8 @@ test.log:close() leave_test_dir() counts.noxfail = counts.noxfail + 1 + counts.of_interest = counts.of_interest + 1 + table.insert(of_interest, test_header .. "unexpected success") else if test.partial_skip then P("partial skip\n") @@ -859,12 +881,15 @@ leave_test_dir() counts.xfail = counts.xfail + 1 else - P(string.format("FAIL (line %i)\n", test.errline)) + result = string.format("FAIL (line %i)", test.errline) + P(result, "\n") log_error(e) table.insert(failed_testlogs, tlog) test.log:close() leave_test_dir() counts.fail = counts.fail + 1 + counts.of_interest = counts.of_interest + 1 + table.insert(of_interest, test_header .. result) end end counts.total = counts.total + 1 @@ -900,6 +925,12 @@ return 0 end + if counts.of_interest ~= 0 and (counts.total / counts.of_interest) > 4 then + P("\nInteresting tests:\n") + for i,x in ipairs(of_interest) do + P(x, "\n") + end + end P("\n") P(string.format("Of %i tests run:\n", counts.total)) P(string.format("\t%i succeeded\n", counts.success)) ============================================================ --- tests/README 76d708d4fb952bb644fb947d89d171f1920eb031 +++ tests/README 12d9db8fcdf5969f20b31e691f4964d0329c06bd @@ -7,44 +7,35 @@ Running tests: -------------- - Starting in the monotone main dir. After having './configure'd monotone you - can do 'make testsuite' to create 'testsuite'. Running './testsuite' will - run all tests. -- 'testsuite -l' lists the names and numbers of all available tests -- 'testsuite ' runs only test number n -- option -v will show the command outputs -- option -d will keep the testsuite.dir files for post-test debugging + can do 'make tester' to create 'tester', the program that runs the tests. + Running './testsuite.lua' (or './tester testsuite.lua') will run all tests. +- 'testsuite.lua -l' lists the names and numbers of all available tests +- 'testsuite.lua ' runs only test number n, negative n counts from the end +- 'testsuite.lua foobar' runs tests with "foobar" in the name + (it's actually a regex) +- option -d will keep the tester_dir files for post-test debugging - option -h is your friend :) Creating tests: --------------- - Copy and paste is your friend :) +- Make a new directory tests/ +- Add a line for at the end of testsuite.lua - TODO: need more here... -- Remember to add a line at the end of testsuite.at -- Use CANONICALISE(file) or CHECK_SAME_CANONICALISED_STDOUT(file, cmd) so that - EOLs are handled correctly (think CR+LF on Win32) +- Sometimes you need to canonicalize things -Template for a test (name tests/t_.at: +Template for a test (name tests//__driver__.lua: ------------------------------------------------ -AT_SETUP([brief test description goes here]) -MTN_SETUP -#the next lines (including AT_XFAIL_IF) state that the test is -#expected to fail as this is still a bug. Remove if it should pass! -# This test is a bug report. It is expected to fail -AT_XFAIL_IF(true) +-- Initialize our workspace +mtn_setup() -#AT_CHECK executes a shell command, second argument is the error -#return code we expect, third argument is the output we expect from -#stdout. use ignore if you don't care about the output. If oyu use -#stdout all following commands can use file 'stdout' for further -#processing. Same goes with 'stderr' as the last argument -#see autoconf tutorials -#e.g. http://www.gnu.org/software/autoconf/manual/autoconf-2.57/ -# html_node/autoconf_167.html for further information. -AT_CHECK(MTN import foo, [], ignore, ignore) -... -... -... -AT_CLEANUP -(END) +-- run monotone +-- we want return value 0 +-- we want to save the standard output in file "stdout" +-- we want to ignore the standard error +check(mtn("ls", "unknown"), 0, true, false) +-- we want "mtn foobar" to work, but since we know it doesn't +-- we tell the test program that this is expected to fail +xfail_if(true, mtn("foobar"), 0) ============================================================ --- tests/b_and_h_selectors/__driver__.lua 64d7fefa798ddb0eb652c1129c7f84d312f92258 +++ tests/b_and_h_selectors/__driver__.lua fd8e8fcdfd103194f65c97f8bc42847a17d860ee @@ -1,4 +1,5 @@ +include("common/selectors.lua") mtn_setup() addfile("testfile", "blah blah") @@ -13,12 +14,6 @@ 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}) ============================================================ --- tests/b_and_t_selector_globbing/__driver__.lua 5d742bad413d66d83a0e9cf263de8a02f8058161 +++ tests/b_and_t_selector_globbing/__driver__.lua 16b00a3f25d17dae660103fa319edb856399df4d @@ -1,4 +1,5 @@ +include("common/selectors.lua") mtn_setup() addfile("testfile", "blah blah") @@ -16,12 +17,6 @@ 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}) ============================================================ --- tests/check_later_and_earlier_selectors/__driver__.lua 2031d0dab707632b8d11460c7bde09f60df08b95 +++ tests/check_later_and_earlier_selectors/__driver__.lua f3ab1f5511f5367c72993bbff9d19d7b002b3835 @@ -1,4 +1,5 @@ +include("common/selectors.lua") mtn_setup() revs = {} @@ -23,10 +24,6 @@ -- ------------------- -- check 'earlier or equal' selector -- ------------------- -function selmap(sel, revs, sort) - check(raw_mtn("automate", "select", sel), 0, true, false) - samelines("stdout", revs, sort) -end -- this time is just 'before' the first commit, thus no output should come selmap("e:2005-03-11T20:33:00", {}) ============================================================ --- tests/test_hooks.lua ce6008e93ec7c8931517ff0173925418e4c6dd6f +++ tests/test_hooks.lua b4b22761bc0ad96cc8af40b8c7a74f2afa0ee2f3 @@ -70,3 +70,64 @@ io.write(string.format("test:test_attr:%s:%s\n", filename, value)) end +function get_netsync_connect_command(uri, args) + + local argv = nil + + if uri["scheme"] == "ssh" + and uri["host"] + and uri["path"] then + + argv = { "ssh" } + if uri["user"] then + table.insert(argv, "-l") + table.insert(argv, uri["user"]) + end + if uri["port"] then + table.insert(argv, "-p") + table.insert(argv, uri["port"]) + end + + table.insert(argv, uri["host"]) + end + + if uri["scheme"] == "file" and uri["path"] then + argv = { } + end + + if argv then + + table.insert(argv, os.getenv("mtn")) + + if args["debug"] then + table.insert(argv, "--debug") + else + table.insert(argv, "--quiet") + end + + table.insert(argv, "--db") + table.insert(argv, uri["path"]) + table.insert(argv, "serve") + table.insert(argv, "--stdio") + table.insert(argv, "--no-transport-auth") + + if args["include"] then + table.insert(argv, args["include"]) + end + + if args["exclude"] then + table.insert(argv, "--exclude") + table.insert(argv, args["exclude"]) + end + end + return argv +end + +function use_transport_auth(uri) + if uri["scheme"] == "ssh" + or uri["scheme"] == "file" then + return false + else + return true + end +end ============================================================ --- testsuite.lua 1583c485e887b9b132e73086e51e3e1985539790 +++ testsuite.lua cd8450c491bf6b6a1a0e80de26bd35674f4e2847 @@ -44,6 +44,7 @@ monotone_path = getpathof("mtn") if monotone_path == nil then monotone_path = "mtn" end +set_env("mtn", monotone_path) function safe_mtn(...) return {monotone_path, "--norc", "--root=" .. test.root, unpack(arg)} @@ -112,6 +113,23 @@ return (string.gsub(readfile("_MTN/revision"), "%s*$", "")) end +function base_manifest() + check(safe_mtn("automate", "get_manifest_of", base_revision()), 0, false) + copy("ts-stdout", "base_manifest_temp") + return sha1("base_manifest_temp") +end + +function certvalue(rev, name) + check(safe_mtn("automate", "certs", rev), 0, false) + local parsed = parse_basic_io(readfile("ts-stdout")) + local cname + for _,l in pairs(parsed) do + if l.name == "name" then cname = l.values[1] end + if cname == name and l.name == "value" then return l.values[1] end + end + return nil +end + function qgrep(what, where) local ok,res = pcall(unpack(grep("-q", what, where))) if not ok then err(res) end @@ -558,3 +576,49 @@ table.insert(tests, "disallowing_persistence_of_passphrase") table.insert(tests, "db_data_format_checking") table.insert(tests, "rename_files_into_a_directory") +table.insert(tests, "listing_changed_files") +table.insert(tests, "revert_file_in_new_project") +table.insert(tests, "db_kill_rev_locally_command_2") +table.insert(tests, "log_--no-files_and_--merges") +table.insert(tests, "importing_cvs_branches_with_correct_ancestory") +table.insert(tests, "check_--log") +table.insert(tests, "log_and_selectors_returning_multiple_rids") +table.insert(tests, "pivot_root") +table.insert(tests, "reverting_a_pivot_root") +table.insert(tests, "updating_through_a_pivot_root") +table.insert(tests, "db_rosterify_on_a_db_with_a_root_suture") +table.insert(tests, "log_dir") +table.insert(tests, "show_conflicts") +table.insert(tests, "merge_a_project_into_a_subdirectory_of_an_unrelated_project") +table.insert(tests, "restriction_excludes_parent_dir") +table.insert(tests, "revert_moving_a_file_to_a_renamed_directory") +table.insert(tests, "one-way_netsync_where_the_sink_has_more_epochs") +table.insert(tests, "branch_handling_in_disapprove") +table.insert(tests, "checking_that_certain_commands_ignores_the_contents_of__MTN_options") +table.insert(tests, "exchanging_work_via_netsync,_with_notes") +table.insert(tests, "db_rosterify_twice_gives_an_error_second_time") +table.insert(tests, "_MTN_case-folding_security_patch") +table.insert(tests, "rosterify_handles_.mt-ignore_files") +table.insert(tests, "revert_file_blocked_by_unversioned_directory") +table.insert(tests, "pid_file_cleanup") +table.insert(tests, "rosterify_on_a_db_with_an_empty_manifest") +table.insert(tests, "sync_server_--exclude_foo") +table.insert(tests, "pid_file_and_log_handles_open_failures") +table.insert(tests, "mtn_execute_attr_respects_umask") +table.insert(tests, "setup_in_subdirectory") +table.insert(tests, "test_the_help_command") +table.insert(tests, "test_the_approve_command") +table.insert(tests, "checkout_fails_with_multiple_heads") +table.insert(tests, "ls_epochs") +table.insert(tests, "test_some_hook_helper_functions") +table.insert(tests, "do_not_log_the_result_of_hook_get_passphrase") +table.insert(tests, "quiet_turns_off_tickers_but_not_warnings") +table.insert(tests, "reallyquiet_turns_off_tickers_and_warnings") +table.insert(tests, "escaped_selectors") +table.insert(tests, "automate_get_base_revision_id") +table.insert(tests, "automate_get_current_revision_id") +table.insert(tests, "log_--diffs") +table.insert(tests, "db_info_of_new_database") +table.insert(tests, "automate_common_ancestors") +table.insert(tests, "invalid_--root_settings") +table.insert(tests, "netsync_over_pipes")