File "Installer.php"
Full Path: /home/pulsehostuk9/public_html/invoicer.pulsehost.co.uk/vendor/invoiceshelf/modules/src/Facades/Installer.php
File size: 6.26 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace Nwidart\Modules\Process;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
use Nwidart\Modules\Contracts\RepositoryInterface;
use Symfony\Component\Process\Process;
class Installer
{
/**
* The module name.
*
* @var string
*/
protected $name;
/**
* The version of module being installed.
*
* @var string
*/
protected $version;
/**
* The module repository instance.
* @var \Nwidart\Modules\Contracts\RepositoryInterface
*/
protected $repository;
/**
* The console command instance.
*
* @var \Illuminate\Console\Command
*/
protected $console;
/**
* The destionation path.
*
* @var string
*/
protected $path;
/**
* The process timeout.
*
* @var int
*/
protected $timeout = 3360;
/**
* @var null|string
*/
private $type;
/**
* @var bool
*/
private $tree;
/**
* The constructor.
*
* @param string $name
* @param string $version
* @param string $type
* @param bool $tree
*/
public function __construct($name, $version = null, $type = null, $tree = false)
{
$this->name = $name;
$this->version = $version;
$this->type = $type;
$this->tree = $tree;
}
/**
* Set destination path.
*
* @param string $path
*
* @return $this
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Set the module repository instance.
* @param \Nwidart\Modules\Contracts\RepositoryInterface $repository
* @return $this
*/
public function setRepository(RepositoryInterface $repository)
{
$this->repository = $repository;
return $this;
}
/**
* Set console command instance.
*
* @param \Illuminate\Console\Command $console
*
* @return $this
*/
public function setConsole(Command $console)
{
$this->console = $console;
return $this;
}
/**
* Set process timeout.
*
* @param int $timeout
*
* @return $this
*/
public function setTimeout($timeout)
{
$this->timeout = $timeout;
return $this;
}
/**
* Run the installation process.
*
* @return \Symfony\Component\Process\Process
*/
public function run()
{
$process = $this->getProcess();
$process->setTimeout($this->timeout);
if ($this->console instanceof Command) {
$process->run(function ($type, $line) {
$this->console->line($line);
});
}
return $process;
}
/**
* Get process instance.
*
* @return \Symfony\Component\Process\Process
*/
public function getProcess()
{
if ($this->type) {
if ($this->tree) {
return $this->installViaSubtree();
}
return $this->installViaGit();
}
return $this->installViaComposer();
}
/**
* Get destination path.
*
* @return string
*/
public function getDestinationPath()
{
if ($this->path) {
return $this->path;
}
return $this->repository->getModulePath($this->getModuleName());
}
/**
* Get git repo url.
*
* @return string|null
*/
public function getRepoUrl()
{
switch ($this->type) {
case 'github':
return "git@github.com:{$this->name}.git";
case 'github-https':
return "https://github.com/{$this->name}.git";
case 'gitlab':
return "git@gitlab.com:{$this->name}.git";
break;
case 'bitbucket':
return "git@bitbucket.org:{$this->name}.git";
default:
// Check of type 'scheme://host/path'
if (filter_var($this->type, FILTER_VALIDATE_URL)) {
return $this->type;
}
// Check of type 'user@host'
if (filter_var($this->type, FILTER_VALIDATE_EMAIL)) {
return "{$this->type}:{$this->name}.git";
}
return;
break;
}
}
/**
* Get branch name.
*
* @return string
*/
public function getBranch()
{
return is_null($this->version) ? 'master' : $this->version;
}
/**
* Get module name.
*
* @return string
*/
public function getModuleName()
{
$parts = explode('/', $this->name);
return Str::studly(end($parts));
}
/**
* Get composer package name.
*
* @return string
*/
public function getPackageName()
{
if (is_null($this->version)) {
return $this->name . ':dev-master';
}
return $this->name . ':' . $this->version;
}
/**
* Install the module via git.
*
* @return \Symfony\Component\Process\Process
*/
public function installViaGit()
{
return Process::fromShellCommandline(sprintf(
'cd %s && git clone %s %s && cd %s && git checkout %s',
base_path(),
$this->getRepoUrl(),
$this->getDestinationPath(),
$this->getDestinationPath(),
$this->getBranch()
));
}
/**
* Install the module via git subtree.
*
* @return \Symfony\Component\Process\Process
*/
public function installViaSubtree()
{
return Process::fromShellCommandline(sprintf(
'cd %s && git remote add %s %s && git subtree add --prefix=%s --squash %s %s',
base_path(),
$this->getModuleName(),
$this->getRepoUrl(),
$this->getDestinationPath(),
$this->getModuleName(),
$this->getBranch()
));
}
/**
* Install the module via composer.
*
* @return \Symfony\Component\Process\Process
*/
public function installViaComposer()
{
return Process::fromShellCommandline(sprintf(
'cd %s && composer require %s',
base_path(),
$this->getPackageName()
));
}
}