Merge branch 'mz/remote-rename' into maint-1.7.6
* mz/remote-rename: remote: only update remote-tracking branch if updating refspec remote rename: warn when refspec was not updated remote: "rename o foo" should not rename ref "origin/bar" remote: write correct fetch spec when renaming remote 'remote'maint
						commit
						716b64a73e
					
				|  | @ -580,7 +580,7 @@ static int read_remote_branches(const char *refname, | ||||||
| 	unsigned char orig_sha1[20]; | 	unsigned char orig_sha1[20]; | ||||||
| 	const char *symref; | 	const char *symref; | ||||||
|  |  | ||||||
| 	strbuf_addf(&buf, "refs/remotes/%s", rename->old); | 	strbuf_addf(&buf, "refs/remotes/%s/", rename->old); | ||||||
| 	if (!prefixcmp(refname, buf.buf)) { | 	if (!prefixcmp(refname, buf.buf)) { | ||||||
| 		item = string_list_append(rename->remote_branches, xstrdup(refname)); | 		item = string_list_append(rename->remote_branches, xstrdup(refname)); | ||||||
| 		symref = resolve_ref(refname, orig_sha1, 1, &flag); | 		symref = resolve_ref(refname, orig_sha1, 1, &flag); | ||||||
|  | @ -631,10 +631,11 @@ static int mv(int argc, const char **argv) | ||||||
| 		OPT_END() | 		OPT_END() | ||||||
| 	}; | 	}; | ||||||
| 	struct remote *oldremote, *newremote; | 	struct remote *oldremote, *newremote; | ||||||
| 	struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT, buf3 = STRBUF_INIT; | 	struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT, buf3 = STRBUF_INIT, | ||||||
|  | 		old_remote_context = STRBUF_INIT; | ||||||
| 	struct string_list remote_branches = STRING_LIST_INIT_NODUP; | 	struct string_list remote_branches = STRING_LIST_INIT_NODUP; | ||||||
| 	struct rename_info rename; | 	struct rename_info rename; | ||||||
| 	int i; | 	int i, refspec_updated = 0; | ||||||
|  |  | ||||||
| 	if (argc != 3) | 	if (argc != 3) | ||||||
| 		usage_with_options(builtin_remote_rename_usage, options); | 		usage_with_options(builtin_remote_rename_usage, options); | ||||||
|  | @ -669,15 +670,25 @@ static int mv(int argc, const char **argv) | ||||||
| 	strbuf_addf(&buf, "remote.%s.fetch", rename.new); | 	strbuf_addf(&buf, "remote.%s.fetch", rename.new); | ||||||
| 	if (git_config_set_multivar(buf.buf, NULL, NULL, 1)) | 	if (git_config_set_multivar(buf.buf, NULL, NULL, 1)) | ||||||
| 		return error("Could not remove config section '%s'", buf.buf); | 		return error("Could not remove config section '%s'", buf.buf); | ||||||
|  | 	strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old); | ||||||
| 	for (i = 0; i < oldremote->fetch_refspec_nr; i++) { | 	for (i = 0; i < oldremote->fetch_refspec_nr; i++) { | ||||||
| 		char *ptr; | 		char *ptr; | ||||||
|  |  | ||||||
| 		strbuf_reset(&buf2); | 		strbuf_reset(&buf2); | ||||||
| 		strbuf_addstr(&buf2, oldremote->fetch_refspec[i]); | 		strbuf_addstr(&buf2, oldremote->fetch_refspec[i]); | ||||||
| 		ptr = strstr(buf2.buf, rename.old); | 		ptr = strstr(buf2.buf, old_remote_context.buf); | ||||||
| 		if (ptr) | 		if (ptr) { | ||||||
| 			strbuf_splice(&buf2, ptr-buf2.buf, strlen(rename.old), | 			refspec_updated = 1; | ||||||
| 					rename.new, strlen(rename.new)); | 			strbuf_splice(&buf2, | ||||||
|  | 				      ptr-buf2.buf + strlen(":refs/remotes/"), | ||||||
|  | 				      strlen(rename.old), rename.new, | ||||||
|  | 				      strlen(rename.new)); | ||||||
|  | 		} else | ||||||
|  | 			warning("Not updating non-default fetch respec\n" | ||||||
|  | 				"\t%s\n" | ||||||
|  | 				"\tPlease update the configuration manually if necessary.", | ||||||
|  | 				buf2.buf); | ||||||
|  |  | ||||||
| 		if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0)) | 		if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0)) | ||||||
| 			return error("Could not append '%s'", buf.buf); | 			return error("Could not append '%s'", buf.buf); | ||||||
| 	} | 	} | ||||||
|  | @ -695,6 +706,9 @@ static int mv(int argc, const char **argv) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (!refspec_updated) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * First remove symrefs, then rename the rest, finally create | 	 * First remove symrefs, then rename the rest, finally create | ||||||
| 	 * the new symrefs. | 	 * the new symrefs. | ||||||
|  |  | ||||||
|  | @ -631,6 +631,37 @@ test_expect_success 'rename a remote' ' | ||||||
|  |  | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'rename does not update a non-default fetch refspec' ' | ||||||
|  |  | ||||||
|  | 	git clone one four.one && | ||||||
|  | 	(cd four.one && | ||||||
|  | 	 git config remote.origin.fetch +refs/heads/*:refs/heads/origin/* && | ||||||
|  | 	 git remote rename origin upstream && | ||||||
|  | 	 test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/heads/origin/*" && | ||||||
|  | 	 git rev-parse -q origin/master) | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'rename a remote with name part of fetch spec' ' | ||||||
|  |  | ||||||
|  | 	git clone one four.two && | ||||||
|  | 	(cd four.two && | ||||||
|  | 	 git remote rename origin remote && | ||||||
|  | 	 git remote rename remote upstream && | ||||||
|  | 	 test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*") | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'rename a remote with name prefix of other remote' ' | ||||||
|  |  | ||||||
|  | 	git clone one four.three && | ||||||
|  | 	(cd four.three && | ||||||
|  | 	 git remote add o git://example.com/repo.git && | ||||||
|  | 	 git remote rename o upstream && | ||||||
|  | 	 test "$(git rev-parse origin/master)" = "$(git rev-parse master)") | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
| cat > remotes_origin << EOF | cat > remotes_origin << EOF | ||||||
| URL: $(pwd)/one | URL: $(pwd)/one | ||||||
| Push: refs/heads/master:refs/heads/upstream | Push: refs/heads/master:refs/heads/upstream | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano