git

package module
v4.0.0-rc4+incompatible Latest Latest
Warning

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

Go to latest
Published: Nov 14, 2016 License: MIT Imports: 25 Imported by: 0

README

go-git GoDoc Build Status codecov.io codebeat badge

A low level and highly extensible git client library for reading repositories from git servers. It is written in Go from scratch, without any C dependencies.

We have been following the open/close principle in its design to facilitate extensions.

go-git does not claim to be a replacement of git2go as its approach and functionality is quite different.

ok, but why? ...

At source{d} we analyze almost all the public open source contributions made to git repositories in the world.

We want to extract detailed information from each GitHub repository, which requires downloading repository packfiles and analyzing them: extracting their code, authors, dates and the languages and ecosystems they use. We are also interested in knowing who contributes to what, so we can tell top contributors from the more casual ones.

You can obtain all this information using the standard git command running over a local clone of a repository, but this simple solution does not scale well over millions of repositories: we want to avoid having local copies of the unpacked repositories in a regular file system; go-git allows us to work with an in-memory representation of repositories instead.

I see... but this is production ready?

Yes!!!, we have been using go-git at source{d} since August 2015 to analyze all GitHub public repositories (i.e. 16M of repositories).

Coming Soon

Blame support: right now we are using a forward version of a line-tracking algorithm and we are having some problems handling merges. The plan is to get merges right and change to a backward line-tracking algorithm soon.

Installation

The recommended way to install go-git is:

go get -u gopkg.in/src-d/go-git.v3/...

Examples

Retrieving the commits for a given repository:

r, err := git.NewRepository("https://github.com/src-d/go-git", nil)
if err != nil {
	panic(err)
}

if err := r.PullDefault(); err != nil {
	panic(err)
}

iter, err := r.Commits()
if err != nil {
	panic(err)
}
defer iter.Close()

for {
	//the commits are not sorted in any special order
	commit, err := iter.Next()
	if err != nil {
		if err == io.EOF {
			break
		}

		panic(err)
	}

	fmt.Println(commit)
}

Outputs:

commit 2275fa7d0c75d20103f90b0e1616937d5a9fc5e6
Author: Máximo Cuadros <mcuadros@gmail.com>
Date:   2015-10-23 00:44:33 +0200 +0200

commit 35b585759cbf29f8ec428ef89da20705d59f99ec
Author: Carlos Cobo <toqueteos@gmail.com>
Date:   2015-05-20 15:21:37 +0200 +0200

commit 7e3259c191a9de23d88b6077dcb1cd427e925432
Author: Alberto Cortés <alberto@sourced.tech>
Date:   2016-01-21 03:29:57 +0100 +0100

commit 24b8ae50db91f3909b11304014564bffc6fdee79
Author: Alberto Cortés <alberto@sourced.tech>
Date:   2015-12-11 17:57:10 +0100 +0100
...

Retrieving the latest commit for a given repository:

r, err := git.NewRepository("https://github.com/src-d/go-git", nil)
if err != nil {
	panic(err)
}

if err := r.PullDefault(); err != nil {
	panic(err)
}

hash, err := r.Remotes[git.DefaultRemoteName].Head()
if err != nil {
	panic(err)
}

commit, err := r.Commit(hash)
if err != nil {
	panic(err)
}

fmt.Println(commit)

Creating a repository from an ordinary local git directory (that has been previously prepared by running git gc on it).

// Download any git repository and prepare it as as follows:
//
//   $ git clone https://github.com/src-d/go-git /tmp/go-git
//   $ pushd /tmp/go-git ; git gc ; popd
//
// Then, create a go-git repository from the local content
// and print its commits as follows:

package main

import (
	"fmt"
	"io"

	"gopkg.in/src-d/go-git.v4"
	"gopkg.in/src-d/go-git.v4/utils/fs"
)

func main() {
	fs := fs.NewOS() // a simple proxy for the local host filesystem
	path := "/tmp/go-git/.git"

	repo, err := git.NewRepositoryFromFS(fs, path)
	if err != nil {
		panic(err)
	}

	iter, err := repo.Commits()
	if err != nil {
		panic(err)
	}
	defer iter.Close()

	for {
		commit, err := iter.Next()
		if err != nil {
			if err == io.EOF {
				break
			}
			panic(err)
		}

		fmt.Println(commit)
	}
}

Implementing your own filesystem will let you access repositories stored on remote services (e.g. amazon S3), see the examples directory for a simple filesystem implementation and usage.

Wrapping

go-git can be wrapped into any language which supports shared library interop. Python wrapper already exists. This is provided by "cshared" cgo files which can be built with go build -o libgogit.so -buildmode=c-shared github.com/src-d/go-git/cshared.

Acknowledgements

The earlier versions of the packfile reader are based on git-chain, project done by @yrashk

License

MIT, see LICENSE

Documentation

Overview

Package git is a low level and highly extensible git client library for reading repositories from git servers. It is written in Go from scratch, without any C dependencies.

We have been following the open/close principle in its design to facilitate extensions.

Small example extracting the commits from a repository:

func ExampleBasic_printCommits() {
  r := git.NewMemoryRepository()
  o := &git.CloneOptions{
      URL: "https://github.com/src-d/go-git",
  }
  if err := r.Clone(o); err != nil {
      panic(err)
  }

	 iter, err := r.Commits()
	 if err != nil {
      panic(err)
  }
  defer iter.Close()

  for {
      commit, err := iter.Next()
      if err != nil {
          if err == io.EOF {
              break
          }
          panic(err)
      }

  fmt.Println(commit)
 }
}

Index

Constants

View Source
const DateFormat = "Mon Jan 02 15:04:05 2006 -0700"

DateFormat is the format being use in the orignal git implementation

View Source
const (
	// DefaultRemoteName name of the default Remote, just like git command
	DefaultRemoteName = "origin"
)

Variables

View Source
var (
	ErrMissingURL     = errors.New("URL field is required")
	ErrInvalidRefSpec = errors.New("invalid refspec")
)
View Source
var (
	ErrObjectNotFound     = errors.New("object not found")
	ErrInvalidReference   = errors.New("invalid reference, should be a tag or a branch")
	ErrRepositoryNonEmpty = errors.New("repository non empty")
	ErrRemoteNotFound     = errors.New("remote not found")
	ErrRemoteExists       = errors.New("remote already exists")
)
View Source
var (
	ErrMaxTreeDepth = errors.New("maximum tree depth exceeded")
	ErrFileNotFound = errors.New("file not found")
)

New errors defined by this package.

View Source
var ErrUnsupportedObject = errors.New("unsupported object type")

ErrUnsupportedObject trigger when a non-supported object is being decoded.

View Source
var NoErrAlreadyUpToDate = errors.New("already up-to-date")

Functions

func ReverseSortCommits

func ReverseSortCommits(l []*Commit)

ReverseSortCommits sort a commit list by commit date, from newer to older.

func SortCommits

func SortCommits(l []*Commit)

SortCommits sort a commit list by commit date, from older to newer.

func WalkCommitHistory

func WalkCommitHistory(c *Commit, cb func(*Commit) error) error

WalkCommitHistory walks the commit history

Types

type Action

type Action int
const (
	Insert Action = iota
	Delete
	Modify
)

func (Action) String

func (a Action) String() string

type Blame

type Blame struct {
	Path  string
	Rev   plumbing.Hash
	Lines []*line
}

type Blob

type Blob struct {
	Hash plumbing.Hash
	Size int64
	// contains filtered or unexported fields
}

Blob is used to store file data - it is generally a file.

func (*Blob) Decode

func (b *Blob) Decode(o plumbing.Object) error

Decode transforms a plumbing.Object into a Blob struct.

func (*Blob) Encode

func (b *Blob) Encode(o plumbing.Object) error

Encode transforms a Blob into a plumbing.Object.

func (*Blob) ID

func (b *Blob) ID() plumbing.Hash

