diff --git a/src/scripts/repositories.js b/src/scripts/repositories.js new file mode 100644 index 0000000..caf9d1d --- /dev/null +++ b/src/scripts/repositories.js @@ -0,0 +1,27 @@ +const getRepositoryName = (split, max) => { + let repositoryName = ''; + for (let i = 0; i < max; i++) { + repositoryName += `${split[i]}/`; + } + return repositoryName; +}; + +export const getBranching = + (min = 1, max = 1) => + (repositories) => + repositories.sort().reduce(function (acc, image) { + const split = image.split('/'); + if (split.length > min && min > 0) { + const repoName = getRepositoryName(split, max); + if (acc.length === 0 || acc[acc.length - 1].repo != repoName) { + acc.push({ + repo: repoName, + images: [], + }); + } + acc[acc.length - 1].images.push(image); + return acc; + } + acc.push(image); + return acc; + }, []); diff --git a/test/repositories.test.js b/test/repositories.test.js new file mode 100644 index 0000000..d8bc125 --- /dev/null +++ b/test/repositories.test.js @@ -0,0 +1,31 @@ +import { getBranching } from '../src/scripts/repositories.js'; +import assert from 'assert'; + +describe('repositories', () => { + describe('getBranching', () => { + it('should not branch for no levels', () => { + const branching = getBranching(0, 0); + assert.deepEqual(branching(['alpine', 'debian', 'nginx']), ['alpine', 'debian', 'nginx']); + assert.deepEqual(branching(['alpine', 'joxit/docker-registry-ui', 'nginx']), [ + 'alpine', + 'joxit/docker-registry-ui', + 'nginx', + ]); + }); + + it('should branch for one level', () => { + const branching = getBranching(1, 1); + assert.deepEqual(branching(['alpine', 'debian', 'nginx']), ['alpine', 'debian', 'nginx']); + assert.deepEqual(branching(['alpine', 'joxit/docker-registry-ui', 'nginx']), [ + 'alpine', + { images: ['joxit/docker-registry-ui'], repo: 'joxit/' }, + 'nginx', + ]); + assert.deepEqual(branching(['alpine', 'joxit/docker-registry-ui', 'joxit/kokai', 'nginx']), [ + 'alpine', + { images: ['joxit/docker-registry-ui', 'joxit/kokai'], repo: 'joxit/' }, + 'nginx', + ]); + }); + }); +});