From b753682ec04c89c8ebb5b451d7d82661ffa31391 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Thu, 28 Apr 2016 15:43:17 -0400
Subject: [PATCH] Merge pull request #1070 from gitblit/1061-filestoreSortByDate

---
 src/main/java/com/gitblit/models/FilestoreModel.java |   74 +++++++++++++++++++++++++++++++++----
 1 files changed, 66 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/gitblit/models/FilestoreModel.java b/src/main/java/com/gitblit/models/FilestoreModel.java
index 4144df6..40b51e0 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
@@ -27,10 +31,22 @@
  * @author Paul Martin
  *
  */
-public class FilestoreModel implements Serializable {
+public class FilestoreModel implements Serializable, Comparable<FilestoreModel> {
 
 	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),
 		
@@ -164,5 +217,10 @@
 		}
 	}
 
+	@Override
+	public int compareTo(FilestoreModel o) {
+		return this.oid.compareTo(o.oid);
+	}
+
 }
 

--
Gitblit v1.9.1