diff --git a/index.js b/index.js index d8be9a2..3bbf40e 100644 --- a/index.js +++ b/index.js @@ -5,13 +5,52 @@ var axios = require('axios'); var Promise = require('promise'); var shell = require('shelljs'); var save = require('save-file'); +var argsParser = require("args-parser"); const AUTHOR = 1; const REPOSITORY = 2; const BRANCH = 4; + +// The default output directory is the current directory +var outputDirectory = './'; + +const args = argsParser(process.argv); +(function tackleArgs() { + // The url is required and should be a valid github repository url + if (!args.url) { + throw new Error("input a url") + } else { + checkGithubRepoUrlvalidity(args.url); + } + + if (args.out) { + outputDirectory = args.out; + if (outputDirectory[args.out.length-1] !== '/') { + outputDirectory = outputDirectory + "/"; + } + + // Expand tilde + if (outputDirectory[0] === '~') { + outputDirectory = os.homedir() + outputDirectory.substring(1); + } + } +})(); + +function checkGithubRepoUrlvalidity(downloadUrl) { + var {hostname, pathname} = url.parse(downloadUrl, true); + + if (hostname !== "github.com") { + throw new Error("Invalid domain: github.com is expected!") + } + + if (pathname.split('/').length < 3) { + throw new Error("Invalid url: https://github.com/user/repository is expected") + } +} + var parameters = { - url: "https://github.com/Gyumeijie/qemu-object-model/tree/master/qom", + url: args.url, fileName: undefined, rootDirectory: undefined }; @@ -127,14 +166,15 @@ function extractFilenameAndDirectoryFrom(path) { function saveFiles(files, requestPromises){ - shell.mkdir('-p', repoInfo.rootDirectoryName); - var rootDir = repoInfo.rootDirectoryName; + var rootDir = outputDirectory + repoInfo.rootDirectoryName; + shell.mkdir('-p', rootDir); + Promise.all(requestPromises).then(function(data) { for(let i=0; i { + + save(file.data, outputDirectory + pathForSave.filename, (err, data) => { if (err) throw err; }) }).catch(function(error){ @@ -197,7 +240,8 @@ function initializeDownload(parameters) { url: repoUrl, ...authentication }).then(function(response){ - var filename = `${repoInfo.repository}.zip`; + shell.mkdir('-p', outputDirectory); + var filename = outputDirectory + `${repoInfo.repository}.zip`; response.data.pipe(fs.createWriteStream(filename)) .on('close', function () { console.log(`${filename} downloaded.`); @@ -206,7 +250,6 @@ function initializeDownload(parameters) { console.log("error: ", error.message); }); } else { - // Download part of repository axios({ ...basicOptions, @@ -224,4 +267,4 @@ function initializeDownload(parameters) { } } -initializeDownload(parameters); \ No newline at end of file +initializeDownload(parameters); diff --git a/package-lock.json b/package-lock.json index 702cbcc..475877a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "args-parser": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/args-parser/download/args-parser-1.1.0.tgz", + "integrity": "sha1-YlO/zWlNJ5/mPqr9eNYo0UoF/6k=" + }, "asap": { "version": "2.0.6", "resolved": "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", diff --git a/package.json b/package.json index 60b64b9..37187f0 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "author": "Gyumeijie", "license": "ISC", "dependencies": { + "args-parser": "^1.1.0", "axios": "^0.18.0", "jszip": "^3.1.5", "promise": "^8.0.1",