Make sure directories exist as tar doesn’t create them

This commit is contained in:
Samuel Elliott 2019-05-25 10:59:42 +01:00
parent 475709133f
commit 2da490d9e5
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
1 changed files with 47 additions and 15 deletions

View File

@ -23,10 +23,10 @@ function deb(name) {
files.push(file);
callback(null, file);
}, function (callback) { (async () => {
if (files.length !== 3) throw new Error('Must have three files');
if (!files[0].path.match(/\/debian-binary$/)) throw new Error('Missing debian-binary file');
if (!files[1].path.match(/\/control\.tar(\.gz)?$/)) throw new Error('Missing control archive');
if (!files[2].path.match(/\/data\.tar(\.gz)?$/)) throw new Error('Missing data archive');
const orderedfiles = [new Vinyl({path: '/debian-binary', contents: Buffer.from('2.0\n')})];
orderedfiles.push(files.find(f => f.path.match(/\/control\.tar(\.gz)?$/)));
orderedfiles.push(files.find(f => f.path.match(/\/data\.tar(\.gz)?$/)));
if (orderedfiles.length !== 3) throw new Error('Must have three files');
const contents = new stream.Readable();
contents._read = () => {};
@ -38,14 +38,10 @@ function deb(name) {
contents
});
// console.log('Returning deb', debfile, files);
contents.push('!<arch>' + String.fromCharCode(0x0A)); // Signature
for (const [index, file] of files.entries()) {
// console.log(file, index, file.stat);
const size = file.stat ? file.stat.size.toString() : file.contents && file.contents.length ? file.contents.length : 0;
for (const [index, file] of orderedfiles.entries()) {
const size = file.stat && file.stat.size ? file.stat.size : file.contents && file.contents.length ? file.contents.length : 0;
contents.push(rightPaddedWithSpaces(16, path.basename(file.path))); // Filename (ASCII, 16 bytes long)
contents.push(rightPaddedWithSpaces(12, (Math.floor(file.stat ? file.stat.mtime / 1000 : 0)).toString())); // File modification timestamp (Decimal, 12 bytes long)
@ -55,10 +51,8 @@ function deb(name) {
contents.push(rightPaddedWithSpaces(10, size.toString())); // File size in bytes (Decimal, 10 bytes long)
contents.push(String.fromCharCode(0x60) + String.fromCharCode(0x0A)); // Ending characters ("0x60 0x0A")
// stream.write(file.contents);
if (file.isStream()) await new Promise((resolve, reject) => {
file.contents.on('data', data => contents.push(data));
// file.contents.pipe(contents);
file.contents.on('end', resolve);
file.contents.on('error', reject);
}); else contents.push(file.contents);
@ -86,6 +80,44 @@ function rightPaddedWithSpaces(n, string) {
return string + (new Array(n - string.length + 1)).join(String.fromCharCode(0x20));
}
function ensuredirectories() {
const directories = [];
return through2.obj(function (file, enc, callback) {
const name = file.relative;
const nameparts = name.split('/');
if (file.isDirectory()) {
if (directories.includes(file.name)) return;
directories.push(file.name);
} else {
for (let [index, part] of nameparts.slice(0, nameparts.length - 1).entries()) {
let partpath = part;
while (index > 0) {
index--;
partpath = nameparts[index] + '/' + partpath;
}
if (directories.includes(partpath)) continue;
const directory = new Vinyl({
cwd: file.cwd,
base: file.base,
path: path.join(file.base, partpath),
stat: {
isDirectory: () => true
}
});
this.push(directory);
directories.push(partpath);
}
}
callback(null, file);
});
}
/**
* Creates a Debian package.
* @param {string} name
@ -98,7 +130,6 @@ function rightPaddedWithSpaces(n, string) {
function mkdeb(name, datafiles, dataprefix, controlfiles, controlvars) {
return pump([
merge([
file('debian-binary', '2.0\n', {src: true}),
pump([
gulp.src(controlfiles),
...Object.keys(controlvars || {}).map(k => replace(`\${${k}}`, controlvars[k])),
@ -108,13 +139,14 @@ function mkdeb(name, datafiles, dataprefix, controlfiles, controlvars) {
pump([
gulp.src(datafiles),
rename(p => p.dirname = dataprefix + '/' + p.dirname),
ensuredirectories(),
tar(name + '.tar'),
gzip(),
gulp.dest('release')
gulp.dest('release'),
rename(p => p.basename = 'data.tar')
])
]),
rename(p => p.basename = p.basename === name ? 'data' : p.basename === name + '.tar' ? 'data.tar' : p.basename),
deb(name + '.deb'),
gulp.dest('release')
]);