--- a/.hgsigs Sat Jun 11 00:26:25 2022 +0200
+++ b/.hgsigs Thu Jun 16 15:20:48 2022 +0200
@@ -228,3 +228,4 @@
5bd6bcd31dd1ebb63b8914b00064f96297267af7 0 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
--- a/.hgtags Sat Jun 11 00:26:25 2022 +0200
+++ b/.hgtags Thu Jun 16 15:20:48 2022 +0200
@@ -241,3 +241,4 @@
5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
+0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
--- a/mercurial/commands.py Sat Jun 11 00:26:25 2022 +0200
+++ b/mercurial/commands.py Thu Jun 16 15:20:48 2022 +0200
@@ -2086,10 +2086,17 @@
extra[b'close'] = b'1'
if repo[b'.'].closesbranch():
- raise error.InputError(
- _(b'current revision is already a branch closing head')
- )
- elif not bheads:
+ # Not ideal, but let us do an extra status early to prevent early
+ # bail out.
+ matcher = scmutil.match(repo[None], pats, opts)
+ s = repo.status(match=matcher)
+ if s.modified or s.added or s.removed:
+ bheads = repo.branchheads(branch, closed=True)
+ else:
+ msg = _(b'current revision is already a branch closing head')
+ raise error.InputError(msg)
+
+ if not bheads:
raise error.InputError(
_(b'branch "%s" has no heads to close') % branch
)
--- a/mercurial/logcmdutil.py Sat Jun 11 00:26:25 2022 +0200
+++ b/mercurial/logcmdutil.py Thu Jun 16 15:20:48 2022 +0200
@@ -376,10 +376,9 @@
self._exthook(ctx)
if self.ui.debugflag:
- files = ctx.p1().status(ctx)
for key, value in zip(
[b'files', b'files+', b'files-'],
- [files.modified, files.added, files.removed],
+ [ctx.filesmodified(), ctx.filesadded(), ctx.filesremoved()],
):
if value:
self.ui.write(
@@ -511,11 +510,10 @@
or b'added' in datahint
or b'removed' in datahint
):
- files = ctx.p1().status(ctx)
fm.data(
- modified=fm.formatlist(files.modified, name=b'file'),
- added=fm.formatlist(files.added, name=b'file'),
- removed=fm.formatlist(files.removed, name=b'file'),
+ modified=fm.formatlist(ctx.filesmodified(), name=b'file'),
+ added=fm.formatlist(ctx.filesadded(), name=b'file'),
+ removed=fm.formatlist(ctx.filesremoved(), name=b'file'),
)
verbose = not self.ui.debugflag and self.ui.verbose
--- a/mercurial/merge.py Sat Jun 11 00:26:25 2022 +0200
+++ b/mercurial/merge.py Thu Jun 16 15:20:48 2022 +0200
@@ -2436,6 +2436,7 @@
status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
if confirm:
+ msg = None
nb_ignored = len(status.ignored)
nb_unknown = len(status.unknown)
if nb_unknown and nb_ignored:
@@ -2457,12 +2458,12 @@
b"permanently delete at least %d empty directories?"
)
msg %= dir_count
- else:
- # XXX we might be missing directory there
- return res
- msg += b" (yN)$$ &Yes $$ &No"
- if repo.ui.promptchoice(msg, default=1) == 1:
- raise error.CanceledError(_(b'removal cancelled'))
+ if msg is None:
+ return res
+ else:
+ msg += b" (yN)$$ &Yes $$ &No"
+ if repo.ui.promptchoice(msg, default=1) == 1:
+ raise error.CanceledError(_(b'removal cancelled'))
if removefiles:
for f in sorted(status.unknown + status.ignored):
--- a/relnotes/6.1 Sat Jun 11 00:26:25 2022 +0200
+++ b/relnotes/6.1 Thu Jun 16 15:20:48 2022 +0200
@@ -1,5 +1,18 @@
'''This is the last release to support Python 2. Mercurial is Python 3 only starting with 6.2'''
+= Mercurial 6.1.4 =
+
+ * url: raise error if CONNECT request to proxy was unsuccessful
+ * docker: avoid /tmp write access issues by fixing permissions
+ * logcmdutil: use the same data as {file*} template keywords (issue6642)
+ * commit: allow to close branch when committing change over a closed head
+ * rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
+ * purge: prevent a silly crash with --confirm --files
+ * rust: relax im-rc dependency to allow minor updates"
+ * Improve PyPy support
+ * Improve Py3 error handling
+ * Documentation fixes
+
= Mercurial 6.1.3 =
'''security: '''
--- a/rust/hg-core/src/dirstate_tree/dirstate_map.rs Sat Jun 11 00:26:25 2022 +0200
+++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs Thu Jun 16 15:20:48 2022 +0200
@@ -31,6 +31,13 @@
/// anymore) is less than this fraction of the total amount of existing data.
const ACCEPTABLE_UNREACHABLE_BYTES_RATIO: f32 = 0.5;
+#[derive(Debug, PartialEq, Eq)]
+/// Version of the on-disk format
+pub enum DirstateVersion {
+ V1,
+ V2,
+}
+
#[derive(Debug)]
pub struct DirstateMap<'on_disk> {
/// Contents of the `.hg/dirstate` file
@@ -54,6 +61,8 @@
/// Size of the data used to first load this `DirstateMap`. Used in case
/// we need to write some new metadata, but no new data on disk.
pub(super) old_data_size: usize,
+
+ pub(super) dirstate_version: DirstateVersion,
}
/// Using a plain `HgPathBuf` of the full path from the repository root as a
@@ -441,6 +450,7 @@
ignore_patterns_hash: [0; on_disk::IGNORE_PATTERNS_HASH_LEN],
unreachable_bytes: 0,
old_data_size: 0,
+ dirstate_version: DirstateVersion::V1,
}
}
--- a/rust/hg-core/src/dirstate_tree/on_disk.rs Sat Jun 11 00:26:25 2022 +0200
+++ b/rust/hg-core/src/dirstate_tree/on_disk.rs Thu Jun 16 15:20:48 2022 +0200
@@ -3,6 +3,7 @@
//! See `mercurial/helptext/internals/dirstate-v2.txt`
use crate::dirstate::{DirstateV2Data, TruncatedTimestamp};
+use crate::dirstate_tree::dirstate_map::DirstateVersion;
use crate::dirstate_tree::dirstate_map::{self, DirstateMap, NodeRef};
use crate::dirstate_tree::path_with_basename::WithBasename;
use crate::errors::HgError;
@@ -276,7 +277,9 @@
metadata: &[u8],
) -> Result<DirstateMap<'on_disk>, DirstateV2ParseError> {
if on_disk.is_empty() {
- return Ok(DirstateMap::empty(on_disk));
+ let mut map = DirstateMap::empty(on_disk);
+ map.dirstate_version = DirstateVersion::V2;
+ return Ok(map);
}
let (meta, _) = TreeMetadata::from_bytes(metadata)
.map_err(|_| DirstateV2ParseError)?;
@@ -291,6 +294,7 @@
ignore_patterns_hash: meta.ignore_patterns_hash,
unreachable_bytes: meta.unreachable_bytes.get(),
old_data_size: on_disk.len(),
+ dirstate_version: DirstateVersion::V2,
};
Ok(dirstate_map)
}
--- a/rust/hg-core/src/dirstate_tree/status.rs Sat Jun 11 00:26:25 2022 +0200
+++ b/rust/hg-core/src/dirstate_tree/status.rs Thu Jun 16 15:20:48 2022 +0200
@@ -4,6 +4,7 @@
use crate::dirstate_tree::dirstate_map::BorrowedPath;
use crate::dirstate_tree::dirstate_map::ChildNodesRef;
use crate::dirstate_tree::dirstate_map::DirstateMap;
+use crate::dirstate_tree::dirstate_map::DirstateVersion;
use crate::dirstate_tree::dirstate_map::NodeRef;
use crate::dirstate_tree::on_disk::DirstateV2ParseError;
use crate::matchers::get_ignore_function;
@@ -59,16 +60,29 @@
let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
if options.list_ignored || options.list_unknown {
- let mut hasher = Sha1::new();
- let (ignore_fn, warnings) = get_ignore_function(
- ignore_files,
- &root_dir,
- &mut |pattern_bytes| hasher.update(pattern_bytes),
- )?;
- let new_hash = *hasher.finalize().as_ref();
- let changed = new_hash != dmap.ignore_patterns_hash;
- dmap.ignore_patterns_hash = new_hash;
- (ignore_fn, warnings, Some(changed))
+ let (ignore_fn, warnings, changed) = match dmap.dirstate_version {
+ DirstateVersion::V1 => {
+ let (ignore_fn, warnings) = get_ignore_function(
+ ignore_files,
+ &root_dir,
+ &mut |_pattern_bytes| {},
+ )?;
+ (ignore_fn, warnings, None)
+ }
+ DirstateVersion::V2 => {
+ let mut hasher = Sha1::new();
+ let (ignore_fn, warnings) = get_ignore_function(
+ ignore_files,
+ &root_dir,
+ &mut |pattern_bytes| hasher.update(pattern_bytes),
+ )?;
+ let new_hash = *hasher.finalize().as_ref();
+ let changed = new_hash != dmap.ignore_patterns_hash;
+ dmap.ignore_patterns_hash = new_hash;
+ (ignore_fn, warnings, Some(changed))
+ }
+ };
+ (ignore_fn, warnings, changed)
} else {
(Box::new(|&_| true), vec![], None)
};
@@ -133,7 +147,8 @@
outcome.dirty = common.ignore_patterns_have_changed == Some(true)
|| !outdated.is_empty()
- || !new_cachable.is_empty();
+ || (!new_cachable.is_empty()
+ && dmap.dirstate_version == DirstateVersion::V2);
// Remove outdated mtimes before adding new mtimes, in case a given
// directory is both
--- a/tests/test-branches.t Sat Jun 11 00:26:25 2022 +0200
+++ b/tests/test-branches.t Thu Jun 16 15:20:48 2022 +0200
@@ -283,6 +283,19 @@
abort: current revision is already a branch closing head
[10]
+ $ echo foo > b
+ $ hg commit -d '9 0' --close-branch -m 're-closing this branch'
+
+ $ echo bar > b
+ $ hg commit -d '9 0' --close-branch -m 're-closing this branch' bh1
+ abort: current revision is already a branch closing head
+ [10]
+ $ hg commit -d '9 0' --close-branch -m 're-closing this branch' b
+
+ $ hg debugstrip --rev 13: --no-backup
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg revert --all --no-backup
+
$ hg log -r tip --debug
changeset: 12:e3d49c0575d8fc2cb1cd6859c747c14f5f6d499f
branch: b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue6642.t Thu Jun 16 15:20:48 2022 +0200
@@ -0,0 +1,35 @@
+hg log --debug shouldn't show different data than {file_*} template keywords
+https://bz.mercurial-scm.org/show_bug.cgi?id=6642
+
+ $ hg init issue6642
+ $ cd issue6642
+
+ $ echo a > a
+ $ hg ci -qAm a
+ $ echo b > b
+ $ hg ci -qAm b
+ $ hg up 0 -q
+ $ echo c > c
+ $ hg ci -qAm c
+ $ hg merge -q
+ $ hg ci -m merge
+
+ $ hg log -GT '{rev} {desc} file_adds: [{file_adds}], file_mods: [{file_mods}], file_dels: [{file_dels}], files: [{files}]\n'
+ @ 3 merge file_adds: [], file_mods: [], file_dels: [], files: []
+ |\
+ | o 2 c file_adds: [c], file_mods: [], file_dels: [], files: [c]
+ | |
+ o | 1 b file_adds: [b], file_mods: [], file_dels: [], files: [b]
+ |/
+ o 0 a file_adds: [a], file_mods: [], file_dels: [], files: [a]
+
+
+ $ hg log -r . --debug | grep files
+ [1]
+ $ hg log -r . --debug -T json | egrep '(added|removed|modified)'
+ "added": [],
+ "modified": [],
+ "removed": [],
+ $ hg log -r . --debug -T xml | grep path
+ <paths>
+ </paths>
--- a/tests/test-phases.t Sat Jun 11 00:26:25 2022 +0200
+++ b/tests/test-phases.t Thu Jun 16 15:20:48 2022 +0200
@@ -407,7 +407,6 @@
manifest: 7:5e724ffacba267b2ab726c91fc8b650710deaaa8
user: test
date: Thu Jan 01 00:00:00 1970 +0000
- files+: C D E
extra: branch=default
description:
merge B' and E
--- a/tests/test-purge.t Sat Jun 11 00:26:25 2022 +0200
+++ b/tests/test-purge.t Thu Jun 16 15:20:48 2022 +0200
@@ -350,4 +350,9 @@
.hg
.hgignore
+Test some --confirm case that ended crashing
+
+ $ hg purge --confirm
+ $ hg purge --confirm --all --files
+
$ cd ..