Last active
September 19, 2020 11:11
-
-
Save drupol/426146a9a36551378fd4d411d57ae03b to your computer and use it in GitHub Desktop.
Parse commit log with loophp/collection
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
include 'vendor/autoload.php'; | |
use loophp\collection\Collection; | |
use loophp\collection\Contract\Collection as CollectionInterface; | |
$commandStream = static function (string $command): Generator { | |
$fh = popen($command, 'r'); | |
while (false !== $line = fgets($fh)) { | |
yield $line; | |
} | |
fclose($fh); | |
}; | |
$buildIfThenElseCallbacks = static function (string $lineStart): array { | |
return [ | |
static function ($line) use ($lineStart): bool { | |
return \is_string($line) && 0 === mb_strpos($line, $lineStart); | |
}, | |
static function ($line) use ($lineStart): array { | |
[, $line] = explode($lineStart, $line); | |
return [ | |
sprintf( | |
'%s:%s', | |
mb_strtolower(str_replace(':', '', $lineStart)), | |
trim($line) | |
), | |
]; | |
}, | |
]; | |
}; | |
$c = Collection::fromIterable($commandStream('git log')) | |
->map( | |
static function (string $value): string { | |
return trim($value); | |
} | |
) | |
->compact('', ' ', "\n") | |
->ifThenElse(...$buildIfThenElseCallbacks('commit')) | |
->ifThenElse(...$buildIfThenElseCallbacks('Date:')) | |
->ifThenElse(...$buildIfThenElseCallbacks('Author:')) | |
->ifThenElse(...$buildIfThenElseCallbacks('Merge:')) | |
->ifThenElse(...$buildIfThenElseCallbacks('Signed-off-by:')) | |
->split( | |
static function ($value): bool { | |
return \is_array($value) ? | |
(1 === preg_match('/^commit:\b[0-9a-f]{5,40}\b/', $value[0])) : | |
false; | |
} | |
) | |
->map( | |
static function (array $value): CollectionInterface { | |
return Collection::fromIterable($value); | |
} | |
) | |
->map( | |
static function (CollectionInterface $collection): CollectionInterface { | |
return $collection | |
->group( | |
static function ($value): ?string { | |
return \is_array($value) ? 'headers' : null; | |
} | |
) | |
->group( | |
static function ($value): ?string { | |
return \is_string($value) ? 'log' : null; | |
} | |
) | |
->ifThenElse( | |
static function ($value, $key): bool { | |
return 'headers' === $key; | |
}, | |
static function ($value, $key): array { | |
return Collection::fromIterable($value) | |
->unwrap() | |
->associate( | |
static function ($key, string $value): string { | |
[$key, $line] = explode(':', $value, 2); | |
return $key; | |
}, | |
static function ($key, string $value): string { | |
[$key, $line] = explode(':', $value, 2); | |
return trim($line); | |
} | |
) | |
->all(); | |
} | |
); | |
} | |
) | |
->map( | |
static function (CollectionInterface $collection): CollectionInterface { | |
return $collection | |
->flatten() | |
->group( | |
static function ($value, $key): ?string { | |
if (is_numeric($key)) { | |
return 'log'; | |
} | |
return null; | |
} | |
); | |
} | |
) | |
->map( | |
static function (CollectionInterface $collection): array { | |
return $collection->all(); | |
} | |
) | |
->limit(52); | |
print_r($c->all()); | |
/** | |
... | |
[43] => Array | |
( | |
[commit] => 84e63813ba8a0fdecb2b07275b892aee695cce0e | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Thu Aug 20 22:09:09 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update Split operation. | |
) | |
) | |
[44] => Array | |
( | |
[commit] => d1be59ef01651a7c7794175fe5b2d88e3e58e353 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Thu Aug 20 22:00:07 2020 +0200 | |
[log] => Array | |
( | |
[0] => Add new example. | |
) | |
) | |
[45] => Array | |
( | |
[commit] => e716b854527e576d3e9f76455d0f5f8dfe20bf17 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sun Aug 16 16:12:53 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update typing information. | |
) | |
) | |
[46] => Array | |
( | |
[commit] => 81b7a6f546848812b74a12309d7e701cbe7536e7 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sun Aug 16 09:04:19 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update typing information. | |
) | |
) | |
[47] => Array | |
( | |
[commit] => 119cdfeb092b31970eac5a98f56e52d4f4ee8e69 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sat Aug 15 23:02:15 2020 +0200 | |
[log] => Array | |
( | |
[0] => Add missing return statements. | |
) | |
) | |
[48] => Array | |
( | |
[commit] => 1c9e929919e9482bec517aa746559d63071c79f2 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sat Aug 15 21:57:01 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update Implode transformation. | |
) | |
) | |
[49] => Array | |
( | |
[commit] => cece391c57ab7800246fc5ebd788f0ec4c738322 | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sat Aug 15 21:56:31 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update FoldLeft/FoldRight transformations. | |
) | |
) | |
[50] => Array | |
( | |
[commit] => ddde5cc6f1dd14ac079b68c58bb2dd3f68aac8ee | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Sat Aug 15 07:58:56 2020 +0200 | |
[log] => Array | |
( | |
[0] => Update Last operation. | |
) | |
) | |
[51] => Array | |
( | |
[commit] => e6e7116b7b75a8fbc4c50dfddd196c26c01cd496 | |
[merge] => e6b25ac c5ae61a | |
[author] => Pol Dellaiera <[email protected]> | |
[date] => Fri Aug 14 20:50:05 2020 +0200 | |
[log] => Array | |
( | |
[0] => Merge pull request #16 from loophp/dependabot/github_actions/actions/create-release-v1.1.3 | |
[1] => Bump actions/create-release from v1.1.2 to v1.1.3 | |
) | |
) | |
) | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment