summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Probst <[email protected]>2015-03-04 11:39:35 -0800
committerMark Probst <[email protected]>2015-03-04 15:52:57 -0800
commite439b931a6b23a84fd0d32114b25a9dd5e08ac29 (patch)
tree336a9523da188e9835afdd15a433e5d57979a2ed
parentdb5fa66b483816614950b36bf204a0de681b705a (diff)
Default signature
-rw-r--r--branch.go10
-rw-r--r--commit.go48
-rw-r--r--reference.go15
-rw-r--r--remote.go10
-rw-r--r--repository.go55
-rw-r--r--signature.go73
-rw-r--r--submodule.go18
7 files changed, 159 insertions, 70 deletions
diff --git a/branch.go b/branch.go
index 54b01fb..22b767e 100644
--- a/branch.go
+++ b/branch.go
@@ -96,7 +96,10 @@ func (repo *Repository) CreateBranch(branchName string, target *Commit, force bo
cBranchName := C.CString(branchName)
cForce := cbool(force)
- cSignature := signature.toC()
+ cSignature, err := signature.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(cSignature)
var cmsg *C.char
@@ -133,7 +136,10 @@ func (b *Branch) Move(newBranchName string, force bool, signature *Signature, ms
cNewBranchName := C.CString(newBranchName)
cForce := cbool(force)
- cSignature := signature.toC()
+ cSignature, err := signature.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(cSignature)
var cmsg *C.char
diff --git a/commit.go b/commit.go
index 559a1bd..caaff74 100644
--- a/commit.go
+++ b/commit.go
@@ -9,8 +9,6 @@ import "C"
import (
"runtime"
- "time"
- "unsafe"
)
// Commit
@@ -68,49 +66,3 @@ func (c *Commit) ParentId(n uint) *Oid {
func (c *Commit) ParentCount() uint {
return uint(C.git_commit_parentcount(c.cast_ptr))
}
-
-// Signature
-
-type Signature struct {
- Name string
- Email string
- When time.Time
-}
-
-func newSignatureFromC(sig *C.git_signature) *Signature {
- // git stores minutes, go wants seconds
- loc := time.FixedZone("", int(sig.when.offset)*60)
- return &Signature{
- C.GoString(sig.name),
- C.GoString(sig.email),
- time.Unix(int64(sig.when.time), 0).In(loc),
- }
-}
-
-// the offset in mintes, which is what git wants
-func (v *Signature) Offset() int {
- _, offset := v.When.Zone()
- return offset / 60
-}
-
-func (sig *Signature) toC() *C.git_signature {
-
- if sig == nil {
- return nil
- }
-
- var out *C.git_signature
-
- name := C.CString(sig.Name)
- defer C.free(unsafe.Pointer(name))
-
- email := C.CString(sig.Email)
- defer C.free(unsafe.Pointer(email))
-
- ret := C.git_signature_new(&out, name, email, C.git_time_t(sig.When.Unix()), C.int(sig.Offset()))
- if ret < 0 {
- return nil
- }
-
- return out
-}
diff --git a/reference.go b/reference.go
index 46436a6..ef12d0b 100644
--- a/reference.go
+++ b/reference.go
@@ -36,7 +36,10 @@ func (v *Reference) SetSymbolicTarget(target string, sig *Signature, msg string)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -61,7 +64,10 @@ func (v *Reference) SetTarget(target *Oid, sig *Signature, msg string) (*Referen
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -99,7 +105,10 @@ func (v *Reference) Rename(name string, force bool, sig *Signature, msg string)
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
diff --git a/remote.go b/remote.go
index 2684c20..84750d3 100644
--- a/remote.go
+++ b/remote.go
@@ -604,7 +604,10 @@ func (o *Remote) Fetch(refspecs []string, sig *Signature, msg string) error {
var csig *C.git_signature = nil
if sig != nil {
- csig = sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return err
+ }
defer C.free(unsafe.Pointer(csig))
}
@@ -696,7 +699,10 @@ func (o *Remote) Ls(filterRefs ...string) ([]RemoteHead, error) {
func (o *Remote) Push(refspecs []string, opts *PushOptions, sig *Signature, msg string) error {
var csig *C.git_signature = nil
if sig != nil {
- csig = sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return err
+ }
defer C.free(unsafe.Pointer(csig))
}
diff --git a/repository.go b/repository.go
index cbb5d17..7fac277 100644
--- a/repository.go
+++ b/repository.go
@@ -210,7 +210,10 @@ func (v *Repository) SetHead(refname string, sig *Signature, msg string) error {
cname := C.CString(refname)
defer C.free(unsafe.Pointer(cname))
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -230,7 +233,10 @@ func (v *Repository) SetHead(refname string, sig *Signature, msg string) error {
}
func (v *Repository) SetHeadDetached(id *Oid, sig *Signature, msg string) error {
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -253,7 +259,10 @@ func (v *Repository) CreateReference(name string, id *Oid, force bool, sig *Sign
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -284,7 +293,10 @@ func (v *Repository) CreateSymbolicReference(name, target string, force bool, si
ctarget := C.CString(target)
defer C.free(unsafe.Pointer(ctarget))
- csig := sig.toC()
+ csig, err := sig.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.free(unsafe.Pointer(csig))
var cmsg *C.char
@@ -352,10 +364,16 @@ func (v *Repository) CreateCommit(
parentsarg = &cparents[0]
}
- authorSig := author.toC()
+ authorSig, err := author.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(authorSig)
- committerSig := committer.toC()
+ committerSig, err := committer.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(committerSig)
runtime.LockOSThread()
@@ -384,7 +402,10 @@ func (v *Repository) CreateTag(
cmessage := C.CString(message)
defer C.free(unsafe.Pointer(cmessage))
- taggerSig := tagger.toC()
+ taggerSig, err := tagger.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(taggerSig)
ctarget := commit.gitObject.ptr
@@ -546,10 +567,16 @@ func (v *Repository) CreateNote(
defer C.free(unsafe.Pointer(cref))
}
- authorSig := author.toC()
+ authorSig, err := author.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(authorSig)
- committerSig := committer.toC()
+ committerSig, err := committer.toC()
+ if err != nil {
+ return nil, err
+ }
defer C.git_signature_free(committerSig)
cnote := C.CString(note)
@@ -601,10 +628,16 @@ func (v *Repository) RemoveNote(ref string, author, committer *Signature, id *Oi
defer C.free(unsafe.Pointer(cref))
}
- authorSig := author.toC()
+ authorSig, err := author.toC()
+ if err != nil {
+ return err
+ }
defer C.git_signature_free(authorSig)
- committerSig := committer.toC()
+ committerSig, err := committer.toC()
+ if err != nil {
+ return err
+ }
defer C.git_signature_free(committerSig)
runtime.LockOSThread()
diff --git a/signature.go b/signature.go
new file mode 100644
index 0000000..0518387
--- /dev/null
+++ b/signature.go
@@ -0,0 +1,73 @@
+package git
+
+/*
+#include <git2.h>
+*/
+import "C"
+import (
+ "runtime"
+ "time"
+ "unsafe"
+)
+
+type Signature struct {
+ Name string
+ Email string
+ When time.Time
+}
+
+func newSignatureFromC(sig *C.git_signature) *Signature {
+ // git stores minutes, go wants seconds
+ loc := time.FixedZone("", int(sig.when.offset)*60)
+ return &Signature{
+ C.GoString(sig.name),
+ C.GoString(sig.email),
+ time.Unix(int64(sig.when.time), 0).In(loc),
+ }
+}
+
+// the offset in mintes, which is what git wants
+func (v *Signature) Offset() int {
+ _, offset := v.When.Zone()
+ return offset / 60
+}
+
+func (sig *Signature) toC() (*C.git_signature, error) {
+ if sig == nil {
+ return nil, nil
+ }
+
+ var out *C.git_signature
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ name := C.CString(sig.Name)
+ defer C.free(unsafe.Pointer(name))
+
+ email := C.CString(sig.Email)
+ defer C.free(unsafe.Pointer(email))
+
+ ret := C.git_signature_new(&out, name, email, C.git_time_t(sig.When.Unix()), C.int(sig.Offset()))
+ if ret < 0 {
+ return nil, MakeGitError(ret)
+ }
+
+ return out, nil
+}
+
+func (repo *Repository) DefaultSignature() (*Signature, error) {
+ var out *C.git_signature
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
+ cErr := C.git_signature_default(&out, repo.ptr)
+ if cErr < 0 {
+ return nil, MakeGitError(cErr)
+ }
+
+ defer C.git_signature_free(out)
+
+ return newSignatureFromC(out), nil
+}
diff --git a/submodule.go b/submodule.go
index 6923c61..7c6c922 100644
--- a/submodule.go
+++ b/submodule.go
@@ -318,7 +318,10 @@ func (repo *Repository) ReloadAllSubmodules(force bool) error {
func (sub *Submodule) Update(init bool, opts *SubmoduleUpdateOptions) error {
var copts C.git_submodule_update_options
- populateSubmoduleUpdateOptions(&copts, opts)
+ err := populateSubmoduleUpdateOptions(&copts, opts)
+ if err != nil {
+ return err
+ }
runtime.LockOSThread()
defer runtime.UnlockOSThread()
@@ -331,15 +334,22 @@ func (sub *Submodule) Update(init bool, opts *SubmoduleUpdateOptions) error {
return nil
}
-func populateSubmoduleUpdateOptions(ptr *C.git_submodule_update_options, opts *SubmoduleUpdateOptions) {
+func populateSubmoduleUpdateOptions(ptr *C.git_submodule_update_options, opts *SubmoduleUpdateOptions) error {
C.git_submodule_update_init_options(ptr, C.GIT_SUBMODULE_UPDATE_OPTIONS_VERSION)
if opts == nil {
- return
+ return nil
}
populateCheckoutOpts(&ptr.checkout_opts, opts.CheckoutOpts)
populateRemoteCallbacks(&ptr.remote_callbacks, opts.RemoteCallbacks)
ptr.clone_checkout_strategy = C.uint(opts.CloneCheckoutStrategy)
- ptr.signature = opts.Signature.toC()
+
+ sig, err := opts.Signature.toC()
+ if err != nil {
+ return err
+ }
+ ptr.signature = sig
+
+ return nil
}