From c558deef274d838aae5c0366ff7dc2ebce27a981 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 20 Sep 2012 09:41:28 -0400
Subject: [PATCH] Support X-Forwarded-Context for subdomain proxy configs (issue 135)
---
src/com/gitblit/utils/JGitUtils.java | 127 ++++++++++++++++++++++++++++-------------
1 files changed, 86 insertions(+), 41 deletions(-)
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 4415982..c5cd1c3 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -45,6 +45,7 @@
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.StopWalkException;
+import org.eclipse.jgit.lib.BlobBasedConfig;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
@@ -57,7 +58,6 @@
import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.lib.TreeFormatter;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -87,6 +87,7 @@
import com.gitblit.models.PathModel;
import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RefModel;
+import com.gitblit.models.SubmoduleModel;
/**
* Collection of static methods for retrieving information from a repository.
@@ -559,18 +560,20 @@
}
ObjectId entid = tw.getObjectId(0);
FileMode entmode = tw.getFileMode(0);
- 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);
+ if (entmode != FileMode.GITLINK) {
+ 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 = os.toByteArray();
}
- in.close();
- content = os.toByteArray();
}
} catch (Throwable t) {
error(t, repository, "{0} can't find {1} in tree {2}", path, tree.name());
@@ -730,7 +733,8 @@
tw.addTree(commit.getTree());
while (tw.next()) {
list.add(new PathChangeModel(tw.getPathString(), tw.getPathString(), 0, tw
- .getRawMode(0), commit.getId().getName(), ChangeType.ADD));
+ .getRawMode(0), tw.getObjectId(0).getName(), commit.getId().getName(),
+ ChangeType.ADD));
}
tw.release();
} else {
@@ -741,17 +745,22 @@
df.setDetectRenames(true);
List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
for (DiffEntry diff : diffs) {
+ String objectId = null;
+ if (FileMode.GITLINK.equals(diff.getNewMode())) {
+ objectId = diff.getNewId().name();
+ }
+
if (diff.getChangeType().equals(ChangeType.DELETE)) {
list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff
- .getNewMode().getBits(), commit.getId().getName(), diff
+ .getNewMode().getBits(), objectId, commit.getId().getName(), diff
.getChangeType()));
} else if (diff.getChangeType().equals(ChangeType.RENAME)) {
list.add(new PathChangeModel(diff.getOldPath(), diff.getNewPath(), 0, diff
- .getNewMode().getBits(), commit.getId().getName(), diff
+ .getNewMode().getBits(), objectId, commit.getId().getName(), diff
.getChangeType()));
} else {
list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff
- .getNewMode().getBits(), commit.getId().getName(), diff
+ .getNewMode().getBits(), objectId, commit.getId().getName(), diff
.getChangeType()));
}
}
@@ -844,15 +853,16 @@
} else {
name = tw.getPathString().substring(basePath.length() + 1);
}
+ ObjectId objectId = tw.getObjectId(0);
try {
- if (!tw.isSubtree()) {
- size = tw.getObjectReader().getObjectSize(tw.getObjectId(0), Constants.OBJ_BLOB);
+ if (!tw.isSubtree() && (tw.getFileMode(0) != FileMode.GITLINK)) {
+ size = tw.getObjectReader().getObjectSize(objectId, Constants.OBJ_BLOB);
}
} catch (Throwable t) {
error(t, null, "failed to retrieve blob size for " + tw.getPathString());
}
return new PathModel(name, tw.getPathString(), size, tw.getFileMode(0).getBits(),
- commit.getName());
+ objectId.getName(), commit.getName());
}
/**
@@ -869,13 +879,10 @@
} else if (FileMode.EXECUTABLE_FILE.equals(mode)) {
return "-rwxr-xr-x";
} else if (FileMode.SYMLINK.equals(mode)) {
- // FIXME symlink permissions
return "symlink";
} else if (FileMode.GITLINK.equals(mode)) {
- // FIXME gitlink permissions
- return "gitlink";
+ return "submodule";
}
- // FIXME missing permissions
return "missing";
}
@@ -1531,6 +1538,62 @@
}
return branch;
}
+
+ /**
+ * Returns the list of submodules for this repository.
+ *
+ * @param repository
+ * @param commit
+ * @return list of submodules
+ */
+ public static List<SubmoduleModel> getSubmodules(Repository repository, String commitId) {
+ RevCommit commit = getCommit(repository, commitId);
+ return getSubmodules(repository, commit.getTree());
+ }
+
+ /**
+ * Returns the list of submodules for this repository.
+ *
+ * @param repository
+ * @param commit
+ * @return list of submodules
+ */
+ public static List<SubmoduleModel> getSubmodules(Repository repository, RevTree tree) {
+ List<SubmoduleModel> list = new ArrayList<SubmoduleModel>();
+ byte [] blob = getByteContent(repository, tree, ".gitmodules");
+ if (blob == null) {
+ return list;
+ }
+ try {
+ BlobBasedConfig config = new BlobBasedConfig(repository.getConfig(), blob);
+ for (String module : config.getSubsections("submodule")) {
+ String path = config.getString("submodule", module, "path");
+ String url = config.getString("submodule", module, "url");
+ list.add(new SubmoduleModel(module, path, url));
+ }
+ } catch (ConfigInvalidException e) {
+ LOGGER.error("Failed to load .gitmodules file for " + repository.getDirectory(), e);
+ }
+ return list;
+ }
+
+ /**
+ * Returns the submodule definition for the specified path at the specified
+ * commit. If no module is defined for the path, null is returned.
+ *
+ * @param repository
+ * @param commit
+ * @param path
+ * @return a submodule definition or null if there is no submodule
+ */
+ public static SubmoduleModel getSubmoduleModel(Repository repository, String commitId, String path) {
+ for (SubmoduleModel model : getSubmodules(repository, commitId)) {
+ if (model.path.equals(path)) {
+ return model;
+ }
+ }
+ return null;
+ }
/**
* Returns the list of notes entered about the commit from the refs/notes
@@ -1646,24 +1709,6 @@
error(t, repository, "Failed to create orphan branch {1} in repository {0}", branchName);
}
return success;
- }
-
- /**
- * Returns a StoredConfig object for the repository.
- *
- * @param repository
- * @return the StoredConfig of the repository
- */
- public static StoredConfig readConfig(Repository repository) {
- StoredConfig c = repository.getConfig();
- try {
- c.load();
- } catch (ConfigInvalidException cex) {
- error(cex, repository, "{0} configuration is invalid!");
- } catch (IOException cex) {
- error(cex, repository, "Could not open configuration for {0}!");
- }
- return c;
}
/**
--
Gitblit v1.9.1