Skip to content

Commit

Permalink
Merge branch '2.8'
Browse files Browse the repository at this point in the history
* 2.8: (21 commits)
  Fix merge
  Fix typo
  Various fixes esp. on Windows
  Fix the validation of form resources to register the default theme
  Fix the retrieval of the value with property path when using a loader
  [appveyor] minor enhancements
  [Process] Disable failing tests on Windows
  [Translation] Fix the string casting in the XliffFileLoader
  Windows and Intl fixes
  Add appveyor.yml for C.I. on Windows
  [VarDumper] fixed HtmlDumper to target specific the head tag
  [travis] merge php: nightly and deps=high test-matrix lines
  consistently use str_replace to unify directory separators
  Support omitting the <target> node in an .xlf file.
  Fix the handling of values for multiple choice types
  moved PHP nightly to PHP 7.0
  fixed tests using deprecation features
  [Form] made deprecation notice more precise
  fixed CS
  Fix BC break after split of ACL from core
  ...

Conflicts:
	.travis.yml
	composer.json
	src/Symfony/Bundle/TwigBundle/DependencyInjection/Configuration.php
	src/Symfony/Component/Intl/DateFormatter/IntlDateFormatter.php
	src/Symfony/Component/Intl/Tests/DateFormatter/AbstractIntlDateFormatterTest.php
	src/Symfony/Component/Locale/Tests/LocaleTest.php
  • Loading branch information
nicolas-grekas committed Aug 27, 2015
2 parents dcc80c7 + 4353134 commit ab14739
Show file tree
Hide file tree
Showing 64 changed files with 555 additions and 216 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,3 +5,4 @@ phpunit.xml
composer.phar
package.tar
/packages.json
/.phpunit
44 changes: 21 additions & 23 deletions .travis.yml
Expand Up @@ -3,20 +3,20 @@ language: php
sudo: false

addons:
apt_packages:
- parallel
- language-pack-fr-base
apt_packages:
- parallel
- language-pack-fr-base

matrix:
include:
- php: hhvm
- php: 5.5.9
- php: 5.5
- php: 5.6
env: deps=low
- php: 5.6
env: deps=2.8
- php: nightly
- php: 7.0
env: deps=low
fast_finish: true

