2023-08-15 11:31:15 +02:00
|
|
|
// TODO: types (#22198)
|
2025-03-06 08:19:51 +01:00
|
|
|
import is from '@sindresorhus/is';
|
2021-11-02 09:46:22 +01:00
|
|
|
import { quote } from 'shlex';
|
2022-03-03 10:35:26 +01:00
|
|
|
import { GlobalConfig } from '../../../config/global';
|
|
|
|
import { logger } from '../../../logger';
|
2024-04-17 02:00:00 -03:00
|
|
|
import type { CombinedHostRule } from '../../../types';
|
2022-03-03 10:35:26 +01:00
|
|
|
import type { ToolConstraint } from '../../../util/exec/types';
|
2023-09-07 06:39:39 +02:00
|
|
|
import { coerceNumber } from '../../../util/number';
|
2020-11-26 11:09:16 +01:00
|
|
|
import { api, id as composerVersioningId } from '../../versioning/composer';
|
2021-11-02 09:46:22 +01:00
|
|
|
import type { UpdateArtifactsConfig } from '../types';
|
2023-05-07 23:51:20 +03:00
|
|
|
import type { Lockfile, PackageFile } from './schema';
|
2020-11-26 11:09:16 +01:00
|
|
|
|
|
|
|
export { composerVersioningId };
|
|
|
|
|
2021-11-14 07:02:53 +01:00
|
|
|
const depRequireInstall = new Set(['symfony/flex']);
|
|
|
|
|
2021-12-23 09:12:14 +01:00
|
|
|
export function getComposerArguments(
|
|
|
|
config: UpdateArtifactsConfig,
|
2023-11-07 12:50:29 -03:00
|
|
|
toolConstraint: ToolConstraint,
|
2021-12-23 09:12:14 +01:00
|
|
|
): string {
|
2021-11-02 09:46:22 +01:00
|
|
|
let args = '';
|
|
|
|
|
|
|
|
if (config.composerIgnorePlatformReqs) {
|
|
|
|
if (config.composerIgnorePlatformReqs.length === 0) {
|
2025-03-06 08:19:51 +01:00
|
|
|
if (
|
|
|
|
is.string(toolConstraint.constraint) &&
|
|
|
|
api.intersects!(toolConstraint.constraint, '^2.2')
|
|
|
|
) {
|
|
|
|
args += " --ignore-platform-req='ext-*' --ignore-platform-req='lib-*'";
|
|
|
|
} else {
|
|
|
|
args += ' --ignore-platform-reqs';
|
|
|
|
}
|
2021-11-02 09:46:22 +01:00
|
|
|
} else {
|
|
|
|
config.composerIgnorePlatformReqs.forEach((req) => {
|
|
|
|
args += ' --ignore-platform-req ' + quote(req);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
args += ' --no-ansi --no-interaction';
|
2021-11-23 21:10:45 +01:00
|
|
|
if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {
|
2021-11-14 07:02:53 +01:00
|
|
|
args += ' --no-scripts --no-autoloader';
|
|
|
|
}
|
|
|
|
|
2021-11-23 21:10:45 +01:00
|
|
|
if (!GlobalConfig.get('allowPlugins') || config.ignorePlugins) {
|
2021-11-14 07:02:53 +01:00
|
|
|
args += ' --no-plugins';
|
2021-11-02 09:46:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
2025-03-12 12:20:27 +01:00
|
|
|
export function getComposerUpdateArguments(
|
|
|
|
config: UpdateArtifactsConfig,
|
|
|
|
toolConstraint: ToolConstraint,
|
|
|
|
): string {
|
|
|
|
let args = getComposerArguments(config, toolConstraint);
|
|
|
|
|
|
|
|
if (
|
|
|
|
is.string(toolConstraint.constraint) &&
|
|
|
|
api.intersects!(toolConstraint.constraint, '>=2.7')
|
|
|
|
) {
|
|
|
|
args += ' --minimal-changes';
|
|
|
|
}
|
|
|
|
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
2022-04-20 06:19:59 +02:00
|
|
|
export function getPhpConstraint(
|
2023-11-07 12:50:29 -03:00
|
|
|
constraints: Record<string, string>,
|
2022-04-20 06:19:59 +02:00
|
|
|
): string | null {
|
2021-08-03 09:50:55 +02:00
|
|
|
const { php } = constraints;
|
|
|
|
|
|
|
|
if (php) {
|
|
|
|
logger.debug('Using php constraint from config');
|
|
|
|
return php;
|
2020-11-26 11:09:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2023-05-07 23:51:20 +03:00
|
|
|
export function requireComposerDependencyInstallation({
|
|
|
|
packages,
|
|
|
|
packagesDev,
|
|
|
|
}: Lockfile): boolean {
|
2021-11-14 07:02:53 +01:00
|
|
|
return (
|
2023-05-07 23:51:20 +03:00
|
|
|
packages.some((p) => depRequireInstall.has(p.name)) === true ||
|
|
|
|
packagesDev.some((p) => depRequireInstall.has(p.name)) === true
|
2021-11-14 07:02:53 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-08-01 13:02:55 +09:00
|
|
|
export function extractConstraints(
|
2023-05-07 23:51:20 +03:00
|
|
|
{ config, require, requireDev }: PackageFile,
|
2023-11-07 12:50:29 -03:00
|
|
|
{ pluginApiVersion }: Lockfile,
|
2020-11-26 11:09:16 +01:00
|
|
|
): Record<string, string> {
|
|
|
|
const res: Record<string, string> = { composer: '1.*' };
|
|
|
|
|
|
|
|
// extract php
|
2023-05-07 23:51:20 +03:00
|
|
|
const phpVersion = config?.platform.php;
|
|
|
|
if (phpVersion) {
|
|
|
|
const major = api.getMajor(phpVersion);
|
2023-09-07 06:39:39 +02:00
|
|
|
const minor = coerceNumber(api.getMinor(phpVersion));
|
|
|
|
const patch = coerceNumber(api.getPatch(phpVersion));
|
2022-08-29 07:31:33 +01:00
|
|
|
res.php = `<=${major}.${minor}.${patch}`;
|
2023-05-07 23:51:20 +03:00
|
|
|
} else if (require.php) {
|
|
|
|
res.php = require.php;
|
2020-11-26 11:09:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// extract direct composer dependency
|
2023-05-07 23:51:20 +03:00
|
|
|
if (require['composer/composer']) {
|
|
|
|
res.composer = require['composer/composer'];
|
|
|
|
} else if (requireDev['composer/composer']) {
|
|
|
|
res.composer = requireDev['composer/composer'];
|
2020-11-26 11:09:16 +01:00
|
|
|
}
|
2021-12-18 21:55:13 +01:00
|
|
|
// composer platform package
|
2025-02-20 12:31:13 +01:00
|
|
|
else if (require.composer) {
|
|
|
|
res.composer = require.composer;
|
|
|
|
} else if (requireDev.composer) {
|
|
|
|
res.composer = requireDev.composer;
|
2021-12-18 21:55:13 +01:00
|
|
|
}
|
2020-11-26 11:09:16 +01:00
|
|
|
// check last used composer version
|
2023-05-07 23:51:20 +03:00
|
|
|
else if (pluginApiVersion) {
|
|
|
|
const major = api.getMajor(pluginApiVersion);
|
|
|
|
const minor = api.getMinor(pluginApiVersion);
|
2021-12-18 22:06:36 +01:00
|
|
|
res.composer = `^${major}.${minor}`;
|
2020-11-26 11:09:16 +01:00
|
|
|
}
|
|
|
|
// check composer api dependency
|
2023-05-07 23:51:20 +03:00
|
|
|
else if (require['composer-runtime-api']) {
|
|
|
|
const major = api.getMajor(require['composer-runtime-api']);
|
|
|
|
const minor = api.getMinor(require['composer-runtime-api']);
|
2021-12-18 22:06:36 +01:00
|
|
|
res.composer = `^${major}.${minor}`;
|
2020-11-26 11:09:16 +01:00
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
2023-01-13 08:33:49 -05:00
|
|
|
|
2024-04-17 02:00:00 -03:00
|
|
|
export function isArtifactAuthEnabled(rule: CombinedHostRule): boolean {
|
2023-04-17 08:16:02 +02:00
|
|
|
return !rule.artifactAuth || rule.artifactAuth.includes('composer');
|
|
|
|
}
|