From 676b72cdc1a4ee3896c59eb64324cf6d15b9bce8 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 28 Jun 2013 10:20:00 -0400
Subject: [PATCH] Track fork's originRepository instead of parsing origin url (issue 190)

---
 src/main/java/com/gitblit/GitBlit.java |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index bcfebb5..1f9a947 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -1948,6 +1948,7 @@
 		
 		if (config != null) {
 			model.description = getConfig(config, "description", "");
+			model.originRepository = getConfig(config, "originRepository", null);
 			model.addOwners(ArrayUtils.fromString(getConfig(config, "owner", "")));
 			model.useTickets = getConfig(config, "useTickets", false);
 			model.useDocs = getConfig(config, "useDocs", false);
@@ -2003,7 +2004,7 @@
 		model.sparkleshareId = JGitUtils.getSparkleshareId(r);
 		r.close();
 		
-		if (model.origin != null && model.origin.startsWith("file://")) {
+		if (StringUtils.isEmpty(model.originRepository) && model.origin != null && model.origin.startsWith("file://")) {
 			// repository was cloned locally... perhaps as a fork
 			try {
 				File folder = new File(new URI(model.origin));
@@ -2412,6 +2413,7 @@
 							String origin = config.getString("remote", "origin", "url");
 							origin = origin.replace(repositoryName, repository.name);
 							config.setString("remote", "origin", "url", origin);
+							config.setString(Constants.CONFIG_GITBLIT, null, "originRepository", repository.name);
 							config.save();
 						} catch (Exception e) {
 							logger.error("Failed to update repository fork config for " + fork, e);
@@ -2420,11 +2422,12 @@
 					}
 				}
 				
-				// remove this repository from any origin model's fork list
+				// update this repository's origin's fork list
 				if (!StringUtils.isEmpty(repository.originRepository)) {
 					RepositoryModel origin = repositoryListCache.get(repository.originRepository);
 					if (origin != null && !ArrayUtils.isEmpty(origin.forks)) {
 						origin.forks.remove(repositoryName);
+						origin.forks.add(repository.name);
 					}
 				}
 
@@ -2473,6 +2476,7 @@
 	public void updateConfiguration(Repository r, RepositoryModel repository) {
 		StoredConfig config = r.getConfig();
 		config.setString(Constants.CONFIG_GITBLIT, null, "description", repository.description);
+		config.setString(Constants.CONFIG_GITBLIT, null, "originRepository", repository.originRepository);
 		config.setString(Constants.CONFIG_GITBLIT, null, "owner", ArrayUtils.toString(repository.owners));
 		config.setBoolean(Constants.CONFIG_GITBLIT, null, "useTickets", repository.useTickets);
 		config.setBoolean(Constants.CONFIG_GITBLIT, null, "useDocs", repository.useDocs);

--
Gitblit v1.9.1