##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r52401:0239ebdd merge default
parent child Browse files
Show More
@@ -257,3 +257,4 b' 71bd09bebbe36a09569cbfb388f371433360056b'
257 257 136902b3a95db38854ebaf5198a627641065c2ea 0 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
@@ -273,3 +273,4 b' 71bd09bebbe36a09569cbfb388f371433360056b'
273 273 136902b3a95db38854ebaf5198a627641065c2ea 6.6.2
274 274 3fd1efb3ad124e6686c0fb66e6943cd8aeea5681 6.6.3
275 275 d1d48d18db37106b801ef6cb90955536458e7ffc 6.7rc0
276 c9ceb4f6025690167bdb245e530de6bac8baae95 6.7
@@ -8,7 +8,7 b''
8 8
9 9 "Don't use a chainsaw to cut your food!"
10 10
11 The chainsaw extension provides commands that are so much geared towards a
11 The chainsaw is a collection of commands that are so much geared towards a
12 12 specific use case in a specific context or environment that they are totally
13 13 inappropriate and **really dangerous** in other contexts.
14 14
@@ -21,25 +21,20 b' variable (see :hg:`help scripting`).'
21 21
22 22 import shutil
23 23
24 from mercurial.i18n import _
25 from mercurial import (
24 from ..i18n import _
25 from .. import (
26 26 cmdutil,
27 27 commands,
28 28 error,
29 29 localrepo,
30 30 registrar,
31 31 )
32 from mercurial.utils import (
32 from ..utils import (
33 33 urlutil,
34 34 )
35 35
36 36 cmdtable = {}
37 37 command = registrar.command(cmdtable)
38 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
39 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
40 # be specifying the version(s) of Mercurial they are tested with, or
41 # leave the attribute unspecified.
42 testedwith = b'ships-with-hg-core'
43 38
44 39
45 40 @command(
@@ -6,11 +6,12 b''
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from .i18n import _
9 from .admin import verify
9 from .admin import chainsaw, verify
10 10 from . import error, registrar, transaction
11 11
12 12
13 13 table = {}
14 table.update(chainsaw.command._table)
14 15 command = registrar.command(table)
15 16
16 17
@@ -880,7 +880,7 b' class revbranchcache:'
880 880
881 881 if self._names:
882 882 try:
883 if repo.ui.configbool(b'format', b'mmap-revbranchcache'):
883 if repo.ui.configbool(b'storage', b'revbranchcache.mmap'):
884 884 with repo.cachevfs(_rbcrevs) as fp:
885 885 data = util.buffer(util.mmapread(fp))
886 886 else:
@@ -583,6 +583,11 b' default-type = "list_type"'
583 583
584 584 [[items]]
585 585 section = "devel"
586 name = "lock-wait-sync-file"
587 default = ""
588
589 [[items]]
590 section = "devel"
586 591 name = "persistent-nodemap"
587 592 default = false
588 593 documentation = """When true, revlogs use a special reference version of the \
@@ -1160,6 +1165,19 b' name = "[^:]*:required"'
1160 1165 default = false
1161 1166 generic = true
1162 1167
1168
1169 # The format section is dedicated to control of the repository on disk format
1170 # and constraints.
1171 #
1172 # A format change affects which data is expected to be stored in the repository
1173 # and how. It impacts other client whichever their version are, format change
1174 # often comes with an associated entry in the requirements.
1175 #
1176 # The option are usually in the form `use-xxx-yyy` (with xxx-yy the feature name).
1177 #
1178 # To configure details of how the repository is accessed, without affect the
1179 # repository formats, see the `storage section`.
1180
1163 1181 [[items]]
1164 1182 section = "format"
1165 1183 name = "bookmarks-in-store"
@@ -2102,6 +2120,15 b' name = "missingwarning"'
2102 2120 default = true
2103 2121 experimental = true
2104 2122
2123
2124 # The "storage" section house config options that change how the repository
2125 # data are accessed by the current process but does not affects the on disk
2126 # format. They can also adjust how the storage is computed, but without affect
2127 # compatibility wither other clients.
2128 #
2129 # For deeper format change, see the `format` section.
2130
2131
2105 2132 [[items]]
2106 2133 section = "storage"
2107 2134 name = "dirstate-v2.slow-path"
@@ -2110,6 +2137,11 b' experimental = true # experimental as l'
2110 2137
2111 2138 [[items]]
2112 2139 section = "storage"
2140 name = "revbranchcache.mmap"
2141 default = true
2142
2143 [[items]]
2144 section = "storage"
2113 2145 name = "new-repo-backend"
2114 2146 default = "revlogv1"
2115 2147 experimental = true
@@ -2913,8 +2945,3 b' section = "blackbox"'
2913 2945 name = "date-format"
2914 2946 default = ""
2915 2947 in_core_extension = "blackbox"
2916
2917 [[items]]
2918 section = "format"
2919 name = "mmap-revbranchcache"
2920 default = false
@@ -1563,7 +1563,6 b' class curseschunkselector:'
1563 1563 def sigwinchhandler(self, n, frame):
1564 1564 """handle window resizing"""
1565 1565 try:
1566 curses.endwin()
1567 1566 self.xscreensize, self.yscreensize = scmutil.termsize(self.ui)
1568 1567 self.statuswin.resize(self.numstatuslines, self.xscreensize)
1569 1568 self.numpadlines = self.getnumlinesdisplayed(ignorefolding=True) + 1
@@ -1694,7 +1693,6 b' smaller changesets. the following are va'
1694 1693
1695 1694 curses.raw()
1696 1695 curses.def_prog_mode()
1697 curses.endwin()
1698 1696 self.commenttext = self.ui.edit(self.commenttext, self.ui.username())
1699 1697 curses.cbreak()
1700 1698 self.stdscr.refresh()
@@ -3072,6 +3072,9 b' class localrepository:'
3072 3072 warntimeout = self.ui.configint(b"ui", b"timeout.warn")
3073 3073 # internal config: ui.signal-safe-lock
3074 3074 signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
3075 sync_file = self.ui.config(b'devel', b'lock-wait-sync-file')
3076 if not sync_file:
3077 sync_file = None
3075 3078
3076 3079 l = lockmod.trylock(
3077 3080 self.ui,
@@ -3083,6 +3086,7 b' class localrepository:'
3083 3086 acquirefn=acquirefn,
3084 3087 desc=desc,
3085 3088 signalsafe=signalsafe,
3089 devel_wait_sync_file=sync_file,
3086 3090 )
3087 3091 return l
3088 3092
@@ -115,6 +115,7 b' def trylock(ui, vfs, lockname, timeout, '
115 115
116 116 This function is responsible to issue warnings and or debug messages about
117 117 the held lock while trying to acquires it."""
118 devel_wait_file = kwargs.pop("devel_wait_sync_file", None)
118 119
119 120 def printwarning(printer, locker):
120 121 """issue the usual "waiting on lock" message through any channel"""
@@ -150,6 +151,11 b' def trylock(ui, vfs, lockname, timeout, '
150 151 l._trylock()
151 152 break
152 153 except error.LockHeld as inst:
154 if devel_wait_file is not None:
155 # create the file to signal we are waiting
156 with open(devel_wait_file, 'w'):
157 pass
158
153 159 if delay == debugidx:
154 160 printwarning(ui.debug, inst.locker)
155 161 if delay == warningidx:
@@ -468,10 +468,10 b' def geteffectflag(source, successors):'
468 468
469 469 # Check if other meta has changed
470 470 changeextra = changectx.extra().items()
471 ctxmeta = list(filter(metanotblacklisted, changeextra))
471 ctxmeta = sorted(filter(metanotblacklisted, changeextra))
472 472
473 473 sourceextra = source.extra().items()
474 srcmeta = list(filter(metanotblacklisted, sourceextra))
474 srcmeta = sorted(filter(metanotblacklisted, sourceextra))
475 475
476 476 if ctxmeta != srcmeta:
477 477 effects |= METACHANGED
@@ -703,6 +703,7 b' class phasecache:'
703 703 return set()
704 704
705 705 # search for affected high phase changesets and roots
706 seen = set(new_revs)
706 707 push = heapq.heappush
707 708 pop = heapq.heappop
708 709 parents = cl.parentrevs
@@ -735,9 +736,11 b' class phasecache:'
735 736 # higher phases
736 737 delroots.add(current)
737 738 # schedule a walk down if needed
738 if p1_phase > targetphase:
739 if p1_phase > targetphase and p1 not in seen:
740 seen.add(p1)
739 741 push(revs, -p1)
740 if p2_phase > targetphase:
742 if p2_phase > targetphase and p2 not in seen:
743 seen.add(p2)
741 744 push(revs, -p2)
742 745 if p1_phase < targetphase and p2_phase < targetphase:
743 746 new_target_roots.add(current)
@@ -1,7 +1,4 b''
1 = Mercurial 6.7rc0 =
2
3 /!\ These are **tentative** release notes for the upcoming Mercurial 6.7.
4 Anything can be added or removed before the actual release.
1 = Mercurial 6.7 =
5 2
6 3 As usual, a *lot* of patches don't make it to this list.
7 4
@@ -20,6 +17,7 b" As usual, a *lot* of patches don't make "
20 17 * annotate: limit output to range of lines
21 18 * unbundle: faster computation of changed heads
22 19 * Large improvements of some of the phases code (23950e39281f)
20 * rust-filepatterns: export glob_to_re function
23 21
24 22 == New Experimental Features ==
25 23
@@ -41,6 +39,11 b" As usual, a *lot* of patches don't make "
41 39 * cext: fix potential memory leaks of list items appended with PyList_Append
42 40 * doc: document that labels must have a dot in them to have an effect
43 41 * debugformat: fix formatting for compression level
42 * obsutil: sort metadata before comparing in geteffectflag()
43 * crecord: drop calls to `curses.endwin()`
44 * rust-index: don't use mutable borrow for head-diff computation
45 * rust-index: don't use mutable borrow to computed filtered heads
46
44 47
45 48 == Backwards Compatibility Changes ==
46 49
@@ -73,7 +73,7 b' pub enum PatternSyntax {'
73 73 }
74 74
75 75 /// Transforms a glob pattern into a regex
76 fn glob_to_re(pat: &[u8]) -> Vec<u8> {
76 pub fn glob_to_re(pat: &[u8]) -> Vec<u8> {
77 77 let mut input = pat;
78 78 let mut res: Vec<u8> = vec![];
79 79 let mut group_depth = 0;
@@ -737,14 +737,11 b' impl RegexMatcher {'
737 737 }
738 738 }
739 739
740 /// Returns a function that matches an `HgPath` against the given regex
741 /// pattern.
740 /// Return a `RegexBuilder` from a bytes pattern
742 741 ///
743 /// This can fail when the pattern is invalid or not supported by the
744 /// underlying engine (the `regex` crate), for instance anything with
745 /// back-references.
746 #[logging_timer::time("trace")]
747 fn re_matcher(pattern: &[u8]) -> PatternResult<RegexMatcher> {
742 /// This works around the fact that even if it works on byte haysacks,
743 /// [`regex::bytes::Regex`] still uses UTF-8 patterns.
744 pub fn re_bytes_builder(pattern: &[u8]) -> regex::bytes::RegexBuilder {
748 745 use std::io::Write;
749 746
750 747 // The `regex` crate adds `.*` to the start and end of expressions if there
@@ -764,7 +761,18 b' fn re_matcher(pattern: &[u8]) -> Pattern'
764 761 // # Safety
765 762 // This is safe because we escaped all non-ASCII bytes.
766 763 let pattern_string = unsafe { String::from_utf8_unchecked(escaped_bytes) };
767 let re = regex::bytes::RegexBuilder::new(&pattern_string)
764 regex::bytes::RegexBuilder::new(&pattern_string)
765 }
766
767 /// Returns a function that matches an `HgPath` against the given regex
768 /// pattern.
769 ///
770 /// This can fail when the pattern is invalid or not supported by the
771 /// underlying engine (the `regex` crate), for instance anything with
772 /// back-references.
773 #[logging_timer::time("trace")]
774 fn re_matcher(pattern: &[u8]) -> PatternResult<RegexMatcher> {
775 let re = re_bytes_builder(pattern)
768 776 .unicode(false)
769 777 // Big repos with big `.hgignore` will hit the default limit and
770 778 // incur a significant performance hit. One repo's `hg status` hit
@@ -854,7 +854,7 b' impl Index {'
854 854 ) -> PyResult<PyObject> {
855 855 let begin = begin.extract::<BaseRevision>(py)?;
856 856 let end = end.extract::<BaseRevision>(py)?;
857 let index = &mut *self.index(py).borrow_mut();
857 let index = &*self.index(py).borrow();
858 858 let begin =
859 859 Self::check_revision(index, UncheckedRevision(begin - 1), py)?;
860 860 let end = Self::check_revision(index, UncheckedRevision(end - 1), py)?;
@@ -873,7 +873,7 b' impl Index {'
873 873 py: Python,
874 874 filtered_revs: &PyObject,
875 875 ) -> PyResult<PyObject> {
876 let index = &mut *self.index(py).borrow_mut();
876 let index = &*self.index(py).borrow();
877 877 let filtered_revs = rev_pyiter_collect(py, filtered_revs, index)?;
878 878
879 879 if let Some(new_heads) = index
@@ -2,8 +2,8 b''
2 2
3 3 #if mmap
4 4 $ cat <<EOF >> $HGRCPATH
5 > [format]
6 > mmap-revbranchcache=true
5 > [storage]
6 > revbranchcache.mmap=true
7 7 > EOF
8 8 #endif
9 9
@@ -5,11 +5,6 b' Tests for the admin::chainsaw-update com'
5 5 setup
6 6 =====
7 7
8 $ cat >> $HGRCPATH << EOF
9 > [extensions]
10 > chainsaw=
11 > EOF
12
13 8 $ hg init src
14 9 $ cd src
15 10 $ echo 1 > root
@@ -288,7 +288,9 b' print only the last 10 lines, since we a'
288 288 preserved (since setprocname isn't available on py3 and pure version,
289 289 the 10th-most-recent line is different when using py3):
290 290
291 $ cat log/server.log.1 log/server.log | tail -10 | filterlog
291 (the "worker process exited" line is matched independently as it order is unstable with the "exiting" line, the worker might exit before the server decide to exit).
292
293 $ cat log/server.log.1 log/server.log | tail -10 | grep -v "worker process exited" | filterlog
292 294 YYYY/MM/DD HH:MM:SS (PID)> confighash = ... mtimehash = ... (no-setprocname !)
293 295 YYYY/MM/DD HH:MM:SS (PID)> forked worker process (pid=...)
294 296 YYYY/MM/DD HH:MM:SS (PID)> setprocname: ... (setprocname !)
@@ -298,8 +300,9 b' the 10th-most-recent line is different w'
298 300 YYYY/MM/DD HH:MM:SS (PID)> setenv: ...
299 301 YYYY/MM/DD HH:MM:SS (PID)> confighash = ... mtimehash = ...
300 302 YYYY/MM/DD HH:MM:SS (PID)> validate: []
303 YYYY/MM/DD HH:MM:SS (PID)> $TESTTMP/extreload/chgsock/server-... is not owned, exiting.
304 $ cat log/server.log.1 log/server.log | tail -10 | grep "worker process exited" | filterlog
301 305 YYYY/MM/DD HH:MM:SS (PID)> worker process exited (pid=...)
302 YYYY/MM/DD HH:MM:SS (PID)> $TESTTMP/extreload/chgsock/server-... is not owned, exiting.
303 306
304 307 global data mutated by schems
305 308 -----------------------------
@@ -3,6 +3,7 b' Show all commands except debug commands'
3 3 abort
4 4 add
5 5 addremove
6 admin::chainsaw-update
6 7 admin::verify
7 8 annotate
8 9 archive
@@ -66,6 +67,7 b' Show all commands that start with "a"'
66 67 abort
67 68 add
68 69 addremove
70 admin::chainsaw-update
69 71 admin::verify
70 72 annotate
71 73 archive
@@ -260,6 +262,7 b' Show all commands + options'
260 262 abort: dry-run
261 263 add: include, exclude, subrepos, dry-run
262 264 addremove: similarity, subrepos, include, exclude, dry-run
265 admin::chainsaw-update: purge-unknown, purge-ignored, rev, source, dest, initial-clone-minimal
263 266 admin::verify: check, option
264 267 annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, skip, line-range, ignore-all-space, ignore-space-change, ignore-blank-lines, ignore-space-at-eol, include, exclude, template
265 268 archive: no-decode, prefix, rev, type, subrepos, include, exclude
@@ -5,9 +5,12 b' regular equivalent. Test would fail if g'
5 5 implementation of parentdelta: third manifest revision would be fully
6 6 inserted due to big distance from its paren revision (zero).
7 7
8 (We disable the revlog compression to avoid the annoying instability in the chunk size that depends on the compressors implementation)
9
8 10 $ cat << EOF >> $HGRCPATH
9 11 > [format]
10 12 > sparse-revlog = no
13 > revlog-compression = none
11 14 > EOF
12 15
13 16 $ hg init repo --config format.generaldelta=no --config format.usegeneraldelta=no
@@ -138,12 +141,12 b' Test revlog.optimize-delta-parent-choice'
138 141
139 142 - Verify non-aggressive merge uses p1 (commit 1) as delta parent
140 143 $ hg merge -q 0
141 $ hg commit -q -m merge
144 $ hg commit -q -m merge --config storage.revlog.optimize-delta-parent-choice=no
142 145 $ hg debugdeltachain -m
143 146 rev p1 p2 chain# chainlen prev delta
144 147 0 -1 -1 1 1 -1 base
145 1 -1 -1 1 2 0 prev
146 2 1 0 1 2 0 p2
148 1 -1 -1 2 1 -1 base
149 2 1 0 2 2 1 p1
147 150
148 151 $ hg strip -q -r . --config extensions.strip=
149 152
@@ -154,7 +157,7 b' Test revlog.optimize-delta-parent-choice'
154 157 $ hg debugdeltachain -m
155 158 rev p1 p2 chain# chainlen prev delta
156 159 0 -1 -1 1 1 -1 base
157 1 -1 -1 1 2 0 prev
160 1 -1 -1 2 1 -1 base
158 161 2 1 0 1 2 0 p2
159 162
160 163 Test that strip bundle use bundle2
@@ -266,13 +269,13 b' test maxdeltachainspan'
266 269 46 45 -1 3 29 45 p1 58 1334 1671 1.25262 1671 0 0.00000
267 270 47 46 -1 3 30 46 p1 58 1380 1729 1.25290 1729 0 0.00000
268 271 48 47 -1 3 31 47 p1 58 1426 1787 1.25316 1787 0 0.00000
269 49 5 -1 4 1 -1 base ??? 316 ??? 0.6???? ??? 0 0.00000 (glob)
270 50 49 -1 4 2 49 p1 58 362 2?? 0.7???? 2?? 0 0.00000 (glob)
271 51 17 -1 4 3 50 prev 3?? 5?? 6?? 1.0???? 6?? 0 0.00000 (glob)
272 52 51 -1 4 4 51 p1 58 640 6?? 1.0???? 6?? 0 0.00000 (glob)
273 53 52 -1 5 1 -1 base 0 0 0 0.00000 0 0 0.00000
274 54 53 -1 5 2 53 p1 3?? 640 3?? 0.5???? 3?? 0 0.00000 (glob)
275 $ hg clone --pull source-repo --config experimental.maxdeltachainspan=2800 relax-chain --config format.generaldelta=yes
272 49 5 -1 4 1 -1 base 317 316 317 1.00316 317 0 0.00000
273 50 49 -1 4 2 49 p1 58 362 375 1.03591 375 0 0.00000
274 51 17 -1 5 1 -1 base 595 594 595 1.00168 595 0 0.00000
275 52 51 -1 5 2 51 p1 58 640 653 1.02031 653 0 0.00000
276 53 52 -1 6 1 -1 base 0 0 0 0.00000 0 0 0.00000
277 54 53 -1 7 1 -1 base 641 640 641 1.00156 641 0 0.00000
278 $ hg clone --pull source-repo --config experimental.maxdeltachainspan=2900 relax-chain --config format.generaldelta=yes
276 279 requesting all changes
277 280 adding changesets
278 281 adding manifests
@@ -332,12 +335,12 b' test maxdeltachainspan'
332 335 46 45 -1 3 29 45 p1 58 1334 1671 1.25262 1671 0 0.00000
333 336 47 46 -1 3 30 46 p1 58 1380 1729 1.25290 1729 0 0.00000
334 337 48 47 -1 3 31 47 p1 58 1426 1787 1.25316 1787 0 0.00000
335 49 5 -1 4 1 -1 base ??? 316 ??? 0.6???? ??? 0 0.00000 (glob)
336 50 49 -1 4 2 49 p1 58 362 2?? 0.7???? 2?? 0 0.00000 (glob)
337 51 17 -1 2 13 17 p1 58 594 739 1.24411 278? 20?? 2.7???? (glob)
338 52 51 -1 5 1 -1 base 3?? 640 3?? 0.5???? 3?? 0 0.00000 (glob)
338 49 5 -1 1 7 5 p1 58 316 389 1.23101 2857 2468 6.34447
339 50 49 -1 4 1 -1 base 363 362 363 1.00276 363 0 0.00000
340 51 17 -1 5 1 -1 base 595 594 595 1.00168 595 0 0.00000
341 52 51 -1 5 2 51 p1 58 640 653 1.02031 653 0 0.00000
339 342 53 52 -1 6 1 -1 base 0 0 0 0.00000 0 0 0.00000
340 54 53 -1 7 1 -1 base 3?? 640 3?? 0.5???? 3?? 0 0.00000 (glob)
343 54 53 -1 7 1 -1 base 641 640 641 1.00156 641 0 0.00000
341 344 $ hg clone --pull source-repo --config experimental.maxdeltachainspan=0 noconst-chain --config format.usegeneraldelta=yes --config storage.revlog.reuse-external-delta-parent=no
342 345 requesting all changes
343 346 adding changesets
@@ -403,4 +406,4 b' test maxdeltachainspan'
403 406 51 17 -1 2 13 17 p1 58 594 739 1.24411 2642 1903 2.57510
404 407 52 51 -1 2 14 51 p1 58 640 797 1.24531 2700 1903 2.38770
405 408 53 52 -1 4 1 -1 base 0 0 0 0.00000 0 0 0.00000
406 54 53 -1 5 1 -1 base 3?? 640 3?? 0.5???? 3?? 0 0.00000 (glob)
409 54 53 -1 5 1 -1 base 641 640 641 1.00156 641 0 0.00000
@@ -412,6 +412,9 b' Test short command list with verbose opt'
412 412
413 413 abort abort an unfinished operation (EXPERIMENTAL)
414 414 add add the specified files on the next commit
415 admin::chainsaw-update, admin::chainsawupdate
416 pull and update to a given revision, no matter what,
417 (EXPERIMENTAL)
415 418 annotate, blame
416 419 show changeset information by line for each file
417 420 clone make a copy of an existing repository
@@ -2535,6 +2538,13 b' Dish up an empty repo; serve it cold.'
2535 2538 add the specified files on the next commit
2536 2539 </td></tr>
2537 2540 <tr><td>
2541 <a href="/help/admin::chainsaw-update">
2542 admin::chainsaw-update
2543 </a>
2544 </td><td>
2545 pull and update to a given revision, no matter what, (EXPERIMENTAL)
2546 </td></tr>
2547 <tr><td>
2538 2548 <a href="/help/annotate">
2539 2549 annotate
2540 2550 </a>
@@ -2038,6 +2038,10 b' help/ shows help topics'
2038 2038 "topic": "add"
2039 2039 },
2040 2040 {
2041 "summary": "pull and update to a given revision, no matter what, (EXPERIMENTAL)",
2042 "topic": "admin::chainsaw-update"
2043 },
2044 {
2041 2045 "summary": "show changeset information by line for each file",
2042 2046 "topic": "annotate"
2043 2047 },
@@ -49,15 +49,32 b' Test that raising an exception in the re'
49 49
50 50 One process waiting for another
51 51
52 $ cat > hooks.py << EOF
53 > import time
54 > def sleepone(**x): time.sleep(1)
55 > def sleephalf(**x): time.sleep(0.5)
52 $ SYNC_FILE_LOCKED="$TESTTMP/sync-file-locked"
53 $ export SYNC_FILE_LOCKED
54 $ SYNC_FILE_TRYING_LOCK="$TESTTMP/sync-file-trying-lock"
55 $ export SYNC_FILE_TRYING_LOCK
56 $ cat << EOF > locker.sh
57 > $RUNTESTDIR/testlib/wait-on-file 10 $SYNC_FILE_TRYING_LOCK $SYNC_FILE_LOCKED;
58 > EOF
59 $ cat << EOF > waiter.sh
60 > $RUNTESTDIR/testlib/wait-on-file 10 $SYNC_FILE_LOCKED;
56 61 > EOF
62 $ clean_sync() {
63 > rm -f "$SYNC_FILE_LOCKED"
64 > rm -f "$SYNC_FILE_TRYING_LOCK"
65 > }
66
67
68 $ clean_sync
57 69 $ echo b > b/b
58 $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
59 $ hg -R b up -q --config ui.timeout.warn=0 --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
60 > > preup-stdout 2>preup-stderr
70 $ hg -R b ci -A -m b \
71 > --config hooks.precommit="sh $TESTTMP/locker.sh" \
72 > > stdout &
73 $ hg -R b up -q \
74 > --config ui.timeout.warn=0 \
75 > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \
76 > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \
77 > > preup-stdout 2> preup-stderr
61 78 $ wait
62 79 $ cat preup-stdout
63 80 $ cat preup-stderr
@@ -68,11 +85,16 b' One process waiting for another'
68 85
69 86 On processs waiting on another, warning after a long time.
70 87
88 $ clean_sync
71 89 $ echo b > b/c
72 $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
73 $ hg -R b up -q --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
74 > --config ui.timeout.warn=250 \
75 > > preup-stdout 2>preup-stderr
90 $ hg -R b ci -A -m b \
91 > --config hooks.precommit="sh $TESTTMP/locker.sh" \
92 > > stdout &
93 $ hg -R b up -q \
94 > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \
95 > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \
96 > --config ui.timeout.warn=250 \
97 > > preup-stdout 2> preup-stderr
76 98 $ wait
77 99 $ cat preup-stdout
78 100 $ cat preup-stderr
@@ -81,11 +103,16 b' On processs waiting on another, warning '
81 103
82 104 On processs waiting on another, warning disabled.
83 105
106 $ clean_sync
84 107 $ echo b > b/d
85 $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
86 $ hg -R b up -q --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
87 > --config ui.timeout.warn=-1 \
88 > > preup-stdout 2>preup-stderr
108 $ hg -R b ci -A -m b \
109 > --config hooks.precommit="sh $TESTTMP/locker.sh" \
110 > > stdout &
111 $ hg -R b up -q \
112 > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \
113 > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \
114 > --config ui.timeout.warn=-1 \
115 > > preup-stdout 2>preup-stderr
89 116 $ wait
90 117 $ cat preup-stdout
91 118 $ cat preup-stderr
@@ -96,14 +123,19 b' check we still print debug output'
96 123
97 124 On processs waiting on another, warning after a long time (debug output on)
98 125
126 $ clean_sync
99 127 $ echo b > b/e
100 $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
101 $ hg -R b up --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
102 > --config ui.timeout.warn=250 --debug\
103 > > preup-stdout 2>preup-stderr
128 $ hg -R b ci -A -m b \
129 > --config hooks.precommit="sh $TESTTMP/locker.sh" \
130 > > stdout &
131 $ hg -R b up \
132 > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \
133 > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \
134 > --config ui.timeout.warn=250 --debug \
135 > > preup-stdout 2>preup-stderr
104 136 $ wait
105 137 $ cat preup-stdout
106 calling hook pre-update: hghook_pre-update.sleephalf
138 running hook pre-update: sh $TESTTMP/waiter.sh
107 139 waiting for lock on working directory of b held by process '*' on host '*' (glob)
108 140 got lock after * seconds (glob)
109 141 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -113,14 +145,19 b' On processs waiting on another, warning '
113 145
114 146 On processs waiting on another, warning disabled, (debug output on)
115 147
148 $ clean_sync
116 149 $ echo b > b/f
117 $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
118 $ hg -R b up --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
119 > --config ui.timeout.warn=-1 --debug\
120 > > preup-stdout 2>preup-stderr
150 $ hg -R b ci -A -m b \
151 > --config hooks.precommit="sh $TESTTMP/locker.sh" \
152 > > stdout &
153 $ hg -R b up \
154 > --config hooks.pre-update="sh $TESTTMP/waiter.sh" \
155 > --config devel.lock-wait-sync-file="$SYNC_FILE_TRYING_LOCK" \
156 > --config ui.timeout.warn=-1 --debug\
157 > > preup-stdout 2>preup-stderr
121 158 $ wait
122 159 $ cat preup-stdout
123 calling hook pre-update: hghook_pre-update.sleephalf
160 running hook pre-update: sh $TESTTMP/waiter.sh
124 161 waiting for lock on working directory of b held by process '*' on host '*' (glob)
125 162 got lock after * seconds (glob)
126 163 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -1,5 +1,15 b''
1 1 #require serve ssl
2 2
3 $ wait_log() {
4 > pattern="$1"
5 > for s in $TESTDIR/seq.py 10; do
6 > if grep "$pattern" $TESTTMP/log > /dev/null ; then
7 > break
8 > fi
9 > sleep 1
10 > done
11 > }
12
3 13 Set up SMTP server:
4 14
5 15 $ CERTSDIR="$TESTDIR/sslcerts"
@@ -47,6 +57,7 b' we are able to load CA certs:'
47 57 (?i)abort: .*?certificate.verify.failed.* (re)
48 58 [255]
49 59
60 $ wait_log "ssl error:"
50 61 $ cat ../log
51 62 * ssl error: * (glob)
52 63 $ : > ../log
@@ -62,6 +73,7 b' we are able to load CA certs:'
62 73 (?i)abort: .*?certificate.verify.failed.* (re)
63 74 [255]
64 75
76 $ wait_log "ssl error:"
65 77 $ cat ../log
66 78 * ssl error: * (glob)
67 79 $ : > ../log
@@ -83,6 +95,7 b' Without certificates:'
83 95 (see https://mercurial-scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this error or set hostsecurity.localhost:fingerprints=sha256:20:de:b3:ad:b4:cd:a5:42:f0:74:41:1c:a2:70:1e:da:6e:c0:5c:16:9e:e7:22:0f:f1:b7:e5:6e:e4:92:af:7e to trust this server)
84 96 [150]
85 97
98 $ wait_log "no hello:"
86 99 $ cat ../log
87 100 connection from * (glob)
88 101 no hello: b''
@@ -143,6 +156,7 b' With invalid certificates:'
143 156 (?i)abort: .*?certificate.verify.failed.* (re)
144 157 [255]
145 158
159 $ wait_log "ssl error:"
146 160 $ cat ../log
147 161 * ssl error: * (glob)
148 162 $ : > ../log
General Comments 0
You need to be logged in to leave comments. Login now