Skip to content
Snippets Groups Projects
Commit 06c976acc581 authored by Boris Feld's avatar Boris Feld
Browse files

phases: add an internal phases

The phase is meant to be used for internal commit that are a byproduct of
command operation (eg:shelve).

This changeset focus on getting the most important feature in, more advanced
API is to be introduced in later changesets.

The phase approach to handle internal has multiple advantages:
* simple to implement, reuse optimized code,
* fits well with existing phases. We don't want internal changeset to be
  exchanged or served.
* easy to extend to for lifecycle handling.

More thinking about internal changeset at https://www.mercurial-scm.org/wiki/InternalsPlan

We add this new phases with a high number to leave some room to possible other
phases. We also try out playing with the idea of "flag" for phases, each flag
would convey a distinct meaning. We can drop the flag idea in the future
(keeping the existing numbers). The flag property should still move in a
monotonic direction (enabled -> disabled) or be immutable like the "internal"
flag.

To simplify the addition of this new phase, we introduce many placeholder
phases. They are not meant to be used for now. Keeping `allphases` as a list
ensure existing algorithm works fine.

The full performance impact of adding that many hollow phases is unclear so
far. The impact on phase computation is visible but not worrisome.

Runnin `hg perfphase` in my mercurial development repository.
Before: ! wall 0.001807 comb 0.000000 user 0.000000 sys 0.000000 (median of 1597)
after:  ! wall 0.001906 comb 0.000000 user 0.000000 sys 0.000000 (median of 1521)
parent ce145f8eface
No related branches found
No related tags found
No related merge requests found
......@@ -123,5 +123,11 @@
_fphasesentry = struct.Struct('>i20s')
allphases = public, draft, secret = range(3)
INTERNAL_FLAG = 64 # Phases for mercurial internal usage only
HIDEABLE_FLAG = 32 # Phases that are hideable
# record phase index
public, draft, secret = range(3)
internal = INTERNAL_FLAG | HIDEABLE_FLAG
allphases = range(internal + 1)
trackedphases = allphases[1:]
......@@ -127,4 +133,8 @@
trackedphases = allphases[1:]
phasenames = ['public', 'draft', 'secret']
# record phase names
phasenames = [None] * len(allphases)
phasenames[:3] = ['public', 'draft', 'secret']
phasenames[internal] = 'internal'
# record phase property
mutablephases = tuple(allphases[1:])
remotehiddenphases = tuple(allphases[2:])
......@@ -129,5 +139,6 @@
mutablephases = tuple(allphases[1:])
remotehiddenphases = tuple(allphases[2:])
localhiddenphases = tuple(p for p in allphases if p & HIDEABLE_FLAG)
def _readroots(repo, phasedefaults=None):
"""Read phase roots from disk
......
......@@ -28,7 +28,10 @@
branchmap (see mercurial.branchmap.subsettable), you cannot set "public"
changesets as "hideable". Doing so would break multiple code assertions and
lead to crashes."""
return obsolete.getrevs(repo, 'obsolete')
obsoletes = obsolete.getrevs(repo, 'obsolete')
internals = repo._phasecache.getrevset(repo, phases.localhiddenphases)
internals = frozenset(internals)
return obsoletes | internals
def pinnedrevs(repo):
"""revisions blocking hidden changesets from being filtered
......
......@@ -826,3 +826,51 @@
rollback completed
abort: pretxnclose-phase.nopublish_D hook exited with status 1
[255]
$ cd ..
Test for the "internal" phase
=============================
$ hg init internal-phase
$ cd internal-phase
$ mkcommit A
test-debug-phase: new rev 0: x -> 1
test-hook-close-phase: 4a2df7238c3b48766b5e22fafbb8a2f506ec8256: -> draft
Commit an internal changesets
$ echo B > B
$ hg add B
$ hg status
A B
$ hg --config "phases.new-commit=internal" commit -m "my test internal commit"
test-debug-phase: new rev 1: x -> 96
test-hook-close-phase: c01c42dffc7f81223397e99652a0703f83e1c5ea: -> internal
Usual visibility rules apply when working directory parents
$ hg log -G -l 3
@ changeset: 1:c01c42dffc7f
| tag: tip
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: my test internal commit
|
o changeset: 0:4a2df7238c3b
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: A
Commit is hidden as expected
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg log -G
@ changeset: 0:4a2df7238c3b
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: A
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment