From 252dc07d7f85cc344b5919bb7c6166ef84b2102e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gmail.com>
Date: Mon, 25 Jan 2016 11:55:58 -0500
Subject: [PATCH] Merge pull request #988 from gitblit/976-raw-download-filestore-item

---
 src/main/java/com/gitblit/models/FilestoreModel.java |   67 ++++++++++++++++++++++++++++++---
 1 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/gitblit/models/FilestoreModel.java b/src/main/java/com/gitblit/models/FilestoreModel.java
index 4144df6..2ed1ede 100644
--- a/src/main/java/com/gitblit/models/FilestoreModel.java
+++ b/src/main/java/com/gitblit/models/FilestoreModel.java
@@ -20,6 +20,10 @@
 import java.util.Date;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.gitblit.Constants;
 
 /**
  * A FilestoreModel represents a file stored outside a repository but referenced by the repository using a unique objectID
@@ -31,6 +35,18 @@
 
 	private static final long serialVersionUID = 1L;
 
+	private static final String metaRegexText = new StringBuilder()
+			.append("version\\shttps://git-lfs.github.com/spec/v1\\s+")
+			.append("oid\\ssha256:(" + Constants.REGEX_SHA256 + ")\\s+")
+			.append("size\\s([0-9]+)")
+			.toString();
+	
+	private static final Pattern metaRegex = Pattern.compile(metaRegexText);
+	
+	private static final int metaRegexIndexSHA = 1;
+	
+	private static final int metaRegexIndexSize = 2;
+	
 	public final String oid;
 	
 	private Long size;
@@ -43,6 +59,12 @@
 	//Access Control
 	private List<String> repositories;
 	
+	public FilestoreModel(String id, long definedSize) {
+		oid = id;
+		size = definedSize;
+		status = Status.ReferenceOnly;
+	}
+	
 	public FilestoreModel(String id, long expectedSize, UserModel user, String repo) {
 		oid = id;
 		size = expectedSize;
@@ -51,6 +73,29 @@
 		stateChangedOn = new Date();
 		repositories = new ArrayList<String>();
 		repositories.add(repo);
+	}
+	
+	/*
+	 * Attempts to create a FilestoreModel from the given meta string
+	 * 
+	 * @return A valid FilestoreModel if successful, otherwise null
+	 */
+	public static FilestoreModel fromMetaString(String meta) {
+		
+		Matcher m = metaRegex.matcher(meta);
+		
+		if (m.find()) {
+			try
+			{
+				final Long size = Long.parseLong(m.group(metaRegexIndexSize));
+				final String sha = m.group(metaRegexIndexSHA);
+				return new FilestoreModel(sha, size);			
+			} catch (Exception e) {
+				//Fail silent - it is not a valid filestore item
+			}
+		}
+
+		return null;
 	}
 	
 	public synchronized long getSize() {
@@ -102,19 +147,25 @@
 	}
 	
 	public synchronized void addRepository(String repo) {
-		if (!repositories.contains(repo)) {
-			repositories.add(repo);
-		}	
+		if (status != Status.ReferenceOnly) {
+			if (!repositories.contains(repo)) {
+				repositories.add(repo);
+			}
+		}
 	}
 	
 	public synchronized void removeRepository(String repo) {
-		repositories.remove(repo);
+		if (status != Status.ReferenceOnly) {
+			repositories.remove(repo);
+		}
 	}
 	
 	public synchronized boolean isInRepositoryList(List<String> repoList) {
-		for (String name : repositories) {
-			if (repoList.contains(name)) {
-				return true;
+		if (status != Status.ReferenceOnly) {
+			for (String name : repositories) {
+				if (repoList.contains(name)) {
+					return true;
+				}
 			}
 		}
 		return false;
@@ -122,6 +173,8 @@
 	
 	public static enum Status {
 
+		ReferenceOnly(-42),
+		
 		Deleted(-30),
 		AuthenticationRequired(-20),
 		

--
Gitblit v1.9.1