Initial commit
This commit is contained in:
commit
e8c9f95156
|
@ -0,0 +1 @@
|
|||
tags
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "bit/taskman_git",
|
||||
"description": "taskman git utils",
|
||||
"homepage": "https://git.bit5.ru/composer/taskman_git",
|
||||
"require": {
|
||||
"php": ">=7.4"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": ["git.inc.php"]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
<?php
|
||||
namespace taskman;
|
||||
use Exception;
|
||||
|
||||
task('git_info', function()
|
||||
{
|
||||
list($rev_hash, $branch, $revision_number) = git_get_info();
|
||||
$info = "==============GIT INFO==============\n"
|
||||
. "$rev_hash - hash\n"
|
||||
. "$branch - branch\n"
|
||||
. "$revision_number - revision\n";
|
||||
echo $info;
|
||||
});
|
||||
|
||||
function git_do($repo, $action, &$out = NULL, $verbose = true)
|
||||
{
|
||||
$cli = "cd $repo && git $action";
|
||||
if($verbose)
|
||||
echo "Git CLI: $cli\n";
|
||||
exec($cli, $out, $result);
|
||||
if($verbose || $result !== 0)
|
||||
echo implode("\n", $out)."\n";
|
||||
if($result !== 0)
|
||||
throw new Exception("Error executing command: $cli ($result)");
|
||||
}
|
||||
|
||||
function git_is_repo($directory)
|
||||
{
|
||||
$output = [];
|
||||
git_do($directory, "rev-parse --is-inside-work-tree", $output, false);
|
||||
return !empty($output) && $output[0] === 'true';
|
||||
}
|
||||
|
||||
function git_rev_from_commit_message($message)
|
||||
{
|
||||
// Regular expression pattern to extract the commit hash
|
||||
$pattern = '/\b[0-9a-f]{7,40}\b/';
|
||||
|
||||
// Extract the commit hash from the message
|
||||
preg_match($pattern, $message, $matches);
|
||||
$commit_hash = $matches[0] ?? '';
|
||||
return $commit_hash;
|
||||
}
|
||||
|
||||
function get_git_last_remote_tag($repo)
|
||||
{
|
||||
$remote_tags = [];
|
||||
git_do($repo, 'ls-remote --tags origin', $output, false);
|
||||
foreach($output as $line)
|
||||
{
|
||||
$items = explode("\t", trim($line));
|
||||
if(sizeof($items) < 2)
|
||||
continue;
|
||||
$tag_spec = $items[1];
|
||||
if(str_ends_with($tag_spec, '^{}'))
|
||||
continue;
|
||||
$tag = str_replace('refs/tags/', '', $tag_spec);
|
||||
$remote_tags[] = $tag;
|
||||
}
|
||||
return _get_last_version_tag($remote_tags);
|
||||
}
|
||||
|
||||
function _get_last_version_tag(array $tags)
|
||||
{
|
||||
if(!$tags)
|
||||
return false;
|
||||
usort($tags, function ($tag1, $tag2) {
|
||||
$version1 = str_replace('v', '', $tag1);
|
||||
$version2 = str_replace('v', '', $tag2);
|
||||
return version_compare($version1, $version2);
|
||||
});
|
||||
return end($tags);
|
||||
}
|
||||
|
||||
class GitVersion
|
||||
{
|
||||
public $major;
|
||||
public $minor;
|
||||
public $patch;
|
||||
|
||||
static function parse($version_str)
|
||||
{
|
||||
$parts = explode('.', $version_str);
|
||||
if(sizeof($parts) != 3)
|
||||
throw new Exception("Invalid version string: $version_str");
|
||||
$v = new GitVersion();
|
||||
if($parts[0][0] === 'v')
|
||||
$parts[0] = substr($parts[0], 1);
|
||||
$v->major = (int)$parts[0];
|
||||
$v->minor = (int)$parts[1];
|
||||
$v->patch = (int)$parts[2];
|
||||
return $v;
|
||||
}
|
||||
|
||||
function bump($up_mode)
|
||||
{
|
||||
if($up_mode == 1)
|
||||
++$this->patch;
|
||||
else if($up_mode == 2)
|
||||
{
|
||||
++$this->minor;
|
||||
$this->patch = 0;
|
||||
}
|
||||
else if($up_mode == 3)
|
||||
{
|
||||
++$this->major;
|
||||
$this->minor = 0;
|
||||
$this->patch = 0;
|
||||
}
|
||||
else
|
||||
throw new Exception("Unsupported up mode: $up_mode");
|
||||
}
|
||||
|
||||
function encode()
|
||||
{
|
||||
return 'v'.$this->major.'.'.$this->minor.'.'.$this->patch;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue