Completed
Push — develop ( 32764c...cb3cfa )
by
unknown
20:26
created
vendor/brianhenryie/strauss/src/Cleanup.php 1 patch
Indentation   +64 added lines, -64 removed lines patch added patch discarded remove patch
@@ -14,73 +14,73 @@
 block discarded – undo
14 14
 class Cleanup
15 15
 {
16 16
 
17
-    /** @var Filesystem */
18
-    protected Filesystem $filesystem;
17
+	/** @var Filesystem */
18
+	protected Filesystem $filesystem;
19 19
 
20
-    protected bool $isDeleteVendorFiles;
20
+	protected bool $isDeleteVendorFiles;
21 21
 
22
-    protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR;
22
+	protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR;
23 23
     
24
-    public function __construct(StraussConfig $config, string $workingDir)
25
-    {
24
+	public function __construct(StraussConfig $config, string $workingDir)
25
+	{
26 26
 
27
-        $this->isDeleteVendorFiles = $config->isDeleteVendorFiles();
27
+		$this->isDeleteVendorFiles = $config->isDeleteVendorFiles();
28 28
         
29
-        $this->filesystem = new Filesystem(new Local($workingDir));
30
-    }
31
-
32
-    /**
33
-     * Maybe delete the source files that were copied (depending on config),
34
-     * then delete empty directories.
35
-     *
36
-     * @param array $sourceFiles
37
-     */
38
-    public function cleanup(array $sourceFiles)
39
-    {
40
-
41
-        // TODO Don't do this if vendor is the target dir (i.e. in-situ updating).
42
-
43
-        if ($this->isDeleteVendorFiles) {
44
-            foreach ($sourceFiles as $sourceFile) {
45
-                $relativeFilepath = $this->vendorDirectory . $sourceFile;
46
-
47
-                $this->filesystem->delete($relativeFilepath);
48
-            }
49
-
50
-            // Get the root folders of the moved files.
51
-            $rootSourceDirectories = [];
52
-            foreach ($sourceFiles as $sourceFile) {
53
-                $arr = explode("/", $sourceFile, 2);
54
-                $dir = $arr[0];
55
-                $rootSourceDirectories[ $dir ] = $dir;
56
-            }
57
-            $rootSourceDirectories = array_keys($rootSourceDirectories);
58
-
59
-
60
-            $finder = new Finder();
61
-
62
-            foreach ($rootSourceDirectories as $rootSourceDirectory) {
63
-                if (!is_dir($rootSourceDirectory) || is_link($rootSourceDirectory)) {
64
-                    continue;
65
-                }
66
-
67
-                $finder->directories()->path($rootSourceDirectory);
68
-
69
-                foreach ($finder as $directory) {
70
-                    $metadata = $this->filesystem->getMetadata($directory);
71
-
72
-                    if ($this->dirIsEmpty($directory)) {
73
-                        $this->filesystem->deleteDir($directory);
74
-                    }
75
-                }
76
-            }
77
-        }
78
-    }
79
-
80
-    // TODO: Use Symphony or Flysystem functions.
81
-    protected function dirIsEmpty(string $dir): bool
82
-    {
83
-        $di = new RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
84
-        return iterator_count($di) === 0;
85
-    }
29
+		$this->filesystem = new Filesystem(new Local($workingDir));
30
+	}
31
+
32
+	/**
33
+	 * Maybe delete the source files that were copied (depending on config),
34
+	 * then delete empty directories.
35
+	 *
36
+	 * @param array $sourceFiles
37
+	 */
38
+	public function cleanup(array $sourceFiles)
39
+	{
40
+
41
+		// TODO Don't do this if vendor is the target dir (i.e. in-situ updating).
42
+
43
+		if ($this->isDeleteVendorFiles) {
44
+			foreach ($sourceFiles as $sourceFile) {
45
+				$relativeFilepath = $this->vendorDirectory . $sourceFile;
46
+
47
+				$this->filesystem->delete($relativeFilepath);
48
+			}
49
+
50
+			// Get the root folders of the moved files.
51
+			$rootSourceDirectories = [];
52
+			foreach ($sourceFiles as $sourceFile) {
53
+				$arr = explode("/", $sourceFile, 2);
54
+				$dir = $arr[0];
55
+				$rootSourceDirectories[ $dir ] = $dir;
56
+			}
57
+			$rootSourceDirectories = array_keys($rootSourceDirectories);
58
+
59
+
60
+			$finder = new Finder();
61
+
62
+			foreach ($rootSourceDirectories as $rootSourceDirectory) {
63
+				if (!is_dir($rootSourceDirectory) || is_link($rootSourceDirectory)) {
64
+					continue;
65
+				}
66
+
67
+				$finder->directories()->path($rootSourceDirectory);
68
+
69
+				foreach ($finder as $directory) {
70
+					$metadata = $this->filesystem->getMetadata($directory);
71
+
72
+					if ($this->dirIsEmpty($directory)) {
73
+						$this->filesystem->deleteDir($directory);
74
+					}
75
+				}
76
+			}
77
+		}
78
+	}
79
+
80
+	// TODO: Use Symphony or Flysystem functions.
81
+	protected function dirIsEmpty(string $dir): bool
82
+	{
83
+		$di = new RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
84
+		return iterator_count($di) === 0;
85
+	}
86 86
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/FileEnumerator.php 1 patch
Indentation   +175 added lines, -175 removed lines patch added patch discarded remove patch
@@ -16,180 +16,180 @@
 block discarded – undo
16 16
 class FileEnumerator
17 17
 {
18 18
 
19
-    /**
20
-     * The only path variable with a leading slash.
21
-     * All directories in project end with a slash.
22
-     *
23
-     * @var string
24
-     */
25
-    protected string $workingDir;
26
-
27
-    /** @var ComposerPackage[] */
28
-    protected array $dependencies;
29
-
30
-    protected array $excludePackageNames = array();
31
-    protected array $excludeNamespaces = array();
32
-    protected array $excludeFilePatterns = array();
33
-
34
-    /** @var Filesystem */
35
-    protected Filesystem $filesystem;
36
-
37
-    /**
38
-     * Complete list of files specified in packages autoloaders.
39
-     *
40
-     * Relative filepaths as key, with their dependency as the value.
41
-     *
42
-     * Relative from vendor/
43
-     *
44
-     * @var array<string, ComposerPackage>
45
-     */
46
-    protected array $filesWithDependencies = [];
47
-
48
-    /**
49
-     * Record the files autolaoders for later use in building our own autoloader.
50
-     *
51
-     * @var array
52
-     */
53
-    protected array $filesAutoloaders = [];
54
-
55
-    /**
56
-     * Copier constructor.
57
-     * @param ComposerPackage[] $dependencies
58
-     * @param string $workingDir
59
-     */
60
-    public function __construct(
61
-        array $dependencies,
62
-        string $workingDir,
63
-        StraussConfig $config
64
-    ) {
65
-        $this->workingDir = $workingDir;
66
-
67
-        $this->dependencies = $dependencies;
68
-
69
-        $this->excludeNamespaces = $config->getExcludeNamespacesFromCopy();
70
-        $this->excludePackageNames = $config->getExcludePackagesFromCopy();
71
-        $this->excludeFilePatterns = $config->getExcludeFilePatternsFromCopy();
72
-
73
-        $this->filesystem = new Filesystem(new Local($this->workingDir));
74
-    }
75
-
76
-    /**
77
-     * Read the autoload keys of the dependencies and generate a list of the files referenced.
78
-     */
79
-    public function compileFileList()
80
-    {
81
-
82
-        // TODO: read 'vendor' from composer.json.
83
-        $prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR;
84
-
85
-        foreach ($this->dependencies as $dependency) {
86
-            if (in_array($dependency->getName(), $this->excludePackageNames)) {
87
-                continue;
88
-            }
89
-
90
-            $packagePath = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR
91
-                . $dependency->getPath() . DIRECTORY_SEPARATOR;
92
-
93
-            /**
94
-             * Where $dependency->autoload is ~
95
-             *
96
-             * [ "psr-4" => [ "BrianHenryIE\Strauss" => "src" ] ]
97
-             * Exclude "exclude-from-classmap"
98
-             * @see https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps
99
-             */
100
-            $autoloaders = array_filter($dependency->getAutoload(), function ($type) {
101
-                return 'exclude-from-classmap' !== $type;
102
-            }, ARRAY_FILTER_USE_KEY);
103
-
104
-            foreach ($autoloaders as $type => $value) {
105
-                // Might have to switch/case here.
106
-
107
-                if ('files' === $type) {
108
-                    $this->filesAutoloaders[$dependency->getPath()] = $value;
109
-                }
110
-
111
-                foreach ($value as $namespace => $namespace_relative_path) {
112
-                    if (!empty($namespace) && in_array($namespace, $this->excludeNamespaces)) {
113
-                        continue;
114
-                    }
115
-
116
-                    if (is_file($packagePath . $namespace_relative_path)) {
117
-                        //  $finder->files()->name($file)->in($source_path);
118
-
119
-                        $relativeFilepath = str_replace($prefixToRemove, '', $packagePath . $namespace_relative_path);
120
-                        $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
19
+	/**
20
+	 * The only path variable with a leading slash.
21
+	 * All directories in project end with a slash.
22
+	 *
23
+	 * @var string
24
+	 */
25
+	protected string $workingDir;
26
+
27
+	/** @var ComposerPackage[] */
28
+	protected array $dependencies;
29
+
30
+	protected array $excludePackageNames = array();
31
+	protected array $excludeNamespaces = array();
32
+	protected array $excludeFilePatterns = array();
33
+
34
+	/** @var Filesystem */
35
+	protected Filesystem $filesystem;
36
+
37
+	/**
38
+	 * Complete list of files specified in packages autoloaders.
39
+	 *
40
+	 * Relative filepaths as key, with their dependency as the value.
41
+	 *
42
+	 * Relative from vendor/
43
+	 *
44
+	 * @var array<string, ComposerPackage>
45
+	 */
46
+	protected array $filesWithDependencies = [];
47
+
48
+	/**
49
+	 * Record the files autolaoders for later use in building our own autoloader.
50
+	 *
51
+	 * @var array
52
+	 */
53
+	protected array $filesAutoloaders = [];
54
+
55
+	/**
56
+	 * Copier constructor.
57
+	 * @param ComposerPackage[] $dependencies
58
+	 * @param string $workingDir
59
+	 */
60
+	public function __construct(
61
+		array $dependencies,
62
+		string $workingDir,
63
+		StraussConfig $config
64
+	) {
65
+		$this->workingDir = $workingDir;
66
+
67
+		$this->dependencies = $dependencies;
68
+
69
+		$this->excludeNamespaces = $config->getExcludeNamespacesFromCopy();
70
+		$this->excludePackageNames = $config->getExcludePackagesFromCopy();
71
+		$this->excludeFilePatterns = $config->getExcludeFilePatternsFromCopy();
72
+
73
+		$this->filesystem = new Filesystem(new Local($this->workingDir));
74
+	}
75
+
76
+	/**
77
+	 * Read the autoload keys of the dependencies and generate a list of the files referenced.
78
+	 */
79
+	public function compileFileList()
80
+	{
81
+
82
+		// TODO: read 'vendor' from composer.json.
83
+		$prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR;
84
+
85
+		foreach ($this->dependencies as $dependency) {
86
+			if (in_array($dependency->getName(), $this->excludePackageNames)) {
87
+				continue;
88
+			}
89
+
90
+			$packagePath = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR
91
+				. $dependency->getPath() . DIRECTORY_SEPARATOR;
92
+
93
+			/**
94
+			 * Where $dependency->autoload is ~
95
+			 *
96
+			 * [ "psr-4" => [ "BrianHenryIE\Strauss" => "src" ] ]
97
+			 * Exclude "exclude-from-classmap"
98
+			 * @see https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps
99
+			 */
100
+			$autoloaders = array_filter($dependency->getAutoload(), function ($type) {
101
+				return 'exclude-from-classmap' !== $type;
102
+			}, ARRAY_FILTER_USE_KEY);
103
+
104
+			foreach ($autoloaders as $type => $value) {
105
+				// Might have to switch/case here.
106
+
107
+				if ('files' === $type) {
108
+					$this->filesAutoloaders[$dependency->getPath()] = $value;
109
+				}
110
+
111
+				foreach ($value as $namespace => $namespace_relative_path) {
112
+					if (!empty($namespace) && in_array($namespace, $this->excludeNamespaces)) {
113
+						continue;
114
+					}
115
+
116
+					if (is_file($packagePath . $namespace_relative_path)) {
117
+						//  $finder->files()->name($file)->in($source_path);
118
+
119
+						$relativeFilepath = str_replace($prefixToRemove, '', $packagePath . $namespace_relative_path);
120
+						$relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
121 121
                         
122
-                        $this->filesWithDependencies[$relativeFilepath] = $dependency;
123
-
124
-                        continue;
125
-                    }
126
-
127
-                    // else it is a directory.
128
-
129
-                    // trailingslashit().
130
-                    $namespace_relative_path = rtrim($namespace_relative_path, DIRECTORY_SEPARATOR)
131
-                        . DIRECTORY_SEPARATOR;
132
-
133
-                    $sourcePath = $packagePath . $namespace_relative_path;
134
-
135
-                    // trailingslashit(). (to remove duplicates).
136
-                    $sourcePath = rtrim($sourcePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
137
-
138
-                    $finder = new Finder();
139
-                    $finder->files()->in($sourcePath)->followLinks();
140
-
141
-                    foreach ($finder as $foundFile) {
142
-                        $filePath = $foundFile->getPathname();
143
-
144
-                        $relativeFilepath = str_replace($prefixToRemove, '', $filePath);
145
-
146
-                        // TODO: Is this needed here?! If anything, it's the prefix that needs to be normalised a few
147
-                        // lines above before being used.
148
-                        // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR.
149
-                        $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
150
-
151
-                        foreach ($this->excludeFilePatterns as $excludePattern) {
152
-                            if (1 === preg_match($excludePattern, $relativeFilepath)) {
153
-                                continue 2;
154
-                            }
155
-                        }
156
-
157
-                        $this->filesWithDependencies[$relativeFilepath] = $dependency;
158
-                    }
159
-                }
160
-            }
161
-        }
162
-    }
163
-
164
-    /**
165
-     * Returns all found files.
166
-     *
167
-     * @return array<string, ComposerPackage>
168
-     */
169
-    public function getAllFilesAndDependencyList(): array
170
-    {
171
-        return $this->filesWithDependencies;
172
-    }
173
-
174
-    /**
175
-     * Returns found PHP files.
176
-     *
177
-     * @return array<string, ComposerPackage>
178
-     */
179
-    public function getPhpFilesAndDependencyList(): array
180
-    {
181
-        return array_filter($this->filesWithDependencies, function ($value, $key) {
182
-            return false !== strpos($key, '.php');
183
-        }, ARRAY_FILTER_USE_BOTH);
184
-    }
185
-
186
-    /**
187
-     * Get the recorded files autoloaders.
188
-     *
189
-     * @return array<string, array<string>>
190
-     */
191
-    public function getFilesAutoloaders(): array
192
-    {
193
-        return $this->filesAutoloaders;
194
-    }
122
+						$this->filesWithDependencies[$relativeFilepath] = $dependency;
123
+
124
+						continue;
125
+					}
126
+
127
+					// else it is a directory.
128
+
129
+					// trailingslashit().
130
+					$namespace_relative_path = rtrim($namespace_relative_path, DIRECTORY_SEPARATOR)
131
+						. DIRECTORY_SEPARATOR;
132
+
133
+					$sourcePath = $packagePath . $namespace_relative_path;
134
+
135
+					// trailingslashit(). (to remove duplicates).
136
+					$sourcePath = rtrim($sourcePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
137
+
138
+					$finder = new Finder();
139
+					$finder->files()->in($sourcePath)->followLinks();
140
+
141
+					foreach ($finder as $foundFile) {
142
+						$filePath = $foundFile->getPathname();
143
+
144
+						$relativeFilepath = str_replace($prefixToRemove, '', $filePath);
145
+
146
+						// TODO: Is this needed here?! If anything, it's the prefix that needs to be normalised a few
147
+						// lines above before being used.
148
+						// Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR.
149
+						$relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
150
+
151
+						foreach ($this->excludeFilePatterns as $excludePattern) {
152
+							if (1 === preg_match($excludePattern, $relativeFilepath)) {
153
+								continue 2;
154
+							}
155
+						}
156
+
157
+						$this->filesWithDependencies[$relativeFilepath] = $dependency;
158
+					}
159
+				}
160
+			}
161
+		}
162
+	}
163
+
164
+	/**
165
+	 * Returns all found files.
166
+	 *
167
+	 * @return array<string, ComposerPackage>
168
+	 */
169
+	public function getAllFilesAndDependencyList(): array
170
+	{
171
+		return $this->filesWithDependencies;
172
+	}
173
+
174
+	/**
175
+	 * Returns found PHP files.
176
+	 *
177
+	 * @return array<string, ComposerPackage>
178
+	 */
179
+	public function getPhpFilesAndDependencyList(): array
180
+	{
181
+		return array_filter($this->filesWithDependencies, function ($value, $key) {
182
+			return false !== strpos($key, '.php');
183
+		}, ARRAY_FILTER_USE_BOTH);
184
+	}
185
+
186
+	/**
187
+	 * Get the recorded files autoloaders.
188
+	 *
189
+	 * @return array<string, array<string>>
190
+	 */
191
+	public function getFilesAutoloaders(): array
192
+	{
193
+		return $this->filesAutoloaders;
194
+	}
195 195
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/Licenser.php 1 patch
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -25,170 +25,170 @@  discard block
 block discarded – undo
25 25
 class Licenser
26 26
 {
27 27
 
28
-    protected string $workingDir;
28
+	protected string $workingDir;
29 29
 
30
-    protected array $dependencies;
30
+	protected array $dependencies;
31 31
 
32
-    // The author of the current project who is running Strauss to make the changes to the required libraries.
33
-    protected string $author;
32
+	// The author of the current project who is running Strauss to make the changes to the required libraries.
33
+	protected string $author;
34 34
 
35
-    protected string $targetDirectory;
35
+	protected string $targetDirectory;
36 36
 
37
-    /**
38
-     * An array of files relative to the project vendor folder.
39
-     *
40
-     * @var string[]
41
-     */
42
-    protected array $discoveredLicenseFiles = array();
37
+	/**
38
+	 * An array of files relative to the project vendor folder.
39
+	 *
40
+	 * @var string[]
41
+	 */
42
+	protected array $discoveredLicenseFiles = array();
43 43
 
44
-    /** @var Filesystem */
45
-    protected $filesystem;
44
+	/** @var Filesystem */
45
+	protected $filesystem;
46 46
 
47 47
 
48
-    /**
49
-     * Licenser constructor.
50
-     * @param string $workingDir
51
-     * @param array $dependencies Whose folders are searched for existing license.txt files.
52
-     * @param string $author To add to each modified file's header
53
-     */
54
-    public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author)
55
-    {
56
-        $this->workingDir = $workingDir;
57
-        $this->dependencies = $dependencies;
58
-        $this->author = $author;
48
+	/**
49
+	 * Licenser constructor.
50
+	 * @param string $workingDir
51
+	 * @param array $dependencies Whose folders are searched for existing license.txt files.
52
+	 * @param string $author To add to each modified file's header
53
+	 */
54
+	public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author)
55
+	{
56
+		$this->workingDir = $workingDir;
57
+		$this->dependencies = $dependencies;
58
+		$this->author = $author;
59 59
 
60
-        $this->targetDirectory = $config->getTargetDirectory();
60
+		$this->targetDirectory = $config->getTargetDirectory();
61 61
 
62
-        $this->filesystem = new Filesystem(new Local($workingDir));
63
-    }
62
+		$this->filesystem = new Filesystem(new Local($workingDir));
63
+	}
64 64
 
65
-    public function copyLicenses(): void
66
-    {
67
-        $this->findLicenseFiles();
68
-
69
-        foreach ($this->getDiscoveredLicenseFiles() as $licenseFile) {
70
-            $targetLicenseFile = $this->targetDirectory . $licenseFile;
71
-
72
-            $targetLicenseFileDir = dirname($targetLicenseFile);
73
-
74
-            // Don't try copy it if it's already there.
75
-            if ($this->filesystem->has($targetLicenseFile)) {
76
-                continue;
77
-            }
78
-
79
-            // Don't add licenses to non-existent directories – there were no files copied there!
80
-            if (! $this->filesystem->has($targetLicenseFileDir)) {
81
-                continue;
82
-            }
83
-
84
-            $this->filesystem->copy(
85
-                'vendor' . DIRECTORY_SEPARATOR . $licenseFile,
86
-                $targetLicenseFile
87
-            );
88
-        }
89
-    }
90
-
91
-
92
-    /**
93
-     * @see https://www.phpliveregex.com/p/A5y
94
-     */
95
-    public function findLicenseFiles(?Finder $finder = null)
96
-    {
97
-
98
-        // Include all license files in the dependency path.
99
-        $finder = $finder ?? new Finder();
100
-
101
-        // TODO: read 'vendor' from composer.json.
102
-        $prefixToRemove = 'vendor' . DIRECTORY_SEPARATOR;
103
-
104
-        /** @var ComposerPackage $dependency */
105
-        foreach ($this->dependencies as $dependency) {
106
-            $packagePath = 'vendor' . DIRECTORY_SEPARATOR . $dependency->getPath();
107
-
108
-            // If packages happen to have their vendor dir, i.e. locally required packages, don't included the licenses
109
-            // from their vendor dir (they should be included otherwise anyway).
110
-            // $dependency->getVendorDir()
111
-            $finder->files()->in($packagePath)->followLinks()->exclude(array( 'vendor' ))->name('/^.*licen.e.*/i');
112
-
113
-            /** @var \SplFileInfo $foundFile */
114
-            foreach ($finder as $foundFile) {
115
-                $filePath = $foundFile->getPathname();
116
-
117
-                $relativeFilepath = str_replace($prefixToRemove, '', $filePath);
118
-
119
-                // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR.
120
-                $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
121
-
122
-                $this->discoveredLicenseFiles[$relativeFilepath] = $dependency->getName();
123
-            }
124
-        }
125
-    }
126
-
127
-    public function getDiscoveredLicenseFiles(): array
128
-    {
129
-        return array_keys($this->discoveredLicenseFiles);
130
-    }
131
-
132
-    /**
133
-     * @param array<string, ComposerPackage> $modifiedFiles
134
-     */
135
-    public function addInformationToUpdatedFiles(array $modifiedFiles)
136
-    {
137
-
138
-        // e.g. "25-April-2021".
139
-        $date = gmdate("d-F-Y", time());
140
-
141
-        foreach ($modifiedFiles as $relativeFilePath => $package) {
142
-            $filepath = $this->targetDirectory . $relativeFilePath;
143
-
144
-            $packageLicense = $package->getLicense();
145
-
146
-            // Throws an exception, but unlikely to happen.
147
-            $contents = $this->filesystem->read($filepath);
148
-
149
-            $updatedContents = $this->addChangeDeclarationToPhpString($contents, $date, $packageLicense);
150
-
151
-            if ($updatedContents !== $contents) {
152
-                $this->filesystem->put($filepath, $updatedContents);
153
-            }
154
-        }
155
-    }
156
-
157
-    /**
158
-     * Given a php file as a string, edit it's header phpdoc, or add a header, to include:
159
-     *
160
-     * "Modified by {author} on {date} using Strauss.
161
-     * @see https://github.com/BrianHenryIE/strauss"
162
-     *
163
-     * Should probably include the original license in each file since it'll often be a mix, with the parent
164
-     * project often being a GPL WordPress plugin.
165
-     *
166
-     * Find the string between the end of php-opener and the first valid code.
167
-     * First valid code will be a line whose first non-whitespace character is not / or * ?... NO!
168
-     * If the first non whitespace string after php-opener is multiline-comment-opener, find the
169
-     * closing multiline-comment-closer
170
-     * / If there's already a comment, work within that comment
171
-     * If there is no mention in the header of the license already, add it.
172
-     * Add a note that changes have been made.
173
-     *
174
-     * @param string $phpString Code.
175
-     */
176
-    public function addChangeDeclarationToPhpString(
177
-        string $phpString,
178
-        string $modifiedDate,
179
-        string $packageLicense
180
-    ) : string {
181
-
182
-        $author = $this->author;
183
-
184
-        $licenseDeclaration = "@license {$packageLicense}";
185
-        $modifiedDeclaration = "Modified by {$author} on {$modifiedDate} using Strauss.";
186
-        $straussLink = "@see https://github.com/BrianHenryIE/strauss";
187
-
188
-        // php-open followed by some whitespace and new line until the first ...
189
-        $noCommentBetweenPhpOpenAndFirstCodePattern = '~<\?php[\s\n]*[\w\\\?]+~';
190
-
191
-        $multilineCommentCapturePattern = '
65
+	public function copyLicenses(): void
66
+	{
67
+		$this->findLicenseFiles();
68
+
69
+		foreach ($this->getDiscoveredLicenseFiles() as $licenseFile) {
70
+			$targetLicenseFile = $this->targetDirectory . $licenseFile;
71
+
72
+			$targetLicenseFileDir = dirname($targetLicenseFile);
73
+
74
+			// Don't try copy it if it's already there.
75
+			if ($this->filesystem->has($targetLicenseFile)) {
76
+				continue;
77
+			}
78
+
79
+			// Don't add licenses to non-existent directories – there were no files copied there!
80
+			if (! $this->filesystem->has($targetLicenseFileDir)) {
81
+				continue;
82
+			}
83
+
84
+			$this->filesystem->copy(
85
+				'vendor' . DIRECTORY_SEPARATOR . $licenseFile,
86
+				$targetLicenseFile
87
+			);
88
+		}
89
+	}
90
+
91
+
92
+	/**
93
+	 * @see https://www.phpliveregex.com/p/A5y
94
+	 */
95
+	public function findLicenseFiles(?Finder $finder = null)
96
+	{
97
+
98
+		// Include all license files in the dependency path.
99
+		$finder = $finder ?? new Finder();
100
+
101
+		// TODO: read 'vendor' from composer.json.
102
+		$prefixToRemove = 'vendor' . DIRECTORY_SEPARATOR;
103
+
104
+		/** @var ComposerPackage $dependency */
105
+		foreach ($this->dependencies as $dependency) {
106
+			$packagePath = 'vendor' . DIRECTORY_SEPARATOR . $dependency->getPath();
107
+
108
+			// If packages happen to have their vendor dir, i.e. locally required packages, don't included the licenses
109
+			// from their vendor dir (they should be included otherwise anyway).
110
+			// $dependency->getVendorDir()
111
+			$finder->files()->in($packagePath)->followLinks()->exclude(array( 'vendor' ))->name('/^.*licen.e.*/i');
112
+
113
+			/** @var \SplFileInfo $foundFile */
114
+			foreach ($finder as $foundFile) {
115
+				$filePath = $foundFile->getPathname();
116
+
117
+				$relativeFilepath = str_replace($prefixToRemove, '', $filePath);
118
+
119
+				// Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR.
120
+				$relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath);
121
+
122
+				$this->discoveredLicenseFiles[$relativeFilepath] = $dependency->getName();
123
+			}
124
+		}
125
+	}
126
+
127
+	public function getDiscoveredLicenseFiles(): array
128
+	{
129
+		return array_keys($this->discoveredLicenseFiles);
130
+	}
131
+
132
+	/**
133
+	 * @param array<string, ComposerPackage> $modifiedFiles
134
+	 */
135
+	public function addInformationToUpdatedFiles(array $modifiedFiles)
136
+	{
137
+
138
+		// e.g. "25-April-2021".
139
+		$date = gmdate("d-F-Y", time());
140
+
141
+		foreach ($modifiedFiles as $relativeFilePath => $package) {
142
+			$filepath = $this->targetDirectory . $relativeFilePath;
143
+
144
+			$packageLicense = $package->getLicense();
145
+
146
+			// Throws an exception, but unlikely to happen.
147
+			$contents = $this->filesystem->read($filepath);
148
+
149
+			$updatedContents = $this->addChangeDeclarationToPhpString($contents, $date, $packageLicense);
150
+
151
+			if ($updatedContents !== $contents) {
152
+				$this->filesystem->put($filepath, $updatedContents);
153
+			}
154
+		}
155
+	}
156
+
157
+	/**
158
+	 * Given a php file as a string, edit it's header phpdoc, or add a header, to include:
159
+	 *
160
+	 * "Modified by {author} on {date} using Strauss.
161
+	 * @see https://github.com/BrianHenryIE/strauss"
162
+	 *
163
+	 * Should probably include the original license in each file since it'll often be a mix, with the parent
164
+	 * project often being a GPL WordPress plugin.
165
+	 *
166
+	 * Find the string between the end of php-opener and the first valid code.
167
+	 * First valid code will be a line whose first non-whitespace character is not / or * ?... NO!
168
+	 * If the first non whitespace string after php-opener is multiline-comment-opener, find the
169
+	 * closing multiline-comment-closer
170
+	 * / If there's already a comment, work within that comment
171
+	 * If there is no mention in the header of the license already, add it.
172
+	 * Add a note that changes have been made.
173
+	 *
174
+	 * @param string $phpString Code.
175
+	 */
176
+	public function addChangeDeclarationToPhpString(
177
+		string $phpString,
178
+		string $modifiedDate,
179
+		string $packageLicense
180
+	) : string {
181
+
182
+		$author = $this->author;
183
+
184
+		$licenseDeclaration = "@license {$packageLicense}";
185
+		$modifiedDeclaration = "Modified by {$author} on {$modifiedDate} using Strauss.";
186
+		$straussLink = "@see https://github.com/BrianHenryIE/strauss";
187
+
188
+		// php-open followed by some whitespace and new line until the first ...
189
+		$noCommentBetweenPhpOpenAndFirstCodePattern = '~<\?php[\s\n]*[\w\\\?]+~';
190
+
191
+		$multilineCommentCapturePattern = '
192 192
             ~                        # Start the pattern
193 193
             (
194 194
             <\?php[\S\s]*            #  match the beginning of the files php-open and following whitespace
@@ -202,51 +202,51 @@  discard block
 block discarded – undo
202 202
             ~Ux';                          // U: Non-greedy matching, x: ignore whitespace in pattern.
203 203
 
204 204
 
205
-        $replaceInMultilineCommentFunction = function ($matches) use (
206
-            $licenseDeclaration,
207
-            $modifiedDeclaration,
208
-            $straussLink
209
-        ) {
205
+		$replaceInMultilineCommentFunction = function ($matches) use (
206
+			$licenseDeclaration,
207
+			$modifiedDeclaration,
208
+			$straussLink
209
+		) {
210 210
 
211
-            // Find the line prefix and use it, i.e. could be none, asterisk or space-asterisk.
212
-            $commentLines = explode("\n", $matches[2]);
211
+			// Find the line prefix and use it, i.e. could be none, asterisk or space-asterisk.
212
+			$commentLines = explode("\n", $matches[2]);
213 213
 
214
-            if (isset($commentLines[1])&& 1 === preg_match('/^([\s\\\*]*)/', $commentLines[1], $output_array)) {
215
-                $lineStart = $output_array[1];
216
-            } else {
217
-                $lineStart = ' * ';
218
-            }
214
+			if (isset($commentLines[1])&& 1 === preg_match('/^([\s\\\*]*)/', $commentLines[1], $output_array)) {
215
+				$lineStart = $output_array[1];
216
+			} else {
217
+				$lineStart = ' * ';
218
+			}
219 219
 
220
-            $appendString = "*\n";
220
+			$appendString = "*\n";
221 221
 
222
-            // If the license is not already specified in the header, add it.
223
-            if (false === strpos($matches[2], 'licen')) {
224
-                $appendString .= "{$lineStart}{$licenseDeclaration}\n";
225
-            }
222
+			// If the license is not already specified in the header, add it.
223
+			if (false === strpos($matches[2], 'licen')) {
224
+				$appendString .= "{$lineStart}{$licenseDeclaration}\n";
225
+			}
226 226
 
227
-            $appendString .= "{$lineStart}{$modifiedDeclaration}\n";
228
-            $appendString .= "{$lineStart}{$straussLink}\n";
227
+			$appendString .= "{$lineStart}{$modifiedDeclaration}\n";
228
+			$appendString .= "{$lineStart}{$straussLink}\n";
229 229
 
230
-            $commentEnd =  rtrim(rtrim($lineStart, ' '), '*').'*/';
230
+			$commentEnd =  rtrim(rtrim($lineStart, ' '), '*').'*/';
231 231
 
232
-            $replaceWith = $matches[1] . $matches[2] . $appendString . $commentEnd;
232
+			$replaceWith = $matches[1] . $matches[2] . $appendString . $commentEnd;
233 233
 
234
-            return $replaceWith;
235
-        };
234
+			return $replaceWith;
235
+		};
236 236
 
237
-        // If it's a simple case where there is no existing header, add the existing license.
238
-        if (1 === preg_match($noCommentBetweenPhpOpenAndFirstCodePattern, $phpString)) {
239
-            $modifiedComment = "/**\n * {$licenseDeclaration}\n *\n * {$modifiedDeclaration}\n * {$straussLink}\n */";
240
-            $updatedPhpString = preg_replace('~<\?php~', "<?php\n". $modifiedComment, $phpString, 1);
241
-        } else {
242
-            $updatedPhpString = preg_replace_callback(
243
-                $multilineCommentCapturePattern,
244
-                $replaceInMultilineCommentFunction,
245
-                $phpString,
246
-                1
247
-            );
248
-        }
237
+		// If it's a simple case where there is no existing header, add the existing license.
238
+		if (1 === preg_match($noCommentBetweenPhpOpenAndFirstCodePattern, $phpString)) {
239
+			$modifiedComment = "/**\n * {$licenseDeclaration}\n *\n * {$modifiedDeclaration}\n * {$straussLink}\n */";
240
+			$updatedPhpString = preg_replace('~<\?php~', "<?php\n". $modifiedComment, $phpString, 1);
241
+		} else {
242
+			$updatedPhpString = preg_replace_callback(
243
+				$multilineCommentCapturePattern,
244
+				$replaceInMultilineCommentFunction,
245
+				$phpString,
246
+				1
247
+			);
248
+		}
249 249
 
250
-        return $updatedPhpString;
251
-    }
250
+		return $updatedPhpString;
251
+	}
252 252
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/Prefixer.php 1 patch
Indentation   +225 added lines, -225 removed lines patch added patch discarded remove patch
@@ -11,118 +11,118 @@  discard block
 block discarded – undo
11 11
 
12 12
 class Prefixer
13 13
 {
14
-    /** @var StraussConfig */
15
-    protected $config;
16
-
17
-    /** @var Filesystem */
18
-    protected $filesystem;
19
-
20
-    protected string $targetDirectory;
21
-    protected string $namespacePrefix;
22
-    protected string $classmapPrefix;
23
-
24
-    protected array $excludePackageNamesFromPrefixing;
25
-    protected array $excludeNamespacesFromPrefixing;
26
-    protected array $excludeFilePatternsFromPrefixing;
27
-
28
-    /** @var array<string, ComposerPackage> */
29
-    protected array $changedFiles = array();
30
-
31
-    public function __construct(StraussConfig $config, string $workingDir)
32
-    {
33
-        $this->filesystem = new Filesystem(new Local($workingDir));
34
-
35
-        $this->targetDirectory = $config->getTargetDirectory();
36
-        $this->namespacePrefix = $config->getNamespacePrefix();
37
-        $this->classmapPrefix = $config->getClassmapPrefix();
38
-
39
-        $this->excludePackageNamesFromPrefixing = $config->getExcludePackagesFromPrefixing();
40
-        $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing();
41
-        $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing();
42
-    }
43
-
44
-    // Don't replace a classname if there's an import for a class with the same name.
45
-    // but do replace \Classname always
46
-
47
-
48
-    /**
49
-     * @param array<string, string> $namespaceChanges
50
-     * @param array<string, string> $classChanges
51
-     * @param array<string, ComposerPackage> $phpFileList
52
-     * @throws FileNotFoundException
53
-     */
54
-    public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList)
55
-    {
56
-
57
-        foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) {
58
-            // Skip excluded namespaces.
59
-            if (in_array($package->getName(), $this->excludePackageNamesFromPrefixing)) {
60
-                continue;
61
-            }
62
-
63
-            // Skip files whose filepath matches an excluded pattern.
64
-            foreach ($this->excludeFilePatternsFromPrefixing as $excludePattern) {
65
-                if (1 === preg_match($excludePattern, $sourceRelativeFilePathFromVendor)) {
66
-                    continue 2;
67
-                }
68
-            }
69
-
70
-            $targetRelativeFilepathFromProject =
71
-                $this->targetDirectory. $sourceRelativeFilePathFromVendor;
72
-
73
-            // Throws an exception, but unlikely to happen.
74
-            $contents = $this->filesystem->read($targetRelativeFilepathFromProject);
75
-
76
-            $updatedContents = $this->replaceInString($namespaceChanges, $classChanges, $contents);
77
-
78
-            if ($updatedContents !== $contents) {
79
-                $this->changedFiles[$sourceRelativeFilePathFromVendor] = $package;
80
-                $this->filesystem->put($targetRelativeFilepathFromProject, $updatedContents);
81
-            }
82
-        }
83
-    }
84
-
85
-    public function replaceInString(array $namespacesChanges, array $classes, string $contents): string
86
-    {
87
-
88
-        foreach ($namespacesChanges as $originalNamespace => $replacement) {
89
-            if (in_array($originalNamespace, $this->excludeNamespacesFromPrefixing)) {
90
-                continue;
91
-            }
92
-
93
-            $contents = $this->replaceNamespace($contents, $originalNamespace, $replacement);
94
-        }
95
-
96
-        foreach ($classes as $originalClassname) {
97
-            $classmapPrefix = $this->classmapPrefix;
98
-
99
-            $contents = $this->replaceClassname($contents, $originalClassname, $classmapPrefix);
100
-        }
101
-
102
-        return $contents;
103
-    }
104
-
105
-    /**
106
-     * TODO: Test against traits.
107
-     *
108
-     * @param string $contents The text to make replacements in.
109
-     *
110
-     * @return string The updated text.
111
-     */
112
-    public function replaceNamespace($contents, $originalNamespace, $replacement)
113
-    {
114
-
115
-        // When namespaces exist inside strings...
116
-        $searchNamespace =
117
-            preg_quote($originalNamespace, '/')
118
-            . '|'
119
-            . preg_quote(str_replace('\\', '\\\\', $originalNamespace), '/')
120
-            . '|'
121
-            . preg_quote('\\' . $originalNamespace, '/')
122
-            . '|'
123
-            . preg_quote('\\\\' . str_replace('\\', '\\\\', $originalNamespace), '/');
124
-
125
-        $pattern = "
14
+	/** @var StraussConfig */
15
+	protected $config;
16
+
17
+	/** @var Filesystem */
18
+	protected $filesystem;
19
+
20
+	protected string $targetDirectory;
21
+	protected string $namespacePrefix;
22
+	protected string $classmapPrefix;
23
+
24
+	protected array $excludePackageNamesFromPrefixing;
25
+	protected array $excludeNamespacesFromPrefixing;
26
+	protected array $excludeFilePatternsFromPrefixing;
27
+
28
+	/** @var array<string, ComposerPackage> */
29
+	protected array $changedFiles = array();
30
+
31
+	public function __construct(StraussConfig $config, string $workingDir)
32
+	{
33
+		$this->filesystem = new Filesystem(new Local($workingDir));
34
+
35
+		$this->targetDirectory = $config->getTargetDirectory();
36
+		$this->namespacePrefix = $config->getNamespacePrefix();
37
+		$this->classmapPrefix = $config->getClassmapPrefix();
38
+
39
+		$this->excludePackageNamesFromPrefixing = $config->getExcludePackagesFromPrefixing();
40
+		$this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing();
41
+		$this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing();
42
+	}
43
+
44
+	// Don't replace a classname if there's an import for a class with the same name.
45
+	// but do replace \Classname always
46
+
47
+
48
+	/**
49
+	 * @param array<string, string> $namespaceChanges
50
+	 * @param array<string, string> $classChanges
51
+	 * @param array<string, ComposerPackage> $phpFileList
52
+	 * @throws FileNotFoundException
53
+	 */
54
+	public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList)
55
+	{
56
+
57
+		foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) {
58
+			// Skip excluded namespaces.
59
+			if (in_array($package->getName(), $this->excludePackageNamesFromPrefixing)) {
60
+				continue;
61
+			}
62
+
63
+			// Skip files whose filepath matches an excluded pattern.
64
+			foreach ($this->excludeFilePatternsFromPrefixing as $excludePattern) {
65
+				if (1 === preg_match($excludePattern, $sourceRelativeFilePathFromVendor)) {
66
+					continue 2;
67
+				}
68
+			}
69
+
70
+			$targetRelativeFilepathFromProject =
71
+				$this->targetDirectory. $sourceRelativeFilePathFromVendor;
72
+
73
+			// Throws an exception, but unlikely to happen.
74
+			$contents = $this->filesystem->read($targetRelativeFilepathFromProject);
75
+
76
+			$updatedContents = $this->replaceInString($namespaceChanges, $classChanges, $contents);
77
+
78
+			if ($updatedContents !== $contents) {
79
+				$this->changedFiles[$sourceRelativeFilePathFromVendor] = $package;
80
+				$this->filesystem->put($targetRelativeFilepathFromProject, $updatedContents);
81
+			}
82
+		}
83
+	}
84
+
85
+	public function replaceInString(array $namespacesChanges, array $classes, string $contents): string
86
+	{
87
+
88
+		foreach ($namespacesChanges as $originalNamespace => $replacement) {
89
+			if (in_array($originalNamespace, $this->excludeNamespacesFromPrefixing)) {
90
+				continue;
91
+			}
92
+
93
+			$contents = $this->replaceNamespace($contents, $originalNamespace, $replacement);
94
+		}
95
+
96
+		foreach ($classes as $originalClassname) {
97
+			$classmapPrefix = $this->classmapPrefix;
98
+
99
+			$contents = $this->replaceClassname($contents, $originalClassname, $classmapPrefix);
100
+		}
101
+
102
+		return $contents;
103
+	}
104
+
105
+	/**
106
+	 * TODO: Test against traits.
107
+	 *
108
+	 * @param string $contents The text to make replacements in.
109
+	 *
110
+	 * @return string The updated text.
111
+	 */
112
+	public function replaceNamespace($contents, $originalNamespace, $replacement)
113
+	{
114
+
115
+		// When namespaces exist inside strings...
116
+		$searchNamespace =
117
+			preg_quote($originalNamespace, '/')
118
+			. '|'
119
+			. preg_quote(str_replace('\\', '\\\\', $originalNamespace), '/')
120
+			. '|'
121
+			. preg_quote('\\' . $originalNamespace, '/')
122
+			. '|'
123
+			. preg_quote('\\\\' . str_replace('\\', '\\\\', $originalNamespace), '/');
124
+
125
+		$pattern = "
126 126
             /                              # Start the pattern
127 127
             (
128 128
             ^\s*                           # start of the line
@@ -156,62 +156,62 @@  discard block
 block discarded – undo
156 156
             )                            
157 157
             /Ux";                          // U: Non-greedy matching, x: ignore whitespace in pattern.
158 158
 
159
-        $replacingFunction = function ($matches) use ($originalNamespace, $replacement) {
160
-
161
-            $singleBackslash = '\\\\';
162
-            $doubleBackslash = '\\\\\\\\';
163
-            $originalNamespacePattern = str_replace('\\', '\\\\+', $originalNamespace);
164
-            $beginsSingleBackslashPattern = "#{$singleBackslash}{$originalNamespacePattern}#";
165
-            $beginsDoubleBackslashPattern = "#{$doubleBackslash}{$originalNamespacePattern}#";
166
-            $containsDoubleBackslashPattern = "#{$doubleBackslash}#";
167
-
168
-            // Namespace begins with \\.
169
-            if (preg_match($beginsDoubleBackslashPattern, $matches[2])) {
170
-                $replacement = str_replace("\\", "\\\\", $replacement);
171
-                $replacement = "\\\\" . $replacement;
172
-            } elseif (preg_match($beginsSingleBackslashPattern, $matches[2])) {
173
-                $replacement = "\\" . $replacement;
174
-            } elseif (preg_match($containsDoubleBackslashPattern, $matches[2])) {
175
-                $replacement = str_replace("\\", "\\\\", $replacement);
176
-            }
177
-
178
-            return $matches[1] . $replacement . $matches[3];
179
-        };
180
-
181
-        $result = preg_replace_callback($pattern, $replacingFunction, $contents);
182
-
183
-        $matchingError = preg_last_error();
184
-        if (0 !== $matchingError) {
185
-            $message = "Matching error {$matchingError}";
186
-            if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) {
187
-                $message = 'Preg Backtrack limit was exhausted!';
188
-            }
189
-            throw new Exception($message);
190
-        }
191
-
192
-        return $result;
193
-    }
194
-
195
-    /**
196
-     * In a namespace:
197
-     * * use \Classname;
198
-     * * new \Classname()
199
-     *
200
-     * In a global namespace:
201
-     * * new Classname()
202
-     *
203
-     * @param string $contents
204
-     * @param string $originalClassname
205
-     * @param string $classnamePrefix
206
-     * @return array|string|string[]|null
207
-     * @throws \Exception
208
-     */
209
-    public function replaceClassname($contents, $originalClassname, $classnamePrefix)
210
-    {
211
-        $searchClassname = preg_quote($originalClassname, '/');
212
-
213
-        // This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...).
214
-        $pattern = '
159
+		$replacingFunction = function ($matches) use ($originalNamespace, $replacement) {
160
+
161
+			$singleBackslash = '\\\\';
162
+			$doubleBackslash = '\\\\\\\\';
163
+			$originalNamespacePattern = str_replace('\\', '\\\\+', $originalNamespace);
164
+			$beginsSingleBackslashPattern = "#{$singleBackslash}{$originalNamespacePattern}#";
165
+			$beginsDoubleBackslashPattern = "#{$doubleBackslash}{$originalNamespacePattern}#";
166
+			$containsDoubleBackslashPattern = "#{$doubleBackslash}#";
167
+
168
+			// Namespace begins with \\.
169
+			if (preg_match($beginsDoubleBackslashPattern, $matches[2])) {
170
+				$replacement = str_replace("\\", "\\\\", $replacement);
171
+				$replacement = "\\\\" . $replacement;
172
+			} elseif (preg_match($beginsSingleBackslashPattern, $matches[2])) {
173
+				$replacement = "\\" . $replacement;
174
+			} elseif (preg_match($containsDoubleBackslashPattern, $matches[2])) {
175
+				$replacement = str_replace("\\", "\\\\", $replacement);
176
+			}
177
+
178
+			return $matches[1] . $replacement . $matches[3];
179
+		};
180
+
181
+		$result = preg_replace_callback($pattern, $replacingFunction, $contents);
182
+
183
+		$matchingError = preg_last_error();
184
+		if (0 !== $matchingError) {
185
+			$message = "Matching error {$matchingError}";
186
+			if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) {
187
+				$message = 'Preg Backtrack limit was exhausted!';
188
+			}
189
+			throw new Exception($message);
190
+		}
191
+
192
+		return $result;
193
+	}
194
+
195
+	/**
196
+	 * In a namespace:
197
+	 * * use \Classname;
198
+	 * * new \Classname()
199
+	 *
200
+	 * In a global namespace:
201
+	 * * new Classname()
202
+	 *
203
+	 * @param string $contents
204
+	 * @param string $originalClassname
205
+	 * @param string $classnamePrefix
206
+	 * @return array|string|string[]|null
207
+	 * @throws \Exception
208
+	 */
209
+	public function replaceClassname($contents, $originalClassname, $classnamePrefix)
210
+	{
211
+		$searchClassname = preg_quote($originalClassname, '/');
212
+
213
+		// This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...).
214
+		$pattern = '
215 215
 			/											# Start the pattern
216 216
 				namespace\s+([a-zA-Z0-9_\x7f-\xff\\\\]+).*?{.*?(namespace|\z) 
217 217
 														# Look for a preceeding namespace declaration, up until a 
@@ -222,65 +222,65 @@  discard block
 block discarded – undo
222 222
 				
223 223
 			/x'; //                                     # x: ignore whitespace in regex.
224 224
 
225
-        $replacingFunction = function ($matches) use ($originalClassname, $classnamePrefix) {
226
-
227
-            // If we're inside a namespace other than the global namespace:
228
-            if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) {
229
-                $updated = $this->replaceGlobalClassInsideNamedNamespace(
230
-                    $matches[0],
231
-                    $originalClassname,
232
-                    $classnamePrefix
233
-                );
234
-
235
-                return $updated;
236
-            }
237
-
238
-            return $matches[1] . $matches[2] . $matches[3] . $classnamePrefix . $originalClassname . $matches[5];
239
-        };
240
-
241
-        $result = preg_replace_callback($pattern, $replacingFunction, $contents);
242
-
243
-        $matchingError = preg_last_error();
244
-        if (0 !== $matchingError) {
245
-            $message = "Matching error {$matchingError}";
246
-            if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) {
247
-                $message = 'Backtrack limit was exhausted!';
248
-            }
249
-            throw new Exception($message);
250
-        }
251
-
252
-        return $result;
253
-    }
254
-
255
-    /**
256
-     * Pass in a string and look for \Classname instances.
257
-     *
258
-     * @param string $contents
259
-     * @param string $originalClassname
260
-     * @param string $classnamePrefix
261
-     * @return string
262
-     */
263
-    protected function replaceGlobalClassInsideNamedNamespace($contents, $originalClassname, $classnamePrefix): string
264
-    {
265
-
266
-        return preg_replace_callback(
267
-            '/([^a-zA-Z0-9_\x7f-\xff]  # Not a class character
225
+		$replacingFunction = function ($matches) use ($originalClassname, $classnamePrefix) {
226
+
227
+			// If we're inside a namespace other than the global namespace:
228
+			if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) {
229
+				$updated = $this->replaceGlobalClassInsideNamedNamespace(
230
+					$matches[0],
231
+					$originalClassname,
232
+					$classnamePrefix
233
+				);
234
+
235
+				return $updated;
236
+			}
237
+
238
+			return $matches[1] . $matches[2] . $matches[3] . $classnamePrefix . $originalClassname . $matches[5];
239
+		};
240
+
241
+		$result = preg_replace_callback($pattern, $replacingFunction, $contents);
242
+
243
+		$matchingError = preg_last_error();
244
+		if (0 !== $matchingError) {
245
+			$message = "Matching error {$matchingError}";
246
+			if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) {
247
+				$message = 'Backtrack limit was exhausted!';
248
+			}
249
+			throw new Exception($message);
250
+		}
251
+
252
+		return $result;
253
+	}
254
+
255
+	/**
256
+	 * Pass in a string and look for \Classname instances.
257
+	 *
258
+	 * @param string $contents
259
+	 * @param string $originalClassname
260
+	 * @param string $classnamePrefix
261
+	 * @return string
262
+	 */
263
+	protected function replaceGlobalClassInsideNamedNamespace($contents, $originalClassname, $classnamePrefix): string
264
+	{
265
+
266
+		return preg_replace_callback(
267
+			'/([^a-zA-Z0-9_\x7f-\xff]  # Not a class character
268 268
 			\\\)                       # Followed by a backslash to indicate global namespace
269 269
 			('.$originalClassname.')   # Followed by the classname
270 270
 			([^\\\;]+)                 # Not a backslash or semicolon which might indicate a namespace
271 271
 			/x', //                    # x: ignore whitespace in regex.
272
-            function ($matches) use ($originalClassname, $classnamePrefix) {
273
-                return $matches[1] . $classnamePrefix . $originalClassname . $matches[3];
274
-            },
275
-            $contents
276
-        );
277
-    }
278
-
279
-    /**
280
-     * @return array<string, ComposerPackage>
281
-     */
282
-    public function getModifiedFiles(): array
283
-    {
284
-        return $this->changedFiles;
285
-    }
272
+			function ($matches) use ($originalClassname, $classnamePrefix) {
273
+				return $matches[1] . $classnamePrefix . $originalClassname . $matches[3];
274
+			},
275
+			$contents
276
+		);
277
+	}
278
+
279
+	/**
280
+	 * @return array<string, ComposerPackage>
281
+	 */
282
+	public function getModifiedFiles(): array
283
+	{
284
+		return $this->changedFiles;
285
+	}
286 286
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/ChangeEnumerator.php 1 patch
Indentation   +155 added lines, -155 removed lines patch added patch discarded remove patch
@@ -13,128 +13,128 @@  discard block
 block discarded – undo
