aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md116
1 files changed, 116 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..45e8793
--- /dev/null
+++ b/README.md
@@ -0,0 +1,116 @@
+## `qroject`
+
+a project switcher tool.
+
+this has both `qroject`, the standalone binary, and [Bash loadable
+builtins](https://cgit.git.savannah.gnu.org/cgit/bash.git/tree/examples/loadables/README?h=bash-5.1)
+to mildly-better integrate the tool into normal shell use.
+
+## usage
+
+no nice packaging story yet, so instead there's a bit of get-out-and-push:
+
+* clone this repo, build with a nightly Rust like `cargo +nightly build --release -Z build-std`.
+* put `libqroject_bash.so` somewhere you want to load a shared object from.
+* add the snippets from `q.sh` to your `~/.profile`, `~/.bash_profile`, whichever is appropriate.
+* adjust `enable -f ` to include a path to wherever you've stashed `libqroject_bash.so`.
+
+defaults are such that `libqroject_bash.so` is loaded directly from the
+`qroject` build directory. this is not particularly clean or a great idea.
+
+once that's done, a whirlwind tour:
+
+```
+iximeow@vitharr:~$ qg rust
+iximeow@vitharr:~/code/rust-lang/rust/$ qg yaxpeax-x86
+iximeow@vitharr:~/toy/yaxpeax/arch/x86$ ls $(qd yaxpeax-x86)
+build.rs Cargo.toml data fuzz LICENSE perf.data src test
+Cargo.lock CHANGELOG ffi goodfile Makefile README.md target TODO
+iximeow@vitharr:~/toy/yaxpeax/arch/x86$ cd -
+-bash: cd: OLDPWD not set
+iximeow@vitharr:~/toy/yaxpeax/arch/x86$ qg rust
+iximeow@vitharr:~/code/rust-lang/rust/$ ls $(qd yaxpeax-x86)
+iximeow@vitharr:~/code/rust-lang/rust/$ head -n 1 $(qd yaxpeax-x86)/README.md
+## yaxpeax-x86
+iximeow@vitharr:~/code/rust-lang/rust/$ q list perf
+perf/zen4-zen5-branch-predictor
+iximeow@vitharr:~/code/rust-lang/rust/$ q list lin
+linux
+iximeow@vitharr:~/code/rust-lang/rust/$ q add cgit ~/code/cgit
+iximeow@vitharr:~/code/rust-lang/rust/$ qg cgit
+iximeow@vitharr:~/code/cgit$
+iximeow@vitharr:~/code/cgit$ qg oxide/images
+(root@helios) Password:
+root@helios:/rpool/devel/images#
+```
+
+and from the non-plugin binary:
+
+```
+Usage: qroject [OPTIONS] <COMMAND>
+
+Commands:
+ init initialize a qroject database. you should run this first, and shouldn't need to again
+ add add a project to the qroject database. projects are unique by their name
+ forget forget a project of the given name
+ dir print the directory for the given project
+ info print information about the given project
+ upstream print the project's upstream, if any
+ edit edit `project`'s record
+ list list all known projects (optionally, with details)
+ help Print this message or the help of the given subcommand(s)
+
+Options:
+ --db <DB>
+ -h, --help Print help
+ -V, --version Print version
+```
+
+## related
+
+this is something i've had kicking around in my head for years, but at least a
+few other similar programs exist:
+
+* [z.sh](https://github.com/rupa/z) or [`zsh-z`](https://github.com/agkozak/zsh-z)
+* [zoxide](https://github.com/ajeetdsouza/zoxide)
+* [fzf](https://github.com/junegunn/fzf) kinda sorta
+
+unlike these tools, qroject is oriented specifically towards a curated set of
+working directories and supporting information. this makes it unsuitable for
+finding miscellaneous paths in deep mirrors, for example, but perhaps better for
+figuring out "where did i put those notes from three years ago" (it is to me!)
+
+## todo
+
+project-specific aliases and commands are useful to me, and typically live in
+random gitignored directories like `<proj>/.ixi/tools/foo.sh`. at some point,
+with sufficient motivation, i want to move these to be tracked as part of a
+qroject definition, or at the least load aliases from these files.
+
+this is either good or bad: activating and deactivating aliases will require
+patching the shell's `chdir()` to intercept calls (such as from `q go`!). it
+will involve activating alises possibly from repositories cloned from the
+internet authored by totally untrusted parties. qroject should not allow such
+repos to result in aliases over, say, `git` or `make` to evil ends.
+
+there will probably be public-key cryptography invovled. sorry.
+
+## mirrors
+
+the canonical copy of `qroject` is at
+[https://git.iximeow.net/qroject/](https://git.iximeow.net/qroject/).
+
+`qroject` is also mirrored on Codeberg at
+[https://www.codeberg.org/iximeow/qroject](https://www.codeberg.org/iximeow/qroject).
+
+## shoutouts
+
+huge thanks to internet user [Ayose C.](https://github.com/ayosec) for
+[bash-builtins.rs](https://github.com/ayosec/bash-builtins.rs). this is in fact
+how i discovered that bash loadable plugins *even exist*.
+
+i was initially going to do something moderately less useful as a [multi-call
+binary](https://flameeyes.blog/2009/10/19/multicall-binaries/), and started
+looking at dynamically patching the `qroject`-caller's shell to change the
+caller's `chdir()`. rest assured that `qroject` has not developed any devious
+binary-patching nonsense.