🧲 New features Custom user role permissions Employee edit form updated Employee daily task list Attendance and employee distribution charts on dashboard Improvements to company structure and company assets module Improved tables for displaying data in several modules Faster data loading (specially for employee module) Initials based profile pictures Re-designed login page Re-designed user profile page Improvements to filtering New REST endpoints for employee qualifications 🐛 Bug fixes Fixed, issue with managers being able to create performance reviews for employees who are not their direct reports Fixed, issues related to using full profile image instead of using smaller version of profile image Changing third gender to other Improvements and fixes for internal frontend data caching
179 lines
5.1 KiB
PHP
Executable File
179 lines
5.1 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
|
|
/**
|
|
* Usage:
|
|
*
|
|
* ./vendor/bin/release VERSION
|
|
*/
|
|
|
|
$semverRegEx = '(?<version>[0-9]+\.[0-9]+\.[0-9]+)(?<prerelease>-[0-9a-zA-Z.]+)?(?<build>\+[0-9a-zA-Z.]*)?';
|
|
|
|
$optind = null;
|
|
$options = getopt ("dvy", [
|
|
'pattern:',
|
|
'simulate',
|
|
'yes',
|
|
], $optind) + [
|
|
'pattern' => "^SEMVER$",
|
|
];
|
|
$simulate = array_key_exists('simulate', $options);
|
|
$yes = array_key_exists('yes', $options) || array_key_exists('y', $options);
|
|
|
|
$pos_args = array_slice($argv, $optind);
|
|
$path = array_shift($pos_args);
|
|
|
|
if (empty($path)) {
|
|
print "Path to version file must be specified as a commandline argument\n";
|
|
exit(1);
|
|
}
|
|
|
|
if (!file_exists($path)) {
|
|
print "Version file not found at $path\n";
|
|
exit(1);
|
|
}
|
|
|
|
// The --pattern option is expected to contain the string SEMVER
|
|
$regex = str_replace('SEMVER', "$semverRegEx", $options['pattern']);
|
|
if ($regex == $options['pattern']) {
|
|
print "Pattern '$regex' must contain the string 'SEMVER'.\n";
|
|
exit(1);
|
|
}
|
|
|
|
// Read the contents of the version file and find the version string
|
|
$contents = file_get_contents($path);
|
|
if (!preg_match("#$regex#m", $contents, $matches)) {
|
|
print "A semver version not found in $path\n";
|
|
exit(1);
|
|
}
|
|
$matches += ['prerelease' => '', 'build' => ''];
|
|
|
|
// Calculate the stable and next version strings
|
|
$original_version_match = $matches[0];
|
|
$original_version = $matches['version'] . $matches['prerelease'] . $matches['build'];
|
|
$stable_version = $matches['version'] . (has_prerelease($matches) ? $matches['prerelease'] : '');
|
|
$next_version = next_version($matches);
|
|
|
|
$stable_version_replacement = str_replace($original_version, $stable_version, $original_version_match);
|
|
$next_version_replacement = str_replace($original_version, $next_version, $original_version_match);
|
|
|
|
$stable_version_contents = str_replace($original_version_match, $stable_version_replacement, $contents);
|
|
$next_version_contents = str_replace($original_version_match, $next_version_replacement, $contents);
|
|
|
|
$composerContents = file_get_contents('composer.json');
|
|
$composerData = json_decode($composerContents, true);
|
|
$project = $composerData['name'];
|
|
|
|
$msg = "Release $project version $stable_version";
|
|
$dashes = str_pad('', strlen($msg) + 8, '-', STR_PAD_LEFT);
|
|
|
|
print "\n$dashes\n\n";
|
|
print " $msg\n";
|
|
print "\n$dashes\n\n";
|
|
|
|
// Write the stable version into the version file, tag and push the release
|
|
if (!$simulate) {
|
|
file_put_contents($path, $stable_version_contents);
|
|
}
|
|
else {
|
|
print "Replace stable version in $path:\n> $stable_version_replacement\n";
|
|
}
|
|
|
|
run('git add {path}', ['{path}' => $path], $simulate);
|
|
run('git commit -m "Version {version}"', ['{version}' => $stable_version], $simulate);
|
|
run('git tag {version}', ['{version}' => $stable_version], $simulate);
|
|
run('git push origin {version}', ['{version}' => $stable_version], $simulate);
|
|
|
|
// Put the next version into the version file and push the result back to master
|
|
if (!$simulate) {
|
|
file_put_contents($path, $next_version_contents);
|
|
}
|
|
else {
|
|
print "Replace next version in $path:\n> $next_version_replacement\n";
|
|
}
|
|
|
|
run('git add {path}', ['{path}' => $path], $simulate);
|
|
run('git commit -m "[ci skip] Back to {version}"', ['{version}' => $next_version], $simulate);
|
|
run('git push origin master', [], $simulate);
|
|
|
|
exit(0);
|
|
|
|
/**
|
|
* inflect replaces the placeholders in the command with the provided parameter values
|
|
* @param string $cmd
|
|
* @param array $parameters
|
|
* @return string
|
|
*/
|
|
function inflect($cmd, $parameters = [])
|
|
{
|
|
if (!empty($parameters)) {
|
|
return str_replace(array_keys($parameters), array_values($parameters), $cmd);
|
|
}
|
|
return $cmd;
|
|
}
|
|
|
|
/**
|
|
* Run the specified command. Abort most rudely if an error is encountered
|
|
*/
|
|
function run($cmd, $parameters = [], $simulate = false)
|
|
{
|
|
$cmd = inflect($cmd, $parameters);
|
|
if ($simulate) {
|
|
print "$cmd\n";
|
|
return;
|
|
}
|
|
passthru($cmd, $status);
|
|
if ($status) {
|
|
exit($status);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determine the next version after the current release
|
|
*/
|
|
function next_version($matches)
|
|
{
|
|
$version = $matches['version'];
|
|
|
|
$next_version = next_version_prerelease($matches);
|
|
if ($next_version !== false) {
|
|
return $next_version;
|
|
}
|
|
return next_version_stable($matches);
|
|
}
|
|
|
|
/**
|
|
* Determine the next version given that the current version is stable
|
|
*/
|
|
function next_version_stable($matches)
|
|
{
|
|
$version_parts = explode('.', $matches['version']);
|
|
$last_version = array_pop($version_parts);
|
|
$last_version++;
|
|
$version_parts[] = $last_version;
|
|
|
|
return implode('.', $version_parts) . (empty($matches['prerelease']) ? '-dev' : $matches['prerelease']);
|
|
}
|
|
|
|
function has_prerelease($matches)
|
|
{
|
|
if (empty($matches['prerelease'])) {
|
|
return false;
|
|
}
|
|
|
|
return is_numeric(substr($matches['prerelease'], -1));
|
|
}
|
|
|
|
/**
|
|
* Determine the next version given that the current version has a pre-release
|
|
* (e.g. '-alpha5').
|
|
*/
|
|
function next_version_prerelease($version_parts)
|
|
{
|
|
if (!preg_match('#(.*?)([0-9]+)$#', $version_parts['prerelease'], $matches)) {
|
|
return false;
|
|
}
|
|
$next = $matches[2] + 1;
|
|
return $version_parts['version'] . $matches[1] . $next . '+dev';
|
|
}
|