# GitLab Project Manager ## Purpose The goal of this utility is to provide a fuzzy-find method of locating, cloning, and using GitLab projects -- along with your preferred aliases, autocompletion, and shortcuts. ## Documentation [Full documentation is available in docs/](./docs) ## Functionality This program will try like hell to help you fuzzily find a project, and once you've found it, will remember your preference along with whatever crazy thing your lizard brain wants to call it. Do you think of a project called terraform as infra-stuff? No problem, just let gpm know that and it'll remember. The basic workflow looks like this: 1. **Config** -- generate a config file 1. **Cache** -- load your cache to make things super quick 1. you only need to update it if there are new projects the cache is unaware of 1. **Add** -- find your project, give it any extra aliases you want 1. run `gpm project add` (or `padd` if using the provided shell defaults) 1. **Go** -- go to your project, fuzzy searching by alias 1. clones your project if that's never been done 1. the provided `pgo` func makes it easy 1. **Open** -- rather than simply changing directories to a project, open it in your IDE 1. **Manage** -- fine-tune your aliases, making it easy to nail them without fuzzy stuff 1. if you are lazy in your aliases, you'll be fuzzy finding a lot 1. match your alias exactly (or have only one result) and you go there right away 1. positive reinforcement given for solid alias behavior 1. manage aliases using `gpm alias add` or `gpm alias delete` 1. **List** -- get a list of your configured projects any time with `plist` 1. **Reward** -- buy the author a beer, because this thing is a time saver ## Installing 1. Install into your go path by running `go install .` 1. Copy `contrib/gpm_func_omz.zsh` into your `~/.oh-my-zsh/custom/` path, or just source from your bashrc/zshrc 1. Generate config file: `gpm config gen --write` 1. You can run this any time to update settings 1. It will only add one GitLab, so update the file for multiple 1. Run `gpm cache load` (if aliases is in-place, otherwise `gitlab-project-manager cache load`) ### Config Sample ```yaml remotes: - host: https://github.com/rdmcguire # add user for multiple keys token: name: github-rdmcguire type: "github" # github, gitlab, gitea supported cloneProto: ssh logLevel: info cache: ttl: 168h load: ownerOnly: false # if true, only owned projects will be indexed ``` ## Usage ### Global Flags - The `--remote` flag limits all subcommands to one or more specified remotes - The `--logLevel [debug|error|info|warn]` flag sets logging, but is permanent in the config file ### Basic Usage Basic usage to prepare your cache, add a project alias (or aliases), and use a project: 1. `gpm cache load` 1. `gpm project add` 1. select with fuzzy search, add extra aliases if preferred 1. `gpm project [go|open] ` 1. Open will launch your editor, go will change directories, cloning if necessary ### Cache Management ```shell % gitlab-project-manager cache -h Contains sub-commands for managing project cache. The project cache keeps this speedy, without smashing against the GitLab API every time a new project is added / searched for Usage: gitlab-project-manager cache [command] Aliases: cache, a, ln Available Commands: clear Clear GitLab Project Cache dump Dump GitLab project cache load Load GitLab Project Cache unlock unlock GitLab project cache Flags: -h, --help help for cache --ttl duration Duration before cache is re-built in go time.Duration format (default 48h0m0s) Global Flags: --config string config file (default is ~/.config/gitlab-project-manager.yaml) --logLevel string Default log level -- info, warn, error, debug (default "info") --projectPath string Sets a path for local clones of projects --remote strings Specify remotes by host for any sub-command. Provide multiple times or comma delimited. Use "gitlab-project-manager cache [command] --help" for more information about a command. ``` - To update your cache, run `gpm cache load`. You can also specify one or more remotes with `--remote [host]` either multiple times or comma delimited. Command completion works. - To view basic cache stats, run `gpm cache dump` - To dump cache projects and any aliases that are set, run `gpm cache dump -f` optionally filtering with `--remote` flags ## TODO - [x] Don't check remote up unless necessary (project list shouldn't require it) - [ ] Rename to git-project-manager - [ ] Move module from gitlab.sweetwater.com to github.com/rdmcguire - [ ] Add flag for clone timeout for large repos - [ ] Add `gpm cache prune` command - [ ] Fix NPE when cache is reset or project for whatever reason leaves an orphaned alias - [ ] Add TTL check to cache load, and add -f / --force flag to re-build regardless - [ ] Update README for shell completion, aliases, usage - [ ] Make a Makefile - [ ] Add git repo status to project go (up-to-date, pending commits, etc..) - [ ] Build pipeline, and link to gitlab registry for a release binary - [ ] Add GitHub remote - [ ] Package for homebrew - [x] Make generic, this is any git remote, not just GitLab - [x] Add Gitea support - [x] Add GitHub support - [x] Remove separate gitlab/gitea logic and keys, stop supporting legacy keys - [x] Rename --gitlab flag to --remote - [x] Add option to select individual remote for `gpm cache load` - [x] Use multi-gitlab by default in config init - [x] Update docs for multi-gitlab - [x] Remove all references to old keys - [x] Add auto-completion helper for --gitlab flag - [x] Fix initial setup requiring project path, and set https:// as default for gitlab host - [x] Add config setters and getters - [x] For each project loaded, check if it is the same, and do nothing - [x] prevents clobbering cache on a partial update - [x] track already loaded projects to diff after load - [x] Add open command - [x] config should exist for editor (vim, code, etc..) - [x] Add fzf to `plist` / `gpm projects list` - [x] Update `gpm project show` with pterm box like `gpm project list` - [x] Merge aliases together for same project when selecting - [x] If after merging there is only one project, go there by default