1#require mtn 2 3Monotone directory is called .monotone on *nix and monotone 4on Windows. 5 6#if windows 7 8 $ mtndir=monotone 9 10#else 11 12 $ mtndir=.monotone 13 14#endif 15 16 $ echo "[extensions]" >> $HGRCPATH 17 $ echo "convert=" >> $HGRCPATH 18 19Windows version of monotone home 20 21 $ APPDATA=$HOME; export APPDATA 22 23tedious monotone keys configuration 24The /dev/null redirection is necessary under Windows, or 25it complains about home directory permissions 26 27 $ mtn --quiet genkey test@selenic.com 1>/dev/null 2>&1 <<EOF 28 > passphrase 29 > passphrase 30 > EOF 31 $ cat >> $HOME/$mtndir/monotonerc <<EOF 32 > function get_passphrase(keypair_id) 33 > return "passphrase" 34 > end 35 > EOF 36 37create monotone repository 38 39 $ mtn db init --db=repo.mtn 40 $ mtn --db=repo.mtn --branch=com.selenic.test setup workingdir 41 $ cd workingdir 42 $ echo a > a 43 $ mkdir dir 44 $ echo b > dir/b 45 $ echo d > dir/d 46 $ "$PYTHON" -c 'open("bin", "wb").write(b"a\\x00b") and None' 47 $ echo c > c 48 $ mtn add a dir/b dir/d c bin 49 mtn: adding 'a' to workspace manifest 50 mtn: adding 'bin' to workspace manifest 51 mtn: adding 'c' to workspace manifest 52 mtn: adding 'dir' to workspace manifest 53 mtn: adding 'dir/b' to workspace manifest 54 mtn: adding 'dir/d' to workspace manifest 55 $ mtn ci -m initialize 56 mtn: beginning commit on branch 'com.selenic.test' 57 mtn: committed revision 0f6e5e4f2e7d2a8ef312408f57618abf026afd90 58 59update monotone working directory 60 61 $ mtn mv a dir/a 62 mtn: skipping 'dir', already accounted for in workspace 63 mtn: renaming 'a' to 'dir/a' in workspace manifest 64 $ echo a >> dir/a 65 $ echo b >> dir/b 66 $ mtn drop c 67 mtn: dropping 'c' from workspace manifest 68 $ "$PYTHON" -c 'open("bin", "wb").write(b"b\\x00c") and None' 69 $ mtn ci -m update1 70 mtn: beginning commit on branch 'com.selenic.test' 71 mtn: committed revision 51d0a982464573a2a2cf5ee2c9219c652aaebeff 72 $ cd .. 73 74convert once 75 76 $ hg convert -s mtn repo.mtn 77 assuming destination repo.mtn-hg 78 initializing destination repo.mtn-hg repository 79 scanning source... 80 sorting... 81 converting... 82 1 initialize 83 0 update1 84 $ cd workingdir 85 $ echo e > e 86 $ mtn add e 87 mtn: adding 'e' to workspace manifest 88 $ mtn drop dir/b 89 mtn: dropping 'dir/b' from workspace manifest 90 $ mtn mv bin bin2 91 mtn: renaming 'bin' to 'bin2' in workspace manifest 92 $ mtn ci -m 'update2 "with" quotes' 93 mtn: beginning commit on branch 'com.selenic.test' 94 mtn: committed revision ebe58335d85d8cb176b6d0a12be04f5314b998da 95 96test directory move 97 98 $ mkdir -p dir1/subdir1 99 $ mkdir -p dir1/subdir2_other 100 $ echo file1 > dir1/subdir1/file1 101 $ echo file2 > dir1/subdir2_other/file1 102 $ mtn add dir1/subdir1/file1 dir1/subdir2_other/file1 103 mtn: adding 'dir1' to workspace manifest 104 mtn: adding 'dir1/subdir1' to workspace manifest 105 mtn: adding 'dir1/subdir1/file1' to workspace manifest 106 mtn: adding 'dir1/subdir2_other' to workspace manifest 107 mtn: adding 'dir1/subdir2_other/file1' to workspace manifest 108 $ mtn ci -m createdir1 109 mtn: beginning commit on branch 'com.selenic.test' 110 mtn: committed revision a8d62bc04fee4d2936d28e98bbcc81686dd74306 111 $ mtn rename dir1/subdir1 dir1/subdir2 112 mtn: skipping 'dir1', already accounted for in workspace 113 mtn: renaming 'dir1/subdir1' to 'dir1/subdir2' in workspace manifest 114 $ mtn ci -m movedir1 115 mtn: beginning commit on branch 'com.selenic.test' 116 mtn: committed revision 2c3d241bbbfe538b1b51d910f5676407e3f4d3a6 117 118test subdirectory move 119 120 $ mtn mv dir dir2 121 mtn: renaming 'dir' to 'dir2' in workspace manifest 122 $ echo newfile > dir2/newfile 123 $ mtn drop dir2/d 124 mtn: dropping 'dir2/d' from workspace manifest 125 $ mtn add dir2/newfile 126 mtn: adding 'dir2/newfile' to workspace manifest 127 $ mtn ci -m movedir 128 mtn: beginning commit on branch 'com.selenic.test' 129 mtn: committed revision fdb5a02dae8bfce3a79b3393680af471016e1b4c 130 131Test directory removal with empty directory 132 133 $ mkdir dir2/dir 134 $ mkdir dir2/dir/subdir 135 $ echo f > dir2/dir/subdir/f 136 $ mkdir dir2/dir/emptydir 137 $ mtn add --quiet -R dir2/dir 138 $ mtn ci -m emptydir 139 mtn: beginning commit on branch 'com.selenic.test' 140 mtn: committed revision 8bbf76d717001d24964e4604739fdcd0f539fc88 141 $ mtn drop -R dir2/dir 142 mtn: dropping 'dir2/dir/subdir/f' from workspace manifest 143 mtn: dropping 'dir2/dir/subdir' from workspace manifest 144 mtn: dropping 'dir2/dir/emptydir' from workspace manifest 145 mtn: dropping 'dir2/dir' from workspace manifest 146 $ mtn ci -m dropdirectory 147 mtn: beginning commit on branch 'com.selenic.test' 148 mtn: committed revision 2323d4bc324e6c82628dc04d47a9fd32ad24e322 149 150test directory and file move 151 152 $ mkdir -p dir3/d1 153 $ echo a > dir3/a 154 $ mtn add dir3/a dir3/d1 155 mtn: adding 'dir3' to workspace manifest 156 mtn: adding 'dir3/a' to workspace manifest 157 mtn: adding 'dir3/d1' to workspace manifest 158 $ mtn ci -m dirfilemove 159 mtn: beginning commit on branch 'com.selenic.test' 160 mtn: committed revision 47b192f720faa622f48c68d1eb075b26d405aa8b 161 $ mtn mv dir3/a dir3/d1/a 162 mtn: skipping 'dir3/d1', already accounted for in workspace 163 mtn: renaming 'dir3/a' to 'dir3/d1/a' in workspace manifest 164 $ mtn mv dir3/d1 dir3/d2 165 mtn: skipping 'dir3', already accounted for in workspace 166 mtn: renaming 'dir3/d1' to 'dir3/d2' in workspace manifest 167 $ mtn ci -m dirfilemove2 168 mtn: beginning commit on branch 'com.selenic.test' 169 mtn: committed revision 8b543a400d3ee7f6d4bb1835b9b9e3747c8cb632 170 171test directory move into another directory move 172 173 $ mkdir dir4 174 $ mkdir dir5 175 $ echo a > dir4/a 176 $ mtn add dir4/a dir5 177 mtn: adding 'dir4' to workspace manifest 178 mtn: adding 'dir4/a' to workspace manifest 179 mtn: adding 'dir5' to workspace manifest 180 $ mtn ci -m dirdirmove 181 mtn: beginning commit on branch 'com.selenic.test' 182 mtn: committed revision 466e0b2afc7a55aa2b4ab2f57cb240bb6cd66fc7 183 $ mtn mv dir5 dir6 184 mtn: renaming 'dir5' to 'dir6' in workspace manifest 185 $ mtn mv dir4 dir6/dir4 186 mtn: skipping 'dir6', already accounted for in workspace 187 mtn: renaming 'dir4' to 'dir6/dir4' in workspace manifest 188 $ mtn ci -m dirdirmove2 189 mtn: beginning commit on branch 'com.selenic.test' 190 mtn: committed revision 3d1f77ebad0c23a5d14911be3b670f990991b749 191 192test diverging directory moves 193 194 $ mkdir -p dir7/dir9/dir8 195 $ echo a > dir7/dir9/dir8/a 196 $ echo b > dir7/dir9/b 197 $ echo c > dir7/c 198 $ mtn add -R dir7 199 mtn: adding 'dir7' to workspace manifest 200 mtn: adding 'dir7/c' to workspace manifest 201 mtn: adding 'dir7/dir9' to workspace manifest 202 mtn: adding 'dir7/dir9/b' to workspace manifest 203 mtn: adding 'dir7/dir9/dir8' to workspace manifest 204 mtn: adding 'dir7/dir9/dir8/a' to workspace manifest 205 $ mtn ci -m divergentdirmove 206 mtn: beginning commit on branch 'com.selenic.test' 207 mtn: committed revision 08a08511f18b428d840199b062de90d0396bc2ed 208 $ mtn mv dir7 dir7-2 209 mtn: renaming 'dir7' to 'dir7-2' in workspace manifest 210 $ mtn mv dir7-2/dir9 dir9-2 211 mtn: renaming 'dir7-2/dir9' to 'dir9-2' in workspace manifest 212 $ mtn mv dir9-2/dir8 dir8-2 213 mtn: renaming 'dir9-2/dir8' to 'dir8-2' in workspace manifest 214 $ mtn ci -m divergentdirmove2 215 mtn: beginning commit on branch 'com.selenic.test' 216 mtn: committed revision 4a736634505795f17786fffdf2c9cbf5b11df6f6 217 218test large file support (> 32kB) 219 220 >>> fp = open('large-file', 'wb') 221 >>> for x in range(10000): fp.write(b'%d\n' % x) and None 222 >>> fp.close() 223 $ md5sum.py large-file 224 5d6de8a95c3b6bf9e0ffb808ba5299c1 large-file 225 $ mtn add large-file 226 mtn: adding 'large-file' to workspace manifest 227 $ mtn ci -m largefile 228 mtn: beginning commit on branch 'com.selenic.test' 229 mtn: committed revision f0a20fecd10dc4392d18fe69a03f1f4919d3387b 230 231test suspending (closing a branch) 232 233 $ mtn suspend f0a20fecd10dc4392d18fe69a03f1f4919d3387b 2> /dev/null 234 $ cd .. 235 236convert incrementally 237 238 $ hg convert -s mtn repo.mtn 239 assuming destination repo.mtn-hg 240 scanning source... 241 sorting... 242 converting... 243 12 update2 "with" quotes 244 11 createdir1 245 10 movedir1 246 9 movedir 247 8 emptydir 248 7 dropdirectory 249 6 dirfilemove 250 5 dirfilemove2 251 4 dirdirmove 252 3 dirdirmove2 253 2 divergentdirmove 254 1 divergentdirmove2 255 0 largefile 256 $ glog() 257 > { 258 > hg log -G --template '{rev} "{desc|firstline}" files: {files}\n' "$@" 259 > } 260 $ cd repo.mtn-hg 261 $ hg up -C 262 12 files updated, 0 files merged, 0 files removed, 0 files unresolved 263 no open descendant heads on branch "com.selenic.test", updating to a closed head 264 (committing will reopen branch "com.selenic.test") 265 $ glog 266 @ 14 "largefile" files: large-file 267 | 268 o 13 "divergentdirmove2" files: dir7-2/c dir7/c dir7/dir9/b dir7/dir9/dir8/a dir8-2/a dir9-2/b 269 | 270 o 12 "divergentdirmove" files: dir7/c dir7/dir9/b dir7/dir9/dir8/a 271 | 272 o 11 "dirdirmove2" files: dir4/a dir6/dir4/a 273 | 274 o 10 "dirdirmove" files: dir4/a 275 | 276 o 9 "dirfilemove2" files: dir3/a dir3/d2/a 277 | 278 o 8 "dirfilemove" files: dir3/a 279 | 280 o 7 "dropdirectory" files: dir2/dir/subdir/f 281 | 282 o 6 "emptydir" files: dir2/dir/subdir/f 283 | 284 o 5 "movedir" files: dir/a dir/d dir2/a dir2/newfile 285 | 286 o 4 "movedir1" files: dir1/subdir1/file1 dir1/subdir2/file1 287 | 288 o 3 "createdir1" files: dir1/subdir1/file1 dir1/subdir2_other/file1 289 | 290 o 2 "update2 "with" quotes" files: bin bin2 dir/b e 291 | 292 o 1 "update1" files: a bin c dir/a dir/b 293 | 294 o 0 "initialize" files: a bin c dir/b dir/d 295 296 297manifest 298 299 $ hg manifest 300 bin2 301 dir1/subdir2/file1 302 dir1/subdir2_other/file1 303 dir2/a 304 dir2/newfile 305 dir3/d2/a 306 dir6/dir4/a 307 dir7-2/c 308 dir8-2/a 309 dir9-2/b 310 e 311 large-file 312 313contents 314 315 $ cat dir2/a 316 a 317 a 318 $ test -d dir2/dir && echo 'removed dir2/dir is still there!' 319 [1] 320 321file move 322 323 $ hg log -v -C -r 1 | grep copies 324 copies: dir/a (a) 325 326check directory move 327 328 $ hg manifest -r 4 329 bin2 330 dir/a 331 dir/d 332 dir1/subdir2/file1 333 dir1/subdir2_other/file1 334 e 335 $ test -d dir1/subdir2 || echo 'new dir1/subdir2 does not exist!' 336 $ test -d dir1/subdir1 && echo 'renamed dir1/subdir1 is still there!' 337 [1] 338 $ hg log -v -C -r 4 | grep copies 339 copies: dir1/subdir2/file1 (dir1/subdir1/file1) 340 341check file remove with directory move 342 343 $ hg manifest -r 5 344 bin2 345 dir1/subdir2/file1 346 dir1/subdir2_other/file1 347 dir2/a 348 dir2/newfile 349 e 350 351check file move with directory move 352 353 $ hg manifest -r 9 354 bin2 355 dir1/subdir2/file1 356 dir1/subdir2_other/file1 357 dir2/a 358 dir2/newfile 359 dir3/d2/a 360 e 361 362check file directory directory move 363 364 $ hg manifest -r 11 365 bin2 366 dir1/subdir2/file1 367 dir1/subdir2_other/file1 368 dir2/a 369 dir2/newfile 370 dir3/d2/a 371 dir6/dir4/a 372 e 373 374check divergent directory moves 375 376 $ hg manifest -r 13 377 bin2 378 dir1/subdir2/file1 379 dir1/subdir2_other/file1 380 dir2/a 381 dir2/newfile 382 dir3/d2/a 383 dir6/dir4/a 384 dir7-2/c 385 dir8-2/a 386 dir9-2/b 387 e 388 389test large file support (> 32kB) 390 391 $ md5sum.py large-file 392 5d6de8a95c3b6bf9e0ffb808ba5299c1 large-file 393 394check branch closing 395 396 $ hg branches -a 397 $ hg branches -c 398 com.selenic.test 14:* (closed) (glob) 399 400