ID returns the object ID of the blob. The returned value will always match the current value of Blob.Hash.

ID is present to fulfill the Object interface.

func (*Blob) Reader

func (b *Blob) Reader() (io.ReadCloser, error)

Reader returns a reader allow the access to the content of the blob

func (*Blob) Type

func (b *Blob) Type() plumbing.ObjectType

Type returns the type of object. It always returns plumbing.BlobObject.

Type is present to fulfill the Object interface.

type BlobIter

type BlobIter struct {
	storer.ObjectIter
	// contains filtered or unexported fields
}

BlobIter provides an iterator for a set of blobs.

func NewBlobIter

func NewBlobIter(r *Repository, iter storer.ObjectIter) *BlobIter

NewBlobIter returns a CommitIter for the given repository and underlying object iterator.

The returned BlobIter will automatically skip over non-blob objects.

func (*BlobIter) ForEach

func (iter *BlobIter) ForEach(cb func(*Blob) error) error

ForEach call the cb function for each blob contained on this iter until an error happens or the end of the iter is reached. If ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*BlobIter) Next

func (iter *BlobIter) Next() (*Blob, error)

Next moves the iterator to the next blob and returns a pointer to it. If it has reached the end of the set it will return io.EOF.

type Change

type Change struct {
	Action
	From ChangeEntry
	To   ChangeEntry
}

func DiffTree

func DiffTree(a, b *Tree) ([]*Change, error)

func (*Change) Files

func (c *Change) Files() (from *File, to *File, err error)

func (*Change) String

func (c *Change) String() string

type ChangeEntry

type ChangeEntry struct {
	Name      string
	Tree      *Tree
	TreeEntry TreeEntry
}

type Changes

type Changes []*Change

func (Changes) Len

func (c Changes) Len() int

func (Changes) Less

func (c Changes) Less(i, j int) bool

func (Changes) String

func (c Changes) String() string

func (Changes) Swap

func (c Changes) Swap(i, j int)

type CloneOptions

type CloneOptions struct {
	// The (possibly remote) repository URL to clone from
	URL string
	// Auth credentials, if required, to uses with the remote repository
	Auth common.AuthMethod
	// Name of the remote to be added, by default `origin`
	RemoteName string
	// Remote branch to clone
	ReferenceName plumbing.ReferenceName
	// Fetch only ReferenceName if true
	SingleBranch bool
	// Limit fetching to the specified number of commits
	Depth int
}

CloneOptions describe how a clone should be perform

func (*CloneOptions) Validate

func (o *CloneOptions) Validate() error

Validate validate the fields and set the default values

type Commit

type Commit struct {
	Hash      plumbing.Hash
	Author    Signature
	Committer Signature
	Message   string
	// contains filtered or unexported fields
}

Commit points to a single tree, marking it as what the project looked like at a certain point in time. It contains meta-information about that point in time, such as a timestamp, the author of the changes since the last commit, a pointer to the previous commit(s), etc. http://schacon.github.io/gitbook/1_the_git_object_model.html

func (*Commit) Blame

func (c *Commit) Blame(path string) (*Blame, error)

Blame returns the last commit that modified each line of a file in a repository.

The file to blame is identified by the input arguments: repo, commit and path. The output is a slice of commits, one for each line in the file.

Blaming a file is a two step process:

1. Create a linear history of the commits affecting a file. We use revlist.New for that.

2. Then build a graph with a node for every line in every file in the history of the file.

Each node (line) holds the commit where it was introduced or last modified. To achieve that we use the FORWARD algorithm described in Zimmermann, et al. "Mining Version Archives for Co-changed Lines", in proceedings of the Mining Software Repositories workshop, Shanghai, May 22-23, 2006.

Each node is assigned a commit: Start by the nodes in the first commit. Assign that commit as the creator of all its lines.

Then jump to the nodes in the next commit, and calculate the diff between the two files. Newly created lines get assigned the new commit as its origin. Modified lines also get this new commit. Untouched lines retain the old commit.

All this work is done in the assignOrigin function which holds all the internal relevant data in a "blame" struct, that is not exported.

