mercurial@42537: 4 new changesets
4 new changesets in mercurial: https://www.mercurial-scm.org/repo/hg/rev/faec09d89435 changeset: 42534:faec09d89435 user:Taapas Agrawal date:Fri Jun 28 03:15:39 2019 +0530 summary: statecheck: shifted defaults to addunfinished() https://www.mercurial-scm.org/repo/hg/rev/df5f674050b7 changeset: 42535:df5f674050b7 user:Taapas Agrawal date:Fri Jun 21 00:26:07 2019 +0530 summary: relnotes: added description about statemod._statecheck https://www.mercurial-scm.org/repo/hg/rev/2dcee6497b0b changeset: 42536:2dcee6497b0b user:Raphaël Gomès date:Thu May 16 18:03:06 2019 +0200 summary: rust-dirstate: add "dirs" Rust implementation https://www.mercurial-scm.org/repo/hg/rev/ce94f9622acd changeset: 42537:ce94f9622acd bookmark:@ tag: tip user:Raphaël Gomès date:Thu May 16 18:03:42 2019 +0200 summary: rust-dirstate: add "dirs" rust-cpython binding -- Repository URL: https://www.mercurial-scm.org/repo/hg ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
[PATCH STABLE] bookmarks: backout the attempt to fix the delete race
# HG changeset patch # User Matt Harbison # Date 1561864987 14400 # Sat Jun 29 23:23:07 2019 -0400 # Branch stable # Node ID 874e3f6d19ba89c5cd8864beba75d2c3e9d0c25c # Parent 044045dce23aaeb3688bcff9bd79d67fa710228f bookmarks: backout the attempt to fix the delete race This backs out 044045dce23a because it broke a bunch of tests on Windows. Yuya's theory is that we still rely on in-memory changelog data to be flushed out of the transaction. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1222,55 +1222,6 @@ class localrepository(object): @mixedrepostorecache(('bookmarks', 'plain'), ('bookmarks.current', 'plain'), ('00changelog.i', '')) def _bookmarks(self): -# Since the multiple files involved in the transaction cannot be -# written atomically (with current repository format), there is a race -# condition here. -# -# 1) changelog content A is read -# 2) outside transaction update changelog to content B -# 3) outside transaction update bookmark file referring to content B -# 4) bookmarks file content is read and filtered against changelog-A -# -# When this happens, bookmarks against nodes missing from A are dropped. -# -# Having this happening during read is not great, but it become worse -# when this happen during write because the bookmarks to the "unknown" -# nodes will be dropped for good. However, writes happen within locks. -# This locking makes it possible to have a race free consistent read. -# For this purpose data read from disc before locking are -# "invalidated" right after the locks are taken. This invalidations are -# "light", the `filecache` mechanism keep the data in memory and will -# reuse them if the underlying files did not changed. Not parsing the -# same data multiple times helps performances. -# -# Unfortunately in the case describe above, the files tracked by the -# bookmarks file cache might not have changed, but the in-memory -# content is still "wrong" because we used an older changelog content -# to process the on-disk data. So after locking, the changelog would be -# refreshed but `_bookmarks` would be preserved. -# Adding `00changelog.i` to the list of tracked file is not -# enough, because at the time we build the content for `_bookmarks` in -# (4), the changelog file has already diverged from the content used -# for loading `changelog` in (1) -# -# To prevent the issue, we force the changelog to be explicitly -# reloaded while computing `_bookmarks`. The data race can still happen -# without the lock (with a narrower window), but it would no longer go -# undetected during the lock time refresh. -# -# The new schedule is as follow -# -# 1) filecache logic detect that `_bookmarks` needs to be computed -# 2) cachestat for `bookmarks` and `changelog` are captured (for book) -# 3) We force `changelog` filecache to be tested -# 4) cachestat for `changelog` are captured (for changelog) -# 5) `_bookmarks` is computed and cached -# -# The step in (3) ensure we have a changelog at least as recent as the -# cache stat computed in (1). As a result at locking time: -# * if the changelog did not changed since (1) -> we can reuse the data -# * otherwise -> the bookmarks get refreshed. -self._refreshchangelog() return bookmarks.bmstore(self) def _refreshchangelog(self): diff --git a/tests/test-bookmarks-corner-case.t b/tests/test-bookmarks-corner-case.t --- a/tests/test-bookmarks-corner-case.t +++ b/tests/test-bookmarks-corner-case.t @@ -200,7 +200,6 @@ Check raced push output. $ cat push-output.txt pushing to ssh://user@dummy/bookrace-server searching for changes - remote has heads on branch 'default' that are not known locally: f26c3b5167d1 remote: setting raced push up remote: adding changesets remote: adding manifests @@ -220,7 +219,7 @@ Check result of the push. | summary: A1 | | o changeset: 3:f26c3b5167d1 - | | bookmark:book-B + | | bookmark:book-B (false !) | | user:test | | date:Thu Jan 01 00:00:00 1970 + | | summary: B1 @@ -243,4 +242,4 @@ Check result of the push. $ hg -R bookrace-server book book-A4:9ce3b28c16de - book-B3:f26c3b5167d1 + book-B3:f26c3b5167d1 (false !) ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6553: shelve: move shelve extension to core
yuja added a comment. Need to update `extensions._builtin` so the shelve "extension" is silently ignored. Please send a follow up. REPOSITORY rHG Mercurial CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6553/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6553 To: navaneeth.suresh, #hg-reviewers, pulkit Cc: yuja, martinvonz, pulkit, Kwan, mjpieters, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Re: D6553: shelve: move shelve extension to core
Need to update `extensions._builtin` so the shelve "extension" is silently ignored. Please send a follow up. ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6395: rust-dirstate: call new "dirs" rust implementation from Python
yuja added a comment. > - a/rust/hg-core/src/dirstate/dirs_multiset.rs > > +++ b/rust/hg-core/src/dirstate/dirs_multiset.rs > @@ -118,7 +118,9 @@ > > entry.remove(); > } > Entry::Vacant(_) => { > > - return Err(DirstateMapError::PathNotFound(path.to_owned())) > > +return Err(DirstateMapError::PathNotFound( > +path.to_owned(), > +)) > > } > }; Unrelated change. Dropped. REPOSITORY rHG Mercurial CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6395/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6395 To: Alphare, #hg-reviewers, kevincox Cc: yuja, durin42, kevincox, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6394: rust-dirstate: add "dirs" rust-cpython binding
yuja added a comment. > +def __contains__(, item: PyObject) -> PyResult { > +Ok(self > +.dirs_map(py) > +.borrow() > +.get(::(py)?.data(py).to_owned()) > +.is_some()) `.contains_key(..)` and `.as_ref()` instead of `&...to_owned()`. I'm surprised by the use of Deref in the previous patch. Is it legit to leverage Deref to expose the inner type? REPOSITORY rHG Mercurial CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6394/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6394 To: Alphare, #hg-reviewers, kevincox Cc: yuja, durin42, kevincox, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6393: rust-dirstate: add "dirs" Rust implementation
yuja added a comment. > +impl DirsMultiset { > +/// Initializes the multiset from a dirstate or a manifest. > +/// > +/// If `skip_state` is provided, skips dirstate entries with equal state. > +pub fn new(iterable: DirsIterable, skip_state: Option) -> Self { > +let mut multiset = DirsMultiset { > +inner: HashMap::new(), > +}; > + > +match iterable { > +DirsIterable::Dirstate(vec) => { > +for (ref filename, DirstateEntry { state, .. }) in vec { > +// This `if` is optimized out of the loop > +if let Some(skip) = skip_state { > +if skip != state { > +multiset.add_path(filename); > +} > +} else { > +multiset.add_path(filename); > +} > +} > +} > +DirsIterable::Manifest(vec) => { > +for ref filename in vec { > +multiset.add_path(filename); > +} > +} > +} > + > +multiset > +} Could be `from_dirstate(vec, skip_state)` and `from_vec(vec)` since the `skip_state` argument only applies to the `Dirstate` variant. > +/// Returns the slice up to the next directory name from right to left, > +/// without trailing slash > +fn find_dir(path: &[u8]) -> &[u8] { > +let mut path = path; > +loop { > +if let Some(new_pos) = path.len().checked_sub(1) { > +if path[new_pos] == b'/' { > +break [..new_pos]; > +} > +path = [..new_pos]; > +} else { > +break &[]; > +} > +} > +} Maybe use Iterator::rposition()? let p = path.iter().rposition(|| c == b'/').unwrap_or(0); [..p] Anyway, we'll probably want an iterator which yields parent directories. REPOSITORY rHG Mercurial CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6393/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6393 To: Alphare, #hg-reviewers, kevincox Cc: yuja, martinvonz, durin42, kevincox, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Re: D6393: rust-dirstate: add "dirs" Rust implementation
> +impl DirsMultiset { > +/// Initializes the multiset from a dirstate or a manifest. > +/// > +/// If `skip_state` is provided, skips dirstate entries with equal state. > +pub fn new(iterable: DirsIterable, skip_state: Option) -> Self { > +let mut multiset = DirsMultiset { > +inner: HashMap::new(), > +}; > + > +match iterable { > +DirsIterable::Dirstate(vec) => { > +for (ref filename, DirstateEntry { state, .. }) in vec { > +// This `if` is optimized out of the loop > +if let Some(skip) = skip_state { > +if skip != state { > +multiset.add_path(filename); > +} > +} else { > +multiset.add_path(filename); > +} > +} > +} > +DirsIterable::Manifest(vec) => { > +for ref filename in vec { > +multiset.add_path(filename); > +} > +} > +} > + > +multiset > +} Could be `from_dirstate(vec, skip_state)` and `from_vec(vec)` since the `skip_state` argument only applies to the `Dirstate` variant. > +/// Returns the slice up to the next directory name from right to left, > +/// without trailing slash > +fn find_dir(path: &[u8]) -> &[u8] { > +let mut path = path; > +loop { > +if let Some(new_pos) = path.len().checked_sub(1) { > +if path[new_pos] == b'/' { > +break [..new_pos]; > +} > +path = [..new_pos]; > +} else { > +break &[]; > +} > +} > +} Maybe use Iterator::rposition()? ``` let p = path.iter().rposition(|| c == b'/').unwrap_or(0); [..p] ``` Anyway, we'll probably want an iterator which yields parent directories. ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6553: shelve: move shelve extension to core
Closed by commit rHG46087aeb8ae2: shelve: move shelve extension to core (authored by navaneeth.suresh). This revision was automatically updated to reflect the committed changes. CHANGED PRIOR TO COMMIT https://phab.mercurial-scm.org/D6553?vs=15701=15707#toc REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D6553?vs=15701=15707 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6553/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6553 AFFECTED FILES contrib/win32/mercurial.ini hgext/shelve.py mercurial/commands.py mercurial/configitems.py mercurial/shelve.py mercurial/state.py mercurial/ui.py relnotes/next tests/test-bookflow.t tests/test-completion.t tests/test-copytrace-heuristics.t tests/test-globalopts.t tests/test-help-hide.t tests/test-help.t tests/test-hgweb-json.t tests/test-keyword.t tests/test-shelve.t tests/test-shelve2.t tests/test-treemanifest.t CHANGE DETAILS diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t --- a/tests/test-treemanifest.t +++ b/tests/test-treemanifest.t @@ -357,10 +357,10 @@ Shelving and unshelving should work $ echo foo >> dir1/a - $ hg --config extensions.shelve= shelve + $ hg shelve shelved as default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg --config extensions.shelve= unshelve + $ hg unshelve unshelving change 'default' $ hg diff --nodates diff -r 708a273da119 dir1/a diff --git a/tests/test-shelve2.t b/tests/test-shelve2.t --- a/tests/test-shelve2.t +++ b/tests/test-shelve2.t @@ -3,7 +3,6 @@ $ cat <> $HGRCPATH > [extensions] > mq = - > shelve = > [defaults] > diff = --nodates --git > qnew = --date '0 0' diff --git a/tests/test-shelve.t b/tests/test-shelve.t --- a/tests/test-shelve.t +++ b/tests/test-shelve.t @@ -3,7 +3,6 @@ $ cat <> $HGRCPATH > [extensions] > mq = - > shelve = > [defaults] > diff = --nodates --git > qnew = --date '0 0' @@ -65,8 +64,6 @@ To delete specific shelved changes, use "--delete". To delete all shelved changes, use "--cleanup". - (use 'hg help -e shelve' to show help for the shelve extension) - options ([+] can be repeated): -A --addremove mark new/missing files as added/removed before diff --git a/tests/test-keyword.t b/tests/test-keyword.t --- a/tests/test-keyword.t +++ b/tests/test-keyword.t @@ -1248,11 +1248,6 @@ Test restricted mode with unshelve - $ cat <> $HGRCPATH - > [extensions] - > shelve = - > EOF - $ echo >> a $ hg diff diff -r 800511b3a22d a diff --git a/tests/test-hgweb-json.t b/tests/test-hgweb-json.t --- a/tests/test-hgweb-json.t +++ b/tests/test-hgweb-json.t @@ -2057,6 +2057,10 @@ "topic": "root" }, { +"summary": "save and set aside changes from the working directory", +"topic": "shelve" + }, + { "summary": "add one or more tags for the current or given revision", "topic": "tag" }, @@ -2069,6 +2073,10 @@ "topic": "unbundle" }, { +"summary": "restore a shelved change to the working directory", +"topic": "unshelve" + }, + { "summary": "verify the integrity of the repository", "topic": "verify" }, diff --git a/tests/test-help.t b/tests/test-help.t --- a/tests/test-help.t +++ b/tests/test-help.t @@ -112,8 +112,10 @@ resolve redo merges or set/view the merge status of files revertrestore files to their checkout state root print the root (top) of the current working directory + shelvesave and set aside changes from the working directory statusshow changed files in the working directory summary summarize working directory state + unshelve restore a shelved change to the working directory updateupdate working directory (or switch revisions) Change import/export: @@ -238,8 +240,10 @@ resolve redo merges or set/view the merge status of files revertrestore files to their checkout state root print the root (top) of the current working directory + shelvesave and set aside changes from the working directory statusshow changed files in the working directory summary summarize working directory state + unshelve restore a shelved change to the working directory updateupdate working directory (or switch revisions) Change import/export: @@ -375,7 +379,6 @@ relinkrecreates hardlinks between repository clones schemes extend schemes with shortcuts to repository swarms share share a common history between several working directories - shelvesave and restore changes to the working directory strip strip changesets and their descendants from history transplantcommand
D6586: automv: access status fields by name, not index
Closed by commit rHGff89280c626d: automv: access status fields by name, not index (authored by martinvonz). This revision was automatically updated to reflect the committed changes. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D6586?vs=15704=15710 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6586/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6586 AFFECTED FILES hgext/automv.py CHANGE DETAILS diff --git a/hgext/automv.py b/hgext/automv.py --- a/hgext/automv.py +++ b/hgext/automv.py @@ -81,8 +81,8 @@ """ stat = repo.status(match=matcher) -added = stat[1] -removed = stat[2] +added = stat.added +removed = stat.removed copy = copies.pathcopies(repo['.'], repo[None], matcher) # remove the copy files for which we already have copy info To: martinvonz, #hg-reviewers, pulkit Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6585: automv: use public API for getting copies
Closed by commit rHG1caadb8e3d2c: automv: use public API for getting copies (authored by martinvonz). This revision was automatically updated to reflect the committed changes. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D6585?vs=15703=15709 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6585/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6585 AFFECTED FILES hgext/automv.py CHANGE DETAILS diff --git a/hgext/automv.py b/hgext/automv.py --- a/hgext/automv.py +++ b/hgext/automv.py @@ -84,7 +84,7 @@ added = stat[1] removed = stat[2] -copy = copies._forwardcopies(repo['.'], repo[None], matcher) +copy = copies.pathcopies(repo['.'], repo[None], matcher) # remove the copy files for which we already have copy info added = [f for f in added if f not in copy] To: martinvonz, #hg-reviewers, pulkit Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6588: abort: added support for merge
taapas1128 created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY This adds support of `hg merge --abort` to `hg abort`. Results are shown as tests. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D6588 AFFECTED FILES mercurial/commands.py mercurial/hg.py tests/test-abort.t CHANGE DETAILS diff --git a/tests/test-abort.t b/tests/test-abort.t --- a/tests/test-abort.t +++ b/tests/test-abort.t @@ -628,9 +628,8 @@ Unshelve abort fails with appropriate message if there's no unshelve in progress $ hg abort - abort: merge does not support 'hg abort' - (use 'hg commit' or 'hg merge --abort') - [255] + aborting the merge, updating back to 9451eaa6eee3 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd .. Abort due to pending changes @@ -902,3 +901,59 @@ $ hg abort abort: no operation in progress [255] + $ cd .. + +TEST `hg abort` operation merge + + $ addcommit () { + > echo $1 > $1 + > hg add $1 + > hg commit -d "${2} 0" -m $1 + > } + + $ commit () { + > hg commit -d "${2} 0" -m $1 + > } + + $ hg init a + $ cd a + $ addcommit "A" 0 + $ addcommit "B" 1 + $ echo "C" >> A + $ commit "C" 2 + + $ hg update -C 0 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo "D" >> A + $ commit "D" 3 + created new head + +State before the merge + + $ hg status + $ hg id + e45016d2b3d3 tip + $ hg summary + parent: 3:e45016d2b3d3 tip + D + branch: default + commit: (clean) + update: 2 new changesets, 2 branch heads (merge) + phases: 4 draft + +Testing the abort functionality first in case of conflicts + + $ hg abort + abort: no operation in progress + [255] + $ hg merge + merging A + warning: conflicts while merging A! (edit, then use 'hg resolve --mark') + 1 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon + [1] + + $ hg abort + aborting the merge, updating back to e45016d2b3d3 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -952,8 +952,8 @@ return ret -def merge(repo, node, force=None, remind=True, mergeforce=False, labels=None, - abort=False): +def merge(repo, node=None, force=None, remind=True, mergeforce=False, + labels=None, abort=False): """Branch merge with node, resolving changes. Return true if any unresolved conflicts.""" if not abort: diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -148,6 +148,8 @@ break if not abortstate: raise error.Abort(_('no operation in progress')) +if abortstate._opname == 'merge': +return hg.merge(repo, abort=True) if abortstate._abortfunc: return abortstate._abortfunc(ui, repo) raise error.Abort((_("%s does not support 'hg abort'") % To: taapas1128, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6511: py3: hack around inconsistency of type of name passed to DNSQuestion
pulkit added a comment. Review ping for this stack. REPOSITORY rHG Mercurial CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D6511/new/ REVISION DETAIL https://phab.mercurial-scm.org/D6511 To: pulkit, #hg-reviewers Cc: mjpieters, mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel