Skip to content
Snippets Groups Projects
Select Git revision
  • e209808fde936890d0a10e719a53f4546ab6ff9a
  • main default protected
  • refactor/zod-schema-names
  • renovate/main-redis-5.x
  • chore/update-static-data
  • feat/poetry/supersede-pep621
  • fix/markdown/linking
  • next
  • feat/gnupg
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • 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
  • 41.71.0
  • 41.70.3
  • 41.70.2
  • 41.70.1
  • 41.70.0
  • 41.69.1
  • 41.69.0
  • 41.68.0
  • 41.67.0
  • 41.66.3
  • 41.66.2
  • 41.66.1
  • 41.66.0
  • 41.65.1
  • 41.65.0
  • 41.64.4
  • 41.64.3
  • 41.64.2
  • 41.64.1
  • 41.64.0
41 results

extract.ts

Blame
  • user avatar
    Rhys Arkins authored and GitHub committed
    3cef2f2e
    History
    extract.ts 3.02 KiB
    import { logger } from '../../../logger';
    import { parseUrl } from '../../../util/url';
    import { GitTagsDatasource } from '../../datasource/git-tags';
    import { GithubTagsDatasource } from '../../datasource/github-tags';
    import { PuppetForgeDatasource } from '../../datasource/puppet-forge';
    import type { PackageDependency, PackageFileContent } from '../types';
    import { isGithubUrl, parseGitOwnerRepo } from './common';
    import { parsePuppetfile } from './puppetfile-parser';
    import type { PuppetfileModule } from './types';
    
    function parseForgeDependency(
      module: PuppetfileModule,
      forgeUrl: string | null
    ): PackageDependency {
      const dep: PackageDependency = {
        depName: module.name,
        datasource: PuppetForgeDatasource.id,
        packageName: module.name,
        currentValue: module.version,
      };
    
      if (forgeUrl) {
        dep.registryUrls = [forgeUrl];
      }
    
      return dep;
    }
    
    function parseGitDependency(module: PuppetfileModule): PackageDependency {
      const moduleName = module.name;
    
      const git = module.tags?.get('git');
      const tag = module.tags?.get('tag');
    
      if (!git || !tag) {
        return {
          depName: moduleName,
          sourceUrl: git,
          skipReason: 'invalid-version',
        };
      }
    
      const parsedUrl = parseUrl(git);
      const githubUrl = isGithubUrl(git, parsedUrl);
    
      if (githubUrl && parsedUrl && parsedUrl.protocol !== 'https:') {
        logger.warn(
          `Access to github is only allowed for https, your url was: ${git}`
        );
        return {
          depName: moduleName,
          sourceUrl: git,
          skipReason: 'invalid-url',
        };
      }
      const gitOwnerRepo = parseGitOwnerRepo(git, githubUrl);
    
      if (!gitOwnerRepo) {
        // failed to parse git url
        return {
          depName: moduleName,
          sourceUrl: git,
          skipReason: 'invalid-url',
        };
      }
    
      const packageDependency: PackageDependency = {
        depName: moduleName,
        packageName: git,
        sourceUrl: git,
        gitRef: true,
        currentValue: tag,
        datasource: GitTagsDatasource.id,
      };
    
      if (githubUrl) {
        packageDependency.packageName = gitOwnerRepo;
        packageDependency.datasource = GithubTagsDatasource.id;
      }
    
      return packageDependency;
    }
    
    function isGitModule(module: PuppetfileModule): boolean {
      return module.tags?.has('git') ?? false;
    }
    
    export function extractPackageFile(content: string): PackageFileContent | null {
      logger.trace('puppet.extractPackageFile()');
    
      const puppetFile = parsePuppetfile(content);
      const deps: PackageDependency[] = [];
    
      for (const forgeUrl of puppetFile.getForges()) {
        for (const module of puppetFile.getModulesOfForge(forgeUrl)) {
          let packageDependency: PackageDependency;
    
          if (isGitModule(module)) {
            packageDependency = parseGitDependency(module);
          } else {
            packageDependency = parseForgeDependency(module, forgeUrl);
          }
    
          if (module.skipReason) {
            // the PuppetfileModule skip reason is dominant over the packageDependency skip reason
            packageDependency.skipReason = module.skipReason;
          }
    
          deps.push(packageDependency);
        }
      }
    
      return deps.length ? { deps } : null;
    }