Commit 63f91e1c by Carlos Martín Nieto

Add git.git's fnmatch, which is really GNU's and the git__fnmatch wrapper

If the strings match, git__fnmatch returns GIT_SUCCESS and
GIT_ENOMATCH on failure to match.

MSVC fixes: Added a test for _MSC_VER and (in that case) defined
HAVE_STRING_H to 1 so it doesn't try to include <strings.h> which
doesn't exist in the MSVC world. Moved the function declarations to
use the modern inline ones so MSVC doesn't have a fit. Added casts
everywhere so MSVC doesn't crap its pants.

Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
parent f8f3feb0
...@@ -125,6 +125,9 @@ typedef enum { ...@@ -125,6 +125,9 @@ typedef enum {
/** Skip and passthrough the given ODB backend */ /** Skip and passthrough the given ODB backend */
GIT_EPASSTHROUGH = -30, GIT_EPASSTHROUGH = -30,
/** The path pattern and string did not match */
GIT_ENOMATCH = -31,
} git_error; } git_error;
/** /**
......
...@@ -19,4 +19,14 @@ const char *git_refspec_src(const git_refspec *refspec); ...@@ -19,4 +19,14 @@ const char *git_refspec_src(const git_refspec *refspec);
*/ */
const char *git_refspec_dst(const git_refspec *refspec); const char *git_refspec_dst(const git_refspec *refspec);
/**
* Match a refspec's source descriptor with a reference name
*
* @param refspec the refspec
* @param refname the name of the reference to check
* @return GIT_SUCCESS on successful match; GIT_ENOMACH on match
* failure or an error code on other failure
*/
int git_refspec_src_match(const git_refspec *refspec, const char *refname);
#endif #endif
This diff is collapsed. Click to expand it.
/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _FNMATCH_H
#define _FNMATCH_H 1
#ifdef __cplusplus
extern "C" {
#endif
#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
# if !defined __GLIBC__ || !defined __P
# undef __P
# define __P(protos) protos
# endif
#else /* Not C++ or ANSI C. */
# undef __P
# define __P(protos) ()
/* We can get away without defining `const' here only because in this file
it is used only inside the prototype for `fnmatch', which is elided in
non-ANSI C where `const' is problematical. */
#endif /* C++ or ANSI C. */
#ifndef const
# if (defined __STDC__ && __STDC__) || defined __cplusplus
# define __const const
# else
# define __const
# endif
#endif
/* We #undef these before defining them because some losing systems
(HP-UX A.08.07 for example) define these in <unistd.h>. */
#undef FNM_PATHNAME
#undef FNM_NOESCAPE
#undef FNM_PERIOD
/* Bits set in the FLAGS argument to `fnmatch'. */
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
#endif
/* Value returned by `fnmatch' if STRING does not match PATTERN. */
#define FNM_NOMATCH 1
/* This value is returned if the implementation does not support
`fnmatch'. Since this is not the case here it will never be
returned but the conformance test suites still require the symbol
to be defined. */
#ifdef _XOPEN_SOURCE
# define FNM_NOSYS (-1)
#endif
/* Match NAME against the filename pattern PATTERN,
returning zero if it matches, FNM_NOMATCH if not. */
extern int fnmatch __P ((__const char *__pattern, __const char *__name,
int __flags));
#ifdef __cplusplus
}
#endif
#endif /* fnmatch.h */
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "common.h" #include "common.h"
#include "refspec.h" #include "refspec.h"
#include "util.h"
int git_refspec_parse(git_refspec *refspec, const char *str) int git_refspec_parse(git_refspec *refspec, const char *str)
{ {
...@@ -64,3 +65,8 @@ const char *git_refspec_dst(const git_refspec *refspec) ...@@ -64,3 +65,8 @@ const char *git_refspec_dst(const git_refspec *refspec)
{ {
return refspec->dst; return refspec->dst;
} }
int git_refspec_src_match(const git_refspec *refspec, const char *refname)
{
return git__fnmatch(refspec->src, refname, 0);
}
#define GIT__NO_HIDE_MALLOC #define GIT__NO_HIDE_MALLOC
#include <git2.h> #include <git2.h>
#include "common.h" #include "common.h"
#include "fnmatch.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#ifdef _MSV_VER
# include <Shlwapi.h>
#else
# include <fnmatch.h>
#endif
void git_libgit2_version(int *major, int *minor, int *rev) void git_libgit2_version(int *major, int *minor, int *rev)
{ {
*major = LIBGIT2_VER_MAJOR; *major = LIBGIT2_VER_MAJOR;
...@@ -21,6 +28,21 @@ void git_strarray_free(git_strarray *array) ...@@ -21,6 +28,21 @@ void git_strarray_free(git_strarray *array)
free(array->strings); free(array->strings);
} }
int git__fnmatch(const char *pattern, const char *name, int flags)
{
int ret;
ret = fnmatch(pattern, name, flags);
switch (ret) {
case 0:
return GIT_SUCCESS;
case FNM_NOMATCH:
return GIT_ENOMATCH;
default:
return git__throw(GIT_EOSERR, "Error trying to match path");
}
}
int git__strtol32(long *result, const char *nptr, const char **endptr, int base) int git__strtol32(long *result, const char *nptr, const char **endptr, int base)
{ {
const char *p; const char *p;
......
...@@ -148,6 +148,8 @@ extern void git__strtolower(char *str); ...@@ -148,6 +148,8 @@ extern void git__strtolower(char *str);
#define GIT_OID_LINE_LENGTH(header) (STRLEN(header) + 1 + GIT_OID_HEXSZ + 1) #define GIT_OID_LINE_LENGTH(header) (STRLEN(header) + 1 + GIT_OID_HEXSZ + 1)
extern int git__fnmatch(const char *pattern, const char *name, int flags);
/* /*
* Realloc the buffer pointed at by variable 'x' so that it can hold * Realloc the buffer pointed at by variable 'x' so that it can hold
* at least 'nr' entries; the number of entries currently allocated * at least 'nr' entries; the number of entries currently allocated
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment