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