Skip to content
Snippets Groups Projects
Commit 3e88f84d authored by Neil Drumm's avatar Neil Drumm :wave:
Browse files

Issue #3460885: Stop updating Composer 1 metadata

parent e4cc39c6
Branches
Tags
No related merge requests found
Pipeline #252964 passed with warnings
......@@ -14,7 +14,6 @@ module_load_include('drupal.inc', 'project_composer');
define('PROJECT_COMPOSER_DEPENDENCY_REQUIRED', 0);
define('PROJECT_COMPOSER_DEPENDENCY_RECOMMENDED', 1);
define('PROJECT_COMPOSER_METADATA_ALL', "ALL");
define('PROJECT_COMPOSER_METADATA_TAGGED', "TAGGED");
define('PROJECT_COMPOSER_METADATA_DEV', "DEV");
......@@ -64,7 +63,6 @@ function project_composer_menu() {
*/
function project_composer_process_release($release_node) {
$release_wrapper = entity_metadata_wrapper('node', $release_node);
$provider_includes_to_rebuild = [];
// Get the parent project node, because providers data is
// Tied to the project level.
$project_node = node_load(project_release_get_release_project_nid($release_node));
......@@ -91,19 +89,16 @@ function project_composer_process_release($release_node) {
return;
}
// The provider file that this release will be included in.
$provider_include_grouping = date('Y', $release_node->changed) . '-' . (floor((date('m', $release_node->changed)/4))+1);
$package_name = _project_composer_get_packagename($release_category, $project_machine_name, NULL, $project_node->nid);
// Create the metadata for the project file
foreach ([PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV, PROJECT_COMPOSER_METADATA_ALL] as $filetype) {
foreach ([PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV] as $filetype) {
$json = project_composer_get_project_json($release_category, $project_node, $package_name, $filetype);
if (!$json) {
continue;
}
$filedata = project_composer_write_json($release_category, $json, $package_name, $filetype);
// Adds the "lenient" facade that removes any requirement on drupal/core.
if ($release_category == 'current' && $filetype != PROJECT_COMPOSER_METADATA_ALL) {
if ($release_category == 'current') {
// Delete the file
$fullpath = _project_composer_get_metadata_file_dir('lenient') . '/' . $filedata['filename'];
......@@ -125,19 +120,6 @@ function project_composer_process_release($release_node) {
$url = url($fullpath, ['absolute' => TRUE]);
drupalorg_crosssite_fastly_purge_url($url);
}
if ($filetype == PROJECT_COMPOSER_METADATA_ALL) {
// Add new provider files to list that needs to be (re)built
$project_composer_provider_info[$package_name . '-' . $release_category] = [
'project_nid' => $project_node->nid,
'provider_name' => $package_name,
'release_category' => $release_category,
'provider_type' => 'package',
'filename' => $filedata['filename'],
'sha256' => $filedata['hash'],
'provider_include_grouping' => $provider_include_grouping,
];
}
}
watchdog('project_composer', 'Project Composer Processing %pmn for %release_category.', array('%pmn' => $project_machine_name, '%release_category' => $release_category));
......@@ -155,14 +137,14 @@ function project_composer_process_release($release_node) {
// Skip the component that matches the project name - we only need the metapackages
if (drupal_strtolower($component_name) != drupal_strtolower($project_machine_name)) {
foreach ([PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV, PROJECT_COMPOSER_METADATA_ALL] as $filetype) {
foreach ([PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV] as $filetype) {
$json = project_composer_get_component_json($release_category, $component_name, $project_node, $filetype);
// Adds the "lenient" facade that removes any requirement on drupal/core.
if (!$json) {
continue;
}
$filedata = project_composer_write_json($release_category, $json, $package_name, $filetype);
if ($release_category == 'current' && $filetype != PROJECT_COMPOSER_METADATA_ALL) {
if ($release_category == 'current') {
// Delete the file
$fullpath = _project_composer_get_metadata_file_dir('lenient') . '/' . $filedata['filename'];
......@@ -183,59 +165,24 @@ function project_composer_process_release($release_node) {
$url = url($fullpath, ['absolute' => TRUE]);
drupalorg_crosssite_fastly_purge_url($url);
}
if ($filetype == PROJECT_COMPOSER_METADATA_ALL) {
if ($filedata['filename'] != 'error') {
$project_composer_provider_info[$component_name . '-' . $release_category] = [
'project_nid' => $project_node->nid,
'provider_name' => $package_name,
'release_category' => $release_category,
'provider_type' => 'metapackage',
'filename' => $filedata['filename'],
'sha256' => $filedata['hash'],
'provider_include_grouping' => $provider_include_grouping,
];
}
}
}
}
}
}
// Retrieve existing provider files for this project
$current_provider_files = _project_composer_get_project_providers($release_category, $project_node->nid);
// Gather a list of provider_include files to recreated
foreach ($project_composer_provider_info as $provider) {
// Update the provider if it already exists for this api and project.
if ($existing_provder = _project_composer_get_project_providers($provider['release_category'], $provider['project_nid'], $provider['provider_name'])) {
// Add the former provider_include file as the data has moved/changed.
$provider_includes_to_rebuild[$existing_provder[0]->provider_include_grouping . '-' . $existing_provder[0]->release_category] = TRUE;
$provider['provider_id'] = $existing_provder[0]->provider_id;
drupal_write_record('project_composer_providers', $provider, 'provider_id');
$provder_list[] = $provider['provider_name'];
if ($existing_provder[0]->filename != $provider['filename']) {
_project_composer_delete_file($existing_provder[0]->release_category, "drupal/{$existing_provder[0]->filename}");
}
}
else {
// Otherwise its a new one.
drupal_write_record('project_composer_providers', $provider);
$provder_list[] = $provider['provider_name'];
}
// Build the destination of this provider.
$provider_includes_to_rebuild[$provider['provider_include_grouping'] . '-' . $provider['release_category']] = TRUE;
}
// Loop through the files we had before we updated, and get rid of any files we no longer care about.
foreach ($current_provider_files as $prior_file) {
if (!in_array($prior_file->provider_name, $provder_list)){
$provider_includes_to_rebuild[$prior_file->provider_include_grouping . '-' . $prior_file->release_category] = TRUE;
_project_composer_delete_file($prior_file->release_category, "drupal/{$prior_file->filename}");
_project_composer_delete_providers($prior_file->release_category, $prior_file->project_nid, $prior_file->provider_name);
// Rebuild packages.json. todo can move to a separate process, will not change frequently.
$release_categories = [$release_category];
if ($release_category === 'current') {
$release_categories[] = 'lenient';
}
foreach ($release_categories as $release_category) {
$path = _project_composer_get_metadata_file_dir($release_category) . '/packages.json';
if (!file_unmanaged_save_data(drupal_json_encode(project_composer_root_metadata_data($release_category)), $path, FILE_EXISTS_REPLACE)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($path);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
}
project_composer_purge_packages_url(url(preg_replace('|public://packages/|', '', $path), ['absolute' => TRUE]));
}
project_composer_manage_provider_includes(array_keys($provider_includes_to_rebuild));
}
/**
......@@ -263,66 +210,6 @@ function _project_composer_get_release_nids($project_nid, $release_category) {
return array_keys($result['node']);
}
/**
* @param $includes
*/
function project_composer_manage_provider_includes($includes) {
$project_composer_include_info = [];
$release_categories = [];
foreach ($includes as $include_group) {
list($year, $month, $release_category) = explode('-', $include_group);
$release_categories[$release_category] = TRUE;
$include_group = $year . '-' . $month;
$json = project_composer_get_provider_include_json($release_category, $include_group);
if (!empty($json)) {
$filedata = project_composer_write_include_json($release_category, $json, $include_group);
if ($filedata['filename'] != 'error') {
$project_composer_include_info[$include_group . $release_category] = [
'release_category' => $release_category,
'filename' => $filedata['filename'],
'sha256' => $filedata['hash'],
'provider_include_grouping' => $include_group,
];
}
}
else {
$existing_include = _project_composer_get_provider_includes($release_category, $include_group);
if (isset($existing_include)) {
_project_composer_delete_file($existing_include[0]->release_category, "drupal/{$existing_include[0]->filename}");
_project_composer_delete_provider_include($release_category, $include_group);
}
}
}
// Gather a list of provider_include files to recreated
foreach ($project_composer_include_info as $provider_include) {
// Update the provider if it already exists for this api and project.
if ($existing_provder = _project_composer_get_provider_includes($provider_include['release_category'], $provider_include['provider_include_grouping'])) {
$provider_include['provider_include_id'] = $existing_provder[0]->provider_include_id;
drupal_write_record('project_composer_provider_includes', $provider_include, 'provider_include_id');
// Delete the old include file if the sha's changed.
if ($existing_provder[0]->filename != $provider_include['filename']){
_project_composer_delete_file($existing_provder[0]->release_category, "drupal/{$existing_provder[0]->filename}");
}
} else {
// Otherwise its a new one.
drupal_write_record('project_composer_provider_includes', $provider_include);
}
}
if (isset($release_categories['current'])) {
$release_categories['lenient'] = TRUE;
}
foreach (array_keys($release_categories) as $release_category) {
$path = _project_composer_get_metadata_file_dir($release_category) . '/packages.json';
if (!file_unmanaged_save_data(drupal_json_encode(project_composer_root_metadata_data($release_category)), $path, FILE_EXISTS_REPLACE)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($path);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
}
project_composer_purge_packages_url(url(preg_replace('|public://packages/|', '', $path), ['absolute' => TRUE]));
}
}
/**
* Returns the data structure for the root composer.json.
*
......@@ -337,7 +224,7 @@ function project_composer_root_metadata_data($release_category) {
'metadata-url' => '/files/packages/' . $core_version_string . '/p2/%package%.json',
'available-package-patterns' => ['drupal/*'],
'search' => '/' . $core_version_string . '/search.json?s=%query%',
'warning' => 'New Drupal.org packages & releases will not be available for Composer 1 after August 12, 2024. Composer 1 support will be dropped after October 1, 2024. You should upgrade to Composer 2 now. See https://www.drupal.org/drupalorg/blog/ending-packagesdrupalorg-support-for-composer-1',
'warning' => 'New Drupal.org packages & releases ARE NOT AVAILABLE FOR COMPOSER 1!! Composer 1 support will be dropped after October 1, 2024. You should upgrade to Composer 2 now. See https://www.drupal.org/drupalorg/blog/ending-packagesdrupalorg-support-for-composer-1',
'warning-versions' => '<1.99',
'provider-includes' => [],
];
......@@ -368,45 +255,6 @@ function project_composer_root_metadata_data($release_category) {
return $metadata;
}
/**
* Outputs package metadata for projects of node type $type.
*
* @param string $release_category
* Either 'legacy' or 'current'.
* @param string $provider_grouping
* Provider include grouping, like 'YYYY-Q'.
*
* @return bool|string
*/
function project_composer_get_provider_include_json($release_category, $provider_grouping) {
$provider_data = [];
$core_version_string = project_composer_core_version_string_from_release_category($release_category);
// Query for all of the data that matches the file.
$query = db_select('project_composer_providers', 'pcp');
$result = $query->fields('pcp')
->where('(pcp.provider_include_grouping = :provider_include_grouping)', [':provider_include_grouping' => $provider_grouping])
->where('(pcp.release_category = :release_category)', [
':release_category' => $release_category,
])
->execute()
->fetchAll();
if (!empty($result)) {
$provider_data = ["providers" => []];
}
foreach ($result as $provider) {
$provider_data['providers']['drupal/' . check_plain($provider->provider_name)]['sha256'] = $provider->sha256;
if (variable_get('project_composer_debug_mode', FALSE)) {
$provider_data['providers']['drupal/' . check_plain($provider->provider_name)]['url'] = url('files/packages/' . $core_version_string . '/drupal/' . $provider->provider_name . '$' . $provider->sha256 . '.json', ['absolute' => TRUE]);
}
}
if (!empty($provider_data)) {
return $provider_data;
} else {
return FALSE;
}
}
/**
* Creates the jsons for a project.
*
......@@ -417,11 +265,11 @@ function project_composer_get_provider_include_json($release_category, $provider
* @param $package_name
*
* @param $build_type
* one of PROJECT_COMPOSER_METADATA_ALL/DEV/TAGGED
* one of PROJECT_COMPOSER_METADATA_DEV/TAGGED
*
* @return string
*/
function project_composer_get_project_json($release_category, $project_node, $package_name, $build_type = PROJECT_COMPOSER_METADATA_ALL) {
function project_composer_get_project_json($release_category, $project_node, $package_name, $build_type) {
$package_data = [];
$core_version_string = project_composer_core_version_string_from_release_category($release_category);
$drupal_packagename = project_composer_get_drupal_packagename($core_version_string);
......@@ -502,17 +350,15 @@ function project_composer_get_project_json($release_category, $project_node, $pa
return FALSE;
}
if (in_array($build_type,[PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV])) {
// Minify for Composer 2.
$list = array_keys($package_data['packages'][$project_package_name]);
$sorted_versions = Semver::rsort($list);
$sorted_packages = [];
foreach ($sorted_versions as $version) {
$sorted_packages[] = $package_data['packages'][$project_package_name][$version];
}
$package_data['packages'][$project_package_name] = minify($sorted_packages);
$package_data['minified'] = "composer/2.0";
// Minify for Composer 2.
$list = array_keys($package_data['packages'][$project_package_name]);
$sorted_versions = Semver::rsort($list);
$sorted_packages = [];
foreach ($sorted_versions as $version) {
$sorted_packages[] = $package_data['packages'][$project_package_name][$version];
}
$package_data['packages'][$project_package_name] = minify($sorted_packages);
$package_data['minified'] = "composer/2.0";
// Security advisories.
if ($build_type === PROJECT_COMPOSER_METADATA_TAGGED && ($security_advisories = project_composer_get_security_advisory_json([$project_node->nid]))) {
......@@ -578,7 +424,7 @@ function project_composer_get_security_advisory_json($project_nids, $updated_sin
* @return string
* @throws \EntityMetadataWrapperException
*/
function project_composer_get_component_json($release_category, $component_name, $project_node, $build_type = PROJECT_COMPOSER_METADATA_ALL) {
function project_composer_get_component_json($release_category, $component_name, $project_node, $build_type) {
$package_data = [];
$core_version_string = project_composer_core_version_string_from_release_category($release_category);
$project_wrapper = entity_metadata_wrapper('node', $project_node);
......@@ -618,13 +464,9 @@ function project_composer_get_component_json($release_category, $component_name,
}
// set this so that downstream knows its a metapackage
$package_data['packages'][$component_package_name][$version]['type'] = 'metapackage';
if ($build_type !== PROJECT_COMPOSER_METADATA_ALL) {
$package_data['packages'][$component_package_name][$version]['require'][$parent_package_name] = '^' . $release_wrapper->field_release_version_major->value();
} else {
$package_data['packages'][$component_package_name][$version]['require'][$parent_package_name] = 'self.version';
}
$package_data['packages'][$component_package_name][$version]['require'][$parent_package_name] = '^' . $release_wrapper->field_release_version_major->value();
$package_data = _project_composer_build_component_metadata($component_package, $package_data, $version, $component, $release_category);
$package_data = _project_composer_build_component_metadata($component_package, $package_data, $version, $component, $release_category, $build_type);
// set it again just in case there is a composer.json that sets the type to drupal-module.
$package_data['packages'][$component_package_name][$version]['type'] = 'metapackage';
unset($package_data['packages'][$component_package_name][$version]['dist']);
......@@ -639,21 +481,20 @@ function project_composer_get_component_json($release_category, $component_name,
}
if (!$has_releases) {
$package_data = [
return [
'status' => 'error',
'message' => 'Package not found'
];
}
else if (in_array($build_type, [PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV])) {
$list = array_keys($package_data['packages'][$component_package_name]);
$sorted_versions = Semver::rsort($list);
$sorted_packages = [];
foreach ($sorted_versions as $version) {
$sorted_packages[] = $package_data['packages'][$component_package_name][$version];
}
$package_data['packages'][$component_package_name] = minify($sorted_packages);
$package_data['minified'] = "composer/2.0";
$list = array_keys($package_data['packages'][$component_package_name]);
$sorted_versions = Semver::rsort($list);
$sorted_packages = [];
foreach ($sorted_versions as $version) {
$sorted_packages[] = $package_data['packages'][$component_package_name][$version];
}
$package_data['packages'][$component_package_name] = minify($sorted_packages);
$package_data['minified'] = "composer/2.0";
return $package_data;
}
......@@ -793,7 +634,7 @@ function _project_composer_release_metadata($release, $project, $keywords, $proj
*
* @return mixed
*/
function _project_composer_build_component_metadata($package, &$package_data, $version, $component, $release_category, $build_type = PROJECT_COMPOSER_METADATA_ALL) {
function _project_composer_build_component_metadata($package, &$package_data, $version, $component, $release_category, $build_type) {
$semver = new VersionParser();
$project_package_name = "drupal/" . $package;
$core_version_string = project_composer_core_version_string_from_release_category($release_category);
......@@ -1638,71 +1479,6 @@ function _project_composer_get_provider_includes($release_category, $grouping =
return $result;
}
/**
* Delete the record of a provider include grouping.
*
* @param string $release_category
* Either 'legacy' or 'current'.
* @param string $grouping
* Provider include grouping, like 'YYYY-Q'.
*/
function _project_composer_delete_provider_include($release_category, $grouping) {
db_delete('project_composer_provider_includes')
->condition('provider_include_grouping', $grouping)
->condition('release_category', $release_category)
->execute();
}
/**
* Gets current providers associated with a particular project.
*
* @param string $release_category
* Either 'legacy' or 'current'.
* @param int $project_nid
* A project node ID.
* @param string|null $provider_name
* The provider name, a project name, or sub-module/theme/etc name.
*
* @return array
* Gets current providers associated with a particular project.
*/
function _project_composer_get_project_providers($release_category, $project_nid, $provider_name = NULL) {
$query = db_select('project_composer_providers', 'pcp');
$query->fields('pcp')
->where('(pcp.project_nid = :project_nid)', [':project_nid' => $project_nid])
->where('(pcp.release_category = :release_category)', [
':release_category' => $release_category,
]);
if (isset($provider_name)){
$query->where('(pcp.provider_name = :provider_name)', [':provider_name' => $provider_name]);
}
$result = $query->execute()
->fetchAll();
return $result;
}
/**
* Delete a provider by release category, project, and name.
*
* @param string $release_category
* Either 'legacy' or 'current'.
* @param int $project_nid
* A project node ID.
* @param string $provider_name
* The provider name, a project name, or sub-module/theme/etc name.
*/
function _project_composer_delete_providers($release_category, $project_nid, $provider_name) {
db_delete('project_composer_providers')
->condition('project_nid', $project_nid)
->condition('provider_name', $provider_name)
->condition('release_category', $release_category)
->execute();
}
/**
* Takes in a project and optional component name and returns the composer package name.
*
......@@ -1881,11 +1657,10 @@ function _project_composer_get_metadata_file_dir($release_category) {
*
* @return array
*/
function project_composer_write_json($release_category, $json, $packagename = NULL, $build_type = PROJECT_COMPOSER_METADATA_ALL) {
function project_composer_write_json($release_category, $json, $packagename, $build_type) {
$json = json_encode($json, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
$sha256key = hash('sha256', $json);
$filename = project_composer_get_filename($packagename, $build_type, $sha256key);
$filename = project_composer_get_filename($packagename, $build_type);
// Make sure we've got the right project-specific subdirectory.
$project_dir = _project_composer_get_metadata_file_dir($release_category);
......@@ -1893,81 +1668,42 @@ function project_composer_write_json($release_category, $json, $packagename = NU
if (!file_prepare_directory($full_project_dir , FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($project_dir);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
return ['hash' => 'error', 'filename' => 'error'];
return ['filename' => 'error'];
}
// Write out file.
$filepath = $project_dir . '/' . $filename;
if (!_project_composer_save_file($filepath, $json, $build_type)){
return ['hash' => 'error', 'filename' => 'error'];
return ['filename' => 'error'];
}
if (in_array($build_type, [PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV])) {
db_merge('project_composer_update_log')
->key([
'category' => $release_category,
'package' => $packagename . ($build_type === PROJECT_COMPOSER_METADATA_DEV ? '~dev' : ''),
])
->fields([
'updated' => filemtime($filepath),
'deleted' => 0,
])
->execute();
}
db_merge('project_composer_update_log')
->key([
'category' => $release_category,
'package' => $packagename . ($build_type === PROJECT_COMPOSER_METADATA_DEV ? '~dev' : ''),
])
->fields([
'updated' => filemtime($filepath),
'deleted' => 0,
])
->execute();
return ['hash' => $sha256key, 'filename' => $filename];
return ['filename' => $filename];
}
/**
* Get the filename for a package name & build type.
*/
function project_composer_get_filename($packagename, $build_type, $sha256key = NULL) {
function project_composer_get_filename($packagename, $build_type) {
switch ($build_type) {
case PROJECT_COMPOSER_METADATA_TAGGED:
return 'p2/drupal/' . $packagename . '.json';
case PROJECT_COMPOSER_METADATA_DEV:
return 'p2/drupal/' . $packagename . '~dev.json';
default:
return 'drupal/' . $packagename . '$' . $sha256key . '.json';
}
}
/**
* Write out the json for a provider include file.
*
* @param string $release_category
* Either 'legacy' or 'current'.
* @param $json
* String containing the json representation of a package
* @param $groupname
* String containing the package name
*
* @return array
*/
function project_composer_write_include_json($release_category, $json, $groupname = NULL) {
$json = json_encode($json, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
$sha256key = hash('sha256', $json);
$filename = "drupal/provider-" . $groupname . '$' . $sha256key . '.json';
// Make sure we've got the right project-specific subdirectory.
$project_dir = _project_composer_get_metadata_file_dir($release_category);
if (!file_prepare_directory($project_dir, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($project_dir);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
return ['hash' => 'error', 'filename' => 'error'];
}
// Write out file.
$filepath = $project_dir . '/' . $filename;
if (!_project_composer_save_file($filepath, $json)){
return ['hash' => 'error', 'filename' => 'error'];
}
return ['hash' => $sha256key, 'filename' => $filename];
}
/**
* Helper function to encapsulate drush and web request filesavings logic.
*
......@@ -1977,19 +1713,15 @@ function project_composer_write_include_json($release_category, $json, $groupnam
* The contents of the file
* @return bool
*/
function _project_composer_save_file($filepath = '', $json = '', $build_type = PROJECT_COMPOSER_METADATA_ALL){
if (!file_exists($filepath) || in_array($build_type,[PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV])) {
// Only write out the file if it doesn’t already exist from a previous
// process.
if (!file_unmanaged_save_data($json, $filepath, FILE_EXISTS_REPLACE)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($filepath);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
return FALSE;
}
}
if (in_array($build_type,[PROJECT_COMPOSER_METADATA_TAGGED, PROJECT_COMPOSER_METADATA_DEV])) {
project_composer_purge_packages_url(preg_replace('|public:/|', 'files', $filepath));
function _project_composer_save_file($filepath, $json, $build_type) {
// Only write out the file if it doesn’t already exist from a previous
// process.
if (!file_unmanaged_save_data($json, $filepath, FILE_EXISTS_REPLACE)) {
$wrapper = file_stream_wrapper_get_instance_by_uri($filepath);
watchdog('project_composer', '%path does not exist or is not writable.', ['%path' => $wrapper->realpath()], WATCHDOG_ERROR);
return FALSE;
}
project_composer_purge_packages_url(preg_replace('|public:/|', 'files', $filepath));
return TRUE;
}
......@@ -2076,12 +1808,8 @@ function project_composer_core_version_string_from_release_category($release_cat
* @return string
*/
function project_composer_get_project_namespace($project_nid, $release_category, $require_provider = TRUE) {
$query = db_select('project_composer_namespace_map', 'pcnm');
if ($require_provider) {
$query->innerJoin('project_composer_providers', 'pcp', 'pcp.project_nid = pcnm.project_nid AND pcp.release_category = pcnm.category AND pcp.provider_name = pcnm.package_namespace AND pcp.provider_type = \'package\'');
}
$result = $query->fields('pcnm',['package_namespace'])
// todo remove vestigial $require_provider, it is used by drupalorg.
$result = db_select('project_composer_namespace_map', 'pcnm')->fields('pcnm', ['package_namespace'])
->where('pcnm.category = :release_category', [':release_category' => $release_category])
->where('(pcnm.project_nid = :project_nid)', [':project_nid' => $project_nid])
->execute()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment