1 | import path from "path";
|
2 | import fs from "fs";
|
3 | import archiver from "archiver";
|
4 | import crypto from "crypto";
|
5 | import glob from "glob";
|
6 |
|
7 |
|
8 | export default function tarzip(file, dirs, output, zipname){
|
9 | return new Promise(function(resolve, reject){
|
10 | var dir = path.dirname(file);
|
11 |
|
12 | var tarfile = path.join(dir, zipname + ".tar");
|
13 | var zipfile = path.join(output, zipname + ".zip");
|
14 |
|
15 | var tarwrite = fs.createWriteStream(tarfile);
|
16 |
|
17 | let tar = archiver('tar');
|
18 | tar.on('error', function(err){
|
19 | throw err;
|
20 | });
|
21 | tar.file(file, {
|
22 | name: file.substring(file.lastIndexOf(path.sep) + 1)
|
23 | });
|
24 |
|
25 | var files = [];
|
26 | dirs.forEach((dir) => {
|
27 | var dirname = dir.substring(dir.lastIndexOf(path.sep) + 1);
|
28 | files = files.concat(glob.sync("**/*", {
|
29 | cwd: dir,
|
30 | nodir: true
|
31 | }).map((file) => path.join(dirname, file)));
|
32 | });
|
33 | files = files.sort();
|
34 |
|
35 | var dir = path.dirname(file);
|
36 |
|
37 |
|
38 | (function _(){
|
39 | if(files.length){
|
40 | let file = files.shift();
|
41 | tar.file(path.join(dir, file), {
|
42 | name: file
|
43 | });
|
44 | setTimeout(function() {
|
45 | _();
|
46 | }, 10);
|
47 | }else{
|
48 | tar.finalize();
|
49 | }
|
50 | })();
|
51 | tar.pipe(tarwrite);
|
52 |
|
53 | tarwrite.on("close", function(){
|
54 |
|
55 | var tarContent = fs.readFileSync(tarfile);
|
56 | var md5 = crypto.createHash('md5');
|
57 | md5.update(tarContent);
|
58 | md5 = md5.digest('hex');
|
59 |
|
60 | var tarread = fs.createReadStream(tarfile);
|
61 | var output = fs.createWriteStream(zipfile);
|
62 |
|
63 | let zip = archiver('zip');
|
64 | zip.on('error', function(err){
|
65 | throw err;
|
66 | });
|
67 |
|
68 | zip.append(tarread, {
|
69 | name: zipname + ".tar"
|
70 | });
|
71 | zip.pipe(output);
|
72 |
|
73 | zip.finalize();
|
74 |
|
75 | output.on("close", function(){
|
76 | fs.unlink(tarfile);
|
77 | resolve(md5);
|
78 | });
|
79 | });
|
80 | });
|
81 | } |
\ | No newline at end of file |