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 | ||||
|  | ||||
|   - Clarifications and corrections to 1.5.0 release notes. | ||||
|  | ||||
|   - 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 | ||||
|  | ||||
|   - git-daemon marks the listening sockets with FD_CLOEXEC so | ||||
|     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` | ||||
| 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. | ||||
|  | ||||
| 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 | ||||
| ~~~~~~~~~~~ | ||||
|  |  | |||
|  | @ -61,7 +61,8 @@ OPTIONS | |||
| + | ||||
| When a merge conflict happens, the index entries for conflicting | ||||
| 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>:: | ||||
| 	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 | ||||
| the previous example, as well as the changes in the conflicted | ||||
| files.  Edit and resolve the conflict and mark it resolved with | ||||
| `git update-index` as usual: | ||||
| `git add` as usual: | ||||
| + | ||||
| ------------ | ||||
| $ 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 | ||||
|    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 | ||||
|    should be, and run `git-commit` to commit the result. | ||||
|  | ||||
|  |  | |||
|  | @ -13,11 +13,20 @@ SYNOPSIS | |||
|  | ||||
| DESCRIPTION | ||||
| ----------- | ||||
| git-rebase replaces <branch> with a new branch of the same name.  When | ||||
| the --onto option is provided the new branch starts out with a HEAD equal | ||||
| to <newbase>, otherwise it is equal to <upstream>.  It then attempts to | ||||
| create a new commit for each commit from the original <branch> that does | ||||
| not exist in the <upstream> branch. | ||||
| If <branch> is specified, git-rebase will perform an automatic | ||||
| `git checkout <branch>` before doing anything else.  Otherwise | ||||
| it remains on the current 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 | ||||
| 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 | ||||
| `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": | ||||
|  | ||||
| ------------ | ||||
|  | @ -142,7 +148,7 @@ file you edit, you need to tell git that the conflict has been resolved, | |||
| typically this would be done with | ||||
|  | ||||
|  | ||||
|     git update-index <filename> | ||||
|     git add <filename> | ||||
|  | ||||
|  | ||||
| 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 | ||||
| resolve it.  Note that `git-rerere` leaves the index file alone, | ||||
| so you still need to do the final sanity checks with `git diff` | ||||
| (or `git diff -c`) and `git update-index` when you are | ||||
| satisfied. | ||||
| (or `git diff -c`) and `git add` when you are satisfied. | ||||
|  | ||||
| As a convenience measure, `git-merge` automatically invokes | ||||
| `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. | ||||
| <3> Switch to "topic/wip" branch and keep working. | ||||
|  | ||||
| Undo update-index:: | ||||
| Undo add:: | ||||
| + | ||||
| ------------ | ||||
| $ edit                                     <1> | ||||
| $ git-update-index frotz.c filfre.c | ||||
| $ git add frotz.c filfre.c | ||||
| $ mailx                                    <2> | ||||
| $ git reset                                <3> | ||||
| $ git pull git://info.example.com/ nitfol  <4> | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ DESCRIPTION | |||
| Examines paths in the working tree that has changes unrecorded | ||||
| to the index file, and changes between the index file and the | ||||
| 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 | ||||
| running 'git commit'. | ||||
|  | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ DESCRIPTION | |||
| Examines paths in the working tree that has changes unrecorded | ||||
| to the index file, and changes between the index file and the | ||||
| 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 | ||||
| running 'git commit'. | ||||
|  | ||||
|  |  | |||
|  | @ -227,7 +227,7 @@ $ git diff | |||
| @@ -1 +1,2 @@ | ||||
|  hello world! | ||||
| +hello world, again | ||||
| $ git update-index file.txt | ||||
| $ git add file.txt | ||||
| $ git diff | ||||
| ------------------------------------------------ | ||||
|  | ||||
|  | @ -260,7 +260,7 @@ hello world! | |||
| 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, | ||||
| we'll see that the new modifications are reflected in the "git-diff" | ||||
| output: | ||||
|  |  | |||
|  | @ -1988,7 +1988,7 @@ static int check_patch(struct patch *patch, struct patch *prev_patch) | |||
| 			return error("%s: %s", old_name, strerror(errno)); | ||||
|  | ||||
| 		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) | ||||
| 			patch->is_new = 0; | ||||
|  |  | |||
|  | @ -2203,6 +2203,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) | |||
| 			if (!strcmp(argv[j], "--")) | ||||
| 				seen_dashdash = j; | ||||
| 		if (seen_dashdash) { | ||||
| 			/* (2) */ | ||||
| 			if (seen_dashdash + 1 != argc - 1) | ||||
| 				usage(blame_usage); | ||||
| 			path = add_prefix(prefix, argv[seen_dashdash + 1]); | ||||
|  | @ -2211,6 +2212,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix) | |||
| 		} | ||||
| 		else { | ||||
| 			/* (3) */ | ||||
| 			if (argc <= i) | ||||
| 				usage(blame_usage); | ||||
| 			path = add_prefix(prefix, argv[i]); | ||||
| 			if (i + 1 == argc - 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); | ||||
| 	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 | ||||
| 		 * from it, otherwise assume unexecutable. | ||||
| 		 */ | ||||
| 		struct cache_entry *ent; | ||||
| 		int pos = cache_name_pos(path, namelen); | ||||
| 		if (0 <= pos) | ||||
| 			ce->ce_mode = active_cache[pos]->ce_mode; | ||||
| 		else if (S_ISREG(st.st_mode)) | ||||
| 			ce->ce_mode = create_ce_mode(S_IFREG | 0666); | ||||
|  | ||||
| 		ent = (0 <= pos) ? active_cache[pos] : NULL; | ||||
| 		ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); | ||||
| 	} | ||||
|  | ||||
| 	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_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) \ | ||||
| 	(S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \ | ||||
| 	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); | ||||
| 		if (changed) { | ||||
| 			mode = create_ce_mode(st.st_mode); | ||||
| 			if (!trust_executable_bit && S_ISREG(st.st_mode)) | ||||
| 				mode = ce->ce_mode; | ||||
| 			mode = ce_mode_from_stat(ce, st.st_mode); | ||||
| 			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); | ||||
| 	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 | ||||
| 		 * from it, otherwise assume unexecutable. | ||||
| 		 */ | ||||
| 		struct cache_entry *ent; | ||||
| 		int pos = cache_name_pos(path, namelen); | ||||
| 		if (pos >= 0) | ||||
| 			ce->ce_mode = active_cache[pos]->ce_mode; | ||||
| 		else if (S_ISREG(st.st_mode)) | ||||
| 			ce->ce_mode = create_ce_mode(S_IFREG | 0666); | ||||
|  | ||||
| 		ent = (0 <= pos) ? active_cache[pos] : NULL; | ||||
| 		ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); | ||||
| 	} | ||||
|  | ||||
| 	if (index_path(ce->sha1, path, &st, 1)) | ||||
|  |  | |||
|  | @ -30,6 +30,16 @@ test_expect_success \ | |||
| 	 *) echo fail; git-ls-files --stage xfoo1; (exit 1);; | ||||
| 	 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 \ | ||||
| 	'git-update-index --add: Test that executable bit is not used...' \ | ||||
| 	'git config core.filemode 0 && | ||||
|  | @ -41,6 +51,16 @@ test_expect_success \ | |||
| 	 *) echo fail; git-ls-files --stage xfoo2; (exit 1);; | ||||
| 	 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 \ | ||||
| 	'git-update-index --add: Test that executable bit is not used...' \ | ||||
| 	'git config core.filemode 0 && | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano