|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 'use strict'; |
|
6 |
|
7 const { platform, pathFor } = require('sdk/system'); |
|
8 const { defer } = require('sdk/core/promise'); |
|
9 const { emit } = require('sdk/event/core'); |
|
10 const { join } = require('sdk/fs/path'); |
|
11 const { writeFile, unlinkSync, existsSync } = require('sdk/io/fs'); |
|
12 const PROFILE_DIR= pathFor('ProfD'); |
|
13 const isWindows = platform.toLowerCase().indexOf('win') === 0; |
|
14 const isOSX = platform.toLowerCase().indexOf('darwin') === 0; |
|
15 |
|
16 let scripts = { |
|
17 'args.sh': 'echo $1 $2 $3 $4', |
|
18 'args.bat': 'echo %1 %2 %3 %4', |
|
19 'check-env.sh': 'echo $CHILD_PROCESS_ENV_TEST', |
|
20 'check-env.bat': 'echo %CHILD_PROCESS_ENV_TEST%', |
|
21 'check-pwd.sh': 'echo $PWD', |
|
22 'check-pwd.bat': 'cd', |
|
23 'large-err.sh': 'for n in `seq 0 $1` ; do echo "E" 1>&2; done', |
|
24 'large-err-mac.sh': 'for ((i=0; i<$1; i=i+1)); do echo "E" 1>&2; done', |
|
25 'large-err.bat': 'FOR /l %%i in (0,1,%1) DO echo "E" 1>&2', |
|
26 'large-out.sh': 'for n in `seq 0 $1` ; do echo "O"; done', |
|
27 'large-out-mac.sh': 'for ((i=0; i<$1; i=i+1)); do echo "O"; done', |
|
28 'large-out.bat': 'FOR /l %%i in (0,1,%1) DO echo "O"', |
|
29 'wait.sh': 'sleep 2', |
|
30 // Use `ping` to an invalid IP address because `timeout` isn't |
|
31 // on all environments? http://stackoverflow.com/a/1672349/1785755 |
|
32 'wait.bat': 'ping 1.1.1.1 -n 1 -w 2000 > nul' |
|
33 }; |
|
34 |
|
35 Object.keys(scripts).forEach(filename => { |
|
36 if (/\.sh$/.test(filename)) |
|
37 scripts[filename] = '#!/bin/sh\n' + scripts[filename]; |
|
38 else if (/\.bat$/.test(filename)) |
|
39 scripts[filename] = '@echo off\n' + scripts[filename]; |
|
40 }); |
|
41 |
|
42 function getScript (name) { |
|
43 // Use specific OSX script if exists |
|
44 if (isOSX && scripts[name + '-mac.sh']) |
|
45 name = name + '-mac'; |
|
46 let fileName = name + (isWindows ? '.bat' : '.sh'); |
|
47 return createFile(fileName, scripts[fileName]); |
|
48 } |
|
49 exports.getScript = getScript; |
|
50 |
|
51 function createFile (name, data) { |
|
52 let { promise, resolve, reject } = defer(); |
|
53 let fileName = join(PROFILE_DIR, name); |
|
54 writeFile(fileName, data, function (err) { |
|
55 if (err) reject(); |
|
56 else { |
|
57 makeExecutable(fileName); |
|
58 resolve(fileName); |
|
59 } |
|
60 }); |
|
61 return promise; |
|
62 } |
|
63 |
|
64 // TODO Use fs.chmod once implemented, bug 914606 |
|
65 function makeExecutable (name) { |
|
66 let { CC } = require('chrome'); |
|
67 let nsILocalFile = CC('@mozilla.org/file/local;1', 'nsILocalFile', 'initWithPath'); |
|
68 let file = nsILocalFile(name); |
|
69 file.permissions = parseInt('0777', 8); |
|
70 } |
|
71 |
|
72 function deleteFile (name) { |
|
73 let file = join(PROFILE_DIR, name); |
|
74 if (existsSync(file)) |
|
75 unlinkSync(file); |
|
76 } |
|
77 |
|
78 function cleanUp () { |
|
79 Object.keys(scripts).forEach(deleteFile); |
|
80 } |
|
81 exports.cleanUp = cleanUp; |