UNPKG

3.88 kBJavaScriptView Raw
1var Download = require("download");
2var gitclone = require("git-clone");
3var rm = require("rimraf").sync;
4
5/**
6 * Expose `download`.
7 */
8
9module.exports = download;
10
11/**
12 * Download `repo` to `dest` and callback `fn(err)`.
13 *
14 * @param {String} repo
15 * @param {String} dest
16 * @param {Function} fn
17 */
18
19function download(repo, dest, opts, fn) {
20 if (typeof opts === "function") {
21 fn = opts;
22 opts = null;
23 }
24 opts = opts || {};
25 var clone = opts.clone || false;
26
27 repo = normalize(repo);
28 var url = getUrl(repo, clone);
29
30 if (clone) {
31 gitclone(url, dest, { checkout: repo.checkout }, function(err) {
32 if (err === undefined) {
33 rm(dest + "/.git");
34 fn();
35 }
36 else {
37 fn(err);
38 }
39 });
40 }
41 else {
42 new Download({ mode: "666", extract: true, strip: 1 }).get(url+'?v=345').dest(dest).run(function(err, files) {
43 err === null ? fn() : fn(err);
44 });
45 }
46}
47
48/**
49 * Normalize a repo string.
50 *
51 * @param {String} string
52 * @return {Object}
53 */
54
55function normalize(repo) {
56 var regex = /^((github|gitlab|bitbucket):)?((.+):)?([^/]+)\/([^#]+)(#(.+))?$/;
57 var match = regex.exec(repo);
58 var type = match[2] || "github";
59 var host = match[4] || null;
60 var owner = match[5];
61 var name = match[6];
62 var checkout = match[8] || "master";
63
64 if (host == null) {
65 if (type === "github")
66 host = "github.com";
67 else if (type === "gitlab")
68 host = "gitlab.com";
69 else if (type === "bitbucket")
70 host = "bitbucket.com";
71 else if(type === "coding")
72 host = "coding.net"
73 }
74
75 return {
76 type: type,
77 host: host,
78 owner: owner,
79 name: name,
80 checkout: checkout
81 };
82}
83
84/**
85 * Return a zip or git url for a given `repo`.
86 *
87 * @param {Object} repo
88 * @return {String}
89 */
90
91function getUrl(repo, clone) {
92 var url;
93
94 if (repo.type === "github")
95 url = github(repo, clone);
96 else if (repo.type === "gitlab")
97 url = gitlab(repo, clone);
98 else if (repo.type === "bitbucket")
99 url = bitbucket(repo, clone);
100 else
101 url = coding(repo, clone);
102
103 return url;
104}
105
106
107/**
108 * Return a Coding url for a given `repo` object.
109 *
110 * @param {Object} repo
111 * @return {String}
112 */
113
114function coding(repo, clone){
115 var url;
116// git@git.coding.net:skdream/zhuanti.git
117 if (clone)
118 url = "git@git." + repo.host + ":" + repo.owner + "/" + repo.name + ".git";
119 else
120 // https://coding.net/u/skdream/p/zhuanti/git/archive/master
121 url = "https://" + repo.host + "/u/" + repo.owner + "/p/" + repo.name + "/git/archive/" + repo.checkout + '?v=555';
122 return url;
123}
124
125
126/**
127 * Return a GitHub url for a given `repo` object.
128 *
129 * @param {Object} repo
130 * @return {String}
131 */
132
133function github(repo, clone) {
134 var url;
135
136 if (clone)
137 url = "git@" + repo.host + ":" + repo.owner + "/" + repo.name + ".git";
138 else
139 url = "https://" + repo.host + "/" + repo.owner + "/" + repo.name + "/archive/" + repo.checkout + ".zip";
140
141 return url;
142}
143
144/**
145 * Return a GitLab url for a given `repo` object.
146 *
147 * @param {Object} repo
148 * @return {String}
149 */
150
151function gitlab(repo, clone) {
152 var url;
153
154 if (clone)
155 url = "git@" + repo.host + ":" + repo.owner + "/" + repo.name + ".git";
156 else
157 url = "https://" + repo.host + "/" + repo.owner + "/" + repo.name + "/repository/archive.zip?ref=" + repo.checkout;
158
159 return url;
160}
161
162/**
163 * Return a Bitbucket url for a given `repo` object.
164 *
165 * @param {Object} repo
166 * @return {String}
167 */
168
169function bitbucket(repo, clone) {
170 var url;
171
172 if (clone)
173 url = "git@" + repo.host + ":" + repo.owner + "/" + repo.name + ".git";
174 else
175 url = "https://" + repo.host + "/" + repo.owner + "/" + repo.name + "/get/" + repo.checkout + ".zip";
176
177 return url;
178}