Reviewers: mp+219135_code.launchpad.net, Message: Please take a look. Description: Invert envcmd relationship Previously we embedded EnvCommandBase in all commands requring an environment, and EnvCommandBase included everything (SetFlags, and Init). The problem with this is that it was easy to miss initialisation of the EnvCommandBase type (this happened a few times), which leads to bad things happening like sync-tools destroying environments. I have inverted the relationship so that we now have envcmd.EnvironCommand, an interface that extends Command with a SetEnvName method, and EnvCommandBase, which implements EnvironCommand. A new method, envcmd.Wrap takes an EnvironCommand and creates a Command that calls SetEnvName prior to the wrapped method's Init method. If the environment name cannot be determined, the wrapping command will error out early. https://code.launchpad.net/~axwalk/juju-core/envcmd-inversion/+merge/219135 (do not edit description out of merge proposal) Please review this at https://codereview.appspot.com/94350045/ Affected files (+354, -440 lines): A [revision details] M cmd/cmd.go M cmd/envcmd/environmentcommand.go M cmd/envcmd/environmentcommand_test.go M cmd/juju/addmachine.go M cmd/juju/addmachine_test.go M cmd/juju/addrelation.go M cmd/juju/addrelation_test.go M cmd/juju/addunit.go M cmd/juju/addunit_test.go M cmd/juju/adduser.go M cmd/juju/adduser_test.go M cmd/juju/authorizedkeys_add.go M cmd/juju/authorizedkeys_delete.go M cmd/juju/authorizedkeys_import.go M cmd/juju/authorizedkeys_list.go M cmd/juju/authorizedkeys_test.go M cmd/juju/bootstrap.go M cmd/juju/bootstrap_test.go M cmd/juju/cmd_test.go M cmd/juju/constraints.go M cmd/juju/constraints_test.go M cmd/juju/debuglog.go M cmd/juju/debuglog_test.go M cmd/juju/deploy.go M cmd/juju/deploy_test.go M cmd/juju/endpoint.go M cmd/juju/endpoint_test.go M cmd/juju/ensureavailability.go M cmd/juju/ensureavailability_test.go M cmd/juju/environment.go M cmd/juju/environment_test.go M cmd/juju/expose.go M cmd/juju/expose_test.go M cmd/juju/get.go M cmd/juju/get_test.go M cmd/juju/main.go M cmd/juju/main_test.go M cmd/juju/plugin.go M cmd/juju/publish.go M cmd/juju/publish_test.go M cmd/juju/removemachine.go M cmd/juju/removemachine_test.go M cmd/juju/removerelation.go M cmd/juju/removerelation_test.go M cmd/juju/removeservice.go M cmd/juju/removeservice_test.go M cmd/juju/removeunit.go M cmd/juju/removeunit_test.go M cmd/juju/removeuser.go M cmd/juju/removeuser_test.go M cmd/juju/resolved.go M cmd/juju/resolved_test.go M cmd/juju/retryprovisioning.go M cmd/juju/retryprovisioning_test.go M cmd/juju/run.go M cmd/juju/run_test.go M cmd/juju/set.go M cmd/juju/set_test.go M cmd/juju/ssh.go M cmd/juju/ssh_test.go M cmd/juju/status.go M cmd/juju/status_test.go M cmd/juju/synctools.go M cmd/juju/synctools_test.go M cmd/juju/unexpose.go M cmd/juju/unexpose_test.go M cmd/juju/unset.go M cmd/juju/unset_test.go M cmd/juju/upgradecharm.go M cmd/juju/upgradecharm_test.go M cmd/juju/upgradejuju.go M cmd/juju/upgradejuju_test.go M cmd/plugins/juju-metadata/imagemetadata.go M cmd/plugins/juju-metadata/imagemetadata_test.go M cmd/plugins/juju-metadata/metadata.go M cmd/plugins/juju-metadata/toolsmetadata.go M cmd/plugins/juju-metadata/toolsmetadata_test.go M cmd/plugins/juju-metadata/validateimagemetadata.go M cmd/plugins/juju-metadata/validateimagemetadata_test.go M cmd/plugins/juju-metadata/validatetoolsmetadata.go M cmd/plugins/juju-metadata/validatetoolsmetadata_test.go M cmd/plugins/juju-restore/restore.go