Compare commits

..

29 Commits

Author SHA1 Message Date
Anatol Belski
0cd8d902c0 2.0.11 2017-09-15 23:00:47 +02:00
Anatol Belski
c7c874e9b4 Improve messaging for locked dependency path 2017-09-15 10:47:22 +02:00
Anatol Belski
97112e4dd0 Refactor lock also wrt shared/exclusive 2017-09-15 10:36:13 +02:00
Anatol Belski
098f6457de Folds 2017-09-15 09:23:48 +02:00
Anatol Belski
a5afa11cff Integrate locking into the dep update process 2017-09-14 18:49:14 +02:00
Anatol Belski
6b58f91d9d Fix and improve lock class 2017-09-14 18:48:43 +02:00
Anatol Belski
bb5ff05cc5 Add locker class 2017-09-14 18:07:37 +02:00
Anatol Belski
4b51347c35 Lock while caching 2017-09-14 16:54:03 +02:00
Anatol Belski
7d48cafe29 Folds 2017-09-14 16:25:35 +02:00
Anatol Belski
d802183581 Adjust description 2017-09-05 12:45:08 +02:00
Anatol Belski
741063cdf1 Support branch recognition when working under dev package 2017-09-05 12:38:02 +02:00
Jerry
a97d0bd292 Fix Arch determintion 2017-09-01 15:52:35 +02:00
Anatol Belski
5507b37b7d Add pretty option 2017-08-29 10:46:39 +02:00
Anatol Belski
7c72855fd0 Rework dllmap script 2017-08-28 16:11:49 +02:00
Anatol Belski
b5829cd502 Note pwgen presence 2017-08-28 14:36:26 +02:00
Anatol Belski
de669c7610 Back to dev 2017-08-28 13:08:32 +02:00
Anatol Belski
f96fbeddab 2.0.10 2017-08-28 13:07:34 +02:00
Anatol Belski
ceececf83f Improve the pack command, show more info and translate the exit code 2017-08-28 13:05:18 +02:00
Anatol Belski
64c2ac973c Fix deps path recognition 2017-08-23 00:19:10 +02:00
Anatol Belski
79116d5051 add deps package command 2017-08-21 11:48:08 +02:00
Anatol Belski
c3bb9777bb reset errorlevel before tool run, set the current on exit 2017-08-21 10:49:42 +02:00
Anatol Belski
eae3aab2ae revert the deps path reset part and sync 2017-08-17 18:19:07 +02:00
Anatol Belski
e7e92b35d0 yet more path recognition variant 2017-08-17 16:33:32 +02:00
Anatol Belski
d158c3c032 add possibility to reevaluate the deps path 2017-08-17 16:17:47 +02:00
Anatol Belski
69fb69fd93 no realpath needed 2017-08-17 15:33:38 +02:00
Anatol Belski
aee165fe05 refactor dependency dir recognition 2017-08-17 14:06:01 +02:00
Anatol Belski
022333118e upgrade vswhere 2017-08-12 14:30:55 +02:00
Anatol Belski
821c0d7c73 extend .gitignore 2017-07-26 17:14:46 +02:00
Anatol Belski
7d72596e85 back to dev 2017-07-24 23:00:09 +02:00
18 changed files with 275 additions and 50 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@ php55
php56
php70
php71
php72
phpmaster
php
!lib/php

View File

@@ -37,7 +37,7 @@ All the tools included are either scripts or 32-bit binaries. They are therefore
- `diff`, `diff3`, `patch`
- `md5sum`, `sha1sum`, `sha224sum`, `sha256sum`, `sha384sum`, `sha512sum`
- `7za`, `zip`, `unzip`, `unzipsfx`
- `wget`
- `wget`, `pwgen`
## Optional, not included

View File

@@ -1 +1 @@
2.0.9
2.0.11

View File

