gogh

package module
v2.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 27, 2021 License: MIT Imports: 16 Imported by: 0

README

gogh

GO GitHub project manager

PkgGoDev Go Report Card Coverage Status Release

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).

Available commands

Show projects
Command Description
gogh list List local projects
gogh repos List remote repositories
Manipulate projects
Command Description
gogh create Create a new project with a remote repository
gogh delete Delete a repository with a remote repository
gogh fork Fork a repository
gogh clone Clone a repository to local
Others
Command Description
gogh roots Manage roots
gogh servers Manage servers
gogh help Help about any command

Use gogh [command] --help for more information about a command. Or see the manual in usage/gogh.md.

Install

For Golang developers:

go get github.com/kyoh86/gogh/cmd/gogh

For Homebrew users:

brew tap kyoh86/tap
brew update
brew install gogh

Roots

gogh manages projects under the roots directories.

Seealso: Directory structures

You can change the roots with roots add <path> or roots remove <path> and see all of them by roots list. gogh uses the first one as the default one, create, fork or clone will put a local project under it. If you want to change the default, use roots set-default <path>.

Default: ~/Projects.

Servers

gogh manages respositories in some servers that pairs of a user and a host name. To login in new server or logout, you should use servers login. gogh uses the first server as the default one. When you specify a repository with amonguous user or host, it will be interpolated with a default server.

I.E. when servers are:

  • github.com:
    • user: kyoh86
  • example.com:
    • user: foobar

Amonguas repository names will be interpolated:

Amonguals name Interpolated name
gogh github.com/kyoh86/gogh
foobar/gogh github.com/foobar/gogh

Commands

Manual: usage/gogh.md.

Directory structures

