git-thing 1.0.0
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/dist/cli.js +3 -0
- package/package.json +64 -0
- package/readme.md +25 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import ie from"react";import{render as ae}from"ink";import T,{useState as H,useEffect as re}from"react";import{Box as N,Text as P,useApp as se,useInput as ne}from"ink";import c,{useState as D,useEffect as W}from"react";import{Box as I,Text as B,useInput as $}from"ink";import{useState as O,useEffect as V,useCallback as G}from"react";import{execFile as y}from"child_process";function X(){let[u,d]=O([]),[C,a]=O(!0),[x,o]=O(null),r=G(()=>{y("git",["branch"],(n,h,i)=>{if(a(!1),n){i.includes("not a git repository")?o("Not a git repository"):o(i||n.message);return}let l=h.split(`
|
|
3
|
+
`).filter(b=>b.trim()).map(b=>{let t=b.startsWith("*");return{name:b.replace(/^\*?\s+/,""),isCurrent:t}});d(l)})},[]),v=G(n=>new Promise((h,i)=>{y("git",["checkout",n],(l,b,t)=>{if(l){i(new Error(t||l.message));return}r(),h()})}),[r]),s=G(({baseBranch:n,autoStash:h})=>new Promise((i,l)=>{u.find(t=>t.isCurrent)?.name==="master"?y("git",["pull","--rebase","origin","master"],(t,m,S)=>{if(t){l(new Error(S||t.message));return}r(),i(m||"Successfully pulled and rebased master")}):y("git",["fetch","origin","master:master"],(t,m,S)=>{if(t){l(new Error(S||t.message));return}let f=["rebase"];h&&f.push("--autostash"),f.push(n),y("git",f,(E,g,A)=>{if(E){l(new Error(A||E.message));return}r(),i(g||`Successfully rebased onto ${n}`)})})}),[r,u]);return V(()=>{r()},[r]),{branches:u,loading:C,error:x,refresh:r,checkout:v,rebaseMaster:s}}var e={heading:{text:"BRANCHES",color:"blue",bold:!0,borderStyle:"double",borderColor:"blue",paddingX:2,paddingY:0,marginBottom:0},branch:{currentColor:"green",selectedColor:"blue",selectedBold:!0},help:{dimmed:!0},error:{color:"red"},modes:{selection:{label:"Selection",color:"blue"},rebase:{label:"Rebase Master",color:"magenta"},settings:{label:"Settings",color:"cyan"}},status:{successColor:"green",errorColor:"red"},tabs:{activeColor:"cyan",inactiveColor:"gray"}};function Y({baseBranch:u,autoStash:d,isActive:C,onStatusChange:a}){let{branches:x,loading:o,error:r,checkout:v,rebaseMaster:s}=X(),[n,h]=D(0),[i,l]=D("selection"),[b,t]=D(null);W(()=>{if(!b)return;let f=setTimeout(()=>{t(null)},3e3);return()=>clearTimeout(f)},[b]);let m=()=>{l(f=>f==="selection"?"rebase":"selection")};if($((f,E)=>{if(E.shift&&E.tab){m();return}if(E.upArrow)h(g=>g>0?g-1:x.length-1);else if(E.downArrow)h(g=>g<x.length-1?g+1:0);else if(E.return){let g=x[n];if(g&&!g.isCurrent){if(i==="selection")v(g.name).catch(A=>{a(A.message,"error")});else if(i==="rebase"){let A=g.name;s({baseBranch:u,autoStash:d}).then(()=>{t(A)}).catch(J=>{a(J.message,"error")})}}}},{isActive:C}),o)return c.createElement(B,{dimColor:!0},"Loading branches...");if(r)return c.createElement(B,{color:e.error.color},"Error: ",r);if(x.length===0)return c.createElement(B,{dimColor:!0},"No branches found");let S=e.modes[i];return c.createElement(I,{flexDirection:"column"},c.createElement(I,{alignSelf:"flex-start",borderStyle:e.heading.borderStyle,borderColor:e.heading.borderColor,paddingX:e.heading.paddingX,paddingY:e.heading.paddingY,marginBottom:e.heading.marginBottom},c.createElement(B,{bold:e.heading.bold,color:e.heading.color},e.heading.text)),c.createElement(I,{marginBottom:1},c.createElement(B,null,"MODE: "),c.createElement(B,{bold:!0,color:S.color},S.label),i==="rebase"&&c.createElement(B,{dimColor:!0}," (base: ",u,")")),x.map((f,E)=>{let g=E===n,A=f.name===b;return c.createElement(I,{key:f.name},c.createElement(B,{color:f.isCurrent?e.branch.currentColor:void 0},f.isCurrent?"* ":" "),c.createElement(B,{color:g?S.color:void 0,bold:g&&e.branch.selectedBold},f.name),A&&c.createElement(B,{bold:!0,color:e.modes.rebase.color}," ","REBASED"))}),c.createElement(I,{marginTop:1},c.createElement(B,{dimColor:e.help.dimmed},"\u2191\u2193 navigate Enter ",i==="selection"?"checkout":"rebase"," Shift+Tab switch mode Tab switch tab q quit")))}import p,{useState as L}from"react";import{Box as M,Text as w,useInput as j}from"ink";function _({baseBranch:u,autoStash:d,onBaseBranchChange:C,onAutoStashChange:a,isActive:x}){let[o,r]=L("baseBranch"),[v,s]=L(u),[n,h]=L(!1),i=["baseBranch","autoStash"];j((b,t)=>{if(n){t.return?(v.trim()&&C(v.trim()),h(!1)):t.escape?(s(u),h(!1)):t.backspace||t.delete?s(m=>m.slice(0,-1)):b&&!t.ctrl&&!t.meta&&!t.tab&&s(m=>m+b);return}if(t.upArrow){let m=i.indexOf(o),S=m>0?m-1:i.length-1;r(i[S])}else if(t.downArrow){let m=i.indexOf(o),S=m<i.length-1?m+1:0;r(i[S])}else(t.return||b===" ")&&(o==="baseBranch"?(h(!0),s(u)):o==="autoStash"&&a(!d))},{isActive:x});let l=e.modes.settings;return p.createElement(M,{flexDirection:"column"},p.createElement(M,{alignSelf:"flex-start",borderStyle:e.heading.borderStyle,borderColor:l.color,paddingX:e.heading.paddingX,paddingY:e.heading.paddingY,marginBottom:1},p.createElement(w,{bold:!0,color:l.color},"SETTINGS")),p.createElement(M,null,p.createElement(w,{color:o==="baseBranch"?l.color:void 0},o==="baseBranch"?"\u25B8 ":" "),p.createElement(w,null,"Base Branch: "),n?p.createElement(w,{color:"yellow"},v,"\u2588"):p.createElement(w,{bold:o==="baseBranch",color:l.color},u)),p.createElement(M,null,p.createElement(w,{color:o==="autoStash"?l.color:void 0},o==="autoStash"?"\u25B8 ":" "),p.createElement(w,null,"Auto Stash: "),p.createElement(w,{bold:o==="autoStash",color:d?"green":"red"},d?"ON":"OFF")),p.createElement(M,{marginTop:1},p.createElement(w,{dimColor:e.help.dimmed},n?"Enter save Esc cancel":"\u2191\u2193 navigate Enter/Space toggle Tab switch tab q quit")))}import{useState as z,useEffect as Q,useCallback as Z}from"react";import{readFileSync as k,writeFileSync as R,existsSync as ee}from"fs";import{homedir as te}from"os";import{join as oe}from"path";var q=oe(te(),".git-thing-settings.json"),K={baseBranch:"main",autoStash:!0};function U(){let[u,d]=z(K);Q(()=>{if(ee(q))try{let a=JSON.parse(k(q,"utf-8"));d({...K,...a})}catch{}},[]);let C=Z((a,x)=>{d(o=>{let r={...o,[a]:x};return R(q,JSON.stringify(r,null,2)),r})},[]);return{settings:u,updateSetting:C}}function F(){let{exit:u}=se(),{settings:d,updateSetting:C}=U(),[a,x]=H("branches"),[o,r]=H(null);re(()=>{if(!o)return;let s=setTimeout(()=>{r(null)},3e3);return()=>clearTimeout(s)},[o]),ne((s,n)=>{(s==="q"||n.ctrl&&s==="c")&&u(),n.tab&&!n.shift&&x(h=>h==="branches"?"settings":"branches")});let v=(s,n)=>{r(s?{text:s,type:n}:null)};return T.createElement(N,{flexDirection:"column"},T.createElement(N,{marginBottom:1},T.createElement(P,{bold:a==="branches",color:a==="branches"?e.tabs.activeColor:e.tabs.inactiveColor},"[Branches]"),T.createElement(P,null," "),T.createElement(P,{bold:a==="settings",color:a==="settings"?e.tabs.activeColor:e.tabs.inactiveColor},"[Settings]")),T.createElement(N,{flexDirection:"column",flexGrow:1},a==="branches"?T.createElement(Y,{baseBranch:d.baseBranch,autoStash:d.autoStash,isActive:a==="branches",onStatusChange:v}):T.createElement(_,{baseBranch:d.baseBranch,autoStash:d.autoStash,onBaseBranchChange:s=>C("baseBranch",s),onAutoStashChange:s=>C("autoStash",s),isActive:a==="settings"})),T.createElement(N,{marginTop:1,height:1},o?T.createElement(P,{color:o.type==="success"?e.status.successColor:e.status.errorColor},o.text):T.createElement(P,{dimColor:!0},"Press q to exit")))}ae(ie.createElement(F,null));
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "git-thing",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A TUI for managing git branches and rebasing",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"git-thing": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=16"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"start": "tsup && node dist/cli.js",
|
|
16
|
+
"test": "prettier --check . && xo && ava"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"ink": "^4.1.0",
|
|
23
|
+
"react": "^18.2.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@sindresorhus/tsconfig": "^3.0.1",
|
|
27
|
+
"@types/react": "^18.0.32",
|
|
28
|
+
"@vdemedes/prettier-config": "^2.0.1",
|
|
29
|
+
"ava": "^5.2.0",
|
|
30
|
+
"chalk": "^5.2.0",
|
|
31
|
+
"eslint-config-xo-react": "^0.27.0",
|
|
32
|
+
"eslint-plugin-react": "^7.32.2",
|
|
33
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
34
|
+
"ink-testing-library": "^3.0.0",
|
|
35
|
+
"prettier": "^2.8.7",
|
|
36
|
+
"ts-node": "^10.9.1",
|
|
37
|
+
"tsup": "^8.5.1",
|
|
38
|
+
"tsx": "^4.21.0",
|
|
39
|
+
"typescript": "^5.0.3",
|
|
40
|
+
"xo": "^0.53.1"
|
|
41
|
+
},
|
|
42
|
+
"ava": {
|
|
43
|
+
"extensions": {
|
|
44
|
+
"ts": "module",
|
|
45
|
+
"tsx": "module"
|
|
46
|
+
},
|
|
47
|
+
"nodeArguments": [
|
|
48
|
+
"--loader=ts-node/esm"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"xo": {
|
|
52
|
+
"extends": "xo-react",
|
|
53
|
+
"prettier": true,
|
|
54
|
+
"rules": {
|
|
55
|
+
"react/prop-types": "off"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"prettier": {
|
|
59
|
+
"semi": false,
|
|
60
|
+
"singleQuote": true,
|
|
61
|
+
"bracketSpacing": false,
|
|
62
|
+
"useTabs": true
|
|
63
|
+
}
|
|
64
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Git-thing
|
|
2
|
+
|
|
3
|
+
> This readme is automatically generated by [create-ink-app](https://github.com/vadimdemedes/create-ink-app)
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
$ npm install --global Git-thing
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## CLI
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
$ Git-thing --help
|
|
15
|
+
|
|
16
|
+
Usage
|
|
17
|
+
$ Git-thing
|
|
18
|
+
|
|
19
|
+
Options
|
|
20
|
+
--name Your name
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
$ Git-thing --name=Jane
|
|
24
|
+
Hello, Jane
|
|
25
|
+
```
|