From 82881b38235d0a46a4486dc5dc819c5d0ee3f2c1 Mon Sep 17 00:00:00 2001 From: Matthew Ogilvie Date: Tue, 22 Apr 2008 12:19:12 -0600 Subject: [PATCH 01/10] gitattributes: Fix subdirectory attributes specified from root directory Signed-off-by: Matthew Ogilvie Signed-off-by: Junio C Hamano --- attr.c | 4 +++- t/t0003-attributes.sh | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/attr.c b/attr.c index 64b77b166..1a15fad29 100644 --- a/attr.c +++ b/attr.c @@ -546,7 +546,9 @@ static int path_matches(const char *pathname, int pathlen, (baselen && pathname[baselen] != '/') || strncmp(pathname, base, baselen)) return 0; - return fnmatch(pattern, pathname + baselen + 1, FNM_PATHNAME) == 0; + if (baselen != 0) + baselen++; + return fnmatch(pattern, pathname + baselen, FNM_PATHNAME) == 0; } static int fill_one(const char *what, struct match_attr *a, int rem) diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 47f08a46c..e7fa4f5d4 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -21,6 +21,7 @@ test_expect_success 'setup' ' mkdir -p a/b/d a/c && ( echo "f test=f" + echo "a/i test=a/i" ) >.gitattributes && ( echo "g test=a/g" && @@ -46,4 +47,11 @@ test_expect_success 'attribute test' ' ' +test_expect_success 'root subdir attribute test' ' + + attr_check a/i a/i && + attr_check subdir/a/i unspecified + +' + test_done From 8b1f6de854ae95eb3f4225a71aad29ca086cfd2e Mon Sep 17 00:00:00 2001 From: Ariel Badichi Date: Wed, 23 Apr 2008 04:05:29 +0300 Subject: [PATCH 02/10] copy.c: copy_fd - correctly report write errors Previously, the errno could have been lost due to an intervening close() call. This patch also contains minor cosmetic changes. Signed-off-by: Ariel Badichi Signed-off-by: Junio C Hamano --- copy.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/copy.c b/copy.c index afc4fbf41..e54d15ace 100644 --- a/copy.c +++ b/copy.c @@ -9,8 +9,7 @@ int copy_fd(int ifd, int ofd) if (!len) break; if (len < 0) { - int read_error; - read_error = errno; + int read_error = errno; close(ifd); return error("copy-fd: read returned %s", strerror(read_error)); @@ -25,9 +24,10 @@ int copy_fd(int ifd, int ofd) close(ifd); return error("copy-fd: write returned 0"); } else { + int write_error = errno; close(ifd); return error("copy-fd: write returned %s", - strerror(errno)); + strerror(write_error)); } } } @@ -48,7 +48,7 @@ int copy_file(const char *dst, const char *src, int mode) } status = copy_fd(fdi, fdo); if (close(fdo) != 0) - return error("%s: write error: %s", dst, strerror(errno)); + return error("%s: close error: %s", dst, strerror(errno)); if (!status && adjust_shared_perm(dst)) return -1; From 75b7dfbdc030cfc6f09a6317444c36c4957a9133 Mon Sep 17 00:00:00 2001 From: Ariel Badichi Date: Wed, 23 Apr 2008 04:06:27 +0300 Subject: [PATCH 03/10] archive.c: format_subst - fixed bogus argument to memchr Also removed a superfluous test. Signed-off-by: Ariel Badichi Signed-off-by: Junio C Hamano --- archive.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archive.c b/archive.c index fb159fe59..7a32c19d3 100644 --- a/archive.c +++ b/archive.c @@ -16,9 +16,9 @@ static void format_subst(const struct commit *commit, const char *b, *c; b = memmem(src, len, "$Format:", 8); - if (!b || src + len < b + 9) + if (!b) break; - c = memchr(b + 8, '$', len - 8); + c = memchr(b + 8, '$', (src + len) - b - 8); if (!c) break; From 9231f500c394ede405fcfdca151dd7758ce99ced Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Tue, 22 Apr 2008 06:07:47 -0400 Subject: [PATCH 04/10] git-svn bug with blank commits and author file When trying to import from svn using an author file, git-svn bails out if it encounters a blank author. The attached patch changes this behavior and allow using the author file with blanks authors. I came across this bug while importing from a cvs2svn repo where the initial revision (1) has a blank author. This doesn't break the behavior of bailing out when an unknown author is encountered. Acked-by: Eric Wong Signed-off-by: Junio C Hamano --- git-svn.perl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index e0434099c..fcfe4eeaa 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -2363,8 +2363,7 @@ sub check_author { my ($author) = @_; if (!defined $author || length $author == 0) { $author = '(no author)'; - } - if (defined $::_authors && ! defined $::users{$author}) { + } elsif (defined $::_authors && ! defined $::users{$author}) { die "Author: $author not defined in $::_authors file\n"; } $author; From 2498a1ad0b0fc06f1fd40074b9bb55eb3d7ae094 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Thu, 3 Apr 2008 13:26:13 -0500 Subject: [PATCH 05/10] git-clone.txt: Adjust note to --shared for new pruning behavior of git-gc Since git-gc now always calls prune, even with --auto, unreferenced objects may be removed by more operations than just git-gc. This is important for clones created using --shared or --reference. Signed-off-by: Brandon Casey Signed-off-by: Dmitry Potapov Signed-off-by: Junio C Hamano --- Documentation/git-clone.txt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 975824301..9b564420c 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -65,10 +65,13 @@ OPTIONS + *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand what it does. If you clone your -repository using this option, then delete branches in the -source repository and then run linkgit:git-gc[1] using the -'--prune' option in the source repository, it may remove -objects which are referenced by the cloned repository. +repository using this option and then delete branches (or use any +other git command that makes any existing commit unreferenced) in the +source repository, some objects may become unreferenced (or dangling). +These objects may be removed by normal git operations (such as git-commit[1]) +which automatically call git-gc[1]. If these objects are removed and +were referenced by the cloned repository, then the cloned repository +will become corrupt. @@ -79,6 +82,8 @@ objects which are referenced by the cloned repository. an already existing repository as an alternate will require fewer objects to be copied from the repository being cloned, reducing network and local storage costs. ++ +*NOTE*: see NOTE to --shared option. --quiet:: -q:: From 34b5cd1fe9f9130b747388a1a968a8d4c9906865 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Tue, 22 Apr 2008 06:41:47 -0400 Subject: [PATCH 06/10] Don't force imap.host to be set when imap.tunnel is set The documentation for git-imap-send suggests a tunnel setting such as Tunnel = "ssh -q user@server.com /usr/bin/imapd ./Maildir 2> /dev/null" which works wonderfully and doesn't require a username, password or port setting. However, git-imap-send currently requires that the imap.host variable be set in the config even when it was unused. This patch changes imap-send to only require that the imap.host setting is set if imap.tunnel is not set. Otherwise, server.host is set to "tunnel" for reporting purposes. Acked-by: Andy Parkins Signed-off-by: Junio C Hamano --- imap-send.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/imap-send.c b/imap-send.c index 04afbc492..db6559725 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1303,8 +1303,11 @@ main(int argc, char **argv) return 1; } if (!server.host) { - fprintf( stderr, "no imap host specified\n" ); - return 1; + if (!server.tunnel) { + fprintf( stderr, "no imap host specified\n" ); + return 1; + } + server.host = "tunnel"; } /* read the messages */ From a6f47b2be43fbe70236316edc6c87ad9522c485d Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 22 Apr 2008 14:23:48 +0200 Subject: [PATCH 07/10] diff options documentation: refer to --diff-filter in --name-status git diff --name-status outputs letters, but the meaning of those letters is documented elsewhere. Add a note to make the manpage more intuitive. Signed-off-by: Miklos Vajna Signed-off-by: Junio C Hamano --- Documentation/diff-options.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 8d35cbd60..60d0e53a7 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -75,7 +75,8 @@ endif::git-format-patch[] Show only names of changed files. --name-status:: - Show only names and status of changed files. + Show only names and status of changed files. See the description + of the `--diff-filter` option on what the status letters mean. --color:: Show colored diff. From 4f7ec7970874d09be162bc7f16415a0ec2d36ae5 Mon Sep 17 00:00:00 2001 From: Michael Weber Date: Fri, 18 Apr 2008 15:12:04 +0200 Subject: [PATCH 08/10] svn-git: Use binmode for reading/writing binary rev maps Otherwise, there is a possible interaction with UTF-8 locales in combination with PERL_UNICODE, resulting in "inconsistent size: 40" or "read:"-type errors. See also: perldoc -f binmode Signed-off-by: Michael Weber Acked-by: Eric Wong Signed-off-by: Junio C Hamano --- git-svn.perl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/git-svn.perl b/git-svn.perl index fcfe4eeaa..49dd80644 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -2506,6 +2506,7 @@ sub rebuild_from_rev_db { my ($self, $path) = @_; my $r = -1; open my $fh, '<', $path or croak "open: $!"; + binmode $fh or croak "binmode: $!"; while (<$fh>) { length($_) == 41 or croak "inconsistent size in ($_) != 41"; chomp($_); @@ -2603,6 +2604,7 @@ sub rebuild { sub _rev_map_set { my ($fh, $rev, $commit) = @_; + binmode $fh or croak "binmode: $!"; my $size = (stat($fh))[7]; ($size % 24) == 0 or croak "inconsistent size: $size"; @@ -2706,6 +2708,7 @@ sub rev_map_max { my $map_path = $self->map_path; stat $map_path or return $want_commit ? (0, undef) : 0; sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!"; + binmode $fh or croak "binmode: $!"; my $size = (stat($fh))[7]; ($size % 24) == 0 or croak "inconsistent size: $size"; @@ -2738,6 +2741,7 @@ sub rev_map_get { return undef unless -e $map_path; sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!"; + binmode $fh or croak "binmode: $!"; my $size = (stat($fh))[7]; ($size % 24) == 0 or croak "inconsistent size: $size"; From 208641cf850125a23ccca99630ea2caa70953e44 Mon Sep 17 00:00:00 2001 From: Dmitry Potapov Date: Mon, 14 Apr 2008 16:17:31 +0400 Subject: [PATCH 09/10] git-gc --prune is deprecated 25ee9731c137d0a24b0f4879eb0b0cce9b77d5b0 made the '--prune' option deprecated and removed its description from the git-gc man page. This patch removes all references to this option from the rest of the Git documentation. Signed-off-by: Junio C Hamano --- Documentation/everyday.txt | 6 ++---- Documentation/user-manual.txt | 17 +---------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/Documentation/everyday.txt b/Documentation/everyday.txt index fdbd15a18..e598cdda4 100644 --- a/Documentation/everyday.txt +++ b/Documentation/everyday.txt @@ -48,14 +48,12 @@ $ git gc <3> repository health reasonably well. <2> check how many loose objects there are and how much disk space is wasted by not repacking. -<3> repacks the local repository and performs other housekeeping tasks. Running -without `--prune` is a safe operation even while other ones are in progress. +<3> repacks the local repository and performs other housekeeping tasks. Repack a small project into single pack.:: + ------------ $ git gc <1> -$ git gc --prune ------------ + <1> pack all the objects reachable from the refs into one pack, @@ -182,7 +180,7 @@ $ git pull <3> $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <4> $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5> $ git reset --hard ORIG_HEAD <6> -$ git gc --prune <7> +$ git gc <7> $ git fetch --tags <8> ------------ + diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 565aeb980..86b91a53e 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1548,22 +1548,7 @@ dangling tree b24c2473f1fd3d91352a624795be026d64c8841f Dangling objects are not a problem. At worst they may take up a little extra disk space. They can sometimes provide a last-resort method for -recovering lost work--see <> for details. However, if -you wish, you can remove them with linkgit:git-prune[1] or the `--prune` -option to linkgit:git-gc[1]: - -------------------------------------------------- -$ git gc --prune -------------------------------------------------- - -This may be time-consuming. Unlike most other git operations (including -git-gc when run without any options), it is not safe to prune while -other git operations are in progress in the same repository. - -If linkgit:git-fsck[1] complains about sha1 mismatches or missing -objects, you may have a much more serious problem; your best option is -probably restoring from backups. See -<> for a detailed discussion. +recovering lost work--see <> for details. [[recovering-lost-changes]] Recovering lost changes From 491b1b11213c373a3e91004b1ab775d7e52ac1f3 Mon Sep 17 00:00:00 2001 From: Sam Vilain Date: Mon, 21 Apr 2008 15:31:24 +1200 Subject: [PATCH 10/10] Amend git-push refspec documentation These paragraphs are a little confusing. Also, make it clearer when you have to specify the full name for Signed-off-by: Sam Vilain Signed-off-by: Junio C Hamano --- Documentation/git-push.txt | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 3128170bc..058594913 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -35,14 +35,15 @@ OPTIONS by the source ref, followed by a colon `:`, followed by the destination ref. + -The side can be an -arbitrary "SHA1 expression" that can be used as an -argument to `git-cat-file -t`. E.g. `master~4` (push -four parents before the current master head). +The side represents the source branch (or arbitrary +"SHA1 expression", such as `master~4` (four parents before the +tip of `master` branch); see linkgit:git-rev-parse[1]) that you +want to push. The side represents the destination location. + The local ref that matches is used -to fast forward the remote ref that matches . If -the optional plus `+` is used, the remote ref is updated +to fast forward the remote ref that matches (or, if no was +specified, the same ref that referred to locally). If +the optional leading plus `+` is used, the remote ref is updated even if it does not result in a fast forward update. + Note: If no explicit refspec is found, (that is neither @@ -165,7 +166,8 @@ git push origin master:: Find a ref that matches `master` in the source repository (most likely, it would find `refs/heads/master`), and update the same ref (e.g. `refs/heads/master`) in `origin` repository - with it. + with it. If `master` did not exist remotely, it would be + created. git push origin :experimental:: Find a ref that matches `experimental` in the `origin` repository @@ -179,9 +181,10 @@ git push origin master:satellite/master:: git push origin master:refs/heads/experimental:: Create the branch `experimental` in the `origin` repository - by copying the current `master` branch. This form is usually - needed to create a new branch in the remote repository as - there is no `experimental` branch to match. + by copying the current `master` branch. This form is only + needed to create a new branch or tag in the remote repository when + the local name and the remote name are different; otherwise, + the ref name on its own will work. Author ------