diff --git a/Documentation/RelNotes-1.5.0.1.txt b/Documentation/RelNotes-1.5.0.1.txt index 982282a899..5dff2a212d 100644 --- a/Documentation/RelNotes-1.5.0.1.txt +++ b/Documentation/RelNotes-1.5.0.1.txt @@ -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 diff --git a/Documentation/core-intro.txt b/Documentation/core-intro.txt index 24b060b91e..eea44d9d56 100644 --- a/Documentation/core-intro.txt +++ b/Documentation/core-intro.txt @@ -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 ~~~~~~~~~~~ diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index e4ffde4fdd..1ae77be450 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -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). :: 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 ------------ diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index e53ff4b4e7..9c08efa53a 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -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. diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index f2ef1f7dc0..2f417a8f85 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -13,11 +13,20 @@ SYNOPSIS DESCRIPTION ----------- -git-rebase replaces with a new branch of the same name. When -the --onto option is provided the new branch starts out with a HEAD equal -to , otherwise it is equal to . It then attempts to -create a new commit for each commit from the original that does -not exist in the branch. +If is specified, git-rebase will perform an automatic +`git checkout ` 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 are saved to a temporary area. This is the same set +of commits that would be shown by `git log ..HEAD`. + +The current branch is reset to , or if the +--onto option was supplied. This has the exact same effect as +`git reset --hard ` (or ). + +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 and remove the .dotest working files, use the command `git rebase --abort` instead. -Note that if 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 + git add After resolving the conflict manually and updating the index with the diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt index 139b6eb773..7ff9b05e68 100644 --- a/Documentation/git-rerere.txt +++ b/Documentation/git-rerere.txt @@ -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 diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 04475a9216..5b55cda512 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -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> diff --git a/Documentation/git-runstatus.txt b/Documentation/git-runstatus.txt index 89d7b92731..8bb52f4687 100644 --- a/Documentation/git-runstatus.txt +++ b/Documentation/git-runstatus.txt @@ -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'. diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 03871e5d73..e9e193f008 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -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'. diff --git a/Documentation/tutorial-2.txt b/Documentation/tutorial-2.txt index 8d89992712..af8d43bd12 100644 --- a/Documentation/tutorial-2.txt +++ b/Documentation/tutorial-2.txt @@ -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: diff --git a/builtin-apply.c b/builtin-apply.c index 3fefdacd94..abe3538715 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -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; diff --git a/builtin-blame.c b/builtin-blame.c index 7a5665f093..5669a169ff 100644 --- a/builtin-blame.c +++ b/builtin-blame.c @@ -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]; diff --git a/builtin-update-index.c b/builtin-update-index.c index 1ac613a788..772aaba7bb 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -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)) diff --git a/cache.h b/cache.h index c62b0b090d..04f8e63baf 100644 --- a/cache.h +++ b/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) diff --git a/diff-lib.c b/diff-lib.c index 91cd87742f..556d5345bf 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -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; } } diff --git a/read-cache.c b/read-cache.c index c54a611877..605b352396 100644 --- a/read-cache.c +++ b/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)) diff --git a/t/t3700-add.sh b/t/t3700-add.sh index caaab26c2f..08e035220c 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -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 &&