diff --git a/tests/VersioncontrolTokenTests.test b/tests/VersioncontrolTokenTests.test index c6ff83b..4432a61 100644 --- a/tests/VersioncontrolTokenTests.test +++ b/tests/VersioncontrolTokenTests.test @@ -2,6 +2,9 @@ /** * @file * Tests ensuring proper behavior of the integration with Token. + * + * @todo test when sanitized option is passed + * @todo test chained tokens */ require_once drupal_get_path('module', 'versioncontrol') . '/tests/VersioncontrolTestCase.test'; @@ -17,44 +20,59 @@ class VersioncontrolTokenTests extends VersioncontrolTestCase { function setUp() { $this->useBackends = self::BACKENDS_ALL; - parent::setUp('token'); + parent::setUp(); } function testVersioncontrolBackendTokens() { - $message = '[VersioncontrolBackend:name] [VersioncontrolBackend:type] [VersioncontrolBackend:description]'; $object = $this->testBackend; - $expected = implode(' ', array($object->name, $object->type, $object->description)); - $render = token_replace($message, array('VersioncontrolBackend' => $object)); - $this->assertEqual($render, $expected); + $tokens = array( + '[VersioncontrolBackend:name]' => $object->name, + '[VersioncontrolBackend:type]' => $object->type, + '[VersioncontrolBackend:description]' => $object->description, + ); + // Test to make sure that we generated something for each token. + $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.')); + foreach ($tokens as $name => $value) { + $render = token_replace($name, array('VersioncontrolBackend' => $object)); + $this->assertEqual($render, $value); + } } function testVersioncontrolRepositoryTokens() { - $message = '[VersioncontrolRepository:id] [VersioncontrolRepository:name] [VersioncontrolRepository:vcs] [VersioncontrolRepository:viewer]'; $object = $this->versioncontrolCreateRepository(); $viewer_url = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()); - $expected = implode(' ', $object->repo_id, $object->name, $object->vcs, $viewer_url); - $render = token_replace($message, array('VersioncontrolRepository' => $object)); - $this->assertEqual($render, $expected); + $tokens = array( + '[VersioncontrolRepository:id]' => $object->repo_id, + '[VersioncontrolRepository:name]' => $object->name, + '[VersioncontrolRepository:vcs]' => $object->vcs, + '[VersioncontrolRepository:viewer]' => $viewer_url, + ); + // Test to make sure that we generated something for each token. + $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.')); + foreach ($tokens as $name => $value) { + $render = token_replace($name, array('VersioncontrolRepository' => $object)); + $this->assertEqual($render, $value); + } } - //function testVersioncontrolOperationTokens() { - //$message = '[operation-id] [operation-repository] [operation-repository-id] [operation-repository-name] [operation-revision] [operation-message] [operation-author] [operation-author-name] [operation-author-uid] [operation-committer] [operation-committer-name] [operation-committer-uid]'; - //$object = $this->versioncontrolCreateOperation(); - //$expected = $object->vc_op_id .' '. - //l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()) .' '. - //$object->getRepository()->repo_id .' '. - //$object->getRepository()->name .' '. - //$object->revision .' '. - //$object->message .' '. - //l($object->author, 'user/'. $object->author_uid) .' '. - //$object->author .' '. - //$object->author_uid .' '. - //l($object->committer, 'user/'. $object->committer_uid) .' '. - //$object->committer .' '. - //$object->committer_uid; - //$render = token_replace($message, array('VersioncontrolOperation' => $object)); - //$this->assertEqual($render, $expected); - //} + function testVersioncontrolOperationTokens() { + $object = $this->versioncontrolCreateOperation(); + $tokens = array( + '[VersioncontrolOperation:id]' => $object->vc_op_id, + '[VersioncontrolOperation:revision]' => $object->revision, + '[VersioncontrolOperation:author_date]' => format_date($object->author_date, 'medium', '', NULL, $language_code), + '[VersioncontrolOperation:committer_date]' => format_date($object->committer_date, 'medium', '', NULL, $language_code), + '[VersioncontrolOperation:author]' => $object->author, + '[VersioncontrolOperation:committer]' => $object->committer, + '[VersioncontrolOperation:message]' => $object->message, + ); + // Test to make sure that we generated something for each token. + $this->assertFalse(in_array(0, array_map('strlen', $tokens)), t('No empty tokens generated.')); + foreach ($tokens as $name => $value) { + $render = token_replace($name, array('VersioncontrolOperation' => $object)); + $this->assertEqual($render, $value); + } + } //function testVersioncontrolBranchTokens() { //$message = '[branch-id] [branch-name] [branch-repository] [branch-repository-id] [branch-repository-name]'; diff --git a/versioncontrol.module b/versioncontrol.module index 7a8a49e..324da71 100644 --- a/versioncontrol.module +++ b/versioncontrol.module @@ -653,225 +653,3 @@ function versioncontrol_plugins_get_information() { ), ); } - -/** - * Implements hook_token_info(). - */ -function versioncontrol_token_info() { - $info = array(); - - // Backend. - $info['types']['VersioncontrolBackend'] = array( - 'name' => t('Version Control Backend'), - 'description' => t('Tokens related to backends.'), - 'needs-data' => 'VersioncontrolBackend', - ); - $info['tokens']['VersioncontrolBackend'] = array( - 'name' => array( - 'name'=> t('Backend name'), - 'description' => t('The name of the backend'), - ), - 'type' => array( - 'name'=> t('Backend machine name'), - 'description' => t('The type of the backend'), - ), - 'description' => array( - 'name'=> t('Backend description'), - 'description' => t('The description of the backend'), - ), - ); - - // Repository. - $info['types']['VersioncontrolRepository'] = array( - 'name' => t('Version Control Repository'), - 'description' => t('Tokens related to repositories.'), - 'needs-data' => 'VersioncontrolRepository', - ); - $info['tokens']['VersioncontrolRepository'] = array( - 'id' => array( - 'name'=> t('Repository ID'), - 'description' => t('The unique identifier for the repository.'), - ), - 'name' => array( - 'name'=> t('Repository name'), - 'description' => t('User visible name of the repository.'), - ), - // @todo Provide the whole backend object from here? - 'vcs' => array( - 'name'=> t('Repository backend machine name'), - 'description' => t('The description of the backend'), - ), - 'viewer' => array( - 'name'=> t('Repository viewer url.'), - 'description' => t('A link to the web viewer associated with this repository.'), - ), - ); - - //if ($all || $type == 'VersioncontrolOperation') { - //$tokens['Versioncontrol Operation'] = array( - //'operation-id' => t('The identifier of the operation'), - //'operation-repository' => t('Link to the repository'), - //'operation-repository-id' => t('The identifier of the repository'), - //'operation-repository-name' => t('The name of the repository'), - //'operation-revision' => t('The operation\'s revision identifier'), - //'operation-message' => t('The log message for the operation'), - //'operation-author' => t('Link to the user who performed the action'), - //'operation-author-name' => t('The name of the user who performed the action'), - //'operation-author-uid' => t('The user id of the user who performed the action'), - //'operation-committer' => t('Link to the user who performed the commit'), - //'operation-committer-name' => t('The name of the user who performed the commit'), - //'operation-committer-uid' => t('The user id of the user who performed the commit'), - //) + token_get_date_token_info(t('The operation\'s author'), 'operation-author-') - //+ token_get_date_token_info(t('The operation\'s committer'), 'operation-committer-'); - //} - - //if ($all || $type == 'VersioncontrolBranch') { - //$tokens['Versioncontrol Branch'] = array( - //'branch-id' => t('The identifier of the branch'), - //'branch-name' => t('The name of the branch'), - //'branch-repository' => t('Link to the repository'), - //'branch-repository-id' => t('The identifier of the repository'), - //'branch-repository-name' => t('The name of the repository'), - //); - //} - - //if ($all || $type == 'VersioncontrolTag') { - //$tokens['Versioncontrol Tag'] = array( - //'tag-id' => t('The identifier of the tag'), - //'tag-name' => t('The name of the tag'), - //'tag-repository' => t('Link to the repository'), - //'tag-repository-id' => t('The identifier of the repository'), - //'tag-repository-name' => t('The name of the repository'), - //); - //} - - //if ($all || $type == 'VersioncontrolItem') { - //$tokens['Versioncontrol Item'] = array( - //'item-path' => t('The path of the item'), - //); - //} - - //if ($all || $type == 'VersioncontrolEvent') { - //$tokens['Versioncontrol Event'] = array( - //'event-id' => t('The identifier of the operation'), - //'event-actor' => t('Link to the user that caused the event'), - //'event-actor-name' => t('The name of the user that caused the event'), - //'event-actor-uid' => t('The user id of the user that caused the event'), - //'event-repository' => t('Link to the repository'), - //'event-repository-id' => t('The identifier of the repository'), - //'event-repository-name' => t('The name of the repository'), - //) + token_get_date_token_info(t('The event\'s'), 'event-'); - //} - - return $info; -} - -/** - * Implements hook_tokens(). - */ -function versioncontrol_tokens($type, $tokens, array $data = array(), array $options = array()) { - $replacements = array(); - $sanitize = !empty($options['sanitize']); - - if (empty($data[$type])) { - return $replacements; - } - $object = $data[$type]; - - foreach ($tokens as $name => $original) { - switch ($type) { - case 'VersioncontrolBackend': - foreach ($tokens as $name => $original) { - switch ($name) { - case 'name': - case 'type': - case 'description': - $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name; - } - } - break; - case 'VersioncontrolRepository': - foreach ($tokens as $name => $original) { - switch ($name) { - case 'viewer': - $replacements[$original] = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()); - break; - case 'id': - $name = 'repo_id'; - case 'name': - case 'vcs': - $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name; - } - } - break; - //case 'VersioncontrolRepository': - //$values = array( - //'repository' => l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()), - //'repository-id' => $object->repo_id, - //'repository-name' => $object->name, - //'repository-vcs' => $object->vcs, - //); - - //break; - //case 'VersioncontrolOperation': - //$values = array( - //'operation-id' => $object->vc_op_id, - //'operation-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), - //'operation-repository-id' => $object->getRepository()->repo_id, - //'operation-repository-name' => $object->getRepository()->name, - //'operation-revision' => $object->revision, - //'operation-message' => $object->message, - //'operation-author' => l($object->author, 'user/'. $object->author_uid), - //'operation-author-name' => $object->author, - //'operation-author-uid' => $object->author_uid, - //'operation-committer' => l($object->committer, 'user/'. $object->committer_uid), - //'operation-committer-name' => $object->committer, - //'operation-committer-uid' => $object->committer_uid, - //) + token_get_date_token_values($object->author_date, 'operation-author-') - //+ token_get_date_token_values($object->committer_date, 'operation-committer-'); - - //break; - //case 'VersioncontrolBranch': - //$values = array( - //'branch-id' => $object->label_id, - //'branch-name' => $object->name, - //'branch-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), - //'branch-repository-id' => $object->getRepository()->repo_id, - //'branch-repository-name' => $object->getRepository()->name, - //); - - //break; - //case 'VersioncontrolTag': - //$values = array( - //'tag-id' => $object->label_id, - //'tag-name' => $object->name, - //'tag-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), - //'tag-repository-id' => $object->getRepository()->repo_id, - //'tag-repository-name' => $object->getRepository()->name, - //); - - //break; - //case 'VersioncontrolItem': - //$values = array( - //'item-path' => $object->path, - //); - - //break; - //case 'VersioncontrolEvent': - //$actor = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $object->uid)); - - //$values = array( - //'event-id' => $object->elid, - //'event-actor' => l($actor->name, 'user/'. $object->uid), - //'event-actor-name' => $actor->name, - //'event-actor-uid' => $object->uid, - //'event-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), - //'event-repository-id' => $object->getRepository()->repo_id, - //'event-repository-name' => $object->getRepository()->name, - //) + token_get_date_token_values($object->timestamp, 'event-'); - - } - } - - return $replacements; -} diff --git a/versioncontrol.tokens.inc b/versioncontrol.tokens.inc new file mode 100644 index 0000000..01194db --- /dev/null +++ b/versioncontrol.tokens.inc @@ -0,0 +1,252 @@ + t('Version Control Backend'), + 'description' => t('Tokens related to backends.'), + 'needs-data' => 'VersioncontrolBackend', + ); + $info['tokens']['VersioncontrolBackend'] = array( + 'name' => array( + 'name'=> t('Backend name'), + 'description' => t('The name of the backend'), + ), + 'type' => array( + 'name'=> t('Backend machine name'), + 'description' => t('The type of the backend'), + ), + 'description' => array( + 'name'=> t('Backend description'), + 'description' => t('The description of the backend'), + ), + ); + + // Repository. + $info['types']['VersioncontrolRepository'] = array( + 'name' => t('Version Control Repository'), + 'description' => t('Tokens related to repositories.'), + 'needs-data' => 'VersioncontrolRepository', + ); + $info['tokens']['VersioncontrolRepository'] = array( + 'id' => array( + 'name'=> t('Repository ID'), + 'description' => t('The unique identifier for the repository.'), + ), + 'name' => array( + 'name'=> t('Repository name'), + 'description' => t('User visible name of the repository.'), + ), + // @todo Provide the whole backend object from here? + 'vcs' => array( + 'name'=> t('Repository backend machine name'), + 'description' => t('The description of the backend'), + ), + 'viewer' => array( + 'name'=> t('Repository viewer url.'), + 'description' => t('A link to the web viewer associated with this repository.'), + ), + ); + + // Operation. + $info['types']['VersioncontrolOperation'] = array( + 'name' => t('Version Control Operation'), + 'description' => t('Tokens related to operations.'), + 'needs-data' => 'VersioncontrolOperation', + ); + $info['tokens']['VersioncontrolOperation'] = array( + 'id' => array( + 'name' => t('Operation ID'), + 'description' => t('The unique identifier for the operation.'), + ), + // @todo Provide the whole repository object from here? + 'revision' => array( + 'name' => t('Operation revision'), + 'description' => t('Backend internal identifier for the operation.'), + ), + 'author_date' => array( + 'name' => t('Authored date'), + 'description' => 'Date/time when the operation was created.', + 'type' => 'date', + ), + 'committer_date' => array( + 'name' => t('Committed date'), + 'description' => 'Date/time when the operation was added to the repository.', + 'type' => 'date', + ), + 'author' => array( + 'name' => t('Author'), + 'description' => 'VCS specific username of the user who is the original author of this operation.', + 'type' => 'user', + ), + 'committer' => array( + 'name' => t('Committer'), + 'description' => 'VCS specific username of the user who is the original committer of this operation.', + 'type' => 'user', + ), + 'message' => array( + 'name' => t('Commit message'), + 'description' => 'Log message from VCS for this operation.', + 'type' => 'user', + ), + ); + + //if ($all || $type == 'VersioncontrolBranch') { + //$tokens['Versioncontrol Branch'] = array( + //'branch-id' => t('The identifier of the branch'), + //'branch-name' => t('The name of the branch'), + //'branch-repository' => t('Link to the repository'), + //'branch-repository-id' => t('The identifier of the repository'), + //'branch-repository-name' => t('The name of the repository'), + //); + //} + + //if ($all || $type == 'VersioncontrolTag') { + //$tokens['Versioncontrol Tag'] = array( + //'tag-id' => t('The identifier of the tag'), + //'tag-name' => t('The name of the tag'), + //'tag-repository' => t('Link to the repository'), + //'tag-repository-id' => t('The identifier of the repository'), + //'tag-repository-name' => t('The name of the repository'), + //); + //} + + //if ($all || $type == 'VersioncontrolItem') { + //$tokens['Versioncontrol Item'] = array( + //'item-path' => t('The path of the item'), + //); + //} + + //if ($all || $type == 'VersioncontrolEvent') { + //$tokens['Versioncontrol Event'] = array( + //'event-id' => t('The identifier of the operation'), + //'event-actor' => t('Link to the user that caused the event'), + //'event-actor-name' => t('The name of the user that caused the event'), + //'event-actor-uid' => t('The user id of the user that caused the event'), + //'event-repository' => t('Link to the repository'), + //'event-repository-id' => t('The identifier of the repository'), + //'event-repository-name' => t('The name of the repository'), + //) + token_get_date_token_info(t('The event\'s'), 'event-'); + //} + + return $info; +} + +/** + * Implements hook_tokens(). + */ +function versioncontrol_tokens($type, $tokens, array $data = array(), array $options = array()) { + $replacements = array(); + $sanitize = !empty($options['sanitize']); + $language_code = isset($options['language']) ? $options['language']->language : NULL; + + if (empty($data[$type])) { + return $replacements; + } + $object = $data[$type]; + + foreach ($tokens as $name => $original) { + switch ($type) { + case 'VersioncontrolBackend': + switch ($name) { + case 'name': + case 'type': + case 'description': + $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name; + } + break; + case 'VersioncontrolRepository': + switch ($name) { + case 'viewer': + $replacements[$original] = l($object->name, $object->getUrlHandler()->getRepositoryViewUrl()); + break; + case 'id': + $name = 'repo_id'; + case 'name': + case 'vcs': + $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name; + } + break; + case 'VersioncontrolOperation': + switch ($name) { + case 'author_date': + case 'committer_date': + $replacements[$original] = format_date($object->$name, 'medium', '', NULL, $language_code); + break; + case 'id': + $name = 'vc_op_id'; + case 'revision': + case 'author': + case 'committer': + case 'message': + $replacements[$original] = $sanitize ? check_plain($object->$name) : $object->$name; + } + if ($author_date_tokens = token_find_with_prefix($tokens, 'author_date')) { + $replacements += token_generate('date', $author_date_tokens, array('date' => $object->author_date), $options); + } + if ($committer_date_tokens = token_find_with_prefix($tokens, 'committer_date')) { + $replacements += token_generate('date', $committer_date_tokens, array('date' => $object->committer_date), $options); + } + if ($author_tokens = token_find_with_prefix($tokens, 'author')) { + $author = user_load($object->author_uid); + $replacements += token_generate('user', $author_tokens, array('user' => $author), $options); + } + if ($committer_tokens = token_find_with_prefix($tokens, 'committer')) { + $committer = user_load($object->committer_uid); + $replacements += token_generate('user', $author_tokens, array('user' => $committer), $options); + } + break; + + //case 'VersioncontrolBranch': + //$values = array( + //'branch-id' => $object->label_id, + //'branch-name' => $object->name, + //'branch-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), + //'branch-repository-id' => $object->getRepository()->repo_id, + //'branch-repository-name' => $object->getRepository()->name, + //); + + //break; + //case 'VersioncontrolTag': + //$values = array( + //'tag-id' => $object->label_id, + //'tag-name' => $object->name, + //'tag-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), + //'tag-repository-id' => $object->getRepository()->repo_id, + //'tag-repository-name' => $object->getRepository()->name, + //); + + //break; + //case 'VersioncontrolItem': + //$values = array( + //'item-path' => $object->path, + //); + + //break; + //case 'VersioncontrolEvent': + //$actor = db_fetch_object(db_query("SELECT name, mail FROM {users} WHERE uid = %d", $object->uid)); + + //$values = array( + //'event-id' => $object->elid, + //'event-actor' => l($actor->name, 'user/'. $object->uid), + //'event-actor-name' => $actor->name, + //'event-actor-uid' => $object->uid, + //'event-repository' => l($object->getRepository()->name, $object->getRepository()->getUrlHandler()->getRepositoryViewUrl()), + //'event-repository-id' => $object->getRepository()->repo_id, + //'event-repository-name' => $object->getRepository()->name, + //) + token_get_date_token_values($object->timestamp, 'event-'); + + } + } + + return $replacements; +}