13 13
 class ChangeEnumerator
14 14
 {
15 15
 
16
-    protected string $namespacePrefix;
17
-    protected string $classmapPrefix;
18
-    /**
19
-     *
20
-     * @var string[]
21
-     */
22
-    protected array $excludePackagesFromPrefixing = array();
23
-    protected array $excludeNamespacesFromPrefixing = array();
24
-
25
-    protected array $excludeFilePatternsFromPrefixing = array();
26
-
27
-    protected array $namespaceReplacementPatterns = array();
28
-
29
-    /** @var string[] */
30
-    protected array $discoveredNamespaces = [];
31
-
32
-    /** @var string[] */
33
-    protected array $discoveredClasses = [];
34
-
35
-
36
-    /**
37
-     * ChangeEnumerator constructor.
38
-     * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config
39
-     */
40
-    public function __construct(StraussConfig $config)
41
-    {
42
-        $this->namespacePrefix = $config->getNamespacePrefix();
43
-        $this->classmapPrefix = $config->getClassmapPrefix();
44
-
45
-        $this->excludePackagesFromPrefixing = $config->getExcludePackagesFromPrefixing();
46
-        $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing();
47
-        $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing();
48
-
49
-        $this->namespaceReplacementPatterns = $config->getNamespaceReplacementPatterns();
50
-    }
51
-
52
-    /**
53
-     * TODO: Order by longest string first. (or instead, record classnames with their namespaces)
54
-     *
55
-     * @return string[]
56
-     */
57
-    public function getDiscoveredNamespaceReplacements(): array
58
-    {
59
-        $discoveredNamespaceReplacements = $this->discoveredNamespaces;
60
-
61
-        uksort($discoveredNamespaceReplacements, function ($a, $b) {
62
-            return strlen($b) <=> strlen($a);
63
-        });
64
-
65
-        return $discoveredNamespaceReplacements;
66
-    }
67
-
68
-    /**
69
-     * @return string[]
70
-     */
71
-    public function getDiscoveredClasses(): array
72
-    {
73
-        return array_keys($this->discoveredClasses);
74
-    }
75
-
76
-
77
-    /**
78
-     * @param string $dir
79
-     * @param array<string, ComposerPackage> $relativeFilepaths
80
-     */
81
-    public function findInFiles($dir, $relativeFilepaths)
82
-    {
83
-
84
-        foreach ($relativeFilepaths as $relativeFilepath => $package) {
85
-            foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) {
86
-                if ($package->getName() === $excludePackagesName) {
87
-                    continue 2;
88
-                }
89
-            }
90
-
91
-            foreach ($this->excludeFilePatternsFromPrefixing as $excludeFilePattern) {
92
-                if (1 === preg_match($excludeFilePattern, $relativeFilepath)) {
93
-                    continue 2;
94
-                }
95
-            }
96
-
97
-
98
-            $filepath = $dir . $relativeFilepath;
99
-
100
-            // TODO: use flysystem
101
-            // $contents = $this->filesystem->read($targetFile);
102
-
103
-            $contents = file_get_contents($filepath);
104
-
105
-            $this->find($contents);
106
-        }
107
-    }
108
-
109
-
110
-    /**
111
-     * TODO: Don't use preg_replace_callback!
112
-     *
113
-     * @param string $contents
114
-     *
115
-     * @return string $contents
116
-     */
117
-    public function find(string $contents): string
118
-    {
119
-
120
-        // If the entire file is under one namespace, all we want is the namespace.
121
-        $singleNamespacePattern = '/
16
+	protected string $namespacePrefix;
17
+	protected string $classmapPrefix;
18
+	/**
19
+	 *
20
+	 * @var string[]
21
+	 */
22
+	protected array $excludePackagesFromPrefixing = array();
23
+	protected array $excludeNamespacesFromPrefixing = array();
24
+
25
+	protected array $excludeFilePatternsFromPrefixing = array();
26
+
27
+	protected array $namespaceReplacementPatterns = array();
28
+
29
+	/** @var string[] */
30
+	protected array $discoveredNamespaces = [];
31
+
32
+	/** @var string[] */
33
+	protected array $discoveredClasses = [];
34
+
35
+
36
+	/**
37
+	 * ChangeEnumerator constructor.
38
+	 * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config
39
+	 */
40
+	public function __construct(StraussConfig $config)
41
+	{
42
+		$this->namespacePrefix = $config->getNamespacePrefix();
43
+		$this->classmapPrefix = $config->getClassmapPrefix();
44
+
45
+		$this->excludePackagesFromPrefixing = $config->getExcludePackagesFromPrefixing();
46
+		$this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing();
47
+		$this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing();
48
+
49
+		$this->namespaceReplacementPatterns = $config->getNamespaceReplacementPatterns();
50
+	}
51
+
52
+	/**
53
+	 * TODO: Order by longest string first. (or instead, record classnames with their namespaces)
54
+	 *
55
+	 * @return string[]
56
+	 */
57
+	public function getDiscoveredNamespaceReplacements(): array
58
+	{
59
+		$discoveredNamespaceReplacements = $this->discoveredNamespaces;
60
+
61
+		uksort($discoveredNamespaceReplacements, function ($a, $b) {
62
+			return strlen($b) <=> strlen($a);
63
+		});
64
+
65
+		return $discoveredNamespaceReplacements;
66
+	}
67
+
68
+	/**
69
+	 * @return string[]
70
+	 */
71
+	public function getDiscoveredClasses(): array
72
+	{
73
+		return array_keys($this->discoveredClasses);
74
+	}
75
+
76
+
77
+	/**
78
+	 * @param string $dir
79
+	 * @param array<string, ComposerPackage> $relativeFilepaths
80
+	 */
81
+	public function findInFiles($dir, $relativeFilepaths)
82
+	{
83
+
84
+		foreach ($relativeFilepaths as $relativeFilepath => $package) {
85
+			foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) {
86
+				if ($package->getName() === $excludePackagesName) {
87
+					continue 2;
88
+				}
89
+			}
90
+
91
+			foreach ($this->excludeFilePatternsFromPrefixing as $excludeFilePattern) {
92
+				if (1 === preg_match($excludeFilePattern, $relativeFilepath)) {
93
+					continue 2;
94
+				}
95
+			}
96
+
97
+
98
+			$filepath = $dir . $relativeFilepath;
99
+
100
+			// TODO: use flysystem
101
+			// $contents = $this->filesystem->read($targetFile);
102
+
103
+			$contents = file_get_contents($filepath);
104
+
105
+			$this->find($contents);
106
+		}
107
+	}
108
+
109
+
110
+	/**
111
+	 * TODO: Don't use preg_replace_callback!
112
+	 *
113
+	 * @param string $contents
114
+	 *
115
+	 * @return string $contents
116
+	 */
117
+	public function find(string $contents): string
118
+	{
119
+
120
+		// If the entire file is under one namespace, all we want is the namespace.
121
+		$singleNamespacePattern = '/
122 122
             namespace\s+([0-9A-Za-z_\x7f-\xff\\\\]+)[\s\S]*;    # A single namespace in the file.... should return
123 123
         /x';
124
-        if (1 === preg_match($singleNamespacePattern, $contents, $matches)) {
125
-            $this->addDiscoveredNamespaceChange($matches[1]);
126
-            return $contents;
127
-        }
124
+		if (1 === preg_match($singleNamespacePattern, $contents, $matches)) {
125
+			$this->addDiscoveredNamespaceChange($matches[1]);
126
+			return $contents;
127
+		}
128 128
 
129 129
 
130
-        // TODO traits
130
+		// TODO traits
131 131
 
132
-        // TODO: Is the ";" in this still correct since it's being taken care of in the regex just above?
133
-        // Looks like with the preceeding regex, it will never match.
132
+		// TODO: Is the ";" in this still correct since it's being taken care of in the regex just above?
133
+		// Looks like with the preceeding regex, it will never match.
134 134
 
135 135
 
136
-        return preg_replace_callback(
137
-            '
136
+		return preg_replace_callback(
137
+			'
138 138
 			~											# Start the pattern
139 139
 				namespace\s+([a-zA-Z0-9_\x7f-\xff\\\\]+)[;{\s\n]{1}[\s\S]*?(?=namespace|$) 
140 140
 														# Look for a preceeding namespace declaration, 
@@ -152,44 +152,44 @@  discard block
 block discarded – undo
152 152
 				(?:{|extends|implements|\n|$)			# Class declaration can be followed by {, extends, implements 
153 153
 														# or a new line
154 154
 			~x', //                                     # x: ignore whitespace in regex.
155
-            function ($matches) {
156
-
157
-                // If we're inside a namespace other than the global namespace:
158
-                if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) {
159
-                    $this->addDiscoveredNamespaceChange($matches[1]);
160
-                    return $matches[0];
161
-                }
162
-
163
-                if (count($matches) < 3) {
164
-                    return $matches[0];
165
-                }
166
-
167
-                // TODO: Why is this [2] and not [1] (which seems to be always empty).
168
-                $this->discoveredClasses[$matches[2]] = $matches[2];
169
-                return $matches[0];
170
-            },
171
-            $contents
172
-        );
173
-    }
174
-
175
-    protected function addDiscoveredNamespaceChange(string $namespace)
176
-    {
177
-
178
-        foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) {
179
-            if (0 === strpos($namespace, $excludeNamespace)) {
180
-                return;
181
-            }
182
-        }
183
-
184
-        foreach ($this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement) {
185
-            $prefixed = preg_replace($namespaceReplacementPattern, $replacement, $namespace);
186
-
187
-            if ($prefixed !== $namespace) {
188
-                $this->discoveredNamespaces[$namespace] = $prefixed;
189
-                return;
190
-            }
191
-        }
192
-
193
-        $this->discoveredNamespaces[$namespace] = $this->namespacePrefix . '\\'. $namespace;
194
-    }
155
+			function ($matches) {
156
+
157
+				// If we're inside a namespace other than the global namespace:
158
+				if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) {
159
+					$this->addDiscoveredNamespaceChange($matches[1]);
160
+					return $matches[0];
161
+				}
162
+
163
+				if (count($matches) < 3) {
164
+					return $matches[0];
165
+				}
166
+
167
+				// TODO: Why is this [2] and not [1] (which seems to be always empty).
168
+				$this->discoveredClasses[$matches[2]] = $matches[2];
169
+				return $matches[0];
170
+			},
171
+			$contents
172
+		);
173
+	}
174
+
175
+	protected function addDiscoveredNamespaceChange(string $namespace)
176
+	{
177
+
178
+		foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) {
179
+			if (0 === strpos($namespace, $excludeNamespace)) {
180
+				return;
181
+			}
182
+		}
183
+
184
+		foreach ($this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement) {
185
+			$prefixed = preg_replace($namespaceReplacementPattern, $replacement, $namespace);
186
+
187
+			if ($prefixed !== $namespace) {
188
+				$this->discoveredNamespaces[$namespace] = $prefixed;
189
+				return;
190
+			}
191
+		}
192
+
193
+		$this->discoveredNamespaces[$namespace] = $this->namespacePrefix . '\\'. $namespace;
194
+	}
195 195
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/Console/Commands/Compose.php 1 patch
Indentation   +200 added lines, -200 removed lines patch added patch discarded remove patch
@@ -19,259 +19,259 @@
 block discarded – undo
