##// END OF EJS Templates
rebase: skip resolved but emptied revisions...
rebase: skip resolved but emptied revisions When rebasing, if a conflict occurs and is resolved in a way the rebased revision becomes empty, it is not skipped, unlike revisions being emptied without conflicts. The reason is: - File 'x' is merged and resolved, merge.update() marks it as 'm' in the dirstate. - rebase.concludenode() calls localrepo.commit(), which calls localrepo.status() which calls dirstate.status(). 'x' shows up as 'm' and is unconditionnally added to the modified files list, instead of being checked again. - localrepo.commit() detects 'x' as changed an create a new revision where only the manifest parents and linkrev differ. Marking 'x' as modified without checking it makes sense for regular merges. But in rebase case, the merge looks normal but the second parent is usually discarded. When this happens, 'm' files in dirstate are a bit irrelevant and should be considered 'n' possibly dirty instead. That is what the current patch does. Another approach, maybe more efficient, would be to pass another flag to merge.update() saying the 'branchmerge' is a bit of a lie and recordupdate() should call dirstate.normallookup() instead of merge(). It is also tempting to add this logic to dirstate.setparents(), moving from two to one parent is what invalidates the 'm' markers. But this is a far bigger change to make. v2: succumb to the temptation and move the logic in dirstate.setparents(). mpm suggested trying _filecommit() first but it is called by commitctx() which knows nothing about the dirstate and comes too late into the game. A second approach was to rewrite the 'm' state into 'n' on the fly in dirstate.status() which failed for graft in the following case: $ hg init repo $ cd repo $ echo a > a $ hg ci -qAm0 $ echo a >> a $ hg ci -m1 $ hg up 0 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg mv a b $ echo c > b $ hg ci -m2 created new head $ hg graft 1 --tool internal:local grafting revision 1 $ hg --config extensions.graphlog= glog --template '{rev} {desc|firstline}\n' @ 3 1 | o 2 2 | | o 1 1 |/ o 0 0 $ hg log -r 3 --debug --patch --git --copies changeset: 3:19cd7d1417952af13161b94c32e901769104560c tag: tip phase: draft parent: 2:b5c505595c9e9a12d5dd457919c143e05fc16fb8 parent: -1:0000000000000000000000000000000000000000 manifest: 3:3d27ce8d02241aa59b60804805edf103c5c0cda4 user: test date: Thu Jan 01 00:00:00 1970 +0000 extra: branch=default extra: source=a03df74c41413a75c0a42997fc36c2de97b26658 description: 1 Here, revision 3 is created because there is a copy record for 'b' in the dirstate and thus 'b' is considered modified. But this information is discarded at commit time since 'b' content is unchanged. I do not know if discarding this information is correct or not, but at this time we cannot represent it anyway. This patch therefore implements the last solution of moving the logic into dirstate.setparents(). It does not sound crazy as 'm' files makes no sense with only one parent. It also makes dirstate.merge() calls .lookupnormal() if there is one parent, to preserve the invariant. I am a bit concerned about introducing this kind of stateful behaviour to existing code which historically treated setparents() as a basic setter without side-effects. And doing that during the code freeze.

File last commit:

r13839:8d960240 stable
r16509:eab9119c stable
Show More
hgweb.txt
47 lines | 1.8 KiB | text/plain | TextLexer
Mercurial's internal web server, hgweb, can serve either a single
repository, or a collection of them. In the latter case, a special
configuration file can be used to specify the repository paths to use
and global web configuration options.
This file uses the same syntax as other Mercurial configuration files,
but only the following sections are recognized:
- web
- paths
- collections
The ``web`` section can specify all the settings described in the web
section of the hgrc(5) documentation. See :hg:`help config` for
information on where to find the manual page.
The ``paths`` section provides mappings of physical repository
paths to virtual ones. For instance::
[paths]
projects/a = /foo/bar
projects/b = /baz/quux
web/root = /real/root/*
/ = /real/root2/*
virtual/root2 = /real/root2/**
- The first two entries make two repositories in different directories
appear under the same directory in the web interface
- The third entry maps every Mercurial repository found in '/real/root'
into 'web/root'. This format is preferred over the [collections] one,
since using absolute paths as configuration keys is not supported on every
platform (especially on Windows).
- The fourth entry is a special case mapping all repositories in
'/real/root2' in the root of the virtual directory.
- The fifth entry recursively finds all repositories under the real
root, and maps their relative paths under the virtual root.
The ``collections`` section provides mappings of trees of physical
repositories paths to virtual ones, though the paths syntax is generally
preferred. For instance::
[collections]
/foo = /foo
Here, the left side will be stripped off all repositories found in the
right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as
``bar`` and ``quux/baz`` respectively.