TODO: ways to improve the efficiency of this function:

1. Improve revlist

2. Improve how to traverse the history (example a backward traversal will be much more efficient)

TODO: ways to improve the function in general:

1. Add memoization between revlist and assign.

2. It is using much more memory than needed, see the TODOs below.

func (*Commit) Decode

func (c *Commit) Decode(o plumbing.Object) (err error)

Decode transforms a plumbing.Object into a Commit struct.

func (*Commit) Encode

func (b *Commit) Encode(o plumbing.Object) error

Encode transforms a Commit into a plumbing.Object.

func (*Commit) File

func (c *Commit) File(path string) (*File, error)

File returns the file with the specified "path" in the commit and a nil error if the file exists. If the file does not exist, it returns a nil file and the ErrFileNotFound error.

func (*Commit) Files

func (c *Commit) Files() (*FileIter, error)

Files returns a FileIter allowing to iterate over the Tree

func (*Commit) History

func (c *Commit) History() ([]*Commit, error)

History return a slice with the previous commits in the history of this commit

func (*Commit) ID

func (c *Commit) ID() plumbing.Hash

ID returns the object ID of the commit. The returned value will always match the current value of Commit.Hash.

ID is present to fulfill the Object interface.

func (*Commit) NumParents

func (c *Commit) NumParents() int

NumParents returns the number of parents in a commit.

func (*Commit) Parents

func (c *Commit) Parents() *CommitIter

Parents return a CommitIter to the parent Commits

func (*Commit) References

func (c *Commit) References(path string) ([]*Commit, error)

References returns a References for the file at "path", the commits are sorted in commit order. It stops searching a branch for a file upon reaching the commit were the file was created.

Caveats:

  • Moves and copies are not currently supported.
  • Cherry-picks are not detected unless there are no commits between them and therefore can appear repeated in the list. (see git path-id for hints on how to fix this).

func (*Commit) String

func (c *Commit) String() string

func (*Commit) Tree

func (c *Commit) Tree() (*Tree, error)

Tree returns the Tree from the commit

func (*Commit) Type

func (c *Commit) Type() plumbing.ObjectType

Type returns the type of object. It always returns plumbing.CommitObject.

Type is present to fulfill the Object interface.

type CommitIter

type CommitIter struct {
	storer.ObjectIter
	// contains filtered or unexported fields
}

CommitIter provides an iterator for a set of commits.

func NewCommitIter

func NewCommitIter(r *Repository, iter storer.ObjectIter) *CommitIter

NewCommitIter returns a CommitIter for the given repository and underlying object iterator.

The returned CommitIter will automatically skip over non-commit objects.

func (*CommitIter) ForEach

func (iter *CommitIter) ForEach(cb func(*Commit) error) error

ForEach call the cb function for each commit contained on this iter until an error happends or the end of the iter is reached. If ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*CommitIter) Next

func (iter *CommitIter) Next() (*Commit, error)

Next moves the iterator to the next commit and returns a pointer to it. If it has reached the end of the set it will return io.EOF.

type FetchOptions

type FetchOptions struct {
	RefSpecs []config.RefSpec
	// Depth limit fetching to the specified number of commits from the tip of
	// each remote branch history.
	Depth int
}

FetchOptions describe how a fetch should be perform

func (*FetchOptions) Validate

func (o *FetchOptions) Validate() error

Validate validate the fields and set the default values

type File

type File struct {
	Name string
	Mode os.FileMode
	Blob
}

File represents git file objects.

func NewFile

func NewFile(name string, m os.FileMode, b *Blob) *File

NewFile returns a File based on the given blob object

func (*File) Contents

func (f *File) Contents() (content string, err error)

Contents returns the contents of a file as a string.

func (*File) Lines

func (f *File) Lines() ([]string, error)

Lines returns a slice of lines from the contents of a file, stripping all end of line characters. If the last line is empty (does not end in an end of line), it is also stripped.

type FileIter

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

func NewFileIter

