Merge branch 'jk/send-pack' into HEAD
* jk/send-pack: t5516: test update of local refs on push send-pack: don't update tracking refs on errormaint
						commit
						7ae4dd0572
					
				
							
								
								
									
										50
									
								
								send-pack.c
								
								
								
								
							
							
						
						
									
										50
									
								
								send-pack.c
								
								
								
								
							|  | @ -178,6 +178,35 @@ static int receive_status(int in) | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void update_tracking_ref(struct remote *remote, struct ref *ref) | ||||||
|  | { | ||||||
|  | 	struct refspec rs; | ||||||
|  | 	int will_delete_ref; | ||||||
|  |  | ||||||
|  | 	rs.src = ref->name; | ||||||
|  | 	rs.dst = NULL; | ||||||
|  |  | ||||||
|  | 	if (!ref->peer_ref) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	will_delete_ref = is_null_sha1(ref->peer_ref->new_sha1); | ||||||
|  |  | ||||||
|  | 	if (!will_delete_ref && | ||||||
|  | 			!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if (!remote_find_tracking(remote, &rs)) { | ||||||
|  | 		fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst); | ||||||
|  | 		if (is_null_sha1(ref->peer_ref->new_sha1)) { | ||||||
|  | 			if (delete_ref(rs.dst, NULL)) | ||||||
|  | 				error("Failed to delete"); | ||||||
|  | 		} else | ||||||
|  | 			update_ref("update by push", rs.dst, | ||||||
|  | 					ref->new_sha1, NULL, 0, 0); | ||||||
|  | 		free(rs.dst); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| static int send_pack(int in, int out, struct remote *remote, int nr_refspec, char **refspec) | static int send_pack(int in, int out, struct remote *remote, int nr_refspec, char **refspec) | ||||||
| { | { | ||||||
| 	struct ref *ref; | 	struct ref *ref; | ||||||
|  | @ -306,22 +335,6 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha | ||||||
| 			fprintf(stderr, "\n  from %s\n  to   %s\n", | 			fprintf(stderr, "\n  from %s\n  to   %s\n", | ||||||
| 				old_hex, new_hex); | 				old_hex, new_hex); | ||||||
| 		} | 		} | ||||||
| 		if (remote && !dry_run) { |  | ||||||
| 			struct refspec rs; |  | ||||||
| 			rs.src = ref->name; |  | ||||||
| 			rs.dst = NULL; |  | ||||||
| 			if (!remote_find_tracking(remote, &rs)) { |  | ||||||
| 				fprintf(stderr, " Also local %s\n", rs.dst); |  | ||||||
| 				if (will_delete_ref) { |  | ||||||
| 					if (delete_ref(rs.dst, NULL)) { |  | ||||||
| 						error("Failed to delete"); |  | ||||||
| 					} |  | ||||||
| 				} else |  | ||||||
| 					update_ref("update by push", rs.dst, |  | ||||||
| 						ref->new_sha1, NULL, 0, 0); |  | ||||||
| 				free(rs.dst); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	packet_flush(out); | 	packet_flush(out); | ||||||
|  | @ -334,6 +347,11 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha | ||||||
| 			ret = -4; | 			ret = -4; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (!dry_run && remote && ret == 0) { | ||||||
|  | 		for (ref = remote_refs; ref; ref = ref->next) | ||||||
|  | 			update_tracking_ref(remote, ref); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (!new_refs && ret == 0) | 	if (!new_refs && ret == 0) | ||||||
| 		fprintf(stderr, "Everything up-to-date\n"); | 		fprintf(stderr, "Everything up-to-date\n"); | ||||||
| 	return ret; | 	return ret; | ||||||
|  |  | ||||||
|  | @ -254,4 +254,32 @@ test_expect_success 'push with dry-run' ' | ||||||
| 	check_push_result $old_commit heads/master | 	check_push_result $old_commit heads/master | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'push updates local refs' ' | ||||||
|  |  | ||||||
|  | 	rm -rf parent child && | ||||||
|  | 	mkdir parent && cd parent && git init && | ||||||
|  | 		echo one >foo && git add foo && git commit -m one && | ||||||
|  | 	cd .. && | ||||||
|  | 	git clone parent child && cd child && | ||||||
|  | 		echo two >foo && git commit -a -m two && | ||||||
|  | 		git push && | ||||||
|  | 	test $(git rev-parse master) = $(git rev-parse remotes/origin/master) | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'push does not update local refs on failure' ' | ||||||
|  |  | ||||||
|  | 	rm -rf parent child && | ||||||
|  | 	mkdir parent && cd parent && git init && | ||||||
|  | 		echo one >foo && git add foo && git commit -m one && | ||||||
|  | 		echo exit 1 >.git/hooks/pre-receive && | ||||||
|  | 		chmod +x .git/hooks/pre-receive && | ||||||
|  | 	cd .. && | ||||||
|  | 	git clone parent child && cd child && | ||||||
|  | 		echo two >foo && git commit -a -m two || exit 1 | ||||||
|  | 		git push && exit 1 | ||||||
|  | 	test $(git rev-parse master) != $(git rev-parse remotes/origin/master) | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano