##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r50260:79b2c98a merge default
parent child Browse files
Show More
@@ -0,0 +1,35 b''
1 hg log --debug shouldn't show different data than {file_*} template keywords
2 https://bz.mercurial-scm.org/show_bug.cgi?id=6642
3
4 $ hg init issue6642
5 $ cd issue6642
6
7 $ echo a > a
8 $ hg ci -qAm a
9 $ echo b > b
10 $ hg ci -qAm b
11 $ hg up 0 -q
12 $ echo c > c
13 $ hg ci -qAm c
14 $ hg merge -q
15 $ hg ci -m merge
16
17 $ hg log -GT '{rev} {desc} file_adds: [{file_adds}], file_mods: [{file_mods}], file_dels: [{file_dels}], files: [{files}]\n'
18 @ 3 merge file_adds: [], file_mods: [], file_dels: [], files: []
19 |\
20 | o 2 c file_adds: [c], file_mods: [], file_dels: [], files: [c]
21 | |
22 o | 1 b file_adds: [b], file_mods: [], file_dels: [], files: [b]
23 |/
24 o 0 a file_adds: [a], file_mods: [], file_dels: [], files: [a]
25
26
27 $ hg log -r . --debug | grep files
28 [1]
29 $ hg log -r . --debug -T json | egrep '(added|removed|modified)'
30 "added": [],
31 "modified": [],
32 "removed": [],
33 $ hg log -r . --debug -T xml | grep path
34 <paths>
35 </paths>
@@ -228,3 +228,4 b' d4486810a1795fba9521449b8885ced034f3a6dd'
228 5bd6bcd31dd1ebb63b8914b00064f96297267af7 0 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
@@ -241,3 +241,4 b' d4486810a1795fba9521449b8885ced034f3a6dd'
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
@@ -2086,10 +2086,17 b' def _docommit(ui, repo, *pats, **opts):'
2086 extra[b'close'] = b'1'
2086 extra[b'close'] = b'1'
2087
2087
2088 if repo[b'.'].closesbranch():
2088 if repo[b'.'].closesbranch():
2089 raise error.InputError(
2089 # Not ideal, but let us do an extra status early to prevent early
2090 _(b'current revision is already a branch closing head')
2090 # bail out.
2091 )
2091 matcher = scmutil.match(repo[None], pats, opts)
2092 elif not bheads:
2092 s = repo.status(match=matcher)
2093 if s.modified or s.added or s.removed:
2094 bheads = repo.branchheads(branch, closed=True)
2095 else:
2096 msg = _(b'current revision is already a branch closing head')
2097 raise error.InputError(msg)
2098
2099 if not bheads:
2093 raise error.InputError(
2100 raise error.InputError(
2094 _(b'branch "%s" has no heads to close') % branch
2101 _(b'branch "%s" has no heads to close') % branch
2095 )
2102 )
@@ -376,10 +376,9 b' class changesetprinter:'
376 self._exthook(ctx)
376 self._exthook(ctx)
377
377
378 if self.ui.debugflag:
378 if self.ui.debugflag:
379 files = ctx.p1().status(ctx)
380 for key, value in zip(
379 for key, value in zip(
381 [b'files', b'files+', b'files-'],
380 [b'files', b'files+', b'files-'],
382 [files.modified, files.added, files.removed],
381 [ctx.filesmodified(), ctx.filesadded(), ctx.filesremoved()],
383 ):
382 ):
384 if value:
383 if value:
385 self.ui.write(
384 self.ui.write(
@@ -511,11 +510,10 b' class changesetformatter(changesetprinte'
511 or b'added' in datahint
510 or b'added' in datahint
512 or b'removed' in datahint
511 or b'removed' in datahint
513 ):
512 ):
514 files = ctx.p1().status(ctx)
515 fm.data(
513 fm.data(
516 modified=fm.formatlist(files.modified, name=b'file'),
514 modified=fm.formatlist(ctx.filesmodified(), name=b'file'),
517 added=fm.formatlist(files.added, name=b'file'),
515 added=fm.formatlist(ctx.filesadded(), name=b'file'),
518 removed=fm.formatlist(files.removed, name=b'file'),
516 removed=fm.formatlist(ctx.filesremoved(), name=b'file'),
519 )
517 )
520
518
521 verbose = not self.ui.debugflag and self.ui.verbose
519 verbose = not self.ui.debugflag and self.ui.verbose
@@ -2436,6 +2436,7 b' def purge('
2436 status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
2436 status = repo.status(match=matcher, ignored=ignored, unknown=unknown)
2437
2437
2438 if confirm:
2438 if confirm:
2439 msg = None
2439 nb_ignored = len(status.ignored)
2440 nb_ignored = len(status.ignored)
2440 nb_unknown = len(status.unknown)
2441 nb_unknown = len(status.unknown)
2441 if nb_unknown and nb_ignored:
2442 if nb_unknown and nb_ignored:
@@ -2457,12 +2458,12 b' def purge('
2457 b"permanently delete at least %d empty directories?"
2458 b"permanently delete at least %d empty directories?"
2458 )
2459 )
2459 msg %= dir_count
2460 msg %= dir_count
2460 else:
2461 if msg is None:
2461 # XXX we might be missing directory there
2462 return res
2462 return res
2463 else:
2463 msg += b" (yN)$$ &Yes $$ &No"
2464 msg += b" (yN)$$ &Yes $$ &No"
2464 if repo.ui.promptchoice(msg, default=1) == 1:
2465 if repo.ui.promptchoice(msg, default=1) == 1:
2465 raise error.CanceledError(_(b'removal cancelled'))
2466 raise error.CanceledError(_(b'removal cancelled'))
2466
2467
2467 if removefiles:
2468 if removefiles:
2468 for f in sorted(status.unknown + status.ignored):
2469 for f in sorted(status.unknown + status.ignored):
@@ -1,5 +1,18 b''
1 '''This is the last release to support Python 2. Mercurial is Python 3 only starting with 6.2'''
1 '''This is the last release to support Python 2. Mercurial is Python 3 only starting with 6.2'''
2
2
3 = Mercurial 6.1.4 =
4
5 * url: raise error if CONNECT request to proxy was unsuccessful
6 * docker: avoid /tmp write access issues by fixing permissions
7 * logcmdutil: use the same data as {file*} template keywords (issue6642)
8 * commit: allow to close branch when committing change over a closed head
9 * rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
10 * purge: prevent a silly crash with --confirm --files
11 * rust: relax im-rc dependency to allow minor updates"
12 * Improve PyPy support
13 * Improve Py3 error handling
14 * Documentation fixes
15
3 = Mercurial 6.1.3 =
16 = Mercurial 6.1.3 =
4
17
5 '''security: '''
18 '''security: '''
@@ -31,6 +31,13 b' use crate::StatusOptions;'
31 /// anymore) is less than this fraction of the total amount of existing data.
31 /// anymore) is less than this fraction of the total amount of existing data.
32 const ACCEPTABLE_UNREACHABLE_BYTES_RATIO: f32 = 0.5;
32 const ACCEPTABLE_UNREACHABLE_BYTES_RATIO: f32 = 0.5;
33
33
34 #[derive(Debug, PartialEq, Eq)]
35 /// Version of the on-disk format
36 pub enum DirstateVersion {
37 V1,
38 V2,
39 }
40
34 #[derive(Debug)]
41 #[derive(Debug)]
35 pub struct DirstateMap<'on_disk> {
42 pub struct DirstateMap<'on_disk> {
36 /// Contents of the `.hg/dirstate` file
43 /// Contents of the `.hg/dirstate` file
@@ -54,6 +61,8 b" pub struct DirstateMap<'on_disk> {"
54 /// Size of the data used to first load this `DirstateMap`. Used in case
61 /// Size of the data used to first load this `DirstateMap`. Used in case
55 /// we need to write some new metadata, but no new data on disk.
62 /// we need to write some new metadata, but no new data on disk.
56 pub(super) old_data_size: usize,
63 pub(super) old_data_size: usize,
64
65 pub(super) dirstate_version: DirstateVersion,
57 }
66 }
58
67
59 /// Using a plain `HgPathBuf` of the full path from the repository root as a
68 /// Using a plain `HgPathBuf` of the full path from the repository root as a
@@ -441,6 +450,7 b" impl<'on_disk> DirstateMap<'on_disk> {"
441 ignore_patterns_hash: [0; on_disk::IGNORE_PATTERNS_HASH_LEN],
450 ignore_patterns_hash: [0; on_disk::IGNORE_PATTERNS_HASH_LEN],
442 unreachable_bytes: 0,
451 unreachable_bytes: 0,
443 old_data_size: 0,
452 old_data_size: 0,
453 dirstate_version: DirstateVersion::V1,
444 }
454 }
445 }
455 }
446
456
@@ -3,6 +3,7 b''
3 //! See `mercurial/helptext/internals/dirstate-v2.txt`
3 //! See `mercurial/helptext/internals/dirstate-v2.txt`
4
4
5 use crate::dirstate::{DirstateV2Data, TruncatedTimestamp};
5 use crate::dirstate::{DirstateV2Data, TruncatedTimestamp};
6 use crate::dirstate_tree::dirstate_map::DirstateVersion;
6 use crate::dirstate_tree::dirstate_map::{self, DirstateMap, NodeRef};
7 use crate::dirstate_tree::dirstate_map::{self, DirstateMap, NodeRef};
7 use crate::dirstate_tree::path_with_basename::WithBasename;
8 use crate::dirstate_tree::path_with_basename::WithBasename;
8 use crate::errors::HgError;
9 use crate::errors::HgError;
@@ -276,7 +277,9 b" pub(super) fn read<'on_disk>("
276 metadata: &[u8],
277 metadata: &[u8],
277 ) -> Result<DirstateMap<'on_disk>, DirstateV2ParseError> {
278 ) -> Result<DirstateMap<'on_disk>, DirstateV2ParseError> {
278 if on_disk.is_empty() {
279 if on_disk.is_empty() {
279 return Ok(DirstateMap::empty(on_disk));
280 let mut map = DirstateMap::empty(on_disk);
281 map.dirstate_version = DirstateVersion::V2;
282 return Ok(map);
280 }
283 }
281 let (meta, _) = TreeMetadata::from_bytes(metadata)
284 let (meta, _) = TreeMetadata::from_bytes(metadata)
282 .map_err(|_| DirstateV2ParseError)?;
285 .map_err(|_| DirstateV2ParseError)?;
@@ -291,6 +294,7 b" pub(super) fn read<'on_disk>("
291 ignore_patterns_hash: meta.ignore_patterns_hash,
294 ignore_patterns_hash: meta.ignore_patterns_hash,
292 unreachable_bytes: meta.unreachable_bytes.get(),
295 unreachable_bytes: meta.unreachable_bytes.get(),
293 old_data_size: on_disk.len(),
296 old_data_size: on_disk.len(),
297 dirstate_version: DirstateVersion::V2,
294 };
298 };
295 Ok(dirstate_map)
299 Ok(dirstate_map)
296 }
300 }
@@ -4,6 +4,7 b' use crate::dirstate::status::StatusPath;'
4 use crate::dirstate_tree::dirstate_map::BorrowedPath;
4 use crate::dirstate_tree::dirstate_map::BorrowedPath;
5 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
5 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
6 use crate::dirstate_tree::dirstate_map::DirstateMap;
6 use crate::dirstate_tree::dirstate_map::DirstateMap;
7 use crate::dirstate_tree::dirstate_map::DirstateVersion;
7 use crate::dirstate_tree::dirstate_map::NodeRef;
8 use crate::dirstate_tree::dirstate_map::NodeRef;
8 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
9 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
9 use crate::matchers::get_ignore_function;
10 use crate::matchers::get_ignore_function;
@@ -59,16 +60,29 b" pub fn status<'dirstate>("
59
60
60 let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
61 let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
61 if options.list_ignored || options.list_unknown {
62 if options.list_ignored || options.list_unknown {
62 let mut hasher = Sha1::new();
63 let (ignore_fn, warnings, changed) = match dmap.dirstate_version {
63 let (ignore_fn, warnings) = get_ignore_function(
64 DirstateVersion::V1 => {
64 ignore_files,
65 let (ignore_fn, warnings) = get_ignore_function(
65 &root_dir,
66 ignore_files,
66 &mut |pattern_bytes| hasher.update(pattern_bytes),
67 &root_dir,
67 )?;
68 &mut |_pattern_bytes| {},
68 let new_hash = *hasher.finalize().as_ref();
69 )?;
69 let changed = new_hash != dmap.ignore_patterns_hash;
70 (ignore_fn, warnings, None)
70 dmap.ignore_patterns_hash = new_hash;
71 }
71 (ignore_fn, warnings, Some(changed))
72 DirstateVersion::V2 => {
73 let mut hasher = Sha1::new();
74 let (ignore_fn, warnings) = get_ignore_function(
75 ignore_files,
76 &root_dir,
77 &mut |pattern_bytes| hasher.update(pattern_bytes),
78 )?;
79 let new_hash = *hasher.finalize().as_ref();
80 let changed = new_hash != dmap.ignore_patterns_hash;
81 dmap.ignore_patterns_hash = new_hash;
82 (ignore_fn, warnings, Some(changed))
83 }
84 };
85 (ignore_fn, warnings, changed)
72 } else {
86 } else {
73 (Box::new(|&_| true), vec![], None)
87 (Box::new(|&_| true), vec![], None)
74 };
88 };
@@ -133,7 +147,8 b" pub fn status<'dirstate>("
133
147
134 outcome.dirty = common.ignore_patterns_have_changed == Some(true)
148 outcome.dirty = common.ignore_patterns_have_changed == Some(true)
135 || !outdated.is_empty()
149 || !outdated.is_empty()
136 || !new_cachable.is_empty();
150 || (!new_cachable.is_empty()
151 && dmap.dirstate_version == DirstateVersion::V2);
137
152
138 // Remove outdated mtimes before adding new mtimes, in case a given
153 // Remove outdated mtimes before adding new mtimes, in case a given
139 // directory is both
154 // directory is both
@@ -283,6 +283,19 b' verify update will accept invalid legacy'
283 abort: current revision is already a branch closing head
283 abort: current revision is already a branch closing head
284 [10]
284 [10]
285
285
286 $ echo foo > b
287 $ hg commit -d '9 0' --close-branch -m 're-closing this branch'
288
289 $ echo bar > b
290 $ hg commit -d '9 0' --close-branch -m 're-closing this branch' bh1
291 abort: current revision is already a branch closing head
292 [10]
293 $ hg commit -d '9 0' --close-branch -m 're-closing this branch' b
294
295 $ hg debugstrip --rev 13: --no-backup
296 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
297 $ hg revert --all --no-backup
298
286 $ hg log -r tip --debug
299 $ hg log -r tip --debug
287 changeset: 12:e3d49c0575d8fc2cb1cd6859c747c14f5f6d499f
300 changeset: 12:e3d49c0575d8fc2cb1cd6859c747c14f5f6d499f
288 branch: b
301 branch: b
@@ -407,7 +407,6 b' test that phase are displayed in log at '
407 manifest: 7:5e724ffacba267b2ab726c91fc8b650710deaaa8
407 manifest: 7:5e724ffacba267b2ab726c91fc8b650710deaaa8
408 user: test
408 user: test
409 date: Thu Jan 01 00:00:00 1970 +0000
409 date: Thu Jan 01 00:00:00 1970 +0000
410 files+: C D E
411 extra: branch=default
410 extra: branch=default
412 description:
411 description:
413 merge B' and E
412 merge B' and E
@@ -350,4 +350,9 b' remove both files and dirs'
350 .hg
350 .hg
351 .hgignore
351 .hgignore
352
352
353 Test some --confirm case that ended crashing
354
355 $ hg purge --confirm
356 $ hg purge --confirm --all --files
357
353 $ cd ..
358 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now