1
0
Fork
You've already forked qroject
0
a project switcher too.
  • Rust 98%
  • Shell 2%
Find a file
2026年04月27日 17:04:46 +00:00
.cargo initial 2026年04月26日 05:19:05 +00:00
src initial 2026年04月26日 05:19:05 +00:00
.gitignore initial 2026年04月26日 05:19:05 +00:00
Cargo.lock initial 2026年04月26日 05:19:05 +00:00
Cargo.toml initial 2026年04月26日 05:19:05 +00:00
CHANGELOG initial 2026年04月26日 05:19:05 +00:00
goodfile initial 2026年04月26日 05:19:05 +00:00
init.sh initial 2026年04月26日 05:19:05 +00:00
init.sql initial 2026年04月26日 05:19:05 +00:00
q.sh initial 2026年04月26日 05:19:05 +00:00
README.md readme typos 2026年04月27日 17:04:46 +00:00
rust-toolchain.toml initial 2026年04月26日 05:19:05 +00:00

qroject

a project switcher tool.

this has both qroject, the standalone binary, and Bash loadable builtins 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 -
/home/iximeow/code/rust-lang/rust/
iximeow@vitharr:~/code/rust-lang/rust/$ cd -
/home/iximeow/toy/yaxpeax/arch/x86
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

this is something i've had kicking around in my head for years, but at least a few other similar programs exist:

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 involved. sorry.

mirrors

the canonical copy of qroject is at https://git.iximeow.net/qroject/.

qroject is also mirrored on Codeberg at https://www.codeberg.org/iximeow/qroject.

shoutouts

huge thanks to internet user Ayose C. for 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, 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.