Cobra CLI tool for fuzzy-finding and navigating around git repos from multiple remotes
Go to file
Ryan D McGuire 30c65042dd
All checks were successful
Build and Publish / release (push) Successful in 2m21s
Add multi-arch builds
2024-12-31 21:16:05 -05:00
.gitea/workflows Add multi-arch builds 2024-12-31 21:16:05 -05:00
.vscode Package subcommand code 2024-12-30 15:50:31 -05:00
cmd Get version from built metadata 2024-12-31 20:58:24 -05:00
contrib Rename project to git-project-manager 2024-12-27 17:48:21 -05:00
docs Add version to build 2024-12-31 20:51:04 -05:00
internal Implement cache migrations 2024-12-31 20:12:02 -05:00
.gitignore Add docs, Makefile 2024-12-19 14:51:26 -05:00
go.mod Implement cache migrations 2024-12-31 17:45:45 -05:00
go.sum Implement cache migrations 2024-12-31 17:45:45 -05:00
LICENSE Initial commit 2023-12-04 16:53:01 -05:00
main.go Rename project 2024-12-19 14:55:49 -05:00
Makefile Add multi-arch builds 2024-12-31 21:16:05 -05:00
README.md Rename project to git-project-manager 2024-12-27 17:42:44 -05:00

Git Project Manager

Purpose

The goal of this utility is to provide a fuzzy-find method of locating, cloning, and using Git projects -- along with your preferred aliases, autocompletion, and shortcuts.

This supports GitHub, GitLab, and Gitea remotes.

Documentation

Full documentation is available in 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
  2. 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
  3. Add -- find your project, give it any extra aliases you want
    1. run gpm project add (or padd if using the provided shell defaults)
  4. Go -- go to your project, fuzzy searching by alias
    1. clones your project if that's never been done
    2. the provided pgo func makes it easy
  5. Open -- rather than simply changing directories to a project, open it in your IDE
  6. 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
    2. match your alias exactly (or have only one result) and you go there right away
    3. positive reinforcement given for solid alias behavior
    4. manage aliases using gpm alias add or gpm alias delete
  7. List -- get a list of your configured projects any time with plist
  8. Reward -- buy the author a beer, because this thing is a time saver

Installing

  1. Install into your go path by running go install .
  2. Copy contrib/gpm_func_omz.zsh into your ~/.oh-my-zsh/custom/ path, or just source from your bashrc/zshrc
  3. Generate config file: gpm config gen --write
    1. You can run this any time to update settings
    2. It will only add one Git remote, so update the file for multiple
  4. Run gpm cache load (if aliases is in-place, otherwise git-project-manager cache load)

Config Sample

remotes:
  - host: https://github.com/rdmcguire # add user for multiple keys
    token: <your token here>
    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
  2. gpm project add
  3. select with fuzzy search, add extra aliases if preferred
  4. gpm project [go|open] <optional-fuzzy-search-term>
  5. Open will launch your editor, go will change directories, cloning if necessary

Cache Management

% git-project-manager cache -h
Contains sub-commands for managing project cache.
The project cache keeps this speedy, without smashing against the Git remote's
API every time a new project is added / searched for

Usage:
  git-project-manager cache [command]

Aliases:
  cache, a, ln

Available Commands:
  clear       Clear Git Project Cache
  dump        Dump Git project cache
  load        Load Git Project Cache
  unlock      unlock Git 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/git-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 "git-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

  • Don't check remote up unless necessary (project list shouldn't require it)
  • Rename to git-project-manager
  • Move module 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 registry for a release binary
  • Add GitHub remote
  • Package for homebrew
  • Make generic, this is any git remote, not just GitLab
    • Add Gitea support
    • Add GitHub support
    • Remove separate gitlab/gitea logic and keys, stop supporting legacy keys
    • Rename --gitlab flag to --remote
  • Add option to select individual remote for gpm cache load
  • Use multi-gitlab by default in config init
    • Update docs for multi-gitlab
    • Remove all references to old keys
    • Add auto-completion helper for --gitlab flag
  • Fix initial setup requiring project path, and set https:// as default for gitlab host
  • Add config setters and getters
  • For each project loaded, check if it is the same, and do nothing
    • prevents clobbering cache on a partial update
    • track already loaded projects to diff after load
  • Add open command
    • config should exist for editor (vim, code, etc..)
  • Add fzf to plist / gpm projects list
  • Update gpm project show with pterm box like gpm project list
  • Merge aliases together for same project when selecting
    • If after merging there is only one project, go there by default