func NewFileIter(r *Repository, t *Tree) *FileIter

func (*FileIter) Close

func (iter *FileIter) Close()

func (*FileIter) ForEach

func (iter *FileIter) ForEach(cb func(*File) error) error

ForEach call the cb function for each file contained on this iter until an error happends or the end of the iter is reached. If plumbing.ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*FileIter) Next

func (iter *FileIter) Next() (*File, error)

type Hash

type Hash plumbing.Hash

Hash hash of an object

type Object

type Object interface {
	ID() plumbing.Hash
	Type() plumbing.ObjectType
	Decode(plumbing.Object) error
	Encode(plumbing.Object) error
}

Object is a generic representation of any git object. It is implemented by Commit, Tree, Blob and Tag, and includes the functions that are common to them.

Object is returned when an object could of any type. It is frequently used with a type cast to acquire the specific type of object:

func process(obj Object) {
	switch o := obj.(type) {
	case *Commit:
		// o is a Commit
	case *Tree:
		// o is a Tree
	case *Blob:
		// o is a Blob
	case *Tag:
		// o is a Tag
	}
}

This interface is intentionally different from plumbing.Object, which is a lower level interface used by storage implementations to read and write objects.

type ObjectIter

type ObjectIter struct {
	storer.ObjectIter
	// contains filtered or unexported fields
}

ObjectIter provides an iterator for a set of objects.

func NewObjectIter

func NewObjectIter(r *Repository, iter storer.ObjectIter) *ObjectIter

NewObjectIter returns a ObjectIter for the given repository and underlying object iterator.

func (*ObjectIter) ForEach

func (iter *ObjectIter) ForEach(cb func(Object) error) error

ForEach call the cb function for each object contained on this iter until an error happens or the end of the iter is reached. If ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*ObjectIter) Next

func (iter *ObjectIter) Next() (Object, error)

Next moves the iterator to the next object and returns a pointer to it. If it has reached the end of the set it will return io.EOF.

type PullOptions

type PullOptions struct {
	// Name of the remote to be pulled
	RemoteName string
	// Remote branch to clone
	ReferenceName plumbing.ReferenceName
	// Fetch only ReferenceName if true
	SingleBranch bool
	// Limit fetching to the specified number of commits
	Depth int
}

PullOptions describe how a pull should be perform

func (*PullOptions) Validate

func (o *PullOptions) Validate() error

Validate validate the fields and set the default values

type Remote

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

Remote represents a connection to a remote repository

func (*Remote) Capabilities

func (r *Remote) Capabilities() *packp.Capabilities

Capabilities returns the remote capabilities

func (*Remote) Config

func (r *Remote) Config() *config.RemoteConfig

Config return the config

func (*Remote) Connect

func (r *Remote) Connect() error

Connect with the endpoint

func (*Remote) Disconnect

func (r *Remote) Disconnect() error

Disconnect from the remote and save the config

func (*Remote) Fetch

func (r *Remote) Fetch(o *FetchOptions) (err error)

Fetch returns a reader using the request

func (*Remote) Head

func (r *Remote) Head() *plumbing.Reference

Head returns the Reference of the HEAD

func (*Remote) Info

func (r *Remote) Info() *common.GitUploadPackInfo

Info returns the git-upload-pack info

func (*Remote) Ref

func (r *Remote) Ref(name plumbing.ReferenceName, resolved bool) (*plumbing.Reference, error)

Ref returns the Hash pointing the given refName

func (*Remote) Refs

func (r *Remote) Refs() (storer.ReferenceIter, error)

Refs returns a map with all the References

func (*Remote) String

func (r *Remote) String() string

type Repository

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

Repository giturl string, auth common.AuthMethod repository struct

func NewFilesystemRepository

func NewFilesystemRepository(path string) (*Repository, error)

NewFilesystemRepository creates a new repository, backed by a filesystem.Storage based on a fs.OS, if you want to use a custom one you need to use the function NewRepository and build you filesystem.Storage

func NewMemoryRepository

func NewMemoryRepository() *Repository

