summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCalin Seciu <[email protected]>2015-07-24 12:14:53 +0300
committerCalin Seciu <[email protected]>2015-07-24 12:14:53 +0300
commitec93213f21f57e6b378bf9f6ceb05c9fd1f15daf (patch)
treee7464cb190b6c1eca9ff4fb9f2ee4475887601c5
parent4b88210cbf495891c8d44c53b3d978e6ff31a5a3 (diff)
Add ReferenceIsValidName()
-rw-r--r--reference.go19
-rw-r--r--reference_test.go10
2 files changed, 29 insertions, 0 deletions
diff --git a/reference.go b/reference.go
index 452de46..140082f 100644
--- a/reference.go
+++ b/reference.go
@@ -430,3 +430,22 @@ func (v *ReferenceIterator) Free() {
runtime.SetFinalizer(v, nil)
C.git_reference_iterator_free(v.ptr)
}
+
+// ReferenceIsValidName ensures the reference name is well-formed.
+//
+// Valid reference names must follow one of two patterns:
+//
+// 1. Top-level names must contain only capital letters and underscores,
+// and must begin and end with a letter. (e.g. "HEAD", "ORIG_HEAD").
+//
+// 2. Names prefixed with "refs/" can be almost anything. You must avoid
+// the characters '~', '^', ':', ' \ ', '?', '[', and '*', and the sequences
+// ".." and " @ {" which have special meaning to revparse.
+func ReferenceIsValidName(name string) bool {
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+ if C.git_reference_is_valid_name(cname) == 1 {
+ return true
+ }
+ return false
+}
diff --git a/reference_test.go b/reference_test.go
index b69a274..761daf8 100644
--- a/reference_test.go
+++ b/reference_test.go
@@ -208,6 +208,16 @@ func TestIsNote(t *testing.T) {
t.Fatalf("%s should not be a note", ref.Name())
}
}
+
+func TestReferenceIsValidName(t *testing.T) {
+ if !ReferenceIsValidName("HEAD") {
+ t.Errorf("HEAD should be a valid reference name")
+ }
+ if ReferenceIsValidName("HEAD1") {
+ t.Errorf("HEAD1 should not be a valid reference name")
+ }
+}
+
func compareStringList(t *testing.T, expected, actual []string) {
for i, v := range expected {
if actual[i] != v {