Compare commits

...

15 Commits

Author SHA1 Message Date
Pavel Shevaev 4361e7579e Gradually migrating to iterable instead of arrays
Publish PHP Package / docker (push) Successful in 8s Details
2025-03-06 13:20:59 +03:00
Pavel Shevaev 616c2c46d1 Fixing names_hash_changed(..) so that it writes hex summ instead of binary one
Publish PHP Package / docker (push) Successful in 6s Details
2025-01-21 17:38:28 +03:00
Pavel Shevaev 720d851a23 Обновить CHANGELOG.md 2024-12-18 18:50:13 +03:00
Pavel Shevaev 9ad9c3acce Добавить CHANGELOG.md 2024-12-18 18:49:29 +03:00
wrenge fd241509a5 Revert dir need regen support
Publish PHP Package / docker (push) Successful in 8s Details
2024-12-18 08:06:04 +03:00
Pavel Shevaev 8e4a56f89c Adding a null check
Publish PHP Package / docker (push) Successful in 6s Details
2024-12-17 20:01:56 +03:00
wrenge 2e666d8b66 Dir need regen support
Publish PHP Package / docker (push) Successful in 7s Details
2024-12-16 18:02:33 +03:00
Pavel Shevaev 5b1a5ec442 Fixing weird lstat bug on Windows for rrmdir function for large amount of directory items
Publish PHP Package / docker (push) Successful in 6s Details
2024-08-30 11:56:34 +03:00
Pavel Shevaev 6b40e78795 Adding null check
Publish PHP Package / docker (push) Successful in 7s Details
2024-08-23 18:15:16 +03:00
Alexey Chubar 9500897b1e Speed-up git info tasks
Publish PHP Package / docker (push) Successful in 8s Details
2024-07-04 13:52:07 +03:00
Pavel Shevaev 9bfc1fea7e Добавить .gitea/workflows/build_composer.yaml
Publish PHP Package / docker (push) Successful in 5s Details
2024-02-13 12:46:36 +03:00
Pavel Shevaev 101ddc102a Fixing fnmatch patterns 2023-12-27 18:50:07 +03:00
Alexey Chubar 3aeb5a23db Merged 2023-12-01 18:45:03 +03:00
Pavel Shevaev 60e9ad293b Adding names_hash_changed(..); adding some typehints, removing really obsolete stuff 2023-11-28 13:15:40 +03:00
Pavel Shevaev 9d74b977e4 Adding fnmatches argument to file copy routines which allow to specify fnmatch pattern for a file name 2023-11-16 11:14:31 +03:00
3 changed files with 208 additions and 122 deletions

View File

@ -0,0 +1,28 @@
name: Publish PHP Package
on:
push:
tags:
- 'v*'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Get tag name
run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: zip and send
run: |
ls -la
apt-get update -y
apt-get install -y zip
cd ../
zip -r ${{ gitea.event.repository.name }}.zip ${{ gitea.event.repository.name }} -x '*.git*'
curl -v \
--user composer-pbl:${{ secrets.COMPOSER_PSWD }} \
--upload-file ${{ gitea.event.repository.name }}.zip \
https://git.bit5.ru/api/packages/bit/composer?version=${{ env.TAG }}

5
CHANGELOG.md Normal file
View File

@ -0,0 +1,5 @@
## v1.8.1
- Adding null check in need_to_regen_any(..)
## v1.7.2
- Fixing weird lstat bug on Windows for rrmdir function for large amount of directory items

View File

