comparison tests/test-revset.t @ 34126:af13097b44dd

tests: split test-revset.t in half This test has gotten so large that running it can exceed the normal timeout on systems under load (like if we're running all the tests in parallel). This patch splits the test cleanly in half. Differential Revision: https://phab.mercurial-scm.org/D694
author Durham Goode <durham@fb.com>
date Tue, 12 Sep 2017 15:12:27 -0700
parents 7bbc4e113e5f
children 1644623ab096
comparison
equal deleted inserted replaced
34125:57dc78d757ff 34126:af13097b44dd
2735 $ hg log -r 'sort(0, topo, topo.firstbranch=(book1))' 2735 $ hg log -r 'sort(0, topo, topo.firstbranch=(book1))'
2736 0 b12 m111 u112 111 10800 2736 0 b12 m111 u112 111 10800
2737 2737
2738 $ cd .. 2738 $ cd ..
2739 $ cd repo 2739 $ cd repo
2740
2741 test subtracting something from an addset
2742
2743 $ log '(outgoing() or removes(a)) - removes(a)'
2744 8
2745 9
2746
2747 test intersecting something with an addset
2748
2749 $ log 'parents(outgoing() or removes(a))'
2750 1
2751 4
2752 5
2753 8
2754
2755 test that `or` operation combines elements in the right order:
2756
2757 $ log '3:4 or 2:5'
2758 3
2759 4
2760 2
2761 5
2762 $ log '3:4 or 5:2'
2763 3
2764 4
2765 5
2766 2
2767 $ log 'sort(3:4 or 2:5)'
2768 2
2769 3
2770 4
2771 5
2772 $ log 'sort(3:4 or 5:2)'
2773 2
2774 3
2775 4
2776 5
2777
2778 test that more than one `-r`s are combined in the right order and deduplicated:
2779
2780 $ hg log -T '{rev}\n' -r 3 -r 3 -r 4 -r 5:2 -r 'ancestors(4)'
2781 3
2782 4
2783 5
2784 2
2785 0
2786 1
2787
2788 test that `or` operation skips duplicated revisions from right-hand side
2789
2790 $ try 'reverse(1::5) or ancestors(4)'
2791 (or
2792 (list
2793 (func
2794 (symbol 'reverse')
2795 (dagrange
2796 (symbol '1')
2797 (symbol '5')))
2798 (func
2799 (symbol 'ancestors')
2800 (symbol '4'))))
2801 * set:
2802 <addset
2803 <baseset- [1, 3, 5]>,
2804 <generatorset+>>
2805 5
2806 3
2807 1
2808 0
2809 2
2810 4
2811 $ try 'sort(ancestors(4) or reverse(1::5))'
2812 (func
2813 (symbol 'sort')
2814 (or
2815 (list
2816 (func
2817 (symbol 'ancestors')
2818 (symbol '4'))
2819 (func
2820 (symbol 'reverse')
2821 (dagrange
2822 (symbol '1')
2823 (symbol '5'))))))
2824 * set:
2825 <addset+
2826 <generatorset+>,
2827 <baseset- [1, 3, 5]>>
2828 0
2829 1
2830 2
2831 3
2832 4
2833 5
2834
2835 test optimization of trivial `or` operation
2836
2837 $ try --optimize '0|(1)|"2"|-2|tip|null'
2838 (or
2839 (list
2840 (symbol '0')
2841 (group
2842 (symbol '1'))
2843 (string '2')
2844 (negate
2845 (symbol '2'))
2846 (symbol 'tip')
2847 (symbol 'null')))
2848 * optimized:
2849 (func
2850 (symbol '_list')
2851 (string '0\x001\x002\x00-2\x00tip\x00null'))
2852 * set:
2853 <baseset [0, 1, 2, 8, 9, -1]>
2854 0
2855 1
2856 2
2857 8
2858 9
2859 -1
2860
2861 $ try --optimize '0|1|2:3'
2862 (or
2863 (list
2864 (symbol '0')
2865 (symbol '1')
2866 (range
2867 (symbol '2')
2868 (symbol '3'))))
2869 * optimized:
2870 (or
2871 (list
2872 (func
2873 (symbol '_list')
2874 (string '0\x001'))
2875 (range
2876 (symbol '2')
2877 (symbol '3'))))
2878 * set:
2879 <addset
2880 <baseset [0, 1]>,
2881 <spanset+ 2:4>>
2882 0
2883 1
2884 2
2885 3
2886
2887 $ try --optimize '0:1|2|3:4|5|6'
2888 (or
2889 (list
2890 (range
2891 (symbol '0')
2892 (symbol '1'))
2893 (symbol '2')
2894 (range
2895 (symbol '3')
2896 (symbol '4'))
2897 (symbol '5')
2898 (symbol '6')))
2899 * optimized:
2900 (or
2901 (list
2902 (range
2903 (symbol '0')
2904 (symbol '1'))
2905 (symbol '2')
2906 (range
2907 (symbol '3')
2908 (symbol '4'))
2909 (func
2910 (symbol '_list')
2911 (string '5\x006'))))
2912 * set:
2913 <addset
2914 <addset
2915 <spanset+ 0:2>,
2916 <baseset [2]>>,
2917 <addset
2918 <spanset+ 3:5>,
2919 <baseset [5, 6]>>>
2920 0
2921 1
2922 2
2923 3
2924 4
2925 5
2926 6
2927
2928 unoptimized `or` looks like this
2929
2930 $ try --no-optimized -p analyzed '0|1|2|3|4'
2931 * analyzed:
2932 (or
2933 (list
2934 (symbol '0')
2935 (symbol '1')
2936 (symbol '2')
2937 (symbol '3')
2938 (symbol '4')))
2939 * set:
2940 <addset
2941 <addset
2942 <baseset [0]>,
2943 <baseset [1]>>,
2944 <addset
2945 <baseset [2]>,
2946 <addset
2947 <baseset [3]>,
2948 <baseset [4]>>>>
2949 0
2950 1
2951 2
2952 3
2953 4
2954
2955 test that `_list` should be narrowed by provided `subset`
2956
2957 $ log '0:2 and (null|1|2|3)'
2958 1
2959 2
2960
2961 test that `_list` should remove duplicates
2962
2963 $ log '0|1|2|1|2|-1|tip'
2964 0
2965 1
2966 2
2967 9
2968
2969 test unknown revision in `_list`
2970
2971 $ log '0|unknown'
2972 abort: unknown revision 'unknown'!
2973 [255]
2974
2975 test integer range in `_list`
2976
2977 $ log '-1|-10'
2978 9
2979 0
2980
2981 $ log '-10|-11'
2982 abort: unknown revision '-11'!
2983 [255]
2984
2985 $ log '9|10'
2986 abort: unknown revision '10'!
2987 [255]
2988
2989 test '0000' != '0' in `_list`
2990
2991 $ log '0|0000'
2992 0
2993 -1
2994
2995 test ',' in `_list`
2996 $ log '0,1'
2997 hg: parse error: can't use a list in this context
2998 (see hg help "revsets.x or y")
2999 [255]
3000 $ try '0,1,2'
3001 (list
3002 (symbol '0')
3003 (symbol '1')
3004 (symbol '2'))
3005 hg: parse error: can't use a list in this context
3006 (see hg help "revsets.x or y")
3007 [255]
3008
3009 test that chained `or` operations make balanced addsets
3010
3011 $ try '0:1|1:2|2:3|3:4|4:5'
3012 (or
3013 (list
3014 (range
3015 (symbol '0')
3016 (symbol '1'))
3017 (range
3018 (symbol '1')
3019 (symbol '2'))
3020 (range
3021 (symbol '2')
3022 (symbol '3'))
3023 (range
3024 (symbol '3')
3025 (symbol '4'))
3026 (range
3027 (symbol '4')
3028 (symbol '5'))))
3029 * set:
3030 <addset
3031 <addset
3032 <spanset+ 0:2>,
3033 <spanset+ 1:3>>,
3034 <addset
3035 <spanset+ 2:4>,
3036 <addset
3037 <spanset+ 3:5>,
3038 <spanset+ 4:6>>>>
3039 0
3040 1
3041 2
3042 3
3043 4
3044 5
3045
3046 no crash by empty group "()" while optimizing `or` operations
3047
3048 $ try --optimize '0|()'
3049 (or
3050 (list
3051 (symbol '0')
3052 (group
3053 None)))
3054 * optimized:
3055 (or
3056 (list
3057 (symbol '0')
3058 None))
3059 hg: parse error: missing argument
3060 [255]
3061
3062 test that chained `or` operations never eat up stack (issue4624)
3063 (uses `0:1` instead of `0` to avoid future optimization of trivial revisions)
3064
3065 $ hg log -T '{rev}\n' -r `$PYTHON -c "print '+'.join(['0:1'] * 500)"`
3066 0
3067 1
3068
3069 test that repeated `-r` options never eat up stack (issue4565)
3070 (uses `-r 0::1` to avoid possible optimization at old-style parser)
3071
3072 $ hg log -T '{rev}\n' `$PYTHON -c "for i in xrange(500): print '-r 0::1 ',"`
3073 0
3074 1
3075
3076 check that conversion to only works
3077 $ try --optimize '::3 - ::1'
3078 (minus
3079 (dagrangepre
3080 (symbol '3'))
3081 (dagrangepre
3082 (symbol '1')))
3083 * optimized:
3084 (func
3085 (symbol 'only')
3086 (list
3087 (symbol '3')
3088 (symbol '1')))
3089 * set:
3090 <baseset+ [3]>
3091 3
3092 $ try --optimize 'ancestors(1) - ancestors(3)'
3093 (minus
3094 (func
3095 (symbol 'ancestors')
3096 (symbol '1'))
3097 (func
3098 (symbol 'ancestors')
3099 (symbol '3')))
3100 * optimized:
3101 (func
3102 (symbol 'only')
3103 (list
3104 (symbol '1')
3105 (symbol '3')))
3106 * set:
3107 <baseset+ []>
3108 $ try --optimize 'not ::2 and ::6'
3109 (and
3110 (not
3111 (dagrangepre
3112 (symbol '2')))
3113 (dagrangepre
3114 (symbol '6')))
3115 * optimized:
3116 (func
3117 (symbol 'only')
3118 (list
3119 (symbol '6')
3120 (symbol '2')))
3121 * set:
3122 <baseset+ [3, 4, 5, 6]>
3123 3
3124 4
3125 5
3126 6
3127 $ try --optimize 'ancestors(6) and not ancestors(4)'
3128 (and
3129 (func
3130 (symbol 'ancestors')
3131 (symbol '6'))
3132 (not
3133 (func
3134 (symbol 'ancestors')
3135 (symbol '4'))))
3136 * optimized:
3137 (func
3138 (symbol 'only')
3139 (list
3140 (symbol '6')
3141 (symbol '4')))
3142 * set:
3143 <baseset+ [3, 5, 6]>
3144 3
3145 5
3146 6
3147
3148 no crash by empty group "()" while optimizing to "only()"
3149
3150 $ try --optimize '::1 and ()'
3151 (and
3152 (dagrangepre
3153 (symbol '1'))
3154 (group
3155 None))
3156 * optimized:
3157 (andsmally
3158 (func
3159 (symbol 'ancestors')
3160 (symbol '1'))
3161 None)
3162 hg: parse error: missing argument
3163 [255]
3164
3165 optimization to only() works only if ancestors() takes only one argument
3166
3167 $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
3168 * optimized:
3169 (difference
3170 (func
3171 (symbol 'ancestors')
3172 (symbol '6'))
3173 (func
3174 (symbol 'ancestors')
3175 (list
3176 (symbol '4')
3177 (symbol '1'))))
3178 0
3179 1
3180 3
3181 5
3182 6
3183 $ hg debugrevspec -p optimized 'ancestors(6, 1) - ancestors(4)'
3184 * optimized:
3185 (difference
3186 (func
3187 (symbol 'ancestors')
3188 (list
3189 (symbol '6')
3190 (symbol '1')))
3191 (func
3192 (symbol 'ancestors')
3193 (symbol '4')))
3194 5
3195 6
3196
3197 optimization disabled if keyword arguments passed (because we're too lazy
3198 to support it)
3199
3200 $ hg debugrevspec -p optimized 'ancestors(set=6) - ancestors(set=4)'
3201 * optimized:
3202 (difference
3203 (func
3204 (symbol 'ancestors')
3205 (keyvalue
3206 (symbol 'set')
3207 (symbol '6')))
3208 (func
3209 (symbol 'ancestors')
3210 (keyvalue
3211 (symbol 'set')
3212 (symbol '4'))))
3213 3
3214 5
3215 6
3216
3217 invalid function call should not be optimized to only()
3218
3219 $ log '"ancestors"(6) and not ancestors(4)'
3220 hg: parse error: not a symbol
3221 [255]
3222
3223 $ log 'ancestors(6) and not "ancestors"(4)'
3224 hg: parse error: not a symbol
3225 [255]
3226
3227 we can use patterns when searching for tags
3228
3229 $ log 'tag("1..*")'
3230 abort: tag '1..*' does not exist!
3231 [255]
3232 $ log 'tag("re:1..*")'
3233 6
3234 $ log 'tag("re:[0-9].[0-9]")'
3235 6
3236 $ log 'tag("literal:1.0")'
3237 6
3238 $ log 'tag("re:0..*")'
3239
3240 $ log 'tag(unknown)'
3241 abort: tag 'unknown' does not exist!
3242 [255]
3243 $ log 'tag("re:unknown")'
3244 $ log 'present(tag("unknown"))'
3245 $ log 'present(tag("re:unknown"))'
3246 $ log 'branch(unknown)'
3247 abort: unknown revision 'unknown'!
3248 [255]
3249 $ log 'branch("literal:unknown")'
3250 abort: branch 'unknown' does not exist!
3251 [255]
3252 $ log 'branch("re:unknown")'
3253 $ log 'present(branch("unknown"))'
3254 $ log 'present(branch("re:unknown"))'
3255 $ log 'user(bob)'
3256 2
3257
3258 $ log '4::8'
3259 4
3260 8
3261 $ log '4:8'
3262 4
3263 5
3264 6
3265 7
3266 8
3267
3268 $ log 'sort(!merge() & (modifies(b) | user(bob) | keyword(bug) | keyword(issue) & 1::9), "-date")'
3269 4
3270 2
3271 5
3272
3273 $ log 'not 0 and 0:2'
3274 1
3275 2
3276 $ log 'not 1 and 0:2'
3277 0
3278 2
3279 $ log 'not 2 and 0:2'
3280 0
3281 1
3282 $ log '(1 and 2)::'
3283 $ log '(1 and 2):'
3284 $ log '(1 and 2):3'
3285 $ log 'sort(head(), -rev)'
3286 9
3287 7
3288 6
3289 5
3290 4
3291 3
3292 2
3293 1
3294 0
3295 $ log '4::8 - 8'
3296 4
3297
3298 matching() should preserve the order of the input set:
3299
3300 $ log '(2 or 3 or 1) and matching(1 or 2 or 3)'
3301 2
3302 3
3303 1
3304
3305 $ log 'named("unknown")'
3306 abort: namespace 'unknown' does not exist!
3307 [255]
3308 $ log 'named("re:unknown")'
3309 abort: no namespace exists that match 'unknown'!
3310 [255]
3311 $ log 'present(named("unknown"))'
3312 $ log 'present(named("re:unknown"))'
3313
3314 $ log 'tag()'
3315 6
3316 $ log 'named("tags")'
3317 6
3318
3319 issue2437
3320
3321 $ log '3 and p1(5)'
3322 3
3323 $ log '4 and p2(6)'
3324 4
3325 $ log '1 and parents(:2)'
3326 1
3327 $ log '2 and children(1:)'
3328 2
3329 $ log 'roots(all()) or roots(all())'
3330 0
3331 $ hg debugrevspec 'roots(all()) or roots(all())'
3332 0
3333 $ log 'heads(branch(é)) or heads(branch(é))'
3334 9
3335 $ log 'ancestors(8) and (heads(branch("-a-b-c-")) or heads(branch(é)))'
3336 4
3337
3338 issue2654: report a parse error if the revset was not completely parsed
3339
3340 $ log '1 OR 2'
3341 hg: parse error at 2: invalid token
3342 [255]
3343
3344 or operator should preserve ordering:
3345 $ log 'reverse(2::4) or tip'
3346 4
3347 2
3348 9
3349
3350 parentrevspec
3351
3352 $ log 'merge()^0'
3353 6
3354 $ log 'merge()^'
3355 5
3356 $ log 'merge()^1'
3357 5
3358 $ log 'merge()^2'
3359 4
3360 $ log '(not merge())^2'
3361 $ log 'merge()^^'
3362 3
3363 $ log 'merge()^1^'
3364 3
3365 $ log 'merge()^^^'
3366 1
3367
3368 $ hg debugrevspec -s '(merge() | 0)~-1'
3369 * set:
3370 <baseset+ [1, 7]>
3371 1
3372 7
3373 $ log 'merge()~-1'
3374 7
3375 $ log 'tip~-1'
3376 $ log '(tip | merge())~-1'
3377 7
3378 $ log 'merge()~0'
3379 6
3380 $ log 'merge()~1'
3381 5
3382 $ log 'merge()~2'
3383 3
3384 $ log 'merge()~2^1'
3385 1
3386 $ log 'merge()~3'
3387 1
3388
3389 $ log '(-3:tip)^'
3390 4
3391 6
3392 8
3393
3394 $ log 'tip^foo'
3395 hg: parse error: ^ expects a number 0, 1, or 2
3396 [255]
3397
3398 $ log 'branchpoint()~-1'
3399 abort: revision in set has more than one child!
3400 [255]
3401
3402 Bogus function gets suggestions
3403 $ log 'add()'
3404 hg: parse error: unknown identifier: add
3405 (did you mean adds?)
3406 [255]
3407 $ log 'added()'
3408 hg: parse error: unknown identifier: added
3409 (did you mean adds?)
3410 [255]
3411 $ log 'remo()'
3412 hg: parse error: unknown identifier: remo
3413 (did you mean one of remote, removes?)
3414 [255]
3415 $ log 'babar()'
3416 hg: parse error: unknown identifier: babar
3417 [255]
3418
3419 Bogus function with a similar internal name doesn't suggest the internal name
3420 $ log 'matches()'
3421 hg: parse error: unknown identifier: matches
3422 (did you mean matching?)
3423 [255]
3424
3425 Undocumented functions aren't suggested as similar either
3426 $ log 'tagged2()'
3427 hg: parse error: unknown identifier: tagged2
3428 [255]
3429
3430 multiple revspecs
3431
3432 $ hg log -r 'tip~1:tip' -r 'tip~2:tip~1' --template '{rev}\n'
3433 8
3434 9
3435 4
3436 5
3437 6
3438 7
3439
3440 test usage in revpair (with "+")
3441
3442 (real pair)
3443
3444 $ hg diff -r 'tip^^' -r 'tip'
3445 diff -r 2326846efdab -r 24286f4ae135 .hgtags
3446 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3447 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
3448 @@ -0,0 +1,1 @@
3449 +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0
3450 $ hg diff -r 'tip^^::tip'
3451 diff -r 2326846efdab -r 24286f4ae135 .hgtags
3452 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3453 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
3454 @@ -0,0 +1,1 @@
3455 +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0
3456
3457 (single rev)
3458
3459 $ hg diff -r 'tip^' -r 'tip^'
3460 $ hg diff -r 'tip^:tip^'
3461
3462 (single rev that does not looks like a range)
3463
3464 $ hg diff -r 'tip^::tip^ or tip^'
3465 diff -r d5d0dcbdc4d9 .hgtags
3466 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3467 +++ b/.hgtags * (glob)
3468 @@ -0,0 +1,1 @@
3469 +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0
3470 $ hg diff -r 'tip^ or tip^'
3471 diff -r d5d0dcbdc4d9 .hgtags
3472 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3473 +++ b/.hgtags * (glob)
3474 @@ -0,0 +1,1 @@
3475 +e0cc66ef77e8b6f711815af4e001a6594fde3ba5 1.0
3476
3477 (no rev)
3478
3479 $ hg diff -r 'author("babar") or author("celeste")'
3480 abort: empty revision range
3481 [255]
3482
3483 aliases:
3484
3485 $ echo '[revsetalias]' >> .hg/hgrc
3486 $ echo 'm = merge()' >> .hg/hgrc
3487 (revset aliases can override builtin revsets)
3488 $ echo 'p2($1) = p1($1)' >> .hg/hgrc
3489 $ echo 'sincem = descendants(m)' >> .hg/hgrc
3490 $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc
3491 $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
3492 $ echo 'rs4(ARG1, ARGA, ARGB, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
3493
3494 $ try m
3495 (symbol 'm')
3496 * expanded:
3497 (func
3498 (symbol 'merge')
3499 None)
3500 * set:
3501 <filteredset
3502 <fullreposet+ 0:10>,
3503 <merge>>
3504 6
3505
3506 $ HGPLAIN=1
3507 $ export HGPLAIN
3508 $ try m
3509 (symbol 'm')
3510 abort: unknown revision 'm'!
3511 [255]
3512
3513 $ HGPLAINEXCEPT=revsetalias
3514 $ export HGPLAINEXCEPT
3515 $ try m
3516 (symbol 'm')
3517 * expanded:
3518 (func
3519 (symbol 'merge')
3520 None)
3521 * set:
3522 <filteredset
3523 <fullreposet+ 0:10>,
3524 <merge>>
3525 6
3526
3527 $ unset HGPLAIN
3528 $ unset HGPLAINEXCEPT
3529
3530 $ try 'p2(.)'
3531 (func
3532 (symbol 'p2')
3533 (symbol '.'))
3534 * expanded:
3535 (func
3536 (symbol 'p1')
3537 (symbol '.'))
3538 * set:
3539 <baseset+ [8]>
3540 8
3541
3542 $ HGPLAIN=1
3543 $ export HGPLAIN
3544 $ try 'p2(.)'
3545 (func
3546 (symbol 'p2')
3547 (symbol '.'))
3548 * set:
3549 <baseset+ []>
3550
3551 $ HGPLAINEXCEPT=revsetalias
3552 $ export HGPLAINEXCEPT
3553 $ try 'p2(.)'
3554 (func
3555 (symbol 'p2')
3556 (symbol '.'))
3557 * expanded:
3558 (func
3559 (symbol 'p1')
3560 (symbol '.'))
3561 * set:
3562 <baseset+ [8]>
3563 8
3564
3565 $ unset HGPLAIN
3566 $ unset HGPLAINEXCEPT
3567
3568 test alias recursion
3569
3570 $ try sincem
3571 (symbol 'sincem')
3572 * expanded:
3573 (func
3574 (symbol 'descendants')
3575 (func
3576 (symbol 'merge')
3577 None))
3578 * set:
3579 <generatorset+>
3580 6
3581 7
3582
3583 test infinite recursion
3584
3585 $ echo 'recurse1 = recurse2' >> .hg/hgrc
3586 $ echo 'recurse2 = recurse1' >> .hg/hgrc
3587 $ try recurse1
3588 (symbol 'recurse1')
3589 hg: parse error: infinite expansion of revset alias "recurse1" detected
3590 [255]
3591
3592 $ echo 'level1($1, $2) = $1 or $2' >> .hg/hgrc
3593 $ echo 'level2($1, $2) = level1($2, $1)' >> .hg/hgrc
3594 $ try "level2(level1(1, 2), 3)"
3595 (func
3596 (symbol 'level2')
3597 (list
3598 (func
3599 (symbol 'level1')
3600 (list
3601 (symbol '1')
3602 (symbol '2')))
3603 (symbol '3')))
3604 * expanded:
3605 (or
3606 (list
3607 (symbol '3')
3608 (or
3609 (list
3610 (symbol '1')
3611 (symbol '2')))))
3612 * set:
3613 <addset
3614 <baseset [3]>,
3615 <baseset [1, 2]>>
3616 3
3617 1
3618 2
3619
3620 test nesting and variable passing
3621
3622 $ echo 'nested($1) = nested2($1)' >> .hg/hgrc
3623 $ echo 'nested2($1) = nested3($1)' >> .hg/hgrc
3624 $ echo 'nested3($1) = max($1)' >> .hg/hgrc
3625 $ try 'nested(2:5)'
3626 (func
3627 (symbol 'nested')
3628 (range
3629 (symbol '2')
3630 (symbol '5')))
3631 * expanded:
3632 (func
3633 (symbol 'max')
3634 (range
3635 (symbol '2')
3636 (symbol '5')))
3637 * set:
3638 <baseset
3639 <max
3640 <fullreposet+ 0:10>,
3641 <spanset+ 2:6>>>
3642 5
3643
3644 test chained `or` operations are flattened at parsing phase
3645
3646 $ echo 'chainedorops($1, $2, $3) = $1|$2|$3' >> .hg/hgrc
3647 $ try 'chainedorops(0:1, 1:2, 2:3)'
3648 (func
3649 (symbol 'chainedorops')
3650 (list
3651 (range
3652 (symbol '0')
3653 (symbol '1'))
3654 (range
3655 (symbol '1')
3656 (symbol '2'))
3657 (range
3658 (symbol '2')
3659 (symbol '3'))))
3660 * expanded:
3661 (or
3662 (list
3663 (range
3664 (symbol '0')
3665 (symbol '1'))
3666 (range
3667 (symbol '1')
3668 (symbol '2'))
3669 (range
3670 (symbol '2')
3671 (symbol '3'))))
3672 * set:
3673 <addset
3674 <spanset+ 0:2>,
3675 <addset
3676 <spanset+ 1:3>,
3677 <spanset+ 2:4>>>
3678 0
3679 1
3680 2
3681 3
3682
3683 test variable isolation, variable placeholders are rewritten as string
3684 then parsed and matched again as string. Check they do not leak too
3685 far away.
3686
3687 $ echo 'injectparamasstring = max("$1")' >> .hg/hgrc
3688 $ echo 'callinjection($1) = descendants(injectparamasstring)' >> .hg/hgrc
3689 $ try 'callinjection(2:5)'
3690 (func
3691 (symbol 'callinjection')
3692 (range
3693 (symbol '2')
3694 (symbol '5')))
3695 * expanded:
3696 (func
3697 (symbol 'descendants')
3698 (func
3699 (symbol 'max')
3700 (string '$1')))
3701 abort: unknown revision '$1'!
3702 [255]
3703
3704 test scope of alias expansion: 'universe' is expanded prior to 'shadowall(0)',
3705 but 'all()' should never be substituted to '0()'.
3706
3707 $ echo 'universe = all()' >> .hg/hgrc
3708 $ echo 'shadowall(all) = all and universe' >> .hg/hgrc
3709 $ try 'shadowall(0)'
3710 (func
3711 (symbol 'shadowall')
3712 (symbol '0'))
3713 * expanded:
3714 (and
3715 (symbol '0')
3716 (func
3717 (symbol 'all')
3718 None))
3719 * set:
3720 <filteredset
3721 <baseset [0]>,
3722 <spanset+ 0:10>>
3723 0
3724
3725 test unknown reference:
3726
3727 $ try "unknownref(0)" --config 'revsetalias.unknownref($1)=$1:$2'
3728 (func
3729 (symbol 'unknownref')
3730 (symbol '0'))
3731 abort: bad definition of revset alias "unknownref": invalid symbol '$2'
3732 [255]
3733
3734 $ hg debugrevspec --debug --config revsetalias.anotherbadone='branch(' "tip"
3735 (symbol 'tip')
3736 warning: bad definition of revset alias "anotherbadone": at 7: not a prefix: end
3737 * set:
3738 <baseset [9]>
3739 9
3740
3741 $ try 'tip'
3742 (symbol 'tip')
3743 * set:
3744 <baseset [9]>
3745 9
3746
3747 $ hg debugrevspec --debug --config revsetalias.'bad name'='tip' "tip"
3748 (symbol 'tip')
3749 warning: bad declaration of revset alias "bad name": at 4: invalid token
3750 * set:
3751 <baseset [9]>
3752 9
3753 $ echo 'strictreplacing($1, $10) = $10 or desc("$1")' >> .hg/hgrc
3754 $ try 'strictreplacing("foo", tip)'
3755 (func
3756 (symbol 'strictreplacing')
3757 (list
3758 (string 'foo')
3759 (symbol 'tip')))
3760 * expanded:
3761 (or
3762 (list
3763 (symbol 'tip')
3764 (func
3765 (symbol 'desc')
3766 (string '$1'))))
3767 * set:
3768 <addset
3769 <baseset [9]>,
3770 <filteredset
3771 <fullreposet+ 0:10>,
3772 <desc '$1'>>>
3773 9
3774
3775 $ try 'd(2:5)'
3776 (func
3777 (symbol 'd')
3778 (range
3779 (symbol '2')
3780 (symbol '5')))
3781 * expanded:
3782 (func
3783 (symbol 'reverse')
3784 (func
3785 (symbol 'sort')
3786 (list
3787 (range
3788 (symbol '2')
3789 (symbol '5'))
3790 (symbol 'date'))))
3791 * set:
3792 <baseset [4, 5, 3, 2]>
3793 4
3794 5
3795 3
3796 2
3797 $ try 'rs(2 or 3, date)'
3798 (func
3799 (symbol 'rs')
3800 (list
3801 (or
3802 (list
3803 (symbol '2')
3804 (symbol '3')))
3805 (symbol 'date')))
3806 * expanded:
3807 (func
3808 (symbol 'reverse')
3809 (func
3810 (symbol 'sort')
3811 (list
3812 (or
3813 (list
3814 (symbol '2')
3815 (symbol '3')))
3816 (symbol 'date'))))
3817 * set:
3818 <baseset [3, 2]>
3819 3
3820 2
3821 $ try 'rs()'
3822 (func
3823 (symbol 'rs')
3824 None)
3825 hg: parse error: invalid number of arguments: 0
3826 [255]
3827 $ try 'rs(2)'
3828 (func
3829 (symbol 'rs')
3830 (symbol '2'))
3831 hg: parse error: invalid number of arguments: 1
3832 [255]
3833 $ try 'rs(2, data, 7)'
3834 (func
3835 (symbol 'rs')
3836 (list
3837 (symbol '2')
3838 (symbol 'data')
3839 (symbol '7')))
3840 hg: parse error: invalid number of arguments: 3
3841 [255]
3842 $ try 'rs4(2 or 3, x, x, date)'
3843 (func
3844 (symbol 'rs4')
3845 (list
3846 (or
3847 (list
3848 (symbol '2')
3849 (symbol '3')))
3850 (symbol 'x')
3851 (symbol 'x')
3852 (symbol 'date')))
3853 * expanded:
3854 (func
3855 (symbol 'reverse')
3856 (func
3857 (symbol 'sort')
3858 (list
3859 (or
3860 (list
3861 (symbol '2')
3862 (symbol '3')))
3863 (symbol 'date'))))
3864 * set:
3865 <baseset [3, 2]>
3866 3
3867 2
3868
3869 issue4553: check that revset aliases override existing hash prefix
3870
3871 $ hg log -qr e
3872 6:e0cc66ef77e8
3873
3874 $ hg log -qr e --config revsetalias.e="all()"
3875 0:2785f51eece5
3876 1:d75937da8da0
3877 2:5ed5505e9f1c
3878 3:8528aa5637f2
3879 4:2326846efdab
3880 5:904fa392b941
3881 6:e0cc66ef77e8
3882 7:013af1973af4
3883 8:d5d0dcbdc4d9
3884 9:24286f4ae135
3885
3886 $ hg log -qr e: --config revsetalias.e="0"
3887 0:2785f51eece5
3888 1:d75937da8da0
3889 2:5ed5505e9f1c
3890 3:8528aa5637f2
3891 4:2326846efdab
3892 5:904fa392b941
3893 6:e0cc66ef77e8
3894 7:013af1973af4
3895 8:d5d0dcbdc4d9
3896 9:24286f4ae135
3897
3898 $ hg log -qr :e --config revsetalias.e="9"
3899 0:2785f51eece5
3900 1:d75937da8da0
3901 2:5ed5505e9f1c
3902 3:8528aa5637f2
3903 4:2326846efdab
3904 5:904fa392b941
3905 6:e0cc66ef77e8
3906 7:013af1973af4
3907 8:d5d0dcbdc4d9
3908 9:24286f4ae135
3909
3910 $ hg log -qr e:
3911 6:e0cc66ef77e8
3912 7:013af1973af4
3913 8:d5d0dcbdc4d9
3914 9:24286f4ae135
3915
3916 $ hg log -qr :e
3917 0:2785f51eece5
3918 1:d75937da8da0
3919 2:5ed5505e9f1c
3920 3:8528aa5637f2
3921 4:2326846efdab
3922 5:904fa392b941
3923 6:e0cc66ef77e8
3924
3925 issue2549 - correct optimizations
3926
3927 $ try 'limit(1 or 2 or 3, 2) and not 2'
3928 (and
3929 (func
3930 (symbol 'limit')
3931 (list
3932 (or
3933 (list
3934 (symbol '1')
3935 (symbol '2')
3936 (symbol '3')))
3937 (symbol '2')))
3938 (not
3939 (symbol '2')))
3940 * set:
3941 <filteredset
3942 <baseset [1, 2]>,
3943 <not
3944 <baseset [2]>>>
3945 1
3946 $ try 'max(1 or 2) and not 2'
3947 (and
3948 (func
3949 (symbol 'max')
3950 (or
3951 (list
3952 (symbol '1')
3953 (symbol '2'))))
3954 (not
3955 (symbol '2')))
3956 * set:
3957 <filteredset
3958 <baseset
3959 <max
3960 <fullreposet+ 0:10>,
3961 <baseset [1, 2]>>>,
3962 <not
3963 <baseset [2]>>>
3964 $ try 'min(1 or 2) and not 1'
3965 (and
3966 (func
3967 (symbol 'min')
3968 (or
3969 (list
3970 (symbol '1')
3971 (symbol '2'))))
3972 (not
3973 (symbol '1')))
3974 * set:
3975 <filteredset
3976 <baseset
3977 <min
3978 <fullreposet+ 0:10>,
3979 <baseset [1, 2]>>>,
3980 <not
3981 <baseset [1]>>>
3982 $ try 'last(1 or 2, 1) and not 2'
3983 (and
3984 (func
3985 (symbol 'last')
3986 (list
3987 (or
3988 (list
3989 (symbol '1')
3990 (symbol '2')))
3991 (symbol '1')))
3992 (not
3993 (symbol '2')))
3994 * set:
3995 <filteredset
3996 <baseset [2]>,
3997 <not
3998 <baseset [2]>>>
3999
4000 issue4289 - ordering of built-ins
4001 $ hg log -M -q -r 3:2
4002 3:8528aa5637f2
4003 2:5ed5505e9f1c
4004
4005 test revsets started with 40-chars hash (issue3669)
4006
4007 $ ISSUE3669_TIP=`hg tip --template '{node}'`
4008 $ hg log -r "${ISSUE3669_TIP}" --template '{rev}\n'
4009 9
4010 $ hg log -r "${ISSUE3669_TIP}^" --template '{rev}\n'
4011 8
4012
4013 test or-ed indirect predicates (issue3775)
4014
4015 $ log '6 or 6^1' | sort
4016 5
4017 6
4018 $ log '6^1 or 6' | sort
4019 5
4020 6
4021 $ log '4 or 4~1' | sort
4022 2
4023 4
4024 $ log '4~1 or 4' | sort
4025 2
4026 4
4027 $ log '(0 or 2):(4 or 6) or 0 or 6' | sort
4028 0
4029 1
4030 2
4031 3
4032 4
4033 5
4034 6
4035 $ log '0 or 6 or (0 or 2):(4 or 6)' | sort
4036 0
4037 1
4038 2
4039 3
4040 4
4041 5
4042 6
4043
4044 tests for 'remote()' predicate:
4045 #. (csets in remote) (id) (remote)
4046 1. less than local current branch "default"
4047 2. same with local specified "default"
4048 3. more than local specified specified
4049
4050 $ hg clone --quiet -U . ../remote3
4051 $ cd ../remote3
4052 $ hg update -q 7
4053 $ echo r > r
4054 $ hg ci -Aqm 10
4055 $ log 'remote()'
4056 7
4057 $ log 'remote("a-b-c-")'
4058 2
4059 $ cd ../repo
4060 $ log 'remote(".a.b.c.", "../remote3")'
4061
4062 tests for concatenation of strings/symbols by "##"
4063
4064 $ try "278 ## '5f5' ## 1ee ## 'ce5'"
4065 (_concat
4066 (_concat
4067 (_concat
4068 (symbol '278')
4069 (string '5f5'))
4070 (symbol '1ee'))
4071 (string 'ce5'))
4072 * concatenated:
4073 (string '2785f51eece5')
4074 * set:
4075 <baseset [0]>
4076 0
4077
4078 $ echo 'cat4($1, $2, $3, $4) = $1 ## $2 ## $3 ## $4' >> .hg/hgrc
4079 $ try "cat4(278, '5f5', 1ee, 'ce5')"
4080 (func
4081 (symbol 'cat4')
4082 (list
4083 (symbol '278')
4084 (string '5f5')
4085 (symbol '1ee')
4086 (string 'ce5')))
4087 * expanded:
4088 (_concat
4089 (_concat
4090 (_concat
4091 (symbol '278')
4092 (string '5f5'))
4093 (symbol '1ee'))
4094 (string 'ce5'))
4095 * concatenated:
4096 (string '2785f51eece5')
4097 * set:
4098 <baseset [0]>
4099 0
4100
4101 (check concatenation in alias nesting)
4102
4103 $ echo 'cat2($1, $2) = $1 ## $2' >> .hg/hgrc
4104 $ echo 'cat2x2($1, $2, $3, $4) = cat2($1 ## $2, $3 ## $4)' >> .hg/hgrc
4105 $ log "cat2x2(278, '5f5', 1ee, 'ce5')"
4106 0
4107
4108 (check operator priority)
4109
4110 $ echo 'cat2n2($1, $2, $3, $4) = $1 ## $2 or $3 ## $4~2' >> .hg/hgrc
4111 $ log "cat2n2(2785f5, 1eece5, 24286f, 4ae135)"
4112 0
4113 4
4114
4115 $ cd ..
4116
4117 prepare repository that has "default" branches of multiple roots
4118
4119 $ hg init namedbranch
4120 $ cd namedbranch
4121
4122 $ echo default0 >> a
4123 $ hg ci -Aqm0
4124 $ echo default1 >> a
4125 $ hg ci -m1
4126
4127 $ hg branch -q stable
4128 $ echo stable2 >> a
4129 $ hg ci -m2
4130 $ echo stable3 >> a
4131 $ hg ci -m3
4132
4133 $ hg update -q null
4134 $ echo default4 >> a
4135 $ hg ci -Aqm4
4136 $ echo default5 >> a
4137 $ hg ci -m5
4138
4139 "null" revision belongs to "default" branch (issue4683)
4140
4141 $ log 'branch(null)'
4142 0
4143 1
4144 4
4145 5
4146
4147 "null" revision belongs to "default" branch, but it shouldn't appear in set
4148 unless explicitly specified (issue4682)
4149
4150 $ log 'children(branch(default))'
4151 1
4152 2
4153 5
4154
4155 $ cd ..
4156
4157 test author/desc/keyword in problematic encoding
4158 # unicode: cp932:
4159 # u30A2 0x83 0x41(= 'A')
4160 # u30C2 0x83 0x61(= 'a')
4161
4162 $ hg init problematicencoding
4163 $ cd problematicencoding
4164
4165 $ $PYTHON > setup.sh <<EOF
4166 > print u'''
4167 > echo a > text
4168 > hg add text
4169 > hg --encoding utf-8 commit -u '\u30A2' -m none
4170 > echo b > text
4171 > hg --encoding utf-8 commit -u '\u30C2' -m none
4172 > echo c > text
4173 > hg --encoding utf-8 commit -u none -m '\u30A2'
4174 > echo d > text
4175 > hg --encoding utf-8 commit -u none -m '\u30C2'
4176 > '''.encode('utf-8')
4177 > EOF
4178 $ sh < setup.sh
4179
4180 test in problematic encoding
4181 $ $PYTHON > test.sh <<EOF
4182 > print u'''
4183 > hg --encoding cp932 log --template '{rev}\\n' -r 'author(\u30A2)'
4184 > echo ====
4185 > hg --encoding cp932 log --template '{rev}\\n' -r 'author(\u30C2)'
4186 > echo ====
4187 > hg --encoding cp932 log --template '{rev}\\n' -r 'desc(\u30A2)'
4188 > echo ====
4189 > hg --encoding cp932 log --template '{rev}\\n' -r 'desc(\u30C2)'
4190 > echo ====
4191 > hg --encoding cp932 log --template '{rev}\\n' -r 'keyword(\u30A2)'
4192 > echo ====
4193 > hg --encoding cp932 log --template '{rev}\\n' -r 'keyword(\u30C2)'
4194 > '''.encode('cp932')
4195 > EOF
4196 $ sh < test.sh
4197 0
4198 ====
4199 1
4200 ====
4201 2
4202 ====
4203 3
4204 ====
4205 0
4206 2
4207 ====
4208 1
4209 3
4210
4211 test error message of bad revset
4212 $ hg log -r 'foo\\'
4213 hg: parse error at 3: syntax error in revset 'foo\\'
4214 [255]
4215
4216 $ cd ..
4217
4218 Test that revset predicate of extension isn't loaded at failure of
4219 loading it
4220
4221 $ cd repo
4222
4223 $ cat <<EOF > $TESTTMP/custompredicate.py
4224 > from mercurial import error, registrar, revset
4225 >
4226 > revsetpredicate = registrar.revsetpredicate()
4227 >
4228 > @revsetpredicate('custom1()')
4229 > def custom1(repo, subset, x):
4230 > return revset.baseset([1])
4231 >
4232 > raise error.Abort('intentional failure of loading extension')
4233 > EOF
4234 $ cat <<EOF > .hg/hgrc
4235 > [extensions]
4236 > custompredicate = $TESTTMP/custompredicate.py
4237 > EOF
4238
4239 $ hg debugrevspec "custom1()"
4240 *** failed to import extension custompredicate from $TESTTMP/custompredicate.py: intentional failure of loading extension
4241 hg: parse error: unknown identifier: custom1
4242 [255]
4243
4244 Test repo.anyrevs with customized revset overrides
4245
4246 $ cat > $TESTTMP/printprevset.py <<EOF
4247 > from mercurial import encoding, registrar
4248 > cmdtable = {}
4249 > command = registrar.command(cmdtable)
4250 > @command('printprevset')
4251 > def printprevset(ui, repo):
4252 > alias = {}
4253 > p = encoding.environ.get('P')
4254 > if p:
4255 > alias['P'] = p
4256 > revs = repo.anyrevs(['P'], user=True, localalias=alias)
4257 > ui.write('P=%r\n' % list(revs))
4258 > EOF
4259
4260 $ cat >> .hg/hgrc <<EOF
4261 > custompredicate = !
4262 > printprevset = $TESTTMP/printprevset.py
4263 > EOF
4264
4265 $ hg --config revsetalias.P=1 printprevset
4266 P=[1]
4267 $ P=3 hg --config revsetalias.P=2 printprevset
4268 P=[3]
4269
4270 $ cd ..
4271
4272 Test obsstore related revsets
4273
4274 $ hg init repo1
4275 $ cd repo1
4276 $ cat <<EOF >> .hg/hgrc
4277 > [experimental]
4278 > stabilization = createmarkers
4279 > EOF
4280
4281 $ hg debugdrawdag <<'EOS'
4282 > F G
4283 > |/ # split: B -> E, F
4284 > B C D E # amend: B -> C -> D
4285 > \|/ | # amend: F -> G
4286 > A A Z # amend: A -> Z
4287 > EOS
4288
4289 $ hg log -r 'successors(Z)' -T '{desc}\n'
4290 Z
4291
4292 $ hg log -r 'successors(F)' -T '{desc}\n'
4293 F
4294 G
4295
4296 $ hg tag --remove --local C D E F G
4297
4298 $ hg log -r 'successors(B)' -T '{desc}\n'
4299 B
4300 D
4301 E
4302 G
4303
4304 $ hg log -r 'successors(B)' -T '{desc}\n' --hidden
4305 B
4306 C
4307 D
4308 E
4309 F
4310 G
4311
4312 $ hg log -r 'successors(B)-obsolete()' -T '{desc}\n' --hidden
4313 D
4314 E
4315 G
4316
4317 $ hg log -r 'successors(B+A)-contentdivergent()' -T '{desc}\n'
4318 A
4319 Z
4320 B
4321
4322 $ hg log -r 'successors(B+A)-contentdivergent()-obsolete()' -T '{desc}\n'
4323 Z
4324
4325 Test `draft() & ::x` optimization
4326
4327 $ hg init $TESTTMP/repo2
4328 $ cd $TESTTMP/repo2
4329 $ hg debugdrawdag <<'EOS'
4330 > P5 S1
4331 > | |
4332 > S2 | D3
4333 > \|/
4334 > P4
4335 > |
4336 > P3 D2
4337 > | |
4338 > P2 D1
4339 > |/
4340 > P1
4341 > |
4342 > P0
4343 > EOS
4344 $ hg phase --public -r P5
4345 $ hg phase --force --secret -r S1+S2
4346 $ hg log -G -T '{rev} {desc} {phase}' -r 'sort(all(), topo, topo.firstbranch=P5)'
4347 o 8 P5 public
4348 |
4349 | o 10 S1 secret
4350 | |
4351 | o 7 D3 draft
4352 |/
4353 | o 9 S2 secret
4354 |/
4355 o 6 P4 public
4356 |
4357 o 5 P3 public
4358 |
4359 o 3 P2 public
4360 |
4361 | o 4 D2 draft
4362 | |
4363 | o 2 D1 draft
4364 |/
4365 o 1 P1 public
4366 |
4367 o 0 P0 public
4368
4369 $ hg debugrevspec --verify -p analyzed -p optimized 'draft() & ::(((S1+D1+P5)-D3)+S2)'
4370 * analyzed:
4371 (and
4372 (func
4373 (symbol 'draft')
4374 None)
4375 (func
4376 (symbol 'ancestors')
4377 (or
4378 (list
4379 (and
4380 (or
4381 (list
4382 (symbol 'S1')
4383 (symbol 'D1')
4384 (symbol 'P5')))
4385 (not
4386 (symbol 'D3')))
4387 (symbol 'S2')))))
4388 * optimized:
4389 (func
4390 (symbol '_phaseandancestors')
4391 (list
4392 (symbol 'draft')
4393 (or
4394 (list
4395 (difference
4396 (func
4397 (symbol '_list')
4398 (string 'S1\x00D1\x00P5'))
4399 (symbol 'D3'))
4400 (symbol 'S2')))))
4401 $ hg debugrevspec --verify -p analyzed -p optimized 'secret() & ::9'
4402 * analyzed:
4403 (and
4404 (func
4405 (symbol 'secret')
4406 None)
4407 (func
4408 (symbol 'ancestors')
4409 (symbol '9')))
4410 * optimized:
4411 (func
4412 (symbol '_phaseandancestors')
4413 (list
4414 (symbol 'secret')
4415 (symbol '9')))
4416 $ hg debugrevspec --verify -p analyzed -p optimized '7 & ( (not public()) & ::(tag()) )'
4417 * analyzed:
4418 (and
4419 (symbol '7')
4420 (and
4421 (not
4422 (func
4423 (symbol 'public')
4424 None))
4425 (func
4426 (symbol 'ancestors')
4427 (func
4428 (symbol 'tag')
4429 None))))
4430 * optimized:
4431 (and
4432 (symbol '7')
4433 (func
4434 (symbol '_phaseandancestors')
4435 (list
4436 (symbol '_notpublic')
4437 (func
4438 (symbol 'tag')
4439 None))))
4440 $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, 1)'
4441 * optimized:
4442 (and
4443 (func
4444 (symbol '_notpublic')
4445 None)
4446 (func
4447 (symbol 'ancestors')
4448 (list
4449 (func
4450 (symbol '_list')
4451 (string 'S1\x00D2\x00P5'))
4452 (symbol '1'))))
4453 $ hg debugrevspec --verify -p optimized '(not public()) & ancestors(S1+D2+P5, depth=1)'
4454 * optimized:
4455 (and
4456 (func
4457 (symbol '_notpublic')
4458 None)
4459 (func
4460 (symbol 'ancestors')
4461 (list
4462 (func
4463 (symbol '_list')
4464 (string 'S1\x00D2\x00P5'))
4465 (keyvalue
4466 (symbol 'depth')
4467 (symbol '1')))))