Merge pull request #322 from calavera/ssh_memory_credentials
Add NewCredSshKeyFromMemory to the credentials helpers.
diff --git a/.travis.yml b/.travis.yml
index f796389..79ad168 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,6 +10,8 @@
- 1.3
- 1.4
- 1.5
+ - 1.6
+ - 1.7
- tip
matrix:
diff --git a/blame_test.go b/blame_test.go
index a2a4d38..ec96af7 100644
--- a/blame_test.go
+++ b/blame_test.go
@@ -6,6 +6,7 @@
)
func TestBlame(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/blob.go b/blob.go
index 1a86e60..8b3e94f 100644
--- a/blob.go
+++ b/blob.go
@@ -37,15 +37,24 @@
defer runtime.UnlockOSThread()
var id C.git_oid
- var ptr unsafe.Pointer
+ var size C.size_t
+ // Go 1.6 added some increased checking of passing pointer to
+ // C, but its check depends on its expectations of waht we
+ // pass to the C function, so unless we take the address of
+ // its contents at the call site itself, it can fail when
+ // 'data' is a slice of a slice.
+ //
+ // When we're given an empty slice, create a dummy one where 0
+ // isn't out of bounds.
if len(data) > 0 {
- ptr = unsafe.Pointer(&data[0])
+ size = C.size_t(len(data))
} else {
- ptr = unsafe.Pointer(nil)
+ data = []byte{0}
+ size = C.size_t(0)
}
- ecode := C.git_blob_create_frombuffer(&id, repo.ptr, ptr, C.size_t(len(data)))
+ ecode := C.git_blob_create_frombuffer(&id, repo.ptr, unsafe.Pointer(&data[0]), size)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
diff --git a/blob_test.go b/blob_test.go
index 2b5ec4f..815ab3d 100644
--- a/blob_test.go
+++ b/blob_test.go
@@ -1,10 +1,23 @@
package git
import (
+ "bytes"
"testing"
)
+type bufWrapper struct {
+ buf [64]byte
+ pointer []byte
+}
+
+func doublePointerBytes() []byte {
+ o := &bufWrapper{}
+ o.pointer = o.buf[0:10]
+ return o.pointer[0:1]
+}
+
func TestCreateBlobFromBuffer(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -14,4 +27,16 @@
if id.String() != "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" {
t.Fatal("Empty buffer did not deliver empty blob id")
}
+
+ for _, data := range []([]byte){[]byte("hello there"), doublePointerBytes()} {
+ id, err = repo.CreateBlobFromBuffer(data)
+ checkFatal(t, err)
+
+ blob, err := repo.LookupBlob(id)
+ checkFatal(t, err)
+ if !bytes.Equal(blob.Contents(), data) {
+ t.Fatal("Loaded bytes don't match original bytes:",
+ blob.Contents(), "!=", data)
+ }
+ }
}
diff --git a/branch.go b/branch.go
index df72dba..d381c23 100644
--- a/branch.go
+++ b/branch.go
@@ -13,6 +13,7 @@
type BranchType uint
const (
+ BranchAll BranchType = C.GIT_BRANCH_ALL
BranchLocal BranchType = C.GIT_BRANCH_LOCAL
BranchRemote BranchType = C.GIT_BRANCH_REMOTE
)
@@ -72,6 +73,10 @@
}
}
+ if err != nil && IsErrorCode(err, ErrIterOver) {
+ return nil
+ }
+
return err
}
diff --git a/branch_test.go b/branch_test.go
index a0834a8..01a2e28 100644
--- a/branch_test.go
+++ b/branch_test.go
@@ -5,6 +5,7 @@
)
func TestBranchIterator(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -27,6 +28,7 @@
}
func TestBranchIteratorEach(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/cherrypick_test.go b/cherrypick_test.go
index a3246bd..bfa5ca8 100644
--- a/cherrypick_test.go
+++ b/cherrypick_test.go
@@ -33,6 +33,7 @@
}
func TestCherrypick(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/clone_test.go b/clone_test.go
index a6bbf94..24c3a09 100644
--- a/clone_test.go
+++ b/clone_test.go
@@ -10,6 +10,7 @@
)
func TestClone(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -35,6 +36,7 @@
}
func TestCloneWithCallback(t *testing.T) {
+ t.Parallel()
testPayload := 0
repo := createTestRepo(t)
diff --git a/config_test.go b/config_test.go
index fea8d8a..f31e73e 100644
--- a/config_test.go
+++ b/config_test.go
@@ -88,6 +88,7 @@
}
func TestConfigLookups(t *testing.T) {
+ t.Parallel()
var (
err error
c *Config
diff --git a/describe_test.go b/describe_test.go
index 25af107..f0a45f4 100644
--- a/describe_test.go
+++ b/describe_test.go
@@ -8,6 +8,7 @@
)
func TestDescribeCommit(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/diff.go b/diff.go
index 9a7ac78..8ae0512 100644
--- a/diff.go
+++ b/diff.go
@@ -217,6 +217,33 @@
return int(C.git_diff_stats_files_changed(stats.ptr))
}
+type DiffStatsFormat int
+
+const (
+ DiffStatsNone DiffStatsFormat = C.GIT_DIFF_STATS_NONE
+ DiffStatsFull DiffStatsFormat = C.GIT_DIFF_STATS_FULL
+ DiffStatsShort DiffStatsFormat = C.GIT_DIFF_STATS_SHORT
+ DiffStatsNumber DiffStatsFormat = C.GIT_DIFF_STATS_NUMBER
+ DiffStatsIncludeSummary DiffStatsFormat = C.GIT_DIFF_STATS_INCLUDE_SUMMARY
+)
+
+func (stats *DiffStats) String(format DiffStatsFormat,
+ width uint) (string, error) {
+ buf := C.git_buf{}
+ defer C.git_buf_free(&buf)
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ ret := C.git_diff_stats_to_buf(&buf,
+ stats.ptr, C.git_diff_stats_format_t(format), C.size_t(width))
+ if ret < 0 {
+ return "", MakeGitError(ret)
+ }
+
+ return C.GoString(buf.ptr), nil
+}
+
func (diff *Diff) Stats() (*DiffStats, error) {
stats := new(DiffStats)
diff --git a/diff_test.go b/diff_test.go
index 850ed8e..6fbad51 100644
--- a/diff_test.go
+++ b/diff_test.go
@@ -7,6 +7,7 @@
)
func TestFindSimilar(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -61,7 +62,7 @@
}
func TestDiffTreeToTree(t *testing.T) {
-
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -189,6 +190,7 @@
}
func TestDiffBlobs(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/git_test.go b/git_test.go
index 58caf71..3385a72 100644
--- a/git_test.go
+++ b/git_test.go
@@ -58,6 +58,8 @@
checkFatal(t, err)
err = idx.AddByPath("README")
checkFatal(t, err)
+ err = idx.Write()
+ checkFatal(t, err)
treeId, err := idx.WriteTree()
checkFatal(t, err)
@@ -109,6 +111,7 @@
}
func TestOidZero(t *testing.T) {
+ t.Parallel()
var zeroId Oid
if !zeroId.IsZero() {
@@ -117,6 +120,7 @@
}
func TestEmptyOid(t *testing.T) {
+ t.Parallel()
_, err := NewOid("")
if err == nil || !IsErrorCode(err, ErrGeneric) {
t.Fatal("Should have returned invalid error")
diff --git a/index_test.go b/index_test.go
index 5f6b375..600b8b1 100644
--- a/index_test.go
+++ b/index_test.go
@@ -8,6 +8,7 @@
)
func TestCreateRepoAndStage(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -24,6 +25,7 @@
}
func TestIndexReadTree(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -53,6 +55,7 @@
}
func TestIndexWriteTreeTo(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -72,6 +75,7 @@
}
func TestIndexAddAndWriteTreeTo(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -106,6 +110,7 @@
}
func TestIndexAddAllNoCallback(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -127,6 +132,7 @@
}
func TestIndexAddAllCallback(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -155,6 +161,7 @@
}
func TestIndexOpen(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/merge_test.go b/merge_test.go
index 8059727..f2c84bc 100644
--- a/merge_test.go
+++ b/merge_test.go
@@ -6,6 +6,7 @@
)
func TestMergeWithSelf(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -24,6 +25,7 @@
}
func TestMergeAnalysisWithSelf(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -46,6 +48,7 @@
}
func TestMergeSameFile(t *testing.T) {
+ t.Parallel()
file := MergeFileInput{
Path: "test",
Mode: 33188,
@@ -68,6 +71,7 @@
}
func TestMergeTreesWithoutAncestor(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -125,6 +129,7 @@
}
func TestMergeBase(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/note_test.go b/note_test.go
index 27e04be..9f64eb8 100644
--- a/note_test.go
+++ b/note_test.go
@@ -8,6 +8,7 @@
)
func TestCreateNote(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -27,6 +28,7 @@
}
func TestNoteIterator(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -63,6 +65,7 @@
}
func TestRemoveNote(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -86,6 +89,7 @@
}
func TestDefaultNoteRef(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/object_test.go b/object_test.go
index 2ae2a6a..cb262de 100644
--- a/object_test.go
+++ b/object_test.go
@@ -5,6 +5,7 @@
)
func TestObjectPoymorphism(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -88,6 +89,7 @@
}
func TestObjectOwner(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -104,6 +106,7 @@
}
func TestObjectPeel(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/odb_test.go b/odb_test.go
index dfd2ad0..3d22fc9 100644
--- a/odb_test.go
+++ b/odb_test.go
@@ -7,6 +7,7 @@
)
func TestOdbReadHeader(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -35,6 +36,7 @@
}
func TestOdbStream(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -64,7 +66,7 @@
}
func TestOdbHash(t *testing.T) {
-
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -92,6 +94,7 @@
}
func TestOdbForeach(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/patch_test.go b/patch_test.go
index 2d52fb4..291c705 100644
--- a/patch_test.go
+++ b/patch_test.go
@@ -6,6 +6,7 @@
)
func TestPatch(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/push_test.go b/push_test.go
index 8f6e806..f372882 100644
--- a/push_test.go
+++ b/push_test.go
@@ -5,6 +5,7 @@
)
func TestRemotePush(t *testing.T) {
+ t.Parallel()
repo := createBareTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/reference_test.go b/reference_test.go
index 761daf8..b6721e1 100644
--- a/reference_test.go
+++ b/reference_test.go
@@ -8,6 +8,7 @@
)
func TestRefModification(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -53,6 +54,7 @@
}
func TestReferenceIterator(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -131,6 +133,7 @@
}
func TestReferenceOwner(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -150,6 +153,7 @@
}
func TestUtil(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -177,6 +181,7 @@
}
func TestIsNote(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -210,6 +215,7 @@
}
func TestReferenceIsValidName(t *testing.T) {
+ t.Parallel()
if !ReferenceIsValidName("HEAD") {
t.Errorf("HEAD should be a valid reference name")
}
diff --git a/remote_test.go b/remote_test.go
index 978b803..3d00640 100644
--- a/remote_test.go
+++ b/remote_test.go
@@ -6,6 +6,7 @@
)
func TestListRemotes(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -33,6 +34,7 @@
}
func TestCertificateCheck(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -52,6 +54,7 @@
}
func TestRemoteConnect(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -63,6 +66,7 @@
}
func TestRemoteLs(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -81,6 +85,7 @@
}
func TestRemoteLsFiltering(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -107,6 +112,7 @@
}
func TestRemotePruneRefs(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -129,6 +135,7 @@
}
func TestRemotePrune(t *testing.T) {
+ t.Parallel()
remoteRepo := createTestRepo(t)
defer cleanupTestRepo(t, remoteRepo)
diff --git a/repository.go b/repository.go
index 77e9f9c..efc506e 100644
--- a/repository.go
+++ b/repository.go
@@ -28,7 +28,7 @@
// read, write and delete notes from this repository.
Notes NoteCollection
// Tags represents the collection of tags and can be used to create,
- // list and iterate tags in this repository.
+ // list, iterate and remove tags in this repository.
Tags TagsCollection
}
diff --git a/reset.go b/reset.go
index 9da7625..031f5bd 100644
--- a/reset.go
+++ b/reset.go
@@ -24,3 +24,19 @@
}
return nil
}
+
+func (r *Repository) ResetDefaultToCommit(commit *Commit, pathspecs []string) error {
+ cpathspecs := C.git_strarray{}
+ cpathspecs.count = C.size_t(len(pathspecs))
+ cpathspecs.strings = makeCStringsFromStrings(pathspecs)
+ defer freeStrarray(&cpathspecs)
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+ ret := C.git_reset_default(r.ptr, commit.ptr, &cpathspecs)
+
+ if ret < 0 {
+ return MakeGitError(ret)
+ }
+ return nil
+}
diff --git a/reset_test.go b/reset_test.go
index ec578bd..45777e4 100644
--- a/reset_test.go
+++ b/reset_test.go
@@ -6,6 +6,7 @@
)
func TestResetToCommit(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
seedTestRepo(t, repo)
// create commit to reset to
diff --git a/revparse_test.go b/revparse_test.go
index 75e9ffd..2835434 100644
--- a/revparse_test.go
+++ b/revparse_test.go
@@ -5,6 +5,7 @@
)
func TestRevparse(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -17,6 +18,7 @@
}
func TestRevparseSingle(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -29,6 +31,7 @@
}
func TestRevparseExt(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/status.go b/status.go
index 068a474..e68e6e9 100644
--- a/status.go
+++ b/status.go
@@ -25,6 +25,7 @@
StatusWtTypeChange Status = C.GIT_STATUS_WT_TYPECHANGE
StatusWtRenamed Status = C.GIT_STATUS_WT_RENAMED
StatusIgnored Status = C.GIT_STATUS_IGNORED
+ StatusConflicted Status = C.GIT_STATUS_CONFLICTED
)
type StatusEntry struct {
diff --git a/status_test.go b/status_test.go
index 5b97b00..17ed94f 100644
--- a/status_test.go
+++ b/status_test.go
@@ -7,6 +7,7 @@
)
func TestStatusFile(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -27,6 +28,7 @@
}
func TestStatusList(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/submodule_test.go b/submodule_test.go
index 43c890a..fa2e98c 100644
--- a/submodule_test.go
+++ b/submodule_test.go
@@ -5,6 +5,7 @@
)
func TestSubmoduleForeach(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/tag.go b/tag.go
index 8957430..81d7258 100644
--- a/tag.go
+++ b/tag.go
@@ -83,6 +83,21 @@
return oid, nil
}
+func (c *TagsCollection) Remove(name string) error {
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+
+ ret := C.git_tag_delete(c.repo.ptr, cname)
+ if ret < 0 {
+ return MakeGitError(ret)
+ }
+
+ return nil
+}
+
// CreateLightweight creates a new lightweight tag pointing to a commit
// and returns the id of the target object.
//
diff --git a/tag_test.go b/tag_test.go
index 2fdfe00..3404923 100644
--- a/tag_test.go
+++ b/tag_test.go
@@ -7,6 +7,7 @@
)
func TestCreateTag(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -26,6 +27,7 @@
}
func TestCreateTagLightweight(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -50,6 +52,7 @@
}
func TestListTags(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -79,6 +82,7 @@
}
func TestListTagsWithMatch(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -116,6 +120,7 @@
}
func TestTagForeach(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/tree_test.go b/tree_test.go
index fae395a..f5b6822 100644
--- a/tree_test.go
+++ b/tree_test.go
@@ -3,6 +3,7 @@
import "testing"
func TestTreeEntryById(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -22,6 +23,7 @@
}
func TestTreeBuilderInsert(t *testing.T) {
+ t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
diff --git a/walk.go b/walk.go
index 60e618d..ab1de61 100644
--- a/walk.go
+++ b/walk.go
@@ -173,10 +173,6 @@
return nil
}
if err != nil {
- if err.(GitError).Code == ErrIterOver {
- err = nil
- }
-
return err
}