[MacPorts] #58785: If port select fails, it can leave an incomplete or inconsistent set of symlinks
MacPorts
noreply at macports.org
Fri Aug 2 13:17:05 UTC 2019
#58785: If port select fails, it can leave an incomplete or inconsistent set of
symlinks
------------------------+--------------------
Reporter: ryandesign | Owner: (none)
Type: defect | Status: new
Priority: Normal | Milestone:
Component: base | Version: 2.5.4
Keywords: | Port:
------------------------+--------------------
If `port select` fails, for example due to a bug in a portfile such that
only some of the files to which symlinks will be made actually exist, then
the user's system can be left in an inconsistent state.
For example, currently `sudo port select mysql mariadb` works but #58197
reports that `sudo port select mysql mysql57` fails. If I run both of
those commands in that order, some of the symlinks are now pointing to
mysql57 files while others are left still pointing at mariadb files:
{{{
$ ls -l $(sed 's,^,/opt/local/,' /opt/local/etc/select/mysql/base)
2>/dev/null
lrwxr-xr-x 1 root wheel 39 Aug 2 08:07 /opt/local/bin/innochecksum ->
/opt/local/lib/mysql57/bin/innochecksum
lrwxr-xr-x 1 root wheel 41 Aug 2 08:07 /opt/local/bin/lz4_decompress
-> /opt/local/lib/mysql57/bin/lz4_decompress
lrwxr-xr-x 1 root wheel 44 Aug 2 08:07
/opt/local/bin/my_print_defaults ->
/opt/local/lib/mysql57/bin/my_print_defaults
lrwxr-xr-x 1 root wheel 40 Aug 2 08:07 /opt/local/bin/myisam_ftdump ->
/opt/local/lib/mysql57/bin/myisam_ftdump
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/myisamchk ->
/opt/local/lib/mysql57/bin/myisamchk
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/myisamlog ->
/opt/local/lib/mysql57/bin/myisamlog
lrwxr-xr-x 1 root wheel 37 Aug 2 08:07 /opt/local/bin/myisampack ->
/opt/local/lib/mysql57/bin/myisampack
lrwxr-xr-x 1 root wheel 32 Aug 2 08:07 /opt/local/bin/mysql ->
/opt/local/lib/mysql57/bin/mysql
lrwxr-xr-x 1 root wheel 44 Aug 2 08:07
/opt/local/bin/mysql_client_test ->
/opt/local/lib/mysql57/bin/mysql_client_test
lrwxr-xr-x 1 root wheel 53 Aug 2 08:07
/opt/local/bin/mysql_client_test_embedded ->
/opt/local/lib/mysql57/bin/mysql_client_test_embedded
lrwxr-xr-x 1 root wheel 39 Aug 2 08:07 /opt/local/bin/mysql_config ->
/opt/local/lib/mysql57/bin/mysql_config
lrwxr-xr-x 1 root wheel 46 Aug 2 08:07
/opt/local/bin/mysql_config_editor ->
/opt/local/lib/mysql57/bin/mysql_config_editor
lrwxr-xr-x 1 root wheel 41 Aug 2 08:07 /opt/local/bin/mysql_embedded
-> /opt/local/lib/mysql57/bin/mysql_embedded
lrwxr-xr-x 1 root wheel 43 Aug 2 08:07 /opt/local/bin/mysql_install_db
-> /opt/local/lib/mysql57/bin/mysql_install_db
lrwxr-xr-x 1 root wheel 39 Aug 2 08:07 /opt/local/bin/mysql_plugin ->
/opt/local/lib/mysql57/bin/mysql_plugin
lrwxr-xr-x 1 root wheel 52 Aug 2 08:07
/opt/local/bin/mysql_secure_installation ->
/opt/local/lib/mysql57/bin/mysql_secure_installation
lrwxr-xr-x 1 root wheel 46 Aug 2 08:07
/opt/local/bin/mysql_ssl_rsa_setup ->
/opt/local/lib/mysql57/bin/mysql_ssl_rsa_setup
lrwxr-xr-x 1 root wheel 46 Aug 2 08:07
/opt/local/bin/mysql_tzinfo_to_sql ->
/opt/local/lib/mysql57/bin/mysql_tzinfo_to_sql
lrwxr-xr-x 1 root wheel 40 Aug 2 08:07 /opt/local/bin/mysql_upgrade ->
/opt/local/lib/mysql57/bin/mysql_upgrade
lrwxr-xr-x 1 root wheel 37 Aug 2 08:07 /opt/local/bin/mysqladmin ->
/opt/local/lib/mysql57/bin/mysqladmin
lrwxr-xr-x 1 root wheel 38 Aug 2 08:07 /opt/local/bin/mysqlbinlog ->
/opt/local/lib/mysql57/bin/mysqlbinlog
lrwxr-xr-x 1 root wheel 37 Aug 2 08:07 /opt/local/bin/mysqlcheck ->
/opt/local/lib/mysql57/bin/mysqlcheck
lrwxr-xr-x 1 root wheel 33 Aug 2 08:07 /opt/local/bin/mysqld ->
/opt/local/lib/mysql57/bin/mysqld
lrwxr-xr-x 1 root wheel 39 Aug 2 08:07 /opt/local/bin/mysqld_multi ->
/opt/local/lib/mysql57/bin/mysqld_multi
lrwxr-xr-x 1 root wheel 38 Aug 2 08:07 /opt/local/bin/mysqld_safe ->
/opt/local/lib/mysql57/bin/mysqld_safe
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/mysqldump ->
/opt/local/lib/mysql57/bin/mysqldump
lrwxr-xr-x 1 root wheel 40 Aug 2 08:07 /opt/local/bin/mysqldumpslow ->
/opt/local/lib/mysql57/bin/mysqldumpslow
lrwxr-xr-x 1 root wheel 38 Aug 2 08:07 /opt/local/bin/mysqlimport ->
/opt/local/lib/mysql57/bin/mysqlimport
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/mysqlpump ->
/opt/local/lib/mysql57/bin/mysqlpump
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/mysqlshow ->
/opt/local/lib/mysql57/bin/mysqlshow
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/mysqlslap ->
/opt/local/lib/mysql57/bin/mysqlslap
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/mysqltest ->
/opt/local/lib/mysql57/bin/mysqltest
lrwxr-xr-x 1 root wheel 45 Aug 2 08:07
/opt/local/bin/mysqltest_embedded ->
/opt/local/lib/mysql57/bin/mysqltest_embedded
lrwxr-xr-x 1 root wheel 33 Aug 2 08:07 /opt/local/bin/perror ->
/opt/local/lib/mysql57/bin/perror
lrwxr-xr-x 1 root wheel 34 Aug 2 08:07 /opt/local/bin/replace ->
/opt/local/lib/mysql57/bin/replace
lrwxr-xr-x 1 root wheel 45 Aug 2 08:07
/opt/local/bin/resolve_stack_dump ->
/opt/local/lib/mysql57/bin/resolve_stack_dump
lrwxr-xr-x 1 root wheel 36 Aug 2 08:07 /opt/local/bin/resolveip ->
/opt/local/lib/mysql57/bin/resolveip
lrwxr-xr-x 1 root wheel 42 Aug 2 08:07 /opt/local/bin/zlib_decompress
-> /opt/local/lib/mysql57/bin/zlib_decompress
lrwxr-xr-x 1 root wheel 47 Aug 2 08:07
/opt/local/man/man1/comp_err.1.gz ->
/opt/local/share/man/mysql57/man1/comp_err.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:07
/opt/local/man/man1/innochecksum.1.gz ->
/opt/local/share/man/mysql57/man1/innochecksum.1.gz
lrwxr-xr-x 1 root wheel 53 Aug 2 08:07
/opt/local/man/man1/lz4_decompress.1.gz ->
/opt/local/share/man/mysql57/man1/lz4_decompress.1.gz
lrwxr-xr-x 1 root wheel 56 Aug 2 08:07
/opt/local/man/man1/my_print_defaults.1.gz ->
/opt/local/share/man/mysql57/man1/my_print_defaults.1.gz
lrwxr-xr-x 1 root wheel 52 Aug 2 08:07
/opt/local/man/man1/myisam_ftdump.1.gz ->
/opt/local/share/man/mysql57/man1/myisam_ftdump.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:07
/opt/local/man/man1/myisamchk.1.gz ->
/opt/local/share/man/mysql57/man1/myisamchk.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:07
/opt/local/man/man1/myisamlog.1.gz ->
/opt/local/share/man/mysql57/man1/myisamlog.1.gz
lrwxr-xr-x 1 root wheel 49 Aug 2 08:07
/opt/local/man/man1/myisampack.1.gz ->
/opt/local/share/man/mysql57/man1/myisampack.1.gz
lrwxr-xr-x 1 root wheel 56 Aug 2 08:06 /opt/local/man/man1/mysql-test-
run.pl.1.gz -> /opt/local/share/man/mariadb/man1/mysql-test-run.pl.1.gz
lrwxr-xr-x 1 root wheel 44 Aug 2 08:06 /opt/local/man/man1/mysql.1.gz
-> /opt/local/share/man/mariadb/man1/mysql.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:06
/opt/local/man/man1/mysql.server.1.gz ->
/opt/local/share/man/mariadb/man1/mysql.server.1.gz
lrwxr-xr-x 1 root wheel 56 Aug 2 08:06
/opt/local/man/man1/mysql_client_test.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_client_test.1.gz
lrwxr-xr-x 1 root wheel 65 Aug 2 08:06
/opt/local/man/man1/mysql_client_test_embedded.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_client_test_embedded.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:06
/opt/local/man/man1/mysql_config.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_config.1.gz
lrwxr-xr-x 1 root wheel 65 Aug 2 08:06
/opt/local/man/man1/mysql_convert_table_format.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_convert_table_format.1.gz
lrwxr-xr-x 1 root wheel 54 Aug 2 08:06
/opt/local/man/man1/mysql_find_rows.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_find_rows.1.gz
lrwxr-xr-x 1 root wheel 59 Aug 2 08:06
/opt/local/man/man1/mysql_fix_extensions.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_fix_extensions.1.gz
lrwxr-xr-x 1 root wheel 55 Aug 2 08:06
/opt/local/man/man1/mysql_install_db.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_install_db.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:06
/opt/local/man/man1/mysql_plugin.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_plugin.1.gz
lrwxr-xr-x 1 root wheel 64 Aug 2 08:06
/opt/local/man/man1/mysql_secure_installation.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_secure_installation.1.gz
lrwxr-xr-x 1 root wheel 58 Aug 2 08:06
/opt/local/man/man1/mysql_setpermission.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_setpermission.1.gz
lrwxr-xr-x 1 root wheel 58 Aug 2 08:06
/opt/local/man/man1/mysql_tzinfo_to_sql.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_tzinfo_to_sql.1.gz
lrwxr-xr-x 1 root wheel 52 Aug 2 08:06
/opt/local/man/man1/mysql_upgrade.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_upgrade.1.gz
lrwxr-xr-x 1 root wheel 52 Aug 2 08:06
/opt/local/man/man1/mysql_waitpid.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_waitpid.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/mysql_zap.1.gz ->
/opt/local/share/man/mariadb/man1/mysql_zap.1.gz
lrwxr-xr-x 1 root wheel 50 Aug 2 08:06
/opt/local/man/man1/mysqlaccess.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlaccess.1.gz
lrwxr-xr-x 1 root wheel 49 Aug 2 08:06
/opt/local/man/man1/mysqladmin.1.gz ->
/opt/local/share/man/mariadb/man1/mysqladmin.1.gz
lrwxr-xr-x 1 root wheel 50 Aug 2 08:06
/opt/local/man/man1/mysqlbinlog.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlbinlog.1.gz
lrwxr-xr-x 1 root wheel 47 Aug 2 08:06
/opt/local/man/man1/mysqlbug.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlbug.1.gz
lrwxr-xr-x 1 root wheel 49 Aug 2 08:06
/opt/local/man/man1/mysqlcheck.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlcheck.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:06
/opt/local/man/man1/mysqld_multi.1.gz ->
/opt/local/share/man/mariadb/man1/mysqld_multi.1.gz
lrwxr-xr-x 1 root wheel 50 Aug 2 08:06
/opt/local/man/man1/mysqld_safe.1.gz ->
/opt/local/share/man/mariadb/man1/mysqld_safe.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/mysqldump.1.gz ->
/opt/local/share/man/mariadb/man1/mysqldump.1.gz
lrwxr-xr-x 1 root wheel 52 Aug 2 08:06
/opt/local/man/man1/mysqldumpslow.1.gz ->
/opt/local/share/man/mariadb/man1/mysqldumpslow.1.gz
lrwxr-xr-x 1 root wheel 51 Aug 2 08:06
/opt/local/man/man1/mysqlhotcopy.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlhotcopy.1.gz
lrwxr-xr-x 1 root wheel 50 Aug 2 08:06
/opt/local/man/man1/mysqlimport.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlimport.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/mysqlshow.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlshow.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/mysqlslap.1.gz ->
/opt/local/share/man/mariadb/man1/mysqlslap.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/mysqltest.1.gz ->
/opt/local/share/man/mariadb/man1/mysqltest.1.gz
lrwxr-xr-x 1 root wheel 57 Aug 2 08:06
/opt/local/man/man1/mysqltest_embedded.1.gz ->
/opt/local/share/man/mariadb/man1/mysqltest_embedded.1.gz
lrwxr-xr-x 1 root wheel 45 Aug 2 08:06 /opt/local/man/man1/perror.1.gz
-> /opt/local/share/man/mariadb/man1/perror.1.gz
lrwxr-xr-x 1 root wheel 46 Aug 2 08:06
/opt/local/man/man1/replace.1.gz ->
/opt/local/share/man/mariadb/man1/replace.1.gz
lrwxr-xr-x 1 root wheel 57 Aug 2 08:06
/opt/local/man/man1/resolve_stack_dump.1.gz ->
/opt/local/share/man/mariadb/man1/resolve_stack_dump.1.gz
lrwxr-xr-x 1 root wheel 48 Aug 2 08:06
/opt/local/man/man1/resolveip.1.gz ->
/opt/local/share/man/mariadb/man1/resolveip.1.gz
lrwxr-xr-x 1 root wheel 45 Aug 2 08:06 /opt/local/man/man8/mysqld.8.gz
-> /opt/local/share/man/mariadb/man8/mysqld.8.gz
}}}
Ideally `port select` should either fully succeed or it should leave the
disk untouched.
The first idea that occurred to me is that it should clean up after a
failed attempt, but that might be tough, and just trying to re-select the
user's previous selection in case of an error might also fail.
So maybe this second idea is better: It could do two passes through all
the files to be symlinked. The first pass would just verify that all the
files to be linked do in fact exist, and the second pass would do the
actual linking.
--
Ticket URL: <https://trac.macports.org/ticket/58785>
MacPorts <https://www.macports.org/>
Ports system for macOS
More information about the macports-tickets
mailing list