Hi all,
I want to remind everyone about when you should increase a port's revision and
when you should not. Please don't increase revisions unnecessarily because it
wastes time on our build servers and on users systems.
You SHOULD increase a port's revision if a user who already has the port
installed should be prompted to reinstall the port with those changes. The most
frequent reason is if you are changing the files installed by the port.
Examples:
* Adding a dependency on a library that the port would use opportunistically
* Linking with a new version of a dependency's library
* Adding a patchfile that changes files that will be installed
* Adding documentation files
* Renaming or relocating files or directories that are installed
* Removing a variant
* Adding a variant to the port's default_variants
You SHOULD increase a port's revision if you are adding or removing library or
runtime dependencies, because those are recorded in the registry. Examples:
* A port X requires libpng but this was not declared in X's portfile. If the
user happened to have libpng installed already then X builds fine but in the
registry MacPorts has not recorded that X uses libpng because it doesn't know
that. As a result, the user would be able to uninstall libpng and MacPorts
would not warn the user that this would break X. Increase the revision when
adding the dependency on libpng so that the user must reinstall the port so
that the correct dependencies get into the registry.
You SHOULD NOT increase a port's revision if your change will not change
anything for users who already have the port installed. Examples:
* Setting or changing the port's license
* Fixing a build failure, for example adding a build dependency like pkgconfig
if the port would fail to build without it
* Removing an unneeded build dependency
* Adding a new non-default variant
* Removing a variant from the port's default_variants (variants are preserved
on upgrades)
* Fixing a typo in a comment in the Portfile
* Changing the whitespace of the Portfile
Subports are a complication. A single Portfile might define several subports.
Think carefully when you change revisions which subports the change should
apply to.
For example, a simple python module port has subports for several versions of
python but they are all for the same version of that python module. It makes
sense to have a single version line and a single revision line beneath that and
to increase the revision for all of the subports at the same time. But other
python module ports may be more complicated, offering a newer version of the
python module on newer python versions and an older version of the module on
older python versions. In that case there are two version lines and two
revision lines, and you must think carefully about which of the two revision
lines, or both, should be increased for any particular change. For example if
you are adding a missing dependency to the new version of the python module but
that dependency is not used by the old version, you would only be increasing
the revision of the new version.
In "regular" ports that use subports (i.e. not python/php/perl modules), don't
forget that the main port is a subport too. In a portfile that has subports,
just because there's a version line at the top of the portfile doesn't mean you
should necessarily add a revision line right below it. Instead, define separate
revision lines for each subport, including the main port:
if {${subport} eq ${name} {
revision 0
...
}
subport foo {
revision 0
...
}
subport bar {
revision 0
...
}
Do include a "revision 0" line, even though that is the default. That way it is
easy for you and other developers who might have need to modify your port to
see exactly where revisions could be set. It also makes it easier for tools
that automatically bump revisions to do so correctly.
Many developers seem to have been under the impression that it is necessary to
increase the revision in order to get the buildbot to retry a build. That is
not the case.
Every commit sends a notification to the buildbot. The buildbot doesn't look at
the content of the commit except to determine which ports' source directories
were modified. It updates to the latest version of macports-ports and then
checks if an archive already exists on the right server for the those ports. If
not, it builds and uploads them. The archive name contains the port's name,
version, revision, variants, platform name and version, and archs, so if any of
those changes (including if the port's default_variants have changed) a new
build will be started.
"The right server" means the public server for ports whose license indicates
that they are distributable and a private server for ports that are not
distributable. If a commit is made that changes a port's distributability, that
changes what "the right server" is and so it will trigger a build and upload to
the new right server if needed.
If you increase a port's revision unnecessarily, you should not revert that
change because some users may already have installed the port with the new
revision.