diff options
author | James Moger <james.moger@gmail.com> | 2016-01-25 11:55:58 -0500 |
---|---|---|
committer | James Moger <james.moger@gmail.com> | 2016-01-25 11:55:58 -0500 |
commit | 252dc07d7f85cc344b5919bb7c6166ef84b2102e (patch) | |
tree | d997964fb207d0bb321570ae76ed3a7281f502d2 /src/main/java/com/gitblit/models/FilestoreModel.java | |
parent | 040091508e69df76b1504d10089444e8d6bae2ab (diff) | |
parent | 46f33f87750573713509fbdbd0fc2ae51dc12044 (diff) | |
download | gitblit-252dc07d7f85cc344b5919bb7c6166ef84b2102e.tar.gz gitblit-252dc07d7f85cc344b5919bb7c6166ef84b2102e.zip |
Merge pull request #988 from gitblit/976-raw-download-filestore-item
Fix for #976 - Filestore links via browser
Diffstat (limited to 'src/main/java/com/gitblit/models/FilestoreModel.java')
-rw-r--r-- | 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 4144df6b..2ed1ede9 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.ArrayList; 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 @@ public class FilestoreModel implements Serializable { 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 @@ public class FilestoreModel implements Serializable { //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; @@ -53,6 +75,29 @@ public class FilestoreModel implements Serializable { 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() { return size; } @@ -102,19 +147,25 @@ public class FilestoreModel implements Serializable { } 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 class FilestoreModel implements Serializable { public static enum Status { + ReferenceOnly(-42), + Deleted(-30), AuthenticationRequired(-20), |