mirror of
				https://github.com/shivammathur/setup-php.git
				synced 2025-10-31 15:26:23 +07:00 
			
		
		
		
	Allow extensions to be compiled from GitHub sources
This commit is contained in:
		 Andreas Braun
					Andreas Braun
				
			
				
					committed by
					
						 Shivam Mathur
						Shivam Mathur
					
				
			
			
				
	
			
			
			 Shivam Mathur
						Shivam Mathur
					
				
			
						parent
						
							912f27c42c
						
					
				
				
					commit
					f42065d568
				
			
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							| @ -117,7 +117,7 @@ On all supported OS/Platforms the following PHP versions are supported as per th | ||||
|  | ||||
| PHP extensions can be setup using the `extensions` input. It accepts a `string` in csv-format. | ||||
|  | ||||
| - On `Ubuntu`, extensions which are available as a package or available on `PECL` can be setup. | ||||
| - On `Ubuntu`, extensions which are available as a package, available on `PECL`, or hosted on GitHub can be setup. | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP with PECL extension | ||||
| @ -129,7 +129,7 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string` | ||||
|  | ||||
| - On `Windows`, extensions available on `PECL` which have the `DLL` binary can be setup. | ||||
|  | ||||
| - On `macOS`, extensions available on `PECL` can be installed. | ||||
| - On `macOS`, extensions available on `PECL` or hosted on GitHub can be installed. | ||||
|  | ||||
| - Extensions installed along with PHP if specified are enabled. | ||||
|  | ||||
| @ -192,6 +192,18 @@ PHP extensions can be setup using the `extensions` input. It accepts a `string` | ||||
|     fail-fast: true | ||||
| ``` | ||||
|  | ||||
| - Extensions can be compiled from source if they are hosted on GitHub. In this case, the version specification contains the repository and branch/tag to clone:  | ||||
|  | ||||
| ```yaml | ||||
| - name: Setup PHP and remove shared extension | ||||
|   uses: shivammathur/setup-php@v2 | ||||
|   with: | ||||
|     php-version: '7.4'   | ||||
|     extensions: mongodb-mongodb/mongo-php-driver@v1.9 | ||||
| ``` | ||||
|  | ||||
| The version can be a branch name or tag as supported by `git clone -b <name>`. The clone is performed recursively, i.e. submodules will be cloned as well. | ||||
|  | ||||
| ## :wrench: Tools Support | ||||
|  | ||||
| These tools can be setup globally using the `tools` input. It accepts a string in csv-format. | ||||
|  | ||||
| @ -58,6 +58,15 @@ describe('Extension tests', () => { | ||||
|  | ||||
|     win32 = await extensions.addExtension('blackfire-1.31.0', '7.3', 'win32'); | ||||
|     expect(win32).toContain('Add-Blackfire blackfire-1.31.0'); | ||||
|  | ||||
|     win32 = await extensions.addExtension( | ||||
|       'mongodb-mongodb/mongo-php-driver@master', | ||||
|       '7.3', | ||||
|       'win32' | ||||
|     ); | ||||
|     expect(win32).toContain( | ||||
|       'Add-Log "$cross" "mongodb-mongodb/mongo-php-driver@master" "mongodb-mongodb/mongo-php-driver@master is not supported on PHP 7.3"' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking addExtensionOnLinux', async () => { | ||||
| @ -131,6 +140,15 @@ describe('Extension tests', () => { | ||||
|  | ||||
|     linux = await extensions.addExtension('intl-68.2', '8.0', 'linux'); | ||||
|     expect(linux).toContain('add_intl intl-68.2'); | ||||
|  | ||||
|     linux = await extensions.addExtension( | ||||
|       'mongodb-mongodb/mongo-php-driver@master', | ||||
|       '7.3', | ||||
|       'linux' | ||||
|     ); | ||||
|     expect(linux).toContain( | ||||
|       'add_extension_from_github mongodb mongodb mongo-php-driver master' | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('checking addExtensionOnDarwin', async () => { | ||||
| @ -220,5 +238,14 @@ describe('Extension tests', () => { | ||||
|  | ||||
|     darwin = await extensions.addExtension('xdebug', '7.2', 'openbsd'); | ||||
|     expect(darwin).toContain('Platform openbsd is not supported'); | ||||
|  | ||||
|     darwin = await extensions.addExtension( | ||||
|       'mongodb-mongodb/mongo-php-driver@master', | ||||
|       '7.3', | ||||
|       'darwin' | ||||
|     ); | ||||
|     expect(darwin).toContain( | ||||
|       'add_extension_from_github mongodb mongodb mongo-php-driver master' | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										19
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -2901,6 +2901,13 @@ async function addExtensionDarwin(extension_csv, version) { | ||||
|         const version_extension = version + extension; | ||||
|         const [ext_name, ext_version] = extension.split('-'); | ||||
|         const ext_prefix = await utils.getExtensionPrefix(ext_name); | ||||
|         // Install extensions from a GitHub tarball. This needs to be checked first | ||||
|         // as the version may also match the semver check below. | ||||
|         const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/); | ||||
|         if (urlMatches != null) { | ||||
|             add_script += await utils.joins('\nadd_extension_from_github', ext_name, urlMatches[1], urlMatches[2], urlMatches[3], ext_prefix); | ||||
|             return; | ||||
|         } | ||||
|         switch (true) { | ||||
|             // match :extension | ||||
|             case /^:/.test(ext_name): | ||||
| @ -2987,6 +2994,11 @@ async function addExtensionWindows(extension_csv, version) { | ||||
|             case /.*-(stable|beta|alpha|devel|snapshot)/.test(version_extension): | ||||
|                 add_script += await utils.joins('\nAdd-Extension', ext_name, ext_version.replace('stable', '')); | ||||
|                 break; | ||||
|             // match extensions from GitHub. Do this before checking for semver as | ||||
|             // the version may match that as well | ||||
|             case /.*-(.*)\/(.*)@(.*)/.test(extension): | ||||
|                 add_script += await utils.getUnsupportedLog(extension, version, 'win32'); | ||||
|                 break; | ||||
|             // match semver without state | ||||
|             case /.*-\d+\.\d+\.\d+$/.test(version_extension): | ||||
|                 add_script += await utils.joins('\nAdd-Extension', ext_name, 'stable', ext_version); | ||||
| @ -3044,6 +3056,13 @@ async function addExtensionLinux(extension_csv, version) { | ||||
|         const version_extension = version + extension; | ||||
|         const [ext_name, ext_version] = extension.split('-'); | ||||
|         const ext_prefix = await utils.getExtensionPrefix(ext_name); | ||||
|         // Install extensions from a GitHub tarball. This needs to be checked first | ||||
|         // as the version may also match the semver check below. | ||||
|         const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/); | ||||
|         if (urlMatches != null) { | ||||
|             add_script += await utils.joins('\nadd_extension_from_github', ext_name, urlMatches[1], urlMatches[2], urlMatches[3], ext_prefix); | ||||
|             return; | ||||
|         } | ||||
|         switch (true) { | ||||
|             // Match :extension | ||||
|             case /^:/.test(ext_name): | ||||
|  | ||||
| @ -17,6 +17,22 @@ export async function addExtensionDarwin( | ||||
|     const version_extension: string = version + extension; | ||||
|     const [ext_name, ext_version]: string[] = extension.split('-'); | ||||
|     const ext_prefix = await utils.getExtensionPrefix(ext_name); | ||||
|  | ||||
|     // Install extensions from a GitHub tarball. This needs to be checked first | ||||
|     // as the version may also match the semver check below. | ||||
|     const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/); | ||||
|     if (urlMatches != null) { | ||||
|       add_script += await utils.joins( | ||||
|         '\nadd_extension_from_github', | ||||
|         ext_name, | ||||
|         urlMatches[1], | ||||
|         urlMatches[2], | ||||
|         urlMatches[3], | ||||
|         ext_prefix | ||||
|       ); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     switch (true) { | ||||
|       // match :extension | ||||
|       case /^:/.test(ext_name): | ||||
| @ -142,6 +158,15 @@ export async function addExtensionWindows( | ||||
|           ext_version.replace('stable', '') | ||||
|         ); | ||||
|         break; | ||||
|       // match extensions from GitHub. Do this before checking for semver as | ||||
|       // the version may match that as well | ||||
|       case /.*-(.*)\/(.*)@(.*)/.test(extension): | ||||
|         add_script += await utils.getUnsupportedLog( | ||||
|           extension, | ||||
|           version, | ||||
|           'win32' | ||||
|         ); | ||||
|         break; | ||||
|       // match semver without state | ||||
|       case /.*-\d+\.\d+\.\d+$/.test(version_extension): | ||||
|         add_script += await utils.joins( | ||||
| @ -214,6 +239,22 @@ export async function addExtensionLinux( | ||||
|     const version_extension: string = version + extension; | ||||
|     const [ext_name, ext_version]: string[] = extension.split('-'); | ||||
|     const ext_prefix = await utils.getExtensionPrefix(ext_name); | ||||
|  | ||||
|     // Install extensions from a GitHub tarball. This needs to be checked first | ||||
|     // as the version may also match the semver check below. | ||||
|     const urlMatches = extension.match(/.*-(.*)\/(.*)@(.*)/); | ||||
|     if (urlMatches != null) { | ||||
|       add_script += await utils.joins( | ||||
|         '\nadd_extension_from_github', | ||||
|         ext_name, | ||||
|         urlMatches[1], | ||||
|         urlMatches[2], | ||||
|         urlMatches[3], | ||||
|         ext_prefix | ||||
|       ); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     switch (true) { | ||||
|       // Match :extension | ||||
|       case /^:/.test(ext_name): | ||||
|  | ||||
| @ -39,6 +39,24 @@ add_pecl_extension() { | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install extension from a GitHub repository | ||||
| add_extension_from_github() { | ||||
|   extension=$1 | ||||
|   org=$2 | ||||
|   repo=$3 | ||||
|   release=$4 | ||||
|   prefix=$5 | ||||
|   ( | ||||
|     add_devtools phpize | ||||
|     delete_extension "$extension" | ||||
|     git clone --recurse-submodules -b "$release" https://github.com/"$org"/"$repo" /tmp/"$repo-$release" || exit 1 | ||||
|     cd /tmp/"$repo-$release" || exit 1 | ||||
|     phpize && ./configure && make -j"$(nproc)" && sudo make install | ||||
|     enable_extension "$extension" "$prefix" | ||||
|   ) >/dev/null 2>&1 | ||||
|   add_extension_log "$extension-$org/$repo@$release" "Installed and enabled" | ||||
| } | ||||
|  | ||||
| # Function to fetch a brew tap | ||||
| fetch_brew_tap() { | ||||
|   tap=$1 | ||||
|  | ||||
| @ -148,23 +148,22 @@ add_pecl_extension() { | ||||
|   fi | ||||
| } | ||||
|  | ||||
| # Function to install extension from source | ||||
| add_extension_from_source() { | ||||
| # Function to install extension from a GitHub repository | ||||
| add_extension_from_github() { | ||||
|   extension=$1 | ||||
|   repo=$2 | ||||
|   release=$3 | ||||
|   args=$4 | ||||
|   org=$2 | ||||
|   repo=$3 | ||||
|   release=$4 | ||||
|   prefix=$5 | ||||
|   ( | ||||
|     add_devtools phpize | ||||
|     delete_extension "$extension" | ||||
|     get -q -n "/tmp/$extension.tar.gz" "https://github.com/$repo/archive/$release.tar.gz" | ||||
|     tar xf /tmp/"$extension".tar.gz -C /tmp | ||||
|     cd /tmp/"$extension-$release" || exit 1 | ||||
|     phpize && ./configure "$args" && make -j"$(nproc)" && sudo make install | ||||
|     git clone --recurse-submodules -b "$release" https://github.com/"$org"/"$repo" /tmp/"$repo-$release" || exit 1 | ||||
|     cd /tmp/"$repo-$release" || exit 1 | ||||
|     phpize && ./configure && make -j"$(nproc)" && sudo make install | ||||
|     enable_extension "$extension" "$prefix" | ||||
|   ) >/dev/null 2>&1 | ||||
|   add_extension_log "$extension-$release" "Installed and enabled" | ||||
|   add_extension_log "$extension-$org/$repo@$release" "Installed and enabled" | ||||
| } | ||||
|  | ||||
| # Function to setup phpize and php-config. | ||||
|  | ||||
		Reference in New Issue
	
	Block a user