forked from composer/composer
/
ArchiveStorage.php
128 lines (112 loc) · 3.14 KB
/
ArchiveStorage.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Storage;
use Composer\Util\Archive\CompressorInterface;
use Composer\Package\PackageInterface;
/**
* PackageStorageInterface local archive implementation
*
* @author Kirill chEbba Chebunin <iam@chebba.org>
*/
class ArchiveStorage implements StorageInterface
{
/**
* @var string
*/
private $storageDir;
/**
* @var CompressorInterface
*/
private $compressor;
/**
* Constructor
*
* @param string $storageDir Directory to store package archives
* @param CompressorInterface $compressor Archive compressor instance
*/
public function __construct($storageDir, CompressorInterface $compressor)
{
$this->storageDir = $storageDir;
$this->compressor = $compressor;
}
/**
* Get storage directory
*
* @return string
*/
public function getStorageDir()
{
return $this->storageDir;
}
/**
* Get compressor
*
* @return CompressorInterface
*/
public function getCompressor()
{
return $this->compressor;
}
/**
* {@inheritDoc}
*/
public function storePackage(PackageInterface $package, $sourceDir)
{
$fileName = $this->packageFilename($package);
$dir = dirname($fileName);
if (!is_dir($dir) && !@mkdir($dir, 0777, true)) {
throw new \RuntimeException('Can not initialize directory structure in ' . $dir);
}
$tempFileName = sys_get_temp_dir().'/'.uniqid(basename($fileName));
$this->compressor->compressDir($sourceDir, $tempFileName);
if (!@rename($tempFileName, $fileName)) {
throw new \RuntimeException(sprintf('Can not rename file from %s to %s.', $tempFileName, $fileName));
}
return $this->createDistribution($fileName);
}
/**
* {@inheritDoc}
*/
public function retrievePackage(PackageInterface $package)
{
$fileName = $this->packageFilename($package);
return $this->hasPackage($package) ? $this->createDistribution($fileName) : null;
}
/**
* {@inheritDoc}
*/
public function hasPackage(PackageInterface $package)
{
return file_exists($this->packageFilename($package));
}
/**
* Get stored package filename
*
* @param PackageInterface $package Original package
*
* @return string Filename
*/
private function packageFilename(PackageInterface $package)
{
return sprintf('%s/%s.%s', $this->storageDir, $package->getUniqueName(), $this->compressor->getArchiveType());
}
/**
* Create a distribution object for file
*
* @param string $fileName
*
* @return PackageDistribution
*/
private function createDistribution($fileName)
{
return new PackageDistribution($this->compressor->getArchiveType(), $fileName, @sha1_file($fileName));
}
}