diff options
author | bptato <nincsnevem662@gmail.com> | 2024-06-08 02:51:20 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-06-08 02:56:39 +0200 |
commit | 83245df67c9c5482fdb5be5d9ac6fdad71bebaac (patch) | |
tree | fe31593b55dc6dc071b9d8e7f94739916bb98816 /bonus/git.cgi | |
parent | b177168e78703765c65e4ef24cd911083497af49 (diff) | |
download | chawan-83245df67c9c5482fdb5be5d9ac6fdad71bebaac.tar.gz |
git.cgi: add git stash list, switch -> branch
* gitcha stash list special processing * gitcha switch no longer opens the branch view; it is now opened by gitcha branch * make gitcha branch UI consistent with the rest of the script. (the idea is that clicking on refs does not modify the repo, only action links like (switch) or (apply).)
Diffstat (limited to 'bonus/git.cgi')
-rwxr-xr-x | bonus/git.cgi | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/bonus/git.cgi b/bonus/git.cgi index 387f3a64..29390d74 100755 --- a/bonus/git.cgi +++ b/bonus/git.cgi @@ -1,12 +1,16 @@ #!/usr/bin/env -S qjs --std -/* adds clickable links to commit hashes + a clickable UI to git switch +/* adds clickable links to git log, git branch and git stash list * usage: * 0. install QuickJS (https://bellard.org/quickjs) * 1. put this script in your CGI directory * 2. chmod +x /your/cgi-bin/directory/git.cgi * 3. ln -s /your/cgi-bin/directory/git.cgi /usr/local/bin/gitcha - * 4. run `gitcha log' or `gitcha switch' - * other params work too, but for those it's more convenient to use git. + * 4. run `gitcha log', `gitcha switch' or `gitcha stash list' + * other params work too, but without any special processing. it's still useful + * for ones that open the pager, like git show; this way you can reload the view + * with `U'. + * it's less convenient for e.g. git checkout and friends, so it may be best to + * just alias the pager-opening commands. * (if you have ansi2html, it also works with w3m. just set GITCHA_CHA=w3m) */ const gitcha = std.getenv("GITCHA_GITCHA") ?? "gitcha"; @@ -49,30 +53,36 @@ function startGitCmd(config, params) { return std.fdopen(read_fd2, "r"); } +function runGitCmd(config, params, regex, subfun) { + const f = startGitCmd(config, params); + while ((l = f.getline()) !== null) { + console.log(l.replace(regex, subfun)); + } + f.close(); +} + os.chdir(query.path); const config = ["-c", "color.ui=always", "-c", "log.decorate=short"]; const params = query.params ? decodeURIComponent(query.params).split(' ') .map(x => decodeURIComponent(x)) : []; +const cgi0 = `${query.prefix}git.cgi?prefix=${query.prefix}&path=${query.path}`; +const cgi1 = `${cgi0}¶ms=show`; +const cgi2 = `${cgi0}¶ms=log`; +const cgi3 = `${cgi0}¶ms=switch`; +const cgi4 = `${cgi0}¶ms=stash%20apply`; if (params[0] == "log") { - const f = startGitCmd(config, params); - const cgi = `${query.prefix}git.cgi?prefix=${query.prefix}&path=${query.path}¶ms=show`; - while ((l = f.getline()) !== null) { - console.log(l.replace(/[a-f0-9]{40}/g, - x => `<a href='${cgi}%20${x}'>${x}</a>`)); - } - f.close(); -} else if (params[0] == "switch" && params.length == 1) { - const f = startGitCmd(config, ["branch"]); - const cgi = `${query.prefix}git.cgi?prefix=${query.prefix}&path=${query.path}¶ms=switch`; - const cgi2 = `${query.prefix}git.cgi?prefix=${query.prefix}&path=${query.path}¶ms=log`; - while ((l = f.getline()) !== null) { - console.log(l.replace(/^(\s+)([\w.-]+)$/g, - (_, ws, name) => `${ws}<a href='${cgi}%20${name}'>${name}</a> ` + - `(<a href='${cgi2}%20${name}'>view</a>)`)); - } - f.close(); + runGitCmd(config, params, /[a-f0-9]{40}/g, + x => `<a href='${cgi1}%20${x}'>${x}</a>`) +} else if (params[0] == "branch" && params.length == 1) { + runGitCmd(config, params, /^(\s+)([\w.-]+)$/g, + (_, ws, name) => `${ws}<a href='${cgi2}%20${name}'>${name}</a>\ + (<a href='${cgi3}%20${name}'>switch</a>)`); +} else if (params[0] == "stash" && params[1] == "list") { + runGitCmd(config, params, /^stash@\{([0-9]+)\}/g, + (s, n) => `stash@{<a href='${cgi1}%20${s}'>${n}</a>}\ + (<a href='${cgi4}%20${s}'>apply</a>)`); } else { const title = encodeURIComponent('git ' + params.join(' ')); std.out.puts(`Content-Type: text/x-ansi;title=${title}\n\n`); |