From 1a97beb8cfcbc07eff7f4712049810d86e0d5d85 Mon Sep 17 00:00:00 2001 From: nazoking Date: Mon, 12 Oct 2015 21:45:36 +0900 Subject: [PATCH 1/3] (ref #933) fix/Unable to download large file --- .../RepositoryViewerController.scala | 8 ++++++-- .../scala/gitbucket/core/util/JGitUtil.scala | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 680486ff4..ab431cd14 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -293,8 +293,12 @@ trait RepositoryViewerControllerBase extends ControllerBase { getPathObjectId(git, path, revCommit).map { objectId => if(raw){ // Download - JGitUtil.getContentFromId(git, objectId, true).map { bytes => - RawData("application/octet-stream", bytes) + JGitUtil.getObjectLoaderFromId(git, objectId){ loader => + //RawData("application/octet-stream", bytes) + contentType = "application/octet-stream" + response.setContentLength(loader.getSize.toInt) + loader.copyTo(response.getOutputStream) + Unit } getOrElse NotFound } else { html.blob(id, repository, path.split("/").toList, diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 3eef33d19..4d48c763f 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -713,7 +713,7 @@ object JGitUtil { def getContentFromId(git: Git, id: ObjectId, fetchLargeFile: Boolean): Option[Array[Byte]] = try { using(git.getRepository.getObjectDatabase){ db => val loader = db.open(id) - if(fetchLargeFile == false && FileUtil.isLarge(loader.getSize)){ + if(loader.isLarge || (fetchLargeFile == false && FileUtil.isLarge(loader.getSize))){ None } else { Some(loader.getBytes) @@ -723,6 +723,22 @@ object JGitUtil { case e: MissingObjectException => None } + /** + * Get objectLoader of the given object id from the Git repository. + * + * @param git the Git object + * @param id the object id + * @param f the function process ObjectLoader + * @return None if object does not exist + */ + def loaderFromId[A](git: Git, id: ObjectId)(f: ObjectLoader => A):Option[A] = try { + using(git.getRepository.getObjectDatabase){ db => + Some(f(db.open(id))) + } + } catch { + case e: MissingObjectException => None + } + /** * Returns all commit id in the specified repository. */ From 5194fc5f15eacd9fbef54a88ad223673c2b217de Mon Sep 17 00:00:00 2001 From: nazoking Date: Mon, 12 Oct 2015 23:24:36 +0900 Subject: [PATCH 2/3] (ref #933) fix/Unable to download large file (fix method name) --- src/main/scala/gitbucket/core/util/JGitUtil.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 4d48c763f..43c25212d 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -731,7 +731,7 @@ object JGitUtil { * @param f the function process ObjectLoader * @return None if object does not exist */ - def loaderFromId[A](git: Git, id: ObjectId)(f: ObjectLoader => A):Option[A] = try { + def getObjectLoaderFromId[A](git: Git, id: ObjectId)(f: ObjectLoader => A):Option[A] = try { using(git.getRepository.getObjectDatabase){ db => Some(f(db.open(id))) } From a1efa607418f824755cb030db13f170a8cada76c Mon Sep 17 00:00:00 2001 From: nazoking Date: Tue, 13 Oct 2015 18:57:20 +0900 Subject: [PATCH 3/3] fix return value --- .../gitbucket/core/controller/RepositoryViewerController.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index ab431cd14..27afd4787 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -298,7 +298,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { contentType = "application/octet-stream" response.setContentLength(loader.getSize.toInt) loader.copyTo(response.getOutputStream) - Unit + () } getOrElse NotFound } else { html.blob(id, repository, path.split("/").toList,