Neos\Flow\Core\Migrations\Git::isWorkingCopyDirty PHP Method

isWorkingCopyDirty() public static method

Check whether the working copy has uncommitted changes.
public static isWorkingCopyDirty ( string $path ) : boolean
$path string
return boolean
    public static function isWorkingCopyDirty($path)
    {
        chdir($path);
        $output = array();
        exec('git status --porcelain', $output);
        return $output !== array();
    }

Usage Example

 /**
  * Apply the given migration to the package and commit the result.
  *
  * @param AbstractMigration $migration
  * @param boolean $force if TRUE the migration will be applied even if the current package is not a git working copy or contains local changes
  * @return void
  * @throws \RuntimeException
  */
 protected function migratePackage(AbstractMigration $migration, $force = false)
 {
     $packagePath = $this->currentPackageData['path'];
     if ($this->hasMigrationApplied($migration)) {
         $this->triggerEvent(self::EVENT_MIGRATION_ALREADY_APPLIED, array($migration, 'Migration already applied'));
         return;
     }
     $isWorkingCopy = Git::isWorkingCopy($packagePath);
     $hasLocalChanges = Git::isWorkingCopyDirty($packagePath);
     if (!$force) {
         if (!$isWorkingCopy) {
             $this->triggerEvent(self::EVENT_MIGRATION_SKIPPED, array($migration, 'Not a Git working copy, use --force to apply changes anyways'));
             return;
         }
         if ($hasLocalChanges) {
             $this->triggerEvent(self::EVENT_MIGRATION_SKIPPED, array($migration, 'Working copy contains local changes, use --force to apply changes anyways'));
             return;
         }
     }
     if ($isWorkingCopy) {
         $importResult = $this->importMigrationLogFromGitHistory(!$hasLocalChanges);
         if ($importResult !== null) {
             $this->triggerEvent(self::EVENT_MIGRATION_LOG_IMPORTED, array($migration, $importResult));
         }
     }
     $this->triggerEvent(self::EVENT_MIGRATION_EXECUTE, array($migration));
     try {
         $migration->prepare($this->currentPackageData);
         $migration->up();
         $migration->execute();
         $commitMessageNotice = null;
         if ($isWorkingCopy && !Git::isWorkingCopyDirty($packagePath)) {
             $commitMessageNotice = 'Note: This migration did not produce any changes, so the commit simply marks the migration as applied. This makes sure it will not be applied again.';
         }
         $this->markMigrationApplied($migration);
         $this->triggerEvent(self::EVENT_MIGRATION_EXECUTED, array($migration));
         if ($hasLocalChanges || !$isWorkingCopy) {
             $this->triggerEvent(self::EVENT_MIGRATION_COMMIT_SKIPPED, array($migration, $hasLocalChanges ? 'Working copy contains local changes' : 'No Git working copy'));
         } else {
             $migrationResult = $this->commitMigration($migration, $commitMessageNotice);
             $this->triggerEvent(self::EVENT_MIGRATION_COMMITTED, array($migration, $migrationResult));
         }
     } catch (\Exception $exception) {
         throw new \RuntimeException(sprintf('Applying migration "%s" to "%s" failed: "%s"', $migration->getIdentifier(), $this->currentPackageData['packageKey'], $exception->getMessage()), 1421692982, $exception);
     }
 }