From ed552ba47c02779c270ffd62841d6d1048dade70 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 22 Nov 2015 14:37:16 -0500
Subject: [PATCH] Merge branch 'develop'

---
 src/main/bugtraq/com/syntevo/bugtraq/BugtraqConfig.java |  157 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 95 insertions(+), 62 deletions(-)

diff --git a/src/main/bugtraq/com/syntevo/bugtraq/BugtraqConfig.java b/src/main/bugtraq/com/syntevo/bugtraq/BugtraqConfig.java
index 1512a9b..60b4ecc 100644
--- a/src/main/bugtraq/com/syntevo/bugtraq/BugtraqConfig.java
+++ b/src/main/bugtraq/com/syntevo/bugtraq/BugtraqConfig.java
@@ -29,10 +29,8 @@
  */
 package com.syntevo.bugtraq;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -45,10 +43,9 @@
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
@@ -62,51 +59,98 @@
 	// Constants ==============================================================
 
 	private static final String DOT_GIT_BUGTRAQ = ".gitbugtraq";
+	private static final String DOT_TGITCONFIG = ".tgitconfig";
 
 	private static final String BUGTRAQ = "bugtraq";
 
 	private static final String URL = "url";
 	private static final String ENABLED = "enabled";
-	private static final String LOG_REGEX = "logRegex";
+	private static final String LOG_REGEX = "logregex";
+	private static final String LOG_FILTERREGEX = "logfilterregex";
+	private static final String LOG_LINKREGEX = "loglinkregex";
+	private static final String LOG_LINKTEXT = "loglinktext";
 
 	// Static =================================================================
 
 	@Nullable
 	public static BugtraqConfig read(@NotNull Repository repository) throws IOException, ConfigInvalidException {
-		final Config baseConfig = getBaseConfig(repository);
+		Config baseConfig = getBaseConfig(repository, DOT_GIT_BUGTRAQ);
+		if (baseConfig == null) {
+			baseConfig = getBaseConfig(repository, DOT_TGITCONFIG);
+		}
+
 		final Set<String> allNames = new HashSet<String>();
-		final Config config = repository.getConfig();
-		allNames.addAll(config.getSubsections(BUGTRAQ));
-		if (baseConfig != null) {
-			allNames.addAll(baseConfig.getSubsections(BUGTRAQ));
+		final Config config;
+		try {
+			config = repository.getConfig();
+		}
+		catch (RuntimeException ex) {
+			final Throwable cause = ex.getCause();
+			if (cause instanceof IOException) {
+				throw (IOException)cause;
+			}
+			throw ex;
+		}
+		if (getString(null, URL, config, baseConfig) != null) {
+			allNames.add(null);
+		}
+		else {
+			allNames.addAll(config.getSubsections(BUGTRAQ));
+			if (baseConfig != null) {
+				allNames.addAll(baseConfig.getSubsections(BUGTRAQ));
+			}
 		}
 
 		final List<BugtraqEntry> entries = new ArrayList<BugtraqEntry>();
 		for (String name : allNames) {
 			final String url = getString(name, URL, config, baseConfig);
+			if (url == null) {
+				continue;
+			}
+
 			final String enabled = getString(name, ENABLED, config, baseConfig);
 			if (enabled != null && !"true".equals(enabled)) {
 				continue;
 			}
 
-			final String logIdRegex = getString(name, LOG_REGEX, config, baseConfig);
-			if (url == null || logIdRegex == null) {
+			String idRegex = getString(name, LOG_REGEX, config, baseConfig);
+			if (idRegex == null) {
 				return null;
 			}
 
-			final List<String> logIdRegexs = new ArrayList<String>();
-			logIdRegexs.add(logIdRegex);
-
-			for (int index = 1; index < Integer.MAX_VALUE; index++) {
-				final String logIdRegexN = getString(name, LOG_REGEX + index, config, baseConfig);
-				if (logIdRegexN == null) {
-					break;
+			String filterRegex = getString(name, LOG_FILTERREGEX, config, baseConfig);
+			final String linkRegex = getString(name, LOG_LINKREGEX, config, baseConfig);
+			if (filterRegex == null && linkRegex == null) {
+				final String[] split = idRegex.split("\n", Integer.MAX_VALUE);
+				if (split.length == 2) {
+					// Compatibility with TortoiseGit
+					filterRegex = split[0];
+					idRegex = split[1];
 				}
+				else {
+					// Backwards compatibility with specification version < 0.3
+					final List<String> logIdRegexs = new ArrayList<String>();
+					for (int index = 1; index < Integer.MAX_VALUE; index++) {
+						final String logIdRegexN = getString(name, LOG_REGEX + index, config, baseConfig);
+						if (logIdRegexN == null) {
+							break;
+						}
 
-				logIdRegexs.add(logIdRegexN);
+						logIdRegexs.add(logIdRegexN);
+					}
+
+					if (logIdRegexs.size() > 1) {
+						throw new ConfigInvalidException("More than three " + LOG_REGEX + " entries found. This is not supported anymore since bugtraq version 0.3, use " + LOG_FILTERREGEX + " and " + LOG_LINKREGEX + " instead.");
+					}
+					else if (logIdRegexs.size() == 1) {
+						filterRegex = idRegex;
+						idRegex = logIdRegexs.get(0);
+					}
+				}
 			}
 
-			entries.add(new BugtraqEntry(url, logIdRegexs));
+			final String linkText = getString(name, LOG_LINKTEXT, config, baseConfig);
+			entries.add(new BugtraqEntry(url, idRegex, linkRegex, filterRegex, linkText));
 		}
 
 		if (entries.isEmpty()) {
@@ -137,67 +181,56 @@
 	// Utils ==================================================================
 
 	@Nullable
-	private static Config getBaseConfig(Repository repository) throws IOException, ConfigInvalidException {
+	private static Config getBaseConfig(@NotNull Repository repository, @NotNull String configFileName) throws IOException, ConfigInvalidException {
 		final Config baseConfig;
 		if (repository.isBare()) {
 			// read bugtraq config directly from the repository
 			String content = null;
-			String head = repository.getFullBranch();
 			RevWalk rw = new RevWalk(repository);
 			TreeWalk tw = new TreeWalk(repository);
-			tw.setFilter(PathFilterGroup.createFromStrings(DOT_GIT_BUGTRAQ));
+			tw.setFilter(PathFilterGroup.createFromStrings(configFileName));
 			try {
-				ObjectId headId = repository.resolve(head);
+				final Ref ref = repository.getRef(Constants.HEAD);
+				if (ref == null) {
+					return null;
+				}
+
+				ObjectId headId = ref.getTarget().getObjectId();
+				if (headId == null || ObjectId.zeroId().equals(headId)) {
+					return null;
+				}
 				RevCommit commit = rw.parseCommit(headId);
 				RevTree tree = commit.getTree();
 				tw.reset(tree);
 				while (tw.next()) {
-					if (tw.isSubtree()) {
-						tw.enterSubtree();
-						continue;
-					}
 					ObjectId entid = tw.getObjectId(0);
 					FileMode entmode = tw.getFileMode(0);
-					if (entmode == FileMode.REGULAR_FILE) {
-						RevObject ro = rw.lookupAny(entid, entmode.getObjectType());
-						rw.parseBody(ro);
-						ByteArrayOutputStream os = new ByteArrayOutputStream();
-						ObjectLoader ldr = repository.open(ro.getId(), Constants.OBJ_BLOB);
-						byte[] tmp = new byte[4096];
-						InputStream in = ldr.openStream();
-						int n;
-						while ((n = in.read(tmp)) > 0) {
-							os.write(tmp, 0, n);
-						}
-						in.close();
-						content = new String(os.toByteArray(), commit.getEncoding());
+					if (FileMode.REGULAR_FILE == entmode) {
+						ObjectLoader ldr = repository.open(entid, Constants.OBJ_BLOB);
+						content = new String(ldr.getCachedBytes(), commit.getEncoding());
+						break;
 					}
 				}
-			} finally {
+			}
+			finally {
 				rw.dispose();
-				tw.release();
+				tw.close();
 			}
 
 			if (content == null) {
 				// config not found
 				baseConfig = null;
-			} else {
-				// parse the config
-				Config cfg = new Config();
-				cfg.fromText(content);
-				baseConfig = new StoredConfig(cfg) {
-					@Override
-					public void save() throws IOException {
-					}
-
-					@Override
-					public void load() throws IOException, ConfigInvalidException {
-					}
-				};
 			}
-		} else {
+			else {
+				// parse the config
+				Config config = new Config();
+				config.fromText(content);
+				baseConfig = config;
+			}
+		}
+		else {
 			// read bugtraq config from work tree
-			final File baseFile = new File(repository.getWorkTree(), DOT_GIT_BUGTRAQ);
+			final File baseFile = new File(repository.getWorkTree(), configFileName);
 			if (baseFile.isFile()) {
 				FileBasedConfig fileConfig = new FileBasedConfig(baseFile, repository.getFS());
 				fileConfig.load();
@@ -211,7 +244,7 @@
 	}
 
 	@Nullable
-	private static String getString(@NotNull String subsection, @NotNull String key, @NotNull Config config, @Nullable Config baseConfig) {
+	private static String getString(@Nullable String subsection, @NotNull String key, @NotNull Config config, @Nullable Config baseConfig) {
 		final String value = config.getString(BUGTRAQ, subsection, key);
 		if (value != null) {
 			return trimMaybeNull(value);
@@ -221,8 +254,8 @@
 			return trimMaybeNull(baseConfig.getString(BUGTRAQ, subsection, key));
 		}
 
-		return value;
-	}
+			return value;
+		}
 
 	@Nullable
 	private static String trimMaybeNull(@Nullable String string) {

--
Gitblit v1.9.1