# HG changeset patch # User Raphaël Gomès # Date 1647856550 -3600 # Node ID c80544aa4971f0f50a11c45bddd731e092702be4 # Parent 6b31c0676147df5d84f6e484aaf1b037ec010d43# Parent bd752712ccaf711770d195bfaa8fb5a401df661d branching: merge stable into default diff -r 6b31c0676147 -r c80544aa4971 contrib/heptapod-ci.yml --- a/contrib/heptapod-ci.yml Fri Mar 18 17:39:06 2022 +0100 +++ b/contrib/heptapod-ci.yml Mon Mar 21 10:55:50 2022 +0100 @@ -7,7 +7,7 @@ variables: PYTHON: python TEST_HGMODULEPOLICY: "allow" - HG_CI_IMAGE_TAG: "latest" + HG_CI_IMAGE_TAG: "v1.0" TEST_HGTESTS_ALLOW_NETIO: "0" .all_template: &all diff -r 6b31c0676147 -r c80544aa4971 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Fri Mar 18 17:39:06 2022 +0100 +++ b/mercurial/cmdutil.py Mon Mar 21 10:55:50 2022 +0100 @@ -2905,7 +2905,14 @@ filestoamend = {f for f in wctx.files() if matcher(f)} changes = len(filestoamend) > 0 - if changes: + changeset_copies = ( + repo.ui.config(b'experimental', b'copies.read-from') + != b'filelog-only' + ) + # If there are changes to amend or if copy information needs to be read + # from the changeset extras, we cannot take the fast path of using + # filectxs from the old commit. + if changes or changeset_copies: # Recompute copies (avoid recording a -> b -> a) copied = copies.pathcopies(base, wctx, matcher) if old.p2: @@ -2926,19 +2933,19 @@ def filectxfn(repo, ctx_, path): try: + # Return None for removed files. + if path in wctx.removed(): + return None + # If the file being considered is not amongst the files - # to be amended, we should return the file context from the + # to be amended, we should use the file context from the # old changeset. This avoids issues when only some files in # the working copy are being amended but there are also # changes to other files from the old changeset. - if path not in filestoamend: - return old.filectx(path) - - # Return None for removed files. - if path in wctx.removed(): - return None - - fctx = wctx[path] + if path in filestoamend: + fctx = wctx[path] + else: + fctx = old.filectx(path) flags = fctx.flags() mctx = context.memfilectx( repo, diff -r 6b31c0676147 -r c80544aa4971 rust/hg-core/src/dirstate_tree/status.rs --- a/rust/hg-core/src/dirstate_tree/status.rs Fri Mar 18 17:39:06 2022 +0100 +++ b/rust/hg-core/src/dirstate_tree/status.rs Mon Mar 21 10:55:50 2022 +0100 @@ -47,6 +47,17 @@ ignore_files: Vec, options: StatusOptions, ) -> Result<(DirstateStatus<'on_disk>, Vec), StatusError> { + // Force the global rayon threadpool to not exceed 16 concurrent threads. + // This is a stop-gap measure until we figure out why using more than 16 + // threads makes `status` slower for each additional thread. + // We use `ok()` in case the global threadpool has already been + // instantiated in `rhg` or some other caller. + // TODO find the underlying cause and fix it, then remove this. + rayon::ThreadPoolBuilder::new() + .num_threads(16) + .build_global() + .ok(); + let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) = if options.list_ignored || options.list_unknown { let mut hasher = Sha1::new(); diff -r 6b31c0676147 -r c80544aa4971 tests/test-copies-in-changeset.t --- a/tests/test-copies-in-changeset.t Fri Mar 18 17:39:06 2022 +0100 +++ b/tests/test-copies-in-changeset.t Mon Mar 21 10:55:50 2022 +0100 @@ -316,6 +316,15 @@ a -> k #endif +Existing copy information is preserved by amend + $ hg cp a l + $ hg ci -m 'copy a to l' + $ hg showcopies + a -> l + $ hg ci --amend -m 'new description' + saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-*-amend.hg (glob) + $ hg showcopies + a -> l $ cd .. Test rebasing a commit with copy information diff -r 6b31c0676147 -r c80544aa4971 tests/test-racy-mutations.t --- a/tests/test-racy-mutations.t Fri Mar 18 17:39:06 2022 +0100 +++ b/tests/test-racy-mutations.t Mon Mar 21 10:55:50 2022 +0100 @@ -14,14 +14,7 @@ > f="\${WAITLOCK_FILE}" > start=\`date +%s\` > timeout=5 - > while [ \\( ! -f \$f \\) -a \\( ! -L \$f \\) ]; do - > now=\`date +%s\` - > if [ "\`expr \$now - \$start\`" -gt \$timeout ]; then - > echo "timeout: \$f was not created in \$timeout seconds (it is now \$(date +%s))" - > exit 1 - > fi - > sleep 0.1 - > done + > $RUNTESTDIR/testlib/wait-on-file "\$timeout" "\$f" > if [ \$# -gt 1 ]; then > cat "\$@" > fi