Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/treetrek.git
<?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( '', '', '' );
  }
}