services: mongodb
Expand All @@ -29,28 +29,26 @@ env:
before_install:
- composer self-update
- if [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then echo "memory_limit = -1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then phpenv config-rm xdebug.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then echo "extension = mongo.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]] && [ $(php -r "echo PHP_MINOR_VERSION;") -le 4 ]; then echo "extension = apc.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then (pecl install -f memcached-2.1.0 && echo "extension = memcache.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini) || echo "Let's continue without memcache extension"; fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then (cd src/Symfony/Component/Debug/Resources/ext && phpize && ./configure && make && echo "extension = $(pwd)/modules/symfony_debug.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini); fi;
- if [[ "$TRAVIS_PHP_VERSION" != "nightly" ]] && [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then php -i; fi;
# Build a standalone phpunit without symfony/yaml and that works around https://github.com/sebastianbergmann/phpunit-mock-objects/issues/223
- (mkdir phpunit && cd phpunit && wget https://github.com/sebastianbergmann/phpunit/archive/4.7.zip && unzip 4.7.zip && cd phpunit-4.7 && composer remove --no-update symfony/yaml && composer require --prefer-source phpunit/phpunit-mock-objects '2.3.0')
- export PHPUNIT="$(readlink -f ./phpunit/phpunit-4.7/phpunit) --colors=always"
# Set the COMPOSER_ROOT_VERSION to the right version according to the branch being built
- if [ "$TRAVIS_BRANCH" = "master" ]; then export COMPOSER_ROOT_VERSION=dev-master; else export COMPOSER_ROOT_VERSION="$TRAVIS_BRANCH".x-dev; fi;
- if [[ "$TRAVIS_PHP_VERSION" = 5.* ]]; then phpenv config-rm xdebug.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" = 5.* ]]; then echo "extension = mongo.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" =~ 5.[34] ]]; then echo "extension = apc.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi;
- if [[ "$TRAVIS_PHP_VERSION" = 5.* ]]; then (pecl install -f memcached-2.1.0 && echo "extension = memcache.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini) || echo "Let's continue without memcache extension"; fi;
- if [[ "$TRAVIS_PHP_VERSION" = 5.* ]]; then (cd src/Symfony/Component/Debug/Resources/ext && phpize && ./configure && make && echo "extension = $(pwd)/modules/symfony_debug.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini); fi;
- if [[ "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then php -i; fi;
- ./phpunit install
- export PHPUNIT="$(readlink -f ./phpunit)"

install:
- if [ "$TRAVIS_BRANCH" = "master" ]; then export COMPOSER_ROOT_VERSION=dev-master; else export COMPOSER_ROOT_VERSION="$TRAVIS_BRANCH".x-dev; fi;
- if [ "$deps" = "no" ]; then export SYMFONY_DEPRECATIONS_HELPER=strict; fi;
- if [ "$deps" = "no" ]; then composer --prefer-source install; fi;
- components=$(find src/Symfony -mindepth 3 -type f -name phpunit.xml.dist -printf '%h\n')
- if [ "$deps" != "no" ]; then php .travis.php $TRAVIS_COMMIT_RANGE $TRAVIS_BRANCH $components; fi;
- COMPONENTS=$(find src/Symfony -mindepth 3 -type f -name phpunit.xml.dist -printf '%h\n')
- if [ "$deps" != "no" ]; then php .travis.php $TRAVIS_COMMIT_RANGE $TRAVIS_BRANCH $COMPONENTS; fi;
- if [ "$deps" = "2.8" ]; then git fetch origin 2.8; git checkout -m FETCH_HEAD; export COMPOSER_ROOT_VERSION=2.8.x-dev; fi;

script:
- if [ "$deps" = "no" ]; then echo "$components" | parallel --gnu --keep-order 'echo -e "\\nRunning {} tests"; $PHPUNIT --exclude-group tty,benchmark,intl-data {} || (echo -e "\\e[41mKO\\e[0m {}" && $(exit 1));'; fi;
- if [ "$deps" = "no" ]; then echo -e "\\nRunning tests requiring tty"; $PHPUNIT --group tty || (echo -e "\\e[41mKO\\e[0m tty group" && $(exit 1)); fi;
- if [ "$deps" = "high" ]; then echo "$components" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source update; $PHPUNIT --exclude-group tty,benchmark,intl-data || (echo -e "\\e[41mKO\\e[0m {}" && $(exit 1));'; fi;
- if [ "$deps" = "low" ]; then echo "$components" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source --prefer-lowest --prefer-stable update; $PHPUNIT --exclude-group tty,benchmark,intl-data || (echo -e "\\e[41mKO\\e[0m {}" && $(exit 1));'; fi;
- if [ "$deps" = "2.8" ]; then echo "$components" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source update; $PHPUNIT --exclude-group tty,benchmark,intl-data,legacy || (echo -e "\\e[41mKO\\e[0m {}" && $(exit 1));'; fi;
- if [ "$deps" = "no" ]; then echo "$COMPONENTS" | parallel --gnu --keep-order 'echo -e "\\nRunning {} tests"; $PHPUNIT --exclude-group tty,benchmark,intl-data {}'; fi;
- if [ "$deps" = "no" ]; then echo -e "\\nRunning tests requiring tty"; $PHPUNIT --group tty; fi;
- if [ "$deps" = "high" ]; then echo "$COMPONENTS" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source update; $PHPUNIT --exclude-group tty,benchmark,intl-data'; fi;
- if [ "$deps" = "low" ]; then echo "$COMPONENTS" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source --prefer-lowest --prefer-stable update; $PHPUNIT --exclude-group tty,benchmark,intl-data'; fi;
- if [ "$deps" = "2.8" ]; then echo "$COMPONENTS" | parallel --gnu --keep-order -j10% 'echo -e "\\nRunning {} tests"; cd {}; composer --prefer-source update; $PHPUNIT --exclude-group tty,benchmark,intl-data,legacy'; fi;
44 changes: 44 additions & 0 deletions appveyor.yml
@@ -0,0 +1,44 @@
build: false
shallow_clone: true
platform: x86
clone_folder: c:\projects\symfony

environment:
matrix:
- PHP_EXT: 1
- PHP_EXT: 0

cache:
- c:\php -> appveyor.yml
- .phpunit -> phpunit

init:
- SET PATH=c:\php;%PATH%
- SET COMPOSER_NO_INTERACTION=1
- SET SYMFONY_DEPRECATIONS_HELPER=strict
- SET PHP=1
- SET ANSICON=121x90 (121x90)

install:
- IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
- cd c:\php
- IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-5.6.11-nts-Win32-VC11-x86.zip
- IF %PHP%==1 7z x php-5.6.11-nts-Win32-VC11-x86.zip -y > 7z.log
- IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
- appveyor DownloadFile https://getcomposer.org/composer.phar
- copy php.ini-production php.ini /Y
- echo date.timezone="UTC" >> php.ini
- echo extension_dir=ext >> php.ini
- echo extension=php_openssl.dll >> php.ini
- IF %PHP_EXT%==1 echo extension=php_intl.dll >> php.ini
- IF %PHP_EXT%==1 echo extension=php_mbstring.dll >> php.ini
- IF %PHP_EXT%==1 echo extension=php_fileinfo.dll >> php.ini
- IF %PHP_EXT%==1 echo extension=php_pdo_sqlite.dll >> php.ini
- cd c:\projects\symfony
- php phpunit install
- IF %APPVEYOR_REPO_BRANCH%==master (SET COMPOSER_ROOT_VERSION=dev-master) ELSE (SET COMPOSER_ROOT_VERSION=%APPVEYOR_REPO_BRANCH%.x-dev)
- composer update --prefer-source --no-progress --ansi

test_script:
- cd c:\projects\symfony
- php phpunit symfony --exclude-group benchmark,intl-data
2 changes: 1 addition & 1 deletion composer.json
Expand Up @@ -73,7 +73,7 @@
"monolog/monolog": "~1.11",
"ocramius/proxy-manager": "~0.4|~1.0",
"egulias/email-validator": "~1.2",
"symfony/security-acl": "self.version"
"symfony/security-acl": "~2.8|~3.0"
},
"autoload": {
"psr-4": {
Expand Down
126 changes: 126 additions & 0 deletions phpunit
@@ -0,0 +1,126 @@
#!/usr/bin/env php
<?php

error_reporting(-1);

$PHPUNIT_VERSION = 4.8;
$PHPUNIT_DIR = __DIR__.'/.phpunit';

if (!file_exists("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit")) {
// Build a standalone phpunit without symfony/yaml

$oldPwd = getcwd();
mkdir($PHPUNIT_DIR);
chdir($PHPUNIT_DIR);
if (extension_loaded('openssl') && ini_get('allow_url_fopen')) {
stream_copy_to_stream(fopen("https://github.com/sebastianbergmann/phpunit/archive/$PHPUNIT_VERSION.zip", 'rb'), fopen("$PHPUNIT_VERSION.zip", 'wb'));
} else {
passthru("wget https://github.com/sebastianbergmann/phpunit/archive/$PHPUNIT_VERSION.zip");
}
$zip = new ZipArchive();
$zip->open("$PHPUNIT_VERSION.zip");
$zip->extractTo(getcwd());
$zip->close();
chdir("phpunit-$PHPUNIT_VERSION");
passthru("composer remove --no-update symfony/yaml");
passthru("composer install --prefer-source --no-progress --ansi");
chdir($oldPwd);
}

$cmd = array_map('escapeshellarg', $argv);
$exit = 0;

if (isset($argv[1]) && 'symfony' === $argv[1]) {
// Find Symfony components in plain php for Windows portability

$finder = new RecursiveDirectoryIterator('src/Symfony', FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::UNIX_PATHS);
$finder = new RecursiveIteratorIterator($finder);
$finder->setMaxDepth(3);

array_shift($cmd);
$cmd[0] = "php $PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit --colors=always";
$procs = array();

foreach ($finder as $file => $fileInfo) {
if ('phpunit.xml.dist' === $file) {
$component = dirname($fileInfo->getPathname());

// Run phpunit tests in parallel

$c = escapeshellarg($component);

if ($proc = proc_open(implode(' ', $cmd)." $c > $c/phpunit.stdout 2> $c/phpunit.stderr", array(), $pipes)) {
$procs[$component] = $proc;
} else {
$exit = 1;
echo "\033[41mKO\033[0m $component\n\n";
}
}
}

// Fixes for colors support on appveyor
// See http://help.appveyor.com/discussions/suggestions/197-support-ansi-color-codes
$colorFixes = array(
array("S\033[0m\033[0m\033[36m\033[1mS", "E\033[0m\033[0m\033[31m\033[1mE", "I\033[0m\033[0m\033[33m\033[1mI", "F\033[0m\033[0m\033[41m\033[37mF"),
array("SS", "EE", "II", "FF"),
);
$colorFixes[0] = array_merge($colorFixes[0], $colorFixes[0]);
$colorFixes[1] = array_merge($colorFixes[1], $colorFixes[1]);

foreach ($procs as $component => $proc) {
$procStatus = proc_close($proc);

foreach (array('out', 'err') as $file) {
$file = "$component/phpunit.std$file";

if ('\\' === DIRECTORY_SEPARATOR) {
$h = fopen($file, 'rb');
while (false !== $line = fgets($h)) {
echo str_replace($colorFixes[0], $colorFixes[1], preg_replace(
'/(\033\[[0-9]++);([0-9]++m)(?:(.)(\033\[0m))?/',
"$1m\033[$2$3$4$4",
$line
));
}
fclose($h);
} else {
readfile($file);
}
unlink($file);
}

if ($procStatus) {
$exit = 1;
echo "\033[41mKO\033[0m $component\n\n";
} else {
echo "\033[32mOK\033[0m $component\n\n";
}
}

} elseif (!isset($argv[1]) || 'install' !== $argv[1]) {
// Run regular phpunit in a subprocess

$cmd[0] = "php $PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit --colors=always";

$errFile = tempnam(sys_get_temp_dir(), 'phpunit.stderr.');
if ($proc = proc_open(implode(' ', $cmd).' 2> '.escapeshellarg($errFile), array(1 => array('pipe', 'w')), $pipes)) {
stream_copy_to_stream($pipes[1], STDOUT);
fclose($pipes[1]);
$exit = proc_close($proc);

readfile($errFile);
unlink($errFile);
}

if (!file_exists($component = array_pop($argv))) {
$component = basename(getcwd());
}

if ($exit) {
echo "\033[41mKO\033[0m $component\n\n";
} else {
echo "\033[32mOK\033[0m $component\n\n";
}
}

exit($exit);
10 changes: 5 additions & 5 deletions src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php
Expand Up @@ -225,7 +225,7 @@ public function testConfigureQueryBuilderWithClosureReturningNull()
'em' => 'default',
'class' => self::SINGLE_IDENT_CLASS,
'query_builder' => function () {
return null;
return;
},
));

Expand Down Expand Up @@ -346,7 +346,7 @@ public function testSubmitSingleNonExpandedSingleAssocIdentifier()

$this->persist(array($innerEntity1, $innerEntity2, $entity1, $entity2));

$field = $this->factory->createNamed('name', 'entity', null, array(
$field = $this->factory->createNamed('name', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', null, array(
'multiple' => false,
'expanded' => false,
'em' => 'default',
Expand Down Expand Up @@ -421,7 +421,7 @@ public function testSubmitMultipleNonExpandedSingleAssocIdentifier()

$this->persist(array($innerEntity1, $innerEntity2, $innerEntity3, $entity1, $entity2, $entity3));

$field = $this->factory->createNamed('name', 'entity', null, array(
$field = $this->factory->createNamed('name', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', null, array(
'multiple' => true,
'expanded' => false,
'em' => 'default',
Expand Down Expand Up @@ -732,7 +732,7 @@ public function testDisallowChoicesThatAreNotIncludedChoicesSingleAssocIdentifie

$this->persist(array($innerEntity1, $innerEntity2, $entity1, $entity2));

$field = $this->factory->createNamed('name', 'entity', null, array(
$field = $this->factory->createNamed('name', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', null, array(
'em' => 'default',
'class' => self::SINGLE_ASSOC_IDENT_CLASS,
'choices' => array($entity1, $entity2),
Expand Down Expand Up @@ -804,7 +804,7 @@ public function testDisallowChoicesThatAreNotIncludedQueryBuilderSingleAssocIden

$repository = $this->em->getRepository(self::SINGLE_ASSOC_IDENT_CLASS);

$field = $this->factory->createNamed('name', 'entity', null, array(
$field = $this->factory->createNamed('name', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', null, array(
'em' => 'default',
'class' => self::SINGLE_ASSOC_IDENT_CLASS,
'query_builder' => $repository->createQueryBuilder('e')
Expand Down
8 changes: 4 additions & 4 deletions src/Symfony/Bridge/Twig/Extension/CodeExtension.php
Expand Up @@ -32,7 +32,7 @@ class CodeExtension extends \Twig_Extension
public function __construct($fileLinkFormat, $rootDir, $charset)
{
$this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
$this->rootDir = str_replace('\\', '/', dirname($rootDir)).'/';
$this->rootDir = str_replace('/', DIRECTORY_SEPARATOR, dirname($rootDir)).DIRECTORY_SEPARATOR;
$this->charset = $charset;
}

Expand Down Expand Up @@ -163,11 +163,11 @@ public function formatFile($file, $line, $text = null)
$file = trim($file);

if (null === $text) {
$text = str_replace('\\', '/', $file);
$text = str_replace('/', DIRECTORY_SEPARATOR, $file);
if (0 === strpos($text, $this->rootDir)) {
$text = substr($text, strlen($this->rootDir));
$text = explode('/', $text, 2);
$text = sprintf('<abbr title="%s%2$s">%s</abbr>%s', $this->rootDir, $text[0], isset($text[1]) ? '/'.$text[1] : '');
$text = explode(DIRECTORY_SEPARATOR, $text, 2);
$text = sprintf('<abbr title="%s%2$s">%s</abbr>%s', $this->rootDir, $text[0], isset($text[1]) ? DIRECTORY_SEPARATOR.$text[1] : '');
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/Symfony/Bridge/Twig/Tests/Command/LintCommandTest.php
Expand Up @@ -28,7 +28,7 @@ public function testLintCorrectFile()
$tester = $this->createCommandTester();
$filename = $this->createFile('{{ foo }}');

$ret = $tester->execute(array('filename' => array($filename)), array('verbosity' => OutputInterface::VERBOSITY_VERBOSE));
$ret = $tester->execute(array('filename' => array($filename)), array('verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false));

$this->assertEquals(0, $ret, 'Returns 0 in case of success');
$this->assertRegExp('/^OK in /', $tester->getDisplay());
Expand All @@ -39,7 +39,7 @@ public function testLintIncorrectFile()
$tester = $this->createCommandTester();
$filename = $this->createFile('{{ foo');

$ret = $tester->execute(array('filename' => array($filename)));
$ret = $tester->execute(array('filename' => array($filename)), array('decorated' => false));

$this->assertEquals(1, $ret, 'Returns 1 in case of error');
$this->assertRegExp('/^KO in /', $tester->getDisplay());
Expand All @@ -54,15 +54,15 @@ public function testLintFileNotReadable()
$filename = $this->createFile('');
unlink($filename);

$ret = $tester->execute(array('filename' => array($filename)));
$ret = $tester->execute(array('filename' => array($filename)), array('decorated' => false));
}

public function testLintFileCompileTimeException()
{
$tester = $this->createCommandTester();
$filename = $this->createFile("{{ 2|number_format(2, decimal_point='.', ',') }}");

$ret = $tester->execute(array('filename' => array($filename)));
$ret = $tester->execute(array('filename' => array($filename)), array('decorated' => false));

$this->assertEquals(1, $ret, 'Returns 1 in case of error');
$this->assertRegExp('/^KO in /', $tester->getDisplay());
Expand Down
Expand Up @@ -336,7 +336,7 @@ private function addTemplatingSection(ArrayNodeDefinition $rootNode)
->addDefaultChildrenIfNoneSet()
->prototype('scalar')->defaultValue('FrameworkBundle:Form')->end()
->validate()
->ifNotInArray(array('FrameworkBundle:Form'))
->ifTrue(function ($v) {return !in_array('FrameworkBundle:Form', $v); })
->then(function ($v) {
return array_merge(array('FrameworkBundle:Form'), $v);
})
Expand Down
Expand Up @@ -31,7 +31,7 @@ public function parse($name)
return $name;
}

$parts = explode('/', strtr($name, '\\', '/'));
$parts = explode('/', str_replace('\\', '/', $name));

$elements = explode('.', array_pop($parts));
if (3 > count($elements)) {
Expand Down
Expand Up @@ -49,7 +49,7 @@ public function parse($name)
}

// normalize name
$name = str_replace(':/', ':', preg_replace('#/{2,}#', '/', strtr($name, '\\', '/')));
$name = str_replace(':/', ':', preg_replace('#/{2,}#', '/', str_replace('\\', '/', $name)));

if (false !== strpos($name, '..')) {
throw new \RuntimeException(sprintf('Template name "%s" contains invalid characters.', $name));
Expand Down

0 comments on commit ab14739

Please sign in to comment.