Commit 3ed4b5012bbdba844ae1ffdff884a1eb630e9884

Sascha Cunz 2012-07-25T01:32:31

Remotes: Load/Save for fetch.foo.pushurl

diff --git a/src/remote.c b/src/remote.c
index c0819ff..bcc4ab5 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -131,6 +131,26 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name)
 	GITERR_CHECK_ALLOC(remote->url);
 
 	git_buf_clear(&buf);
+	if (git_buf_printf(&buf, "remote.%s.pushurl", name) < 0) {
+		error = -1;
+		goto cleanup;
+	}
+
+	error = git_config_get_string(&val, config, git_buf_cstr(&buf));
+	if (error == GIT_ENOTFOUND)
+		error = 0;
+
+	if (error < 0) {
+		error = -1;
+		goto cleanup;
+	}
+
+	if (val) {
+		remote->pushurl = git__strdup(val);
+		GITERR_CHECK_ALLOC(remote->pushurl);
+	}
+
+	git_buf_clear(&buf);
 	if (git_buf_printf(&buf, "remote.%s.fetch", name) < 0) {
 		error = -1;
 		goto cleanup;
@@ -187,6 +207,17 @@ int git_remote_save(const git_remote *remote)
 		return -1;
 	}
 
+	if (remote->pushurl) {
+		git_buf_clear(&buf);
+		if (git_buf_printf(&buf, "remote.%s.pushurl", remote->name) < 0)
+			return -1;
+
+		if (git_config_set_string(config, git_buf_cstr(&buf), remote->pushurl) < 0) {
+			git_buf_free(&buf);
+			return -1;
+		}
+	}
+
 	if (remote->fetch.src != NULL && remote->fetch.dst != NULL) {
 		git_buf_clear(&buf);
 		git_buf_clear(&value);
@@ -429,6 +460,7 @@ void git_remote_free(git_remote *remote)
 	git__free(remote->push.src);
 	git__free(remote->push.dst);
 	git__free(remote->url);
+	git__free(remote->pushurl);
 	git__free(remote->name);
 	git__free(remote);
 }
diff --git a/src/remote.h b/src/remote.h
index 0949ad4..abdaa57 100644
--- a/src/remote.h
+++ b/src/remote.h
@@ -14,6 +14,7 @@
 struct git_remote {
 	char *name;
 	char *url;
+	char *pushurl;
 	git_vector refs;
 	struct git_refspec fetch;
 	struct git_refspec push;