Skip to content
Snippets Groups Projects
Select Git revision
  • a942b421d529c724ab4f13adc28ac57188eeb962
  • main default protected
  • renovate/main-ghcr.io-renovatebot-base-image-10.x
  • renovate/main-ghcr.io-containerbase-devcontainer-13.x
  • next
  • revert-31645-feat/rename-gradle-wrapper-validation-action
  • renovate/main-redis-5.x
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • fix/36615-branch-reuse-bug
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • 41.30.4
  • 41.30.3
  • 41.30.2
  • 41.30.1
  • 41.30.0
  • 41.29.1
  • 41.29.0
  • 41.28.2
  • 41.28.1
  • 41.28.0
  • 41.27.1
  • 41.27.0
  • 41.26.2
  • 41.26.1
  • 41.26.0
  • 41.25.1
  • 41.25.0
  • 41.24.0
  • 41.23.5
  • 41.23.4
41 results

fetch.ts

Blame
  • user avatar
    Rhys Arkins authored and GitHub committed
    Adds an optional new object `defaultConfig` to datasources. This object will be merged into config during the update flattening process, and before the last applyPackageRules. i.e. it can still be overridden by packageRules.
    a942b421
    History
    fetch.ts 4.39 KiB
    import is from '@sindresorhus/is';
    import pAll from 'p-all';
    import { logger } from '../../../logger';
    import { getPackageUpdates } from '../../../manager';
    import {
      getManagerConfig,
      mergeChildConfig,
      RenovateConfig,
      ManagerConfig,
    } from '../../../config';
    import { applyPackageRules } from '../../../util/package-rules';
    import { lookupUpdates, LookupUpdateConfig, UpdateResult } from './lookup';
    import {
      PackageFile,
      PackageDependency,
      PackageUpdateResult,
    } from '../../../manager/common';
    import { SkipReason } from '../../../types';
    
    async function fetchDepUpdates(
      packageFileConfig: ManagerConfig & PackageFile,
      dep: PackageDependency
    ): Promise<void> {
      /* eslint-disable no-param-reassign */
      dep.updates = [];
      if (dep.skipReason) {
        return;
      }
      const { manager, packageFile } = packageFileConfig;
      const { depName, currentValue } = dep;
      // TODO: fix types
      let depConfig = mergeChildConfig(packageFileConfig, dep);
      depConfig = applyPackageRules(depConfig);
      if (depConfig.ignoreDeps.includes(depName)) {
        logger.debug({ dependency: dep.depName }, 'Dependency is ignored');
        dep.skipReason = SkipReason.Ignored;
      } else if (
        depConfig.internalPackages &&
        depConfig.internalPackages.includes(depName)
      ) {
        logger.debug(
          { dependency: dep.depName },
          'Dependency is ignored due to being internal'
        );
        dep.skipReason = SkipReason.InternalPackage;
      } else if (depConfig.enabled === false) {
        logger.debug({ dependency: dep.depName }, 'Dependency is disabled');
        dep.skipReason = SkipReason.Disabled;
      } else {
        let lookupResults: UpdateResult | PackageUpdateResult[];
        if (depConfig.datasource) {
          lookupResults = await lookupUpdates(depConfig as LookupUpdateConfig);
        } else {
          lookupResults = await getPackageUpdates(manager, depConfig);
        }
        // istanbul ignore else
        if (is.array(lookupResults)) {
          dep.updates = lookupResults;
        } else {
          Object.assign(dep, lookupResults);
        }
        // istanbul ignore if
        if (dep.updates.length) {
          logger.trace(
            { dependency: depName },
            `${dep.updates.length} result(s): ${dep.updates.map(
              upgrade => upgrade.newValue
            )}`
          );
        }
        logger.trace({
          packageFile,
          manager,
          depName,
          currentValue,
          updates: dep.updates,
        });
      }
      /* eslint-enable no-param-reassign */
    }
    
    async function fetchManagerPackagerFileUpdates(
      config: RenovateConfig,
      managerConfig: ManagerConfig,
      pFile: PackageFile
    ): Promise<void> {
      const { packageFile } = pFile;
      const packageFileConfig = mergeChildConfig(managerConfig, pFile);
      const { manager } = packageFileConfig;
      const queue = pFile.deps.map(dep => (): Promise<void> =>
        fetchDepUpdates(packageFileConfig, dep)
      );
      logger.trace(
        { manager, packageFile, queueLength: queue.length },
        'fetchManagerPackagerFileUpdates starting with concurrency'
      );
      await pAll(queue, { concurrency: 5 });
      logger.trace({ packageFile }, 'fetchManagerPackagerFileUpdates finished');
    }
    
    async function fetchManagerUpdates(
      config: RenovateConfig,
      packageFiles: Record<string, PackageFile[]>,
      manager: string
    ): Promise<void> {
      const managerConfig = getManagerConfig(config, manager);
      const queue = packageFiles[manager].map(pFile => (): Promise<void> =>
        fetchManagerPackagerFileUpdates(config, managerConfig, pFile)
      );
      logger.trace(
        { manager, queueLength: queue.length },
        'fetchManagerUpdates starting'
      );
      await pAll(queue, { concurrency: 5 });
      logger.trace({ manager }, 'fetchManagerUpdates finished');
    }
    
    export async function fetchUpdates(
      config: RenovateConfig,
      packageFiles: Record<string, PackageFile[]>
    ): Promise<void> {
      const managers = Object.keys(packageFiles);
      const stats = {
        managers: {},
        fileCount: 0,
        depCount: 0,
      };
      for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {
        const fileCount = managerPackageFiles.length;
        let depCount = 0;
        for (const file of managerPackageFiles) {
          depCount += file.deps.length;
        }
        stats.managers[manager] = {
          fileCount,
          depCount,
        };
        stats.fileCount += fileCount;
        stats.depCount += depCount;
      }
      logger.info({ stats }, `Extraction statistics`);
      const allManagerJobs = managers.map(manager =>
        fetchManagerUpdates(config, packageFiles, manager)
      );
      await Promise.all(allManagerJobs);
      logger.debug('fetchUpdates complete');
    }