19 19
 
20 20
 class Compose extends Command
21 21
 {
22
-    /** @var string */
23
-    protected string $workingDir;
22
+	/** @var string */
23
+	protected string $workingDir;
24 24
 
25
-    /** @var StraussConfig */
26
-    protected StraussConfig $config;
25
+	/** @var StraussConfig */
26
+	protected StraussConfig $config;
27 27
 
28
-    protected ProjectComposerPackage $projectComposerPackage;
28
+	protected ProjectComposerPackage $projectComposerPackage;
29 29
 
30
-    /** @var Copier */
31
-    protected Copier $copier;
30
+	/** @var Copier */
31
+	protected Copier $copier;
32 32
 
33
-    /** @var Prefixer */
34
-    protected Prefixer $replacer;
35
-    /**
36
-     * @var ChangeEnumerator
37
-     */
38
-    protected ChangeEnumerator $changeEnumerator;
33
+	/** @var Prefixer */
34
+	protected Prefixer $replacer;
35
+	/**
36
+	 * @var ChangeEnumerator
37
+	 */
38
+	protected ChangeEnumerator $changeEnumerator;
39 39
 
40 40
 
41
-    /**
42
-     * @return void
43
-     */
44
-    protected function configure()
45
-    {
46
-        $this->setName('compose');
47
-        $this->setDescription("Copy composer's `require` and prefix their namespace and classnames.");
48
-        $this->setHelp('');
49
-    }
41
+	/**
42
+	 * @return void
43
+	 */
44
+	protected function configure()
45
+	{
46
+		$this->setName('compose');
47
+		$this->setDescription("Copy composer's `require` and prefix their namespace and classnames.");
48
+		$this->setHelp('');
49
+	}
50 50
 
51
-    /**
52
-     * @see Command::execute()
53
-     *
54
-     * @param InputInterface $input
55
-     * @param OutputInterface $output
56
-     * @return int
57
-     */
58
-    protected function execute(InputInterface $input, OutputInterface $output): int
59
-    {
60
-        $workingDir = getcwd() . DIRECTORY_SEPARATOR;
61
-        $this->workingDir = $workingDir;
51
+	/**
52
+	 * @see Command::execute()
53
+	 *
54
+	 * @param InputInterface $input
55
+	 * @param OutputInterface $output
56
+	 * @return int
57
+	 */
58
+	protected function execute(InputInterface $input, OutputInterface $output): int
59
+	{
60
+		$workingDir = getcwd() . DIRECTORY_SEPARATOR;
61
+		$this->workingDir = $workingDir;
62 62
 
63
-        try {
64
-            $this->loadProjectComposerPackage();
63
+		try {
64
+			$this->loadProjectComposerPackage();
65 65
 
66
-            $this->buildDependencyList();
66
+			$this->buildDependencyList();
67 67
 
68
-            $this->enumerateFiles();
68
+			$this->enumerateFiles();
69 69
 
70
-            $this->copyFiles();
70
+			$this->copyFiles();
71 71
 
72
-            $this->determineChanges();
72
+			$this->determineChanges();
73 73
 
74
-            $this->performReplacements();
74
+			$this->performReplacements();
75 75
 
76
-            $this->addLicenses();
77
-
78
-            $this->generateAutoloader();
76
+			$this->addLicenses();
77
+
78
+			$this->generateAutoloader();
79 79
 
80
-            $this->cleanUp();
81
-        } catch (Exception $e) {
82
-            $output->write($e->getMessage());
83
-            return 1;
84
-        }
80
+			$this->cleanUp();
81
+		} catch (Exception $e) {
82
+			$output->write($e->getMessage());
83
+			return 1;
84
+		}
85 85
 
86
-        // What should this be?!
87
-        return 0;
88
-    }
86
+		// What should this be?!
87
+		return 0;
88
+	}
89 89
 
90 90
 
91
-    /**
92
-     * 1. Load the composer.json.
93
-     *
94
-     * @throws Exception
95
-     */
96
-    protected function loadProjectComposerPackage()
97
-    {
91
+	/**
92
+	 * 1. Load the composer.json.
93
+	 *
94
+	 * @throws Exception
95
+	 */
96
+	protected function loadProjectComposerPackage()
97
+	{
98 98
 
99
-        $this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json');
99
+		$this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json');
100 100
 
101
-        $config = $this->projectComposerPackage->getStraussConfig();
101
+		$config = $this->projectComposerPackage->getStraussConfig();
102 102
 
103
-        $this->config = $config;
104
-    }
103
+		$this->config = $config;
104
+	}
105 105
 
106 106
 
107
-    /** @var ComposerPackage[] */
108
-    protected array $flatDependencyTree = [];
107
+	/** @var ComposerPackage[] */
108
+	protected array $flatDependencyTree = [];
109 109
 
110
-    /**
111
-     * 2. Built flat list of packages and dependencies.
112
-     *
113
-     * 2.1 Initiate getting dependencies for the project composer.json.
114
-     *
115
-     * @see Compose::flatDependencyTree
116
-     */
117
-    protected function buildDependencyList()
118
-    {
110
+	/**
111
+	 * 2. Built flat list of packages and dependencies.
112
+	 *
113
+	 * 2.1 Initiate getting dependencies for the project composer.json.
114
+	 *
115
+	 * @see Compose::flatDependencyTree
116
+	 */
117
+	protected function buildDependencyList()
118
+	{
119 119
 
120
-        $requiredPackageNames = $this->config->getPackages();
120
+		$requiredPackageNames = $this->config->getPackages();
121 121
 
122
-        // Unset PHP, ext-*.
123
-        $removePhpExt = function ($element) {
124
-            return !( 0 === strpos($element, 'ext') || 'php' === $element );
125
-        };
122
+		// Unset PHP, ext-*.
123
+		$removePhpExt = function ($element) {
124
+			return !( 0 === strpos($element, 'ext') || 'php' === $element );
125
+		};
126 126
 
127
-        $requiredPackageNames = array_filter($requiredPackageNames, $removePhpExt);
127
+		$requiredPackageNames = array_filter($requiredPackageNames, $removePhpExt);
128 128
 
129
-        foreach ($requiredPackageNames as $requiredPackageName) {
130
-            $packageDir = $this->workingDir . 'vendor' .DIRECTORY_SEPARATOR
131
-                . $requiredPackageName . DIRECTORY_SEPARATOR;
129
+		foreach ($requiredPackageNames as $requiredPackageName) {
130
+			$packageDir = $this->workingDir . 'vendor' .DIRECTORY_SEPARATOR
131
+				. $requiredPackageName . DIRECTORY_SEPARATOR;
132 132
 
133
-            $overrideAutoload = isset($this->config->getOverrideAutoload()[$requiredPackageName])
134
-                ? $this->config->getOverrideAutoload()[$requiredPackageName]
135
-                : null;
133
+			$overrideAutoload = isset($this->config->getOverrideAutoload()[$requiredPackageName])
134
+				? $this->config->getOverrideAutoload()[$requiredPackageName]
135
+				: null;
136 136
 
137
-            $requiredComposerPackage = new ComposerPackage($packageDir, $overrideAutoload);
138
-            $this->flatDependencyTree[$requiredComposerPackage->getName()] = $requiredComposerPackage;
139
-            $this->getAllDependencies($requiredComposerPackage);
140
-        }
141
-    }
142
-
143
-    /**
144
-     * 2.2 Recursive function to get dependencies.
145
-     *
146
-     * @param ComposerPackage $requiredDependency
147
-     */
148
-    protected function getAllDependencies(ComposerPackage $requiredDependency): void
149
-    {
150
-        $excludedPackagesNames = $this->config->getExcludePackagesFromPrefixing();
137
+			$requiredComposerPackage = new ComposerPackage($packageDir, $overrideAutoload);
138
+			$this->flatDependencyTree[$requiredComposerPackage->getName()] = $requiredComposerPackage;
139
+			$this->getAllDependencies($requiredComposerPackage);
140
+		}
141
+	}
142
+
143
+	/**
144
+	 * 2.2 Recursive function to get dependencies.
145
+	 *
146
+	 * @param ComposerPackage $requiredDependency
147
+	 */
148
+	protected function getAllDependencies(ComposerPackage $requiredDependency): void
149
+	{
150
+		$excludedPackagesNames = $this->config->getExcludePackagesFromPrefixing();
151 151
 
152
-        // Unset PHP, ext-*.
153
-        $removePhpExt = function ($element) {
154
-            return !( 0 === strpos($element, 'ext') || 'php' === $element );
155
-        };
152
+		// Unset PHP, ext-*.
153
+		$removePhpExt = function ($element) {
154
+			return !( 0 === strpos($element, 'ext') || 'php' === $element );
155
+		};
156 156
 
157
-        $required = array_filter($requiredDependency->getRequiresNames(), $removePhpExt);
157
+		$required = array_filter($requiredDependency->getRequiresNames(), $removePhpExt);
158 158
 
159
-        foreach ($required as $dependencyName) {
160
-            if (in_array($dependencyName, $excludedPackagesNames)) {
161
-                continue;
162
-            }
159
+		foreach ($required as $dependencyName) {
160
+			if (in_array($dependencyName, $excludedPackagesNames)) {
161
+				continue;
162
+			}
163 163
 
164
-            $overrideAutoload = isset($this->config->getOverrideAutoload()[$dependencyName])
165
-                ? $this->config->getOverrideAutoload()[$dependencyName]
166
-                : null;
164
+			$overrideAutoload = isset($this->config->getOverrideAutoload()[$dependencyName])
165
+				? $this->config->getOverrideAutoload()[$dependencyName]
166
+				: null;
167 167
 
168
-            $dependencyComposerPackage = new ComposerPackage(
169
-                $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR
170
-                . $dependencyName . DIRECTORY_SEPARATOR . 'composer.json',
171
-                $overrideAutoload
172
-            );
168
+			$dependencyComposerPackage = new ComposerPackage(
169
+				$this->workingDir . 'vendor' . DIRECTORY_SEPARATOR
170
+				. $dependencyName . DIRECTORY_SEPARATOR . 'composer.json',
171
+				$overrideAutoload
172
+			);
173 173
 
174
-            $this->flatDependencyTree[$dependencyName] = $dependencyComposerPackage;
175
-            $this->getAllDependencies($dependencyComposerPackage);
176
-        }
177
-    }
178
-
179
-    protected FileEnumerator $fileEnumerator;
180
-
181
-    protected function enumerateFiles()
182
-    {
183
-
184
-        $this->fileEnumerator = new FileEnumerator(
185
-            $this->flatDependencyTree,
186
-            $this->workingDir,
187
-            $this->config
188
-        );
174
+			$this->flatDependencyTree[$dependencyName] = $dependencyComposerPackage;
175
+			$this->getAllDependencies($dependencyComposerPackage);
176
+		}
177
+	}
178
+
179
+	protected FileEnumerator $fileEnumerator;
180
+
181
+	protected function enumerateFiles()
182
+	{
183
+
184
+		$this->fileEnumerator = new FileEnumerator(
185
+			$this->flatDependencyTree,
186
+			$this->workingDir,
187
+			$this->config
188
+		);
189 189
 
190
-        $this->fileEnumerator->compileFileList();
191
-    }
192
-
193
-    // 3. Copy autoloaded files for each
194
-    protected function copyFiles()
195
-    {
190
+		$this->fileEnumerator->compileFileList();
191
+	}
192
+
193
+	// 3. Copy autoloaded files for each
194
+	protected function copyFiles()
195
+	{
196 196
 
197
-        $this->copier = new Copier(
198
-            $this->fileEnumerator->getAllFilesAndDependencyList(),
199
-            $this->workingDir,
200
-            $this->config->getTargetDirectory()
201
-        );
202
-
203
-        $this->copier->prepareTarget();
204
-
205
-        $this->copier->copy();
206
-    }
207
-
208
-    // 4. Determine namespace and classname changes
209
-    protected function determineChanges()
210
-    {
211
-
212
-        $this->changeEnumerator = new ChangeEnumerator($this->config);
213
-
214
-        $relativeTargetDir = $this->config->getTargetDirectory();
215
-        $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList();
216
-        $this->changeEnumerator->findInFiles($relativeTargetDir, $phpFiles);
217
-    }
218
-
219
-    // 5. Update namespaces and class names.
220
-    // Replace references to updated namespaces and classnames throughout the dependencies.
221
-    protected function performReplacements()
222
-    {
223
-        $this->replacer = new Prefixer($this->config, $this->workingDir);
224
-
225
-        $namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements();
226
-        $classes = $this->changeEnumerator->getDiscoveredClasses();
197
+		$this->copier = new Copier(
198
+			$this->fileEnumerator->getAllFilesAndDependencyList(),
199
+			$this->workingDir,
200
+			$this->config->getTargetDirectory()
201
+		);
202
+
203
+		$this->copier->prepareTarget();
204
+
205
+		$this->copier->copy();
206
+	}
207
+
208
+	// 4. Determine namespace and classname changes
209
+	protected function determineChanges()
210
+	{
211
+
212
+		$this->changeEnumerator = new ChangeEnumerator($this->config);
213
+
214
+		$relativeTargetDir = $this->config->getTargetDirectory();
215
+		$phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList();
216
+		$this->changeEnumerator->findInFiles($relativeTargetDir, $phpFiles);
217
+	}
218
+
219
+	// 5. Update namespaces and class names.
220
+	// Replace references to updated namespaces and classnames throughout the dependencies.
221
+	protected function performReplacements()
222
+	{
223
+		$this->replacer = new Prefixer($this->config, $this->workingDir);
224
+
225
+		$namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements();
226
+		$classes = $this->changeEnumerator->getDiscoveredClasses();
227 227
         
228
-        $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList();
228
+		$phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList();
229 229
 
230
-        $this->replacer->replaceInFiles($namespaces, $classes, $phpFiles);
231
-    }
230
+		$this->replacer->replaceInFiles($namespaces, $classes, $phpFiles);
231
+	}
232 232
 
233
-    protected function addLicenses(): void
234
-    {
233
+	protected function addLicenses(): void
234
+	{
235 235
 
236
-        $author = $this->projectComposerPackage->getAuthor();
236
+		$author = $this->projectComposerPackage->getAuthor();
237 237
 
238
-        $dependencies = $this->flatDependencyTree;
238
+		$dependencies = $this->flatDependencyTree;
239 239
 
240
-        $licenser = new Licenser($this->config, $this->workingDir, $dependencies, $author);
240
+		$licenser = new Licenser($this->config, $this->workingDir, $dependencies, $author);
241 241
 
242
-        $licenser->copyLicenses();
242
+		$licenser->copyLicenses();
243 243
 
244
-        $modifiedFiles = $this->replacer->getModifiedFiles();
245
-        $licenser->addInformationToUpdatedFiles($modifiedFiles);
246
-    }
244
+		$modifiedFiles = $this->replacer->getModifiedFiles();
245
+		$licenser->addInformationToUpdatedFiles($modifiedFiles);
246
+	}
247 247
 
248
-    /**
249
-     * 6. Generate autoloader.
250
-     */
251
-    protected function generateAutoloader()
252
-    {
248
+	/**
249
+	 * 6. Generate autoloader.
250
+	 */
251
+	protected function generateAutoloader()
252
+	{
253 253
 
254
-        $files = $this->fileEnumerator->getFilesAutoloaders();
254
+		$files = $this->fileEnumerator->getFilesAutoloaders();
255 255
 
256
-        $classmap = new Autoload($this->config, $this->workingDir, $files);
256
+		$classmap = new Autoload($this->config, $this->workingDir, $files);
257 257
 
258
-        $classmap->generate();
259
-    }
258
+		$classmap->generate();
259
+	}
260 260
 
261 261
 
262
-    /**
263
-     * 7.
264
-     * Delete source files if desired.
265
-     * Delete empty directories in destination.
266
-     */
267
-    protected function cleanUp()
268
-    {
262
+	/**
263
+	 * 7.
264
+	 * Delete source files if desired.
265
+	 * Delete empty directories in destination.
266
+	 */
267
+	protected function cleanUp()
268
+	{
269 269
 
270
-        $cleanup = new Cleanup($this->config, $this->workingDir);
270
+		$cleanup = new Cleanup($this->config, $this->workingDir);
271 271
 
272
-        $sourceFiles = array_keys($this->fileEnumerator->getAllFilesAndDependencyList());
272
+		$sourceFiles = array_keys($this->fileEnumerator->getAllFilesAndDependencyList());
273 273
 
274
-        // This will check the config to check should it delete or not.
275
-        $cleanup->cleanup($sourceFiles);
276
-    }
274
+		// This will check the config to check should it delete or not.
275
+		$cleanup->cleanup($sourceFiles);
276
+	}
277 277
 }
Please login to merge, or discard this patch.
vendor/brianhenryie/strauss/src/Console/Application.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -7,16 +7,16 @@
 block discarded – undo
7 7
 
8 8
 class Application extends BaseApplication
9 9
 {
10
-    /**
11
-     * @param string $version
12
-     */
13
-    public function __construct(string $version)
14
-    {
15
-        parent::__construct('strauss', $version);
10
+	/**
11
+	 * @param string $version
12
+	 */
13
+	public function __construct(string $version)
14
+	{
15
+		parent::__construct('strauss', $version);
16 16
 
17
-        $composeCommand = new Compose();
18
-        $this->add($composeCommand);
17
+		$composeCommand = new Compose();
18
+		$this->add($composeCommand);
19 19
 
20
-        $this->setDefaultCommand('compose');
21
-    }
20
+		$this->setDefaultCommand('compose');
21
+	}
22 22
 }
Please login to merge, or discard this patch.
vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php 1 patch
Indentation   +148 added lines, -148 removed lines patch added patch discarded remove patch
@@ -27,164 +27,164 @@
 block discarded – undo
27 27
  */
28 28
 
29 29
 if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
30
-    define('RANDOM_COMPAT_READ_BUFFER', 8);
30
+	define('RANDOM_COMPAT_READ_BUFFER', 8);
31 31
 }
