<?php require_once __DIR__ . '/../render/TagRenderer.php'; class Tag { private string $name; private string $sha; private string $targetSha; private int $timestamp; private string $message; private string $author; public function __construct( string $name, string $sha, string $rawData ) { $this->name = $name; $this->sha = $sha; $isAnn = \strncmp( $rawData, 'object ', 7 ) === 0; $this->targetSha = $isAnn ? (\preg_match( '/^object (.*)$/m', $rawData, $m ) ? \trim( $m[1] ) : $sha) : $sha; $pattern = $isAnn ? '/^tagger (.*) <(.*)> (\d+) [+\-]\d{4}$/m' : '/^author (.*) <(.*)> (\d+) [+\-]\d{4}$/m'; $this->author = \preg_match( $pattern, $rawData, $m ) ? \trim( $m[1] ) : 'Unknown'; $this->timestamp = \preg_match( $pattern, $rawData, $m ) ? (int)$m[3] : 0; $pos = \strpos( $rawData, "\n\n" ); $this->message = $pos !== false ? \trim( \substr( $rawData, $pos + 2 ) ) : ''; } public function compare( Tag $other ): int { return $other->timestamp <=> $this->timestamp; } public function render( TagRenderer $renderer, Tag $prevTag ): void { $renderer->render( $this->name, $this->sha, $this->targetSha, $prevTag->targetSha, $this->timestamp, $this->message, $this->author ); } } class MissingTag extends Tag { public function __construct() { parent::__construct( '', '', '' ); } }