Example #1
1
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
}
Example #2
0
// 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
}