@@ -7,6 +7,8 @@ IF "%2" EQU "" SET _=%CD%\%1
rem if we're in the starter script shell, create the only struct that corresponds to the current env
rem otherwise - retain the old behavior, create structs for all the known build combinations and don't cd
cmd /c "exit /b 0"
if "%PHP_SDK_ARCH%" NEQ "" (
if "%PHP_SDK_VC%" NEQ "" (
MD %_%\%PHP_SDK_VC%\%PHP_SDK_ARCH%\deps\bin
@@ -35,3 +37,5 @@ echo phpsdk_buildtree ^<nameofthetree^> [PATH]
echo Create the common directory structure used by the PHP SDK
:EXIT
exit /b %errorlevel%

View File

@@ -1,5 +1,7 @@
@echo off
cmd /c "exit /b 0"
if "%PHP_SDK_PHP_CMD%"=="" (
call %~dp0phpsdk_setvars.bat
if "!PHP_SDK_PHP_CMD!"=="" (
@@ -10,5 +12,5 @@ if "%PHP_SDK_PHP_CMD%"=="" (
call %PHP_SDK_PHP_CMD% %PHP_SDK_BIN_PATH%\phpsdk_deps.php %*
exit /b
exit /b %errorlevel%

View File

@@ -4,7 +4,7 @@ include dirname(__FILE__) . "/../lib/php/libsdk/autoload.php";
use SDK\{Config, Exception};
$sopt = "s:cuhb:a:d:t:fn";
$sopt = "s:cuhb:a:d:t:fnp";
$lopt = array(
"branch:",
"update",
@@ -16,6 +16,7 @@ $lopt = array(
"deps:",
"force",
"no-backup",
"pack",
);
$cmd = NULL;
@@ -87,6 +88,11 @@ try {
case "no-backup":
$backup = false;
break;
case "p":
case "pack":
$cmd = "pack";
break;
}
}
@@ -157,6 +163,16 @@ try {
$dm->performUpdate($msg, $force, $backup);
msg($msg);
break;
case "pack":
$path_to_pack = Config::getDepsLocalPath();
$pack_path = dirname($path_to_pack) . DIRECTORY_SEPARATOR . "deps-$branch-$branch_data[crt]-$branch_data[arch].7z";
print "Packaging '$path_to_pack' as '$pack_path'.\n\n";
if ($force && is_file($pack_path)) {
unlink($pack_path);
}
system("7za a $pack_path $path_to_pack", $st);
exit((int)$st);
break;
}
} catch (Throwable $e) {
@@ -171,13 +187,14 @@ function usage(int $code = -1)
echo "PHP SDK dependency handling tool.", PHP_EOL;
echo "Usage: ", PHP_EOL, PHP_EOL;
echo "Configuration:", PHP_EOL;
echo " -b --branch Branch name, eg. 7.0, 7.1, etc. If omited, CWD is used to guess.", PHP_EOL;
echo " -b --branch Branch name, eg. 7.0, 7.1, etc. If omited, several guess methods apply.", PHP_EOL;
echo " -a --arch Architecture, x86 or x64. If omited, cl.exe is used to guess.", PHP_EOL;
echo " -t --crt CRT, marked by the corresponding VC++ version, eg. vc11, vc14, etc.", PHP_EOL;
echo " -s --stability One of stable or staging.", PHP_EOL, PHP_EOL;
echo "Commands:", PHP_EOL;
echo " -c --check Check for dependency updates. If updates are available, the exit code is set to 7.", PHP_EOL;
echo " -u --update Update dependencies. If deps directory already exists, backup copy is created automatically.", PHP_EOL, PHP_EOL;
echo " -u --update Update dependencies. If deps directory already exists, backup copy is created automatically.", PHP_EOL;
echo " -p --pack Archive the dependency directory.", PHP_EOL, PHP_EOL;
echo "Misc:", PHP_EOL;
echo " -d --deps Path to the dependencies directory. If omited, CWD is used to guess.", PHP_EOL;
echo " -f --force Force the operation even if there are no upgrades available.", PHP_EOL;

View File

@@ -1,5 +1,7 @@
@echo off
cmd /c "exit /b 0"
if "%PHP_SDK_PHP_CMD%"=="" (
call %~dp0phpsdk_setvars.bat
if "!PHP_SDK_PHP_CMD!"=="" (
@@ -10,5 +12,5 @@ if "%PHP_SDK_PHP_CMD%"=="" (
call %PHP_SDK_PHP_CMD% %PHP_SDK_BIN_PATH%\phpsdk_dllmap.php %*
exit /b
exit /b %errorlevel%

View File

@@ -6,7 +6,7 @@
- create mappings between dll filename and zip filename
Usage:
php dllmap.php path0 [ path1 ... ] > dllmapping.json
php dllmap.php [--pretty] path0 [ path1 ... ] > dllmapping.json
*/
@@ -20,8 +20,25 @@
"C:\\tmp\\libs",
);*/
$sopt = "p";
$lopt = array(
"pretty",
);
$flags = 0;
$opt = getopt($sopt, $lopt);
foreach ($opt as $name => $val) {
switch ($name) {
case "p":
case "pretty":
$flags = JSON_PRETTY_PRINT;
break;
}
}
$dirs = array();
foreach (array_slice($_SERVER["argv"], 1) as $item) {
foreach (array_slice($_SERVER["argv"], (0 == $flags ? 1 : 2)) as $item) {
if (file_exists($item) && is_dir($item)) {
$dirs[] = $item;
}
@@ -32,26 +49,7 @@ if (empty($dirs)) {
die;
}
$out = array(
"vc9" => array(
"x86" => array(),
"x64" => array(),
),
"vc11" => array(
"x86" => array(),
"x64" => array(),
),
"vc12" => array(
"x86" => array(),
"x64" => array(),
),
"vc14" => array(
"x86" => array(),
"x64" => array(),
),
);
$out = array();
foreach ($dirs as $path) {
$dir = new DirectoryIterator($path);
@@ -74,6 +72,13 @@ foreach ($dirs as $path) {
$crt = $m[1];
$arch = $m[2];
if (!isset($out[$crt])) {
$out[$crt] = array();
}
if (!isset($out[$crt][$arch])) {
$out[$crt][$arch] = array();
}
$zip = new ZipArchive();
$zip->open($pathname);
@@ -100,7 +105,7 @@ foreach ($dirs as $path) {
}
}
echo json_encode($out);
echo json_encode($out, $flags);
/*
* Local variables:

View File

@@ -5,6 +5,8 @@ if "%PHP_SDK_OS_ARCH%"=="" (
exit /b 3
)
cmd /c "exit /b 0"
echo.
call %PHP_SDK_BIN_PATH%\phpsdk_version.bat
@@ -26,5 +28,5 @@ echo Visual C++: %PHP_SDK_VC_NUM%
echo PHP-SDK path: %PHP_SDK_ROOT_PATH%
exit /b
exit /b %errorlevel%

View File

@@ -13,6 +13,8 @@ if "%1"=="-h" goto :help
if "%1"=="--help" goto :help
if "%2"=="" goto :help
cmd /c "exit /b 0"
set PHP_SDK_VC=%1
if /i not "%PHP_SDK_VC:~0,2%"=="vc" (
:malformed_vc_string

View File

@@ -1,5 +1,7 @@
@echo off
cmd /c "exit /b 0"
rem Add necessary dirs to the path
set PHP_SDK_BIN_PATH=%~dp0
@@ -15,5 +17,5 @@ set PHP_SDK_PHP_CMD=%PHP_SDK_BIN_PATH%\php\do_php.bat
set PATH=%PHP_SDK_BIN_PATH%;%PHP_SDK_MSYS2_PATH%;%PATH%
exit /b
exit /b %errorlevel%

View File

@@ -1,5 +1,7 @@
@echo off
cmd /c "exit /b 0"
if "%PHP_SDK_PHP_CMD%"=="" (
call %~dp0phpsdk_setvars.bat
if "!PHP_SDK_PHP_CMD!"=="" (
@@ -10,5 +12,5 @@ if "%PHP_SDK_PHP_CMD%"=="" (
%PHP_SDK_PHP_CMD% -r "echo 'PHP SDK ' . file_get_contents(getenv('PHP_SDK_ROOT_PATH') . '\\VERSION');"
exit /b
exit /b %errorlevel%

Binary file not shown.

View File

@@ -2,7 +2,7 @@
namespace SDK\Build\Dependency;
use SDK\{Config, Cache, Exception, FileOps};
use SDK\{Config, Cache, Exception, FileOps, Lock};
class Manager
{
@@ -39,7 +39,7 @@ class Manager
public function updatesAvailable() : bool
{/*{{{*/
return $this->series->updatesAvailable();
return $this->series->updatesAvailable() || !file_exists(Config::getDepsLocalPath());
}/*}}}*/
/* FIXME implement rollback */
@@ -50,6 +50,15 @@ class Manager
$msg .= "No updates are available";
return;
}
$lock = new Lock(Config::getDepsLocalPath());
if (!$lock->locked()) {
$msg .= "Dependencies was updated by another process.";
echo "Another process is updating same dependency path. I'm just going to wait for it to finish and then exit.", PHP_EOL;
$lock->exclusive(true);
unset($lock);
return;
}
}
$series_data = $this->series->getData();
@@ -86,10 +95,16 @@ class Manager
/* This is fine, it's gonna be on the same drive. */
if (!$this->mv($this->path, $new_path)) {
if (!$force) {
unset($lock);
}
throw new Exception("Unable to rename '{$this->path}' to '$new_path'");
}
} else {
if (!$this->rm($this->path)) {
if (!$force) {
unset($lock);
}
throw new Exception("Unable to remove the current dependency dir at '{$this->path}'");
}
}
@@ -97,6 +112,9 @@ class Manager
$up = dirname($this->path);
if (!file_exists($up)) {
if (!$this->md($up)) {
if (!$force) {
unset($lock);
}
throw new Exception("Unable to create '{$this->path}'");
}
}
@@ -118,6 +136,10 @@ class Manager
} else {
$msg .= "No backup was created.";
}
if (!$force) {
unset($lock);
}
}/*}}}*/
}

View File

@@ -55,7 +55,26 @@ class Cache
{/*{{{*/
$p = $this->getCacheablePath($path, $relative);
if (strlen($content) !== file_put_contents($p, $content)) {
$to_write = strlen($content);
$wrote = 0;
$fd = fopen($p, "wb");
flock($fd, LOCK_EX);
do {
$got = fwrite($fd, substr($content, $wrote));
if (false == $got) {
break;
}
$wrote += $got;
} while ($wrote < $to_write);
flock($fd, LOCK_UN);
fclose($fd);
if ($to_write !== $wrote) {
throw new Exception("Couldn't cache '$p'");
}
}/*}}}*/

View File

@@ -55,19 +55,18 @@ class Config
if (NULL === self::$currentArchName) {
/* XXX this might be not true for other compilers! */
passthru("where cl.exe >nul", $status);
if ($status) {
throw new Exception("Couldn't find cl.exe.");
}
exec("cl.exe /? 2>&1", $a, $status);
if ($status) {
throw new Exception("Couldn't execute cl.exe.");
}
if (preg_match(",x64,", $a[0])) {
exec("cl.exe /? 2>&1", $out);
if (preg_match(",x64,", $out[0])) {
self::setCurrentArchName("x64");
} else {
} elseif (preg_match(",x86,", $out[0])) {
self::setCurrentArchName("x86");
} else {
throw new Exception("Couldn't determine Arch.");
}
}
@@ -172,10 +171,25 @@ class Config
public static function guessCurrentBranchName() : ?string
{/*{{{*/
$branch = NULL;
$found = false;
/* Try to figure out the branch. For now it only works if CWD is in php-src. */
/* Try to figure out the branch. The worky scenarios are
- CWD is in php-src
- phpize is on the path
FIXME for the dev package, there should be a php-config utility
*/
$fl = "main/php_version.h";
if (file_exists($fl)) {
$found = file_exists($fl);
if (!$found) {
exec("where phpize", $out, $status);
if (!$status) {
$fl = dirname($out[0]) . DIRECTORY_SEPARATOR . "include" . DIRECTORY_SEPARATOR . $fl;
$found = file_exists($fl);
}
}
if ($found) {
$s = file_get_contents($fl);
$major = $minor = NULL;
@@ -297,9 +311,33 @@ class Config
public static function getDepsLocalPath() : ?string
{/*{{{*/
if (NULL == self::$depsLocalPath) {
if (file_exists("../deps")) {
self::setDepsLocalPath(realpath("../deps"));
} else if (file_exists("main/php_version.h")) {
if (file_exists("Makefile")) {
$s = file_get_contents("Makefile");
if (preg_match(",PHP_BUILD=(.+),", $s, $m)) {
if (isset($m[1])) {
self::setDepsLocalPath(trim($m[1]));
}
}
}
}
if (NULL == self::$depsLocalPath) {
$tmp = dirname(getcwd()) . DIRECTORY_SEPARATOR . "deps";
if (is_dir($tmp)) {
self::setDepsLocalPath($tmp);
}
}
if (NULL == self::$depsLocalPath) {
$tmp = realpath("../deps");
if (is_dir($tmp)) {
self::setDepsLocalPath($tmp);
}
}
if (NULL == self::$depsLocalPath) {
if (file_exists("main/php_version.h")) {
/* Deps dir might not exist. */
self::setDepsLocalPath(realpath("..") . DIRECTORY_SEPARATOR . "deps");
}

View File

@@ -117,7 +117,7 @@ trait FileOps
}/*}}}*/
protected function download(string $url, string $dest = NULL) : ?string
{
{/*{{{*/
$fd = NULL;
$ch = curl_init($url);
@@ -150,7 +150,7 @@ trait FileOps
}
return $ret;
}
}/*}}}*/
}
/*

107
lib/php/libsdk/SDK/Lock.php Normal file
View File

@@ -0,0 +1,107 @@
<?php
namespace SDK;
use SDK\{Config, Exception};
class Lock
{
protected $fd;
protected $fn;
protected $locked = false;
protected $wouldBlock = false;
protected $shared = false;
public function __construct(string $tag, bool $auto = true, bool $autoShared = false)
{/*{{{*/
$hash = hash("sha256", $tag);
$this->fn = Config::getTmpDir() . DIRECTORY_SEPARATOR . $hash . ".lock";
if ($auto) {
if ($autoShared) {
$this->shared();
} else {
$this->exclusive();
}
}
}/*}}}*/
public function __destruct()
{/*{{{*/
$this->unlock();
/* We don't really know no one else waits on the same lock yet.*/
/*if (file_exists($this->fn) && !$this->shared) {
@unlink($this->fn);
}*/
}/*}}}*/
public function shared(bool $block = false) : bool
{/*{{{*/
$flags = LOCK_SH;
if (!$block) {
$flags |= LOCK_NB;
}
return $this->doLock($flags);
}/*}}}*/
public function exclusive(bool $block = false) : bool
{/*{{{*/
$flags = LOCK_EX;
if (!$block) {
$flags |= LOCK_NB;
}
return $this->doLock($flags);
}/*}}}*/
protected function doLock(int $flags = LOCK_EX) : bool
{/*{{{*/
if ($this->locked) {
/* Or throw an exception, as we don't know which lock type the outta world expected. */
return true;
}
$this->shared = $flags & LOCK_SH;
if ($this->shared) {
$this->fd = fopen($this->fn, "rb");
} else {
$this->fd = fopen($this->fn, "wb");
}
$this->locked = flock($this->fd, $flags, $this->wouldBlock);
return $this->locked;
}/*}}}*/
public function unlock() : bool
{/*{{{*/
if (!$this->locked) {
return true;
}
$this->doLock(LOCK_UN);
fclose($this->fd);
$this->fd = NULL;
return $this->locked;
}/*}}}*/
public function locked() : bool
{/*{{{*/
return $this->locked;
}/*}}}*/
public function wouldBlock() : bool
{/*{{{*/
return 1 === $this->wouldBlock;
}/*}}}*/
}
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/