Skip to content
Snippets Groups Projects
Select Git revision
  • f334c568a5039f88f72fb99ee25410a19ffbe501
  • master default
2 results

index.js

Blame
  • index.js 3.18 KiB
    const is = require('@sindresorhus/is');
    
    const glGot = require('../../platform/gitlab/gl-got-wrapper').api.get;
    const { logger } = require('../../logger');
    
    module.exports = {
      getPreset,
      getPkgReleases,
    };
    
    const GitLabApiUrl = 'https://gitlab.com/api/v4/projects';
    
    async function getPreset(pkgName, presetName = 'default') {
      if (presetName !== 'default') {
        throw new Error(
          { pkgName, presetName },
          'Sub-preset names are not supported with Gitlab datasource'
        );
      }
      let res;
      try {
        const urlEncodedPkgName = encodeURIComponent(pkgName);
        const defautlBranchName = await getDefaultBranchName(urlEncodedPkgName);
    
        const presetUrl = `${GitLabApiUrl}/${urlEncodedPkgName}/repository/files/renovate.json?ref=${defautlBranchName}`;
        res = Buffer.from(
          (await glGot(presetUrl)).body.content,
          'base64'
        ).toString();
      } catch (err) {
        logger.debug({ err }, 'Failed to retrieve renovate.json from repo');
        throw new Error('dep not found');
      }
      try {
        return JSON.parse(res);
      } catch (err) /* istanbul ignore next */ {
        logger.info('Failed to parse renovate.json');
        throw new Error('invalid preset JSON');
      }
    }
    
    const cacheNamespace = 'datasource-gitlab';
    function getCacheKey(depHost, repo, lookupType) {
      const type = lookupType || 'tags';
      return `${depHost}:${repo}:${type}`;
    }
    
    async function getPkgReleases({ registryUrls, lookupName: repo, lookupType }) {
      // Use registryUrls if present, otherwise default to publid gitlab.com
      const depHost = is.nonEmptyArray(registryUrls)
        ? registryUrls[0].replace(/\/$/, '')
        : 'https://gitlab.com';
      let versions;
      const cachedResult = await renovateCache.get(
        cacheNamespace,
        getCacheKey(depHost, repo, lookupType)
      );
      // istanbul ignore if
      if (cachedResult) {
        return cachedResult;
      }
    
      const urlEncodedRepo = encodeURIComponent(repo);
    
      try {
        if (lookupType === 'releases') {
          const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/releases?per_page=100`;
          versions = (await glGot(url, { paginate: true })).body.map(
            o => o.tag_name
          );
        } else {
          // tag
          const url = `${depHost}/api/v4/projects/${urlEncodedRepo}/repository/tags?per_page=100`;
          versions = (await glGot(url, {
            paginate: true,
          })).body.map(o => o.name);
        }
      } catch (err) {
        // istanbul ignore next
        logger.info({ repo, err }, 'Error retrieving from Gitlab');
      }
    
      // istanbul ignore if
      if (!versions) {
        return null;
      }
    
      const dependency = {
        sourceUrl: `${depHost}/${repo}`,
      };
      dependency.releases = versions.map(version => ({
        version,
        gitRef: version,
      }));
    
      const cacheMinutes = 10;
      await renovateCache.set(
        cacheNamespace,
        getCacheKey(depHost, repo, lookupType),
        versions,
        cacheMinutes
      );
      return dependency;
    }
    
    async function getDefaultBranchName(urlEncodedPkgName) {
      const branchesUrl = `${GitLabApiUrl}/${urlEncodedPkgName}/repository/branches`;
      const res = await glGot(branchesUrl);
      const branches = res.body;
      let defautlBranchName = 'master';
      for (const branch of branches) {
        if (branch.default) {
          defautlBranchName = branch.name;
          break;
        }
      }
    
      return defautlBranchName;
    }