NewMemoryRepository creates a new repository, backed by a memory.Storage

func NewRepository

func NewRepository(s Storer) (*Repository, error)

NewRepository creates a new repository with the given Storage

func (*Repository) Blob

func (r *Repository) Blob(h plumbing.Hash) (*Blob, error)

Blob returns the blob with the given hash

func (*Repository) Blobs

func (r *Repository) Blobs() (*BlobIter, error)

Blobs decodes the objects into blobs

func (*Repository) Clone

func (r *Repository) Clone(o *CloneOptions) error

Clone clones a remote repository

func (*Repository) Commit

func (r *Repository) Commit(h plumbing.Hash) (*Commit, error)

Commit return the commit with the given hash

func (*Repository) Commits

func (r *Repository) Commits() (*CommitIter, error)

Commits decode the objects into commits

func (*Repository) CreateRemote

func (r *Repository) CreateRemote(c *config.RemoteConfig) (*Remote, error)

CreateRemote creates a new remote

func (*Repository) DeleteRemote

func (r *Repository) DeleteRemote(name string) error

DeleteRemote delete a remote from the repository and delete the config

func (*Repository) Head

func (r *Repository) Head() (*plumbing.Reference, error)

Head returns the reference where HEAD is pointing

func (*Repository) IsEmpty

func (r *Repository) IsEmpty() (bool, error)

IsEmpty returns true if the repository is empty

func (*Repository) Object

func (r *Repository) Object(t plumbing.ObjectType, h plumbing.Hash) (Object, error)

Object returns an object with the given hash.

func (*Repository) Objects

func (r *Repository) Objects() (*ObjectIter, error)

Objects returns an ObjectIter that can step through all of the annotated tags in the repository.

func (*Repository) Pull

func (r *Repository) Pull(o *PullOptions) error

Pull incorporates changes from a remote repository into the current branch

func (*Repository) Ref

func (r *Repository) Ref(name plumbing.ReferenceName, resolved bool) (*plumbing.Reference, error)

Ref returns the Hash pointing the given refName

func (*Repository) Refs

func (r *Repository) Refs() (storer.ReferenceIter, error)

Refs returns a map with all the References

func (*Repository) Remote

func (r *Repository) Remote(name string) (*Remote, error)

Remote return a remote if exists

func (*Repository) Remotes

func (r *Repository) Remotes() ([]*Remote, error)

Remotes return all the remotes

func (*Repository) Tag

func (r *Repository) Tag(h plumbing.Hash) (*Tag, error)

Tag returns a tag with the given hash.

func (*Repository) Tags

func (r *Repository) Tags() (*TagIter, error)

Tags returns a TagIter that can step through all of the annotated tags in the repository.

func (*Repository) Tree

func (r *Repository) Tree(h plumbing.Hash) (*Tree, error)

Tree return the tree with the given hash

func (*Repository) Trees

func (r *Repository) Trees() (*TreeIter, error)

Trees decodes the objects into trees

type Signature

type Signature struct {
	Name  string
	Email string
	When  time.Time
}

Signature represents an action signed by a person

func (*Signature) Decode

func (s *Signature) Decode(b []byte)

Decode decodes a byte slice into a signature

func (*Signature) Encode

func (s *Signature) Encode(w io.Writer) error

Encode encodes a Signature into a writer.

func (*Signature) String

func (s *Signature) String() string

type Storer

Storer is a generic storage of objects, references and any information related to a particular repository. Some Storer implementations persist the information in an system directory (such as `.git`) and others implementations are in memmory being ephemeral

type Tag

type Tag struct {
	Hash       plumbing.Hash
	Name       string
	Tagger     Signature
	Message    string
	TargetType plumbing.ObjectType
	Target     plumbing.Hash
	// contains filtered or unexported fields
}

Tag represents an annotated tag object. It points to a single git object of any type, but tags typically are applied to commit or blob objects. It provides a reference that associates the target with a tag name. It also contains meta-information about the tag, including the tagger, tag date and message.

https://git-scm.com/book/en/v2/Git-Internals-Git-References#Tags

