From 9cc56a1f60eff2ce1db40b7078eab92e78602e1c Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Sun, 13 Jan 2013 16:49:37 -0500 Subject: [PATCH] Fix submodule links on commit, comitdiff, and tree page (issue-178) --- src/com/gitblit/utils/JGitUtils.java | 101 ++++++++++++++++---------------------------------- 1 files changed, 32 insertions(+), 69 deletions(-) diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index 050b591..e112770 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -19,7 +19,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; @@ -30,8 +29,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.FetchCommand; @@ -210,11 +207,10 @@ if (credentialsProvider != null) { clone.setCredentialsProvider(credentialsProvider); } - clone.call(); + Repository repository = clone.call().getRepository(); + // Now we have to fetch because CloneCommand doesn't fetch // refs/notes nor does it allow manual RefSpec. - File gitDir = FileKey.resolve(new File(repositoriesFolder, name), FS.DETECTED); - FileRepository repository = new FileRepository(gitDir); result.createdRepository = true; result.fetchResult = fetchRepository(credentialsProvider, repository); repository.close(); @@ -541,7 +537,7 @@ * @param path * @return content as a byte [] */ - public static byte[] getByteContent(Repository repository, RevTree tree, final String path) { + public static byte[] getByteContent(Repository repository, RevTree tree, final String path, boolean throwError) { RevWalk rw = new RevWalk(repository); TreeWalk tw = new TreeWalk(repository); tw.setFilter(PathFilterGroup.createFromStrings(Collections.singleton(path))); @@ -576,7 +572,9 @@ } } } catch (Throwable t) { - error(t, repository, "{0} can't find {1} in tree {2}", path, tree.name()); + if (throwError) { + error(t, repository, "{0} can't find {1} in tree {2}", path, tree.name()); + } } finally { rw.dispose(); tw.release(); @@ -595,7 +593,7 @@ * @return UTF-8 string content */ public static String getStringContent(Repository repository, RevTree tree, String blobPath, String... charsets) { - byte[] content = getByteContent(repository, tree, blobPath); + byte[] content = getByteContent(repository, tree, blobPath, true); if (content == null) { return null; } @@ -1461,6 +1459,20 @@ int maxCount) { return getRefs(repository, Constants.R_NOTES, fullName, maxCount); } + + /** + * Returns the list of refs in the specified base ref. If repository does + * not exist or is empty, an empty list is returned. + * + * @param repository + * @param fullName + * if true, /refs/yadayadayada is returned. If false, + * yadayadayada is returned. + * @return list of refs + */ + public static List<RefModel> getRefs(Repository repository, String baseRef) { + return getRefs(repository, baseRef, true, -1); + } /** * Returns a list of references in the repository matching "refs". If the @@ -1532,7 +1544,7 @@ try { // search for the branch in local heads for (RefModel ref : JGitUtils.getLocalBranches(repository, false, -1)) { - if (ref.displayName.endsWith(name)) { + if (ref.reference.getName().endsWith(name)) { branch = ref; break; } @@ -1541,7 +1553,7 @@ // search for the branch in remote heads if (branch == null) { for (RefModel ref : JGitUtils.getRemoteBranches(repository, false, -1)) { - if (ref.displayName.endsWith(name)) { + if (ref.reference.getName().endsWith(name)) { branch = ref; break; } @@ -1574,7 +1586,7 @@ */ public static List<SubmoduleModel> getSubmodules(Repository repository, RevTree tree) { List<SubmoduleModel> list = new ArrayList<SubmoduleModel>(); - byte [] blob = getByteContent(repository, tree, ".gitmodules"); + byte [] blob = getByteContent(repository, tree, ".gitmodules", false); if (blob == null) { return list; } @@ -1724,67 +1736,18 @@ } return success; } - + /** - * Zips the contents of the tree at the (optionally) specified revision and - * the (optionally) specified basepath to the supplied outputstream. + * Reads the sparkleshare id, if present, from the repository. * * @param repository - * @param basePath - * if unspecified, entire repository is assumed. - * @param objectId - * if unspecified, HEAD is assumed. - * @param os - * @return true if repository was successfully zipped to supplied output - * stream + * @return an id or null */ - public static boolean zip(Repository repository, String basePath, String objectId, - OutputStream os) { - RevCommit commit = getCommit(repository, objectId); - if (commit == null) { - return false; + public static String getSparkleshareId(Repository repository) { + byte[] content = getByteContent(repository, null, ".sparkleshare", false); + if (content == null) { + return null; } - boolean success = false; - RevWalk rw = new RevWalk(repository); - TreeWalk tw = new TreeWalk(repository); - try { - tw.addTree(commit.getTree()); - ZipOutputStream zos = new ZipOutputStream(os); - zos.setComment("Generated by Gitblit"); - if (!StringUtils.isEmpty(basePath)) { - PathFilter f = PathFilter.create(basePath); - tw.setFilter(f); - } - tw.setRecursive(true); - while (tw.next()) { - ZipEntry entry = new ZipEntry(tw.getPathString()); - entry.setSize(tw.getObjectReader().getObjectSize(tw.getObjectId(0), - Constants.OBJ_BLOB)); - entry.setComment(commit.getName()); - zos.putNextEntry(entry); - - ObjectId entid = tw.getObjectId(0); - FileMode entmode = tw.getFileMode(0); - RevBlob blob = (RevBlob) rw.lookupAny(entid, entmode.getObjectType()); - rw.parseBody(blob); - - ObjectLoader ldr = repository.open(blob.getId(), Constants.OBJ_BLOB); - byte[] tmp = new byte[4096]; - InputStream in = ldr.openStream(); - int n; - while ((n = in.read(tmp)) > 0) { - zos.write(tmp, 0, n); - } - in.close(); - } - zos.finish(); - success = true; - } catch (IOException e) { - error(e, repository, "{0} failed to zip files from commit {1}", commit.getName()); - } finally { - tw.release(); - rw.dispose(); - } - return success; + return StringUtils.decodeString(content); } } -- Gitblit v1.9.1