From 77408aa02f64ac3b412abced2d7d468721bf4793 Mon Sep 17 00:00:00 2001 From: agis Date: Tue, 3 Mar 2026 15:06:47 +0700 Subject: [PATCH 1/6] update phpseclib --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f308fa4d..559137b2 100755 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "nesbot/carbon": "^2.71", "opis/closure": "~3.6", "pda/pheanstalk": "~4.0", - "phpseclib/phpseclib": "~2.0", + "phpseclib/phpseclib": "~3.0.36", "predis/predis": "^1.1", "symfony/browser-kit": "~6.4", "symfony/console": "~6.4", From b4d0a3575c60a58319e4defb342a5d34e1d91aec Mon Sep 17 00:00:00 2001 From: agis Date: Tue, 3 Mar 2026 15:06:57 +0700 Subject: [PATCH 2/6] ignore personal tooling --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d186c27d..cf3b0654 100755 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ composer.lock .DS_Store Thumbs.db .idea/ -.phpunit.result.cache \ No newline at end of file +.phpunit.result.cache +.direnv +.envrc \ No newline at end of file From 6ca988becd14d188a0a6880eb4ae0a478965ca5f Mon Sep 17 00:00:00 2001 From: agis Date: Tue, 3 Mar 2026 16:19:44 +0700 Subject: [PATCH 3/6] Remove Remote feature and phpseclib dependency - Remove Illuminate\Remote namespace (RemoteManager, Connection, Gateway, etc.) - Remove SSH Facade - Remove TailCommand (depends on Remote) - Remove RemoteSecLibGatewayTest - Remove phpseclib/phpseclib from dependencies (only used by Remote feature) - Update Application.php to remove 'remote' service binding - Update composer.json to remove phpseclib/phpseclib requirement and illuminate/remote from replace All tests pass successfully after removal. Co-Authored-By: Claude Haiku 4.5 --- composer.json | 2 - src/Illuminate/Foundation/Application.php | 1 - .../Foundation/Console/TailCommand.php | 168 --------- src/Illuminate/Remote/Connection.php | 262 -------------- src/Illuminate/Remote/ConnectionInterface.php | 52 --- src/Illuminate/Remote/GatewayInterface.php | 60 ---- src/Illuminate/Remote/MultiConnection.php | 100 ------ src/Illuminate/Remote/RemoteManager.php | 199 ----------- .../Remote/RemoteServiceProvider.php | 37 -- src/Illuminate/Remote/SecLibGateway.php | 322 ------------------ src/Illuminate/Remote/composer.json | 31 -- src/Illuminate/Support/Facades/SSH.php | 16 - tests/Remote/RemoteSecLibGatewayTest.php | 62 ---- 13 files changed, 1312 deletions(-) delete mode 100644 src/Illuminate/Foundation/Console/TailCommand.php delete mode 100644 src/Illuminate/Remote/Connection.php delete mode 100644 src/Illuminate/Remote/ConnectionInterface.php delete mode 100644 src/Illuminate/Remote/GatewayInterface.php delete mode 100644 src/Illuminate/Remote/MultiConnection.php delete mode 100644 src/Illuminate/Remote/RemoteManager.php delete mode 100644 src/Illuminate/Remote/RemoteServiceProvider.php delete mode 100644 src/Illuminate/Remote/SecLibGateway.php delete mode 100644 src/Illuminate/Remote/composer.json delete mode 100644 src/Illuminate/Support/Facades/SSH.php delete mode 100644 tests/Remote/RemoteSecLibGatewayTest.php diff --git a/composer.json b/composer.json index 559137b2..6a6ced23 100755 --- a/composer.json +++ b/composer.json @@ -19,7 +19,6 @@ "nesbot/carbon": "^2.71", "opis/closure": "~3.6", "pda/pheanstalk": "~4.0", - "phpseclib/phpseclib": "~3.0.36", "predis/predis": "^1.1", "symfony/browser-kit": "~6.4", "symfony/console": "~6.4", @@ -59,7 +58,6 @@ "illuminate/pagination": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", - "illuminate/remote": "self.version", "illuminate/routing": "self.version", "illuminate/session": "self.version", "illuminate/support": "self.version", diff --git a/src/Illuminate/Foundation/Application.php b/src/Illuminate/Foundation/Application.php index f2deb35e..b7c0a7a6 100755 --- a/src/Illuminate/Foundation/Application.php +++ b/src/Illuminate/Foundation/Application.php @@ -1142,7 +1142,6 @@ public function registerCoreContainerAliases() 'router' => 'Illuminate\Routing\Router', 'session' => 'Illuminate\Session\SessionManager', 'session.store' => 'Illuminate\Session\Store', - 'remote' => 'Illuminate\Remote\RemoteManager', 'url' => 'Illuminate\Routing\UrlGenerator', 'validator' => 'Illuminate\Validation\Factory', 'view' => 'Illuminate\View\Factory', diff --git a/src/Illuminate/Foundation/Console/TailCommand.php b/src/Illuminate/Foundation/Console/TailCommand.php deleted file mode 100644 index 9dee85f3..00000000 --- a/src/Illuminate/Foundation/Console/TailCommand.php +++ /dev/null @@ -1,168 +0,0 @@ -getPath($this->argument('connection')); - - if ($path) - { - $this->tailLogFile($path, $this->argument('connection')); - } - else - { - $this->error('Could not determine path to log file.'); - } - - return 0; - } - - /** - * Tail the given log file for the connection. - * - * @param string $path - * @param string $connection - * @return void - */ - protected function tailLogFile($path, $connection) - { - if (is_null($connection)) - { - $this->tailLocalLogs($path); - } - else - { - $this->tailRemoteLogs($path, $connection); - } - } - - /** - * Tail a local log file for the application. - * - * @param string $path - * @return string - */ - protected function tailLocalLogs($path) - { - $output = $this->output; - - $lines = $this->option('lines'); - - Process::fromShellCommandline('tail -f -n '.$lines.' '.escapeshellarg($path)) - ->setTimeout(null) - ->run(function($type, $line) use ($output) { - $output->write($line); - }); - } - - /** - * Tail a remote log file at the given path and connection. - * - * @param string $path - * @param string $connection - * @return void - */ - protected function tailRemoteLogs($path, $connection) - { - $out = $this->output; - - $lines = $this->option('lines'); - - $this->getRemote($connection)->run('tail -f -n '.$lines.' '.escapeshellarg($path), function($line) use ($out) - { - $out->write($line); - }); - } - - /** - * Get a connection to the remote server. - * - * @param string $connection - * @return \Illuminate\Remote\Connection - */ - protected function getRemote($connection) - { - return $this->laravel['remote']->connection($connection); - } - - /** - * Get the path to the Laravel log file. - * - * @param string $connection - * @return string - */ - protected function getPath($connection) - { - if ($this->option('path')) return $this->option('path'); - - if (is_null($connection)) - { - return storage_path('/logs/laravel.log'); - } - - return $this->getRoot($connection).str_replace(base_path(), '', storage_path()).'/logs/laravel.log'; - } - - /** - * Get the path to the Laravel install root. - * - * @param string $connection - * @return string - */ - protected function getRoot($connection) - { - return $this->laravel['config']['remote.connections.'.$connection.'.root']; - } - - /** - * Get the console command arguments. - * - * @return array - */ - protected function getArguments() - { - return array( - array('connection', InputArgument::OPTIONAL, 'The remote connection name'), - ); - } - - /** - * Get the console command options. - * - * @return array - */ - protected function getOptions() - { - return array( - array('path', null, InputOption::VALUE_OPTIONAL, 'The fully qualified path to the log file.'), - - array('lines', null, InputOption::VALUE_OPTIONAL, 'The number of lines to tail.', 20), - ); - } - -} diff --git a/src/Illuminate/Remote/Connection.php b/src/Illuminate/Remote/Connection.php deleted file mode 100644 index 18042da6..00000000 --- a/src/Illuminate/Remote/Connection.php +++ /dev/null @@ -1,262 +0,0 @@ -name = $name; - $this->host = $host; - $this->username = $username; - $this->gateway = $gateway ?: new SecLibGateway($host, $auth, new Filesystem); - } - - /** - * Define a set of commands as a task. - * - * @param string $task - * @param string|array $commands - * @return void - */ - public function define($task, $commands) - { - $this->tasks[$task] = $commands; - } - - /** - * Run a task against the connection. - * - * @param string $task - * @param \Closure $callback - * @return void - */ - public function task($task, Closure $callback = null) - { - if (isset($this->tasks[$task])) - { - return $this->run($this->tasks[$task], $callback); - } - } - - /** - * Run a set of commands against the connection. - * - * @param string|array $commands - * @param \Closure $callback - * @return void - */ - public function run($commands, Closure $callback = null) - { - // First, we will initialize the SSH gateway, and then format the commands so - // they can be run. Once we have the commands formatted and the server is - // ready to go we will just fire off these commands against the server. - $gateway = $this->getGateway(); - - $callback = $this->getCallback($callback); - - $gateway->run($this->formatCommands($commands)); - - // After running the commands against the server, we will continue to ask for - // the next line of output that is available, and write it them out using - // our callback. Once we hit the end of output, we'll bail out of here. - while (true) - { - if (is_null($line = $gateway->nextLine())) break; - - call_user_func($callback, $line, $this); - } - } - - /** - * Download the contents of a remote file. - * - * @param string $remote - * @param string $local - * @return void - */ - public function get($remote, $local) - { - $this->getGateway()->get($remote, $local); - } - - /** - * Get the contents of a remote file. - * - * @param string $remote - * @return string - */ - public function getString($remote) - { - return $this->getGateway()->getString($remote); - } - - /** - * Upload a local file to the server. - * - * @param string $local - * @param string $remote - * @return void - */ - public function put($local, $remote) - { - $this->getGateway()->put($local, $remote); - } - - /** - * Upload a string to to the given file on the server. - * - * @param string $remote - * @param string $contents - * @return void - */ - public function putString($remote, $contents) - { - $this->getGateway()->putString($remote, $contents); - } - - /** - * Display the given line using the default output. - * - * @param string $line - * @return void - */ - public function display($line) - { - $server = $this->username.'@'.$this->host; - - $lead = '['.$server.'] ('.$this->name.')'; - - $this->getOutput()->writeln($lead.' '.$line); - } - - /** - * Format the given command set. - * - * @param string|array $commands - * @return string - */ - protected function formatCommands($commands) - { - return is_array($commands) ? implode(' && ', $commands) : $commands; - } - - /** - * Get the display callback for the connection. - * - * @param \Closure|null $callback - * @return \Closure - */ - protected function getCallback($callback) - { - if ( ! is_null($callback)) return $callback; - - return function($line) { $this->display($line); }; - } - - /** - * Get the exit status of the last command. - * - * @return int|bool - */ - public function status() - { - return $this->gateway->status(); - } - - /** - * Get the gateway implementation. - * - * @return \Illuminate\Remote\GatewayInterface - * - * @throws \RuntimeException - */ - public function getGateway() - { - if ( ! $this->gateway->connected() && ! $this->gateway->connect($this->username)) - { - throw new \RuntimeException("Unable to connect to remote server."); - } - - return $this->gateway; - } - - /** - * Get the output implementation for the connection. - * - * @return \Symfony\Component\Console\Output\OutputInterface - */ - public function getOutput() - { - if (is_null($this->output)) $this->output = new NullOutput; - - return $this->output; - } - - /** - * Set the output implementation. - * - * @param \Symfony\Component\Console\Output\OutputInterface $output - * @return void - */ - public function setOutput(OutputInterface $output) - { - $this->output = $output; - } - -} diff --git a/src/Illuminate/Remote/ConnectionInterface.php b/src/Illuminate/Remote/ConnectionInterface.php deleted file mode 100644 index 0b46ab39..00000000 --- a/src/Illuminate/Remote/ConnectionInterface.php +++ /dev/null @@ -1,52 +0,0 @@ -connections = $connections; - } - - /** - * Define a set of commands as a task. - * - * @param string $task - * @param string|array $commands - * @return void - */ - public function define($task, $commands) - { - foreach ($this->connections as $connection) - { - $connection->define($task, $commands); - } - } - - /** - * Run a task against the connection. - * - * @param string $task - * @param \Closure $callback - * @return void - */ - public function task($task, Closure $callback = null) - { - foreach ($this->connections as $connection) - { - $connection->task($task, $callback); - } - } - - /** - * Run a set of commands against the connection. - * - * @param string|array $commands - * @param \Closure $callback - * @return void - */ - public function run($commands, Closure $callback = null) - { - foreach ($this->connections as $connection) - { - $connection->run($commands, $callback); - } - } - - /** - * Upload a local file to the server. - * - * @param string $local - * @param string $remote - * @return void - */ - public function put($local, $remote) - { - foreach ($this->connections as $connection) - { - $connection->put($local, $remote); - } - } - - /** - * Upload a string to to the given file on the server. - * - * @param string $remote - * @param string $contents - * @return void - */ - public function putString($remote, $contents) - { - foreach ($this->connections as $connection) - { - $connection->putString($remote, $contents); - } - } - -} diff --git a/src/Illuminate/Remote/RemoteManager.php b/src/Illuminate/Remote/RemoteManager.php deleted file mode 100644 index 7d01f189..00000000 --- a/src/Illuminate/Remote/RemoteManager.php +++ /dev/null @@ -1,199 +0,0 @@ -app = $app; - } - - /** - * Get a remote connection instance. - * - * @param string|array|mixed $name - * @return \Illuminate\Remote\ConnectionInterface - */ - public function into($name) - { - if (is_string($name) || is_array($name)) - { - return $this->connection($name); - } - - return $this->connection(func_get_args()); - } - - /** - * Get a remote connection instance. - * - * @param string|array $name - * @return \Illuminate\Remote\ConnectionInterface - */ - public function connection($name = null) - { - if (is_array($name)) return $this->multiple($name); - - return $this->resolve($name ?: $this->getDefaultConnection()); - } - - /** - * Get a connection group instance by name. - * - * @param string $name - * @return \Illuminate\Remote\ConnectionInterface - */ - public function group($name) - { - return $this->connection($this->app['config']['remote.groups.'.$name]); - } - - /** - * Resolve a multiple connection instance. - * - * @param array $names - * @return \Illuminate\Remote\MultiConnection - */ - public function multiple(array $names) - { - return new MultiConnection(array_map($this->resolve(...), $names)); - } - - /** - * Resolve a remote connection instance. - * - * @param string $name - * @return \Illuminate\Remote\Connection - */ - public function resolve($name) - { - return $this->makeConnection($name, $this->getConfig($name)); - } - - /** - * Make a new connection instance. - * - * @param string $name - * @param array $config - * @return \Illuminate\Remote\Connection - */ - protected function makeConnection($name, array $config) - { - $this->setOutput($connection = new Connection( - - $name, $config['host'], $config['username'], $this->getAuth($config) - - )); - - return $connection; - } - - /** - * Set the output implementation on the connection. - * - * @param \Illuminate\Remote\Connection $connection - * @return void - */ - protected function setOutput(Connection $connection) - { - $output = php_sapi_name() == 'cli' ? new ConsoleOutput : new NullOutput; - - $connection->setOutput($output); - } - - /** - * Format the appropriate authentication array payload. - * - * @param array $config - * @return array - * - * @throws \InvalidArgumentException - */ - protected function getAuth(array $config) - { - if (isset($config['agent']) && $config['agent'] === true) - { - return array('agent' => true); - } - elseif (isset($config['key']) && trim((string) $config['key']) != '') - { - return array('key' => $config['key'], 'keyphrase' => $config['keyphrase']); - } - elseif (isset($config['keytext']) && trim((string) $config['keytext']) != '') - { - return array('keytext' => $config['keytext']); - } - elseif (isset($config['password'])) - { - return array('password' => $config['password']); - } - - throw new \InvalidArgumentException('Password / key is required.'); - } - - /** - * Get the configuration for a remote server. - * - * @param string $name - * @return array - * - * @throws \InvalidArgumentException - */ - protected function getConfig($name) - { - $config = $this->app['config']['remote.connections.'.$name]; - - if ( ! is_null($config)) return $config; - - throw new \InvalidArgumentException("Remote connection [$name] not defined."); - } - - /** - * Get the default connection name. - * - * @return string - */ - public function getDefaultConnection() - { - return $this->app['config']['remote.default']; - } - - /** - * Set the default connection name. - * - * @param string $name - * @return void - */ - public function setDefaultConnection($name) - { - $this->app['config']['remote.default'] = $name; - } - - /** - * Dynamically pass methods to the default connection. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return call_user_func_array(array($this->connection(), $method), $parameters); - } - -} diff --git a/src/Illuminate/Remote/RemoteServiceProvider.php b/src/Illuminate/Remote/RemoteServiceProvider.php deleted file mode 100644 index 0bceea90..00000000 --- a/src/Illuminate/Remote/RemoteServiceProvider.php +++ /dev/null @@ -1,37 +0,0 @@ -app->bindShared('remote', function($app) - { - return new RemoteManager($app); - }); - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return array('remote'); - } - -} diff --git a/src/Illuminate/Remote/SecLibGateway.php b/src/Illuminate/Remote/SecLibGateway.php deleted file mode 100644 index 28103a9b..00000000 --- a/src/Illuminate/Remote/SecLibGateway.php +++ /dev/null @@ -1,322 +0,0 @@ -auth = $auth; - $this->files = $files; - $this->setHostAndPort($host); - } - - /** - * Set the host and port from a full host string. - * - * @param string $host - * @return void - */ - protected function setHostAndPort($host) - { - if ( ! Str::contains($host, ':')) - { - $this->host = $host; - } - else - { - list($this->host, $this->port) = explode(':', $host); - - $this->port = (int) $this->port; - } - } - - /** - * Connect to the SSH server. - * - * @param string $username - * @return bool - */ - public function connect($username) - { - return $this->getConnection()->login($username, $this->getAuthForLogin()); - } - - /** - * Determine if the gateway is connected. - * - * @return bool - */ - public function connected() - { - return $this->getConnection()->isConnected(); - } - - /** - * Run a command against the server (non-blocking). - * - * @param string $command - * @return void - */ - public function run($command) - { - $this->getConnection()->exec($command, false); - } - - /** - * Download the contents of a remote file. - * - * @param string $remote - * @param string $local - * @return void - */ - public function get($remote, $local) - { - $this->getConnection()->get($remote, $local); - } - - /** - * Get the contents of a remote file. - * - * @param string $remote - * @return string - */ - public function getString($remote) - { - return $this->getConnection()->get($remote); - } - - /** - * Upload a local file to the server. - * - * @param string $local - * @param string $remote - * @return void - */ - public function put($local, $remote) - { - $this->getConnection()->put($remote, $local, NET_SFTP_LOCAL_FILE); - } - - /** - * Upload a string to to the given file on the server. - * - * @param string $remote - * @param string $contents - * @return void - */ - public function putString($remote, $contents) - { - $this->getConnection()->put($remote, $contents); - } - - /** - * Get the next line of output from the server. - * - * @return string|null - */ - public function nextLine() - { - $value = $this->getConnection()->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - - return $value === true ? null : $value; - } - - /** - * Get the authentication object for login. - * - * @return \Crypt_RSA|\System_SSH_Agent|string - * @throws \InvalidArgumentException - */ - protected function getAuthForLogin() - { - if ($this->useAgent()) return $this->getAgent(); - - // If a "key" was specified in the auth credentials, we will load it into a - // secure RSA key instance, which will be used to connect to the servers - // in place of a password, and avoids the developer specifying a pass. - elseif ($this->hasRsaKey()) - { - return $this->loadRsaKey($this->auth); - } - - // If a plain password was set on the auth credentials, we will just return - // that as it can be used to connect to the server. This will be used if - // there is no RSA key and it gets specified in the credential arrays. - elseif (isset($this->auth['password'])) - { - return $this->auth['password']; - } - - throw new \InvalidArgumentException('Password / key is required.'); - } - - /** - * Determine if an RSA key is configured. - * - * @return bool - */ - protected function hasRsaKey() - { - $hasKey = (isset($this->auth['key']) && trim((string) $this->auth['key']) != ''); - - return $hasKey || (isset($this->auth['keytext']) && trim((string) $this->auth['keytext']) != ''); - } - - /** - * Load the RSA key instance. - * - * @param array $auth - * @return \Crypt_RSA - */ - protected function loadRsaKey(array $auth) - { - with($key = $this->getKey($auth))->loadKey($this->readRsaKey($auth)); - - return $key; - } - - /** - * Read the contents of the RSA key. - * - * @param array $auth - * @return string - */ - protected function readRsaKey(array $auth) - { - if (isset($auth['key'])) return $this->files->get($auth['key']); - - return $auth['keytext']; - } - - /** - * Create a new RSA key instance. - * - * @param array $auth - * @return \Crypt_RSA - */ - protected function getKey(array $auth) - { - with($key = $this->getNewKey())->setPassword(array_get($auth, 'keyphrase')); - - return $key; - } - - /** - * Determine if the SSH Agent should provide an RSA key. - * - * @return bool - */ - protected function useAgent() - { - return isset($this->auth['agent']) && $this->auth['agent'] === true; - } - - /** - * Get a new SSH Agent instance. - * - * @return \System_SSH_Agent - */ - public function getAgent() - { - return new System_SSH_Agent; - } - - /** - * Get a new RSA key instance. - * - * @return \Crypt_RSA - */ - public function getNewKey() - { - return new Crypt_RSA; - } - - /** - * Get the exit status of the last command. - * - * @return int|bool - */ - public function status() - { - return $this->getConnection()->getExitStatus(); - } - - /** - * Get the host used by the gateway. - * - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * Get the port used by the gateway. - * - * @return int - */ - public function getPort() - { - return $this->port; - } - - /** - * Get the underlying Net_SFTP connection. - * - * @return \Net_SFTP - */ - public function getConnection() - { - if ($this->connection) return $this->connection; - - return $this->connection = new Net_SFTP($this->host, $this->port); - } - -} diff --git a/src/Illuminate/Remote/composer.json b/src/Illuminate/Remote/composer.json deleted file mode 100644 index f7bb904d..00000000 --- a/src/Illuminate/Remote/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "illuminate/remote", - "license": "MIT", - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" - } - ], - "require": { - "php": ">=5.4.0", - "illuminate/filesystem": "4.2.*", - "illuminate/support": "4.2.*", - "phpseclib/phpseclib": "0.3.*" - }, - "require-dev": { - "illuminate/console": "4.2.*" - }, - "autoload": { - "psr-0": { - "Illuminate\\Remote": "" - } - }, - "target-dir": "Illuminate/Remote", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "minimum-stability": "dev" -} diff --git a/src/Illuminate/Support/Facades/SSH.php b/src/Illuminate/Support/Facades/SSH.php deleted file mode 100644 index 5178a4b0..00000000 --- a/src/Illuminate/Support/Facades/SSH.php +++ /dev/null @@ -1,16 +0,0 @@ -getGateway(); - $this->assertEquals('127.0.0.1', $gateway->getHost()); - $this->assertEquals(22, $gateway->getPort()); - } - - - public function testConnectProperlyCallsLoginWithAuth() - { - $gateway = $this->getGateway(); - $gateway->shouldReceive('getNewKey')->andReturn($key = m::mock('StdClass')); - $key->shouldReceive('setPassword')->once()->with('keyphrase'); - $key->shouldReceive('loadKey')->once()->with('keystuff'); - $gateway->getConnection()->shouldReceive('login')->with('taylor', $key); - - $gateway->connect('taylor'); - } - - - public function testKeyTextCanBeSetManually() - { - $files = m::mock(Filesystem::class); - $gateway = m::mock(SecLibGateway::class, ['127.0.0.1:22', ['username' => 'taylor', 'keytext' => 'keystuff'], $files] - )->makePartial(); - $gateway->shouldReceive('getConnection')->andReturn(m::mock('StdClass')); - $gateway->shouldReceive('getNewKey')->andReturn($key = m::mock('StdClass')); - $key->shouldReceive('setPassword')->once()->with(null); - $key->shouldReceive('loadKey')->once()->with('keystuff'); - $gateway->getConnection()->shouldReceive('login')->with('taylor', $key); - - $gateway->connect('taylor'); - } - - - public function getGateway() - { - $files = m::mock(Filesystem::class); - $files->shouldReceive('get')->with('keypath')->andReturn('keystuff'); - $gateway = m::mock(SecLibGateway::class, ['127.0.0.1:22', ['username' => 'taylor', 'key' => 'keypath', 'keyphrase' => 'keyphrase'], $files] - )->makePartial(); - $gateway->shouldReceive('getConnection')->andReturn(m::mock('StdClass')); - return $gateway; - } - -} From 3b50da99771433b27b1d0ec75c5e31570a739ae0 Mon Sep 17 00:00:00 2001 From: agis Date: Tue, 3 Mar 2026 16:47:28 +0700 Subject: [PATCH 4/6] remove import --- src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php index 2881bc76..c49b883f 100755 --- a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php @@ -2,7 +2,6 @@ use Illuminate\Foundation\Artisan; use Illuminate\Support\ServiceProvider; -use Illuminate\Foundation\Console\TailCommand; use Illuminate\Foundation\Console\ChangesCommand; use Illuminate\Foundation\Console\EnvironmentCommand; From 73cadb9c446ffe5eda1b343f3f9ddb683f7c082a Mon Sep 17 00:00:00 2001 From: agis Date: Tue, 3 Mar 2026 16:49:36 +0700 Subject: [PATCH 5/6] remove unused command --- .../Foundation/Providers/ArtisanServiceProvider.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php index c49b883f..5cac8785 100755 --- a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php @@ -26,11 +26,6 @@ public function register() return new Artisan($app); }); - $this->app->bindShared('command.tail', function() - { - return new TailCommand; - }); - $this->app->bindShared('command.changes', function() { return new ChangesCommand; From 35284c6120489c43172a26bf377e59bf991f2495 Mon Sep 17 00:00:00 2001 From: agis Date: Wed, 4 Mar 2026 13:32:17 +0700 Subject: [PATCH 6/6] remove command tail --- src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php index 5cac8785..16f25214 100755 --- a/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/ArtisanServiceProvider.php @@ -36,7 +36,7 @@ public function register() return new EnvironmentCommand; }); - $this->commands('command.tail', 'command.changes', 'command.environment'); + $this->commands( 'command.changes', 'command.environment'); } /**