diff --git a/lib/datasource/git-tags/index.js b/lib/datasource/git-tags/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f1f5c03a4c1748c1f2755dd70335f2dcba7f3c69 --- /dev/null +++ b/lib/datasource/git-tags/index.js @@ -0,0 +1,44 @@ +const { getRemoteInfo } = require('isomorphic-git'); + +const cacheNamespace = 'git-tags'; +const cacheMinutes = 10; + +async function getPkgReleases({ lookupName }) { + try { + const cachedResult = await renovateCache.get(cacheNamespace, lookupName); + if (cachedResult) return cachedResult; + + const info = await getRemoteInfo({ + url: lookupName, + }); + if (info && info.refs && info.refs.tags) { + const tags = Object.keys(info.refs.tags); + const result = tags.reduce( + (accum, gitRef) => { + if (!/\^/.test(gitRef)) { + // exclude things like '1.2.3^{}' + const version = gitRef.replace(/^v(?=[0-9])/, ''); // 'v1.2.3' => '1.2.3' + accum.releases.push({ + version, + gitRef, + }); + } + return accum; + }, + { + sourceUrl: lookupName, + releases: [], + } + ); + await renovateCache.set(cacheNamespace, lookupName, result, cacheMinutes); + return result; + } + } catch (e) { + logger.debug(`Error looking up for tags in ${lookupName}`); + } + return null; +} + +module.exports = { + getPkgReleases, +}; diff --git a/lib/datasource/index.js b/lib/datasource/index.js index ddeb4849ff7e84bba46e21f5a9cf3baae23c5858..d6a0c3060d8a1eacc1a791ea4bd06e896bb417ef 100644 --- a/lib/datasource/index.js +++ b/lib/datasource/index.js @@ -7,6 +7,7 @@ const docker = require('./docker'); const hex = require('./hex'); const github = require('./github'); const gitlab = require('./gitlab'); +const gitTags = require('./git-tags'); const go = require('./go'); const gradleVersion = require('./gradle-version'); const maven = require('./maven'); @@ -27,6 +28,7 @@ const datasources = { hex, github, gitlab, + gitTags, go, gradleVersion, maven, diff --git a/package.json b/package.json index dc409407a0fe2bd062e1cd5742c18134bfbf290d..f93dcef784e1d8dbf5bfd8e8ac3564a47fdaf0ed 100644 --- a/package.json +++ b/package.json @@ -115,6 +115,7 @@ "got": "9.6.0", "handlebars": "4.1.2", "ini": "1.3.5", + "isomorphic-git": "0.55.2", "js-yaml": "3.13.1", "json-dup-key-validator": "1.0.2", "json-stringify-pretty-compact": "2.0.0", diff --git a/test/datasource/git-tags.spec.js b/test/datasource/git-tags.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..eaca9b0ad2e69759f5ba590b66adef599b91674f --- /dev/null +++ b/test/datasource/git-tags.spec.js @@ -0,0 +1,40 @@ +const { getRemoteInfo } = require('isomorphic-git'); +const { getPkgReleases } = require('../../lib/datasource/git-tags'); + +jest.mock('isomorphic-git'); + +const lookupName = 'https://github.com/vapor/vapor.git'; + +describe('datasource/git-tags', () => { + beforeEach(() => global.renovateCache.rmAll()); + describe('getPkgReleases', () => { + it('returns nil if response is wrong', async () => { + getRemoteInfo.mockReturnValue(Promise.resolve(null)); + const versions = await getPkgReleases({ lookupName }); + expect(versions).toEqual(null); + }); + it('returns nil if remote call throws exception', async () => { + getRemoteInfo.mockImplementation(() => { + throw new Error(); + }); + const versions = await getPkgReleases({ lookupName }); + expect(versions).toEqual(null); + }); + it('returns versions filtered from tags', async () => { + getRemoteInfo.mockReturnValue( + Promise.resolve({ + refs: { + tags: { + '0.0.1': 'foo', + 'v0.0.2': 'bar', + 'v0.0.2^{}': 'baz', + }, + }, + }) + ); + const versions = await getPkgReleases({ lookupName }); + const result = versions.releases.map(x => x.version).sort(); + expect(result).toEqual(['0.0.1', '0.0.2']); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index 33c68604ffd3f68ae95f6d0b53f986b2b6a370f2..77a344a01bd470a7880374c5e9fb8fecd493e837 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1558,6 +1558,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async-lock@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.2.0.tgz#cd6a53cb1ec3f86af25eafdeb6bc7c6e317258b8" + integrity sha512-81HzTQm4+qMj6PwNlnR+y9g7pDdGGzd/YBUrQnHk+BhR28ja2qv497NkQQc1KcKEqh/RShm07di2b0cIWVFrNQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1646,6 +1651,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" + integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= + base64url@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" @@ -1709,6 +1719,14 @@ bn.js@^2.0.0, bn.js@^2.0.3: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU= +bops@~0.0.6: + version "0.0.7" + resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.7.tgz#b4a0a5a839a406454af0fe05a8b91a7a766a54e2" + integrity sha1-tKClqDmkBkVK8P4FqLkaenZqVOI= + dependencies: + base64-js "0.0.2" + to-utf8 "0.0.1" + bottleneck@^2.0.1: version "2.17.1" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.17.1.tgz#a45809e4cdf5326e14dc69970f4af7029e22c0f4" @@ -2115,6 +2133,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-git-ref@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clean-git-ref/-/clean-git-ref-1.0.3.tgz#5325dc839eab01c974ae0e97f5734782750f88ec" + integrity sha1-UyXcg56rAcl0rg6X9XNHgnUPiOw= + clean-git-ref@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/clean-git-ref/-/clean-git-ref-2.0.1.tgz#dcc0ca093b90e527e67adb5a5e55b1af6816dcd9" @@ -2469,6 +2492,14 @@ cosmiconfig@^5.0.1, cosmiconfig@^5.2.0: js-yaml "^3.13.0" parse-json "^4.0.0" +crc-32@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -2764,11 +2795,23 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" +diff-lines@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/diff-lines/-/diff-lines-1.1.0.tgz#4bbd925713e027477bcd42081b68449147b19648" + integrity sha1-S72SVxPgJ0d7zUIIG2hEkUexlkg= + dependencies: + diff "^2.2.3" + diff-sequences@^24.3.0: version "24.3.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== +diff@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + integrity sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= + dir-glob@^2.0.0, dir-glob@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -3206,6 +3249,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -3677,6 +3725,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-apply-delta@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/git-apply-delta/-/git-apply-delta-0.0.7.tgz#fb76ae144540d79440b52b31de03e63c993c7219" + integrity sha1-+3auFEVA15RAtSsx3gPmPJk8chk= + dependencies: + bops "~0.0.6" + varint "0.0.3" + git-log-parser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" @@ -3773,6 +3829,11 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== +globalyzer@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" + integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== + globby@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.1.0.tgz#e90f4d5134109e6d855abdd31bdb1b085428592e" @@ -3787,6 +3848,11 @@ globby@^9.0.0: pify "^4.0.1" slash "^2.0.0" +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -4059,6 +4125,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.4: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -4522,6 +4593,27 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-git@0.55.2: + version "0.55.2" + resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-0.55.2.tgz#d258d43829cf45bfaa5717b60c657fe1289cd7e5" + integrity sha512-O6yeae9qvYUc0gHgavzUx1RjHIB4Ix3WpcEYqiF1sGf/JOlmkxUZ7cVHXH5oznmMBQeR/HdJ2ove6mcHgb5MAQ== + dependencies: + async-lock "^1.1.0" + clean-git-ref "1.0.3" + crc-32 "^1.2.0" + diff-lines "^1.1.0" + git-apply-delta "0.0.7" + globalyzer "^0.1.0" + globrex "^0.1.2" + ignore "^5.0.4" + marky "^1.2.1" + minimisted "^2.0.0" + pako "^1.0.7" + pify "^4.0.1" + readable-stream "^3.1.1" + sha.js "^2.4.9" + simple-get "^3.0.2" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -5725,6 +5817,11 @@ marked@^0.6.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.1.tgz#a63addde477bca9613028de4b2bc3629e53a0562" integrity sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA== +marky@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02" + integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ== + mdast-util-compact@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz#c12ebe16fffc84573d3e19767726de226e95f649" @@ -5896,6 +5993,13 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minimisted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/minimisted/-/minimisted-2.0.0.tgz#5e3295e74ed701b1cbeaa863a888181d6efbe8ce" + integrity sha512-oP88Dw3LK/pdrKyMdlbmg3W50969UNr4ctISzJfPl+YPYHTAOrS+dihXnsgRNKSRIzDsrnV3eE2CCVlZbpOKdQ== + dependencies: + minimist "^1.2.0" + minipass@^2.2.1, minipass@^2.3.3, minipass@^2.3.4, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -7089,6 +7193,11 @@ pacote@^9.1.0, pacote@^9.2.3, pacote@^9.5.0: unique-filename "^1.1.1" which "^1.3.1" +pako@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" @@ -7343,6 +7452,11 @@ pretty-quick@1.11.0: mri "^1.1.0" multimatch "^3.0.0" +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -8294,6 +8408,14 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +sha.js@^2.4.9: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + sha@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" @@ -8343,6 +8465,20 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" + integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-git@1.113.0: version "1.113.0" resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.113.0.tgz#668989728a1e9cf4ec6c72b69ea2eecc93489bea" @@ -8973,6 +9109,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-utf8@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" + integrity sha1-0Xrqcv8vujm55DYBvns/9y4ImFI= + to-vfile@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-2.2.0.tgz#342d1705e6df526d569b1fc8bfa29f1f36d6c416" @@ -9389,6 +9530,11 @@ validator@11.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-11.0.0.tgz#fb10128bfb1fd14ce4ed36b79fc94289eae70667" integrity sha512-+wnGLYqaKV2++nUv60uGzUJyJQwYVOin6pn1tgEiFCeCQO60yeu3Og9/yPccbBX574kxIcEJicogkzx6s6eyag== +varint@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/varint/-/varint-0.0.3.tgz#b821de9b04b38b3cd22f72c18d94a9fb72ab3518" + integrity sha1-uCHemwSzizzSL3LBjZSp+3KrNRg= + "vasync@1.x >=1.6.1": version "1.6.4" resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f"