gitpick 5.2.0 ā 5.3.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.mjs +19 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
**Now with Interactive Mode.** Browse any repo right in your terminal. See every file, pick what you want, skip what you don't. Just `gitpick owner/repo -i` and you're in. No more guessing paths.
|
|
13
13
|
|
|
14
|
-
š¦ `Zero dependencies` / `Un/packed (~
|
|
14
|
+
š¦ `Zero dependencies` / `Un/packed (~38/14kb)` / `Faster and more features` yet drop-in replacement for `degit`
|
|
15
15
|
|
|
16
16
|
> #### Just `copy-and-paste` any GitHub, GitLab or Bitbucket URL - no editing required (shorthands work too) - to clone individual files, folders, branches, commits, raw content or even entire repositories without the `.git` directory.
|
|
17
17
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import e from"node:fs";import t from"node:os";import n from"node:path";import{parseArgs as r,stripVTControlCharacters as i}from"node:util";import{spawn as a}from"node:child_process";import{once as o}from"node:events";import s from"node:fs/promises";import c from"node:process";import{fileURLToPath as l}from"node:url";import u from"node:tty";import d from"node:https";var f=class extends Error{constructor(...e){super(...e),this.name=`SubprocessError`,this.stdout=``,this.stderr=``}};const p=[`.exe`,`.com`],m={},h=e=>(...t)=>m[t.join(`\0`)]??=e(...t),g=h(async(...e)=>{try{return await s.access(e[0]),!0}catch{return!1}}),_=h(async(e,t,r)=>{let i=r.split(n.delimiter).filter(Boolean).map(e=>e.replace(/^"(.*)"$/,`$1`));try{await Promise.any([t,...i].flatMap(t=>p.map(r=>g(`${n.resolve(t,e)}${r}`))))}catch{return!1}return!0}),v=async(e,t)=>c.platform===`win32`&&!t.shell&&!p.some(t=>e.toLowerCase().endsWith(t))&&!await _(e,t.cwd??`.`,(c.env.PATH||c.env.Path)??``),y=e=>e.replaceAll(/([()\][%!^"`<>&|;, *?])/g,`^$1`),b=e=>y(y(`"${e.replaceAll(/(\\*)"/g,`$1$1\\"`).replace(/(\\*)$/,`$1$1`)}"`)),x=e=>/[^\w./-]/.test(e)?`'${e.replaceAll(`'`,`'\\''`)}'`:e;async function S(e,t=[],r={}){let{stdin:s,stdout:u,stderr:d,stdio:p,cwd:m=`.`,env:h,...g}=r,_=m instanceof URL?l(m):n.resolve(m),S=h?{...c.env,...h}:void 0,C=p??[s,u,d],w=[e,...t].map(e=>x(i(e))).join(` `);[`node`,`node.exe`].includes(e.toLowerCase())&&(e=c.execPath,t=[...c.execArgv.filter(e=>!e.startsWith(`--inspect`)),...t]);let T={...g,stdio:C,env:S,cwd:_};await v(e,T)&&(t=t.map(e=>b(e)),e=y(e),T={...T,shell:!0}),T.shell&&t.length>0&&(e=[e,...t].join(` `),t=[]);let E=a(e,t,T),D=``,O=``;E.stdout&&(E.stdout.setEncoding(`utf8`),E.stdout.on(`data`,e=>D+=e)),E.stderr&&(E.stderr.setEncoding(`utf8`),E.stderr.on(`data`,e=>O+=e)),E.once(`error`,()=>{});try{await o(E,`spawn`)}catch(e){throw Object.assign(new f(`Command failed: ${w}`,{cause:e}),{stdout:D,stderr:O})}await o(E,`close`);let k=e=>e.at(-1)===`
|
|
3
|
-
`?e.slice(0,e.at(-2)===`\r`?-2:-1):e;if(E.exitCode&&E.exitCode>0)throw Object.assign(new f(`Command failed with exit code ${E.exitCode}: ${w}`),{stdout:k(D),stderr:k(O),exitCode:E.exitCode});if(E.signalCode)throw Object.assign(new f(`Command was terminated with ${E.signalCode}: ${w}`),{stdout:k(D),stderr:k(O)});return{stdout:k(D),stderr:k(O)}}const C=u?.WriteStream?.prototype?.hasColors?.()??!1,w=(e,t)=>{if(!C)return e=>e;let n=`\u001B[${e}m`,r=`\u001B[${t}m`;return e=>{let i=e+``,a=i.indexOf(r);if(a===-1)return n+i+r;let o=n,s=0,c=(t===22?r:``)+n;for(;a!==-1;)o+=i.slice(s,a)+c,s=a+r.length,a=i.indexOf(r,s);return o+=i.slice(s)+r,o}},T=w(1,22),E=w(2,22),D=w(31,39),O=w(32,39),k=w(33,39),A=w(36,39),
|
|
4
|
-
`),r=0;for(let e of n)r+=Math.max(1,Math.ceil(e.length/t));return r},m=()=>{if(!o)return;let e=Date.now();(t===-1||e-l>=80)&&(t=++t%
|
|
5
|
-
`;for(let e=0;e<
|
|
6
|
-
`}for(let e=
|
|
7
|
-
`;
|
|
8
|
-
`;let
|
|
9
|
-
`,
|
|
10
|
-
`;let
|
|
11
|
-
`){
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
`?e.slice(0,e.at(-2)===`\r`?-2:-1):e;if(E.exitCode&&E.exitCode>0)throw Object.assign(new f(`Command failed with exit code ${E.exitCode}: ${w}`),{stdout:k(D),stderr:k(O),exitCode:E.exitCode});if(E.signalCode)throw Object.assign(new f(`Command was terminated with ${E.signalCode}: ${w}`),{stdout:k(D),stderr:k(O)});return{stdout:k(D),stderr:k(O)}}const C=u?.WriteStream?.prototype?.hasColors?.()??!1,w=(e,t)=>{if(!C)return e=>e;let n=`\u001B[${e}m`,r=`\u001B[${t}m`;return e=>{let i=e+``,a=i.indexOf(r);if(a===-1)return n+i+r;let o=n,s=0,c=(t===22?r:``)+n;for(;a!==-1;)o+=i.slice(s,a)+c,s=a+r.length,a=i.indexOf(r,s);return o+=i.slice(s)+r,o}},T=w(1,22),E=w(2,22),D=w(31,39),O=w(32,39),k=w(33,39),A=w(36,39),j=c.platform!==`win32`||!!c.env.WT_SESSION||c.env.TERM_PROGRAM===`vscode`,ee=e=>!!(e.isTTY&&c.env.TERM!==`dumb`&&!(`CI`in c.env)),te=O(j?`ā`:`ā`),M=j?[`ā `,`ā `,`ā ¹`,`ā ø`,`ā ¼`,`ā “`,`ā ¦`,`ā §`,`ā `,`ā `]:[`-`,`\\`,`|`,`/`],N=(e={})=>{let t=-1,n,r=e.text??``,a=e.stream??c.stderr,o=ee(a),s=0,l=0,u=!1,d=e=>a.write(e),f=()=>{if(!(!o||s===0)){a.cursorTo(0);for(let e=0;e<s;e++)e>0&&a.moveCursor(0,-1),a.clearLine(1);s=0}},p=e=>{let t=a.columns??80,n=i(e).split(`
|
|
4
|
+
`),r=0;for(let e of n)r+=Math.max(1,Math.ceil(e.length/t));return r},m=()=>{if(!o)return;let e=Date.now();(t===-1||e-l>=80)&&(t=++t%M.length,l=e);let n=M[t],i=`${A(n)} ${r}`;f(),d(i),s=p(i)};return{start(e){return r=e,u=!0,o&&d(`\x1B[?25l`),m(),o&&(n=setInterval(m,80)),this},success(e){return u?(u=!1,n&&=(clearInterval(n),void 0),f(),o&&d(`\x1B[?25h`),d(`${te} ${e??r}\n`),this):this}}},P=async(t,r,i)=>{let a=i??r,o=await e.promises.readdir(t,{withFileTypes:!0});await e.promises.mkdir(r,{recursive:!0});let s=[];for(let i of o){if(i.name===`.git`)continue;let o=n.join(t,i.name),c=n.join(r,i.name);if(i.isDirectory())s.push(...await P(o,c,a));else if(i.isSymbolicLink()){let t=await e.promises.readlink(o);await e.promises.symlink(t,c),s.push(n.relative(a,c))}else await e.promises.copyFile(o,c),s.push(n.relative(a,c))}return s},F=new Set;function ne(){for(let t of F)try{e.rmSync(t,{recursive:!0,force:!0})}catch{}process.exit(1)}process.on(`SIGINT`,ne),process.on(`SIGTERM`,ne);const re=e=>e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`,I=async(r,i,a)=>{let o=i.tree||i.quiet,s=i.verbose&&!o;process.platform===`win32`&&await S(`git`,[`config`,`--global`,`core.longpaths`,`true`]);let c=`https://${r.token?r.token+`@`:r.token}${r.host}/${r.owner}/${r.repository}.git`,l=`https://${r.host}/${r.owner}/${r.repository}.git`,u=n.resolve(t.tmpdir(),`${r.repository}-${Date.now()}${Math.random().toString(16).slice(2,6)}`);F.add(u);let d=N(),f=performance.now();!i.watch&&!o&&d.start(`Picking ${r.type}${r.type===`repository`?` without .git`:` from repository`}...`);let p=`shallow`,m=performance.now();try{await S(`git`,[`clone`,c,u,`--branch`,r.branch,`--depth`,`1`,`--single-branch`,...i.recursive?[`--recursive`]:[]])}catch{p=`full`,await S(`git`,[`clone`,c,u,...i.recursive?[`--recursive`]:[]]),await S(`git`,[`checkout`,r.branch],{cwd:u})}let h=Number(((performance.now()-m)/1e3).toFixed(2)),g=n.resolve(u,r.path),_=await e.promises.stat(g),v=[],y=performance.now();_.isDirectory()?(await e.promises.mkdir(a,{recursive:!0}),v=await P(g,a)):(await e.promises.mkdir(n.dirname(a),{recursive:!0}),await e.promises.copyFile(g,a),v=[n.basename(a)]);let b=Number(((performance.now()-y)/1e3).toFixed(2)),x=Number(((performance.now()-f)/1e3).toFixed(2)),C=0;for(let t of v)try{let r=await e.promises.stat(n.join(a,t));C+=r.size}catch{let t=await e.promises.stat(a);C+=t.size;break}return o||(i.watch?console.log(`- Synced at `+new Date().toLocaleTimeString()):d.success(`Picked ${r.type}${r.type===`repository`?` without .git`:` from repository`} in ${x} seconds.`)),s&&(console.log(E(` clone: ${p} (depth=${p===`shallow`?`1`:`full`})`)),console.log(E(` from: ${l} @ ${A(r.branch)}`)),console.log(E(` to: ${a}`)),console.log(E(` files: ${v.length} (${re(C)})`)),console.log(E(` network: ${h}s`)),console.log(E(` copy: ${b}s`)),console.log(E(` total: ${x}s`))),await e.promises.rm(u,{recursive:!0,force:!0}),F.delete(u),{files:v,duration:x,networkTime:h,copyTime:b,totalSize:C,cloneStrategy:p}},L=e=>e.replace(/\x1B\[\d+(?:;\d+)*m/g,``);function ie(e){let t=[],n=new Map,r=[...e].sort((e,t)=>e.type===t.type?e.path.localeCompare(t.path,void 0,{sensitivity:`base`}):e.type===`tree`?-1:1);for(let e of r){let r=e.path.split(`/`),i={name:r[r.length-1],path:e.path,type:e.type,size:e.size||0,linkTarget:e.linkTarget||``,children:[],expanded:!1,selected:!1,depth:r.length-1};if(e.type===`tree`&&n.set(e.path,i),r.length===1)t.push(i);else{let e=r.slice(0,-1).join(`/`),a=n.get(e);if(a)a.children.push(i);else{let e=``,a=t;for(let t=0;t<r.length-1;t++){e=e?e+`/`+r[t]:r[t];let i=n.get(e);i||(i={name:r[t],path:e,type:`tree`,size:0,linkTarget:``,children:[],expanded:!1,selected:!1,depth:t},n.set(e,i),a.push(i)),a=i.children}a.push(i)}}}function i(e){e.sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name,void 0,{sensitivity:`base`}):e.type===`tree`?-1:1);for(let t of e)t.children.length&&i(t.children)}return i(t),t}function R(e){let t=[];function n(e,r){for(let i=0;i<e.length;i++){let a=e[i],o=i===e.length-1,s=o?`āāā `:`āāā `;t.push({node:a,prefix:r,connector:s}),a.type===`tree`&&a.expanded&&n(a.children,r+(o?` `:`ā `))}}return n(e,``),t}function z(e,t){e.selected=t;for(let n of e.children)z(n,t)}function B(e,t){for(let n of e){if(n.path===t)return n;if(n.children.length){let e=B(n.children,t);if(e)return e}}return null}function ae(e){function t(e){for(let n of e)n.children.length&&(t(n.children),n.selected=n.children.every(e=>e.selected))}t(e)}function oe(e){let t=[];function n(e){for(let r of e)r.selected?r.type===`tree`?r.children.length>0&&r.children.every(e=>e.selected)||r.children.length===0?t.push(r.path):n(r.children):t.push(r.path):r.type===`tree`&&n(r.children)}return n(e),t}function se(e){let t=0,n=0,r=0,i=0;function a(e){for(let o of e)o.selected&&(o.type===`tree`?n++:o.type===`symlink`?r++:(t++,i+=o.size)),o.children.length&&a(o.children)}return a(e),{files:t,folders:n,symlinks:r,size:i}}const V=e=>e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`;function ce(t,r,i){return new Promise(a=>{let o=ie(t);if(!o.length){a([]);return}function s(e,t,n=0){for(let r of e)r.type===`tree`&&n<=t&&(r.expanded=!0,s(r.children,t,n+1))}t.length<=30?s(o,1/0):s(o,1);let c=0,l=0,u=process.stdout,d=process.stdin,f=d.isRaw;d.setRawMode(!0),d.resume(),u.write(`\x1B[?1049h\x1B[?25l`);function p(){d.setRawMode(f??!1),d.pause(),d.removeListener(`data`,y),u.removeListener(`resize`,g),u.write(`\x1B[?25h\x1B[?1049l`)}let m=()=>{u.write(`\x1B[?25h\x1B[?1049l`)},h=()=>{p(),process.removeListener(`exit`,m),process.removeListener(`SIGINT`,h),a([]),process.exit(0)},g=()=>_();process.on(`exit`,m),process.on(`SIGINT`,h),u.on(`resize`,g);function _(){let e=u.rows||24,t=u.columns||80,n=Math.max(1,e-3-1-5),a=R(o),s=c-1;s>=0?(s<l&&(l=s),s>=l+n&&(l=s-n+1)):l=0,l<0&&(l=0);let d=a.slice(l,l+n),{files:f,folders:p,symlinks:m,size:h}=se(o),g=`\x1B[H\x1B[2J`;g+=`\n ${r}\n\n`;let _=o.every(e=>e.selected),v=c===0,y=_?O(`ā`):E(`ā`),b=`${v?k(`>`):` `} ${y} ${E(`.`)}`;if(v){let e=Math.max(0,t-L(b).length);b=`\x1B[48;5;236m${b}${` `.repeat(e)}\x1B[49m`}g+=b+`
|
|
5
|
+
`;for(let e=0;e<d.length;e++){let n=d[e],r=l+e+1===c,i=n.node.selected?O(`ā`):E(`ā`),a=n.node.type===`tree`?A(n.node.name+`/`):n.node.type===`symlink`?k(n.node.name)+E(` -> `)+(n.node.linkTarget.endsWith(`/`)?A(n.node.linkTarget):n.node.linkTarget):n.node.name,o=n.node.type===`tree`?n.node.expanded?E(`ā¾ `):E(`āø `):` `,s=`${r?k(`>`):` `} ${i} ${E(n.prefix)}${E(n.connector)}${o}${a}`;if(r){let e=Math.max(0,t-L(s).length);s=`\x1B[48;5;236m${s}${` `.repeat(e)}\x1B[49m`}g+=s+`
|
|
6
|
+
`}for(let e=d.length;e<n;e++)g+=`
|
|
7
|
+
`;g+=`
|
|
8
|
+
`;let x=a.length>n?E(` ⢠${l+1}-${Math.min(l+n,a.length)}/${a.length}`):``,S;if(_)S=` all selected ${E(`ā¢`)} ${E(V(h))}${x}`;else if(f+p+m>0){let e=[];p>0&&e.push(A(`${p} folder${p===1?``:`s`}`)),f>0&&e.push(`${f} file${f===1?``:`s`}`),m>0&&e.push(k(`${m} symlink${m===1?``:`s`}`)),S=` ${[e.join(` `),E(V(h))].join(E(` ⢠`))}${x}`}else S=E(` press . to select all`)+x;g+=S+`
|
|
9
|
+
`,g+=`
|
|
10
|
+
`;let C=E(i?`āā:navigate enter:expand/preview space:select c:confirm q:quit`:`āā:navigate enter:expand space:select c:confirm q:quit`);g+=` ${C}\n`,u.write(g)}function v(t){let r=n.join(i,t.type===`symlink`?t.linkTarget.replace(/\/$/,``):t.path),a;try{let t=e.statSync(r);if(t.isDirectory())a=E(`(directory)`);else if(t.size>512*1024)a=E(`(file too large: ${V(t.size)})`);else{let n=e.readFileSync(r);a=n.includes(0)?E(`(binary file: ${V(t.size)})`):n.toString(`utf-8`)}}catch{a=E(`(unable to read file)`)}let o=0,s=a.split(`
|
|
11
|
+
`);function c(){let e=u.rows||24,n=u.columns||80,r=Math.max(1,e-3-3),i=`\x1B[H\x1B[2J`,a=t.type===`symlink`?k(t.name)+E(` -> `)+t.linkTarget:t.name;i+=`\n ${T(a)} ${E(V(t.size))}\n\n`;let c=s.slice(o,o+r);for(let e=0;e<r;e++)if(e<c.length){let t=E(`${String(o+e+1).padStart(4)} `);i+=`${t}${c[e].slice(0,n-5)}\n`}else i+=`
|
|
12
|
+
`;i+=`
|
|
13
|
+
`;let l=s.length>r?E(`${o+1}-${Math.min(o+r,s.length)}/${s.length}`):``,d=E(`āā:scroll esc/q:back`);i+=l?` ${l} ${d}\n`:` ${d}\n`,u.write(i)}function l(e){let t=e.toString(),n=u.rows||24,r=Math.max(1,n-6);if(t===`\x1B`||t===`q`||t===`Q`||t===`\r`){d.removeListener(`data`,l),d.on(`data`,y),_();return}(t===`\x1B[A`||t===`k`)&&o>0&&o--,(t===`\x1B[B`||t===`j`)&&o<s.length-r&&o++,c()}d.removeListener(`data`,y),d.on(`data`,l),c()}function y(e){let t=R(o),n=t.length+1,r=e.toString();if(r===``||r===`q`||r===`Q`){p(),process.removeListener(`exit`,m),process.removeListener(`SIGINT`,h),a([]);return}if(r===`c`||r===`C`){p(),process.removeListener(`exit`,m),process.removeListener(`SIGINT`,h),a(oe(o));return}if((r===`\x1B[A`||r===`k`)&&c>0&&c--,(r===`\x1B[B`||r===`j`)&&c<n-1&&c++,c===0&&(r===` `||r===`\r`)||r===`.`){let e=o.every(e=>e.selected);for(let t of o)z(t,!e)}if(r===` `&&c>0){let e=t[c-1];if(e){let t=!e.node.selected;if(z(e.node,t),t&&e.node.type===`symlink`&&e.node.linkTarget){let t=B(o,e.node.linkTarget.replace(/\/$/,``));t&&z(t,!0)}ae(o)}}if(r===`\r`&&c>0){let e=t[c-1];if(e&&e.node.type===`tree`)e.node.expanded=!e.node.expanded;else if(e&&i&&(e.node.type===`blob`||e.node.type===`symlink`)){v(e.node);return}}if((r===`\x1B[C`||r===`l`)&&c>0){let e=t[c-1];e&&e.node.type===`tree`&&(e.node.expanded=!0)}if((r===`\x1B[D`||r===`h`)&&c>0){let e=t[c-1];e&&e.node.type===`tree`&&(e.node.expanded=!1)}_()}d.on(`data`,y),_()})}function H(e){if(typeof e==`number`||/^\d+$/.test(e))return typeof e==`number`?e:parseInt(e,10);let t=/(\d+)([hms])/g,n=0,r;for(;(r=t.exec(e))!==null;){let e=parseInt(r[1],10);switch(r[2]){case`h`:n+=e*36e5;break;case`m`:n+=e*6e4;break;case`s`:n+=e*1e3;break}}return n}const U=async e=>{let t=(await S(`git`,[`ls-remote`,e])).stdout,n=t.match(/(.+)\s+HEAD/)?.[1],r=t.match(RegExp(`${n}\\s+refs/heads/(.+)`))?.[1];if(!r)throw Error(`Could not determine default branch!`);return r},W=[{prefix:`git@github.com:`,host:`github.com`},{prefix:`https://github.com/`,host:`github.com`},{prefix:`https://raw.githubusercontent.com/`,host:`github.com`},{prefix:`git@gitlab.com:`,host:`gitlab.com`},{prefix:`https://gitlab.com/`,host:`gitlab.com`},{prefix:`git@bitbucket.org:`,host:`bitbucket.org`},{prefix:`https://bitbucket.org/`,host:`bitbucket.org`}];async function le(e,{branch:t,target:n}){let r=e.match(/^https:\/\/([^@]+)@(github\.com|gitlab\.com|bitbucket\.org)/),i=``;if(r)i=r[1],e=e.replace(`${r[1]}@`,``);else{let t={"github.com":process.env.GITHUB_TOKEN||process.env.GH_TOKEN||``,"gitlab.com":process.env.GITLAB_TOKEN||``,"bitbucket.org":process.env.BITBUCKET_TOKEN||``};for(let{prefix:n,host:r}of W)if(e.startsWith(n)){i=t[r];break}!i&&!e.startsWith(`https://`)&&!e.startsWith(`git@`)&&(i=t[`github.com`])}let a=`github.com`;for(let{prefix:t,host:n}of W)if(e.startsWith(t)){a=n,e=e.replace(t,``);break}let o=e.split(`/`),s=o[0],c=o[1]?.endsWith(`.git`)?o[1].slice(0,-4):o[1],l=`https://${i&&i+`@`}${a}/${s}/${c}`,u,d,f;a===`github.com`?o[2]===`refs`&&[`heads`,`tags`].includes(o[3])?(u=`raw`,d=t||o[4],f=o.slice(5).join(`/`)):o[2]===`refs`&&o[3]===`remotes`?(u=`raw`,d=t||`${o[4]}/${o[5]}`,f=o.slice(6).join(`/`)):o[2]===`blob`?(u=`blob`,d=t||o[3],f=o.slice(4).join(`/`)):o[2]===`tree`?(u=`tree`,d=t||o[3],f=o.slice(4).join(`/`)):o[2]===`commit`?(u=`repository`,d=t||o[3],f=``):(u=`repository`,d=t||await U(l),f=``):a===`gitlab.com`?o[2]===`-`&&o[3]===`blob`?(u=`blob`,d=t||o[4],f=o.slice(5).join(`/`)):o[2]===`-`&&o[3]===`tree`?(u=`tree`,d=t||o[4],f=o.slice(5).join(`/`)):(u=`repository`,d=t||await U(l),f=``):o[2]===`src`?(u=`tree`,d=t||o[3],f=o.slice(4).join(`/`)):(u=`repository`,d=t||await U(l),f=``);let p=n||(u===`blob`?`.`:f.split(`/`).pop()||c);return{token:i,host:a,owner:s,repository:c,type:u,branch:d,path:f,target:p}}const G=n.join(t.homedir(),`.cache`,`gitpick`),K=n.join(G,`update-check.json`);function q(){try{return JSON.parse(e.readFileSync(K,`utf-8`))}catch{return null}}function ue(t){try{e.mkdirSync(G,{recursive:!0}),e.writeFileSync(K,JSON.stringify(t))}catch{}}function de(){return new Promise(e=>{let t=d.get(`https://registry.npmjs.org/gitpick/latest`,{headers:{Accept:`application/json`},timeout:3e3},t=>{if(t.statusCode!==200)return t.resume(),e(null);let n=``;t.on(`data`,e=>n+=e),t.on(`end`,()=>{try{e(JSON.parse(n).version||null)}catch{e(null)}})});t.on(`error`,()=>e(null)),t.on(`timeout`,()=>{t.destroy(),e(null)})})}function fe(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<3;e++){if((n[e]||0)>(r[e]||0))return!0;if((n[e]||0)<(r[e]||0))return!1}return!1}function J(e,t){if(t)return;let n=q();n&&fe(n.latestVersion,e)&&console.log(E(`\n Update available: ${k(e)} ā ${A(T(n.latestVersion))}\n Run ${A(`npm i -g gitpick`)} to update\n`))}function pe(){let e=q();e&&Date.now()-e.lastCheck<864e5||setTimeout(async()=>{let e=await de();e&&ue({lastCheck:Date.now(),latestVersion:e})},0)}const Y=Symbol(`singleComment`),me=Symbol(`multiComment`),X=(e,t,n)=>e.slice(t,n).replace(/[^ \t\r\n]/g,` `),he=(e,t)=>{let n=t-1,r=0;for(;e[n]===`\\`;)--n,r+=1;return!!(r%2)};function ge(e){if(typeof e!=`string`)throw TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof e}\``);let t=!1,n=!1,r=0,i=``,a=``,o=-1;for(let s=0;s<e.length;s++){let c=e[s],l=e[s+1];if(!n&&c===`"`&&(he(e,s)||(t=!t)),!t)if(!n&&c+l===`//`)i+=e.slice(r,s),r=s,n=Y,s++;else if(n===Y&&c+l===`\r
|
|
14
|
+
`){s++,n=!1,i+=X(e,r,s),r=s;continue}else if(n===Y&&c===`
|
|
15
|
+
`)n=!1,i+=X(e,r,s),r=s;else if(!n&&c+l===`/*`){i+=e.slice(r,s),r=s,n=me,s++;continue}else if(n===me&&c+l===`*/`){s++,n=!1,i+=X(e,r,s+1),r=s+1;continue}else n||(o===-1?c===`,`&&(a+=i+e.slice(r,s),i=``,r=s,o=s):c===`}`||c===`]`?(i+=e.slice(r,s),a+=X(i,0,1)+i.slice(1),i=``,r=s,o=-1):c!==` `&&c!==` `&&c!==`\r`&&c!==`
|
|
16
|
+
`&&(i+=e.slice(r,s),r=s,o=-1))}let s=n===Y?X(e,r):e.slice(r);return a+i+s}const _e=[`.gitpick.json`,`.gitpick.jsonc`],ve=async()=>{let t;for(let r of _e){let i=n.resolve(r);if(e.existsSync(i)){t=i;break}}if(!t)return!1;let r=await e.promises.readFile(t,`utf-8`),i=JSON.parse(ge(r));if(!Array.isArray(i)||!i.every(e=>typeof e==`string`))throw Error(`${n.basename(t)} must be an array of strings`);for(let e of i)await S(process.argv[0],[...process.argv.slice(1),...e.split(/\s+/),`-o`],{stdio:`inherit`});return!0};var ye=`gitpick`,Z=`5.3.0-canary.1`;const be=(e,t)=>`\x1b]8;;${t}\x07${e}\x1b]8;;\x07`,xe=`
|
|
14
17
|
With ${T(`${be(`GitPick`,`https://github.com/nrjdalal/gitpick`)}`)} clone specific directories or files from GitHub, GitLab and Bitbucket!
|
|
15
18
|
|
|
16
19
|
$ gitpick ${k(`<url>`)} ${O(`[target]`)} ${A(`[options]`)}
|
|
@@ -47,9 +50,9 @@ ${T(`Examples:`)}
|
|
|
47
50
|
$ gitpick https://gitlab.com/owner/repo
|
|
48
51
|
$ gitpick https://bitbucket.org/owner/repo
|
|
49
52
|
|
|
50
|
-
š More awesome tools at ${A(`https://github.com/nrjdalal`)}`,Q=e=>{let r=process.cwd(),i=t.homedir(),a=n.sep;return e===r?`.`:e.startsWith(r+a)?`./`+n.relative(r,e).replaceAll(a,`/`):e.startsWith(i+a)?`~/`+n.relative(i,e).replaceAll(a,`/`):e},$=async(t,r=``)=>{let i=(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.name!==`.git`).sort((e,t)=>e.name.localeCompare(t.name,void 0,{sensitivity:`base`}));for(let a=0;a<i.length;a++){let o=i[a],s=a===i.length-1,c=s?`āāā `:`āāā `,l=n.join(t,o.name);if(o.isSymbolicLink()){let t=await e.promises.readlink(l),n=!1;try{n=e.statSync(l).isDirectory()}catch{}process.stdout.write(`${r}${c}${k(o.name)} -> ${n?A(t):t}\n`)}else o.isDirectory()?(process.stdout.write(`${r}${c}${A(o.name)}\n`),await $(l,`${r}${s?` `:`ā `}`)):process.stdout.write(`${r}${c}${o.name}\n`)}},Se=e=>{try{return r(e)}catch(e){throw Error(`Error parsing arguments: ${e.message}`)}};(async()=>{
|
|
51
|
-
Repository has no files.`)),process.exit(0));let f=await
|
|
52
|
-
No files selected.`),process.exit(0)),s.dryRun){console.log(`\n${O(`ā`)} Would pick ${f.length} path${f.length===1?``:`s`}:`);for(let e of f)console.log(` ${e}`);await e.promises.rm(r,{recursive:!0,force:!0}),console.log(),
|
|
53
|
-
`)),
|
|
54
|
-
`)};if(s.dryRun){if(s.tree){let r=n.resolve(t.tmpdir(),`gitpick-dry-${Date.now()}${Math.random().toString(16).slice(2,6)}`);try{await
|
|
53
|
+
š More awesome tools at ${A(`https://github.com/nrjdalal`)}`,Q=e=>{let r=process.cwd(),i=t.homedir(),a=n.sep;return e===r?`.`:e.startsWith(r+a)?`./`+n.relative(r,e).replaceAll(a,`/`):e.startsWith(i+a)?`~/`+n.relative(i,e).replaceAll(a,`/`):e},$=async(t,r=``)=>{let i=(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.name!==`.git`).sort((e,t)=>e.name.localeCompare(t.name,void 0,{sensitivity:`base`}));for(let a=0;a<i.length;a++){let o=i[a],s=a===i.length-1,c=s?`āāā `:`āāā `,l=n.join(t,o.name);if(o.isSymbolicLink()){let t=await e.promises.readlink(l),n=!1;try{n=e.statSync(l).isDirectory()}catch{}process.stdout.write(`${r}${c}${k(o.name)} -> ${n?A(t):t}\n`)}else o.isDirectory()?(process.stdout.write(`${r}${c}${A(o.name)}\n`),await $(l,`${r}${s?` `:`ā `}`)):process.stdout.write(`${r}${c}${o.name}\n`)}},Se=e=>{try{return r(e)}catch(e){throw Error(`Error parsing arguments: ${e.message}`)}};(async()=>{pe();try{let{positionals:r,values:i}=Se({allowPositionals:!0,options:{branch:{type:`string`,short:`b`},"dry-run":{type:`boolean`,short:`n`},force:{type:`boolean`,short:`f`},help:{type:`boolean`,short:`h`},interactive:{type:`boolean`,short:`i`},quiet:{type:`boolean`,short:`q`},tree:{type:`boolean`},verbose:{type:`boolean`},overwrite:{type:`boolean`,short:`o`},recursive:{type:`boolean`,short:`r`},version:{type:`boolean`,short:`v`},watch:{type:`string`,short:`w`}}});r.length||(i.version&&(console.log(`\n${ye}@${Z}`),process.exit(0)),await ve()&&process.exit(0),console.log(xe),process.exit(0)),r[0]===`clone`&&r.shift();let[a,o]=r,s={branch:i.branch,dryRun:i[`dry-run`],force:i.force,interactive:i.interactive,quiet:i.quiet,tree:i.tree,verbose:i.verbose,overwrite:i.overwrite,recursive:i.recursive,watch:i.watch},c=s.tree||s.quiet;c||console.log(`\nWith ${T(`${be(`GitPick`,`https://github.com/nrjdalal/gitpick`)}`)} clone specific files, folders, branches,\ncommits and much more from GitHub, GitLab and Bitbucket!`);let l=await le(a,{branch:s.branch,target:o});if(l.type===`blob`){let e=l.target.split(/[/\\]/).filter(e=>e!==``),t=e[e.length-1];t!==`.`&&t!==`..`&&t.includes(`.`)?e.pop():t=l.path.split(`/`).pop()||t,l.target=[...e,t].join(`/`)}c||console.info(`\n${O(`ā`)} ${l.owner}/${l.repository} ${A(l.type+`:`+l.branch)} ${l.type===`repository`?`> ${O(l.target)}`:`${l.path.length?k(l.path)+` >`:`>`} ${O(l.target)}`}`);let u=n.resolve(l.target);if(s.interactive){if(!process.stdout.isTTY)throw Error(`Interactive mode requires a TTY`);let r=n.resolve(t.tmpdir(),`gitpick-interactive-${Date.now()}${Math.random().toString(16).slice(2,6)}`),i=`https://${l.token?l.token+`@`:``}${l.host}/${l.owner}/${l.repository}.git`,a=N();a.start(`Fetching ${l.owner}/${l.repository}...`);try{await S(`git`,[`clone`,i,r,`--branch`,l.branch,`--depth`,`1`,`--single-branch`,...s.recursive?[`--recursive`]:[]])}catch{await S(`git`,[`clone`,i,r,...s.recursive?[`--recursive`]:[]]),await S(`git`,[`checkout`,l.branch],{cwd:r})}let o=l.path?n.join(r,l.path):r,c=[];async function d(t,r){let i=await e.promises.readdir(t,{withFileTypes:!0});for(let a of i){if(a.name===`.git`)continue;let i=r?`${r}/${a.name}`:a.name,o=n.join(t,a.name);if(a.isSymbolicLink()){let t=await e.promises.readlink(o),n=!1;try{n=(await e.promises.stat(o)).isDirectory()}catch{}c.push({path:i,type:`symlink`,linkTarget:n?t+`/`:t})}else if(a.isDirectory())c.push({path:i,type:`tree`}),await d(o,i);else{let t=await e.promises.stat(o);c.push({path:i,type:`blob`,size:t.size})}}}await d(o,``),a.success(`Fetched ${l.owner}/${l.repository} (${c.length} entries)`),c.length||(await e.promises.rm(r,{recursive:!0,force:!0}),console.log(k(`
|
|
54
|
+
Repository has no files.`)),process.exit(0));let f=await ce(c,`${l.owner}/${l.repository} ${A(`repository:`+l.branch)} > ${O(l.target)}`,o);if(f.length||(await e.promises.rm(r,{recursive:!0,force:!0}),console.log(`
|
|
55
|
+
No files selected.`),process.exit(0)),s.dryRun){console.log(`\n${O(`ā`)} Would pick ${f.length} path${f.length===1?``:`s`}:`);for(let e of f)console.log(` ${e}`);await e.promises.rm(r,{recursive:!0,force:!0}),console.log(),J(Z,!1),process.exit(0)}console.log(`\n${O(`ā`)} Picking ${f.length} selected path${f.length===1?``:`s`}...`),e.existsSync(u)&&!s.overwrite&&(await e.promises.readdir(u)).length&&(await e.promises.rm(r,{recursive:!0,force:!0}),console.log(`${k(`\nWarning: The target directory exists at ${O(l.target)} and is not empty. Use ${A(`-f`)} or ${A(`-o`)} to overwrite.`)}`),process.exit(1)),await e.promises.mkdir(u,{recursive:!0});let p=0;for(let t of f){let r=n.join(o,t),i=n.join(u,t),a=await e.promises.stat(r).catch(()=>null);if(a)if(a.isDirectory()){await e.promises.mkdir(i,{recursive:!0});let t=await P(r,i);p+=t.length}else await e.promises.mkdir(n.dirname(i),{recursive:!0}),await e.promises.copyFile(r,i),p++}await e.promises.rm(r,{recursive:!0,force:!0}),console.log(O(`ā Copied ${p} file${p===1?``:`s`} to ${Q(u)}`)),s.tree&&(process.stdout.write(`\n${T(A(Q(u)))}\n`),await $(u),process.stdout.write(`
|
|
56
|
+
`)),J(Z,!1),process.exit(0)}let d=async t=>{e.statSync(t).isDirectory()?(process.stdout.write(`${T(A(Q(u)))}\n`),await $(t)):(process.stdout.write(`${T(A(Q(n.dirname(u))))}\n`),process.stdout.write(`āāā ${n.basename(u)}\n`)),process.stdout.write(`
|
|
57
|
+
`)};if(s.dryRun){if(s.tree){let r=n.resolve(t.tmpdir(),`gitpick-dry-${Date.now()}${Math.random().toString(16).slice(2,6)}`);try{await I(l,s,r),await d(r)}finally{await e.promises.rm(r,{recursive:!0,force:!0})}}c||console.log(),J(Z,c),process.exit(0)}if(s.overwrite=s.overwrite||s.force,s.watch&&(s.overwrite=!0),e.existsSync(u)&&!s.overwrite&&(l.type===`blob`&&(console.log(`${k(`\nWarning: The target file exists at ${O(l.target)}. Use ${A(`-f`)} or ${A(`-o`)} to overwrite.`)}`),process.exit(1)),(await e.promises.readdir(u)).length&&(console.log(`${k(`\nWarning: The target directory exists at ${O(l.target)} and is not empty. Use ${A(`-f`)} or ${A(`-o`)} to overwrite.`)}`),process.exit(1))),s.watch){c||console.log(`\nš Watching every ${H(s.watch)/1e3+`s`}\n`),await I(l,s,u),s.tree&&await d(u);let e=H(s.watch);setInterval(async()=>{await I(l,s,u),s.tree&&await d(u)},e)}else await I(l,s,u),s.tree&&await d(u),J(Z,c),process.exit(0)}catch(e){e instanceof Error?console.log(T(`\n${D(`Error: `)}`)+e.message):console.log(T(`${D(`
|
|
55
58
|
Unexpected Error: `)}`)+JSON.stringify(e,null,2)),process.exit(1)}})();export{};
|