From a1a5a6347b4ac1005c5d9c2b636e906bf6c8ec12 Mon Sep 17 00:00:00 2001
From: Johannes Sixt <johannes.sixt@telecom.at>
Date: Wed, 6 Jun 2007 10:11:55 +0200
Subject: [PATCH 1/4] Accept dates before 2000/01/01 when specified as seconds
 since the epoch

Tests with git-filter-branch on a repository that was converted from
CVS and that has commits reaching back to 1999 revealed that it is
necessary to parse dates before 2000/01/01 when they are specified
as seconds since 1970/01/01. There is now still a limit, 100000000,
which is 1973/03/03 09:46:40 UTC, in order to allow that dates are
represented as 8 digits.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 date.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/date.c b/date.c
index a9b59a289e..4690371e55 100644
--- a/date.c
+++ b/date.c
@@ -414,9 +414,11 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt
 	num = strtoul(date, &end, 10);
 
 	/*
-	 * Seconds since 1970? We trigger on that for anything after Jan 1, 2000
+	 * Seconds since 1970? We trigger on that for any numbers with
+	 * more than 8 digits. This is because we don't want to rule out
+	 * numbers like 20070606 as a YYYYMMDD date.
 	 */
-	if (num > 946684800) {
+	if (num >= 100000000) {
 		time_t time = num;
 		if (gmtime_r(&time, tm)) {
 			*tm_gmt = 1;

From e59ade9f90de0eacdac06f52d39b74074fc664af Mon Sep 17 00:00:00 2001
From: Sam Vilain <sam.vilain@catalyst.net.nz>
Date: Thu, 7 Jun 2007 09:23:16 +1200
Subject: [PATCH 2/4] fix documentation of unpack-objects -n

unpack-objects -n didn't print the object list as promised on the
manual page, so alter the documentation to reflect the behaviour

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Documentation/git-unpack-objects.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.txt
index ff6184b0f7..b1b3ec9772 100644
--- a/Documentation/git-unpack-objects.txt
+++ b/Documentation/git-unpack-objects.txt
@@ -27,8 +27,8 @@ new packs and replace existing ones.
 OPTIONS
 -------
 -n::
-        Only list the objects that would be unpacked, don't actually unpack
-        them.
+        Dry run.  Check the pack file without actually unpacking
+	the objects.
 
 -q::
 	The command usually shows percentage progress.  This

From 23fcdc79713c47a6a0d50762b9311c9933a60d3f Mon Sep 17 00:00:00 2001
From: Michael Milligan <milli@acmeps.com>
Date: Tue, 5 Jun 2007 00:06:30 -0600
Subject: [PATCH 3/4] git-cvsimport: Make sure to use $git_dir always instead
 of .git sometimes

CVS import was failing on a couple repos I was trying to import.
I was setting GIT_DIR=newproj.git and using the -i flag, but this bug
was thwarting the effort...  evil CVS.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-cvsimport.perl | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index f68afe78a0..4e6c9c6cc7 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -692,8 +692,8 @@ sub commit {
 	if ($branch eq $opt_o && !$index{branch} && !get_headref($branch, $git_dir)) {
 	    # looks like an initial commit
 	    # use the index primed by git-init
-	    $ENV{GIT_INDEX_FILE} = '.git/index';
-	    $index{$branch} = '.git/index';
+	    $ENV{GIT_INDEX_FILE} = "$git_dir/index";
+	    $index{$branch} = "$git_dir/index";
 	} else {
 	    # use an index per branch to speed up
 	    # imports of projects with many branches
@@ -984,7 +984,7 @@ if ($line =~ /^(\d+) objects, (\d+) kilobytes$/) {
 }
 
 foreach my $git_index (values %index) {
-    if ($git_index ne '.git/index') {
+    if ($git_index ne "$git_dir/index") {
 	unlink($git_index);
     }
 }

From e2ac7cb5fbcf1407003aa07cdcd14141527ea2e3 Mon Sep 17 00:00:00 2001
From: Sam Vilain <sam.vilain@catalyst.net.nz>
Date: Wed, 6 Jun 2007 22:25:17 +1200
Subject: [PATCH 4/4] Don't assume tree entries that are not dirs are blobs

When scanning the trees in track_tree_refs() there is a "lazy" test
that assumes that entries are either directories or files.  Don't do
that.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 object.c | 3 +++
 tree.c   | 7 ++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/object.c b/object.c
index cfc4969ed9..16793d9958 100644
--- a/object.c
+++ b/object.c
@@ -160,8 +160,11 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
 		parse_tag_buffer(tag, buffer, size);
 		obj = &tag->object;
 	} else {
+		warning("object %s has unknown type id %d\n", sha1_to_hex(sha1), type);
 		obj = NULL;
 	}
+	if (obj && obj->type == OBJ_NONE)
+		obj->type = type;
 	*eaten_p = eaten;
 	return obj;
 }
diff --git a/tree.c b/tree.c
index e4a39aa3c3..e946dac069 100644
--- a/tree.c
+++ b/tree.c
@@ -173,8 +173,13 @@ static void track_tree_refs(struct tree *item)
 			continue;
 		if (S_ISDIR(entry.mode))
 			obj = &lookup_tree(entry.sha1)->object;
-		else
+		else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode))
 			obj = &lookup_blob(entry.sha1)->object;
+		else {
+			warning("in tree %s: entry %s has bad mode %.6o\n",
+			     sha1_to_hex(item->object.sha1), entry.path, entry.mode);
+			obj = lookup_unknown_object(entry.sha1);
+		}
 		refs->ref[i++] = obj;
 	}
 	set_object_refs(&item->object, refs);