Skip to content

Commit

Permalink
feat: autodetect base when not specified by the user (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
malept authored Nov 21, 2019
1 parent 4f2b890 commit 514f0ae
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
"eslint-plugin-node": "^10.0.0",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"nyc": "^14.0.0"
"nyc": "^14.0.0",
"sinon": "^7.5.0"
},
"dependencies": {
"cross-spawn-promise": "^0.10.1",
Expand Down
45 changes: 45 additions & 0 deletions src/yaml.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ const merge = require('lodash.merge')
const path = require('path')
const pull = require('lodash.pull')
const semver = require('semver')
const spawn = require('cross-spawn-promise')
const which = require('which')
const yaml = require('js-yaml')

const { createDesktopLaunchCommand } = require('./launcher')
Expand Down Expand Up @@ -73,6 +75,41 @@ class SnapcraftYAML {
return this.data.parts[this.appName]
}

async detectBase (lsbRelease) {
if (!lsbRelease) {
lsbRelease = 'lsb_release'
}
const lsbReleasePath = await this.findLsbRelease(lsbRelease)
if (!lsbReleasePath) {
debug('Using base: core18 as recommended by the Snapcraft docs')
return 'core18'
}

const [distro, distroVersion] = await this.detectDistro(lsbReleasePath)
if (distro === 'Ubuntu' && distroVersion === '16.04') {
return 'core'
}

return 'core18'
}

async findLsbRelease (lsbRelease) {
try {
return await which(lsbRelease)
} catch (err) {
debug(`Error when looking for lsb_release:\n${err}`)
}
}

async detectDistro (lsbRelease) {
const output = await spawn(lsbRelease, ['--short', '--id', '--release'])
if (output) {
return output.toString().trim().split('\n')
}

return [null, null]
}

renameSubtree (parentObject, fromKey, toKey) {
parentObject[toKey] = parentObject[fromKey]
delete parentObject[fromKey]
Expand Down Expand Up @@ -174,6 +211,12 @@ class SnapcraftYAML {
this.features = merge({}, userSupplied.features || {})
delete userSupplied.features

if (!userSupplied.base) {
// eslint-disable-next-line require-atomic-updates
userSupplied.base = await this.detectBase(userSupplied.lsbRelease)
}
delete userSupplied.lsbRelease

const appConfig = { apps: { electronApp: userSupplied.appConfig || {} } }
delete userSupplied.appConfig
const appPlugsSlots = { apps: { electronApp: {} } }
Expand Down Expand Up @@ -213,3 +256,5 @@ module.exports = async function createYamlFromTemplate (snapDir, packageDir, use
await yamlData.transform(packageDir, userSupplied)
await yamlData.write(path.join(snapDir, 'snap', 'snapcraft.yaml'))
}

module.exports.SnapcraftYAML = SnapcraftYAML
41 changes: 41 additions & 0 deletions test/yaml.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@ limitations under the License.
const createYamlFromTemplate = require('../src/yaml')
const fs = require('fs-extra')
const path = require('path')
const sinon = require('sinon')
const test = require('ava')
const util = require('./_util')
const yaml = require('js-yaml')

const SnapcraftYAML = createYamlFromTemplate.SnapcraftYAML

async function createYaml (t, userDefined, electronVersion) {
const yamlPath = path.join(t.context.tempDir.name, 'snap', 'snapcraft.yaml')
if (typeof electronVersion === 'undefined') {
Expand Down Expand Up @@ -141,3 +144,41 @@ test('Electron 4 apps require uuid', async t => {
const snapcraftYaml = await createYaml(t, { name: 'electronAppName' }, '4.0.0')
assertStagedPackage(t, snapcraftYaml, 'libuuid1')
})

test('base autodetect defaults to core18 when lsb_release is not found', async t => {
const snapcraftYaml = await createYaml(t, { name: 'electronAppName', lsbRelease: '/does/not/exist' })
t.is(snapcraftYaml.base, 'core18')
})

test('base autodetect does not run when it is set by the user', async t => {
const snapcraftYaml = await createYaml(t, { name: 'electronAppName', base: 'bare' })
t.is(snapcraftYaml.base, 'bare')
})

test('base autodetect returns core when Ubuntu 16.04 is detected', async t => {
const yaml = new SnapcraftYAML()
const lsbRelease = sinon.stub(yaml, 'findLsbRelease')
lsbRelease.resolves('lsb_release')
const distro = sinon.stub(yaml, 'detectDistro')
distro.resolves(['Ubuntu', '16.04'])
try {
t.is('core', await yaml.detectBase())
} finally {
lsbRelease.restore()
distro.restore()
}
})

test('base autodetect returns core18 for non-Ubuntu distros', async t => {
const yaml = new SnapcraftYAML()
const lsbRelease = sinon.stub(yaml, 'findLsbRelease')
lsbRelease.resolves('lsb_release')
const distro = sinon.stub(yaml, 'detectDistro')
distro.resolves(['Debian', '10'])
try {
t.is('core18', await yaml.detectBase())
} finally {
lsbRelease.restore()
distro.restore()
}
})

0 comments on commit 514f0ae

Please sign in to comment.