32 32
 
33 33
 if (!is_callable('random_bytes')) {
34
-    /**
35
-     * Unless open_basedir is enabled, use /dev/urandom for
36
-     * random numbers in accordance with best practices
37
-     *
38
-     * Why we use /dev/urandom and not /dev/random
39
-     * @ref https://www.2uo.de/myths-about-urandom
40
-     * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
41
-     *
42
-     * @param int $bytes
43
-     *
44
-     * @throws Exception
45
-     *
46
-     * @return string
47
-     */
48
-    function random_bytes($bytes)
49
-    {
50
-        /** @var resource $fp */
51
-        static $fp = null;
34
+	/**
35
+	 * Unless open_basedir is enabled, use /dev/urandom for
36
+	 * random numbers in accordance with best practices
37
+	 *
38
+	 * Why we use /dev/urandom and not /dev/random
39
+	 * @ref https://www.2uo.de/myths-about-urandom
40
+	 * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
41
+	 *
42
+	 * @param int $bytes
43
+	 *
44
+	 * @throws Exception
45
+	 *
46
+	 * @return string
47
+	 */
48
+	function random_bytes($bytes)
49
+	{
50
+		/** @var resource $fp */
51
+		static $fp = null;
52 52
 
53
-        /**
54
-         * This block should only be run once
55
-         */
56
-        if (empty($fp)) {
57
-            /**
58
-             * We don't want to ever read C:\dev\random, only /dev/urandom on
59
-             * Unix-like operating systems. While we guard against this
60
-             * condition in random.php, it doesn't hurt to be defensive in depth
61
-             * here.
62
-             *
63
-             * To that end, we only try to open /dev/urandom if we're on a Unix-
64
-             * like operating system (which means the directory separator is set
65
-             * to "/" not "\".
66
-             */
67
-            if (DIRECTORY_SEPARATOR === '/') {
68
-                if (!is_readable('/dev/urandom')) {
69
-                    throw new Exception(
70
-                        'Environment misconfiguration: ' .
71
-                        '/dev/urandom cannot be read.'
72
-                    );
73
-                }
74
-                /**
75
-                 * We use /dev/urandom if it is a char device.
76
-                 * We never fall back to /dev/random
77
-                 */
78
-                /** @var resource|bool $fp */
79
-                $fp = fopen('/dev/urandom', 'rb');
80
-                if (is_resource($fp)) {
81
-                    /** @var array<string, int> $st */
82
-                    $st = fstat($fp);
83
-                    if (($st['mode'] & 0170000) !== 020000) {
84
-                        fclose($fp);
85
-                        $fp = false;
86
-                    }
87
-                }
88
-            }
53
+		/**
54
+		 * This block should only be run once
55
+		 */
56
+		if (empty($fp)) {
57
+			/**
58
+			 * We don't want to ever read C:\dev\random, only /dev/urandom on
59
+			 * Unix-like operating systems. While we guard against this
60
+			 * condition in random.php, it doesn't hurt to be defensive in depth
61
+			 * here.
62
+			 *
63
+			 * To that end, we only try to open /dev/urandom if we're on a Unix-
64
+			 * like operating system (which means the directory separator is set
65
+			 * to "/" not "\".
66
+			 */
67
+			if (DIRECTORY_SEPARATOR === '/') {
68
+				if (!is_readable('/dev/urandom')) {
69
+					throw new Exception(
70
+						'Environment misconfiguration: ' .
71
+						'/dev/urandom cannot be read.'
72
+					);
73
+				}
74
+				/**
75
+				 * We use /dev/urandom if it is a char device.
76
+				 * We never fall back to /dev/random
77
+				 */
78
+				/** @var resource|bool $fp */
79
+				$fp = fopen('/dev/urandom', 'rb');
80
+				if (is_resource($fp)) {
81
+					/** @var array<string, int> $st */
82
+					$st = fstat($fp);
83
+					if (($st['mode'] & 0170000) !== 020000) {
84
+						fclose($fp);
85
+						$fp = false;
86
+					}
87
+				}
88
+			}
89 89
 
90
-            if (is_resource($fp)) {
91
-                /**
92
-                 * stream_set_read_buffer() does not exist in HHVM
93
-                 *
94
-                 * If we don't set the stream's read buffer to 0, PHP will
95
-                 * internally buffer 8192 bytes, which can waste entropy
96
-                 *
97
-                 * stream_set_read_buffer returns 0 on success
98
-                 */
99
-                if (is_callable('stream_set_read_buffer')) {
100
-                    stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
101
-                }
102
-                if (is_callable('stream_set_chunk_size')) {
103
-                    stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
104
-                }
105
-            }
106
-        }
90
+			if (is_resource($fp)) {
91
+				/**
92
+				 * stream_set_read_buffer() does not exist in HHVM
93
+				 *
94
+				 * If we don't set the stream's read buffer to 0, PHP will
95
+				 * internally buffer 8192 bytes, which can waste entropy
96
+				 *
97
+				 * stream_set_read_buffer returns 0 on success
98
+				 */
99
+				if (is_callable('stream_set_read_buffer')) {
100
+					stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
101
+				}
102
+				if (is_callable('stream_set_chunk_size')) {
103
+					stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
104
+				}
105
+			}
106
+		}
107 107
 
108
-        try {
109
-            /** @var int $bytes */
110
-            $bytes = RandomCompat_intval($bytes);
111
-        } catch (TypeError $ex) {
112
-            throw new TypeError(
113
-                'random_bytes(): $bytes must be an integer'
114
-            );
115
-        }
108
+		try {
109
+			/** @var int $bytes */
110
+			$bytes = RandomCompat_intval($bytes);
111
+		} catch (TypeError $ex) {
112
+			throw new TypeError(
113
+				'random_bytes(): $bytes must be an integer'
114
+			);
115
+		}
116 116
 
117
-        if ($bytes < 1) {
118
-            throw new Error(
119
-                'Length must be greater than 0'
120
-            );
121
-        }
117
+		if ($bytes < 1) {
118
+			throw new Error(
119
+				'Length must be greater than 0'
120
+			);
121
+		}
122 122
 
123
-        /**
124
-         * This if() block only runs if we managed to open a file handle
125
-         *
126
-         * It does not belong in an else {} block, because the above
127
-         * if (empty($fp)) line is logic that should only be run once per
128
-         * page load.
129
-         */
130
-        if (is_resource($fp)) {
131
-            /**
132
-             * @var int
133
-             */
134
-            $remaining = $bytes;
123
+		/**
124
+		 * This if() block only runs if we managed to open a file handle
125
+		 *
126
+		 * It does not belong in an else {} block, because the above
127
+		 * if (empty($fp)) line is logic that should only be run once per
128
+		 * page load.
129
+		 */
130
+		if (is_resource($fp)) {
131
+			/**
132
+			 * @var int
133
+			 */
134
+			$remaining = $bytes;
135 135
 
136
-            /**
137
-             * @var string|bool
138
-             */
139
-            $buf = '';
136
+			/**
137
+			 * @var string|bool
138
+			 */
139
+			$buf = '';
140 140
 
141
-            /**
142
-             * We use fread() in a loop to protect against partial reads
143
-             */
144
-            do {
145
-                /**
146
-                 * @var string|bool
147
-                 */
148
-                $read = fread($fp, $remaining);
149
-                if (!is_string($read)) {
150
-                    /**
151
-                     * We cannot safely read from the file. Exit the
152
-                     * do-while loop and trigger the exception condition
153
-                     *
154
-                     * @var string|bool
155
-                     */
156
-                    $buf = false;
157
-                    break;
158
-                }
159
-                /**
160
-                 * Decrease the number of bytes returned from remaining
161
-                 */
162
-                $remaining -= RandomCompat_strlen($read);
163
-                /**
164
-                 * @var string $buf
165
-                 */
166
-                $buf .= $read;
167
-            } while ($remaining > 0);
141
+			/**
142
+			 * We use fread() in a loop to protect against partial reads
143
+			 */
144
+			do {
145
+				/**
146
+				 * @var string|bool
147
+				 */
148
+				$read = fread($fp, $remaining);
149
+				if (!is_string($read)) {
150
+					/**
151
+					 * We cannot safely read from the file. Exit the
152
+					 * do-while loop and trigger the exception condition
153
+					 *
154
+					 * @var string|bool
155
+					 */
156
+					$buf = false;
157
+					break;
158
+				}
159
+				/**
160
+				 * Decrease the number of bytes returned from remaining
161
+				 */
162
+				$remaining -= RandomCompat_strlen($read);
163
+				/**
164
+				 * @var string $buf
165
+				 */
166
+				$buf .= $read;
167
+			} while ($remaining > 0);
168 168
 
169
-            /**
170
-             * Is our result valid?
171
-             * @var string|bool $buf
172
-             */
173
-            if (is_string($buf)) {
174
-                if (RandomCompat_strlen($buf) === $bytes) {
175
-                    /**
176
-                     * Return our random entropy buffer here:
177
-                     */
178
-                    return $buf;
179
-                }
180
-            }
181
-        }
169
+			/**
170
+			 * Is our result valid?
171
+			 * @var string|bool $buf
172
+			 */
173
+			if (is_string($buf)) {
174
+				if (RandomCompat_strlen($buf) === $bytes) {
175
+					/**
176
+					 * Return our random entropy buffer here:
177
+					 */
178
+					return $buf;
179
+				}
180
+			}
181
+		}
182 182
 
183
-        /**
184
-         * If we reach here, PHP has failed us.
185
-         */
186
-        throw new Exception(
187
-            'Error reading from source device'
188
-        );
189
-    }
183
+		/**
184
+		 * If we reach here, PHP has failed us.
185
+		 */
186
+		throw new Exception(
187
+			'Error reading from source device'
188
+		);
189
+	}
190 190
 }
