gogh
GO GitHub project manager


DESCRIPTION
gogh is forked from ghq.
gogh provides a way to organize remote repository clones, like go get does.
When you clone a remote repository by gogh get, gogh makes a directory under a specific root directory (by default ~/go/src) using the remote repository URL's host and path.
And creating new one by gogh new, gogh make both of a local project and a remote repository.
$ gogh get https://github.com/kyoh86/gogh
# Runs `git clone https://github.com/kyoh86/gogh ~/go/src/github.com/kyoh86/gogh`
You can also list projects (local repositories) (gogh list), find a project (gogh find).
SYNOPSIS
gogh list
gogh dump
gogh find
gogh where
gogh repos
gogh get
gogh bulk-get
gogh pipe-get
gogh create
gogh fork
gogh remove
See gogh --help-long for details.
INSTALLATION
For Golang developers:
go get github.com/kyoh86/gogh
For Homebrew users:
brew tap kyoh86/tap
brew update
brew install gogh
CONFIGURATIONS
It's possible to change targets by a preference YAML file.
If you don't set --config flag or GOGH_CONFIG environment variable,
gogh loads configurations from ${XDG_CONFIG_HOME:-$HOME/.config}/gogh/config.yaml
To set new configure, you should use gogh config set <name> <value>.
Each of propoerties are able to be overwritten by environment variables.
roots
The paths to directory under which cloned repositories are placed.
See DIRECTORY STRUCTURES below. Default: ~/go/src.
This property can have multiple values.
If so, the first one becomes primary one i.e. new repository clones are always created under it.
You may want to specify $GOPATH/src as a secondary root.
github.user
A name of your GitHub user (i.e. kyoh86).
If an environment variable GOGH_GITHUB_USER is set, its value is used instead.
If an environment variable GOGH_ROOTS is set, its value is used instead.
github.token
The token to connect GitHub API.
gogh saves this one in keyring.
It is saved for a service <github.host>.gogh.kyoh86.dev and a user github.user.
If an environment variable GOGH_GITHUB_TOKEN is set, its value is used instead.
github.host
The host name to connect to GitHub. Default: github.com.
If an environment variable GOGH_GITHUB_HOST is set, its value is used instead.
hooks
The directory name to store hooks. Default:
If an environment variable GOGH_HOOKS is et, its value is used instead.
If you don't set this one, gogh searches hooks from ${XDG_CONFIG_HOME:-$HOME/.config}/gogh/hooks
COMMANDS
See gogh --long-help for details.
list
List locally cloned repositories.
If a query argument is given, only repositories whose names contain that query text are listed.
-f (--format) specifies format of the item. Default: relative.
-f=full is given, the full paths to the repository will be printed.
-f=short is given, gogh prints each project as short as possible.
-f=relative is given, the relative paths from gogh root to the repository will be printed.
-f=url is given, the urls of the repository will be printed.
dump
Dump local repository list.
This is shorthand for gogh list --format=url.
It can be used to backup and restore projects.
e.g.
$ gogh dump > projects.txt
# copy projects.txt to another machine
$ cat projects.txt | gogh bulk-get
find
Look into a locally cloned repository with the shell.
where
Show where a local repository is.
repos
Show a list of repositories for a user.
get
Clone a remote repository under gogh root directory (see DIRECTORY STRUCTURES below).
If the repository is already cloned to local project, nothing will happen unless -u (--update) flag is supplied,
in which case the project (local repository) is updated (git pull --ff-only eg.).
When you use --ssh option, the repository is cloned via SSH protocol.
If there are multiple gogh.roots, existing local clones are searched first.
Then a new repository clone is created under the primary root if none is found.
With --shallow option, a "shallow clone" will be performed (for Git repositories only, git clone --depth 1 ... eg.).
Be careful that a shallow-cloned repository cannot be pushed to remote.
Currently Git and Mercurial repositories are supported.
bulk-get
Reads repository URLs from stdin line by line and performs 'get' for each of them.
pipe-get
Reads repository URLs from other command output by line and performs 'get' for each of them.
create
Create a new repository on remote GitHub and clone it into local project.
fork
Clone a remote repository under gogh root direcotry if the project is not exist in local.
And fork int on remote GitHub repository with calling hub fork
remove
Remove a repository on remote GitHub and local project.
ENVIRONMENT VARIABLES
Some environment variables are used for flags.
GOGH_CONFIG
You can set it instead of --config flag (configuration file path).
Default: ${XDG_CONFIG_HOME:-$HOME/.config}/gogh/config.yaml.
GOGH_FLAG_ROOT_ALL
You can set it truely value and gogh root shows all of the roots like gogh root --all.
If we want show only primary root, call gogh root --no-all.
e.g.
$ echo $GOGH_ROOTS
/Users/kyoh86/Projects:/Users/kyoh86/go/src
$ gogh roots
/Users/kyoh86/Projects
$ gogh roots --all
/Users/kyoh86/Projects
/Users/kyoh86/go/src
$ GOGH_FLAG_ROOT_ALL=1 gogh root
/Users/kyoh86/Projects
/Users/kyoh86/go/src
$ GOGH_FLAG_ROOT_ALL=1 gogh root --no-all
/Users/kyoh86/Projects
DIRECTORY STRUCTURES
Local repositories are placed under gogh.roots with named github.com/user/repo.
~/go/src
+-- github.com/
|-- google/
| +-- go-github/
|-- kyoh86/
| +-- gogh/
+-- alecthomas/
+-- kingpin/
If you set github.host, they will be placed with github.host/user/repo.
HOOKS
Like Git Hooks, gogh has a way to fire off custom scripts when some commands be called.
Installing a hook
The hooks are all stored in the directory that configured in hooks and .gogh/hooks in the each repository.
Any properly named executable scripts will work fine -
you can write them in Shellscript, Ruby, Python or whatever language you are familiar with.
Hook names
| Name |
Trigger |
| post-get-each |
get, bulk-get or pipe-get is processed each repository |
| post-create |
create is processed |
| post-fork |
fork is processed |
| pre-remove-each |
remove is processing each repository |
Context
All of the hooks will be called in the root of the target project.
Example
$ mkdir -p ~/.config/gogh/hooks
$ echo '#!/bin/sh' > ~/.config/gogh/hooks/post-create
$ echo 'yo go-project' >> ~/.config/gogh/hooks/post-create
$ chmod +x ~/.config/gogh/hooks/post-create
$ gogh create foobar
Creating new project and a remote repository foobar
Checking existing project
Creating a directory
Initializing a repository
Creating a new repository in GitHub
Executing post-create hook
_-----_ ╭──────────────────────────╮
| | │ Welcome to the │
|--(o)--| │ funkadelic │
`---------´ │ generator-go-project/app │
( _´U`_ ) │ generator! │
/___A___\ /╰──────────────────────────╯
| ~ |
__'.___.'__
´ ` |° ´ Y `
? Project name
SHELL EXTENTIONS
To be enabled shell extentions (for zsh / bash), set up gogh in your shell-rc file (.bashrc / .zshrc).
gogo cd command
- shorthand for
cd $(gogh find <project name>)
gogo get --cd option
- auto-completions
eval "$(gogh init)"
If you have not set SHELL envar right, tell your shell explicitly.
eval "$(gogh init --shell bash)"
NOTE: Now gogh supports bash or zsh only.
DEFERENCES TO ghq
ghq is too complex for me. That's why I forked this project from it.
ghq look runs new shell only to change working directory to a project.
- So I cannot back to previous by
cd -. I need to exit to do it.
- But
ghq look says cd <project to path> when I run it.
ghq list --unique returns a bizarre and complex list when I set multiple root.
ghq import xxx needs to setup ghq.import.xxx option to specify what command to run.
git config ghq.xxx...
gogh can be configured with envars instead of git-config(1).
gogh doesn't support VCSs other than GitHub
- If I want to manage projects in VCSs other than GitHub, I should use other tool, I think so.
gogh holds tokens for GitHub in the keyring for security.
hub, gh and ghq hold them in raw config file.
- I wanted to merge functions of ghq and hub.
gogh new creates a new one with make both of a local project and a remote repository.
- It calls
git init and hub create in the gogh.roots directory.
gogh fork clones a remote repository into the gogh.roots directory and fork it GitHub (with calling hub fork).
- But there may be some collision in configurations of ghq and hub. It offers a challenge for me to resolve them by gogh.
- (nits) I don't like
github.com/onsi/gomega and github.com/urfave/cli. But I love github.com/stretchr/testify and github.com/alecthomas/kingpin.
- (nits) I want gogh to be able to be used as a library (
github.com/kyoh86/gogh/gogh package).
LICENSE

This software is released under the MIT License, see LICENSE.
And this software is based on ghq.