Deactivate hack and increasing revision

Rainer Müller raimue at
Wed Sep 6 10:10:00 UTC 2017

On 2017-09-06 09:52, Ryan Schmidt wrote:
> When the ssh-copy-id files were removed from the openssh port [1] and the port was thus made to no longer conflict with the ssh-copy-id port, the ssh-copy-id port would install, but could not be activated if the prior version of openssh was installed, as would be the case during an upgrade [2]. This version of ssh-copy-id did build and install and activate successfully on the buildbot workers (since they did not have openssh active at the time) and is being distributed by our packages server.

Uh, of course. Sorry, I missed this when merging the change.

> The deactivate hack was added to the port [3], but because its revision was not increased, my understanding was that my machine would still complain that ssh-copy-id could not be activated because openssh was active, because the pre-activate block added in [3] would not be used, because MacPorts would look at the version of the Portfile that was already stored in the registry with the installed copy of the port, not the version of the Portfile in the ports tree. And yet, the upgrade now works for me.
> I was sure that activate and deactivate phases were run from a copy of the Portfile kept in the registry, since the activate and deactivate phases of the current version of the Portfile in the ports tree wouldn't necessarily be compatible with whatever probably older version of the port the user had installed. And yet, if I add 'ui_msg "hello"' to the pre-activate block of the Portfile, and then tell MacPorts to install a binary from our server which doesn't contain that message, I still get:
> $ sudo port -b install ssh-copy-id
> --->  Fetching archive for ssh-copy-id
> --->  Attempting to fetch ssh-copy-id-7.5p1_1.darwin_16.noarch.tbz2 from
> --->  Attempting to fetch ssh-copy-id-7.5p1_1.darwin_16.noarch.tbz2.rmd160 from
> --->  Installing ssh-copy-id @7.5p1_1
> hello
> --->  Deactivating openssh @7.3p1_0+kerberos5+universal+xauth
> --->  Activating ssh-copy-id @7.5p1_1
> --->  Cleaning ssh-copy-id
'port install' always works with the Portfile from the ports tree and
executes port targets on that, while 'port de/activate' will use the
Portfile stored in the registry.

Internally, 'port install' is actually running the activate target,
which requires the install target to run before. The install target will
invoke archivefetch and if that can download a binary archive, all
targets up to including destroot are skipped.

Note that then MacPorts will also store the Portfile from the ports tree
in the registry, as that was used to install this port. The Portfile
from the binary archive is never used.

Binary archives were designed to spare users the expensive build targets
up to destroot. The ports tree will still be used and the ports tree is
not only a package index.

[There is one exception, though, which is that the +PORTFILE in the
archive would be used if you gave port only the binary archive to
install. This is quite uncommon, but the only use of that file.]


More information about the macports-dev mailing list