private static function parseHeader()

in src/shipit/repo/ShipItRepoGIT.php [101:144]


  private static function parseHeader(string $header): ShipItChangeset {
    $parts = Str\split(Str\trim($header), "\n\n", 2);
    $envelope = $parts[0];
    $message = C\count($parts) === 2 ? Str\trim($parts[1]) : '';

    $start_of_filelist = Str\search_last($message, "\n---\n ");
    if ($start_of_filelist !== null) {
      // Get rid of the file list when a summary is
      // included in the commit message
      $message = Str\trim(Str\slice($message, 0, $start_of_filelist));
    }

    $changeset = (new ShipItChangeset())->withMessage($message);

    $envelope = Str\replace_every($envelope, dict["\n\t" => ' ', "\n " => ' ']);
    foreach (Str\split($envelope, "\n") as $line) {
      $colon = Str\search($line, ':');
      if ($colon === null) {
        continue;
      }
      list($key, $value) = Str\split($line, ':', 2);
      $value = Str\trim($value);
      switch (Str\lowercase(Str\trim($key))) {
        case 'from':
          $changeset = $changeset->withAuthor($value);
          break;
        case 'subject':
          if (Str\starts_with_ci($value, '[PATCH] ')) {
            $value = Str\trim(Str\slice($value, 8));
          }
          $changeset = $changeset->withSubject($value);
          break;
        case 'date':
          $changeset = $changeset->withTimestamp(PHP\strtotime($value));
          break;
        /* added due to nonexhaustive switch */
        default:
          break;
      }

    }

    return $changeset;
  }