Commit 4a3b18a62f99c836900c76d480ae33933098461c

Carlos Martín Nieto 2011-10-03T22:26:06

A missing refspec is not an error It's rare for a configured remote, but for one given as an URL on the command line, it's more often than not the case. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>

diff --git a/src/fetch.c b/src/fetch.c
index 1bb8968..e8809d0 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -36,11 +36,13 @@ static int filter_wants(git_remote *remote)
 		goto cleanup;
 	}
 
+	/*
+	 * The fetch refspec can be NULL, and what this means is that the
+	 * user didn't specify one. This is fine, as it means that we're
+	 * not interested in any particular branch but just the remote's
+	 * HEAD, which will be stored in FETCH_HEAD after the fetch.
+	 */
 	spec = git_remote_fetchspec(remote);
-	if (spec == NULL) {
-		error = git__throw(GIT_ERROR, "The remote has no fetchspec");
-		goto cleanup;
-	}
 
 	for (i = 0; i < refs.len; ++i) {
 		git_remote_head *head = refs.heads[i];
diff --git a/src/refspec.c b/src/refspec.c
index 9de2730..ed4b5e6 100644
--- a/src/refspec.c
+++ b/src/refspec.c
@@ -42,17 +42,17 @@ int git_refspec_parse(git_refspec *refspec, const char *str)
 
 const char *git_refspec_src(const git_refspec *refspec)
 {
-	return refspec->src;
+	return refspec == NULL ? NULL : refspec->src;
 }
 
 const char *git_refspec_dst(const git_refspec *refspec)
 {
-	return refspec->dst;
+	return refspec == NULL ? NULL : refspec->dst;
 }
 
 int git_refspec_src_match(const git_refspec *refspec, const char *refname)
 {
-	return git__fnmatch(refspec->src, refname, 0);
+	return refspec == NULL ? GIT_ENOMATCH : git__fnmatch(refspec->src, refname, 0);
 }
 
 int git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, const char *name)