func (*Tag) Blob

func (t *Tag) Blob() (*Blob, error)

Blob returns the blob pointed to by the tag. If the tag points to a different type of object ErrUnsupportedObject will be returned.

func (*Tag) Commit

func (t *Tag) Commit() (*Commit, error)

Commit returns the commit pointed to by the tag. If the tag points to a different type of object ErrUnsupportedObject will be returned.

func (*Tag) Decode

func (t *Tag) Decode(o plumbing.Object) (err error)

Decode transforms a plumbing.Object into a Tag struct.

func (*Tag) Encode

func (t *Tag) Encode(o plumbing.Object) error

Encode transforms a Tag into a plumbing.Object.

func (*Tag) ID

func (t *Tag) ID() plumbing.Hash

ID returns the object ID of the tag, not the object that the tag references. The returned value will always match the current value of Tag.Hash.

ID is present to fulfill the Object interface.

func (*Tag) Object

func (t *Tag) Object() (Object, error)

Object returns the object pointed to by the tag.

func (*Tag) String

func (t *Tag) String() string

String returns the meta information contained in the tag as a formatted string.

func (*Tag) Tree

func (t *Tag) Tree() (*Tree, error)

Tree returns the tree pointed to by the tag. If the tag points to a commit object the tree of that commit will be returned. If the tag does not point to a commit or tree object ErrUnsupportedObject will be returned.

func (*Tag) Type

func (t *Tag) Type() plumbing.ObjectType

Type returns the type of object. It always returns plumbing.TagObject.

Type is present to fulfill the Object interface.

type TagIter

type TagIter struct {
	storer.ObjectIter
	// contains filtered or unexported fields
}

TagIter provides an iterator for a set of tags.

func NewTagIter

func NewTagIter(r *Repository, iter storer.ObjectIter) *TagIter

NewTagIter returns a TagIter for the given repository and underlying object iterator.

The returned TagIter will automatically skip over non-tag objects.

func (*TagIter) ForEach

func (iter *TagIter) ForEach(cb func(*Tag) error) error

ForEach call the cb function for each tag contained on this iter until an error happends or the end of the iter is reached. If ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*TagIter) Next

func (iter *TagIter) Next() (*Tag, error)

Next moves the iterator to the next tag and returns a pointer to it. If it has reached the end of the set it will return io.EOF.

type Tree

type Tree struct {
	Entries []TreeEntry
	Hash    plumbing.Hash
	// contains filtered or unexported fields
}

Tree is basically like a directory - it references a bunch of other trees and/or blobs (i.e. files and sub-directories)

func (*Tree) Decode

func (t *Tree) Decode(o plumbing.Object) (err error)

Decode transform an plumbing.Object into a Tree struct

func (*Tree) Encode

func (t *Tree) Encode(o plumbing.Object) error

Encode transforms a Tree into a plumbing.Object.

func (*Tree) File

func (t *Tree) File(path string) (*File, error)

File returns the hash of the file identified by the `path` argument. The path is interpreted as relative to the tree receiver.

func (*Tree) Files

func (t *Tree) Files() *FileIter

Files returns a FileIter allowing to iterate over the Tree

func (*Tree) ID

func (t *Tree) ID() plumbing.Hash

ID returns the object ID of the tree. The returned value will always match the current value of Tree.Hash.

ID is present to fulfill the Object interface.

func (*Tree) Type

func (t *Tree) Type() plumbing.ObjectType

Type returns the type of object. It always returns plumbing.TreeObject.

type TreeEntry

type TreeEntry struct {
	Name string
	Mode os.FileMode
	Hash plumbing.Hash
}

TreeEntry represents a file

type TreeIter

type TreeIter struct {
	storer.ObjectIter
	// contains filtered or unexported fields
}

TreeIter provides an iterator for a set of trees.

func NewTreeIter

func NewTreeIter(r *Repository, iter storer.ObjectIter) *TreeIter

NewTreeIter returns a TreeIter for the given repository and underlying object iterator.

The returned TreeIter will automatically skip over non-tree objects.

func (*TreeIter) ForEach

func (iter *TreeIter) ForEach(cb func(*Tree) error) error

ForEach call the cb function for each tree contained on this iter until an error happens or the end of the iter is reached. If ErrStop is sent the iteration is stop but no error is returned. The iterator is closed.

func (*TreeIter) Next

func (iter *TreeIter) Next() (*Tree, error)

Next moves the iterator to the next tree and returns a pointer to it. If it has reached the end of the set it will return io.EOF.

type TreeWalker

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

TreeWalker provides a means of walking through all of the entries in a Tree.

func NewTreeWalker

func NewTreeWalker(r *Repository, t *Tree, recursive bool) *TreeWalker

NewTreeWalker returns a new TreeWalker for the given repository and tree.

It is the caller's responsibility to call Close() when finished with the tree walker.

func (*TreeWalker) Close

func (w *TreeWalker) Close()

Close releases any resources used by the TreeWalker.

func (*TreeWalker) Next

func (w *TreeWalker) Next() (name string, entry TreeEntry, err error)

Next returns the next object from the tree. Objects are returned in order and subtrees are included. After the last object has been returned further calls to Next() will return io.EOF.

In the current implementation any objects which cannot be found in the underlying repository will be skipped automatically. It is possible that this may change in future versions.

func (*TreeWalker) Tree

func (w *TreeWalker) Tree() *Tree

Tree returns the tree that the tree walker most recently operated on.

Directories

Path Synopsis
Package config storage is the implementation of git config for go-git
Package config storage is the implementation of git config for go-git
+build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore
+build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore +build ignore
Package diff implements line oriented diffs, similar to the ancient Unix diff command.
Package diff implements line oriented diffs, similar to the ancient Unix diff command.
examples
package plumbing implement the core interfaces and structs used by go-git
package plumbing implement the core interfaces and structs used by go-git
client
Package clients includes the implementation for diferent transport protocols go-git needs the packfile and the refs of the repo.
Package clients includes the implementation for diferent transport protocols go-git needs the packfile and the refs of the repo.
client/common
Package common contains interfaces and non-specific protocol entities
Package common contains interfaces and non-specific protocol entities
client/http
Package http implements a HTTP client for go-git.
Package http implements a HTTP client for go-git.
client/ssh
Package ssh implements a ssh client for go-git.
Package ssh implements a ssh client for go-git.
format/config
Package config implements decoding/encoding of git config files.
Package config implements decoding/encoding of git config files.
format/idxfile
Package idxfile implements a encoder/decoder of idx files
Package idxfile implements a encoder/decoder of idx files
format/index
Package index implements a encoder/decoder of index format files
Package index implements a encoder/decoder of index format files
format/packfile
Package packfile implements a encoder/decoder of packfile format
Package packfile implements a encoder/decoder of packfile format
format/packp/advrefs
Package advrefs implements encoding and decoding advertised-refs messages from a git-upload-pack command.
Package advrefs implements encoding and decoding advertised-refs messages from a git-upload-pack command.
format/packp/pktline
Package pktline implements reading payloads form pkt-lines and encoding pkt-lines from payloads.
Package pktline implements reading payloads form pkt-lines and encoding pkt-lines from payloads.
format/packp/ulreq
Package ulreq implements encoding and decoding upload-request messages from a git-upload-pack command.
Package ulreq implements encoding and decoding upload-request messages from a git-upload-pack command.
storage
filesystem
Package filesystem is a storage backend base on filesystems
Package filesystem is a storage backend base on filesystems
filesystem/internal/dotgit
https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt
https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt
memory
Package memory is a storage backend base on memory
Package memory is a storage backend base on memory
utils
binary
Package binary implements sintax-sugar functions on top of the standard library binary package
Package binary implements sintax-sugar functions on top of the standard library binary package
fs
Package fs interace and implementations used by storage/filesystem
Package fs interace and implementations used by storage/filesystem

Jump to

Keyboard shortcuts

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