Files
atom/script/lib/create-debian-package.js
Antonio Scandurra 061ae3786a Remove custom copySync function
Originally we introduced this function because we thought empty
directories were causing path length issues on Windows, but it turns out
that it was a problem with Squirrel, so we can delete this code path
altogether.

Signed-off-by: Nathan Sobo <nathan@github.com>
2016-08-16 18:08:16 +02:00

115 lines
5.4 KiB
JavaScript

'use strict'
const fs = require('fs-extra')
const os = require('os')
const path = require('path')
const spawnSync = require('./spawn-sync')
const template = require('lodash.template')
const CONFIG = require('../config')
module.exports = function (packagedAppPath) {
console.log(`Creating Debian package for "${packagedAppPath}"`)
const atomExecutableName = CONFIG.channel === 'beta' ? 'atom-beta' : 'atom'
const apmExecutableName = CONFIG.channel === 'beta' ? 'apm-beta' : 'apm'
const appName = CONFIG.channel === 'beta' ? 'Atom Beta' : 'Atom'
const appDescription = CONFIG.appMetadata.description
const appVersion = CONFIG.appMetadata.version
let arch
if (process.arch === 'ia32') {
arch = 'i386'
} else if (process.arch === 'x64') {
arch = 'amd64'
} else {
arch = process.arch
}
const outputDebianPackageFilePath = path.join(CONFIG.buildOutputPath, `atom-amd64.deb`)
const debianPackageDirPath = path.join(os.tmpdir(), path.basename(packagedAppPath))
const debianPackageConfigPath = path.join(debianPackageDirPath, 'DEBIAN')
const debianPackageInstallDirPath = path.join(debianPackageDirPath, 'usr')
const debianPackageBinDirPath = path.join(debianPackageInstallDirPath, 'bin')
const debianPackageShareDirPath = path.join(debianPackageInstallDirPath, 'share')
const debianPackageAtomDirPath = path.join(debianPackageShareDirPath, atomExecutableName)
const debianPackageApplicationsDirPath = path.join(debianPackageShareDirPath, 'applications')
const debianPackageIconsDirPath = path.join(debianPackageShareDirPath, 'pixmaps')
const debianPackageLintianOverridesDirPath = path.join(debianPackageShareDirPath, 'lintian', 'overrides')
const debianPackageDocsDirPath = path.join(debianPackageShareDirPath, 'doc', atomExecutableName)
if (fs.existsSync(debianPackageDirPath)) {
console.log(`Deleting existing build dir for Debian package at "${debianPackageDirPath}"`)
fs.removeSync(debianPackageDirPath)
}
if (fs.existsSync(`${debianPackageDirPath}.deb`)) {
console.log(`Deleting existing Debian package at "${debianPackageDirPath}.deb"`)
fs.removeSync(`${debianPackageDirPath}.deb`)
}
if (fs.existsSync(debianPackageDirPath)) {
console.log(`Deleting existing Debian package at "${outputDebianPackageFilePath}"`)
fs.removeSync(debianPackageDirPath)
}
console.log(`Creating Debian package directory structure at "${debianPackageDirPath}"`)
fs.mkdirpSync(debianPackageDirPath)
fs.mkdirpSync(debianPackageConfigPath)
fs.mkdirpSync(debianPackageInstallDirPath)
fs.mkdirpSync(debianPackageShareDirPath)
fs.mkdirpSync(debianPackageApplicationsDirPath)
fs.mkdirpSync(debianPackageIconsDirPath)
fs.mkdirpSync(debianPackageLintianOverridesDirPath)
fs.mkdirpSync(debianPackageDocsDirPath)
fs.mkdirpSync(debianPackageBinDirPath)
console.log(`Copying "${packagedAppPath}" to "${debianPackageAtomDirPath}"`)
fs.copySync(packagedAppPath, debianPackageAtomDirPath)
fs.chmodSync(debianPackageAtomDirPath, '755')
console.log(`Copying binaries into "${debianPackageBinDirPath}"`)
fs.copySync(path.join(CONFIG.repositoryRootPath, 'atom.sh'), path.join(debianPackageBinDirPath, atomExecutableName))
fs.symlinkSync(
path.join('..', 'share', atomExecutableName, 'resources', 'app', 'apm', 'node_modules', '.bin', 'apm'),
path.join(debianPackageBinDirPath, apmExecutableName)
)
console.log(`Writing control file into "${debianPackageConfigPath}"`)
const packageSizeInKilobytes = spawnSync('du', ['-sk', packagedAppPath]).stdout.toString().split(/\s+/)[0]
const controlFileTemplate = fs.readFileSync(path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'debian', 'control.in'))
const controlFileContents = template(controlFileTemplate)({
appFileName: atomExecutableName, version: appVersion, arch: arch,
installedSize: packageSizeInKilobytes, description: appDescription
})
fs.writeFileSync(path.join(debianPackageConfigPath, 'control'), controlFileContents)
console.log(`Writing desktop entry file into "${debianPackageApplicationsDirPath}"`)
const desktopEntryTemplate = fs.readFileSync(path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'atom.desktop.in'))
const desktopEntryContents = template(desktopEntryTemplate)({
appName: appName, appFileName: atomExecutableName, description: appDescription,
installDir: '/usr', iconName: atomExecutableName
})
fs.writeFileSync(path.join(debianPackageApplicationsDirPath, `${atomExecutableName}.desktop`), desktopEntryContents)
console.log(`Copying icon into "${debianPackageIconsDirPath}"`)
fs.copySync(
path.join(packagedAppPath, 'resources', 'app.asar.unpacked', 'resources', 'atom.png'),
path.join(debianPackageIconsDirPath, `${atomExecutableName}.png`)
)
console.log(`Copying license into "${debianPackageDocsDirPath}"`)
fs.copySync(
path.join(packagedAppPath, 'resources', 'LICENSE.md'),
path.join(debianPackageDocsDirPath, 'copyright')
)
console.log(`Copying lintian overrides into "${debianPackageLintianOverridesDirPath}"`)
fs.copySync(
path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'debian', 'lintian-overrides'),
path.join(debianPackageLintianOverridesDirPath, atomExecutableName)
)
console.log(`Generating .deb file from ${debianPackageDirPath}`)
spawnSync('fakeroot', ['dpkg-deb', '-b', debianPackageDirPath], {stdio: 'inherit'})
console.log(`Copying generated package into "${outputDebianPackageFilePath}"`)
fs.copySync(`${debianPackageDirPath}.deb`, outputDebianPackageFilePath)
}