Show More
@@ -187,7 +187,7 b' osx:' | |||||
187 | PREFIX=/usr/local \ |
|
187 | PREFIX=/usr/local \ | |
188 | clean install |
|
188 | clean install | |
189 | mkdir -p $${OUTPUTDIR:-dist} |
|
189 | mkdir -p $${OUTPUTDIR:-dist} | |
190 |
HGVER=$$( |
|
190 | HGVER=$$(python contrib/genosxversion.py $(OSXVERSIONFLAGS) build/mercurial/Library/Python/2.7/site-packages/mercurial/__version__.py) && \ | |
191 | OSXVER=$$(sw_vers -productVersion | cut -d. -f1,2) && \ |
|
191 | OSXVER=$$(sw_vers -productVersion | cut -d. -f1,2) && \ | |
192 | pkgbuild --filter \\.DS_Store --root build/mercurial/ \ |
|
192 | pkgbuild --filter \\.DS_Store --root build/mercurial/ \ | |
193 | --identifier org.mercurial-scm.mercurial \ |
|
193 | --identifier org.mercurial-scm.mercurial \ |
@@ -406,7 +406,8 b' class revbranchcache(object):' | |||||
406 |
|
406 | |||
407 | # fast path: extract data from cache, use it if node is matching |
|
407 | # fast path: extract data from cache, use it if node is matching | |
408 | reponode = changelog.node(rev)[:_rbcnodelen] |
|
408 | reponode = changelog.node(rev)[:_rbcnodelen] | |
409 |
cachenode, branchidx = unpack_from( |
|
409 | cachenode, branchidx = unpack_from( | |
|
410 | _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx) | |||
410 | close = bool(branchidx & _rbccloseflag) |
|
411 | close = bool(branchidx & _rbccloseflag) | |
411 | if close: |
|
412 | if close: | |
412 | branchidx &= _rbcbranchidxmask |
|
413 | branchidx &= _rbcbranchidxmask |
@@ -3335,7 +3335,9 b' def log(ui, repo, *pats, **opts):' | |||||
3335 | revisions. |
|
3335 | revisions. | |
3336 |
|
3336 | |||
3337 | See :hg:`help templates` for more about pre-packaged styles and |
|
3337 | See :hg:`help templates` for more about pre-packaged styles and | |
3338 | specifying custom templates. |
|
3338 | specifying custom templates. The default template used by the log | |
|
3339 | command can be customized via the ``ui.logtemplate`` configuration | |||
|
3340 | setting. | |||
3339 |
|
3341 | |||
3340 | Returns 0 on success. |
|
3342 | Returns 0 on success. | |
3341 |
|
3343 |
@@ -208,10 +208,22 b' def getlatesttags(repo, ctx, cache, patt' | |||||
208 | latesttags[rev] = ctx.date()[0], 0, [t for t in sorted(tags)] |
|
208 | latesttags[rev] = ctx.date()[0], 0, [t for t in sorted(tags)] | |
209 | continue |
|
209 | continue | |
210 | try: |
|
210 | try: | |
211 | # The tuples are laid out so the right one can be found by |
|
211 | ptags = [latesttags[p.rev()] for p in ctx.parents()] | |
212 | # comparison. |
|
212 | if len(ptags) > 1: | |
213 | pdate, pdist, ptag = max( |
|
213 | if ptags[0][2] == ptags[1][2]: | |
214 | latesttags[p.rev()] for p in ctx.parents()) |
|
214 | # The tuples are laid out so the right one can be found by | |
|
215 | # comparison in this case. | |||
|
216 | pdate, pdist, ptag = max(ptags) | |||
|
217 | else: | |||
|
218 | def key(x): | |||
|
219 | changessincetag = len(repo.revs('only(%d, %s)', | |||
|
220 | ctx.rev(), x[2][0])) | |||
|
221 | # Smallest number of changes since tag wins. Date is | |||
|
222 | # used as tiebreaker. | |||
|
223 | return [-changessincetag, x[0]] | |||
|
224 | pdate, pdist, ptag = max(ptags, key=key) | |||
|
225 | else: | |||
|
226 | pdate, pdist, ptag = ptags[0] | |||
215 | except KeyError: |
|
227 | except KeyError: | |
216 | # Cache miss - recurse |
|
228 | # Cache miss - recurse | |
217 | todo.append(rev) |
|
229 | todo.append(rev) |
@@ -904,7 +904,8 b' class ui(object):' | |||||
904 | if not getattr(self.ferr, 'closed', False): |
|
904 | if not getattr(self.ferr, 'closed', False): | |
905 | self.ferr.flush() |
|
905 | self.ferr.flush() | |
906 | except IOError as inst: |
|
906 | except IOError as inst: | |
907 | raise error.StdioError(inst) |
|
907 | if inst.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): | |
|
908 | raise error.StdioError(inst) | |||
908 |
|
909 | |||
909 | def flush(self): |
|
910 | def flush(self): | |
910 | # opencode timeblockedsection because this is a critical path |
|
911 | # opencode timeblockedsection because this is a critical path | |
@@ -913,12 +914,14 b' class ui(object):' | |||||
913 | try: |
|
914 | try: | |
914 | self.fout.flush() |
|
915 | self.fout.flush() | |
915 | except IOError as err: |
|
916 | except IOError as err: | |
916 | raise error.StdioError(err) |
|
917 | if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): | |
|
918 | raise error.StdioError(err) | |||
917 | finally: |
|
919 | finally: | |
918 | try: |
|
920 | try: | |
919 | self.ferr.flush() |
|
921 | self.ferr.flush() | |
920 | except IOError as err: |
|
922 | except IOError as err: | |
921 | raise error.StdioError(err) |
|
923 | if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): | |
|
924 | raise error.StdioError(err) | |||
922 | finally: |
|
925 | finally: | |
923 | self._blockedtimes['stdio_blocked'] += \ |
|
926 | self._blockedtimes['stdio_blocked'] += \ | |
924 | (util.timer() - starttime) * 1000 |
|
927 | (util.timer() - starttime) * 1000 |
@@ -785,11 +785,11 b' try:' | |||||
785 | from distutils import cygwinccompiler |
|
785 | from distutils import cygwinccompiler | |
786 |
|
786 | |||
787 | # the -mno-cygwin option has been deprecated for years |
|
787 | # the -mno-cygwin option has been deprecated for years | |
788 | compiler = cygwinccompiler.Mingw32CCompiler |
|
788 | mingw32compilerclass = cygwinccompiler.Mingw32CCompiler | |
789 |
|
789 | |||
790 | class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler): |
|
790 | class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler): | |
791 | def __init__(self, *args, **kwargs): |
|
791 | def __init__(self, *args, **kwargs): | |
792 | compiler.__init__(self, *args, **kwargs) |
|
792 | mingw32compilerclass.__init__(self, *args, **kwargs) | |
793 | for i in 'compiler compiler_so linker_exe linker_so'.split(): |
|
793 | for i in 'compiler compiler_so linker_exe linker_so'.split(): | |
794 | try: |
|
794 | try: | |
795 | getattr(self, i).remove('-mno-cygwin') |
|
795 | getattr(self, i).remove('-mno-cygwin') | |
@@ -810,11 +810,11 b" if os.name == 'nt':" | |||||
810 | # effect. |
|
810 | # effect. | |
811 | from distutils import msvccompiler |
|
811 | from distutils import msvccompiler | |
812 |
|
812 | |||
813 | compiler = msvccompiler.MSVCCompiler |
|
813 | msvccompilerclass = msvccompiler.MSVCCompiler | |
814 |
|
814 | |||
815 | class HackedMSVCCompiler(msvccompiler.MSVCCompiler): |
|
815 | class HackedMSVCCompiler(msvccompiler.MSVCCompiler): | |
816 | def initialize(self): |
|
816 | def initialize(self): | |
817 | compiler.initialize(self) |
|
817 | msvccompilerclass.initialize(self) | |
818 | # "warning LNK4197: export 'func' specified multiple times" |
|
818 | # "warning LNK4197: export 'func' specified multiple times" | |
819 | self.ldflags_shared.append('/ignore:4197') |
|
819 | self.ldflags_shared.append('/ignore:4197') | |
820 | self.ldflags_shared_debug.append('/ignore:4197') |
|
820 | self.ldflags_shared_debug.append('/ignore:4197') |
@@ -883,7 +883,7 b' file specified by acl.config does not ex' | |||||
883 | added 3 changesets with 3 changes to 3 files |
|
883 | added 3 changesets with 3 changes to 3 files | |
884 | calling hook pretxnchangegroup.acl: hgext.acl.hook |
|
884 | calling hook pretxnchangegroup.acl: hgext.acl.hook | |
885 | acl: checking access for user "barney" |
|
885 | acl: checking access for user "barney" | |
886 |
error: pretxnchangegroup.acl hook raised an exception: [Errno |
|
886 | error: pretxnchangegroup.acl hook raised an exception: [Errno *] * (glob) | |
887 | bundle2-input-part: total payload size 1553 |
|
887 | bundle2-input-part: total payload size 1553 | |
888 | bundle2-input-bundle: 3 parts total |
|
888 | bundle2-input-bundle: 3 parts total | |
889 | transaction abort! |
|
889 | transaction abort! |
@@ -2871,95 +2871,189 b' latesttag:' | |||||
2871 |
|
2871 | |||
2872 | No tag set: |
|
2872 | No tag set: | |
2873 |
|
2873 | |||
2874 | $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' |
|
2874 | $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' | |
2875 | 5: null+5 |
|
2875 | @ 5: null+5 | |
2876 | 4: null+4 |
|
2876 | |\ | |
2877 |
|
|
2877 | | o 4: null+4 | |
2878 | 2: null+3 |
|
2878 | | | | |
2879 |
|
|
2879 | | o 3: null+3 | |
2880 | 0: null+1 |
|
2880 | | | | |
2881 |
|
2881 | o | 2: null+3 | ||
2882 | One common tag: longest path wins: |
|
2882 | |/ | |
|
2883 | o 1: null+2 | |||
|
2884 | | | |||
|
2885 | o 0: null+1 | |||
|
2886 | ||||
|
2887 | ||||
|
2888 | One common tag: longest path wins for {latesttagdistance}: | |||
2883 |
|
2889 | |||
2884 | $ hg tag -r 1 -m t1 -d '6 0' t1 |
|
2890 | $ hg tag -r 1 -m t1 -d '6 0' t1 | |
2885 | $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' |
|
2891 | $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' | |
2886 | 6: t1+4 |
|
2892 | @ 6: t1+4 | |
2887 | 5: t1+3 |
|
2893 | | | |
2888 |
|
|
2894 | o 5: t1+3 | |
2889 | 3: t1+1 |
|
2895 | |\ | |
2890 |
|
|
2896 | | o 4: t1+2 | |
2891 | 1: t1+0 |
|
2897 | | | | |
2892 | 0: null+1 |
|
2898 | | o 3: t1+1 | |
2893 |
|
2899 | | | | ||
2894 | One ancestor tag: more recent wins: |
|
2900 | o | 2: t1+1 | |
|
2901 | |/ | |||
|
2902 | o 1: t1+0 | |||
|
2903 | | | |||
|
2904 | o 0: null+1 | |||
|
2905 | ||||
|
2906 | ||||
|
2907 | One ancestor tag: closest wins: | |||
2895 |
|
2908 | |||
2896 | $ hg tag -r 2 -m t2 -d '7 0' t2 |
|
2909 | $ hg tag -r 2 -m t2 -d '7 0' t2 | |
2897 | $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' |
|
2910 | $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' | |
2898 | 7: t2+3 |
|
2911 | @ 7: t2+3 | |
2899 | 6: t2+2 |
|
2912 | | | |
2900 |
|
|
2913 | o 6: t2+2 | |
2901 | 4: t1+2 |
|
2914 | | | |
2902 |
|
|
2915 | o 5: t2+1 | |
2903 | 2: t2+0 |
|
2916 | |\ | |
2904 |
|
|
2917 | | o 4: t1+2 | |
2905 | 0: null+1 |
|
2918 | | | | |
2906 |
|
2919 | | o 3: t1+1 | ||
2907 | Two branch tags: more recent wins: |
|
2920 | | | | |
|
2921 | o | 2: t2+0 | |||
|
2922 | |/ | |||
|
2923 | o 1: t1+0 | |||
|
2924 | | | |||
|
2925 | o 0: null+1 | |||
|
2926 | ||||
|
2927 | ||||
|
2928 | Two branch tags: more recent wins if same number of changes: | |||
2908 |
|
2929 | |||
2909 | $ hg tag -r 3 -m t3 -d '8 0' t3 |
|
2930 | $ hg tag -r 3 -m t3 -d '8 0' t3 | |
2910 | $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' |
|
2931 | $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' | |
2911 | 8: t3+5 |
|
2932 | @ 8: t3+5 | |
2912 | 7: t3+4 |
|
2933 | | | |
2913 |
|
|
2934 | o 7: t3+4 | |
2914 | 5: t3+2 |
|
2935 | | | |
2915 |
|
|
2936 | o 6: t3+3 | |
2916 | 3: t3+0 |
|
2937 | | | |
2917 | 2: t2+0 |
|
2938 | o 5: t3+2 | |
2918 | 1: t1+0 |
|
2939 | |\ | |
2919 | 0: null+1 |
|
2940 | | o 4: t3+1 | |
|
2941 | | | | |||
|
2942 | | o 3: t3+0 | |||
|
2943 | | | | |||
|
2944 | o | 2: t2+0 | |||
|
2945 | |/ | |||
|
2946 | o 1: t1+0 | |||
|
2947 | | | |||
|
2948 | o 0: null+1 | |||
|
2949 | ||||
|
2950 | ||||
|
2951 | Two branch tags: fewest changes wins: | |||
|
2952 | ||||
|
2953 | $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter | |||
|
2954 | $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" | |||
|
2955 | @ 9: t4+5,6 | |||
|
2956 | | | |||
|
2957 | o 8: t4+4,5 | |||
|
2958 | | | |||
|
2959 | o 7: t4+3,4 | |||
|
2960 | | | |||
|
2961 | o 6: t4+2,3 | |||
|
2962 | | | |||
|
2963 | o 5: t4+1,2 | |||
|
2964 | |\ | |||
|
2965 | | o 4: t4+0,0 | |||
|
2966 | | | | |||
|
2967 | | o 3: t3+0,0 | |||
|
2968 | | | | |||
|
2969 | o | 2: t2+0,0 | |||
|
2970 | |/ | |||
|
2971 | o 1: t1+0,0 | |||
|
2972 | | | |||
|
2973 | o 0: null+1,1 | |||
|
2974 | ||||
2920 |
|
2975 | |||
2921 | Merged tag overrides: |
|
2976 | Merged tag overrides: | |
2922 |
|
2977 | |||
2923 | $ hg tag -r 5 -m t5 -d '9 0' t5 |
|
2978 | $ hg tag -r 5 -m t5 -d '9 0' t5 | |
2924 | $ hg tag -r 3 -m at3 -d '10 0' at3 |
|
2979 | $ hg tag -r 3 -m at3 -d '10 0' at3 | |
2925 | $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' |
|
2980 | $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' | |
2926 |
|
|
2981 | @ 11: t5+6 | |
2927 | 9: t5+4 |
|
2982 | | | |
2928 |
|
|
2983 | o 10: t5+5 | |
2929 | 7: t5+2 |
|
2984 | | | |
2930 |
|
|
2985 | o 9: t5+4 | |
2931 | 5: t5+0 |
|
2986 | | | |
2932 | 4: at3:t3+1 |
|
2987 | o 8: t5+3 | |
2933 | 3: at3:t3+0 |
|
2988 | | | |
2934 | 2: t2+0 |
|
2989 | o 7: t5+2 | |
2935 | 1: t1+0 |
|
2990 | | | |
2936 | 0: null+1 |
|
2991 | o 6: t5+1 | |
2937 |
|
2992 | | | ||
2938 | $ hg log --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" |
|
2993 | o 5: t5+0 | |
2939 | 10: t5+5,5 |
|
2994 | |\ | |
2940 | 9: t5+4,4 |
|
2995 | | o 4: t4+0 | |
2941 | 8: t5+3,3 |
|
2996 | | | | |
2942 | 7: t5+2,2 |
|
2997 | | o 3: at3:t3+0 | |
2943 | 6: t5+1,1 |
|
2998 | | | | |
2944 | 5: t5+0,0 |
|
2999 | o | 2: t2+0 | |
2945 | 4: at3+1,1 t3+1,1 |
|
3000 | |/ | |
2946 | 3: at3+0,0 t3+0,0 |
|
3001 | o 1: t1+0 | |
2947 | 2: t2+0,0 |
|
3002 | | | |
2948 | 1: t1+0,0 |
|
3003 | o 0: null+1 | |
2949 | 0: null+1,1 |
|
3004 | ||
2950 |
|
3005 | |||
2951 |
$ hg log --template "{rev}: {latesttag |
|
3006 | $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" | |
2952 | 10: t3, C: 8, D: 7 |
|
3007 | @ 11: t5+6,6 | |
2953 | 9: t3, C: 7, D: 6 |
|
3008 | | | |
2954 | 8: t3, C: 6, D: 5 |
|
3009 | o 10: t5+5,5 | |
2955 | 7: t3, C: 5, D: 4 |
|
3010 | | | |
2956 | 6: t3, C: 4, D: 3 |
|
3011 | o 9: t5+4,4 | |
2957 | 5: t3, C: 3, D: 2 |
|
3012 | | | |
2958 | 4: t3, C: 1, D: 1 |
|
3013 | o 8: t5+3,3 | |
2959 | 3: t3, C: 0, D: 0 |
|
3014 | | | |
2960 | 2: t1, C: 1, D: 1 |
|
3015 | o 7: t5+2,2 | |
2961 | 1: t1, C: 0, D: 0 |
|
3016 | | | |
2962 | 0: null, C: 1, D: 1 |
|
3017 | o 6: t5+1,1 | |
|
3018 | | | |||
|
3019 | o 5: t5+0,0 | |||
|
3020 | |\ | |||
|
3021 | | o 4: t4+0,0 | |||
|
3022 | | | | |||
|
3023 | | o 3: at3+0,0 t3+0,0 | |||
|
3024 | | | | |||
|
3025 | o | 2: t2+0,0 | |||
|
3026 | |/ | |||
|
3027 | o 1: t1+0,0 | |||
|
3028 | | | |||
|
3029 | o 0: null+1,1 | |||
|
3030 | ||||
|
3031 | ||||
|
3032 | $ hg log -G --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n" | |||
|
3033 | @ 11: t3, C: 9, D: 8 | |||
|
3034 | | | |||
|
3035 | o 10: t3, C: 8, D: 7 | |||
|
3036 | | | |||
|
3037 | o 9: t3, C: 7, D: 6 | |||
|
3038 | | | |||
|
3039 | o 8: t3, C: 6, D: 5 | |||
|
3040 | | | |||
|
3041 | o 7: t3, C: 5, D: 4 | |||
|
3042 | | | |||
|
3043 | o 6: t3, C: 4, D: 3 | |||
|
3044 | | | |||
|
3045 | o 5: t3, C: 3, D: 2 | |||
|
3046 | |\ | |||
|
3047 | | o 4: t3, C: 1, D: 1 | |||
|
3048 | | | | |||
|
3049 | | o 3: t3, C: 0, D: 0 | |||
|
3050 | | | | |||
|
3051 | o | 2: t1, C: 1, D: 1 | |||
|
3052 | |/ | |||
|
3053 | o 1: t1, C: 0, D: 0 | |||
|
3054 | | | |||
|
3055 | o 0: null, C: 1, D: 1 | |||
|
3056 | ||||
2963 |
|
3057 | |||
2964 | $ cd .. |
|
3058 | $ cd .. | |
2965 |
|
3059 | |||
@@ -2981,7 +3075,7 b' if it is a relative path' | |||||
2981 | > EOF |
|
3075 | > EOF | |
2982 |
|
3076 | |||
2983 | $ hg -R latesttag tip |
|
3077 | $ hg -R latesttag tip | |
2984 | test 10:9b4a630e5f5f |
|
3078 | test 11:97e5943b523a | |
2985 |
|
3079 | |||
2986 | Test recursive showlist template (issue1989): |
|
3080 | Test recursive showlist template (issue1989): | |
2987 |
|
3081 | |||
@@ -2994,7 +3088,7 b' Test recursive showlist template (issue1' | |||||
2994 |
|
3088 | |||
2995 | $ hg -R latesttag log -r tip --style=style1989 |
|
3089 | $ hg -R latesttag log -r tip --style=style1989 | |
2996 | M|test |
|
3090 | M|test | |
2997 |
1 |
|
3091 | 11,test | |
2998 | branch: test |
|
3092 | branch: test | |
2999 |
|
3093 | |||
3000 | Test new-style inline templating: |
|
3094 | Test new-style inline templating: | |
@@ -3027,6 +3121,7 b' Test the strip function with chars speci' | |||||
3027 | $ hg log -R latesttag --template '{desc}\n' |
|
3121 | $ hg log -R latesttag --template '{desc}\n' | |
3028 | at3 |
|
3122 | at3 | |
3029 | t5 |
|
3123 | t5 | |
|
3124 | t4 | |||
3030 | t3 |
|
3125 | t3 | |
3031 | t2 |
|
3126 | t2 | |
3032 | t1 |
|
3127 | t1 | |
@@ -3040,6 +3135,7 b' Test the strip function with chars speci' | |||||
3040 | $ hg log -R latesttag --template '{strip(desc, "te")}\n' |
|
3135 | $ hg log -R latesttag --template '{strip(desc, "te")}\n' | |
3041 | at3 |
|
3136 | at3 | |
3042 | 5 |
|
3137 | 5 | |
|
3138 | 4 | |||
3043 | 3 |
|
3139 | 3 | |
3044 | 2 |
|
3140 | 2 | |
3045 | 1 |
|
3141 | 1 | |
@@ -3055,6 +3151,7 b' Test date format:' | |||||
3055 | $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n' |
|
3151 | $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n' | |
3056 | date: 70 01 01 10 +0000 |
|
3152 | date: 70 01 01 10 +0000 | |
3057 | date: 70 01 01 09 +0000 |
|
3153 | date: 70 01 01 09 +0000 | |
|
3154 | date: 70 01 01 04 +0000 | |||
3058 | date: 70 01 01 08 +0000 |
|
3155 | date: 70 01 01 08 +0000 | |
3059 | date: 70 01 01 07 +0000 |
|
3156 | date: 70 01 01 07 +0000 | |
3060 | date: 70 01 01 06 +0000 |
|
3157 | date: 70 01 01 06 +0000 |
@@ -24,11 +24,10 b" os.utime('foo', (1000, 1000))" | |||||
24 | repo[None].add(['foo']) |
|
24 | repo[None].add(['foo']) | |
25 | repo.commit(text='commit1', date="0 0") |
|
25 | repo.commit(text='commit1', date="0 0") | |
26 |
|
26 | |||
|
27 | d = repo[None]['foo'].date() | |||
27 | if os.name == 'nt': |
|
28 | if os.name == 'nt': | |
28 | d = repo[None]['foo'].date() |
|
29 | d = d[:2] | |
29 |
|
|
30 | print("workingfilectx.date = (%d, %d)" % d) | |
30 | else: |
|
|||
31 | print("workingfilectx.date =", repo[None]['foo'].date()) |
|
|||
32 |
|
31 | |||
33 | # test memctx with non-ASCII commit message |
|
32 | # test memctx with non-ASCII commit message | |
34 |
|
33 |
@@ -210,3 +210,248 b' rollback disabled by config' | |||||
210 | abort: rollback is disabled because it is unsafe |
|
210 | abort: rollback is disabled because it is unsafe | |
211 | (see `hg help -v rollback` for information) |
|
211 | (see `hg help -v rollback` for information) | |
212 | [255] |
|
212 | [255] | |
|
213 | ||||
|
214 | $ cd .. | |||
|
215 | ||||
|
216 | I/O errors on stdio are handled properly (issue5658) | |||
|
217 | ||||
|
218 | $ cat > badui.py << EOF | |||
|
219 | > import errno | |||
|
220 | > from mercurial.i18n import _ | |||
|
221 | > from mercurial import ( | |||
|
222 | > error, | |||
|
223 | > ui as uimod, | |||
|
224 | > ) | |||
|
225 | > | |||
|
226 | > def pretxncommit(ui, repo, **kwargs): | |||
|
227 | > ui.warn('warn during pretxncommit\n') | |||
|
228 | > | |||
|
229 | > def pretxnclose(ui, repo, **kwargs): | |||
|
230 | > ui.warn('warn during pretxnclose\n') | |||
|
231 | > | |||
|
232 | > def txnclose(ui, repo, **kwargs): | |||
|
233 | > ui.warn('warn during txnclose\n') | |||
|
234 | > | |||
|
235 | > def txnabort(ui, repo, **kwargs): | |||
|
236 | > ui.warn('warn during abort\n') | |||
|
237 | > | |||
|
238 | > class fdproxy(object): | |||
|
239 | > def __init__(self, ui, o): | |||
|
240 | > self._ui = ui | |||
|
241 | > self._o = o | |||
|
242 | > | |||
|
243 | > def __getattr__(self, attr): | |||
|
244 | > return getattr(self._o, attr) | |||
|
245 | > | |||
|
246 | > def write(self, msg): | |||
|
247 | > errors = set(self._ui.configlist('ui', 'ioerrors', [])) | |||
|
248 | > pretxncommit = msg == 'warn during pretxncommit\n' | |||
|
249 | > pretxnclose = msg == 'warn during pretxnclose\n' | |||
|
250 | > txnclose = msg == 'warn during txnclose\n' | |||
|
251 | > txnabort = msg == 'warn during abort\n' | |||
|
252 | > msgabort = msg == _('transaction abort!\n') | |||
|
253 | > msgrollback = msg == _('rollback completed\n') | |||
|
254 | > | |||
|
255 | > if pretxncommit and 'pretxncommit' in errors: | |||
|
256 | > raise IOError(errno.EPIPE, 'simulated epipe') | |||
|
257 | > if pretxnclose and 'pretxnclose' in errors: | |||
|
258 | > raise IOError(errno.EIO, 'simulated eio') | |||
|
259 | > if txnclose and 'txnclose' in errors: | |||
|
260 | > raise IOError(errno.EBADF, 'simulated badf') | |||
|
261 | > if txnabort and 'txnabort' in errors: | |||
|
262 | > raise IOError(errno.EPIPE, 'simulated epipe') | |||
|
263 | > if msgabort and 'msgabort' in errors: | |||
|
264 | > raise IOError(errno.EBADF, 'simulated ebadf') | |||
|
265 | > if msgrollback and 'msgrollback' in errors: | |||
|
266 | > raise IOError(errno.EIO, 'simulated eio') | |||
|
267 | > | |||
|
268 | > return self._o.write(msg) | |||
|
269 | > | |||
|
270 | > def uisetup(ui): | |||
|
271 | > class badui(ui.__class__): | |||
|
272 | > def write_err(self, *args, **kwargs): | |||
|
273 | > olderr = self.ferr | |||
|
274 | > try: | |||
|
275 | > self.ferr = fdproxy(self, olderr) | |||
|
276 | > return super(badui, self).write_err(*args, **kwargs) | |||
|
277 | > finally: | |||
|
278 | > self.ferr = olderr | |||
|
279 | > | |||
|
280 | > ui.__class__ = badui | |||
|
281 | > | |||
|
282 | > def reposetup(ui, repo): | |||
|
283 | > ui.setconfig('hooks', 'pretxnclose.badui', pretxnclose, 'badui') | |||
|
284 | > ui.setconfig('hooks', 'txnclose.badui', txnclose, 'badui') | |||
|
285 | > ui.setconfig('hooks', 'pretxncommit.badui', pretxncommit, 'badui') | |||
|
286 | > ui.setconfig('hooks', 'txnabort.badui', txnabort, 'badui') | |||
|
287 | > EOF | |||
|
288 | ||||
|
289 | $ cat >> $HGRCPATH << EOF | |||
|
290 | > [extensions] | |||
|
291 | > badui = $TESTTMP/badui.py | |||
|
292 | > EOF | |||
|
293 | ||||
|
294 | An I/O error during pretxncommit is handled | |||
|
295 | ||||
|
296 | $ hg init ioerror-pretxncommit | |||
|
297 | $ cd ioerror-pretxncommit | |||
|
298 | $ echo 0 > foo | |||
|
299 | $ hg -q commit -A -m initial | |||
|
300 | warn during pretxncommit | |||
|
301 | warn during pretxnclose | |||
|
302 | warn during txnclose | |||
|
303 | $ echo 1 > foo | |||
|
304 | $ hg --config ui.ioerrors=pretxncommit commit -m 'error during pretxncommit' | |||
|
305 | warn during pretxnclose | |||
|
306 | warn during txnclose | |||
|
307 | ||||
|
308 | $ hg commit -m 'commit 1' | |||
|
309 | nothing changed | |||
|
310 | [1] | |||
|
311 | ||||
|
312 | $ cd .. | |||
|
313 | ||||
|
314 | An I/O error during pretxnclose is handled | |||
|
315 | ||||
|
316 | $ hg init ioerror-pretxnclose | |||
|
317 | $ cd ioerror-pretxnclose | |||
|
318 | $ echo 0 > foo | |||
|
319 | $ hg -q commit -A -m initial | |||
|
320 | warn during pretxncommit | |||
|
321 | warn during pretxnclose | |||
|
322 | warn during txnclose | |||
|
323 | ||||
|
324 | $ echo 1 > foo | |||
|
325 | $ hg --config ui.ioerrors=pretxnclose commit -m 'error during pretxnclose' | |||
|
326 | warn during pretxncommit | |||
|
327 | warn during txnclose | |||
|
328 | ||||
|
329 | $ hg commit -m 'commit 1' | |||
|
330 | nothing changed | |||
|
331 | [1] | |||
|
332 | ||||
|
333 | $ cd .. | |||
|
334 | ||||
|
335 | An I/O error during txnclose is handled | |||
|
336 | ||||
|
337 | $ hg init ioerror-txnclose | |||
|
338 | $ cd ioerror-txnclose | |||
|
339 | $ echo 0 > foo | |||
|
340 | $ hg -q commit -A -m initial | |||
|
341 | warn during pretxncommit | |||
|
342 | warn during pretxnclose | |||
|
343 | warn during txnclose | |||
|
344 | ||||
|
345 | $ echo 1 > foo | |||
|
346 | $ hg --config ui.ioerrors=txnclose commit -m 'error during txnclose' | |||
|
347 | warn during pretxncommit | |||
|
348 | warn during pretxnclose | |||
|
349 | ||||
|
350 | $ hg commit -m 'commit 1' | |||
|
351 | nothing changed | |||
|
352 | [1] | |||
|
353 | ||||
|
354 | $ cd .. | |||
|
355 | ||||
|
356 | An I/O error writing "transaction abort" is handled | |||
|
357 | ||||
|
358 | $ hg init ioerror-msgabort | |||
|
359 | $ cd ioerror-msgabort | |||
|
360 | ||||
|
361 | $ echo 0 > foo | |||
|
362 | $ hg -q commit -A -m initial | |||
|
363 | warn during pretxncommit | |||
|
364 | warn during pretxnclose | |||
|
365 | warn during txnclose | |||
|
366 | ||||
|
367 | $ echo 1 > foo | |||
|
368 | $ hg --config ui.ioerrors=msgabort --config hooks.pretxncommit=false commit -m 'error during abort message' | |||
|
369 | warn during abort | |||
|
370 | rollback completed | |||
|
371 | abort: pretxncommit hook exited with status 1 | |||
|
372 | [255] | |||
|
373 | ||||
|
374 | $ hg commit -m 'commit 1' | |||
|
375 | warn during pretxncommit | |||
|
376 | warn during pretxnclose | |||
|
377 | warn during txnclose | |||
|
378 | ||||
|
379 | $ cd .. | |||
|
380 | ||||
|
381 | An I/O error during txnabort should still result in rollback | |||
|
382 | ||||
|
383 | $ hg init ioerror-txnabort | |||
|
384 | $ cd ioerror-txnabort | |||
|
385 | ||||
|
386 | $ echo 0 > foo | |||
|
387 | $ hg -q commit -A -m initial | |||
|
388 | warn during pretxncommit | |||
|
389 | warn during pretxnclose | |||
|
390 | warn during txnclose | |||
|
391 | ||||
|
392 | $ echo 1 > foo | |||
|
393 | $ hg --config ui.ioerrors=txnabort --config hooks.pretxncommit=false commit -m 'error during abort' | |||
|
394 | transaction abort! | |||
|
395 | rollback completed | |||
|
396 | abort: pretxncommit hook exited with status 1 | |||
|
397 | [255] | |||
|
398 | ||||
|
399 | $ hg commit -m 'commit 1' | |||
|
400 | warn during pretxncommit | |||
|
401 | warn during pretxnclose | |||
|
402 | warn during txnclose | |||
|
403 | ||||
|
404 | $ cd .. | |||
|
405 | ||||
|
406 | An I/O error writing "rollback completed" is handled | |||
|
407 | ||||
|
408 | $ hg init ioerror-msgrollback | |||
|
409 | $ cd ioerror-msgrollback | |||
|
410 | ||||
|
411 | $ echo 0 > foo | |||
|
412 | $ hg -q commit -A -m initial | |||
|
413 | warn during pretxncommit | |||
|
414 | warn during pretxnclose | |||
|
415 | warn during txnclose | |||
|
416 | ||||
|
417 | $ echo 1 > foo | |||
|
418 | ||||
|
419 | $ hg --config ui.ioerrors=msgrollback --config hooks.pretxncommit=false commit -m 'error during rollback message' | |||
|
420 | transaction abort! | |||
|
421 | warn during abort | |||
|
422 | abort: pretxncommit hook exited with status 1 | |||
|
423 | [255] | |||
|
424 | ||||
|
425 | $ hg verify | |||
|
426 | checking changesets | |||
|
427 | checking manifests | |||
|
428 | crosschecking files in changesets and manifests | |||
|
429 | checking files | |||
|
430 | 1 files, 1 changesets, 1 total revisions | |||
|
431 | ||||
|
432 | $ cd .. | |||
|
433 | ||||
|
434 | Multiple I/O errors after transaction open are handled. | |||
|
435 | This is effectively what happens if a peer disconnects in the middle | |||
|
436 | of a transaction. | |||
|
437 | ||||
|
438 | $ hg init ioerror-multiple | |||
|
439 | $ cd ioerror-multiple | |||
|
440 | $ echo 0 > foo | |||
|
441 | $ hg -q commit -A -m initial | |||
|
442 | warn during pretxncommit | |||
|
443 | warn during pretxnclose | |||
|
444 | warn during txnclose | |||
|
445 | ||||
|
446 | $ echo 1 > foo | |||
|
447 | ||||
|
448 | $ hg --config ui.ioerrors=pretxncommit,pretxnclose,txnclose,txnabort,msgabort,msgrollback commit -m 'multiple errors' | |||
|
449 | ||||
|
450 | $ hg verify | |||
|
451 | checking changesets | |||
|
452 | checking manifests | |||
|
453 | crosschecking files in changesets and manifests | |||
|
454 | checking files | |||
|
455 | 1 files, 2 changesets, 2 total revisions | |||
|
456 | ||||
|
457 | $ cd .. |
@@ -381,7 +381,7 b' Errors writing to .hgtags fnodes cache a' | |||||
381 |
|
381 | |||
382 | $ hg blackbox -l 6 |
|
382 | $ hg blackbox -l 6 | |
383 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags |
|
383 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags | |
384 |
1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> couldn't write cache/hgtagsfnodes1: [Errno |
|
384 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> couldn't write cache/hgtagsfnodes1: [Errno *] * (glob) | |
385 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> 2/3 cache hits/lookups in * seconds (glob) |
|
385 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> 2/3 cache hits/lookups in * seconds (glob) | |
386 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> writing .hg/cache/tags2-visible with 1 tags |
|
386 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> writing .hg/cache/tags2-visible with 1 tags | |
387 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags exited 0 after * seconds (glob) |
|
387 | 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags exited 0 after * seconds (glob) |
General Comments 0
You need to be logged in to leave comments.
Login now