Merge branch 'maint'
* maint: Update draft release notes for 1.5.0.1 Convert update-index references in docs to add. Attempt to improve git-rebase lead-in description. Do not take mode bits from index after type change. git-blame: prevent argument parsing segfault Make gitk save and restore window pane position on Linux and Cygwin. Make gitk save and restore the user set window position. [PATCH] gitk: Use show-ref instead of ls-remote [PATCH] Make gitk work reasonably well on Cygwin. [PATCH] gitk - remove trailing whitespace from a few lines. Change git repo-config to git configmaint
						commit
						69bc0e22d3
					
				|  | @ -7,14 +7,31 @@ Fixes since v1.5.0 | ||||||
| * Documentation updates | * Documentation updates | ||||||
|  |  | ||||||
|   - Clarifications and corrections to 1.5.0 release notes. |   - Clarifications and corrections to 1.5.0 release notes. | ||||||
|  |  | ||||||
|   - The main documentation did not link to git-remote documentation. |   - The main documentation did not link to git-remote documentation. | ||||||
|  |  | ||||||
|  |   - Clarified introductory text of git-rebase documentation. | ||||||
|  |  | ||||||
|  |   - Converted remaining mentions of update-index on Porcelain | ||||||
|  |     documents to git-add/git-rm. | ||||||
|  |  | ||||||
| * Bugfixes | * Bugfixes | ||||||
|  |  | ||||||
|   - git-daemon marks the listening sockets with FD_CLOEXEC so |   - git-daemon marks the listening sockets with FD_CLOEXEC so | ||||||
|     that it won't be leaked into the children. |     that it won't be leaked into the children. | ||||||
|  |  | ||||||
|  |   - segfault from git-blame when the mandatory pathname | ||||||
|  |     parameter was missing was fixed; usage() message is given | ||||||
|  |     instead. | ||||||
|  |  | ||||||
|  | * Tweaks | ||||||
|  |  | ||||||
|  |   - sliding mmap() inefficiently mmaped the same region of a | ||||||
|  |     packfile with an access pattern that used objects in the | ||||||
|  |     reverse order.  This has been made more efficient. | ||||||
|  |  | ||||||
| -- | -- | ||||||
| O=v1.5.0-7-g37b73cf | exec >/var/tmp/1 | ||||||
|  | O=v1.5.0-24-g460ca30 | ||||||
| echo O=`git describe maint` | echo O=`git describe maint` | ||||||
| git shortlog --no-merges $O.. | git shortlog --no-merges $O..maint | ||||||
|  |  | ||||||
|  | @ -106,7 +106,8 @@ directory tree, and renaming a file does not change the object that | ||||||
| file is associated with in any way. | file is associated with in any way. | ||||||
|  |  | ||||||
| A blob is typically created when gitlink:git-update-index[1] | A blob is typically created when gitlink:git-update-index[1] | ||||||
| is run, and its data can be accessed by gitlink:git-cat-file[1]. | (or gitlink:git-add[1]) is run, and its data can be accessed by | ||||||
|  | gitlink:git-cat-file[1]. | ||||||
|  |  | ||||||
| Tree Object | Tree Object | ||||||
| ~~~~~~~~~~~ | ~~~~~~~~~~~ | ||||||
|  |  | ||||||
|  | @ -61,7 +61,8 @@ OPTIONS | ||||||
| + | + | ||||||
| When a merge conflict happens, the index entries for conflicting | When a merge conflict happens, the index entries for conflicting | ||||||
| paths are left unmerged, and you need to resolve the conflicts | paths are left unmerged, and you need to resolve the conflicts | ||||||
| and mark the resolved paths with `git update-index`. | and mark the resolved paths with `git add` (or `git rm` if the merge | ||||||
|  | should result in deletion of the path). | ||||||
|  |  | ||||||
| <new_branch>:: | <new_branch>:: | ||||||
| 	Name for the new branch. | 	Name for the new branch. | ||||||
|  | @ -179,11 +180,11 @@ fatal: merge program failed | ||||||
| At this point, `git diff` shows the changes cleanly merged as in | At this point, `git diff` shows the changes cleanly merged as in | ||||||
| the previous example, as well as the changes in the conflicted | the previous example, as well as the changes in the conflicted | ||||||
| files.  Edit and resolve the conflict and mark it resolved with | files.  Edit and resolve the conflict and mark it resolved with | ||||||
| `git update-index` as usual: | `git add` as usual: | ||||||
| + | + | ||||||
| ------------ | ------------ | ||||||
| $ edit frotz | $ edit frotz | ||||||
| $ git update-index frotz | $ git add frotz | ||||||
| ------------ | ------------ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -136,7 +136,7 @@ After seeing a conflict, you can do two things: | ||||||
|  |  | ||||||
|  * Resolve the conflicts.  `git-diff` would report only the |  * Resolve the conflicts.  `git-diff` would report only the | ||||||
|    conflicting paths because of the above 2. and 3..  Edit the |    conflicting paths because of the above 2. and 3..  Edit the | ||||||
|    working tree files into a desirable shape, `git-update-index` |    working tree files into a desirable shape, `git-add` or `git-rm` | ||||||
|    them, to make the index file contain what the merge result |    them, to make the index file contain what the merge result | ||||||
|    should be, and run `git-commit` to commit the result. |    should be, and run `git-commit` to commit the result. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -13,11 +13,20 @@ SYNOPSIS | ||||||
|  |  | ||||||
| DESCRIPTION | DESCRIPTION | ||||||
| ----------- | ----------- | ||||||
| git-rebase replaces <branch> with a new branch of the same name.  When | If <branch> is specified, git-rebase will perform an automatic | ||||||
| the --onto option is provided the new branch starts out with a HEAD equal | `git checkout <branch>` before doing anything else.  Otherwise | ||||||
| to <newbase>, otherwise it is equal to <upstream>.  It then attempts to | it remains on the current branch. | ||||||
| create a new commit for each commit from the original <branch> that does |  | ||||||
| not exist in the <upstream> branch. | All changes made by commits in the current branch but that are not | ||||||
|  | in <upstream> are saved to a temporary area.  This is the same set | ||||||
|  | of commits that would be shown by `git log <upstream>..HEAD`. | ||||||
|  |  | ||||||
|  | The current branch is reset to <upstream>, or <newbase> if the | ||||||
|  | --onto option was supplied.  This has the exact same effect as | ||||||
|  | `git reset --hard <upstream>` (or <newbase>). | ||||||
|  |  | ||||||
|  | The commits that were previously saved into the temporary area are | ||||||
|  | then reapplied to the current branch, one by one, in order. | ||||||
|  |  | ||||||
| It is possible that a merge failure will prevent this process from being | It is possible that a merge failure will prevent this process from being | ||||||
| completely automatic.  You will have to resolve any such merge failure | completely automatic.  You will have to resolve any such merge failure | ||||||
|  | @ -26,9 +35,6 @@ that caused the merge failure with `git rebase --skip`.  To restore the | ||||||
| original <branch> and remove the .dotest working files, use the command | original <branch> and remove the .dotest working files, use the command | ||||||
| `git rebase --abort` instead. | `git rebase --abort` instead. | ||||||
|  |  | ||||||
| Note that if <branch> is not specified on the command line, the currently |  | ||||||
| checked out branch is used. |  | ||||||
|  |  | ||||||
| Assume the following history exists and the current branch is "topic": | Assume the following history exists and the current branch is "topic": | ||||||
|  |  | ||||||
| ------------ | ------------ | ||||||
|  | @ -142,7 +148,7 @@ file you edit, you need to tell git that the conflict has been resolved, | ||||||
| typically this would be done with | typically this would be done with | ||||||
|  |  | ||||||
|  |  | ||||||
|     git update-index <filename> |     git add <filename> | ||||||
|  |  | ||||||
|  |  | ||||||
| After resolving the conflict manually and updating the index with the | After resolving the conflict manually and updating the index with the | ||||||
|  |  | ||||||
|  | @ -163,8 +163,7 @@ If this three-way merge resolves cleanly, the result is written | ||||||
| out to your working tree file, so you would not have to manually | out to your working tree file, so you would not have to manually | ||||||
| resolve it.  Note that `git-rerere` leaves the index file alone, | resolve it.  Note that `git-rerere` leaves the index file alone, | ||||||
| so you still need to do the final sanity checks with `git diff` | so you still need to do the final sanity checks with `git diff` | ||||||
| (or `git diff -c`) and `git update-index` when you are | (or `git diff -c`) and `git add` when you are satisfied. | ||||||
| satisfied. |  | ||||||
|  |  | ||||||
| As a convenience measure, `git-merge` automatically invokes | As a convenience measure, `git-merge` automatically invokes | ||||||
| `git-rerere` when it exits with a failed automerge, which | `git-rerere` when it exits with a failed automerge, which | ||||||
|  |  | ||||||
|  | @ -94,11 +94,11 @@ current HEAD. | ||||||
| <2> Rewind the master branch to get rid of those three commits. | <2> Rewind the master branch to get rid of those three commits. | ||||||
| <3> Switch to "topic/wip" branch and keep working. | <3> Switch to "topic/wip" branch and keep working. | ||||||
|  |  | ||||||
| Undo update-index:: | Undo add:: | ||||||
| + | + | ||||||
| ------------ | ------------ | ||||||
| $ edit                                     <1> | $ edit                                     <1> | ||||||
| $ git-update-index frotz.c filfre.c | $ git add frotz.c filfre.c | ||||||
| $ mailx                                    <2> | $ mailx                                    <2> | ||||||
| $ git reset                                <3> | $ git reset                                <3> | ||||||
| $ git pull git://info.example.com/ nitfol  <4> | $ git pull git://info.example.com/ nitfol  <4> | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ DESCRIPTION | ||||||
| Examines paths in the working tree that has changes unrecorded | Examines paths in the working tree that has changes unrecorded | ||||||
| to the index file, and changes between the index file and the | to the index file, and changes between the index file and the | ||||||
| current HEAD commit.  The former paths are what you _could_ | current HEAD commit.  The former paths are what you _could_ | ||||||
| commit by running 'git-update-index' before running 'git | commit by running 'git add' (or 'git rm' if you are deleting) before running 'git | ||||||
| commit', and the latter paths are what you _would_ commit by | commit', and the latter paths are what you _would_ commit by | ||||||
| running 'git commit'. | running 'git commit'. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ DESCRIPTION | ||||||
| Examines paths in the working tree that has changes unrecorded | Examines paths in the working tree that has changes unrecorded | ||||||
| to the index file, and changes between the index file and the | to the index file, and changes between the index file and the | ||||||
| current HEAD commit.  The former paths are what you _could_ | current HEAD commit.  The former paths are what you _could_ | ||||||
| commit by running 'git-update-index' before running 'git | commit by running 'git add' before running 'git | ||||||
| commit', and the latter paths are what you _would_ commit by | commit', and the latter paths are what you _would_ commit by | ||||||
| running 'git commit'. | running 'git commit'. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -227,7 +227,7 @@ $ git diff | ||||||
| @@ -1 +1,2 @@ | @@ -1 +1,2 @@ | ||||||
|  hello world! |  hello world! | ||||||
| +hello world, again | +hello world, again | ||||||
| $ git update-index file.txt | $ git add file.txt | ||||||
| $ git diff | $ git diff | ||||||
| ------------------------------------------------ | ------------------------------------------------ | ||||||
|  |  | ||||||
|  | @ -260,7 +260,7 @@ hello world! | ||||||
| hello world, again | hello world, again | ||||||
| ------------------------------------------------ | ------------------------------------------------ | ||||||
|  |  | ||||||
| So what our "git update-index" did was store a new blob and then put | So what our "git add" did was store a new blob and then put | ||||||
| a reference to it in the index file.  If we modify the file again, | a reference to it in the index file.  If we modify the file again, | ||||||
| we'll see that the new modifications are reflected in the "git-diff" | we'll see that the new modifications are reflected in the "git-diff" | ||||||
| output: | output: | ||||||
|  |  | ||||||
|  | @ -1988,7 +1988,7 @@ static int check_patch(struct patch *patch, struct patch *prev_patch) | ||||||
| 			return error("%s: %s", old_name, strerror(errno)); | 			return error("%s: %s", old_name, strerror(errno)); | ||||||
|  |  | ||||||
| 		if (!cached) | 		if (!cached) | ||||||
| 			st_mode = ntohl(create_ce_mode(st.st_mode)); | 			st_mode = ntohl(ce_mode_from_stat(ce, st.st_mode)); | ||||||
|  |  | ||||||
| 		if (patch->is_new < 0) | 		if (patch->is_new < 0) | ||||||
| 			patch->is_new = 0; | 			patch->is_new = 0; | ||||||
|  |  | ||||||
|  | @ -2203,6 +2203,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) | ||||||
| 			if (!strcmp(argv[j], "--")) | 			if (!strcmp(argv[j], "--")) | ||||||
| 				seen_dashdash = j; | 				seen_dashdash = j; | ||||||
| 		if (seen_dashdash) { | 		if (seen_dashdash) { | ||||||
|  | 			/* (2) */ | ||||||
| 			if (seen_dashdash + 1 != argc - 1) | 			if (seen_dashdash + 1 != argc - 1) | ||||||
| 				usage(blame_usage); | 				usage(blame_usage); | ||||||
| 			path = add_prefix(prefix, argv[seen_dashdash + 1]); | 			path = add_prefix(prefix, argv[seen_dashdash + 1]); | ||||||
|  | @ -2211,6 +2212,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix) | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
| 			/* (3) */ | 			/* (3) */ | ||||||
|  | 			if (argc <= i) | ||||||
|  | 				usage(blame_usage); | ||||||
| 			path = add_prefix(prefix, argv[i]); | 			path = add_prefix(prefix, argv[i]); | ||||||
| 			if (i + 1 == argc - 1) { | 			if (i + 1 == argc - 1) { | ||||||
| 				final_commit_name = argv[i + 1]; | 				final_commit_name = argv[i + 1]; | ||||||
|  |  | ||||||
|  | @ -109,16 +109,17 @@ static int add_file_to_cache(const char *path) | ||||||
| 	ce->ce_flags = htons(namelen); | 	ce->ce_flags = htons(namelen); | ||||||
| 	fill_stat_cache_info(ce, &st); | 	fill_stat_cache_info(ce, &st); | ||||||
|  |  | ||||||
| 	ce->ce_mode = create_ce_mode(st.st_mode); | 	if (trust_executable_bit) | ||||||
| 	if (!trust_executable_bit) { | 		ce->ce_mode = create_ce_mode(st.st_mode); | ||||||
|  | 	else { | ||||||
| 		/* If there is an existing entry, pick the mode bits | 		/* If there is an existing entry, pick the mode bits | ||||||
| 		 * from it, otherwise assume unexecutable. | 		 * from it, otherwise assume unexecutable. | ||||||
| 		 */ | 		 */ | ||||||
|  | 		struct cache_entry *ent; | ||||||
| 		int pos = cache_name_pos(path, namelen); | 		int pos = cache_name_pos(path, namelen); | ||||||
| 		if (0 <= pos) |  | ||||||
| 			ce->ce_mode = active_cache[pos]->ce_mode; | 		ent = (0 <= pos) ? active_cache[pos] : NULL; | ||||||
| 		else if (S_ISREG(st.st_mode)) | 		ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); | ||||||
| 			ce->ce_mode = create_ce_mode(S_IFREG | 0666); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (index_path(ce->sha1, path, &st, !info_only)) | 	if (index_path(ce->sha1, path, &st, !info_only)) | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										10
									
								
								cache.h
								
								
								
								
							|  | @ -106,6 +106,16 @@ static inline unsigned int create_ce_mode(unsigned int mode) | ||||||
| 		return htonl(S_IFLNK); | 		return htonl(S_IFLNK); | ||||||
| 	return htonl(S_IFREG | ce_permissions(mode)); | 	return htonl(S_IFREG | ce_permissions(mode)); | ||||||
| } | } | ||||||
|  | static inline unsigned int ce_mode_from_stat(struct cache_entry *ce, unsigned int mode) | ||||||
|  | { | ||||||
|  | 	extern int trust_executable_bit; | ||||||
|  | 	if (!trust_executable_bit && S_ISREG(mode)) { | ||||||
|  | 		if (ce && S_ISREG(ntohl(ce->ce_mode))) | ||||||
|  | 			return ce->ce_mode; | ||||||
|  | 		return create_ce_mode(0666); | ||||||
|  | 	} | ||||||
|  | 	return create_ce_mode(mode); | ||||||
|  | } | ||||||
| #define canon_mode(mode) \ | #define canon_mode(mode) \ | ||||||
| 	(S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \ | 	(S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \ | ||||||
| 	S_ISLNK(mode) ? S_IFLNK : S_IFDIR) | 	S_ISLNK(mode) ? S_IFLNK : S_IFDIR) | ||||||
|  |  | ||||||
|  | @ -170,9 +170,7 @@ static int get_stat_data(struct cache_entry *ce, | ||||||
| 		} | 		} | ||||||
| 		changed = ce_match_stat(ce, &st, 0); | 		changed = ce_match_stat(ce, &st, 0); | ||||||
| 		if (changed) { | 		if (changed) { | ||||||
| 			mode = create_ce_mode(st.st_mode); | 			mode = ce_mode_from_stat(ce, st.st_mode); | ||||||
| 			if (!trust_executable_bit && S_ISREG(st.st_mode)) |  | ||||||
| 				mode = ce->ce_mode; |  | ||||||
| 			sha1 = no_sha1; | 			sha1 = no_sha1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								read-cache.c
								
								
								
								
							
							
						
						
									
										13
									
								
								read-cache.c
								
								
								
								
							|  | @ -344,16 +344,17 @@ int add_file_to_index(const char *path, int verbose) | ||||||
| 	ce->ce_flags = htons(namelen); | 	ce->ce_flags = htons(namelen); | ||||||
| 	fill_stat_cache_info(ce, &st); | 	fill_stat_cache_info(ce, &st); | ||||||
|  |  | ||||||
| 	ce->ce_mode = create_ce_mode(st.st_mode); | 	if (trust_executable_bit) | ||||||
| 	if (!trust_executable_bit) { | 		ce->ce_mode = create_ce_mode(st.st_mode); | ||||||
|  | 	else { | ||||||
| 		/* If there is an existing entry, pick the mode bits | 		/* If there is an existing entry, pick the mode bits | ||||||
| 		 * from it, otherwise assume unexecutable. | 		 * from it, otherwise assume unexecutable. | ||||||
| 		 */ | 		 */ | ||||||
|  | 		struct cache_entry *ent; | ||||||
| 		int pos = cache_name_pos(path, namelen); | 		int pos = cache_name_pos(path, namelen); | ||||||
| 		if (pos >= 0) |  | ||||||
| 			ce->ce_mode = active_cache[pos]->ce_mode; | 		ent = (0 <= pos) ? active_cache[pos] : NULL; | ||||||
| 		else if (S_ISREG(st.st_mode)) | 		ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); | ||||||
| 			ce->ce_mode = create_ce_mode(S_IFREG | 0666); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (index_path(ce->sha1, path, &st, 1)) | 	if (index_path(ce->sha1, path, &st, 1)) | ||||||
|  |  | ||||||
|  | @ -30,6 +30,16 @@ test_expect_success \ | ||||||
| 	 *) echo fail; git-ls-files --stage xfoo1; (exit 1);; | 	 *) echo fail; git-ls-files --stage xfoo1; (exit 1);; | ||||||
| 	 esac' | 	 esac' | ||||||
|  |  | ||||||
|  | test_expect_success 'git-add: filemode=0 should not get confused by symlink' ' | ||||||
|  | 	rm -f xfoo1 && | ||||||
|  | 	ln -s foo xfoo1 && | ||||||
|  | 	git-add xfoo1 && | ||||||
|  | 	case "`git-ls-files --stage xfoo1`" in | ||||||
|  | 	120000" "*xfoo1) echo ok;; | ||||||
|  | 	*) echo fail; git-ls-files --stage xfoo1; (exit 1);; | ||||||
|  | 	esac | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_expect_success \ | test_expect_success \ | ||||||
| 	'git-update-index --add: Test that executable bit is not used...' \ | 	'git-update-index --add: Test that executable bit is not used...' \ | ||||||
| 	'git config core.filemode 0 && | 	'git config core.filemode 0 && | ||||||
|  | @ -41,6 +51,16 @@ test_expect_success \ | ||||||
| 	 *) echo fail; git-ls-files --stage xfoo2; (exit 1);; | 	 *) echo fail; git-ls-files --stage xfoo2; (exit 1);; | ||||||
| 	 esac' | 	 esac' | ||||||
|  |  | ||||||
|  | test_expect_success 'git-add: filemode=0 should not get confused by symlink' ' | ||||||
|  | 	rm -f xfoo2 && | ||||||
|  | 	ln -s foo xfoo2 && | ||||||
|  | 	git update-index --add xfoo2 && | ||||||
|  | 	case "`git-ls-files --stage xfoo2`" in | ||||||
|  | 	120000" "*xfoo2) echo ok;; | ||||||
|  | 	*) echo fail; git-ls-files --stage xfoo2; (exit 1);; | ||||||
|  | 	esac | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_expect_success \ | test_expect_success \ | ||||||
| 	'git-update-index --add: Test that executable bit is not used...' \ | 	'git-update-index --add: Test that executable bit is not used...' \ | ||||||
| 	'git config core.filemode 0 && | 	'git config core.filemode 0 && | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano