func (repo *Repository) TagListMatch(pattern string) ([]string, error) { cpattern := C.CString(pattern) defer C.free(unsafe.Pointer(cpattern)) var ctags C.git_strarray defer C.git_strarray_free(&ctags) ecode := C.git_tag_list_match(&ctags, cpattern, repo.git_repository) if ecode != git_SUCCESS { return nil, gitError() } // TODO: Find a safer way if one exists. var tagsSlice reflect.SliceHeader length := int(ctags.count) tagsSlice.Data = uintptr(unsafe.Pointer(ctags.strings)) tagsSlice.Len = length tagsSlice.Cap = length ctagStrings := *(*[]*C.char)(unsafe.Pointer(&tagsSlice)) tags := make([]string, length) for i := 0; i < len(ctagStrings); i++ { tags[i] = C.GoString(ctagStrings[i]) } return tags, nil }
// ListWithMatch returns the names of all the tags in the repository // that match a given pattern. // // The pattern is a standard fnmatch(3) pattern http://man7.org/linux/man-pages/man3/fnmatch.3.html func (c *TagsCollection) ListWithMatch(pattern string) ([]string, error) { var strC C.git_strarray patternC := C.CString(pattern) defer C.free(unsafe.Pointer(patternC)) runtime.LockOSThread() defer runtime.UnlockOSThread() ecode := C.git_tag_list_match(&strC, patternC, c.repo.ptr) if ecode < 0 { return nil, MakeGitError(ecode) } defer C.git_strarray_free(&strC) tags := makeStringsFromCStrings(strC.strings, int(strC.count)) return tags, nil }