1-- Test enforcement of consistent resolutions for drop/modified conflicts. 2-- 3-- Only invalid combinations are tested here (we verify a good error 4-- message); valid combinations are tested in 5-- resolve_conflicts_dropped_modified_1. 6-- 7-- The left and right conflicts chosen by the user must be consistent; 8-- they must give different names for the two sides. 9-- 10-- When one file is in the dropped state, only one resolution can be 11-- specified; that of the modified file. 12-- 13-- Rename on both sides is valid, unless the user specifies the same 14-- new name for both; that is tested only once here. 15-- 16-- The only inconsistent cases are between modified and recreated 17-- files. A recreated file is detected by having the same name as the 18-- modified file; if the modified file has also been renamed, the 19-- recreated file must have the same name as the renamed file. Thus we 20-- do not need to consider a renamed modified file as a separate case. 21-- 22-- Orphaned file resolution cannot be keep or user; those error 23-- messages are tested in resolve_conflicts_dropped_modified_1. 24-- 25-- We need to test all invalid combinations of left/right resolution: 26-- 27-- left right 28-- state resolution state resolution file case 29----------------------------------------------------------- 30-- dropped - dropped - (not a conflict) 31-- - modified keep (valid) 32-- - modified rename (valid) 33-- - modified user (valid) 34-- - modified user_rename (valid) 35-- - recreated - (not a conflict) 36-- 37-- modified drop dropped - (valid) 38-- keep dropped - (valid) 39-- rename dropped - (valid) 40-- user dropped - (valid) 41-- user_rename dropped - (valid) 42-- 43-- modified - modified - (file content conflict) 44-- drop recreated drop (valid) 45-- drop recreated keep (valid) 46-- drop recreated rename (valid) 47-- drop recreated user (valid) 48-- drop recreated user_rename (valid) 49-- keep recreated drop (valid) 50-- keep recreated keep file_2 1 51-- keep recreated rename (valid) 52-- keep recreated user file_2 2 53-- keep recreated user_rename (valid) 54-- rename recreated drop (valid) 55-- rename recreated keep (valid) 56-- rename recreated rename (valid) 57-- rename recreated user (valid) 58-- rename recreated user_rename (valid) 59-- user recreated drop (valid) 60-- user recreated keep file_4 3 61-- user recreated rename (valid) 62-- user recreated user file_4 4 63-- user recreated user_rename (valid) 64-- user_rename recreated drop (valid) 65-- user_rename recreated keep (valid) 66-- user_rename recreated rename (valid) 67-- user_rename recreated user (valid) 68-- user_rename recreated user_rename (valid) 69-- 70-- recreated drop dropped - (valid) 71-- keep dropped - (valid) 72-- rename dropped - (valid) 73-- user dropped - (valid) 74-- user_rename dropped - (valid) 75-- drop modified drop (valid) 76-- drop modified keep (valid) 77-- drop modified rename (valid) 78-- drop modified user (valid) 79-- drop modified user_rename (valid) 80-- keep modified drop (valid) 81-- keep modified keep file_3 5 82-- keep modified rename (valid) 83-- keep modified user file_3 6 84-- keep modified user_rename (valid) 85-- rename modified drop (valid) 86-- rename modified keep (valid) 87-- rename modified rename (valid) 88-- rename modified user (valid) 89-- rename modified user_rename (valid) 90-- user modified drop (valid) 91-- user modified keep file_3 7 92-- user modified rename (valid) 93-- user modified user file_3 8 94-- user modified user_rename (valid) 95-- user_rename modified drop (valid) 96-- user_rename modified keep (valid) 97-- user_rename modified rename (valid) 98-- user_rename modified user (valid) 99-- user_rename modified user_rename (valid) 100 101mtn_setup() 102 103-- Create the test files 104 105addfile("file_2", "file_2 base") -- modified left, recreated right 106addfile("file_3", "file_3 base") -- recreated left, modified right 107commit("testbranch", "base") 108base = base_revision() 109 110writefile("file_2", "file_2 left") 111check(mtn("drop", "file_3"), 0, false, false) 112commit("testbranch", "left 1a") 113 114addfile("file_3", "file_3 left recreated") 115commit("testbranch", "left 1b") 116left_1 = base_revision() 117 118revert_to(base) 119 120check(mtn("drop", "file_2"), 0, false, false) 121writefile("file_3", "file_3 right") 122commit("testbranch", "right 1a") 123 124addfile("file_2", "file_2 right recreated") 125commit("testbranch", "right 1b") 126right_1 = base_revision() 127 128-- Store and show inconsistency error messages 129check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 130check(samelines("stderr", 131{"mtn: 2 conflicts with supported resolutions.", 132 "mtn: stored in '_MTN/conflicts'"})) 133 134check(mtn("conflicts", "show_first"), 0, nil, true) 135check(samelines("stderr", 136{"mtn: conflict: file 'file_2'", 137 "mtn: modified on the left", 138 "mtn: dropped and recreated on the right", 139 "mtn: possible resolutions:", 140 "mtn: resolve_first_left drop", 141 "mtn: resolve_first_left rename", 142 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\"", 143 "mtn: resolve_first_left keep", 144 "mtn: resolve_first_left user \"name\"", 145 "mtn: resolve_first_right drop", 146 "mtn: resolve_first_right rename", 147 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\"", 148 "mtn: resolve_first_right keep", 149 "mtn: resolve_first_right user \"name\""})) 150 151-- case 1, 2; keep * 152check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, false) 153 154-- check that inconsistent resolutions for right are not displayed 155check(mtn("conflicts", "show_first"), 0, nil, true) 156check(samelines("stderr", 157{"mtn: conflict: file 'file_2'", 158 "mtn: modified on the left", 159 "mtn: dropped and recreated on the right", 160 "mtn: left_resolution: keep", 161 "mtn: possible resolutions:", 162 "mtn: resolve_first_right drop", 163 "mtn: resolve_first_right rename", 164 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""})) 165 166-- check for errors from inconsistent resolutions 167 168-- case 1: keep, keep 169check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true) 170check(samelines("stderr", 171{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"})) 172 173-- case 2: keep, user 174check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 1, nil, true) 175check(samelines("stderr", 176{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"})) 177 178-- case 1, 2, but specify right resolution first 179check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 180check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, false) 181check(mtn("conflicts", "show_first"), 0, nil, true) 182check(samelines("stderr", 183{"mtn: conflict: file 'file_2'", 184 "mtn: modified on the left", 185 "mtn: dropped and recreated on the right", 186 "mtn: right_resolution: keep", 187 "mtn: possible resolutions:", 188 "mtn: resolve_first_left drop", 189 "mtn: resolve_first_left rename", 190 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""})) 191check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true) 192check(samelines("stderr", 193{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"})) 194 195-- No error if specify right again, but it actually sets file_3 right resolution. so we have to reset 196check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 197check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_2"), 0, nil, false) 198check(mtn("conflicts", "show_first"), 0, nil, true) 199check(qgrep("right_resolution: content_user, content: '_MTN/resolutions/file_2'", "stderr")) 200 201check(mtn("conflicts", "resolve_first_left", "keep"), 1, nil, true) 202check(samelines("stderr", 203{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"})) 204 205-- provide a valid resolution for file_2 so file_3 is first 206check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil) 207 208-- case 3, 4; user * 209check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 0, nil, false) 210 211check(mtn("conflicts", "show_first"), 0, nil, true) 212check(samelines("stderr", 213{"mtn: conflict: file 'file_3'", 214 "mtn: dropped and recreated on the left", 215 "mtn: modified on the right", 216 "mtn: left_resolution: content_user, content: '_MTN/resolutions/file_3'", 217 "mtn: possible resolutions:", 218 "mtn: resolve_first_right drop", 219 "mtn: resolve_first_right rename", 220 "mtn: resolve_first_right user_rename \"new_content_name\" \"new_file_name\""})) 221 222-- case 3: user, keep 223check(mtn("conflicts", "resolve_first_right", "keep"), 1, nil, true) 224check(samelines("stderr", 225{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"})) 226 227-- case 4: user, user 228check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 1, nil, true) 229check(samelines("stderr", 230{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"})) 231 232-- specify right first 233check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 234-- resolve file_2 235check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil) 236check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil) 237 238-- file_3 239check(mtn("conflicts", "resolve_first_right", "keep"), 0, nil, true) 240 241check(mtn("conflicts", "show_first"), 0, nil, true) 242check(samelines("stderr", 243{"mtn: conflict: file 'file_3'", 244 "mtn: dropped and recreated on the left", 245 "mtn: modified on the right", 246 "mtn: right_resolution: keep", 247 "mtn: possible resolutions:", 248 "mtn: resolve_first_left drop", 249 "mtn: resolve_first_left rename", 250 "mtn: resolve_first_left user_rename \"new_content_name\" \"new_file_name\""})) 251check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true) 252check(samelines("stderr", 253{"mtn: misuse: other resolution is keep; specify 'drop', 'rename', or 'user_rename'"})) 254 255-- reset for case 4 reversed 256check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 257-- resolve file_2 258check(mtn("conflicts", "resolve_first_left", "keep"), 0, nil, nil) 259check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil) 260 261check(mtn("conflicts", "resolve_first_right", "user", "_MTN/resolutions/file_3"), 0, nil, nil) 262check(mtn("conflicts", "resolve_first_left", "user", "_MTN/resolutions/file_3"), 1, nil, true) 263check(samelines("stderr", 264{"mtn: misuse: other resolution is content_user; specify 'drop', 'rename', or 'user_rename'"})) 265 266-- Test error from user rename both sides to same new name. The error is at merge time. 267check(mtn("conflicts", "store", left_1, right_1), 0, nil, true) 268check(mtn("conflicts", "resolve_first_left", "rename", "file_2_renamed"), 0, nil, nil) 269check(mtn("conflicts", "resolve_first_right", "rename", "file_2_renamed"), 0, nil, nil) 270-- file_3 271check(mtn("conflicts", "resolve_first_left", "drop"), 0, nil, nil) 272check(mtn("conflicts", "resolve_first_right", "drop"), 0, nil, nil) 273check(mtn("explicit_merge", "--resolve-conflicts", left_1, right_1, "testbranch"), 1, nil, true) 274check(qgrep("'file_2_renamed' already exists", "stderr")) 275 276-- end of file 277