Please login to merge, or discard this patch.
vendor/paragonie/random_compat/lib/random_int.php 1 patch
Indentation   +200 added lines, -200 removed lines patch added patch discarded remove patch
@@ -1,204 +1,204 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (!is_callable('random_int')) {
4
-    /**
5
-     * Random_* Compatibility Library
6
-     * for using the new PHP 7 random_* API in PHP 5 projects
7
-     *
8
-     * The MIT License (MIT)
9
-     *
10
-     * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
11
-     *
12
-     * Permission is hereby granted, free of charge, to any person obtaining a copy
13
-     * of this software and associated documentation files (the "Software"), to deal
14
-     * in the Software without restriction, including without limitation the rights
15
-     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
-     * copies of the Software, and to permit persons to whom the Software is
17
-     * furnished to do so, subject to the following conditions:
18
-     *
19
-     * The above copyright notice and this permission notice shall be included in
20
-     * all copies or substantial portions of the Software.
21
-     *
22
-     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
-     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
-     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
-     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
-     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
-     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
-     * SOFTWARE.
29
-     */
30
-
31
-    /**
32
-     * Fetch a random integer between $min and $max inclusive
33
-     *
34
-     * @param int $min
35
-     * @param int $max
36
-     *
37
-     * @throws Exception
38
-     *
39
-     * @return int
40
-     */
41
-    function random_int($min, $max)
42
-    {
43
-        /**
44
-         * Type and input logic checks
45
-         *
46
-         * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
47
-         * (non-inclusive), it will sanely cast it to an int. If you it's equal to
48
-         * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
49
-         * lose precision, so the <= and => operators might accidentally let a float
50
-         * through.
51
-         */
52
-
53
-        try {
54
-            /** @var int $min */
55
-            $min = RandomCompat_intval($min);
56
-        } catch (TypeError $ex) {
57
-            throw new TypeError(
58
-                'random_int(): $min must be an integer'
59
-            );
60
-        }
61
-
62
-        try {
63
-            /** @var int $max */
64
-            $max = RandomCompat_intval($max);
65
-        } catch (TypeError $ex) {
66
-            throw new TypeError(
67
-                'random_int(): $max must be an integer'
68
-            );
69
-        }
70
-
71
-        /**
72
-         * Now that we've verified our weak typing system has given us an integer,
73
-         * let's validate the logic then we can move forward with generating random
74
-         * integers along a given range.
75
-         */
76
-        if ($min > $max) {
77
-            throw new Error(
78
-                'Minimum value must be less than or equal to the maximum value'
79
-            );
80
-        }
81
-
82
-        if ($max === $min) {
83
-            return (int) $min;
84
-        }
85
-
86
-        /**
87
-         * Initialize variables to 0
88
-         *
89
-         * We want to store:
90
-         * $bytes => the number of random bytes we need
91
-         * $mask => an integer bitmask (for use with the &) operator
92
-         *          so we can minimize the number of discards
93
-         */
94
-        $attempts = $bits = $bytes = $mask = $valueShift = 0;
95
-        /** @var int $attempts */
96
-        /** @var int $bits */
97
-        /** @var int $bytes */
98
-        /** @var int $mask */
99
-        /** @var int $valueShift */
100
-
101
-        /**
102
-         * At this point, $range is a positive number greater than 0. It might
103
-         * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
104
-         * a float and we will lose some precision.
105
-         *
106
-         * @var int|float $range
107
-         */
108
-        $range = $max - $min;
109
-
110
-        /**
111
-         * Test for integer overflow:
112
-         */
113
-        if (!is_int($range)) {
114
-
115
-            /**
116
-             * Still safely calculate wider ranges.
117
-             * Provided by @CodesInChaos, @oittaa
118
-             *
119
-             * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
120
-             *
121
-             * We use ~0 as a mask in this case because it generates all 1s
122
-             *
123
-             * @ref https://eval.in/400356 (32-bit)
124
-             * @ref http://3v4l.org/XX9r5  (64-bit)
125
-             */
126
-            $bytes = PHP_INT_SIZE;
127
-            /** @var int $mask */
128
-            $mask = ~0;
129
-
130
-        } else {
131
-
132
-            /**
133
-             * $bits is effectively ceil(log($range, 2)) without dealing with
134
-             * type juggling
135
-             */
136
-            while ($range > 0) {
137
-                if ($bits % 8 === 0) {
138
-                    ++$bytes;
139
-                }
140
-                ++$bits;
141
-                $range >>= 1;
142
-                /** @var int $mask */
143
-                $mask = $mask << 1 | 1;
144
-            }
145
-            $valueShift = $min;
146
-        }
147
-
148
-        /** @var int $val */
149
-        $val = 0;
150
-        /**
151
-         * Now that we have our parameters set up, let's begin generating
152
-         * random integers until one falls between $min and $max
153
-         */
154
-        /** @psalm-suppress RedundantCondition */
155
-        do {
156
-            /**
157
-             * The rejection probability is at most 0.5, so this corresponds
158
-             * to a failure probability of 2^-128 for a working RNG
159
-             */
160
-            if ($attempts > 128) {
161
-                throw new Exception(
162
-                    'random_int: RNG is broken - too many rejections'
163
-                );
164
-            }
165
-
166
-            /**
167
-             * Let's grab the necessary number of random bytes
168
-             */
169
-            $randomByteString = random_bytes($bytes);
170
-
171
-            /**
172
-             * Let's turn $randomByteString into an integer
173
-             *
174
-             * This uses bitwise operators (<< and |) to build an integer
175
-             * out of the values extracted from ord()
176
-             *
177
-             * Example: [9F] | [6D] | [32] | [0C] =>
178
-             *   159 + 27904 + 3276800 + 201326592 =>
179
-             *   204631455
180
-             */
181
-            $val &= 0;
182
-            for ($i = 0; $i < $bytes; ++$i) {
183
-                $val |= ord($randomByteString[$i]) << ($i * 8);
184
-            }
185
-            /** @var int $val */
186
-
187
-            /**
188
-             * Apply mask
189
-             */
190
-            $val &= $mask;
191
-            $val += $valueShift;
192
-
193
-            ++$attempts;
194
-            /**
195
-             * If $val overflows to a floating point number,
196
-             * ... or is larger than $max,
197
-             * ... or smaller than $min,
198
-             * then try again.
199
-             */
200
-        } while (!is_int($val) || $val > $max || $val < $min);
201
-
202
-        return (int) $val;
203
-    }
4
+	/**
5
+	 * Random_* Compatibility Library
6
+	 * for using the new PHP 7 random_* API in PHP 5 projects
7
+	 *
8
+	 * The MIT License (MIT)
9
+	 *
10
+	 * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
11
+	 *
12
+	 * Permission is hereby granted, free of charge, to any person obtaining a copy
13
+	 * of this software and associated documentation files (the "Software"), to deal
14
+	 * in the Software without restriction, including without limitation the rights
15
+	 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+	 * copies of the Software, and to permit persons to whom the Software is
17
+	 * furnished to do so, subject to the following conditions:
18
+	 *
19
+	 * The above copyright notice and this permission notice shall be included in
20
+	 * all copies or substantial portions of the Software.
21
+	 *
22
+	 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+	 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+	 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+	 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+	 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+	 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+	 * SOFTWARE.
29
+	 */
30
+
31
+	/**
32
+	 * Fetch a random integer between $min and $max inclusive
33
+	 *
34
+	 * @param int $min
35
+	 * @param int $max
36
+	 *
37
+	 * @throws Exception
38
+	 *
39
+	 * @return int
40
+	 */
41
+	function random_int($min, $max)
42
+	{
43
+		/**
44
+		 * Type and input logic checks
45
+		 *
46
+		 * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
47
+		 * (non-inclusive), it will sanely cast it to an int. If you it's equal to
48
+		 * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
49
+		 * lose precision, so the <= and => operators might accidentally let a float
50
+		 * through.
51
+		 */
52
+
53
+		try {
54
+			/** @var int $min */
55
+			$min = RandomCompat_intval($min);
56
+		} catch (TypeError $ex) {
57
+			throw new TypeError(
58
+				'random_int(): $min must be an integer'
59
+			);
60
+		}
61
+
62
+		try {
63
+			/** @var int $max */
64
+			$max = RandomCompat_intval($max);
65
+		} catch (TypeError $ex) {
66
+			throw new TypeError(
67
+				'random_int(): $max must be an integer'
68
+			);
69
+		}
70
+
71
+		/**
72
+		 * Now that we've verified our weak typing system has given us an integer,
73
+		 * let's validate the logic then we can move forward with generating random
74
+		 * integers along a given range.
75
+		 */
76
+		if ($min > $max) {
77
+			throw new Error(
78
+				'Minimum value must be less than or equal to the maximum value'
79
+			);
80
+		}
81
+
82
+		if ($max === $min) {
83
+			return (int) $min;
84
+		}
85
+
86
+		/**
87
+		 * Initialize variables to 0
88
+		 *
89
+		 * We want to store:
90
+		 * $bytes => the number of random bytes we need
91
+		 * $mask => an integer bitmask (for use with the &) operator
92
+		 *          so we can minimize the number of discards
93
+		 */
94
+		$attempts = $bits = $bytes = $mask = $valueShift = 0;
95
+		/** @var int $attempts */
96
+		/** @var int $bits */
97
+		/** @var int $bytes */
98
+		/** @var int $mask */
99
+		/** @var int $valueShift */
100
+
101
+		/**
102
+		 * At this point, $range is a positive number greater than 0. It might
103
+		 * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
104
+		 * a float and we will lose some precision.
105
+		 *
106
+		 * @var int|float $range
107
+		 */
108
+		$range = $max - $min;
109
+
110
+		/**
111
+		 * Test for integer overflow:
112
+		 */
113
+		if (!is_int($range)) {
114
+
115
+			/**
116
+			 * Still safely calculate wider ranges.
117
+			 * Provided by @CodesInChaos, @oittaa
118
+			 *
119
+			 * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
120
+			 *
121
+			 * We use ~0 as a mask in this case because it generates all 1s
122
+			 *
123
+			 * @ref https://eval.in/400356 (32-bit)
124
+			 * @ref http://3v4l.org/XX9r5  (64-bit)
125
+			 */
126
+			$bytes = PHP_INT_SIZE;
127
+			/** @var int $mask */
128
+			$mask = ~0;
129
+
130
+		} else {
131
+
132
+			/**
133
+			 * $bits is effectively ceil(log($range, 2)) without dealing with
134
+			 * type juggling
135
+			 */
136
+			while ($range > 0) {
137
+				if ($bits % 8 === 0) {
138
+					++$bytes;
139
+				}
140
+				++$bits;
141
+				$range >>= 1;
142
+				/** @var int $mask */
143
+				$mask = $mask << 1 | 1;
144
+			}
145
+			$valueShift = $min;
146
+		}
147
+
148
+		/** @var int $val */
149
+		$val = 0;
150
+		/**
151
+		 * Now that we have our parameters set up, let's begin generating
152
+		 * random integers until one falls between $min and $max
153
+		 */
154
+		/** @psalm-suppress RedundantCondition */
155
+		do {
156
+			/**
157
+			 * The rejection probability is at most 0.5, so this corresponds
158
+			 * to a failure probability of 2^-128 for a working RNG
159
+			 */
160
+			if ($attempts > 128) {
161
+				throw new Exception(
162
+					'random_int: RNG is broken - too many rejections'
163
+				);
164
+			}
165
+
166
+			/**
167
+			 * Let's grab the necessary number of random bytes
168
+			 */
169
+			$randomByteString = random_bytes($bytes);
170
+
171
+			/**
172
+			 * Let's turn $randomByteString into an integer
173
+			 *
174
+			 * This uses bitwise operators (<< and |) to build an integer
175
+			 * out of the values extracted from ord()
176
+			 *
177
+			 * Example: [9F] | [6D] | [32] | [0C] =>
178
+			 *   159 + 27904 + 3276800 + 201326592 =>
179
+			 *   204631455
180
+			 */
181
+			$val &= 0;
182
+			for ($i = 0; $i < $bytes; ++$i) {
183
+				$val |= ord($randomByteString[$i]) << ($i * 8);
184
+			}
185
+			/** @var int $val */
186
+
187
+			/**
188
+			 * Apply mask
189
+			 */
190
+			$val &= $mask;
191
+			$val += $valueShift;
192
+
193
+			++$attempts;
194
+			/**
195
+			 * If $val overflows to a floating point number,
196
+			 * ... or is larger than $max,
197
+			 * ... or smaller than $min,
198
+			 * then try again.
199
+			 */
200
+		} while (!is_int($val) || $val > $max || $val < $min);
201
+
202
+		return (int) $val;
203
+	}
204 204
 }
Please login to merge, or discard this patch.