/**
* @param CommitMessage $commitMessage
* @return ChangeInfoEnvelope
*/
public function parse(CommitMessage $commitMessage)
{
$fullBody = $commitMessage->getBody();
$splittedBodies = explode("\n\n", $fullBody);
$lastBody = $splittedBodies[count($splittedBodies) - 1];
$changeInfoList = [];
$version = null;
$environment = null;
if (self::containsVersion($lastBody)) {
$version = self::extractTag(ChangeInfoEnvelope::VP_VERSION_TAG, $lastBody);
$environment = self::extractTag(ChangeInfoEnvelope::VP_ENVIRONMENT_TAG, $lastBody);
array_pop($splittedBodies);
}
if (!self::isTrackedChangeInfo($fullBody)) {
return new ChangeInfoEnvelope([new UntrackedChangeInfo($commitMessage)], $version, $environment);
}
foreach ($splittedBodies as $body) {
$partialCommitMessage = new CommitMessage("", $body);
$actionTag = $partialCommitMessage->getVersionPressTag(TrackedChangeInfo::ACTION_TAG);
list($scope, $action, $id) = array_pad(explode('/', $actionTag, 3), 3, null);
$tags = $partialCommitMessage->getVersionPressTags();
unset($tags[TrackedChangeInfo::ACTION_TAG]);
$actionsInfo = $this->actionsInfoProvider->getActionsInfo($scope);
if ($this->dbSchema->isEntity($scope)) {
$entityInfo = $this->dbSchema->getEntityInfo($scope);
$changeInfoList[] = new EntityChangeInfo($entityInfo, $actionsInfo, $action, $id, $tags, []);
} else {
$changeInfoList[] = new TrackedChangeInfo($scope, $actionsInfo, $action, $id, $tags, []);
}
}
return new ChangeInfoEnvelope($changeInfoList, $version, $environment);
}