Local projects are placed under gogh.roots with named `host/user/repo.

~/Projects
+-- github.com/
|-- google/
|   +-- go-github/
|-- kyoh86/
|   +-- gogh/
+-- alecthomas/
  +-- kingpin/

LICENSE

MIT License

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

Documentation

Index

Constants

View Source
const (
	DefaultHost = github.DefaultHost
)
View Source
const DefaultRootDirName = "Projects"

Variables

View Source
var (
	ErrNoServer          = errors.New("no server registered")
	ErrServerNotFound    = errors.New("server not found")
	ErrUnremovableServer = errors.New("default server is not able to be removed")
)
View Source
var (
	ErrEmptyHost  = ErrInvalidHost("empty host")
	ErrEmptyOwner = ErrInvalidOwner("empty owner")
	ErrEmptyName  = ErrInvalidName("empty name")
)
View Source
var (
	ErrTooManySlashes = errors.New("too many slashes")
)

Functions

func FormatFullFilePath

func FormatFullFilePath(p Project) (string, error)

func FormatRelFilePath

func FormatRelFilePath(p Project) (string, error)

func FormatRelPath

func FormatRelPath(p Project) (string, error)

func FormatURL

func FormatURL(p Project) (string, error)

func ValidateHost

func ValidateHost(h string) error

func ValidateName

func ValidateName(name string) error

func ValidateOwner

func ValidateOwner(owner string) error

Types

type ErrInvalidHost

type ErrInvalidHost string

func (ErrInvalidHost) Error

func (e ErrInvalidHost) Error() string

type ErrInvalidName

type ErrInvalidName string

func (ErrInvalidName) Error

func (e ErrInvalidName) Error() string

type ErrInvalidOwner

type ErrInvalidOwner string

func (ErrInvalidOwner) Error

func (e ErrInvalidOwner) Error() string

type Format

type Format func(Project) (string, error)

func FormatFields

func FormatFields(s string) Format

func (Format) Format

func (f Format) Format(p Project) (string, error)

type LocalCloneOption

type LocalCloneOption struct {
}

type LocalController

type LocalController struct {
	// contains filtered or unexported fields
}

func NewLocalController

func NewLocalController(root string) *LocalController

func (*LocalController) Clone

func (l *LocalController) Clone(ctx context.Context, spec Spec, server Server, _ *LocalCloneOption) (Project, error)

func (*LocalController) Create

func (l *LocalController) Create(ctx context.Context, spec Spec, _ *LocalCreateOption) (Project, error)

func (*LocalController) Delete

func (l *LocalController) Delete(ctx context.Context, spec Spec, _ *LocalDeleteOption) error

func (*LocalController) GetRemoteURLs

func (l *LocalController) GetRemoteURLs(ctx context.Context, spec Spec, name string) ([]string, error)

func (*LocalController) List

func (l *LocalController) List(ctx context.Context, option *LocalListOption) ([]Project, error)

func (*LocalController) SetRemoteURLs

func (l *LocalController) SetRemoteURLs(ctx context.Context, spec Spec, remotes map[string][]string) error

func (*LocalController) Walk

func (l *LocalController) Walk(ctx context.Context, option *LocalWalkOption, walkFn LocalWalkFunc) error

type LocalCreateOption

type LocalCreateOption struct {
}

type LocalDeleteOption

type LocalDeleteOption struct{}

type LocalListOption

type LocalListOption struct {
	Query string
}

type LocalWalkFunc

type LocalWalkFunc func(Project) error

type LocalWalkOption

type LocalWalkOption struct {
	Query string
}

type Project

type Project struct {
	// contains filtered or unexported fields
}

Project is the location of a repository in the local. It is a valid location, that never means "exist".

func NewProject

func NewProject(root string, spec Spec) Project

func (Project) CheckEntity

func (p Project) CheckEntity() error

CheckEntity checks the project is exist in the local file-system.

func (Project) FullFilePath

func (p Project) FullFilePath() string

func (Project) FullLevels

func (p Project) FullLevels() []string

func (Project) Host

func (p Project) Host() string

func (Project) Name

func (p Project) Name() string

func (Project) Owner

func (p Project) Owner() string

func (Project) RelFilePath

func (p Project) RelFilePath() string

func (Project) RelLevels

func (p Project) RelLevels() []string

func (Project) RelPath

func (p Project) RelPath() string

func (Project) Root

func (p Project) Root() string

func (Project) URL

func (p Project) URL() string

type RemoteController

type RemoteController struct {
	// contains filtered or unexported fields
}

func NewRemoteController

func NewRemoteController(adaptor github.Adaptor) *RemoteController

func (*RemoteController) Create

func (c *RemoteController) Create(ctx context.Context, name string, option *RemoteCreateOption) (Spec, error)

func (*RemoteController) Delete

func (c *RemoteController) Delete(ctx context.Context, owner string, name string, _ *RemoteDeleteOption) error

func (*RemoteController) Fork

func (c *RemoteController) Fork(ctx context.Context, owner string, name string, option *RemoteForkOption) (Spec, error)

func (*RemoteController) Get

func (c *RemoteController) Get(ctx context.Context, owner string, name string, _ *RemoteGetOption) (Spec, error)

func (*RemoteController) List

func (c *RemoteController) List(ctx context.Context, option *RemoteListOption) (allSpecs []Spec, _ error)

func (*RemoteController) ListByOrg

func (c *RemoteController) ListByOrg(ctx context.Context, org string, option *RemoteListByOrgOption) (allSpecs []Spec, _ error)

type RemoteCreateOption

type RemoteCreateOption struct {
	// Organization is the name of the organization that owns the repository.
	Organization string

	// Description is a short description of the repository.
	Description string

	// Homepage is a URL with more information about the repository.
	Homepage string

	// Visibility can be public or private. If your organization is associated with an enterprise account using GitHub
	// Enterprise Cloud or GitHub Enterprise Server 2.20+, visibility can also be internal. For more information, see
	// "Creating an internal repository" in the GitHub Help documentation.  The visibility parameter overrides the private
	// parameter when you use both parameters with the nebula-preview preview header.
	Visibility string

	// DisableIssues is either false to enable issues for this repository or true to disable them.
	DisableIssues bool

	// DisableProjects is either false to enable projects for this repository or true to disable them. Note: If you're
	// creating a repository in an organization that has disabled repository projects, the default is false, and if you
	// pass true, the API returns an error.
	DisableProjects bool

	// DisableWiki is either false to enable the wiki for this repository or true to disable it.
	DisableWiki bool

	// DisableDownloads is either false to enable the downloads or true to disable it.
	DisableDownloads bool

	// IsTemplate is either true to make this repo available as a template repository or false to prevent it.
	IsTemplate bool

	// TeamID is the id of the team that will be granted access to this repository. This is only valid when creating a
	// repository in an organization.
	TeamID int64

	// AutoInit is pass true to create an initial commit with empty README.
	AutoInit bool

	// GitignoreTemplate is the desired language or platform .gitignore template to apply. Use the name of the template
	// without the extension. For example, "Haskell".
	GitignoreTemplate string

	// LicenseTemplate is an open source license template, and then use the license keyword as the licenseTemplate string.
	// For example, "mit" or "mpl-2.0".
	LicenseTemplate string

	// PreventSquashMerge is either false to allow squash-merging pull requests, or true to prevent squash-merging.
	PreventSquashMerge bool

	// PreventMergeCommit is either false to allow merging pull requests with a merge commit, or true to prevent merging
	// pull requests with merge commits.
	PreventMergeCommit bool

	// PreventRebaseMerge is either false to allow rebase-merging pull requests, or true to prevent rebase-merging.
	PreventRebaseMerge bool

	// DeleteBranchOnMerge is either true to allow automatically deleting head branches when pull requests are merged, or
	// false to prevent automatic deletion.
	DeleteBranchOnMerge bool
}

func (*RemoteCreateOption) GetOrganization

func (o *RemoteCreateOption) GetOrganization() string

type RemoteDeleteOption

type RemoteDeleteOption struct{}

type RemoteForkOption

type RemoteForkOption struct {
	// Organization is the name of the organization that owns the repository.
	Organization string
}

func (*RemoteForkOption) GetOptions

func (*RemoteForkOption) GetOrganization

func (o *RemoteForkOption) GetOrganization() string

type RemoteGetOption

type RemoteGetOption struct{}

type RemoteListByOrgOption

type RemoteListByOrgOption struct {
	Query string

	// Type of repositories to list. Possible values are: all, public, private,
	// forks, sources, member. Default is "all".
	Type string

	// How to sort the repository list. Can be one of created, updated, pushed,
	// full_name. Default is "created".
	Sort string

	// Direction in which to sort repositories. Can be one of asc or desc.
	// Default when using full_name: asc; otherwise desc.
	Direction string
}

func (*RemoteListByOrgOption) GetOptions

func (*RemoteListByOrgOption) GetQuery

func (o *RemoteListByOrgOption) GetQuery() string

type RemoteListOption

type RemoteListOption struct {
	User  string
	Query string

	// Visibility of repositories to list. Can be one of all, public, or private.
	// Default: all
	Visibility string

	// List repos of given affiliation[s].
	// Comma-separated list of values. Can include:
	// * owner: Repositories that are owned by the authenticated user.
	// * collaborator: Repositories that the user has been added to as a
	//   collaborator.
	// * organization_member: Repositories that the user has access to through
	//   being a member of an organization. This includes every repository on
	//   every team that the user is on.
	// Default: owner,collaborator,organization_member
	Affiliation string

	// Type of repositories to list.
	// Can be one of all, owner, public, private, member. Default: all
	// Will cause a 422 error if used in the same request as visibility or
	// affiliation.
	Type string

	// How to sort the repository list. Can be one of created, updated, pushed,
	// full_name. Default: full_name
	Sort string

	// Direction in which to sort repositories. Can be one of asc or desc.
	// Default: when using full_name: asc; otherwise desc
	Direction string
}

func (*RemoteListOption) GetOptions

func (*RemoteListOption) GetQuery

func (o *RemoteListOption) GetQuery() string

func (*RemoteListOption) GetUser

func (o *RemoteListOption) GetUser() string

type Server

type Server struct {
	// contains filtered or unexported fields
}

func NewServer

func NewServer(user, token string) (Server, error)

func NewServerFor

func NewServerFor(host, user, token string) (Server, error)

func (Server) Host

func (s Server) Host() string

func (Server) Token

func (s Server) Token() string

func (Server) User

func (s Server) User() string

type Servers

type Servers struct {
	// contains filtered or unexported fields
}

func NewServers

func NewServers(defaultServer Server, alternatives ...Server) *Servers

NewServers will build Spec with a default server and alternative servers.

func (*Servers) Default

func (s *Servers) Default() (Server, error)

func (*Servers) Find

func (s *Servers) Find(host string) (Server, error)

func (*Servers) List

func (s *Servers) List() (list []Server, _ error)

func (Servers) MarshalYAML

func (s Servers) MarshalYAML() (interface{}, error)

func (*Servers) Remove

func (s *Servers) Remove(host string) error

func (*Servers) Set

func (s *Servers) Set(host, user, token string) error

func (*Servers) SetDefault

func (s *Servers) SetDefault(host string) error

func (*Servers) UnmarshalYAML

func (s *Servers) UnmarshalYAML(unmarshaler func(interface{}) error) error

type Spec

type Spec struct {
	// contains filtered or unexported fields
}

Spec describes which project is in a root.

func NewSpec

func NewSpec(host, owner, name string) (Spec, error)

func (Spec) Host

func (s Spec) Host() string

func (Spec) Name

func (s Spec) Name() string

func (Spec) Owner

func (s Spec) Owner() string

func (Spec) String

func (s Spec) String() string

type SpecParser

type SpecParser struct {
	// contains filtered or unexported fields
}

SpecParser will parse any string as a Spec.

If it is clear that the string has host, user and name explicitly, use "NewSpec" instead to build Spec.

func NewSpecParser

func NewSpecParser(servers *Servers) *SpecParser

NewSpecParser will build Spec with a default server and alternative servers.

func (*SpecParser) Parse

func (p *SpecParser) Parse(s string) (Spec, Server, error)

Parse a string and build a Spec.

If the string does not have a host or a user explicitly, they will be replaced with a default server.

Directories

Path Synopsis
cmd
internal
github_mock
Package github_mock is a generated GoMock package.
Package github_mock is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL