From 8ee931e0a051b73c1128e8fa73ead9084c6d2e09 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 03 Dec 2012 21:29:32 -0500
Subject: [PATCH] Fixes to symlink handling (issue-174)

---
 src/com/gitblit/utils/CompressionUtils.java |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/com/gitblit/utils/CompressionUtils.java b/src/com/gitblit/utils/CompressionUtils.java
index 4145190..a8dcdd8 100644
--- a/src/com/gitblit/utils/CompressionUtils.java
+++ b/src/com/gitblit/utils/CompressionUtils.java
@@ -27,6 +27,7 @@
 import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.compress.compressors.CompressorException;
 import org.apache.commons.compress.compressors.CompressorStreamFactory;
+import org.apache.wicket.util.io.ByteArrayOutputStream;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.MutableObjectId;
@@ -256,7 +257,6 @@
 			}
 			tw.setRecursive(true);
 			MutableObjectId id = new MutableObjectId();
-			ObjectReader reader = tw.getObjectReader();
 			long modified = commit.getAuthorIdent().getWhen().getTime();
 			while (tw.next()) {
 				FileMode mode = tw.getFileMode(0);
@@ -265,16 +265,24 @@
 				}
 				tw.getObjectId(id, 0);
 				
-				TarArchiveEntry entry = new TarArchiveEntry(tw.getPathString());
-				entry.setSize(reader.getObjectSize(id, Constants.OBJ_BLOB));
-				
-				entry.setMode(mode.getBits());
-				entry.setModTime(modified);
-				tos.putArchiveEntry(entry);
-				
-				ObjectLoader ldr = repository.open(id);
-				ldr.copyTo(tos);					
-				tos.closeArchiveEntry();
+				ObjectLoader loader = repository.open(id);
+				if (FileMode.SYMLINK == mode) {
+					TarArchiveEntry entry = new TarArchiveEntry(tw.getPathString(),TarArchiveEntry.LF_SYMLINK);
+					ByteArrayOutputStream bos = new ByteArrayOutputStream();
+					loader.copyTo(bos);
+					entry.setLinkName(bos.toString());
+					entry.setModTime(modified);
+					tos.putArchiveEntry(entry);
+					tos.closeArchiveEntry();
+				} else {
+					TarArchiveEntry entry = new TarArchiveEntry(tw.getPathString());
+					entry.setMode(mode.getBits());
+					entry.setModTime(modified);
+					entry.setSize(loader.getSize());
+					tos.putArchiveEntry(entry);					
+					loader.copyTo(tos);
+					tos.closeArchiveEntry();
+				}
 			}
 			tos.finish();
 			tos.close();

--
Gitblit v1.9.1