PEP 385: a bunch of updates after python-dev discussion.

This commit is contained in:
Dirkjan Ochtman 2009-08-03 11:38:44 +00:00
parent 7da366131d
commit ad94c1d76e
1 changed files with 84 additions and 55 deletions

View File

@ -59,27 +59,25 @@ client. The latter makes it a little easier to switch between branches, but
often has somewhat unintuitive results for people (though this has been
getting better in recent versions of Mercurial).
I'm still a bit on the fence about whether Python should adopt cloned
branches and named branches. Since it usually makes more sense to tag releases
on the maintenance branch, for example, mainline history would not contain
release tags if we used cloned branches. Also, Mercurial 1.2 and 1.3 have the
necessary tools to make named branches less painful (because they can be
properly closed and closed heads are no longer considered in relevant cases).
The current proposal is to use named branches for release branches and adopt
cloned branches for feature branches, with one exception to this rule: the 3.x
branches will be kept in separate clones from the 2.x branches. I think this
provides an optimal hybrid approach for Python's uses of branching.
A disadvantage might be that the used clones will be a good bit larger (since
they essentially contain all other branches as well). This can me mitigated by
keeping non-release (feature) branches in separate clones. Also note that it's
still possible to clone a single named branch from a combined clone, by
specifying the branch as in hg clone http://hg.python.org/main/#2.6-maint.
Keeping the py3k history in a separate clone problably also makes sense.
Differences between named branches and cloned branches:
XXX To do: size comparison for selected separation scenarios.
* Tags in a different (maintenance) clone aren't available in the local clone
* Clones with named branches will be larger, since they contain more data
(The Mercurial book discourages the use of named branches, but it is, in this
respect, somewhat outdated. Named branches have gotten much easier to use
since that comment was written, due to improvements in hg.)
Converting branches
-------------------
There are quite a lot of branches in SVN's branches directory. I propose to
clean this up a bit, by employing the following the strategy:
clean this up a bit, by following this basic strategy:
* Keep all release (maintenance) branches
* Discard branches that haven't been touched in 18 months, unless somone
@ -87,6 +85,21 @@ clean this up a bit, by employing the following the strategy:
* Keep branches that have been touched in the last 18 months, unless someone
indicates the branch can be deprecated
There's a `branch map`_ available that shows info about each branch:
* keep-clone means we'll keep that branch in a separate clone
* keep-named means we'll keep that branch as a named branch in one of the clones
* strip means we won't keep that branch
* streamed-merge means that it got merged by committing several new revisions
to the other branch
* merged-r* means the branch got merged in the named revision
* merges? means I haven't checked/found out yet whether that branch was ever
merged
* ? means that your input would be even more helpful than for the other items
* some items have no action yet, feel free to treat that as just '?'
.. _branch map: http://hg.python.org/pymigr/file/tip/all-branches.txt
Converting tags
---------------
@ -95,8 +108,8 @@ fact, full tags, but contain only a smaller subset of the repository. I think
we should keep all release tags, and consider other tags for inclusion based
on requests from the developer community. I'd like to consider unifying the
release tag naming scheme to make some things more consistent, if people feel
that won't create too many problems. For example, Mercurial itself just uses
'1.2.1' as a tag, where CPython would currently use r121.
that won't create too many problems. The current proposal is to bring old
release tags in line with the current practice of release tag naming.
Author map
----------
@ -119,17 +132,19 @@ that are not eligible for version control. It does this by employing several
possible forms of pattern matching. The current Python repository already
includes a rudimentary .hgignore file to help with using the hg mirrors.
It might be useful to have the .hgignore be generated automatically from
svn:ignore properties. This would make sure all historic revisions also have
useful ignore information (though one could argue ignoring isn't really
relevant to just checking out an old revision).
Since the current Python repository already includes a .hgignore file (for use
with hg mirrors), we'll just use that. Generating full history of the file
was debated but deemed impractical (because it's relatively hard with fairly
little gain, since ignoring is less important for older revisions).
Revlog reordering
-----------------
As an optional optimization technique, we should consider trying a reordering
pass on the revlogs (internal Mercurial files) resulting from the conversion.
In some cases this results in dramatic decreases in on-disk repository size.
As an optional optimization technique, I have performed a reordering pass on
the revlogs (internal Mercurial files) resulting from the conversion. In some
cases this results in dramatic decreases in on-disk repository size. This
especially makes sense for the manifest (where it really helps out quite a lot)
and oft-edited files like NEWS.txt (with an admittedly smaller effect).
Other repositories
------------------
@ -138,6 +153,13 @@ Richard Tew has indicated that he'd like the Stackless repository to also be
converted. What other projects in the svn.python.org repository should be
converted? Do we want to convert the peps repository? distutils? others?
There's now an initial stab at converting the Jython repository. The current
tip of hgsubversion unfortunately fails at some point. Pending investigation.
Other repositories that would like to converted to Mercurial can announce
themselves to me after the main Python migration is done, and I'll take care
of their needs.
Infrastructure
==============
@ -165,17 +187,18 @@ developed and deployed. The following hooks are being used:
lines. Open issue: do we check only the tip after each push, or do we check
every commit in a changegroup?
* commit mails: we can leverage the notify extension for this
* commit mails: we can leverage the notify extension for this. Emails will
include diffs for each changeset committed against the repository.
* buildbots: both the regular and the community build masters must be notified.
Fortunately buildbot includes support for hg. I've also implemented this for
Mercurial itself, so I don't expect problems here.
* check contributors: in the current setup, all changesets bear the username of
committers, who must have signed the contributor agreement. In a DVCS, the
committers are not necessarily the same people who push, and so we can't
check if the committer is a contributor. We could use a hook to check if the
committer is a contributor if we keep a list of registered contributors.
committers, who must have signed the contributor agreement. We might want to
use a hook to check if the committer is a contributor if we keep a list of
registered contributors. Then, the hook might warn users that push a group
of revisions containing changesets from unknown contributors.
hgwebdir
--------
@ -185,6 +208,15 @@ come up with a style to match the Python website. It may also be useful to
build a quick extension to augment the URL rev parser so that it can also take
r[0-9]+ args and come up with the matching hg revision.
roundup
-------
We'll come up with an auto-linking plugin for roundup, which can match a
changeset identifier (possibly with a branch prefix), and link it to the
appropriate revision in the hgwebdir instance. Second, the script above (in
the hgwebdir section) will make sure that old links to revision should continue
to work (by pointing to the hg changeset that reflects the svn revision).
After migration
===============
@ -222,36 +254,31 @@ on the outcome of debate about this PEP (for example, the branching strategy).
.. _wiki: http://www.selenic.com/mercurial/wiki/
.. _parts of the developer FAQ: http://www.python.org/dev/faq/#version-control
Think first, commit later?
--------------------------
Proposed workflow
-----------------
In recent history, old versions of Python have been maintained by a select
group of people backporting patches from trunk to release branches. While
this may not scale so well as the development pace grows, it also runs into
some problems with the current crop of distributed versioning tools. These
tools (I believe similar problems would exist for either git, bzr, or hg,
though some may cope better than others) are based on the idea of a Directed
Acyclic Graph (or DAG), meaning they keep track of relations of changesets.
I propose two workflows for the migration of patches between several branches.
Mercurial itself has a stable branch which is a ''strict'' subset of the
unstable branch. This means that generally all fixes for the stable branch
get committed against the tip of the stable branch, then they get merged into
the unstable branch (which already contains the parent of the new cset). This
provides a largely frictionless environment for moving changes from stable to
unstable branches. Mistakes, where a change that should go on stable goes on
unstable first, do happen, but they're usually easy to fix. That can be done by
copying the change over to the stable branch, then trivial-merging with
unstable -- meaning the merge in fact ignores the parent from the stable
branch).
For migration within 2.x or 3.x branches, I propose a patch always gets
committed to the oldest branch where it applies first. Then, the resulting
changeset can be merged using hg merge to all newer branches within that
series (2.x or 3.x). If it does not apply as-is to the newer branch, hg revert
can be used to easily revert to the new-branch-native head, patch in some
alternative version of the patch (or none, if it's not applicable), then commit
the merge. The premise here is that all changesets from an older branch within
the series are eventually merged to all newer branches within the series.
This strategy means a little more work for regular committers, because they
have to think about whether their change should go on stable or unstable; they
may even have to ask someone else (the RM) before committing. But it also
relieves a dedicated group of committers of regular backporting duty, in
addition to making it easier to work with the tool.
The upshot is that this provides for the most painless merging procedure. The
downside is that in the general case, people have to think about the oldest
branch to which the patch should be applied before actually applying it.
Now would be a good time to consider changing strategies in this regard,
although it would be relatively easy to switch to such a model later on.
For migration between 2.x and 3.x branches (which should all be in the same
direction, though I'm not sure what direction is most appropriate here),
changesets should be transplanted (not merged) in some other way. The
transplant extension, import/export and bundle/unbundle work equally well here.
Choosing this approach allows 3.x not to carry all of the 2.x history-since-it-
was-branched, meaning the clone is not as big and the merges not as complicated.
The future of Subversion
------------------------
@ -281,7 +308,9 @@ to Python code as part of sys.version:
I propose that the revision identifier will be the short version of hg's
revision hash, for example 'dd3ebf81af43', augmented with '+' (instead of 'M')
if the working directory from which it was built was modified. This mirrors
the output of the hg id command, which is intended for this kind of usage.
the output of the hg id command, which is intended for this kind of usage. The
sys.subversion value will also be renamed to sys.mercurial to reflect the
change in VCS.
For the tag/branch identifier, I propose that hg will check for tags on the
currently checked out revision, use the tag if there is one ('tip' doesn't