Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
automatic_updates
Manage
Activity
Members
Labels
Plan
Wiki
Custom issue tracker
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Model registry
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
project
automatic_updates
Merge requests
!50
Issue
#3238647
: Create a service for easily accessing Composer information
Code
Review changes
Check out branch
Download
Patches
Plain diff
Merged
Issue
#3238647
: Create a service for easily accessing Composer information
issue/automatic_updates-3238647:3238647-create-a-service
into
8.x-2.x
Overview
14
Commits
45
Pipelines
0
Changes
30
Merged
Adam G-H
requested to merge
issue/automatic_updates-3238647:3238647-create-a-service
into
8.x-2.x
3 years ago
Overview
14
Commits
45
Pipelines
0
Changes
30
Expand
0
0
Merge request reports
Compare
8.x-2.x
version 40
f8823f08
3 years ago
version 39
51fa6a55
3 years ago
version 38
55601d31
3 years ago
version 37
229df77d
3 years ago
version 36
0b77addc
3 years ago
version 35
ac7ab2b1
3 years ago
version 34
b0db436d
3 years ago
version 33
020f0b54
3 years ago
version 32
25cf8a89
3 years ago
version 31
94edc89d
3 years ago
version 30
626f2789
3 years ago
version 29
0313e689
3 years ago
version 28
b932b3f6
3 years ago
version 27
5054e119
3 years ago
version 26
3b57561f
3 years ago
version 25
5be2b0dc
3 years ago
version 24
d11cbb89
3 years ago
version 23
912d6a43
3 years ago
version 22
2d7efd80
3 years ago
version 21
b0e24617
3 years ago
version 20
530cf352
3 years ago
version 19
138350e8
3 years ago
version 18
3fa6469b
3 years ago
version 17
cb1ac9fe
3 years ago
version 16
b0c64060
3 years ago
version 15
2e5991e4
3 years ago
version 14
d1d0ea60
3 years ago
version 13
941f8b54
3 years ago
version 12
afab0867
3 years ago
version 11
6134c306
3 years ago
version 10
c4bfe351
3 years ago
version 9
3056f21f
3 years ago
version 8
1951049f
3 years ago
version 7
646fc8c4
3 years ago
version 6
23a0663e
3 years ago
version 5
d072ea92
3 years ago
version 4
ed730f33
3 years ago
version 3
5bf23098
3 years ago
version 2
7e768dc2
3 years ago
version 1
33d70e06
3 years ago
8.x-2.x (base)
and
latest version
latest version
f8823f08
45 commits,
3 years ago
version 40
f8823f08
45 commits,
3 years ago
version 39
51fa6a55
43 commits,
3 years ago
version 38
55601d31
42 commits,
3 years ago
version 37
229df77d
41 commits,
3 years ago
version 36
0b77addc
40 commits,
3 years ago
version 35
ac7ab2b1
39 commits,
3 years ago
version 34
b0db436d
38 commits,
3 years ago
version 33
020f0b54
37 commits,
3 years ago
version 32
25cf8a89
36 commits,
3 years ago
version 31
94edc89d
34 commits,
3 years ago
version 30
626f2789
33 commits,
3 years ago
version 29
0313e689
32 commits,
3 years ago
version 28
b932b3f6
31 commits,
3 years ago
version 27
5054e119
30 commits,
3 years ago
version 26
3b57561f
29 commits,
3 years ago
version 25
5be2b0dc
28 commits,
3 years ago
version 24
d11cbb89
27 commits,
3 years ago
version 23
912d6a43
26 commits,
3 years ago
version 22
2d7efd80
25 commits,
3 years ago
version 21
b0e24617
24 commits,
3 years ago
version 20
530cf352
23 commits,
3 years ago
version 19
138350e8
22 commits,
3 years ago
version 18
3fa6469b
21 commits,
3 years ago
version 17
cb1ac9fe
19 commits,
3 years ago
version 16
b0c64060
18 commits,
3 years ago
version 15
2e5991e4
17 commits,
3 years ago
version 14
d1d0ea60
16 commits,
3 years ago
version 13
941f8b54
15 commits,
3 years ago
version 12
afab0867
14 commits,
3 years ago
version 11
6134c306
12 commits,
3 years ago
version 10
c4bfe351
11 commits,
3 years ago
version 9
3056f21f
9 commits,
3 years ago
version 8
1951049f
8 commits,
3 years ago
version 7
646fc8c4
7 commits,
3 years ago
version 6
23a0663e
6 commits,
3 years ago
version 5
d072ea92
5 commits,
3 years ago
version 4
ed730f33
4 commits,
3 years ago
version 3
5bf23098
3 commits,
3 years ago
version 2
7e768dc2
2 commits,
3 years ago
version 1
33d70e06
1 commit,
3 years ago
30 files
+
380
−
215
Side-by-side
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
30
Search (e.g. *.vue) (Ctrl+P)
package_manager/src/ComposerUtility.php
0 → 100644
+
147
−
0
Options
<?php
namespace
Drupal\package_manager
;
use
Composer\Composer
;
use
Composer\Factory
;
use
Composer\IO\NullIO
;
use
Drupal\Component\Serialization\Json
;
/**
* Defines a utility object to get information from Composer's API.
*/
class
ComposerUtility
{
/**
* The Composer instance.
*
* @var \Composer\Composer
*/
protected
$composer
;
/**
* The statically cached names of the Drupal core packages.
*
* @var string[]
*/
private
static
$corePackages
;
/**
* Constructs a new ComposerUtility object.
*
* @param \Composer\Composer $composer
* The Composer instance.
*/
public
function
__construct
(
Composer
$composer
)
{
$this
->
composer
=
$composer
;
}
/**
* Creates a utility object using the files in a given directory.
*
* @param string $dir
* The directory that contains composer.json and composer.lock.
*
* @return \Drupal\package_manager\ComposerUtility
* The utility object.
*/
public
static
function
createForDirectory
(
string
$dir
):
self
{
$io
=
new
NullIO
();
$configuration
=
$dir
.
DIRECTORY_SEPARATOR
.
'composer.json'
;
// The Composer factory requires that either the HOME or COMPOSER_HOME
// environment variables be set, so momentarily set the COMPOSER_HOME
// variable to the directory we're trying to create a Composer instance for.
// We have to do this because the Composer factory doesn't give us a way to
// pass the home directory in.
// @see \Composer\Factory::getHomeDir()
$home
=
getenv
(
'COMPOSER_HOME'
);
putenv
(
"COMPOSER_HOME=
$dir
"
);
$composer
=
Factory
::
create
(
$io
,
$configuration
);
putenv
(
"COMPOSER_HOME=
$home
"
);
return
new
static
(
$composer
);
}
/**
* Returns the canonical names of the supported core packages.
*
* @return string[]
* The canonical list of supported core package names, as listed in
* ../core_packages.json.
*/
protected
static
function
getCorePackageList
():
array
{
if
(
self
::
$corePackages
===
NULL
)
{
$file
=
__DIR__
.
'/../core_packages.json'
;
assert
(
file_exists
(
$file
),
"
$file
does not exist."
);
$core_packages
=
file_get_contents
(
$file
);
$core_packages
=
Json
::
decode
(
$core_packages
);
assert
(
is_array
(
$core_packages
),
"
$file
did not contain a list of core packages."
);
self
::
$corePackages
=
$core_packages
;
}
return
self
::
$corePackages
;
}
/**
* Returns the names of the core packages required in composer.json.
*
* All packages listed in ../core_packages.json are considered core packages.
*
* @return string[]
* The names of the required core packages.
*
* @throws \LogicException
* If neither drupal/core or drupal/core-recommended are required.
*
* @todo Make this return a keyed array of packages, not just names.
*/
public
function
getCorePackageNames
():
array
{
$requirements
=
array_keys
(
$this
->
composer
->
getPackage
()
->
getRequires
());
// Ensure that either drupal/core or drupal/core-recommended are required.
// If neither is, then core cannot be updated, which we consider an error
// condition.
// @todo Move this check to an update validator as part of
// https://www.drupal.org/project/automatic_updates/issues/3241105
$core_requirements
=
array_intersect
([
'drupal/core'
,
'drupal/core-recommended'
],
$requirements
);
if
(
empty
(
$core_requirements
))
{
$file
=
$this
->
composer
->
getConfig
()
->
getConfigSource
()
->
getName
();
throw
new
\LogicException
(
"Drupal core does not appear to be required in
$file
."
);
}
return
array_intersect
(
static
::
getCorePackageList
(),
$requirements
);
}
/**
* Returns all Drupal extension packages in the lock file.
*
* The following package types are considered Drupal extension packages:
* drupal-module, drupal-theme, drupal-custom-module, and drupal-custom-theme.
*
* @return \Composer\Package\PackageInterface[]
* All Drupal extension packages in the lock file, keyed by name.
*/
public
function
getDrupalExtensionPackages
():
array
{
$locked_packages
=
$this
->
composer
->
getLocker
()
->
getLockedRepository
(
TRUE
)
->
getPackages
();
$drupal_package_types
=
[
'drupal-module'
,
'drupal-theme'
,
'drupal-custom-module'
,
'drupal-custom-theme'
,
];
$drupal_packages
=
[];
foreach
(
$locked_packages
as
$package
)
{
if
(
in_array
(
$package
->
getType
(),
$drupal_package_types
,
TRUE
))
{
$key
=
$package
->
getName
();
$drupal_packages
[
$key
]
=
$package
;
}
}
return
$drupal_packages
;
}
}
Loading