@ -2,43 +2,43 @@
namespace taskman; namespace taskman;
use Exception; use Exception;
function is_release() function is_release() : bool
{ {
return get("GAME_IS_DEV") == 0; return get("GAME_IS_DEV") == 0;
} }
function is_dev() function is_dev() : bool
{ {
return !is_release(); return !is_release();
} }
function is_dev_no_env() function is_dev_no_env() : bool
{ {
return is_dev() && !getenv("GAME_ENV"); return is_dev() && !getenv("GAME_ENV");
} }
function is_win() function is_win() : bool
{ {
return !(DIRECTORY_SEPARATOR == '/'); return !(DIRECTORY_SEPARATOR == '/');
} }
function is_linux() function is_linux() : bool
{ {
return PHP_OS == 'Linux'; return PHP_OS == 'Linux';
} }
function stderr($msg) function stderr(string $msg)
{ {
fwrite(STDERR, $msg); fwrite(STDERR, $msg);
} }
function fatal($msg) function fatal(string $msg)
{ {
fwrite(STDERR, $msg); fwrite(STDERR, $msg);
exit(1); exit(1);
} }
function make_tmp_file_name($file_name) function make_tmp_file_name(string $file_name) : string
{ {
$meta = stream_get_meta_data(tmpfile()); $meta = stream_get_meta_data(tmpfile());
$tmp_dir = dirname($meta['uri']); $tmp_dir = dirname($meta['uri']);
@ -46,7 +46,7 @@ function make_tmp_file_name($file_name)
return $tmp_file; return $tmp_file;
} }
function get_tmp_build_path($file) function get_tmp_build_path(string $file) : string
{ {
global $GAME_ROOT; global $GAME_ROOT;
@ -55,7 +55,7 @@ function get_tmp_build_path($file)
return normalize_path("$GAME_ROOT/build/tmp/$name"); return normalize_path("$GAME_ROOT/build/tmp/$name");
} }
function find_recursive($dir, $ext) function find_recursive(string $dir, string $ext) : array
{ {
if(is_win()) if(is_win())
$cmd = "dir /s /b " . normalize_path("$dir/*$ext"); $cmd = "dir /s /b " . normalize_path("$dir/*$ext");
@ -65,7 +65,7 @@ function find_recursive($dir, $ext)
return $out; return $out;
} }
function find_files($dir, array $fnmatch_patterns = array()) function find_files(string $dir, array $fnmatch_patterns = []) : array
{ {
$results = array(); $results = array();
$files = scandir($dir); $files = scandir($dir);
@ -87,9 +87,7 @@ function find_files($dir, array $fnmatch_patterns = array())
return $results; return $results;
} }
function scan_files_rec(array $dirs, array $only_extensions = [], int $mode = 1) : array
//obsolete, use find_files instead
function scan_files_rec(array $dirs, array $only_extensions = array(), $mode = 1)
{ {
$files = array(); $files = array();
foreach($dirs as $dir) foreach($dirs as $dir)
@ -124,7 +122,7 @@ function scan_files_rec(array $dirs, array $only_extensions = array(), $mode = 1
return $files; return $files;
} }
function normalize_path($path, $unix=null/*null means try to guess*/) function normalize_path(string $path, ?bool $unix = null/*null means try to guess*/) : string
{ {
if(is_null($unix)) if(is_null($unix))
$unix = !is_win(); $unix = !is_win();
@ -147,7 +145,7 @@ function normalize_path($path, $unix=null/*null means try to guess*/)
return $res; return $res;
} }
function normalize_sed_path($path) function normalize_sed_path(string $path) : string
{ {
$path = normalize_path($path); $path = normalize_path($path);
if(is_win()) if(is_win())
@ -157,18 +155,18 @@ function normalize_sed_path($path)
//NOTE: Escaping multibyte unicode chars as \uXXXX impacts decoding performance drastically //NOTE: Escaping multibyte unicode chars as \uXXXX impacts decoding performance drastically
//so we unescape them while encoding json //so we unescape them while encoding json
function json_encode_unescaped($arr) function json_encode_unescaped(array $arr) : string
{ {
array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); }); array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');
} }
function json_make_pretty($json) function json_make_pretty(string $json) : string
{ {
return prettyJSON($json); return prettyJSON($json);
} }
function need_to_regen($file, array $deps, $debug = false) function need_to_regen(string $file, iterable $deps, bool $debug = false) : bool
{ {
if(!is_file($file)) if(!is_file($file))
{ {
@ -178,9 +176,10 @@ function need_to_regen($file, array $deps, $debug = false)
} }
$fmtime = filemtime($file); $fmtime = filemtime($file);
foreach($deps as $dep) foreach($deps as $dep)
{ {
if(is_file($dep) && (filemtime($dep) > $fmtime)) if($dep && is_file($dep) && (filemtime($dep) > $fmtime))
{ {
if($debug) if($debug)
echo "$dep > $file\n"; echo "$dep > $file\n";
@ -191,7 +190,7 @@ function need_to_regen($file, array $deps, $debug = false)
return false; return false;
} }
function need_to_regen_any(array $files, array $deps, $debug = false) function need_to_regen_any(array $files, array $deps, bool $debug = false) : bool
{ {
$earliest_file = null; $earliest_file = null;
$earliest_time = 2e32; $earliest_time = 2e32;
@ -215,10 +214,13 @@ function need_to_regen_any(array $files, array $deps, $debug = false)
echo "need_to_regen_any, earliest file: $earliest_file ($date)\n"; echo "need_to_regen_any, earliest file: $earliest_file ($date)\n";
} }
if($earliest_file === null)
return true;
return need_to_regen($earliest_file, $deps, $debug); return need_to_regen($earliest_file, $deps, $debug);
} }
function fnmatch_patterns($file, array $fnmatch_patterns) function fnmatch_patterns(string $file, array $fnmatch_patterns) : bool
{ {
foreach($fnmatch_patterns as $pattern) foreach($fnmatch_patterns as $pattern)
{ {
@ -236,10 +238,8 @@ function fnmatch_patterns($file, array $fnmatch_patterns)
//1 - force write always, //1 - force write always,
//2 - write only if content differs //2 - write only if content differs
//3 - write only if content differs, don't even touch if they are same //3 - write only if content differs, don't even touch if they are same
function gen_file($tpl_file, $result_file, $deps = array(), $force = 0, $perms = 0640) function gen_file(string $tpl_file, string $result_file, $deps = array(), $force = 0, int $perms = 0640)
{ {
global $GAME_ROOT;
$deps[] = $tpl_file; $deps[] = $tpl_file;
if($force > 0 || need_to_regen($result_file, $deps)) if($force > 0 || need_to_regen($result_file, $deps))
{ {
@ -302,33 +302,43 @@ const COPY_MODE_BUILTIN = 1;
const COPY_MODE_SYSTEM = 2; const COPY_MODE_SYSTEM = 2;
const COPY_MODE_HARDLINK = 3; const COPY_MODE_HARDLINK = 3;
function ensure_copy($src, $dst, $dir_perms = 0777, $excludes = array()) function ensure_copy(string $src, string $dst, int $dir_perms = 0777, array $excludes = array(), array $fnmatches = array())
{ {
recurse_copy($src, $dst, $dir_perms, COPY_MODE_BUILTIN, false, $excludes); recurse_copy($src, $dst, $dir_perms, COPY_MODE_BUILTIN, false, $excludes, $fnmatches);
} }
function ensure_copy_file_if_differs($src_file, $dst_file, $dir_perms = 0777) function ensure_copy_file_if_differs(string $src_file, string $dst_file, $dir_perms = 0777)
{ {
if(!is_file($dst_file) || filesize($src_file) != filesize($dst_file) || crc32_file($src_file) !== crc32_file($dst_file)) if(!is_file($dst_file) || filesize($src_file) != filesize($dst_file) || crc32_file($src_file) !== crc32_file($dst_file))
ensure_copy($src_file, $dst_file, $dir_perms); ensure_copy($src_file, $dst_file, $dir_perms);
} }
function ensure_sync($src, $dst, $dir_perms = 0777, $excludes = array()) function ensure_sync(string $src, string $dst, int $dir_perms = 0777, array $excludes = array(), array $fnmatches = array())
{ {
recurse_copy($src, $dst, $dir_perms, COPY_MODE_BUILTIN, true, $excludes); recurse_copy($src, $dst, $dir_perms, COPY_MODE_BUILTIN, true, $excludes, $fnmatches);
} }
function ensure_hardlink($src, $dst, $dir_perms = 0777, $excludes = array()) function ensure_hardlink(string $src, string $dst, int $dir_perms = 0777, array $excludes = array(), array $fnmatches = array())
{ {
recurse_copy($src, $dst, $dir_perms, COPY_MODE_HARDLINK, true, $excludes); recurse_copy($src, $dst, $dir_perms, COPY_MODE_HARDLINK, true, $excludes, $fnmatches);
} }
function ensure_duplicate($src, $dst, $dir_perms = 0777) function ensure_duplicate(string $src, string $dst, int $dir_perms = 0777)
{ {
recurse_copy($src, $dst, $dir_perms, COPY_MODE_SYSTEM); recurse_copy($src, $dst, $dir_perms, COPY_MODE_SYSTEM);
} }
function recurse_copy($src, $dst, $dir_perms = 0777, $copy_mode = COPY_MODE_BUILTIN, $mtime_check = false, $excludes = array()) function recurse_copy(
string $src,
string $dst,
int $dir_perms = 0777,
int $copy_mode = COPY_MODE_BUILTIN,
bool $mtime_check = false,
//regex expressions which check full paths
array $excludes = array(),
//fnmatch expressions which check file names only
array $fnmatches = array()
)
{ {
msg_dbg("copying $src => $dst ...\n"); msg_dbg("copying $src => $dst ...\n");
@ -354,14 +364,27 @@ function recurse_copy($src, $dst, $dir_perms = 0777, $copy_mode = COPY_MODE_BUIL
if(($file != '.' ) && ($file != '..')) if(($file != '.' ) && ($file != '..'))
{ {
if(is_dir($src . '/' . $file)) if(is_dir($src . '/' . $file))
recurse_copy($src . '/' . $file, $dst . '/' . $file, $dir_perms, $copy_mode, $mtime_check, $excludes); {
recurse_copy(
$src . '/' . $file,
$dst . '/' . $file,
$dir_perms,
$copy_mode,
$mtime_check,
$excludes,
$fnmatches
);
}
else else
{ {
$excluded = false; $excluded = false;
foreach($excludes as $exclude_pattern) foreach($excludes as $exclude_pattern)
$excluded = $excluded || (bool)preg_match("~$exclude_pattern~", $src . '/' . $file); $excluded = $excluded || (bool)preg_match("~$exclude_pattern~", $src . '/' . $file);
$fnmatched = sizeof($fnmatches) == 0;
foreach($fnmatches as $fnmatch)
$fnmatched = $fnmatched || fnmatch($fnmatch, $file);
if($excluded) if($excluded || !$fnmatched)
continue; continue;
_ensure_copy_file($src . '/' . $file, $dst . '/' . $file, $copy_mode, $mtime_check); _ensure_copy_file($src . '/' . $file, $dst . '/' . $file, $copy_mode, $mtime_check);
@ -371,14 +394,14 @@ function recurse_copy($src, $dst, $dir_perms = 0777, $copy_mode = COPY_MODE_BUIL
closedir($dir); closedir($dir);
} }
function shell($cmd, &$out=null) function shell(string $cmd, &$out = null)
{ {
shell_try($cmd, $ret, $out); shell_try($cmd, $ret, $out);
if($ret != 0) if($ret != 0)
throw new Exception("Shell execution error(exit code $ret)"); throw new Exception("Shell execution error(exit code $ret)");
} }
function shell_try($cmd, &$ret=null, &$out=null) function shell_try(string $cmd, &$ret = null, &$out = null)
{ {
msg(" shell: $cmd\n"); msg(" shell: $cmd\n");
msg(" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); msg(" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
@ -389,7 +412,7 @@ function shell_try($cmd, &$ret=null, &$out=null)
_execute_proc_cmd($cmd, $ret, $out); _execute_proc_cmd($cmd, $ret, $out);
} }
function shell_get($cmd, $as_string = true) function shell_get(string $cmd, bool $as_string = true)
{ {
exec($cmd, $out, $code); exec($cmd, $out, $code);
if($code !== 0) if($code !== 0)
@ -397,7 +420,7 @@ function shell_get($cmd, $as_string = true)
return $as_string ? implode("", $out) : $out; return $as_string ? implode("", $out) : $out;
} }
function _execute_proc_cmd($cmd, &$ret, &$out) function _execute_proc_cmd(string $cmd, &$ret, &$out)
{ {
//TODO: do we really need to redirect error stream? //TODO: do we really need to redirect error stream?
$proc = popen("$cmd 2>&1", 'r'); $proc = popen("$cmd 2>&1", 'r');
@ -420,7 +443,7 @@ function _execute_proc_cmd($cmd, &$ret, &$out)
$ret = pclose($proc); $ret = pclose($proc);
} }
function _ensure_copy_file($src, $dst, $copy_mode = COPY_MODE_BUILTIN, $mtime_check = false) function _ensure_copy_file(string $src, string $dst, int $copy_mode = COPY_MODE_BUILTIN, bool $mtime_check = false)
{ {
if($mtime_check && file_exists($dst) && filemtime($src) <= filemtime($dst)) if($mtime_check && file_exists($dst) && filemtime($src) <= filemtime($dst))
return; return;
@ -445,7 +468,7 @@ function _ensure_copy_file($src, $dst, $copy_mode = COPY_MODE_BUILTIN, $mtime_ch
throw new Exception("Unrecognized copy mode $copy_mode"); throw new Exception("Unrecognized copy mode $copy_mode");
} }
function ensure_identical($src, $dst, $excludes = array()) function ensure_identical(string $src, string $dst, $excludes = array())
{ {
msg_dbg("deleting files missing in $src from $dst ...\n"); msg_dbg("deleting files missing in $src from $dst ...\n");
@ -487,7 +510,7 @@ function ensure_identical($src, $dst, $excludes = array())
closedir($dir); closedir($dir);
} }
function ensure_symlink($src, $dst, $dir_perms = 0777) function ensure_symlink(string $src, string $dst, int $dir_perms = 0777)
{ {
if(!is_file($src) && !is_dir($src)) if(!is_file($src) && !is_dir($src))
throw new Exception("Bad file or dir '$src'"); throw new Exception("Bad file or dir '$src'");
@ -503,7 +526,7 @@ function ensure_symlink($src, $dst, $dir_perms = 0777)
throw new Exception("Could not create symlink"); throw new Exception("Could not create symlink");
} }
function ensure_rm($what) function ensure_rm(string $what)
{ {
if(is_dir($what) && !is_link($what)) if(is_dir($what) && !is_link($what))
rrmdir($what); rrmdir($what);
@ -511,7 +534,7 @@ function ensure_rm($what)
unlink($what); unlink($what);
} }
function ensure_mkdir($dir, $perms = 0775) function ensure_mkdir(string $dir, int $perms = 0775)
{ {
if(is_dir($dir)) if(is_dir($dir))
return; return;
@ -525,7 +548,7 @@ function ensure_mkdir($dir, $perms = 0775)
throw new Exception("Could not chmod " . decoct($perms) . " dir '$dir'"); throw new Exception("Could not chmod " . decoct($perms) . " dir '$dir'");
} }
function ensure_var_dir($dir) function ensure_var_dir(string $dir)
{ {
ensure_mkdir($dir, 0777); ensure_mkdir($dir, 0777);
$items = fmatch("$dir/*"); $items = fmatch("$dir/*");
@ -539,7 +562,7 @@ function ensure_var_dir($dir)
} }
} }
function compare_files_timestamp($file_a, $file_b) function compare_files_timestamp(string $file_a, string $file_b) : int
{ {
$file_a_timestamp = file_exists($file_a) ? filemtime($file_a) : 0; $file_a_timestamp = file_exists($file_a) ? filemtime($file_a) : 0;
$file_b_timestamp = file_exists($file_b) ? filemtime($file_b) : 0; $file_b_timestamp = file_exists($file_b) ? filemtime($file_b) : 0;
@ -549,15 +572,15 @@ function compare_files_timestamp($file_a, $file_b)
return -1; return -1;
} }
function fmatch($pat) function fmatch(string $path) : array
{ {
$res = glob($pat); $res = glob($path);
if(!is_array($res)) if(!is_array($res))
return array(); return array();
return $res; return $res;
} }
function rrmdir($dir, $remove_top_dir = true) function rrmdir(string $dir, bool $remove_top_dir = true)
{ {
if(is_dir($dir)) if(is_dir($dir))
{ {
@ -566,7 +589,7 @@ function rrmdir($dir, $remove_top_dir = true)
{ {
if($object != "." && $object != "..") if($object != "." && $object != "..")
{ {
if(filetype($dir."/".$object) == "dir") if(is_dir($dir."/".$object))
rrmdir($dir."/".$object); rrmdir($dir."/".$object);
else else
unlink($dir."/".$object); unlink($dir."/".$object);
@ -583,78 +606,74 @@ function rrmdir($dir, $remove_top_dir = true)
} }
} }
function run_apple_script($script) define("GIT_INFO_REV_HASH" , 1 << 0);
{ define("GIT_INFO_BRANCH" , 1 << 1);
$vm = popen("osascript", "w"); define("GIT_INFO_REV_NUMBER", 1 << 2);
fwrite($vm, $script); define("GIT_INFO_ALL" , ~0);
// run script will always exit with status 1
pclose($vm);
}
function client_xcode_build($scheme, $config = 'Debug', $sdk = 'iphonesimulator4.3') function git_get_info($info = GIT_INFO_ALL) : array
{
global $GAME_ROOT;
$xcode_filter = ". $GAME_ROOT/utils/xcodefilter.sh";
ensure_mkdir("$GAME_ROOT/build/client");
shell(_(
"cd $GAME_ROOT/client && " .
"$xcode_filter xcodebuild -workspace %XCODE_WKSPACE% -scheme $scheme -configuration $config -sdk $sdk SYMROOT=$GAME_ROOT/build/client"
));
}
function git_get_info()
{ {
global $GAME_ROOT; global $GAME_ROOT;
$rev_hash = "";
$branch = "";
$revision_number = 0;
if(!is_dir("$GAME_ROOT/.git")) if(!is_dir("$GAME_ROOT/.git"))
throw new Exception("Not a Git repository"); throw new Exception("Not a Git repository");
$out = array(); if($info & GIT_INFO_REV_HASH)
exec("git rev-parse HEAD", $out); {
$rev_hash = trim($out[0]); $out = array();
if(!$rev_hash) exec("git rev-parse HEAD", $out);
throw new Exception("Error getting git revision hash"); $rev_hash = trim($out[0]);
if(!$rev_hash)
throw new Exception("Error getting git revision hash");
}
$out = array(); if($info & GIT_INFO_BRANCH)
exec("git rev-parse --abbrev-ref HEAD", $out); {
$branch = trim($out[0]); $out = array();
if(!$branch) exec("git rev-parse --abbrev-ref HEAD", $out);
throw new Exception("Error getting git branch"); $branch = trim($out[0]);
if(!$branch)
throw new Exception("Error getting git branch");
}
$out = array(); if($info & GIT_INFO_REV_NUMBER)
exec("git rev-list HEAD --count", $out); {
$revision_number = (int)$out[0]; $out = array();
if(!$revision_number) exec("git rev-list HEAD --count", $out);
throw new Exception("Error getting git revision number"); $revision_number = (int)$out[0];
if(!$revision_number)
throw new Exception("Error getting git revision number");
}
return array($rev_hash, $branch, $revision_number); return array($rev_hash, $branch, $revision_number);
} }
function git_get_rev_hash() function git_get_rev_hash() : string
{ {
list($rev_hash, $_, $__) = git_get_info(); list($rev_hash, $_, $__) = git_get_info(GIT_INFO_REV_HASH);
return $rev_hash; return $rev_hash;
} }
function git_get_branch() function git_get_branch() : string
{ {
list($_, $branch, $__) = git_get_info(); list($_, $branch, $__) = git_get_info(GIT_INFO_BRANCH);
return $branch; return $branch;
} }
function git_get_rev_number() function git_get_rev_number() : string
{ {
list($_, $__, $rev_number) = git_get_info(); list($_, $__, $rev_number) = git_get_info(GIT_INFO_REV_NUMBER);
return $rev_number; return $rev_number;
} }
function git_try_commit($files, $msg) function git_try_commit(string $paths, string $msg)
{ {
try try
{ {
exec("git add $files && git commit -m \"$msg\" && git pull && git push"); exec("git add $paths && git commit -m \"$msg\" && git pull && git push");
} }
catch(Exception $e) catch(Exception $e)
{ {
@ -662,7 +681,7 @@ function git_try_commit($files, $msg)
} }
} }
function check_and_decode_jzon($json) function check_and_decode_jzon(string $json) : array
{ {
try try
{ {
@ -701,7 +720,7 @@ function make_dir_md5($dir, $md5_file)
ensure_write($md5_file, $md5); ensure_write($md5_file, $md5);
} }
function file_put_contents_atomic($filename, $content, $mode = 0644) function file_put_contents_atomic(string $filename, string $content, int $mode = 0644)
{ {
$temp = tempnam(dirname($filename), 'atomic'); $temp = tempnam(dirname($filename), 'atomic');
if(!($f = @fopen($temp, 'wb'))) if(!($f = @fopen($temp, 'wb')))
@ -718,15 +737,15 @@ function file_put_contents_atomic($filename, $content, $mode = 0644)
chmod($filename, $mode); chmod($filename, $mode);
} }
function gmgetdate($ts = null) function gmgetdate($ts = null) : array
{ {
$k = array('seconds','minutes','hours','mday', $k = array('seconds','minutes','hours','mday',
'wday','mon','year','yday','weekday','month',0); 'wday','mon','year','yday','weekday','month',0);
return(array_combine($k, explode(":", return array_combine($k, explode(":",
gmdate('s:i:G:j:w:n:Y:z:l:F:U',is_null($ts)?time():$ts)))); gmdate('s:i:G:j:w:n:Y:z:l:F:U',is_null($ts)?time():$ts)));
} }
function prettyJSON($json) function prettyJSON(string $json) : string
{ {
$result = ''; $result = '';
$level = 0; $level = 0;
@ -807,12 +826,12 @@ function run_shell_in_project_dir($cmd)
return $out[0]; return $out[0];
} }
function boolstr($b) function boolstr(bool $b) : string
{ {
return $b ? 'true' : 'false'; return $b ? 'true' : 'false';
} }
function create_js_template_literal($str) function create_js_template_literal(string $str) : string
{ {
$result = str_replace('\\', '\\\\', $str); // replace \ -> \\ $result = str_replace('\\', '\\\\', $str); // replace \ -> \\
$result = str_replace('`', '\\`', $result); // replace ` -> \` $result = str_replace('`', '\\`', $result); // replace ` -> \`
@ -820,7 +839,7 @@ function create_js_template_literal($str)
return "`$result`"; return "`$result`";
} }
function create_go_string_literal($str) function create_go_string_literal(string $str) : string
{ {
$result = str_replace('\\', '\\\\', $str); // replace \ -> \\ $result = str_replace('\\', '\\\\', $str); // replace \ -> \\
$result = str_replace('"', '\\"', $result); // replace " -> \" $result = str_replace('"', '\\"', $result); // replace " -> \"
@ -828,7 +847,7 @@ function create_go_string_literal($str)
return '"' . $result . '"'; return '"' . $result . '"';
} }
function convertFileFromDos2UnixFormat($file) function convertFileFromDos2UnixFormat(string $file)
{ {
$file_tmp = $file.".tmp"; $file_tmp = $file.".tmp";
@ -841,7 +860,7 @@ function convertFileFromDos2UnixFormat($file)
ensure_rm($file_tmp); ensure_rm($file_tmp);
} }
function removeCarriageReturn($file) function removeCarriageReturn(string $file)
{ {
$file_tmp = $file.".tmp"; $file_tmp = $file.".tmp";
@ -854,14 +873,14 @@ function removeCarriageReturn($file)
ensure_rm($file_tmp); ensure_rm($file_tmp);
} }
function replace_text_in_file($search_pattern, $replace_pattern, $from_file, $to_file) function replace_text_in_file(string $search_pattern, string $replace_pattern, string $from_file, string $to_file)
{ {
$file_content = ensure_read($from_file); $file_content = ensure_read($from_file);
$res = str_replace($search_pattern, $replace_pattern, $file_content); $res = str_replace($search_pattern, $replace_pattern, $file_content);
ensure_write($to_file, $res); ensure_write($to_file, $res);
} }
function gamectl_get_props_as_php_code() function gamectl_get_props_as_php_code() : string
{ {
$props = props(); $props = props();
$props_str = "<?php\nnamespace taskman;\n"; $props_str = "<?php\nnamespace taskman;\n";
@ -905,7 +924,7 @@ function run_background_proc($bin, array $args = array(), $redirect_out = '', $r
} }
} }
function run_background_gamectl_workers($task, array $worker_args) function run_background_gamectl_workers(string $task, array $worker_args) : array
{ {
global $GAME_ROOT; global $GAME_ROOT;
@ -986,17 +1005,17 @@ function run_background_gamectl_workers($task, array $worker_args)
return $results; return $results;
} }
function kb($str) function kb(string $data) : string
{ {
return kb_len(strlen($str)); return kb_len(strlen($data));
} }
function kb_len($len) function kb_len(int $len) : string
{ {
return round($len/1024,2) . "kb"; return round($len/1024,2) . "kb";
} }
function gen_uuid_v4() function gen_uuid_v4() : string
{ {
$UUID_LENGTH_BYTES = 16; $UUID_LENGTH_BYTES = 16;
$data = random_bytes($UUID_LENGTH_BYTES); $data = random_bytes($UUID_LENGTH_BYTES);
@ -1007,7 +1026,7 @@ function gen_uuid_v4()
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
} }
function watch_running_process($pid, $log_file, $exit_matches = array(), $error_matches = array(), $verbose = true, $break_after_sec = -1, $ignored_errors = array(), $noted_warnings = array()) function watch_running_process($pid, string $log_file, $exit_matches = array(), $error_matches = array(), bool $verbose = true, $break_after_sec = -1, $ignored_errors = array(), $noted_warnings = array())
{ {
$matches_any_fn = function($buffer, array $matches) $matches_any_fn = function($buffer, array $matches)
{ {
@ -1086,7 +1105,7 @@ function watch_running_process($pid, $log_file, $exit_matches = array(), $error_
fclose($h); fclose($h);
} }
function check_process($pid) function check_process($pid) : int
{ {
if(is_win()) if(is_win())
{ {
@ -1101,12 +1120,12 @@ function check_process($pid)
return $ret; return $ret;
} }
function which_dir($bin) function which_dir(string $bin) : string
{ {
return realpath(dirname(which_path($bin))); return realpath(dirname(which_path($bin)));
} }
function which_path($bin) function which_path(string $bin) : string
{ {
if(is_win()) if(is_win())
{ {
@ -1120,7 +1139,7 @@ function which_path($bin)
} }
} }
function arg_exists($args, $needle) function arg_exists(array $args, string $needle) : bool
{ {
$strict = true; $strict = true;
return in_array($needle, $args, $strict); return in_array($needle, $args, $strict);
@ -1160,12 +1179,46 @@ function arg_opt_check_no_trailing(array $args)
function are_you_sure() function are_you_sure()
{ {
echo "Are you sure you want to proceed?(type YES): "; if(!are_you_sure_ask())
$resp = trim(fread(STDIN, 10));
//var_dump($resp);
if($resp != "YES")
{ {
echo "exiting then\n"; echo "exiting then\n";
exit(); exit();
} }
} }
function are_you_sure_ask() : bool
{
echo "Are you sure you want to proceed?(type YES): ";
$resp = trim(fread(STDIN, 10));
return $resp == "YES";
}
function names_hash_changed(string $crc_file, iterable $names) : bool
{
$ctx = hash_init('crc32');
foreach($names as $name)
hash_update($ctx, $name);
$names_crc = hash_final($ctx, false);
$changed = !file_exists($crc_file) || ensure_read($crc_file) != $names_crc;
ensure_write($crc_file, $names_crc);
return $changed;
}
function is_apple_silicon()
{
$arch = php_uname('m');
// Check if the machine type contains 'arm' (ARM architecture)
if (strpos($arch, 'arm') !== false) {
return true;
}
// If running on x86_64, check for Apple Silicon using sysctl
// (because we might get 'x86_64' when running under Rosetta)
if ($arch === 'x86_64') {
$sysctl = shell_exec('sysctl -n machdep.cpu.brand_string');
return strpos($sysctl, 'Apple') !== false;
}
return false;
}