1
0
Fork 0

Merge remote-tracking branch 'austris-argalis/issue-7085'

pull/7280/head
Jordi Boggiano 2018-04-13 13:11:46 +02:00
commit 24ad6307a7
4 changed files with 139 additions and 2 deletions

View File

@ -218,7 +218,8 @@ class FileDownloader implements DownloaderInterface
$from = $initial->getPrettyVersion(); $from = $initial->getPrettyVersion();
$to = $target->getPrettyVersion(); $to = $target->getPrettyVersion();
$this->io->writeError(" - Updating <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false); $actionName = version_compare($from, $to, '<') ? 'Updating' : 'Downgrading';
$this->io->writeError(" - " . $actionName . " <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false);
$this->remove($initial, $path, false); $this->remove($initial, $path, false);
$this->download($target, $path, false); $this->download($target, $path, false);

View File

@ -130,7 +130,8 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
$to = $target->getFullPrettyVersion(); $to = $target->getFullPrettyVersion();
} }
$this->io->writeError(" - Updating <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false); $actionName = $this->packageCompare($initial, $target, '>') ? 'Downgrading' : 'Updating';
$this->io->writeError(" - " . $actionName . " <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false);
$this->cleanChanges($initial, $path, true); $this->cleanChanges($initial, $path, true);
$urls = $target->getSourceUrls(); $urls = $target->getSourceUrls();
@ -242,6 +243,23 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
} }
} }
/**
* Compare two packages. Always false if both versions are references
*
* @param PackageInterface $initial
* @param PackageInterface $target
* @param string $operation
* @return bool
*/
protected function packageCompare(PackageInterface $initial, PackageInterface $target, $operation = '<')
{
if ($initial->getPrettyVersion() == $target->getPrettyVersion()) {
return false;
}
return version_compare($initial->getFullPrettyVersion(), $target->getFullPrettyVersion(), $operation);
}
/** /**
* Guarantee that no changes have been made to the local copy * Guarantee that no changes have been made to the local copy
* *

View File

@ -205,4 +205,38 @@ class FileDownloaderTest extends TestCase
$this->assertContains('checksum verification', $e->getMessage()); $this->assertContains('checksum verification', $e->getMessage());
} }
} }
public function testDowngradeShowsAppropriateMessage()
{
$oldPackage = $this->getMock('Composer\Package\PackageInterface');
$oldPackage->expects($this->once())
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$oldPackage->expects($this->any())
->method('getDistUrl')
->will($this->returnValue($distUrl = 'http://example.com/script.js'));
$oldPackage->expects($this->once())
->method('getDistUrls')
->will($this->returnValue(array($distUrl)));
$newPackage = $this->getMock('Composer\Package\PackageInterface');
$newPackage->expects($this->once())
->method('getPrettyVersion')
->will($this->returnValue('1.2.0'));
$ioMock = $this->getMock('Composer\IO\IOInterface');
$ioMock->expects(($this->at(0)))
->method('writeError')
->with($this->stringContains('Downgrading'));
$path = $this->getUniqueTmpDirectory();
touch($path.'/script.js');
$filesystem = $this->getMock('Composer\Util\Filesystem');
$filesystem->expects($this->once())
->method('removeDirectory')
->will($this->returnValue(true));
$downloader = $this->getDownloader($ioMock, null, null, null, null, $filesystem);
$downloader->update($newPackage, $oldPackage, $path);
}
} }

View File

@ -596,6 +596,90 @@ composer https://github.com/old/url (push)
$downloader->update($packageMock, $packageMock, $this->workingDir); $downloader->update($packageMock, $packageMock, $this->workingDir);
} }
public function testDowngradeShowsAppropriateMessage()
{
$oldPackage = $this->getMock('Composer\Package\PackageInterface');
$oldPackage->expects($this->any())
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$oldPackage->expects($this->any())
->method('getFullPrettyVersion')
->will($this->returnValue('1.0.0'));
$oldPackage->expects($this->any())
->method('getSourceReference')
->will($this->returnValue('ref'));
$oldPackage->expects($this->any())
->method('getSourceUrls')
->will($this->returnValue(array('/foo/bar', 'https://github.com/composer/composer')));
$newPackage = $this->getMock('Composer\Package\PackageInterface');
$newPackage->expects($this->any())
->method('getSourceReference')
->will($this->returnValue('ref'));
$newPackage->expects($this->any())
->method('getSourceUrls')
->will($this->returnValue(array('https://github.com/composer/composer')));
$newPackage->expects($this->any())
->method('getPrettyVersion')
->will($this->returnValue('1.2.0'));
$newPackage->expects($this->any())
->method('getFullPrettyVersion')
->will($this->returnValue('1.2.0'));
$processExecutor = $this->getMock('Composer\Util\ProcessExecutor');
$processExecutor->expects($this->any())
->method('execute')
->will($this->returnValue(0));
$ioMock = $this->getMock('Composer\IO\IOInterface');
$ioMock->expects(($this->at(0)))
->method('writeError')
->with($this->stringContains('Downgrading'));
$this->fs->ensureDirectoryExists($this->workingDir.'/.git');
$downloader = $this->getDownloaderMock($ioMock, null, $processExecutor);
$downloader->update($newPackage, $oldPackage, $this->workingDir);
}
public function testNotUsingDowngradingWithReferences()
{
$oldPackage = $this->getMock('Composer\Package\PackageInterface');
$oldPackage->expects($this->any())
->method('getPrettyVersion')
->will($this->returnValue('ref'));
$oldPackage->expects($this->any())
->method('getSourceReference')
->will($this->returnValue('ref'));
$oldPackage->expects($this->any())
->method('getSourceUrls')
->will($this->returnValue(array('/foo/bar', 'https://github.com/composer/composer')));
$newPackage = $this->getMock('Composer\Package\PackageInterface');
$newPackage->expects($this->any())
->method('getSourceReference')
->will($this->returnValue('ref'));
$newPackage->expects($this->any())
->method('getSourceUrls')
->will($this->returnValue(array('https://github.com/composer/composer')));
$newPackage->expects($this->any())
->method('getPrettyVersion')
->will($this->returnValue('ref'));
$processExecutor = $this->getMock('Composer\Util\ProcessExecutor');
$processExecutor->expects($this->any())
->method('execute')
->will($this->returnValue(0));
$ioMock = $this->getMock('Composer\IO\IOInterface');
$ioMock->expects(($this->at(0)))
->method('writeError')
->with($this->stringContains('updating'));
$this->fs->ensureDirectoryExists($this->workingDir.'/.git');
$downloader = $this->getDownloaderMock($ioMock, null, $processExecutor);
$downloader->update($newPackage, $oldPackage, $this->workingDir);
}
public function testRemove() public function testRemove()
{ {
$expectedGitResetCommand = $this->winCompat("cd 'composerPath' && git status --porcelain --untracked-files=no"); $expectedGitResetCommand = $this->winCompat("cd 'composerPath' && git status --porcelain --untracked-files=no");