From 098082fb78768dc3cbe659048c9f47cabdd7e39b Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Tue, 14 Apr 2009 15:15:42 +0200 Subject: [PATCH 01/64] Update docs on behaviour of 'core.sharedRepository' and 'git init --shared' This documentation update is needed to reflect the recent changes where "core.sharedRepository = 0mode" was changed to set, not loosen, the repository permissions. Signed-off-by: Johan Herland Signed-off-by: Junio C Hamano --- Documentation/config.txt | 6 ++++-- Documentation/git-init.txt | 16 +++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index f5152c5038..6af58ff3aa 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -290,8 +290,10 @@ core.sharedRepository:: group-shareable. When 'umask' (or 'false'), git will use permissions reported by umask(2). When '0xxx', where '0xxx' is an octal number, files in the repository will have this mode value. '0xxx' will override - user's umask value, and thus, users with a safe umask (0077) can use - this option. Examples: '0660' is equivalent to 'group'. '0640' is a + user's umask value (whereas the other options will only override + requested parts of the user's umask value). Examples: '0660' will make + the repo read/write-able for the owner and group, but inaccessible to + others (equivalent to 'group' unless umask is e.g. '0022'). '0640' is a repository that is group-readable but not group-writable. See linkgit:git-init[1]. False by default. diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt index 71749c09d3..7151d12f34 100644 --- a/Documentation/git-init.txt +++ b/Documentation/git-init.txt @@ -54,15 +54,21 @@ is given: - 'group' (or 'true'): Make the repository group-writable, (and g+sx, since the git group may be not the primary group of all users). + This is used to loosen the permissions of an otherwise safe umask(2) value. + Note that the umask still applies to the other permission bits (e.g. if + umask is '0022', using 'group' will not remove read privileges from other + (non-group) users). See '0xxx' for how to exactly specify the repository + permissions. - 'all' (or 'world' or 'everybody'): Same as 'group', but make the repository readable by all users. - - '0xxx': '0xxx' is an octal number and each file will have mode '0xxx' - Any option except 'umask' can be set using this option. '0xxx' will - override users umask(2) value, and thus, users with a safe umask (0077) - can use this option. '0640' will create a repository which is group-readable - but not writable. '0660' is equivalent to 'group'. + - '0xxx': '0xxx' is an octal number and each file will have mode '0xxx'. + '0xxx' will override users' umask(2) value (and not only loosen permissions + as 'group' and 'all' does). '0640' will create a repository which is + group-readable, but not group-writable or accessible to others. '0660' will + create a repo that is readable and writable to the current user and group, + but inaccessible to others. By default, the configuration flag receive.denyNonFastForwards is enabled in shared repositories, so that you cannot force a non fast-forwarding push From ea10b60c910e4a23483f47f17becc5e58f07ebe9 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Sat, 18 Apr 2009 20:42:07 -0700 Subject: [PATCH 02/64] Work around ash "alternate value" expansion bug Ash (used as /bin/sh on many distros) has a shell expansion bug for the form ${var:+word word}. The result is a single argument "word word". Work around by using ${var:+word} ${var:+word} or equivalent. Signed-off-by: Ben Jackson Signed-off-by: Junio C Hamano --- git-am.sh | 2 +- git-submodule.sh | 11 +++++++++-- t/t7400-submodule-basic.sh | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/git-am.sh b/git-am.sh index 774383fb68..6d1848b6cc 100755 --- a/git-am.sh +++ b/git-am.sh @@ -571,7 +571,7 @@ do GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" export GIT_COMMITTER_DATE fi && - git commit-tree $tree ${parent:+-p $parent} <"$dotest/final-commit" + git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit" ) && git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent || stop_here $this diff --git a/git-submodule.sh b/git-submodule.sh index 7c2e060ae7..8e234a4028 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -204,8 +204,15 @@ cmd_add() else module_clone "$path" "$realrepo" || exit - (unset GIT_DIR; cd "$path" && git checkout -f -q ${branch:+-b "$branch" "origin/$branch"}) || - die "Unable to checkout submodule '$path'" + ( + unset GIT_DIR + cd "$path" && + # ash fails to wordsplit ${branch:+-b "$branch"...} + case "$branch" in + '') git checkout -f -q ;; + ?*) git checkout -f -q -b "$branch" "origin/$branch" ;; + esac + ) || die "Unable to checkout submodule '$path'" fi git add "$path" || diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index af690ec6c1..0f2ccc6cf0 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -64,6 +64,16 @@ test_expect_success 'submodule add' ' ) ' +test_expect_success 'submodule add --branch' ' + ( + cd addtest && + git submodule add -b initial "$submodurl" submod-branch && + git submodule init && + cd submod-branch && + git branch | grep initial + ) +' + test_expect_success 'submodule add with ./ in path' ' ( cd addtest && From 1092f6b3f8bcdad89169952f2922e1bfb7b23d33 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 23 Mar 2009 12:53:06 +0000 Subject: [PATCH 03/64] test-suite: adding a test for fast-export with tag variants Signed-off-by: Erik Faye-Lund Signed-off-by: Junio C Hamano --- t/t9301-fast-export.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh index 86c376088c..2e31f67465 100755 --- a/t/t9301-fast-export.sh +++ b/t/t9301-fast-export.sh @@ -259,4 +259,20 @@ test_expect_success 'cope with tagger-less tags' ' ' +test_expect_success 'set-up a few more tags for tag export tests' ' + git checkout -f master && + HEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed "s/tree //"` && + git tag tree_tag -m "tagging a tree" $HEAD_TREE && + git tag -a tree_tag-obj -m "tagging a tree" $HEAD_TREE && + git tag tag-obj_tag -m "tagging a tag" tree_tag-obj && + git tag -a tag-obj_tag-obj -m "tagging a tag" tree_tag-obj +' + +# NEEDSWORK: not just check return status, but validate the output +# two tests commented out due to crash and thus unreliable return code +test_expect_failure 'tree_tag' 'git fast-export tree_tag' +test_expect_failure 'tree_tag-obj' 'git fast-export tree_tag-obj' +test_expect_failure 'tag-obj_tag' 'git fast-export tag-obj_tag' +test_expect_failure 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj' + test_done From 38124d8f3120b8e189760376b0a93cad6f3c475a Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 23 Mar 2009 12:53:07 +0000 Subject: [PATCH 04/64] builtin-fast-export.c: turn error into warning fast-import doesn't have a syntax to support tree-objects (and some other object-types), so fast-export shouldn't handle them. However, aborting the operation is a bit drastic. This patch turns the error into a warning instead. Signed-off-by: Erik Faye-Lund Signed-off-by: Junio C Hamano --- builtin-fast-export.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/builtin-fast-export.c b/builtin-fast-export.c index fdf4ae9ebd..8a6cf5e649 100644 --- a/builtin-fast-export.c +++ b/builtin-fast-export.c @@ -378,8 +378,10 @@ static void get_tags_and_duplicates(struct object_array *pending, } break; default: - die ("Unexpected object of type %s", - typename(e->item->type)); + warning("%s: Unexpected object of type %s, skipping.", + e->name, + typename(e->item->type)); + continue; } if (commit->util) /* more than one name for the same object */ From 426193c025eb76125a99b3fe143eea50e849f9ca Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 23 Mar 2009 12:53:08 +0000 Subject: [PATCH 05/64] builtin-fast-export.c: fix crash on tagged trees If a tag object points to a tree (or another unhandled type), the commit- pointer is left uninitialized and later dereferenced. This patch adds a default case to the switch that issues a warning and skips the object. Signed-off-by: Erik Faye-Lund Signed-off-by: Junio C Hamano --- builtin-fast-export.c | 4 ++++ t/t9301-fast-export.sh | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/builtin-fast-export.c b/builtin-fast-export.c index 8a6cf5e649..1ec459f057 100644 --- a/builtin-fast-export.c +++ b/builtin-fast-export.c @@ -375,6 +375,10 @@ static void get_tags_and_duplicates(struct object_array *pending, case OBJ_BLOB: handle_object(tag->object.sha1); continue; + default: + warning("Tag points to object of unexpected type %s, skipping.", + typename(tag->object.type)); + continue; } break; default: diff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh index 2e31f67465..b1f75ceea4 100755 --- a/t/t9301-fast-export.sh +++ b/t/t9301-fast-export.sh @@ -269,9 +269,8 @@ test_expect_success 'set-up a few more tags for tag export tests' ' ' # NEEDSWORK: not just check return status, but validate the output -# two tests commented out due to crash and thus unreliable return code -test_expect_failure 'tree_tag' 'git fast-export tree_tag' -test_expect_failure 'tree_tag-obj' 'git fast-export tree_tag-obj' +test_expect_success 'tree_tag' 'git fast-export tree_tag' +test_expect_success 'tree_tag-obj' 'git fast-export tree_tag-obj' test_expect_failure 'tag-obj_tag' 'git fast-export tag-obj_tag' test_expect_failure 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj' From aadd44404baab7b1f7234c8815bfd1e6c980cd99 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 23 Mar 2009 12:53:09 +0000 Subject: [PATCH 06/64] builtin-fast-export.c: handle nested tags When tags that points to tags are passed to fast-export, an error is given, saying "Tag [TAGNAME] points nowhere?". This fix calls parse_object() on the object before referencing it's tag, to ensure the tag-info is fully initialized. In addition, it inserts a comment to point out where nested tags are handled. This is consistent with the comment for signed tags. Signed-off-by: Erik Faye-Lund Signed-off-by: Junio C Hamano --- builtin-fast-export.c | 5 ++++- t/t9301-fast-export.sh | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/builtin-fast-export.c b/builtin-fast-export.c index 1ec459f057..f171ee4a2b 100644 --- a/builtin-fast-export.c +++ b/builtin-fast-export.c @@ -362,7 +362,10 @@ static void get_tags_and_duplicates(struct object_array *pending, break; case OBJ_TAG: tag = (struct tag *)e->item; + + /* handle nested tags */ while (tag && tag->object.type == OBJ_TAG) { + parse_object(tag->object.sha1); string_list_append(full_name, extra_refs)->util = tag; tag = (struct tag *)tag->tagged; } @@ -375,7 +378,7 @@ static void get_tags_and_duplicates(struct object_array *pending, case OBJ_BLOB: handle_object(tag->object.sha1); continue; - default: + default: /* OBJ_TAG (nested tags) is already handled */ warning("Tag points to object of unexpected type %s, skipping.", typename(tag->object.type)); continue; diff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh index b1f75ceea4..4a87f36258 100755 --- a/t/t9301-fast-export.sh +++ b/t/t9301-fast-export.sh @@ -271,7 +271,7 @@ test_expect_success 'set-up a few more tags for tag export tests' ' # NEEDSWORK: not just check return status, but validate the output test_expect_success 'tree_tag' 'git fast-export tree_tag' test_expect_success 'tree_tag-obj' 'git fast-export tree_tag-obj' -test_expect_failure 'tag-obj_tag' 'git fast-export tag-obj_tag' -test_expect_failure 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj' +test_expect_success 'tag-obj_tag' 'git fast-export tag-obj_tag' +test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj' test_done From 9ffb15d52a33444652c136681c0b720547c43cbe Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 31 Mar 2009 09:45:22 -0700 Subject: [PATCH 07/64] Clean up reflog unreachability pruning decision This clarifies the pruning rules for unreachable commits by having a separate helpder function for the unreachability decision. It's preparation for actual bigger changes to come to speed up the decision when the reachability calculations become a bottleneck. Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- builtin-reflog.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/builtin-reflog.c b/builtin-reflog.c index d95f515f2e..a07960ff5e 100644 --- a/builtin-reflog.c +++ b/builtin-reflog.c @@ -209,6 +209,31 @@ static int keep_entry(struct commit **it, unsigned char *sha1) return 1; } +static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsigned char *sha1) +{ + /* + * We may or may not have the commit yet - if not, look it + * up using the supplied sha1. + */ + if (!commit) { + if (is_null_sha1(sha1)) + return 0; + + commit = lookup_commit_reference_gently(sha1, 1); + + /* Not a commit -- keep it */ + if (!commit) + return 0; + } + + /* Reachable from the current ref? Don't prune. */ + if (in_merge_bases(commit, &cb->ref_commit, 1)) + return 0; + + /* We can't reach it - prune it. */ + return 1; +} + static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, const char *email, unsigned long timestamp, int tz, const char *message, void *cb_data) @@ -230,12 +255,7 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, if (timestamp < cb->cmd->expire_unreachable) { if (!cb->ref_commit) goto prune; - if (!old && !is_null_sha1(osha1)) - old = lookup_commit_reference_gently(osha1, 1); - if (!new && !is_null_sha1(nsha1)) - new = lookup_commit_reference_gently(nsha1, 1); - if ((old && !in_merge_bases(old, &cb->ref_commit, 1)) || - (new && !in_merge_bases(new, &cb->ref_commit, 1))) + if (unreachable(cb, old, osha1) || unreachable(cb, new, nsha1)) goto prune; } From 24cb1bb1984be60addeecaf0bf5d16cd9688e6a7 Mon Sep 17 00:00:00 2001 From: Junio Hamano Date: Mon, 30 Mar 2009 21:34:14 -0700 Subject: [PATCH 08/64] Speed up reflog pruning of unreachable commits Instead of doing the (potentially very expensive) "in_merge_base()" check for each commit that might be pruned if it is unreachable, do a preparatory reachability graph of the commit space, so that the common case of being reachable can be tested directly. [ Cleaned up a bit and tweaked to actually work. - Linus ] Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- builtin-reflog.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/builtin-reflog.c b/builtin-reflog.c index a07960ff5e..249ad2a311 100644 --- a/builtin-reflog.c +++ b/builtin-reflog.c @@ -52,6 +52,7 @@ struct collect_reflog_cb { #define INCOMPLETE (1u<<10) #define STUDYING (1u<<11) +#define REACHABLE (1u<<12) static int tree_is_complete(const unsigned char *sha1) { @@ -227,6 +228,8 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig } /* Reachable from the current ref? Don't prune. */ + if (commit->object.flags & REACHABLE) + return 0; if (in_merge_bases(commit, &cb->ref_commit, 1)) return 0; @@ -234,6 +237,43 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig return 1; } +static void mark_reachable(struct commit *commit, unsigned long expire_limit) +{ + /* + * We need to compute if commit on either side of an reflog + * entry is reachable from the tip of the ref for all entries. + * Mark commits that are reachable from the tip down to the + * time threashold first; we know a commit marked thusly is + * reachable from the tip without running in_merge_bases() + * at all. + */ + struct commit_list *pending = NULL; + + commit_list_insert(commit, &pending); + while (pending) { + struct commit_list *entry = pending; + struct commit_list *parent; + pending = entry->next; + commit = entry->item; + free(entry); + if (commit->object.flags & REACHABLE) + continue; + if (parse_commit(commit)) + continue; + commit->object.flags |= REACHABLE; + if (commit->date < expire_limit) + continue; + parent = commit->parents; + while (parent) { + commit = parent->item; + parent = parent->next; + if (commit->object.flags & REACHABLE) + continue; + commit_list_insert(commit, &pending); + } + } +} + static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, const char *email, unsigned long timestamp, int tz, const char *message, void *cb_data) @@ -308,7 +348,11 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused, cb.ref_commit = lookup_commit_reference_gently(sha1, 1); cb.ref = ref; cb.cmd = cmd; + if (cb.ref_commit) + mark_reachable(cb.ref_commit, cmd->expire_total); for_each_reflog_ent(ref, expire_reflog_ent, &cb); + if (cb.ref_commit) + clear_commit_marks(cb.ref_commit, REACHABLE); finish: if (cb.newlog) { if (fclose(cb.newlog)) { From cbd3a01ed803778b2377e0148448f7e617bc381a Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Fri, 10 Apr 2009 16:57:01 +0200 Subject: [PATCH 09/64] git add -p: new "quit" command at the prompt. There's already 'd' to stop staging hunks in a file, but no explicit command to stop the interactive staging (for the current files and the remaining ones). Of course you can do 'd' and then ^C, but it would be more intuitive to allow 'quit' action. Signed-off-by: Junio C Hamano --- Documentation/git-add.txt | 1 + git-add--interactive.perl | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index ce71838b9e..709e04b335 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -245,6 +245,7 @@ patch:: y - stage this hunk n - do not stage this hunk + q - quite, do not stage this hunk nor any of the remaining ones a - stage this and all the remaining hunks in the file d - do not stage this hunk nor any of the remaining hunks in the file j - leave this hunk undecided, see next undecided hunk diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 064d4c68d0..4fbd033215 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -890,6 +890,7 @@ sub help_patch_cmd { print colored $help_color, <<\EOF ; y - stage this hunk n - do not stage this hunk +q - quit, do not stage this hunk nor any of the remaining ones a - stage this and all the remaining hunks in the file d - do not stage this hunk nor any of the remaining hunks in the file g - select a hunk to go to @@ -926,7 +927,7 @@ sub patch_update_cmd { @mods); } for (@them) { - patch_update_file($_->{VALUE}); + return 0 if patch_update_file($_->{VALUE}); } } @@ -972,6 +973,7 @@ sub display_hunks { } sub patch_update_file { + my $quit = 0; my ($ix, $num); my $path = shift; my ($head, @hunk) = parse_diff($path); @@ -1002,6 +1004,11 @@ sub patch_update_file { $_->{USE} = 0 foreach ($mode, @hunk); last; } + elsif ($line =~ /^q/i) { + $_->{USE} = 0 foreach ($mode, @hunk); + $quit = 1; + last; + } else { help_patch_cmd(''); next; @@ -1109,6 +1116,16 @@ sub patch_update_file { } next; } + elsif ($line =~ /^q/i) { + while ($ix < $num) { + if (!defined $hunk[$ix]{USE}) { + $hunk[$ix]{USE} = 0; + } + $ix++; + } + $quit = 1; + next; + } elsif ($line =~ m|^/(.*)|) { my $regex = $1; if ($1 eq "") { @@ -1235,6 +1252,7 @@ sub patch_update_file { } print "\n"; + return $quit; } sub diff_cmd { From 7535e5a16aa7167074ac74ee1342814767a83a82 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 16 Apr 2009 03:14:15 -0400 Subject: [PATCH 10/64] add-interactive: refactor mode hunk handling The original implementation considered the mode separately from the rest of the hunks, asking about it outside the main hunk-selection loop. This patch instead places a mode change as the first hunk in the loop. This has two advantages: 1. less duplicated code (since we use the main selection loop). This also cleans up an inconsistency, which is that the main selection loop separates options with a comma, whereas the mode prompt used slashes. 2. users can now skip the mode change and come back to it, search for it (via "/mode"), etc, as they can with other hunks. To facilitate this, each hunk is now marked with a "type". Mode hunks are not considered for splitting (which would make no sense, and also confuses the split_hunk function), nor are they editable. In theory, one could edit the mode lines and change to a new mode. In practice, there are only two modes that git cares about (0644 and 0755), so either you want to move from one to the other or not (and you can do that by staging or not staging). Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- git-add--interactive.perl | 64 +++++++++++++-------------------------- 1 file changed, 21 insertions(+), 43 deletions(-) diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 4fbd033215..566e3710f5 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -620,11 +620,12 @@ sub parse_diff { if ($diff_use_color) { @colored = run_cmd_pipe(qw(git diff-files -p --color --), $path); } - my (@hunk) = { TEXT => [], DISPLAY => [] }; + my (@hunk) = { TEXT => [], DISPLAY => [], TYPE => 'header' }; for (my $i = 0; $i < @diff; $i++) { if ($diff[$i] =~ /^@@ /) { - push @hunk, { TEXT => [], DISPLAY => [] }; + push @hunk, { TEXT => [], DISPLAY => [], + TYPE => 'hunk' }; } push @{$hunk[-1]{TEXT}}, $diff[$i]; push @{$hunk[-1]{DISPLAY}}, @@ -636,8 +637,8 @@ sub parse_diff { sub parse_diff_header { my $src = shift; - my $head = { TEXT => [], DISPLAY => [] }; - my $mode = { TEXT => [], DISPLAY => [] }; + my $head = { TEXT => [], DISPLAY => [], TYPE => 'header' }; + my $mode = { TEXT => [], DISPLAY => [], TYPE => 'mode' }; for (my $i = 0; $i < @{$src->{TEXT}}; $i++) { my $dest = $src->{TEXT}->[$i] =~ /^(old|new) mode (\d+)$/ ? @@ -684,6 +685,7 @@ sub split_hunk { my $this = +{ TEXT => [], DISPLAY => [], + TYPE => 'hunk', OLD => $o_ofs, NEW => $n_ofs, OCNT => 0, @@ -869,7 +871,11 @@ sub edit_hunk_loop { if (!defined $text) { return undef; } - my $newhunk = { TEXT => $text, USE => 1 }; + my $newhunk = { + TEXT => $text, + TYPE => $hunk->[$ix]->{TYPE}, + USE => 1 + }; if (diff_applies($head, @{$hunk}[0..$ix-1], $newhunk, @@ -983,37 +989,7 @@ sub patch_update_file { } if (@{$mode->{TEXT}}) { - while (1) { - print @{$mode->{DISPLAY}}; - print colored $prompt_color, - "Stage mode change [y/n/a/d/?]? "; - my $line = prompt_single_character; - if ($line =~ /^y/i) { - $mode->{USE} = 1; - last; - } - elsif ($line =~ /^n/i) { - $mode->{USE} = 0; - last; - } - elsif ($line =~ /^a/i) { - $_->{USE} = 1 foreach ($mode, @hunk); - last; - } - elsif ($line =~ /^d/i) { - $_->{USE} = 0 foreach ($mode, @hunk); - last; - } - elsif ($line =~ /^q/i) { - $_->{USE} = 0 foreach ($mode, @hunk); - $quit = 1; - last; - } - else { - help_patch_cmd(''); - next; - } - } + unshift @hunk, $mode; } $num = scalar @hunk; @@ -1057,14 +1033,19 @@ sub patch_update_file { } last if (!$undecided); - if (hunk_splittable($hunk[$ix]{TEXT})) { + if ($hunk[$ix]{TYPE} eq 'hunk' && + hunk_splittable($hunk[$ix]{TEXT})) { $other .= ',s'; } - $other .= ',e'; + if ($hunk[$ix]{TYPE} eq 'hunk') { + $other .= ',e'; + } for (@{$hunk[$ix]{DISPLAY}}) { print; } - print colored $prompt_color, "Stage this hunk [y,n,a,d,/$other,?]? "; + print colored $prompt_color, 'Stage ', + ($hunk[$ix]{TYPE} eq 'mode' ? 'mode change' : 'this hunk'), + " [y,n,a,d,/$other,?]? "; my $line = prompt_single_character; if ($line) { if ($line =~ /^y/i) { @@ -1206,7 +1187,7 @@ sub patch_update_file { $num = scalar @hunk; next; } - elsif ($line =~ /^e/) { + elsif ($other =~ /e/ && $line =~ /^e/) { my $newhunk = edit_hunk_loop($head, \@hunk, $ix); if (defined $newhunk) { splice @hunk, $ix, 1, $newhunk; @@ -1227,9 +1208,6 @@ sub patch_update_file { my $n_lofs = 0; my @result = (); - if ($mode->{USE}) { - push @result, @{$mode->{TEXT}}; - } for (@hunk) { if ($_->{USE}) { push @result, @{$_->{TEXT}}; From cafa56702bc3742a99c39d3b4d1770178720bcc4 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Thu, 16 Apr 2009 18:46:23 +0200 Subject: [PATCH 11/64] Update git-add.txt according to the new possibilities of 'git add -p'. The text is merely cut-and-pasted from git-add--interactive.perl. The cut-and-paste also fixes a typo. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- Documentation/git-add.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 709e04b335..d938b42289 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -245,9 +245,11 @@ patch:: y - stage this hunk n - do not stage this hunk - q - quite, do not stage this hunk nor any of the remaining ones + q - quit, do not stage this hunk nor any of the remaining ones a - stage this and all the remaining hunks in the file d - do not stage this hunk nor any of the remaining hunks in the file + g - select a hunk to go to + / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk From 318b84703135951b69b6d9e58b6fda0790405424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Mon, 20 Apr 2009 10:17:25 +1000 Subject: [PATCH 12/64] Makefile: remove {fetch,send}-pack from PROGRAMS as they are builtins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Makefile b/Makefile index 0675c43e73..a23e270139 100644 --- a/Makefile +++ b/Makefile @@ -296,7 +296,6 @@ EXTRA_PROGRAMS = # ... and all the rest that could be moved out of bindir to gitexecdir PROGRAMS += $(EXTRA_PROGRAMS) PROGRAMS += git-fast-import$X -PROGRAMS += git-fetch-pack$X PROGRAMS += git-hash-object$X PROGRAMS += git-index-pack$X PROGRAMS += git-merge-index$X @@ -305,7 +304,6 @@ PROGRAMS += git-mktag$X PROGRAMS += git-mktree$X PROGRAMS += git-pack-redundant$X PROGRAMS += git-patch-id$X -PROGRAMS += git-send-pack$X PROGRAMS += git-shell$X PROGRAMS += git-show-index$X PROGRAMS += git-unpack-file$X From 1f9b620fdbf27835f54b11008d64c4014b8f4c32 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 19 Apr 2009 17:34:26 -0700 Subject: [PATCH 13/64] GIT 1.6.2.4 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.2.4.txt | 10 +++++++++- GIT-VERSION-GEN | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/RelNotes-1.6.2.4.txt b/Documentation/RelNotes-1.6.2.4.txt index 21bf4f3a3d..f4bf1d0986 100644 --- a/Documentation/RelNotes-1.6.2.4.txt +++ b/Documentation/RelNotes-1.6.2.4.txt @@ -7,9 +7,17 @@ Fixes since v1.6.2.3 * The configuration parser had a buffer overflow while parsing an overlong value. +* pruning reflog entries that are unreachable from the tip of the ref + during "git reflog prune" (hence "git gc") was very inefficient. + +* "git-add -p" lacked a way to say "q"uit to refuse staging any hunks for + the remaining paths. You had to say "d" and then ^C. + * "git-checkout " did not update the index entry at the named path; it now does. +* "git-fast-export" choked when seeing a tag that does not point at commit. + * "git init" segfaulted when given an overlong template location via the --template= option. @@ -27,5 +35,5 @@ Many small documentation updates are included as well. --- exec >/var/tmp/1 echo O=$(git describe maint) -O=v1.6.2.3-21-ga51609a +O=v1.6.2.3-38-g318b847 git shortlog --no-merges $O..maint diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 04713fc7c9..c92670bf4c 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.6.2.3 +DEF_VER=v1.6.2.4 LF=' ' From a2fc8d65368a23a8a5f708b36c761c2d0d133ea6 Mon Sep 17 00:00:00 2001 From: Wincent Colaiuta Date: Mon, 20 Apr 2009 11:42:52 +0200 Subject: [PATCH 14/64] git add -p: add missing "q" to patch prompt Commit cbd3a01 added a new "q" subcommand to the "git add -p" command loop, but forgot to add it to the prompt. Signed-off-by: Wincent Colaiuta Signed-off-by: Junio C Hamano --- git-add--interactive.perl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 566e3710f5..5407b2e1b8 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -1045,7 +1045,7 @@ sub patch_update_file { } print colored $prompt_color, 'Stage ', ($hunk[$ix]{TYPE} eq 'mode' ? 'mode change' : 'this hunk'), - " [y,n,a,d,/$other,?]? "; + " [y,n,q,a,d,/$other,?]? "; my $line = prompt_single_character; if ($line) { if ($line =~ /^y/i) { From ccb4b5391382f4cdb5e5be49036e82e7d837b7af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Wei=C3=9F?= Date: Tue, 31 Mar 2009 18:16:36 +0200 Subject: [PATCH 15/64] gitweb: Fix snapshots requested via PATH_INFO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the detection of the requested snapshot format, which failed for PATH_INFO URLs since the references to the hashes which describe the supported snapshot formats weren't dereferenced appropriately. Signed-off-by: Holger Weiß Acked-by: Jakub Narebski Signed-off-by: Junio C Hamano --- gitweb/gitweb.perl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 33ef190ceb..3f99361ed0 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -688,10 +688,10 @@ sub evaluate_path_info { # extensions. Allowed extensions are both the defined suffix # (which includes the initial dot already) and the snapshot # format key itself, with a prepended dot - while (my ($fmt, %opt) = each %known_snapshot_formats) { + while (my ($fmt, $opt) = each %known_snapshot_formats) { my $hash = $refname; my $sfx; - $hash =~ s/(\Q$opt{'suffix'}\E|\Q.$fmt\E)$//; + $hash =~ s/(\Q$opt->{'suffix'}\E|\Q.$fmt\E)$//; next unless $sfx = $1; # a valid suffix was found, so set the snapshot format # and reset the hash parameter From 6ac6f87818edfd33fea8ce3c95b47fe00a4e4b91 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Fri, 3 Apr 2009 08:49:59 +0200 Subject: [PATCH 16/64] Windows: Work around intermittent failures in mingw_rename We have replaced rename() with a version that can rename a file to a destination that already exists. Nevertheless, many users, the author included, observe failures in the code that are not reproducible. The theory is that the failures are due to some other process that happens to have opened the destination file briefly at the wrong moment. (And there is no way on Windows to delete or replace a file that is currently open.) The most likely candidate for such a process is a virus scanner. The failure is more often observed while there is heavy git activity (for example while the test suite is running or during a rebase operation). We work around the failure by retrying the rename operation if it failed due to ERROR_ACCESS_DENIED. The retries are delayed a bit: The first only by giving up the time slice, the next after the minimal scheduling granularity, and if more retries are needed, then we wait some non-trivial amount of time with exponential back-off. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- compat/mingw.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 2839d9df6e..1a17cf6cce 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -934,7 +934,9 @@ int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz) #undef rename int mingw_rename(const char *pold, const char *pnew) { - DWORD attrs; + DWORD attrs, gle; + int tries = 0; + static const int delay[] = { 0, 1, 10, 20, 40 }; /* * Try native rename() first to get errno right. @@ -944,10 +946,12 @@ int mingw_rename(const char *pold, const char *pnew) return 0; if (errno != EEXIST) return -1; +repeat: if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* TODO: translate more errors */ - if (GetLastError() == ERROR_ACCESS_DENIED && + gle = GetLastError(); + if (gle == ERROR_ACCESS_DENIED && (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { errno = EISDIR; @@ -957,10 +961,23 @@ int mingw_rename(const char *pold, const char *pnew) SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) { if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; + gle = GetLastError(); /* revert file attributes on failure */ SetFileAttributes(pnew, attrs); } } + if (tries < ARRAY_SIZE(delay) && gle == ERROR_ACCESS_DENIED) { + /* + * We assume that some other process had the source or + * destination file open at the wrong moment and retry. + * In order to give the other process a higher chance to + * complete its operation, we give up our time slice now. + * If we have to retry again, we do sleep a bit. + */ + Sleep(delay[tries]); + tries++; + goto repeat; + } errno = EACCES; return -1; } From 8cc21ce78c2f3781024117047c0650861f890213 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 20 Apr 2009 03:58:17 -0700 Subject: [PATCH 17/64] read-tree A B: do not corrupt cache-tree An earlier commit aab3b9a (read-tree A B C: do not create a bogus index and do not segfault, 2009-03-12) resurrected the support for an obscure (but useful) feature to read and overlay more than one tree into the index without the -m (merge) option. But the fix was not enough. Exercising this feature exposes a longstanding bug in the code that primes the cache-tree in the index from the tree that was read. The intention was that when we know that the index must exactly match the tree we just read, we prime the entire cache-tree with it. However, the logic to detect that case incorrectly triggered if you read two trees without -m. This resulted in a corrupted cache-tree, and write-tree would have produced an incorrect tree object out of such an index. Signed-off-by: Junio C Hamano --- builtin-read-tree.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 38fef34d3f..e4e0e710c8 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -211,7 +211,6 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) case 3: default: opts.fn = threeway_merge; - cache_tree_free(&active_cache_tree); break; } @@ -221,6 +220,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) opts.head_idx = 1; } + cache_tree_free(&active_cache_tree); for (i = 0; i < nr_trees; i++) { struct tree *tree = trees[i]; parse_tree(tree); @@ -235,10 +235,8 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) * valid cache-tree because the index must match exactly * what came from the tree. */ - if (nr_trees && !opts.prefix && (!opts.merge || (stage == 2))) { - cache_tree_free(&active_cache_tree); + if (nr_trees == 1 && !opts.prefix) prime_cache_tree(); - } if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(&lock_file)) From b9d37a5420446d0db2dc0dc5458a5e50656a4852 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 20 Apr 2009 03:58:18 -0700 Subject: [PATCH 18/64] Move prime_cache_tree() to cache-tree.c The interface to build cache-tree belongs there. Signed-off-by: Junio C Hamano --- builtin-checkout.c | 1 + builtin-read-tree.c | 37 +------------------------------------ cache-tree.c | 34 ++++++++++++++++++++++++++++++++++ cache-tree.h | 4 ++++ 4 files changed, 40 insertions(+), 36 deletions(-) diff --git a/builtin-checkout.c b/builtin-checkout.c index b121fe56de..ffdb33aef5 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -5,6 +5,7 @@ #include "commit.h" #include "tree.h" #include "tree-walk.h" +#include "cache-tree.h" #include "unpack-trees.h" #include "dir.h" #include "run-command.h" diff --git a/builtin-read-tree.c b/builtin-read-tree.c index e4e0e710c8..9cd7d0738e 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -29,41 +29,6 @@ static int list_tree(unsigned char *sha1) return 0; } -static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree) -{ - struct tree_desc desc; - struct name_entry entry; - int cnt; - - hashcpy(it->sha1, tree->object.sha1); - init_tree_desc(&desc, tree->buffer, tree->size); - cnt = 0; - while (tree_entry(&desc, &entry)) { - if (!S_ISDIR(entry.mode)) - cnt++; - else { - struct cache_tree_sub *sub; - struct tree *subtree = lookup_tree(entry.sha1); - if (!subtree->object.parsed) - parse_tree(subtree); - sub = cache_tree_sub(it, entry.path); - sub->cache_tree = cache_tree(); - prime_cache_tree_rec(sub->cache_tree, subtree); - cnt += sub->cache_tree->entry_count; - } - } - it->entry_count = cnt; -} - -static void prime_cache_tree(void) -{ - if (!nr_trees) - return; - active_cache_tree = cache_tree(); - prime_cache_tree_rec(active_cache_tree, trees[0]); - -} - static const char read_tree_usage[] = "git read-tree ( | [[-m [--trivial] [--aggressive] | --reset | --prefix=] [-u | -i]] [--exclude-per-directory=] [--index-output=] [ []])"; static struct lock_file lock_file; @@ -236,7 +201,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) * what came from the tree. */ if (nr_trees == 1 && !opts.prefix) - prime_cache_tree(); + prime_cache_tree(&active_cache_tree, trees[0]); if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(&lock_file)) diff --git a/cache-tree.c b/cache-tree.c index 3d8f218a5f..37bf35e636 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -1,5 +1,6 @@ #include "cache.h" #include "tree.h" +#include "tree-walk.h" #include "cache-tree.h" #ifndef DEBUG @@ -591,3 +592,36 @@ int write_cache_as_tree(unsigned char *sha1, int missing_ok, const char *prefix) return 0; } + +static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree) +{ + struct tree_desc desc; + struct name_entry entry; + int cnt; + + hashcpy(it->sha1, tree->object.sha1); + init_tree_desc(&desc, tree->buffer, tree->size); + cnt = 0; + while (tree_entry(&desc, &entry)) { + if (!S_ISDIR(entry.mode)) + cnt++; + else { + struct cache_tree_sub *sub; + struct tree *subtree = lookup_tree(entry.sha1); + if (!subtree->object.parsed) + parse_tree(subtree); + sub = cache_tree_sub(it, entry.path); + sub->cache_tree = cache_tree(); + prime_cache_tree_rec(sub->cache_tree, subtree); + cnt += sub->cache_tree->entry_count; + } + } + it->entry_count = cnt; +} + +void prime_cache_tree(struct cache_tree **it, struct tree *tree) +{ + cache_tree_free(it); + *it = cache_tree(); + prime_cache_tree_rec(*it, tree); +} diff --git a/cache-tree.h b/cache-tree.h index cf8b790874..e958835236 100644 --- a/cache-tree.h +++ b/cache-tree.h @@ -1,6 +1,8 @@ #ifndef CACHE_TREE_H #define CACHE_TREE_H +#include "tree.h" + struct cache_tree; struct cache_tree_sub { struct cache_tree *cache_tree; @@ -33,4 +35,6 @@ int cache_tree_update(struct cache_tree *, struct cache_entry **, int, int, int) #define WRITE_TREE_PREFIX_ERROR (-3) int write_cache_as_tree(unsigned char *sha1, int missing_ok, const char *prefix); +void prime_cache_tree(struct cache_tree **, struct tree *); + #endif From 456156dc068b7664c08e35157e17a6440ec68f32 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 20 Apr 2009 03:58:19 -0700 Subject: [PATCH 19/64] read-tree -m A B: prime cache-tree from the switched-to tree When switching to a new branch with "read-tree -m A B", the resulting index must match tree B and we can prime the cache tree with it. Signed-off-by: Junio C Hamano --- builtin-read-tree.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 9cd7d0738e..391d709704 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -199,9 +199,14 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) * "-m ent" or "--reset ent" form), we can obtain a fully * valid cache-tree because the index must match exactly * what came from the tree. + * + * The same holds true if we are switching between two trees + * using read-tree -m A B. The index must match B after that. */ if (nr_trees == 1 && !opts.prefix) prime_cache_tree(&active_cache_tree, trees[0]); + else if (nr_trees == 2 && opts.merge) + prime_cache_tree(&active_cache_tree, trees[1]); if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(&lock_file)) From 83ae209bf9708bf1b67dbac4a3629a0003af5dbb Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 20 Apr 2009 03:58:20 -0700 Subject: [PATCH 20/64] checkout branch: prime cache-tree fully When switching to another branch, the earlier code relied on incremental invalidation of cache-tree entries to degrade it. While it is not wrong per-se, we know that the resulting index must fully match the branch we are switching to unless the -m (merge) option is used. We should simply fully re-prime the cache-tree using the new tree object in such a case. And for safety, invalidate the cache-tree as a whole in other cases. Signed-off-by: Junio C Hamano --- builtin-checkout.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/builtin-checkout.c b/builtin-checkout.c index ffdb33aef5..efa1ebfe07 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -368,14 +368,17 @@ static int merge_working_tree(struct checkout_opts *opts, int ret; struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); int newfd = hold_locked_index(lock_file, 1); + int reprime_cache_tree = 0; if (read_cache() < 0) return error("corrupt index file"); + cache_tree_free(&active_cache_tree); if (opts->force) { ret = reset_tree(new->commit->tree, opts, 1); if (ret) return ret; + reprime_cache_tree = 1; } else { struct tree_desc trees[2]; struct tree *tree; @@ -411,7 +414,9 @@ static int merge_working_tree(struct checkout_opts *opts, init_tree_desc(&trees[1], tree->buffer, tree->size); ret = unpack_trees(2, trees, &topts); - if (ret == -1) { + if (ret != -1) { + reprime_cache_tree = 1; + } else { /* * Unpack couldn't do a trivial merge; either * give up or do a real merge, depending on @@ -455,6 +460,8 @@ static int merge_working_tree(struct checkout_opts *opts, } } + if (reprime_cache_tree) + prime_cache_tree(&active_cache_tree, new->commit->tree); if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(lock_file)) die("unable to write new index file"); From 34779c535c4e121414197ab08b4b502a22a75433 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Mon, 20 Apr 2009 10:17:00 +0200 Subject: [PATCH 21/64] Windows: Skip fstat/lstat optimization in write_entry() Commit e4c72923 (write_entry(): use fstat() instead of lstat() when file is open, 2009-02-09) introduced an optimization of write_entry(). Unfortunately, we cannot take advantage of this optimization on Windows because there is no guarantee that the time stamps are updated before the file is closed: "The only guarantee about a file timestamp is that the file time is correctly reflected when the handle that makes the change is closed." (http://msdn.microsoft.com/en-us/library/ms724290(VS.85).aspx) The failure of this optimization on Windows can be observed most easily by running a 'git checkout' that has to update several large files. In this case, 'git checkout' will report modified files, but infact only the timestamps were incorrectly recorded in the index, as can be verified by a subsequent 'git diff', which shows no change. Dmitry Potapov reports the same fix needs on Cygwin; this commit contains his updates for that. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- Makefile | 9 +++++++++ entry.c | 3 ++- git-compat-util.h | 6 ++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6e0838b03a..49f36f5787 100644 --- a/Makefile +++ b/Makefile @@ -167,6 +167,10 @@ all:: # Define NO_EXTERNAL_GREP if you don't want "git grep" to ever call # your external grep (e.g., if your system lacks grep, if its grep is # broken, or spawning external process is slower than built-in grep git has). +# +# Define UNRELIABLE_FSTAT if your system's fstat does not return the same +# information on a not yet closed file that lstat would return for the same +# file after it was closed. GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE @$(SHELL_PATH) ./GIT-VERSION-GEN @@ -803,6 +807,7 @@ ifeq ($(uname_S),HP-UX) endif ifneq (,$(findstring CYGWIN,$(uname_S))) COMPAT_OBJS += compat/cygwin.o + UNRELIABLE_FSTAT = UnfortunatelyYes endif ifneq (,$(findstring MINGW,$(uname_S))) NO_PREAD = YesPlease @@ -829,6 +834,7 @@ ifneq (,$(findstring MINGW,$(uname_S))) NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease NO_NSEC = YesPlease USE_WIN32_MMAP = YesPlease + UNRELIABLE_FSTAT = UnfortunatelyYes COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/regex -Icompat/fnmatch COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1 COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" @@ -1107,6 +1113,9 @@ endif ifdef NO_EXTERNAL_GREP BASIC_CFLAGS += -DNO_EXTERNAL_GREP endif +ifdef UNRELIABLE_FSTAT + BASIC_CFLAGS += -DUNRELIABLE_FSTAT +endif ifeq ($(TCLTK_PATH),) NO_TCLTK=NoThanks diff --git a/entry.c b/entry.c index 5daacc2fe5..915514aa5c 100644 --- a/entry.c +++ b/entry.c @@ -147,7 +147,8 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout wrote = write_in_full(fd, new, size); /* use fstat() only when path == ce->name */ - if (state->refresh_cache && !to_tempfile && !state->base_dir_len) { + if (fstat_is_reliable() && + state->refresh_cache && !to_tempfile && !state->base_dir_len) { fstat(fd, &st); fstat_done = 1; } diff --git a/git-compat-util.h b/git-compat-util.h index f09f244061..785aa31b46 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -408,4 +408,10 @@ void git_qsort(void *base, size_t nmemb, size_t size, #endif #endif +#ifdef UNRELIABLE_FSTAT +#define fstat_is_reliable() 0 +#else +#define fstat_is_reliable() 1 +#endif + #endif From 7183c09d11ac4b98f1cc78f29dcbd85df5533001 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 20 Apr 2009 19:44:53 +0200 Subject: [PATCH 22/64] Fix off-by-one in read_tree_recursive Found by valgrind. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- tree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tree.c b/tree.c index 0d703a0c47..5ab90af256 100644 --- a/tree.c +++ b/tree.c @@ -62,6 +62,7 @@ static int match_tree_entry(const char *base, int baselen, const char *path, uns continue; /* pathspecs match only at the directory boundaries */ if (!matchlen || + baselen == matchlen || base[matchlen] == '/' || match[matchlen - 1] == '/') return 1; From 3ac3cfb8ebd66ff57ba5e316abddc9612e7b485e Mon Sep 17 00:00:00 2001 From: Frank Lichtenheld Date: Sat, 18 Apr 2009 16:38:42 +0200 Subject: [PATCH 23/64] gitcvs-migration: Link to git-cvsimport documentation Signed-off-by: Frank Lichtenheld Signed-off-by: Junio C Hamano --- Documentation/gitcvs-migration.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt index aaa7ef737a..0e49c1c037 100644 --- a/Documentation/gitcvs-migration.txt +++ b/Documentation/gitcvs-migration.txt @@ -118,7 +118,7 @@ Importing a CVS archive First, install version 2.1 or higher of cvsps from link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make sure it is in your path. Then cd to a checked out CVS working directory -of the project you are interested in and run 'git-cvsimport': +of the project you are interested in and run linkgit:git-cvsimport[1]: ------------------------------------------- $ git cvsimport -C From 1d49f0d1a1b7b2941e56cf8384a7a4267e98150c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kiedrowicz?= Date: Sat, 11 Apr 2009 17:26:24 +0200 Subject: [PATCH 24/64] tests: test applying criss-cross rename patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Originally reported by Linus in $gmane/116198 Signed-off-by: Michał Kiedrowicz Signed-off-by: Junio C Hamano --- t/t4130-apply-criss-cross-rename.sh | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 t/t4130-apply-criss-cross-rename.sh diff --git a/t/t4130-apply-criss-cross-rename.sh b/t/t4130-apply-criss-cross-rename.sh new file mode 100755 index 0000000000..08c5f38b01 --- /dev/null +++ b/t/t4130-apply-criss-cross-rename.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +test_description='git apply handling criss-cross rename patch.' +. ./test-lib.sh + +create_file() { + cnt=0 + while test $cnt -le 100 + do + cnt=$(($cnt + 1)) + echo "$2" >> "$1" + done +} + +test_expect_success 'setup' ' + create_file file1 "File1 contents" && + create_file file2 "File2 contents" && + git add file1 file2 && + git commit -m 1 +' + +test_expect_success 'criss-cross rename' ' + mv file1 tmp && + mv file2 file1 && + mv tmp file2 +' + +test_expect_success 'diff -M -B' ' + git diff -M -B > diff && + git reset --hard + +' + +test_expect_failure 'apply' ' + git apply diff +' + +test_done From e8141fcf54b4e8c2c12300da1ad1bc3573a4e204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kiedrowicz?= Date: Sat, 11 Apr 2009 21:31:00 +0200 Subject: [PATCH 25/64] builtin-apply: keep information about files to be deleted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Example correct diff generated by `diff -M -B' might look like this: diff --git a/file1 b/file2 similarity index 100% rename from file1 rename to file2 diff --git a/file2 b/file1 similarity index 100% rename from file2 rename to file1 Information about removing `file2' comes after information about creation of new `file2' (renamed from `file1'). Existing implementation isn't able to apply such patch, because it has to know in advance which files will be removed. This patch populates fn_table with information about removal of files before calling check_patch() for each patch to be applied. Signed-off-by: Michał Kiedrowicz Signed-off-by: Junio C Hamano --- builtin-apply.c | 53 +++++++++++++++++++++++++---- t/t4130-apply-criss-cross-rename.sh | 2 +- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/builtin-apply.c b/builtin-apply.c index a664338643..c6feaf5ca8 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -2271,6 +2271,25 @@ static struct patch *in_fn_table(const char *name) return NULL; } +/* + * item->util in the filename table records the status of the path. + * Usually it points at a patch (whose result records the contents + * of it after applying it), but it could be PATH_WAS_DELETED for a + * path that a previously applied patch has already removed. + */ + #define PATH_TO_BE_DELETED ((struct patch *) -2) +#define PATH_WAS_DELETED ((struct patch *) -1) + +static int to_be_deleted(struct patch *patch) +{ + return patch == PATH_TO_BE_DELETED; +} + +static int was_deleted(struct patch *patch) +{ + return patch == PATH_WAS_DELETED; +} + static void add_to_fn_table(struct patch *patch) { struct string_list_item *item; @@ -2291,7 +2310,22 @@ static void add_to_fn_table(struct patch *patch) */ if ((patch->new_name == NULL) || (patch->is_rename)) { item = string_list_insert(patch->old_name, &fn_table); - item->util = (struct patch *) -1; + item->util = PATH_WAS_DELETED; + } +} + +static void prepare_fn_table(struct patch *patch) +{ + /* + * store information about incoming file deletion + */ + while (patch) { + if ((patch->new_name == NULL) || (patch->is_rename)) { + struct string_list_item *item; + item = string_list_insert(patch->old_name, &fn_table); + item->util = PATH_TO_BE_DELETED; + } + patch = patch->next; } } @@ -2304,8 +2338,8 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry * struct patch *tpatch; if (!(patch->is_copy || patch->is_rename) && - ((tpatch = in_fn_table(patch->old_name)) != NULL)) { - if (tpatch == (struct patch *) -1) { + (tpatch = in_fn_table(patch->old_name)) != NULL && !to_be_deleted(tpatch)) { + if (was_deleted(tpatch)) { return error("patch %s has been renamed/deleted", patch->old_name); } @@ -2399,10 +2433,9 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s assert(patch->is_new <= 0); if (!(patch->is_copy || patch->is_rename) && - (tpatch = in_fn_table(old_name)) != NULL) { - if (tpatch == (struct patch *) -1) { + (tpatch = in_fn_table(old_name)) != NULL && !to_be_deleted(tpatch)) { + if (was_deleted(tpatch)) return error("%s: has been deleted/renamed", old_name); - } st_mode = tpatch->new_mode; } else if (!cached) { stat_ret = lstat(old_name, st); @@ -2410,6 +2443,9 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s return error("%s: %s", old_name, strerror(errno)); } + if (to_be_deleted(tpatch)) + tpatch = NULL; + if (check_index && !tpatch) { int pos = cache_name_pos(old_name, strlen(old_name)); if (pos < 0) { @@ -2471,6 +2507,7 @@ static int check_patch(struct patch *patch) const char *new_name = patch->new_name; const char *name = old_name ? old_name : new_name; struct cache_entry *ce = NULL; + struct patch *tpatch; int ok_if_exists; int status; @@ -2481,7 +2518,8 @@ static int check_patch(struct patch *patch) return status; old_name = patch->old_name; - if (in_fn_table(new_name) == (struct patch *) -1) + if ((tpatch = in_fn_table(new_name)) && + (was_deleted(tpatch) || to_be_deleted(tpatch))) /* * A type-change diff is always split into a patch to * delete old, immediately followed by a patch to @@ -2533,6 +2571,7 @@ static int check_patch_list(struct patch *patch) { int err = 0; + prepare_fn_table(patch); while (patch) { if (apply_verbosely) say_patch_name(stderr, diff --git a/t/t4130-apply-criss-cross-rename.sh b/t/t4130-apply-criss-cross-rename.sh index 08c5f38b01..8623dbebab 100755 --- a/t/t4130-apply-criss-cross-rename.sh +++ b/t/t4130-apply-criss-cross-rename.sh @@ -31,7 +31,7 @@ test_expect_success 'diff -M -B' ' ' -test_expect_failure 'apply' ' +test_expect_success 'apply' ' git apply diff ' From f0583867e746985e9d62f57d5ba6ce27b2603447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kiedrowicz?= Date: Sat, 18 Apr 2009 23:03:57 +0200 Subject: [PATCH 26/64] tests: make test-apply-criss-cross-rename more robust I realized that this test does check if git-apply succeeds, but doesn't tell if it applies patches correctly. So I added test_cmp to check it. I also added a test which checks swapping three files. Signed-off-by: Junio C Hamano --- t/t4130-apply-criss-cross-rename.sh | 34 ++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/t/t4130-apply-criss-cross-rename.sh b/t/t4130-apply-criss-cross-rename.sh index 8623dbebab..7cfa2d6287 100755 --- a/t/t4130-apply-criss-cross-rename.sh +++ b/t/t4130-apply-criss-cross-rename.sh @@ -15,14 +15,17 @@ create_file() { test_expect_success 'setup' ' create_file file1 "File1 contents" && create_file file2 "File2 contents" && - git add file1 file2 && + create_file file3 "File3 contents" && + git add file1 file2 file3 && git commit -m 1 ' test_expect_success 'criss-cross rename' ' mv file1 tmp && mv file2 file1 && - mv tmp file2 + mv tmp file2 && + cp file1 file1-swapped && + cp file2 file2-swapped ' test_expect_success 'diff -M -B' ' @@ -32,7 +35,32 @@ test_expect_success 'diff -M -B' ' ' test_expect_success 'apply' ' - git apply diff + git apply diff && + test_cmp file1 file1-swapped && + test_cmp file2 file2-swapped +' + +test_expect_success 'criss-cross rename' ' + git reset --hard && + mv file1 tmp && + mv file2 file1 && + mv file3 file2 + mv tmp file3 && + cp file1 file1-swapped && + cp file2 file2-swapped && + cp file3 file3-swapped +' + +test_expect_success 'diff -M -B' ' + git diff -M -B > diff && + git reset --hard +' + +test_expect_success 'apply' ' + git apply diff && + test_cmp file1 file1-swapped && + test_cmp file2 file2-swapped && + test_cmp file3 file3-swapped ' test_done From a162e78df082d4f885bda2e51067d9788a7f65e4 Mon Sep 17 00:00:00 2001 From: Matthieu Moy Date: Mon, 20 Apr 2009 13:09:37 +0200 Subject: [PATCH 27/64] clone: add test for push on an empty clone. Commit 55f0566 (get_local_heads(): do not return random pointer if there is no head, 2009-04-17) fixed a segfault for git push, this patch adds a test-case to avoid future regressions. Signed-off-by: Matthieu Moy Signed-off-by: Junio C Hamano --- t/t5701-clone-local.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh index 3559d17964..f26b511c3e 100755 --- a/t/t5701-clone-local.sh +++ b/t/t5701-clone-local.sh @@ -132,4 +132,14 @@ test_expect_success 'clone empty repository' ' test $actual = $expected) ' +test_expect_success 'clone empty repository, and then push should not segfault.' ' + cd "$D" && + rm -fr empty/ empty-clone/ && + mkdir empty && + (cd empty && git init) && + git clone empty empty-clone && + cd empty-clone && + test_must_fail git push +' + test_done From 7c0282bfb9038516b0eeb3b7cb3c1d6ee3cb20de Mon Sep 17 00:00:00 2001 From: Mike Ralphson Date: Fri, 17 Apr 2009 19:13:29 +0100 Subject: [PATCH 28/64] builtin-remote: fix typo in option description Signed-off-by: Mike Ralphson Signed-off-by: Junio C Hamano --- builtin-remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin-remote.c b/builtin-remote.c index ca7c639ad3..2ed752cbf1 100644 --- a/builtin-remote.c +++ b/builtin-remote.c @@ -1216,7 +1216,7 @@ static int update(int argc, const char **argv) struct option options[] = { OPT_GROUP("update specific options"), OPT_BOOLEAN('p', "prune", &prune, - "prune remotes after fecthing"), + "prune remotes after fetching"), OPT_END() }; From 680ebc01806187b33cab9093c39102468298350f Mon Sep 17 00:00:00 2001 From: Mike Ralphson Date: Fri, 17 Apr 2009 19:13:28 +0100 Subject: [PATCH 29/64] Documentation: fix typos / spelling mistakes Signed-off-by: Mike Ralphson Signed-off-by: Junio C Hamano --- Documentation/git-cvsimport.txt | 2 +- Documentation/git-format-patch.txt | 2 +- contrib/thunderbird-patch-inline/README | 4 ++-- gitweb/README | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt index d7bab13f6c..614e769f4e 100644 --- a/Documentation/git-cvsimport.txt +++ b/Documentation/git-cvsimport.txt @@ -196,7 +196,7 @@ Problems related to tags: If you suspect that any of these issues may apply to the repository you want to import consider using these alternative tools which proved to be -more stable in practise: +more stable in practice: * cvs2git (part of cvs2svn), `http://cvs2svn.tigris.org` * parsecvs, `http://cgit.freedesktop.org/~keithp/parsecvs` diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index eb2fbcff1a..5eddca92c4 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -194,7 +194,7 @@ CONFIGURATION ------------- You can specify extra mail header lines to be added to each message in the repository configuration, new defaults for the subject prefix -and file suffix, control attachements, and number patches when outputting +and file suffix, control attachments, and number patches when outputting more than one. ------------ diff --git a/contrib/thunderbird-patch-inline/README b/contrib/thunderbird-patch-inline/README index 39f96aa115..000147bbe4 100644 --- a/contrib/thunderbird-patch-inline/README +++ b/contrib/thunderbird-patch-inline/README @@ -1,12 +1,12 @@ appp.sh is a script that is supposed to be used together with ExternalEditor -for Mozilla Thundebird. It will let you include patches inline in e-mails +for Mozilla Thunderbird. It will let you include patches inline in e-mails in an easy way. Usage: - Generate the patch with git format-patch. - Start writing a new e-mail in Thunderbird. - Press the external editor button (or Ctrl-E) to run appp.sh -- Select the previosly generated patch file. +- Select the previously generated patch file. - Finish editing the e-mail. Any text that is entered into the message editor before appp.sh is called diff --git a/gitweb/README b/gitweb/README index 8433dd1d45..ccda890c0e 100644 --- a/gitweb/README +++ b/gitweb/README @@ -206,7 +206,7 @@ not include variables usually directly set during build): * $fallback_encoding Gitweb assumes this charset if line contains non-UTF-8 characters. Fallback decoding is used without error checking, so it can be even - 'utf-8'. Value mist be valid encodig; see Encoding::Supported(3pm) man + 'utf-8'. Value must be valid encoding; see Encoding::Supported(3pm) man page for a list. By default 'latin1', aka. 'iso-8859-1'. * @diff_opts Rename detection options for git-diff and git-diff-tree. By default From fe3420b616eba8027b080dc81020b0e0990f4809 Mon Sep 17 00:00:00 2001 From: Markus Heidelberg Date: Tue, 21 Apr 2009 00:58:15 +0200 Subject: [PATCH 30/64] grep: don't support "grep.color"-like config options color.grep and color.grep.* is the official and documented way to highlight grep matches. Comparable options like diff.color.* and status.color.* exist for backward compatibility reasons only and are not documented any more. Signed-off-by: Markus Heidelberg Signed-off-by: Junio C Hamano --- builtin-grep.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/builtin-grep.c b/builtin-grep.c index 89489ddcf8..f88a912ace 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -26,16 +26,13 @@ static int grep_config(const char *var, const char *value, void *cb) { struct grep_opt *opt = cb; - if (!strcmp(var, "grep.color") || !strcmp(var, "color.grep")) { + if (!strcmp(var, "color.grep")) { opt->color = git_config_colorbool(var, value, -1); return 0; } - if (!strcmp(var, "grep.color.external") || - !strcmp(var, "color.grep.external")) { + if (!strcmp(var, "color.grep.external")) return git_config_string(&(opt->color_external), var, value); - } - if (!strcmp(var, "grep.color.match") || - !strcmp(var, "color.grep.match")) { + if (!strcmp(var, "color.grep.match")) { if (!value) return config_error_nonbool(var); color_parse(value, var, opt->color_match); From 3a0483281afbb6660aaf86c7b228a523782a4d6a Mon Sep 17 00:00:00 2001 From: Michael J Gruber Date: Tue, 21 Apr 2009 11:21:59 +0200 Subject: [PATCH 31/64] test-lib.sh: Help test_create_repo() find the templates dir Currently, test_create_repo() expects that templates can be found below `pwd`/.. This assumption fails when tests are run against a git installed somewhere else or test_create_repo() is called from subdirectiories (several tests do this). Therefore, use $TEST_DIRECTORY as introduced in 2d84e9fb and expect templates to be present in $TEST_DIRECTORY/.. which should be the root dir of the git checkout. Signed-off-by: Michael J Gruber Signed-off-by: Junio C Hamano --- t/test-lib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/test-lib.sh b/t/test-lib.sh index 4bd986f430..dad1437fa4 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -491,7 +491,7 @@ test_create_repo () { repo="$1" mkdir -p "$repo" cd "$repo" || error "Cannot setup test environment" - "$GIT_EXEC_PATH/git-init" "--template=$owd/../templates/blt/" >&3 2>&4 || + "$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 || error "cannot run git init -- have you built things yet?" mv .git/hooks .git/hooks-disabled cd "$owd" From 8fbf879ed75b67417b0e36eb7b03b79611f1f8a0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 21 Apr 2009 16:32:18 -0700 Subject: [PATCH 32/64] Revert "stat_tracking_info(): only count real commits" This reverts commit 19de5d6913b9681d2bde533bccc8445c9236a648. It produces a misleading output to decide if a merge can fast-forward. --- Documentation/RelNotes-1.6.3.txt | 4 ---- remote.c | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Documentation/RelNotes-1.6.3.txt b/Documentation/RelNotes-1.6.3.txt index b53e7b86e7..efce29ddf3 100644 --- a/Documentation/RelNotes-1.6.3.txt +++ b/Documentation/RelNotes-1.6.3.txt @@ -69,10 +69,6 @@ Updates since v1.6.2 with the 'edit' action in git-add -i/-p, you can abort the editor to tell git not to apply it. -* The number of commits shown in "you are ahead/behind your upstream" - messages given by "git checkout" and "git status" used to count merge - commits; now it doesn't. - * @{-1} is a new way to refer to the last branch you were on introduced in 1.6.2, but the initial implementation did not teach this to a few commands. Now the syntax works with "branch -m @{-1} newname". diff --git a/remote.c b/remote.c index 41c5b59736..91f748550e 100644 --- a/remote.c +++ b/remote.c @@ -1413,10 +1413,9 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs) if (theirs == ours) return 0; - /* Run "rev-list --no-merges --left-right ours...theirs" internally... */ + /* Run "rev-list --left-right ours...theirs" internally... */ rev_argc = 0; rev_argv[rev_argc++] = NULL; - rev_argv[rev_argc++] = "--no-merges"; rev_argv[rev_argc++] = "--left-right"; rev_argv[rev_argc++] = symmetric; rev_argv[rev_argc++] = "--"; From 7b1d6269eebb0701c287d3ed8732384c115d2e1f Mon Sep 17 00:00:00 2001 From: Allan Caffee Date: Wed, 22 Apr 2009 17:27:15 -0400 Subject: [PATCH 33/64] t4202-log: extend test coverage of graphing Extend this test to cover the rendering of graphs with octopus merges and pre_commit lines. Signed-off-by: Allan Caffee Signed-off-by: Junio C Hamano --- t/t4202-log.sh | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/t/t4202-log.sh b/t/t4202-log.sh index b98619035c..46bd24f502 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -284,10 +284,36 @@ test_expect_success 'set up more tangled history' ' git merge master~3 && git merge side~1 && git checkout master && - git merge tangle + git merge tangle && + git checkout -b reach && + test_commit reach && + git checkout master && + git checkout -b octopus-a && + test_commit octopus-a && + git checkout master && + git checkout -b octopus-b && + test_commit octopus-b && + git checkout master && + test_commit seventh && + git merge octopus-a octopus-b + git merge reach ' cat > expect <<\EOF +* Merge branch 'reach' +|\ +| \ +| \ +*-. \ Merge branches 'octopus-a' and 'octopus-b' +|\ \ \ +* | | | seventh +| | * | octopus-b +| |/ / +|/| | +| * | octopus-a +|/ / +| * reach +|/ * Merge branch 'tangle' |\ | * Merge branch 'side' (early part) into tangle @@ -316,7 +342,7 @@ cat > expect <<\EOF * initial EOF -test_expect_success 'log --graph with merge' ' +test_expect_failure 'log --graph with merge' ' git log --graph --date-order --pretty=tformat:%s | sed "s/ *$//" >actual && test_cmp expect actual From 36a31feae23ac45a130fa38b2934a74e4e7156b4 Mon Sep 17 00:00:00 2001 From: Allan Caffee Date: Wed, 22 Apr 2009 15:52:13 -0400 Subject: [PATCH 34/64] graph API: fix extra space during pre_commit_line state An extra space is being inserted between the "commit" column and all of the successive edges. Remove this space. This regression was introduced by 427fc5b. Signed-off-by: Allan Caffee Signed-off-by: Junio C Hamano --- graph.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graph.c b/graph.c index d4571cf31d..31e09eb2c7 100644 --- a/graph.c +++ b/graph.c @@ -727,8 +727,8 @@ static void graph_output_pre_commit_line(struct git_graph *graph, if (col->commit == graph->commit) { seen_this = 1; strbuf_write_column(sb, col, '|'); - strbuf_addf(sb, " %*s", graph->expansion_row, ""); - chars_written += 2 + graph->expansion_row; + strbuf_addf(sb, "%*s", graph->expansion_row, ""); + chars_written += 1 + graph->expansion_row; } else if (seen_this && (graph->expansion_row == 0)) { /* * This is the first line of the pre-commit output. From a6c1a3827c934872726bafb35f51f2ad9b9e897f Mon Sep 17 00:00:00 2001 From: Allan Caffee Date: Wed, 22 Apr 2009 17:27:59 -0400 Subject: [PATCH 35/64] graph API: fix a bug in the rendering of octopus merges An off by one error was causing octopus merges with 3 parents to not be rendered correctly. This regression was introduced by 427fc5. Signed-off-by: Allan Caffee Signed-off-by: Junio C Hamano --- graph.c | 2 +- t/t4202-log.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/graph.c b/graph.c index 31e09eb2c7..b7879f8c66 100644 --- a/graph.c +++ b/graph.c @@ -852,7 +852,7 @@ static void graph_output_commit_line(struct git_graph *graph, struct strbuf *sb) graph_output_commit_char(graph, sb); chars_written++; - if (graph->num_parents > 3) + if (graph->num_parents > 2) chars_written += graph_draw_octopus_merge(graph, sb); } else if (seen_this && (graph->num_parents > 2)) { diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 46bd24f502..67f983fea4 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -342,7 +342,7 @@ cat > expect <<\EOF * initial EOF -test_expect_failure 'log --graph with merge' ' +test_expect_sucess 'log --graph with merge' ' git log --graph --date-order --pretty=tformat:%s | sed "s/ *$//" >actual && test_cmp expect actual From e8d1180467da98c53663e462800f793d2341f5a1 Mon Sep 17 00:00:00 2001 From: Alex Riesen Date: Wed, 22 Apr 2009 09:27:22 +0200 Subject: [PATCH 36/64] Wait for git diff to finish in git difftool In ActivetState Perl, exec does not wait for the started program. This breaks difftool tests and may cause unexpected behaviour: git difftool has returned, but the rest of code (diff and possibly the interactive program are still running in the background. Acked-by: David Aguilar Signed-off-by: Junio C Hamano --- git-difftool.perl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-difftool.perl b/git-difftool.perl index 948ff7f6fd..bd828c2a6f 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -82,4 +82,5 @@ sub generate_command } setup_environment(); -exec(generate_command()); +my $rc = system(generate_command()); +exit($rc | ($rc >> 8)); From 4ddef0e67d879bf7e18ce2655b057243d894adc1 Mon Sep 17 00:00:00 2001 From: "Wesley J. Landaker" Date: Wed, 22 Apr 2009 09:48:57 -0600 Subject: [PATCH 37/64] Documentation: git-svn: fix spurious bolding that mangles the output Without this fix, the output looks like: "Keep in mind that the (asterisk) wildcard of the local ref (right of the :) *must be the ..." -- with half the sentence spuriously bold. This fixes the problem by simply escaping asciidoc syntax as suggested by Jeff King . Signed-off-by: Wesley J. Landaker Signed-off-by: Junio C Hamano --- Documentation/git-svn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 9229d45ad9..3e22e4096f 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -693,7 +693,7 @@ listed below are allowed: tags = tags/*/project-a:refs/remotes/project-a/tags/* ------------------------------------------------------------------------ -Keep in mind that the '*' (asterisk) wildcard of the local ref +Keep in mind that the '\*' (asterisk) wildcard of the local ref (right of the ':') *must* be the farthest right path component; however the remote wildcard may be anywhere as long as it's own independent path component (surrounded by '/' or EOL). This From bad542f0b1bca3b57e300a21fc7268c1800e6752 Mon Sep 17 00:00:00 2001 From: "Wesley J. Landaker" Date: Wed, 22 Apr 2009 09:48:58 -0600 Subject: [PATCH 38/64] Documentation: git-svn: fix a grammatical error without awkwardness The way the sentence is currently written, there needs to be an "its", but this leads to: "however the remote wildcard may be anywhere as long as it's its own" which is awkward to read. Instead, this patch fixes he grammar in a simpler way. Signed-off-by: Wesley J. Landaker Signed-off-by: Junio C Hamano --- Documentation/git-svn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 3e22e4096f..1c40894669 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -695,7 +695,7 @@ listed below are allowed: Keep in mind that the '\*' (asterisk) wildcard of the local ref (right of the ':') *must* be the farthest right path component; -however the remote wildcard may be anywhere as long as it's own +however the remote wildcard may be anywhere as long as it's an independent path component (surrounded by '/' or EOL). This type of configuration is not automatically created by 'init' and should be manually entered with a text-editor or using 'git-config'. From 3ea3c215c02dc4a4e7d0881c25b2223540960797 Mon Sep 17 00:00:00 2001 From: Mike Ralphson Date: Fri, 17 Apr 2009 19:13:30 +0100 Subject: [PATCH 39/64] Fix typos / spelling in comments Signed-off-by: Mike Ralphson Signed-off-by: Junio C Hamano --- builtin-checkout.c | 2 +- builtin-ls-files.c | 2 +- builtin-pack-objects.c | 2 +- builtin-reflog.c | 2 +- builtin-reset.c | 2 +- compat/cygwin.c | 2 +- compat/fnmatch/fnmatch.c | 4 ++-- compat/mingw.c | 2 +- compat/regex/regex.c | 4 ++-- diffcore-rename.c | 2 +- fast-import.c | 6 +++--- fsck.h | 2 +- git.c | 2 +- graph.c | 2 +- levenshtein.c | 2 +- parse-options.h | 8 ++++---- revision.c | 2 +- strbuf.h | 2 +- tree-diff.c | 2 +- xdiff/xdiffi.c | 2 +- 20 files changed, 27 insertions(+), 27 deletions(-) diff --git a/builtin-checkout.c b/builtin-checkout.c index ee1edd406f..383598c9bf 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -178,7 +178,7 @@ static int checkout_merged(int pos, struct checkout *state) /* * NEEDSWORK: * There is absolutely no reason to write this as a blob object - * and create a phoney cache entry just to leak. This hack is + * and create a phony cache entry just to leak. This hack is * primarily to get to the write_entry() machinery that massages * the contents to work-tree format and writes out which only * allows it for a cache entry. The code in write_entry() needs diff --git a/builtin-ls-files.c b/builtin-ls-files.c index 88e2697aeb..da2daf45ac 100644 --- a/builtin-ls-files.c +++ b/builtin-ls-files.c @@ -512,7 +512,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) pathspec = get_pathspec(prefix, argv); - /* be nice with submodule patsh ending in a slash */ + /* be nice with submodule paths ending in a slash */ read_cache(); if (pathspec) strip_trailing_slash_from_submodules(); diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index 419f29aa1a..9742b45c4d 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -293,7 +293,7 @@ static unsigned long write_object(struct sha1file *f, die("unable to read %s", sha1_to_hex(entry->idx.sha1)); /* * make sure no cached delta data remains from a - * previous attempt before a pack split occured. + * previous attempt before a pack split occurred. */ free(entry->delta_data); entry->delta_data = NULL; diff --git a/builtin-reflog.c b/builtin-reflog.c index 249ad2a311..ff8b4f615b 100644 --- a/builtin-reflog.c +++ b/builtin-reflog.c @@ -243,7 +243,7 @@ static void mark_reachable(struct commit *commit, unsigned long expire_limit) * We need to compute if commit on either side of an reflog * entry is reachable from the tip of the ref for all entries. * Mark commits that are reachable from the tip down to the - * time threashold first; we know a commit marked thusly is + * time threshold first; we know a commit marked thusly is * reachable from the tip without running in_merge_bases() * at all. */ diff --git a/builtin-reset.c b/builtin-reset.c index c0cb915c26..7e7ebabaa8 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -228,7 +228,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) } /* * Otherwise, argv[i] could be either or and - * has to be unambigous. + * has to be unambiguous. */ else if (!get_sha1(argv[i], sha1)) { /* diff --git a/compat/cygwin.c b/compat/cygwin.c index ebac148392..119287412d 100644 --- a/compat/cygwin.c +++ b/compat/cygwin.c @@ -92,7 +92,7 @@ static int cygwin_stat(const char *path, struct stat *buf) * Reading this option is not always possible immediately as git_dir may be * not be set yet. So until it is set, use cygwin lstat/stat functions. * However, if core.filemode is set, we must use the Cygwin posix - * stat/lstat as the Windows stat fuctions do not determine posix filemode. + * stat/lstat as the Windows stat functions do not determine posix filemode. * * Note that git_cygwin_config() does NOT call git_default_config() and this * is deliberate. Many commands read from config to establish initial diff --git a/compat/fnmatch/fnmatch.c b/compat/fnmatch/fnmatch.c index 1f4ead5f98..03157a4ab5 100644 --- a/compat/fnmatch/fnmatch.c +++ b/compat/fnmatch/fnmatch.c @@ -39,7 +39,7 @@ # include #endif -/* For platform which support the ISO C amendement 1 functionality we +/* For platform which support the ISO C amendment 1 functionality we support user defined character classes. */ #if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) /* Solaris 2.5 has a bug: must be included before . */ @@ -90,7 +90,7 @@ # if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) /* The GNU C library provides support for user-defined character classes - and the functions from ISO C amendement 1. */ + and the functions from ISO C amendment 1. */ # ifdef CHARCLASS_NAME_MAX # define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX # else diff --git a/compat/mingw.c b/compat/mingw.c index 1a17cf6cce..2a047019e8 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -396,7 +396,7 @@ repeat: * its own input data to become available. But since * the process (pack-objects) is itself CPU intensive, * it will happily pick up the time slice that we are - * relinguishing here. + * relinquishing here. */ Sleep(0); goto repeat; diff --git a/compat/regex/regex.c b/compat/regex/regex.c index 87b33e4669..5ea007567d 100644 --- a/compat/regex/regex.c +++ b/compat/regex/regex.c @@ -1043,7 +1043,7 @@ regex_compile (pattern, size, syntax, bufp) they can be reliably used as array indices. */ register unsigned char c, c1; - /* A random tempory spot in PATTERN. */ + /* A random temporary spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ @@ -1796,7 +1796,7 @@ regex_compile (pattern, size, syntax, bufp) we're all done, the pattern will look like: set_number_at set_number_at - succeed_n + succeed_n jump_n (The upper bound and `jump_n' are omitted if diff --git a/diffcore-rename.c b/diffcore-rename.c index 0b0d6b8c8c..63ac998bfa 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -267,7 +267,7 @@ static int find_identical_files(struct file_similarity *src, int score; struct diff_filespec *source = p->filespec; - /* False hash collission? */ + /* False hash collision? */ if (hashcmp(source->sha1, target->sha1)) continue; /* Non-regular files? If so, the modes must match! */ diff --git a/fast-import.c b/fast-import.c index 23c496d683..53617a10d2 100644 --- a/fast-import.c +++ b/fast-import.c @@ -76,7 +76,7 @@ Format of STDIN stream: delim lf; # note: declen indicates the length of binary_data in bytes. - # declen does not include the lf preceeding the binary data. + # declen does not include the lf preceding the binary data. # exact_data ::= 'data' sp declen lf binary_data; @@ -134,7 +134,7 @@ Format of STDIN stream: # # In case it is not clear, the '#' that starts the comment # must be the first character on that the line (an lf have - # preceeded it). + # preceded it). # comment ::= '#' not_lf* lf; not_lf ::= # Any byte that is not ASCII newline (LF); @@ -953,7 +953,7 @@ static void end_packfile(void) close(pack_data->pack_fd); idx_name = keep_pack(create_index()); - /* Register the packfile with core git's machinary. */ + /* Register the packfile with core git's machinery. */ new_p = add_packed_git(idx_name, strlen(idx_name), 1); if (!new_p) die("core git rejected index %s", idx_name); diff --git a/fsck.h b/fsck.h index 990ee02335..008456b675 100644 --- a/fsck.h +++ b/fsck.h @@ -23,7 +23,7 @@ int fsck_error_function(struct object *obj, int type, const char *fmt, ...); * the return value is: * -1 error in processing the object * <0 return value of the callback, which lead to an abort - * >0 return value of the first sigaled error >0 (in the case of no other errors) + * >0 return value of the first signaled error >0 (in the case of no other errors) * 0 everything OK */ int fsck_walk(struct object *obj, fsck_walk_func walk, void *data); diff --git a/git.c b/git.c index bfb6508ad0..cc5aaa76f1 100644 --- a/git.c +++ b/git.c @@ -497,7 +497,7 @@ int main(int argc, const char **argv) /* * We use PATH to find git commands, but we prepend some higher - * precidence paths: the "--exec-path" option, the GIT_EXEC_PATH + * precedence paths: the "--exec-path" option, the GIT_EXEC_PATH * environment, and the $(gitexecdir) from the Makefile at build * time. */ diff --git a/graph.c b/graph.c index b7879f8c66..06fbeb6c24 100644 --- a/graph.c +++ b/graph.c @@ -35,7 +35,7 @@ static void graph_padding_line(struct git_graph *graph, struct strbuf *sb); * newline. A new graph line will not be printed after the final newline. * If the strbuf is empty, no output will be printed. * - * Since the first line will not include the graph ouput, the caller is + * Since the first line will not include the graph output, the caller is * responsible for printing this line's graph (perhaps via * graph_show_commit() or graph_show_oneline()) before calling * graph_show_strbuf(). diff --git a/levenshtein.c b/levenshtein.c index a32f4cdc45..fc281597fd 100644 --- a/levenshtein.c +++ b/levenshtein.c @@ -27,7 +27,7 @@ * * It does so by calculating the costs of the path ending in characters * i (in string1) and j (in string2), respectively, given that the last - * operation is a substition, a swap, a deletion, or an insertion. + * operation is a substitution, a swap, a deletion, or an insertion. * * This implementation allows the costs to be weighted: * diff --git a/parse-options.h b/parse-options.h index f8ef1db128..b54eec128b 100644 --- a/parse-options.h +++ b/parse-options.h @@ -52,7 +52,7 @@ typedef int parse_opt_cb(const struct option *, const char *arg, int unset); * * `argh`:: * token to explain the kind of argument this option wants. Keep it - * homogenous across the repository. + * homogeneous across the repository. * * `help`:: * the short help associated to what the option does. @@ -61,7 +61,7 @@ typedef int parse_opt_cb(const struct option *, const char *arg, int unset); * * `flags`:: * mask of parse_opt_option_flags. - * PARSE_OPT_OPTARG: says that the argument is optionnal (not for BOOLEANs) + * PARSE_OPT_OPTARG: says that the argument is optional (not for BOOLEANs) * PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs * PARSE_OPT_NONEG: says that this option cannot be negated * PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in @@ -105,7 +105,7 @@ struct option { { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) } /* parse_options() will filter out the processed options and leave the - * non-option argments in argv[]. + * non-option arguments in argv[]. * Returns the number of arguments left in argv[]. */ extern int parse_options(int argc, const char **argv, @@ -115,7 +115,7 @@ extern int parse_options(int argc, const char **argv, extern NORETURN void usage_with_options(const char * const *usagestr, const struct option *options); -/*----- incremantal advanced APIs -----*/ +/*----- incremental advanced APIs -----*/ enum { PARSE_OPT_HELP = -1, diff --git a/revision.c b/revision.c index bd0ea34af0..18b7ebbbd5 100644 --- a/revision.c +++ b/revision.c @@ -209,7 +209,7 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object } /* - * Tree object? Either mark it uniniteresting, or add it + * Tree object? Either mark it uninteresting, or add it * to the list of objects to look at later.. */ if (object->type == OBJ_TREE) { diff --git a/strbuf.h b/strbuf.h index 9ee908a3ec..eaa8704d5f 100644 --- a/strbuf.h +++ b/strbuf.h @@ -11,7 +11,7 @@ * build complex strings/buffers whose final size isn't easily known. * * It is NOT legal to copy the ->buf pointer away. - * `strbuf_detach' is the operation that detachs a buffer from its shell + * `strbuf_detach' is the operation that detaches a buffer from its shell * while keeping the shell valid wrt its invariants. * * 2. the ->buf member is a byte array that has at least ->len + 1 bytes diff --git a/tree-diff.c b/tree-diff.c index b05d0f4355..edd83949bf 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -374,7 +374,7 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co } /* - * Then, discard all the non-relevane file pairs... + * Then, discard all the non-relevant file pairs... */ for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c index 02184d9cde..1ebab687f7 100644 --- a/xdiff/xdiffi.c +++ b/xdiff/xdiffi.c @@ -456,7 +456,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) { /* * Record the end-of-group position in case we are matched * with a group of changes in the other file (that is, the - * change record before the enf-of-group index in the other + * change record before the end-of-group index in the other * file is set). */ ixref = rchgo[ixo - 1] ? ix: nrec; From b18cc5a3b2f64364d2c7d3560066852728a6c666 Mon Sep 17 00:00:00 2001 From: Michael J Gruber Date: Wed, 22 Apr 2009 23:15:56 +0200 Subject: [PATCH 40/64] Fix more typos/spelling in comments A few more fixes on top of the automatic spell checker generated ones. Signed-off-by: Michael J Gruber Signed-off-by: Junio C Hamano --- builtin-reflog.c | 2 +- compat/cygwin.c | 2 +- compat/fnmatch/fnmatch.c | 2 +- fast-import.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin-reflog.c b/builtin-reflog.c index ff8b4f615b..ddfdf5a3cb 100644 --- a/builtin-reflog.c +++ b/builtin-reflog.c @@ -240,7 +240,7 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig static void mark_reachable(struct commit *commit, unsigned long expire_limit) { /* - * We need to compute if commit on either side of an reflog + * We need to compute whether the commit on either side of a reflog * entry is reachable from the tip of the ref for all entries. * Mark commits that are reachable from the tip down to the * time threshold first; we know a commit marked thusly is diff --git a/compat/cygwin.c b/compat/cygwin.c index 119287412d..b4a51b958c 100644 --- a/compat/cygwin.c +++ b/compat/cygwin.c @@ -89,7 +89,7 @@ static int cygwin_stat(const char *path, struct stat *buf) /* * At start up, we are trying to determine whether Win32 API or cygwin stat * functions should be used. The choice is determined by core.ignorecygwinfstricks. - * Reading this option is not always possible immediately as git_dir may be + * Reading this option is not always possible immediately as git_dir may * not be set yet. So until it is set, use cygwin lstat/stat functions. * However, if core.filemode is set, we must use the Cygwin posix * stat/lstat as the Windows stat functions do not determine posix filemode. diff --git a/compat/fnmatch/fnmatch.c b/compat/fnmatch/fnmatch.c index 03157a4ab5..14feac7fe1 100644 --- a/compat/fnmatch/fnmatch.c +++ b/compat/fnmatch/fnmatch.c @@ -39,7 +39,7 @@ # include #endif -/* For platform which support the ISO C amendment 1 functionality we +/* For platforms which support the ISO C amendment 1 functionality we support user defined character classes. */ #if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) /* Solaris 2.5 has a bug: must be included before . */ diff --git a/fast-import.c b/fast-import.c index 53617a10d2..8d959af3b2 100644 --- a/fast-import.c +++ b/fast-import.c @@ -133,7 +133,7 @@ Format of STDIN stream: # always escapes the related input from comment processing. # # In case it is not clear, the '#' that starts the comment - # must be the first character on that the line (an lf have + # must be the first character on that line (an lf # preceded it). # comment ::= '#' not_lf* lf; From 7bd93c1c625ce5fa03f0d13d728f34f8ab868991 Mon Sep 17 00:00:00 2001 From: Dan Loewenherz Date: Wed, 22 Apr 2009 21:46:02 -0400 Subject: [PATCH 41/64] Convert to use quiet option when available A minor fix that eliminates usage of "2>/dev/null" when --quiet or -q has already been implemented. Signed-off-by: Dan Loewenherz Signed-off-by: Junio C Hamano --- git-filter-branch.sh | 2 +- git-merge-resolve.sh | 4 ++-- git-parse-remote.sh | 2 +- git-pull.sh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/git-filter-branch.sh b/git-filter-branch.sh index b90d3df3a7..37e044db40 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -430,7 +430,7 @@ if [ "$filter_tag_name" ]; then if [ "$type" = "tag" ]; then # Dereference to a commit sha1t="$sha1" - sha1="$(git rev-parse "$sha1"^{commit} 2>/dev/null)" || continue + sha1="$(git rev-parse -q "$sha1"^{commit})" || continue fi [ -f "../map/$sha1" ] || continue diff --git a/git-merge-resolve.sh b/git-merge-resolve.sh index 93bcfc2f5d..c9da747fcf 100755 --- a/git-merge-resolve.sh +++ b/git-merge-resolve.sh @@ -37,10 +37,10 @@ then exit 2 fi -git update-index --refresh 2>/dev/null +git update-index -q --refresh git read-tree -u -m --aggressive $bases $head $remotes || exit 2 echo "Trying simple merge." -if result_tree=$(git write-tree 2>/dev/null) +if result_tree=$(git write-tree 2>/dev/null) then exit 0 else diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 695a4094bb..a296719861 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -2,7 +2,7 @@ # git-ls-remote could be called from outside a git managed repository; # this would fail in that case and would issue an error message. -GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) || :; +GIT_DIR=$(git rev-parse -q --git-dir) || :; get_data_source () { case "$1" in diff --git a/git-pull.sh b/git-pull.sh index 8c750270e9..35261539ab 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -147,7 +147,7 @@ then echo >&2 "Warning: fetch updated the current branch head." echo >&2 "Warning: fast forwarding your working tree from" echo >&2 "Warning: commit $orig_head." - git update-index --refresh 2>/dev/null + git update-index -q --refresh git read-tree -u -m "$orig_head" "$curr_head" || die 'Cannot fast-forward your working tree. After making sure that you saved anything precious from From 7613ea3595f3a56f0f9d827944775940f1e72ef6 Mon Sep 17 00:00:00 2001 From: Bill Pemberton Date: Wed, 22 Apr 2009 09:41:29 -0400 Subject: [PATCH 42/64] Add parsing of elm aliases to git-send-email elm stores a text file version of the aliases that is = = This adds the parsing of this file to git-send-email Signed-off-by: Bill Pemberton Signed-off-by: Junio C Hamano --- Documentation/git-send-email.txt | 2 +- git-send-email.perl | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 0b1f183ce8..794224b1b3 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -262,7 +262,7 @@ sendemail.aliasesfile:: sendemail.aliasfiletype:: Format of the file(s) specified in sendemail.aliasesfile. Must be - one of 'mutt', 'mailrc', 'pine', or 'gnus'. + one of 'mutt', 'mailrc', 'pine', 'elm', or 'gnus'. sendemail.multiedit:: If true (default), a single editor instance will be spawned to edit diff --git a/git-send-email.perl b/git-send-email.perl index 172b53c2d5..cccbf4517a 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -418,6 +418,14 @@ my %parse_alias = ( $x =~ /^(\S+)$f\t\(?([^\t]+?)\)?(:?$f){0,2}$/ or next; $aliases{$1} = [ split_addrs($2) ]; }}, + elm => sub { my $fh = shift; + while (<$fh>) { + if (/^(\S+)\s+=\s+[^=]+=\s(\S+)/) { + my ($alias, $addr) = ($1, $2); + $aliases{$alias} = [ split_addrs($addr) ]; + } + } }, + gnus => sub { my $fh = shift; while (<$fh>) { if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { $aliases{$1} = [ $2 ]; From c2318228ab327999520b2e5dbc9edbd619a73105 Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Thu, 23 Apr 2009 00:25:33 -0700 Subject: [PATCH 43/64] test-genrandom: Add newline to usage string A minor fix to place the terminal input on a new line if test-genrandom is run with no arguments. Signed-off-by: Stephen Boyd Signed-off-by: Junio C Hamano --- test-genrandom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-genrandom.c b/test-genrandom.c index 8cefe6cfed..8ad276d062 100644 --- a/test-genrandom.c +++ b/test-genrandom.c @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) unsigned char *c; if (argc < 2 || argc > 3) { - fprintf( stderr, "Usage: %s []", argv[0]); + fprintf(stderr, "Usage: %s []\n", argv[0]); return 1; } From 48d3448dd5700f9ea8a142935fd4263ba1fb79c6 Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Thu, 23 Apr 2009 02:37:56 -0700 Subject: [PATCH 44/64] config.txt: add missing format.{subjectprefix,cc,attach} variables Signed-off-by: Stephen Boyd Signed-off-by: Junio C Hamano --- Documentation/config.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Documentation/config.txt b/Documentation/config.txt index 35056e1a9c..a9055c94ac 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -707,6 +707,13 @@ fetch.unpackLimit:: especially on slow filesystems. If not set, the value of `transfer.unpackLimit` is used instead. +format.attach:: + Enable multipart/mixed attachments as the default for + 'format-patch'. The value can also be a double quoted string + which will enable attachments as the default and set the + value as the boundary. See the --attach option in + linkgit:git-format-patch[1]. + format.numbered:: A boolean which can enable or disable sequence numbers in patch subjects. It defaults to "auto" which enables it only if there @@ -718,6 +725,14 @@ format.headers:: Additional email headers to include in a patch to be submitted by mail. See linkgit:git-format-patch[1]. +format.cc:: + Additional "Cc:" headers to include in a patch to be submitted + by mail. See the --cc option in linkgit:git-format-patch[1]. + +format.subjectprefix:: + The default for format-patch is to output files with the '[PATCH]' + subject prefix. Use this variable to change that prefix. + format.suffix:: The default for format-patch is to output files with the suffix `.patch`. Use this variable to change that suffix (make sure to From fd1ff306b7a02f9412f8ed4881dd239d8a4a709a Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Thu, 23 Apr 2009 02:37:57 -0700 Subject: [PATCH 45/64] Documentation: use lowercase for shallow and deep threading Even when a sentence is started with 'shallow' or 'deep' use the lowercase version to maintain consistency. Signed-off-by: Stephen Boyd Signed-off-by: Junio C Hamano --- Documentation/config.txt | 4 ++-- Documentation/git-format-patch.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index a9055c94ac..0c1224a017 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -745,11 +745,11 @@ format.pretty:: format.thread:: The default threading style for 'git-format-patch'. Can be - either a boolean value, `shallow` or `deep`. 'Shallow' + either a boolean value, `shallow` or `deep`. `shallow` threading makes every mail a reply to the head of the series, where the head is chosen from the cover letter, the `\--in-reply-to`, and the first patch mail, in this order. - 'Deep' threading makes every mail a reply to the previous one. + `deep` threading makes every mail a reply to the previous one. A true boolean value is the same as `shallow`, and a false value disables threading. diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 5eddca92c4..4a43c64bb8 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -128,9 +128,9 @@ include::diff-options.txt[] the Message-Id header to reference. + The optional