From 13417cf9c6eec555b51da49742e47939d2f5715b Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 19 Oct 2012 22:47:33 -0400 Subject: [PATCH] Exclude submodules from zip downloads (issue 151) --- src/com/gitblit/utils/FileUtils.java | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 108 insertions(+), 0 deletions(-) diff --git a/src/com/gitblit/utils/FileUtils.java b/src/com/gitblit/utils/FileUtils.java index 29c9d0f..cba88d0 100644 --- a/src/com/gitblit/utils/FileUtils.java +++ b/src/com/gitblit/utils/FileUtils.java @@ -34,6 +34,71 @@ * */ public class FileUtils { + + /** 1024 (number of bytes in one kilobyte) */ + public static final int KB = 1024; + + /** 1024 {@link #KB} (number of bytes in one megabyte) */ + public static final int MB = 1024 * KB; + + /** 1024 {@link #MB} (number of bytes in one gigabyte) */ + public static final int GB = 1024 * MB; + + /** + * Returns an int from a string representation of a file size. + * e.g. 50m = 50 megabytes + * + * @param aString + * @param defaultValue + * @return an int value or the defaultValue if aString can not be parsed + */ + public static int convertSizeToInt(String aString, int defaultValue) { + return (int) convertSizeToLong(aString, defaultValue); + } + + /** + * Returns a long from a string representation of a file size. + * e.g. 50m = 50 megabytes + * + * @param aString + * @param defaultValue + * @return a long value or the defaultValue if aString can not be parsed + */ + public static long convertSizeToLong(String aString, long defaultValue) { + // trim string and remove all spaces + aString = aString.toLowerCase().trim(); + StringBuilder sb = new StringBuilder(); + for (String a : aString.split(" ")) { + sb.append(a); + } + aString = sb.toString(); + + // identify value and unit + int idx = 0; + int len = aString.length(); + while (Character.isDigit(aString.charAt(idx))) { + idx++; + if (idx == len) { + break; + } + } + long value = 0; + String unit = null; + try { + value = Long.parseLong(aString.substring(0, idx)); + unit = aString.substring(idx); + } catch (Exception e) { + return defaultValue; + } + if (unit.equals("g") || unit.equals("gb")) { + return value * GB; + } else if (unit.equals("m") || unit.equals("mb")) { + return value * MB; + } else if (unit.equals("k") || unit.equals("kb")) { + return value * KB; + } + return defaultValue; + } /** * Returns the string content of the specified file. @@ -149,4 +214,47 @@ } } } + + /** + * Determine the relative path between two files. Takes into account + * canonical paths, if possible. + * + * @param basePath + * @param path + * @return a relative path from basePath to path + */ + public static String getRelativePath(File basePath, File path) { + File exactBase = getExactFile(basePath); + File exactPath = getExactFile(path); + if (path.getAbsolutePath().startsWith(basePath.getAbsolutePath())) { + // absolute base-path match + return StringUtils.getRelativePath(basePath.getAbsolutePath(), path.getAbsolutePath()); + } else if (exactPath.getPath().startsWith(exactBase.getPath())) { + // canonical base-path match + return StringUtils.getRelativePath(exactBase.getPath(), exactPath.getPath()); + } else if (exactPath.getPath().startsWith(basePath.getAbsolutePath())) { + // mixed path match + return StringUtils.getRelativePath(basePath.getAbsolutePath(), exactPath.getPath()); + } else if (path.getAbsolutePath().startsWith(exactBase.getPath())) { + // mixed path match + return StringUtils.getRelativePath(exactBase.getPath(), path.getAbsolutePath()); + } + // no relative relationship + return null; + } + + /** + * Returns the exact path for a file. This path will be the canonical path + * unless an exception is thrown in which case it will be the absolute path. + * + * @param path + * @return the exact file + */ + public static File getExactFile(File path) { + try { + return path.getCanonicalFile(); + } catch (IOException e) { + return path.getAbsoluteFile(); + } + } } -- Gitblit v1.9.1