From 331fbc638684c605d90d49269202dde071db10c4 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 20 Jul 2011 16:03:07 -0400 Subject: [PATCH] Cancel buttons on edit pages. Column fix for flat repositories view. --- src/com/gitblit/utils/JGitUtils.java | 589 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 477 insertions(+), 112 deletions(-) diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index f6d7108..f8de429 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -84,6 +84,13 @@ static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class); + /** + * Returns the displayable name of the person in the form "Real Name <email + * address>". If the email address is empty, just "Real Name" is returned. + * + * @param person + * @return "Real Name <email address>" or "Real Name" + */ public static String getDisplayName(PersonIdent person) { if (StringUtils.isEmpty(person.getEmailAddress())) { return person.getName(); @@ -96,7 +103,19 @@ return r.toString().trim(); } - public static FetchResult cloneRepository(File repositoriesFolder, String name, String fromUrl) throws Exception { + /** + * Clone or Fetch a repository. If the local repository does not exist, + * clone is called. If the repository does exist, fetch is called. By + * default the clone/fetch retrieves the remote heads, tags, and notes. + * + * @param repositoriesFolder + * @param name + * @param fromUrl + * @return FetchResult + * @throws Exception + */ + public static FetchResult cloneRepository(File repositoriesFolder, String name, String fromUrl) + throws Exception { FetchResult result = null; if (!name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) { name += Constants.DOT_GIT_EXT; @@ -124,6 +143,15 @@ return result; } + /** + * Fetch updates from the remote repository. If refSpecs is unspecifed, + * remote heads, tags, and notes are retrieved. + * + * @param repository + * @param refSpecs + * @return FetchResult + * @throws Exception + */ public static FetchResult fetchRepository(Repository repository, RefSpec... refSpecs) throws Exception { Git git = new Git(repository); @@ -142,11 +170,29 @@ return result; } + /** + * Creates a bare repository. + * + * @param repositoriesFolder + * @param name + * @return Repository + */ public static Repository createRepository(File repositoriesFolder, String name) { Git git = Git.init().setDirectory(new File(repositoriesFolder, name)).setBare(true).call(); return git.getRepository(); } + /** + * Returns a list of repository names in the specified folder. + * + * @param repositoriesFolder + * @param exportAll + * if true, all repositories are listed. If false only the + * repositories with a "git-daemon-export-ok" file are included + * @param searchSubfolders + * recurse into subfolders to find grouped repositories + * @return list of repository names + */ public static List<String> getRepositoryList(File repositoriesFolder, boolean exportAll, boolean searchSubfolders) { List<String> list = new ArrayList<String>(); @@ -159,6 +205,20 @@ return list; } + /** + * Recursive function to find git repositories. + * + * @param basePath + * basePath is stripped from the repository name as repositories + * are relative to this path + * @param searchFolder + * @param exportAll + * if true all repositories are listed. If false only the + * repositories with a "git-daemon-export-ok" file are included + * @param searchSubfolders + * recurse into subfolders to find grouped repositories + * @return + */ private static List<String> getRepositoryList(String basePath, File searchFolder, boolean exportAll, boolean searchSubfolders) { List<String> list = new ArrayList<String>(); @@ -185,8 +245,17 @@ return list; } - public static RevCommit getFirstCommit(Repository r, String branch) { - if (!hasCommits(r)) { + /** + * Returns the first commit on a branch. If the repository does not exist or + * is empty, null is returned. + * + * @param repository + * @param branch + * if unspecified, HEAD is assumed. + * @return RevCommit + */ + public static RevCommit getFirstCommit(Repository repository, String branch) { + if (!hasCommits(repository)) { return null; } if (StringUtils.isEmpty(branch)) { @@ -194,9 +263,9 @@ } RevCommit commit = null; try { - RevWalk walk = new RevWalk(r); + RevWalk walk = new RevWalk(repository); walk.sort(RevSort.REVERSE); - RevCommit head = walk.parseCommit(r.resolve(branch)); + RevCommit head = walk.parseCommit(repository.resolve(branch)); walk.markStart(head); commit = walk.next(); walk.dispose(); @@ -206,44 +275,90 @@ return commit; } - public static Date getFirstChange(Repository r, String branch) { - RevCommit commit = getFirstCommit(r, branch); + /** + * Returns the date of the first commit on a branch. If the repository does + * not exist, Date(0) is returned. If the repository does exist bit is + * empty, the last modified date of the repository folder is returned. + * + * @param repository + * @param branch + * if unspecified, HEAD is assumed. + * @return Date of the first commit on a branch + */ + public static Date getFirstChange(Repository repository, String branch) { + RevCommit commit = getFirstCommit(repository, branch); if (commit == null) { - if (r == null || !r.getDirectory().exists()) { + if (repository == null || !repository.getDirectory().exists()) { return new Date(0); } // fresh repository - return new Date(r.getDirectory().lastModified()); + return new Date(repository.getDirectory().lastModified()); } return getCommitDate(commit); } - public static boolean hasCommits(Repository r) { - if (r != null && r.getDirectory().exists()) { - return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0; + /** + * Determine if a repository has any commits. This is determined by checking + * for 1 or more heads. + * + * @param repository + * @return true if the repository has commits + */ + public static boolean hasCommits(Repository repository) { + if (repository != null && repository.getDirectory().exists()) { + return (new File(repository.getDirectory(), "objects/info").list().length > 0) + || (new File(repository.getDirectory(), "objects/pack").list().length > 0); } return false; } - public static Date getLastChange(Repository r) { - if (!hasCommits(r)) { + /** + * Returns the date of the most recent commit on a branch. If the repository + * does not exist Date(0) is returned. If it does exist but is empty, the + * last modified date of the repository folder is returned. + * + * @param repository + * @param branch + * if unspecified, HEAD is assumed. + * @return + */ + public static Date getLastChange(Repository repository, String branch) { + if (!hasCommits(repository)) { // null repository - if (r == null) { + if (repository == null) { return new Date(0); } // fresh repository - return new Date(r.getDirectory().lastModified()); + return new Date(repository.getDirectory().lastModified()); } - RevCommit commit = getCommit(r, Constants.HEAD); + if (StringUtils.isEmpty(branch)) { + branch = Constants.HEAD; + } + RevCommit commit = getCommit(repository, branch); return getCommitDate(commit); } + /** + * Retrieves a Java Date from a Git commit. + * + * @param commit + * @return date of the commit + */ public static Date getCommitDate(RevCommit commit) { return new Date(commit.getCommitTime() * 1000L); } - public static RevCommit getCommit(Repository r, String objectId) { - if (!hasCommits(r)) { + /** + * Returns the specified commit from the repository. If the repository does + * not exist or is empty, null is returned. + * + * @param repository + * @param objectId + * if unspecified, HEAD is assumed. + * @return RevCommit + */ + public static RevCommit getCommit(Repository repository, String objectId) { + if (!hasCommits(repository)) { return null; } RevCommit commit = null; @@ -251,8 +366,8 @@ if (StringUtils.isEmpty(objectId)) { objectId = Constants.HEAD; } - ObjectId object = r.resolve(objectId); - RevWalk walk = new RevWalk(r); + ObjectId object = repository.resolve(objectId); + RevWalk walk = new RevWalk(repository); RevCommit rev = walk.parseCommit(object); commit = rev; walk.dispose(); @@ -262,27 +377,23 @@ return commit; } - public static Map<ObjectId, List<RefModel>> getAllRefs(Repository r) { - List<RefModel> list = getRefs(r, org.eclipse.jgit.lib.RefDatabase.ALL, true, -1); - Map<ObjectId, List<RefModel>> refs = new HashMap<ObjectId, List<RefModel>>(); - for (RefModel ref : list) { - ObjectId objectid = ref.getReferencedObjectId(); - if (!refs.containsKey(objectid)) { - refs.put(objectid, new ArrayList<RefModel>()); - } - refs.get(objectid).add(ref); - } - return refs; - } - - public static byte[] getByteContent(Repository r, RevTree tree, final String path) { - RevWalk rw = new RevWalk(r); - TreeWalk tw = new TreeWalk(r); + /** + * Retrieves the raw byte content of a file in the specified tree. + * + * @param repository + * @param tree + * if null, the RevTree from HEAD is assumed. + * @param path + * @return content as a byte [] + */ + public static byte[] getByteContent(Repository repository, RevTree tree, final String path) { + RevWalk rw = new RevWalk(repository); + TreeWalk tw = new TreeWalk(repository); tw.setFilter(PathFilterGroup.createFromStrings(Collections.singleton(path))); byte[] content = null; try { if (tree == null) { - ObjectId object = r.resolve(Constants.HEAD); + ObjectId object = repository.resolve(Constants.HEAD); RevCommit commit = rw.parseCommit(object); tree = commit.getTree(); } @@ -297,7 +408,7 @@ RevObject ro = rw.lookupAny(entid, entmode.getObjectType()); rw.parseBody(ro); ByteArrayOutputStream os = new ByteArrayOutputStream(); - ObjectLoader ldr = r.open(ro.getId(), Constants.OBJ_BLOB); + ObjectLoader ldr = repository.open(ro.getId(), Constants.OBJ_BLOB); byte[] tmp = new byte[4096]; InputStream in = ldr.openStream(); int n; @@ -316,22 +427,38 @@ return content; } - public static String getStringContent(Repository r, RevTree tree, String blobPath) { - byte[] content = getByteContent(r, tree, blobPath); + /** + * Returns the UTF-8 string content of a file in the specified tree. + * + * @param repository + * @param tree + * if null, the RevTree from HEAD is assumed. + * @param blobPath + * @return UTF-8 string content + */ + public static String getStringContent(Repository repository, RevTree tree, String blobPath) { + byte[] content = getByteContent(repository, tree, blobPath); if (content == null) { return null; } return new String(content, Charset.forName(Constants.CHARACTER_ENCODING)); } - public static byte[] getByteContent(Repository r, String objectId) { - RevWalk rw = new RevWalk(r); + /** + * Gets the raw byte content of the specified blob object. + * + * @param repository + * @param objectId + * @return byte [] blob content + */ + public static byte[] getByteContent(Repository repository, String objectId) { + RevWalk rw = new RevWalk(repository); byte[] content = null; try { RevBlob blob = rw.lookupBlob(ObjectId.fromString(objectId)); rw.parseBody(blob); ByteArrayOutputStream os = new ByteArrayOutputStream(); - ObjectLoader ldr = r.open(blob.getId(), Constants.OBJ_BLOB); + ObjectLoader ldr = repository.open(blob.getId(), Constants.OBJ_BLOB); byte[] tmp = new byte[4096]; InputStream in = ldr.openStream(); int n; @@ -348,27 +475,47 @@ return content; } - public static String getStringContent(Repository r, String objectId) { - byte[] content = getByteContent(r, objectId); + /** + * Gets the UTF-8 string content of the blob specified by objectId. + * + * @param repository + * @param objectId + * @return UTF-8 string content + */ + public static String getStringContent(Repository repository, String objectId) { + byte[] content = getByteContent(repository, objectId); if (content == null) { return null; } return new String(content, Charset.forName(Constants.CHARACTER_ENCODING)); } - public static List<PathModel> getFilesInPath(Repository r, String basePath, RevCommit commit) { + /** + * Returns the list of files in the specified folder at the specified + * commit. If the repository does not exist or is empty, an empty list is + * returned. + * + * @param repository + * @param path + * if unspecified, root folder is assumed. + * @param commit + * if null, HEAD is assumed. + * @return list of files in specified path + */ + public static List<PathModel> getFilesInPath(Repository repository, String path, + RevCommit commit) { List<PathModel> list = new ArrayList<PathModel>(); - if (!hasCommits(r)) { + if (!hasCommits(repository)) { return list; } if (commit == null) { - commit = getCommit(r, Constants.HEAD); + commit = getCommit(repository, Constants.HEAD); } - final TreeWalk tw = new TreeWalk(r); + final TreeWalk tw = new TreeWalk(repository); try { tw.addTree(commit.getTree()); - if (!StringUtils.isEmpty(basePath)) { - PathFilter f = PathFilter.create(basePath); + if (!StringUtils.isEmpty(path)) { + PathFilter f = PathFilter.create(path); tw.setFilter(f); tw.setRecursive(false); boolean foundFolder = false; @@ -376,12 +523,12 @@ if (!foundFolder && tw.isSubtree()) { tw.enterSubtree(); } - if (tw.getPathString().equals(basePath)) { + if (tw.getPathString().equals(path)) { foundFolder = true; continue; } if (foundFolder) { - list.add(getPathModel(tw, basePath, commit)); + list.add(getPathModel(tw, path, commit)); } } } else { @@ -399,38 +546,44 @@ return list; } - public static List<PathChangeModel> getFilesInCommit(Repository r, RevCommit commit) { + /** + * Returns the list of files changed in a specified commit. If the + * repository does not exist or is empty, an empty list is returned. + * + * @param repository + * @param commit + * if null, HEAD is assumed. + * @return list of files changed in a commit + */ + public static List<PathChangeModel> getFilesInCommit(Repository repository, RevCommit commit) { List<PathChangeModel> list = new ArrayList<PathChangeModel>(); - RevWalk rw = new RevWalk(r); - TreeWalk tw = new TreeWalk(r); + if (!hasCommits(repository)) { + return list; + } + RevWalk rw = new RevWalk(repository); try { if (commit == null) { - ObjectId object = r.resolve(Constants.HEAD); + ObjectId object = repository.resolve(Constants.HEAD); commit = rw.parseCommit(object); } - RevTree commitTree = commit.getTree(); - tw.reset(); - tw.setRecursive(true); if (commit.getParentCount() == 0) { - tw.addTree(commitTree); + TreeWalk tw = new TreeWalk(repository); + tw.reset(); + tw.setRecursive(true); + tw.addTree(commit.getTree()); while (tw.next()) { list.add(new PathChangeModel(tw.getPathString(), tw.getPathString(), 0, tw .getRawMode(0), commit.getId().getName(), ChangeType.ADD)); } + tw.release(); } else { RevCommit parent = rw.parseCommit(commit.getParent(0).getId()); - RevTree parentTree = parent.getTree(); - tw.addTree(parentTree); - tw.addTree(commitTree); - tw.setFilter(TreeFilter.ANY_DIFF); - - RawTextComparator cmp = RawTextComparator.DEFAULT; DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE); - df.setRepository(r); - df.setDiffComparator(cmp); + df.setRepository(repository); + df.setDiffComparator(RawTextComparator.DEFAULT); df.setDetectRenames(true); - List<DiffEntry> diffs = df.scan(parentTree, commitTree); + List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree()); for (DiffEntry diff : diffs) { if (diff.getChangeType().equals(ChangeType.DELETE)) { list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff @@ -447,15 +600,26 @@ LOGGER.error("failed to determine files in commit!", t); } finally { rw.dispose(); - tw.release(); } return list; } - public static List<PathModel> getDocuments(Repository r, List<String> extensions) { + /** + * Returns the list of files in the repository that match one of the + * specified extensions. This is a CASE-SENSITIVE search. If the repository + * does not exist or is empty, an empty list is returned. + * + * @param repository + * @param extensions + * @return list of files in repository with a matching extension + */ + public static List<PathModel> getDocuments(Repository repository, List<String> extensions) { List<PathModel> list = new ArrayList<PathModel>(); - RevCommit commit = getCommit(r, Constants.HEAD); - final TreeWalk tw = new TreeWalk(r); + if (!hasCommits(repository)) { + return list; + } + RevCommit commit = getCommit(repository, Constants.HEAD); + final TreeWalk tw = new TreeWalk(repository); try { tw.addTree(commit.getTree()); if (extensions != null && extensions.size() > 0) { @@ -484,6 +648,14 @@ return list; } + /** + * Returns a path model of the current file in the treewalk. + * + * @param tw + * @param basePath + * @param commit + * @return a path model of the current file in the treewalk + */ private static PathModel getPathModel(TreeWalk tw, String basePath, RevCommit commit) { String name; long size = 0; @@ -503,6 +675,12 @@ commit.getName()); } + /** + * Returns a permissions representation of the mode bits. + * + * @param mode + * @return string representation of the mode bits + */ public static String getPermissionsFromMode(int mode) { if (FileMode.TREE.equals(mode)) { return "drwxr-xr-x"; @@ -521,26 +699,69 @@ return "missing"; } - public static List<RevCommit> getRevLog(Repository r, int maxCount) { - return getRevLog(r, Constants.HEAD, 0, maxCount); + /** + * Returns a list of commits starting from HEAD and working backwards. + * + * @param repository + * @param maxCount + * if < 0, all commits for the repository are returned. + * @return list of commits + */ + public static List<RevCommit> getRevLog(Repository repository, int maxCount) { + return getRevLog(repository, Constants.HEAD, 0, maxCount); } - public static List<RevCommit> getRevLog(Repository r, String objectId, int offset, int maxCount) { - return getRevLog(r, objectId, null, offset, maxCount); - } - - public static List<RevCommit> getRevLog(Repository r, String objectId, String path, int offset, + /** + * Returns a list of commits starting from the specified objectId using an + * offset and maxCount for paging. This is similar to LIMIT n OFFSET p in + * SQL. If the repository does not exist or is empty, an empty list is + * returned. + * + * @param repository + * @param objectId + * if unspecified, HEAD is assumed. + * @param offset + * @param maxCount + * if < 0, all commits are returned. + * @return a paged list of commits + */ + public static List<RevCommit> getRevLog(Repository repository, String objectId, int offset, int maxCount) { + return getRevLog(repository, objectId, null, offset, maxCount); + } + + /** + * Returns a list of commits for the repository or a path within the + * repository. Caller may specify ending revision with objectId. Caller may + * specify offset and maxCount to achieve pagination of results. If the + * repository does not exist or is empty, an empty list is returned. + * + * @param repository + * @param objectId + * if unspecified, HEAD is assumed. + * @param path + * if unspecified, commits for repository are returned. If + * specified, commits for the path are returned. + * @param offset + * @param maxCount + * if < 0, all commits are returned. + * @return a paged list of commits + */ + public static List<RevCommit> getRevLog(Repository repository, String objectId, String path, + int offset, int maxCount) { List<RevCommit> list = new ArrayList<RevCommit>(); - if (!hasCommits(r)) { + if (maxCount == 0) { + return list; + } + if (!hasCommits(repository)) { return list; } try { if (StringUtils.isEmpty(objectId)) { objectId = Constants.HEAD; } - RevWalk rw = new RevWalk(r); - ObjectId object = r.resolve(objectId); + RevWalk rw = new RevWalk(repository); + ObjectId object = repository.resolve(objectId); rw.markStart(rw.parseCommit(object)); if (!StringUtils.isEmpty(path)) { TreeFilter filter = AndTreeFilter.create( @@ -593,22 +814,44 @@ } } - public static List<RevCommit> searchRevlogs(Repository r, String objectId, String value, - final SearchType type, int offset, int maxCount) { + /** + * Search the commit history for a case-insensitive match to the value. + * Search results require a specified SearchType of AUTHOR, COMMITTER, or + * COMMIT. Results may be paginated using offset and maxCount. If the + * repository does not exist or is empty, an empty list is returned. + * + * @param repository + * @param objectId + * if unspecified, HEAD is assumed. + * @param value + * @param type + * AUTHOR, COMMITTER, COMMIT + * @param offset + * @param maxCount + * if < 0, all matches are returned + * @return matching list of commits + */ + public static List<RevCommit> searchRevlogs(Repository repository, String objectId, + String value, final SearchType type, int offset, int maxCount) { final String lcValue = value.toLowerCase(); List<RevCommit> list = new ArrayList<RevCommit>(); - if (!hasCommits(r)) { + if (maxCount == 0) { + return list; + } + if (!hasCommits(repository)) { return list; } try { if (StringUtils.isEmpty(objectId)) { objectId = Constants.HEAD; } - RevWalk rw = new RevWalk(r); + RevWalk rw = new RevWalk(repository); rw.setRevFilter(new RevFilter() { @Override public RevFilter clone() { + // FindBugs complains about this method name. + // This is part of JGit design and unrelated to Cloneable. return this; } @@ -636,7 +879,7 @@ } }); - ObjectId object = r.resolve(objectId); + ObjectId object = repository.resolve(objectId); rw.markStart(rw.parseCommit(object)); Iterable<RevCommit> revlog = rw; if (offset > 0) { @@ -665,27 +908,118 @@ return list; } - public static List<RefModel> getTags(Repository r, boolean fullName, int maxCount) { - return getRefs(r, Constants.R_TAGS, fullName, maxCount); + /** + * Returns all refs grouped by their associated object id. + * + * @param repository + * @return all refs grouped by their referenced object id + */ + public static Map<ObjectId, List<RefModel>> getAllRefs(Repository repository) { + List<RefModel> list = getRefs(repository, org.eclipse.jgit.lib.RefDatabase.ALL, true, -1); + Map<ObjectId, List<RefModel>> refs = new HashMap<ObjectId, List<RefModel>>(); + for (RefModel ref : list) { + ObjectId objectid = ref.getReferencedObjectId(); + if (!refs.containsKey(objectid)) { + refs.put(objectid, new ArrayList<RefModel>()); + } + refs.get(objectid).add(ref); + } + return refs; } - public static List<RefModel> getLocalBranches(Repository r, boolean fullName, int maxCount) { - return getRefs(r, Constants.R_HEADS, fullName, maxCount); + /** + * Returns the list of tags in the repository. If repository does not exist + * or is empty, an empty list is returned. + * + * @param repository + * @param fullName + * if true, /refs/tags/yadayadayada is returned. If false, + * yadayadayada is returned. + * @param maxCount + * if < 0, all tags are returned + * @return list of tags + */ + public static List<RefModel> getTags(Repository repository, boolean fullName, int maxCount) { + return getRefs(repository, Constants.R_TAGS, fullName, maxCount); } - public static List<RefModel> getRemoteBranches(Repository r, boolean fullName, int maxCount) { - return getRefs(r, Constants.R_REMOTES, fullName, maxCount); + /** + * Returns the list of local branches in the repository. If repository does + * not exist or is empty, an empty list is returned. + * + * @param repository + * @param fullName + * if true, /refs/heads/yadayadayada is returned. If false, + * yadayadayada is returned. + * @param maxCount + * if < 0, all local branches are returned + * @return list of local branches + */ + public static List<RefModel> getLocalBranches(Repository repository, boolean fullName, + int maxCount) { + return getRefs(repository, Constants.R_HEADS, fullName, maxCount); } - public static List<RefModel> getNotesRefs(Repository r, boolean fullName, int maxCount) { - return getRefs(r, Constants.R_NOTES, fullName, maxCount); + /** + * Returns the list of remote branches in the repository. If repository does + * not exist or is empty, an empty list is returned. + * + * @param repository + * @param fullName + * if true, /refs/remotes/yadayadayada is returned. If false, + * yadayadayada is returned. + * @param maxCount + * if < 0, all remote branches are returned + * @return list of remote branches + */ + public static List<RefModel> getRemoteBranches(Repository repository, boolean fullName, + int maxCount) { + return getRefs(repository, Constants.R_REMOTES, fullName, maxCount); } - private static List<RefModel> getRefs(Repository r, String refs, boolean fullName, int maxCount) { + /** + * Returns the list of note branches. If repository does not exist or is + * empty, an empty list is returned. + * + * @param repository + * @param fullName + * if true, /refs/notes/yadayadayada is returned. If false, + * yadayadayada is returned. + * @param maxCount + * if < 0, all note branches are returned + * @return list of note branches + */ + public static List<RefModel> getNoteBranches(Repository repository, boolean fullName, + int maxCount) { + return getRefs(repository, Constants.R_NOTES, fullName, maxCount); + } + + /** + * Returns a list of references in the repository matching "refs". If the + * repository is null or empty, an empty list is returned. + * + * @param repository + * @param refs + * if unspecified, all refs are returned + * @param fullName + * if true, /refs/something/yadayadayada is returned. If false, + * yadayadayada is returned. + * @param maxCount + * if < 0, all references are returned + * @return list of references + */ + private static List<RefModel> getRefs(Repository repository, String refs, boolean fullName, + int maxCount) { List<RefModel> list = new ArrayList<RefModel>(); + if (maxCount == 0) { + return list; + } + if (!hasCommits(repository)) { + return list; + } try { - Map<String, Ref> map = r.getRefDatabase().getRefs(refs); - RevWalk rw = new RevWalk(r); + Map<String, Ref> map = repository.getRefDatabase().getRefs(refs); + RevWalk rw = new RevWalk(repository); for (Entry<String, Ref> entry : map.entrySet()) { Ref ref = entry.getValue(); RevObject object = rw.parseAny(ref.getObjectId()); @@ -707,10 +1041,22 @@ return list; } + /** + * Returns the list of notes entered about the commit from the refs/notes + * namespace. If the repository does not exist or is empty, an empty list is + * returned. + * + * @param repository + * @param commit + * @return list of notes + */ public static List<GitNote> getNotesOnCommit(Repository repository, RevCommit commit) { List<GitNote> list = new ArrayList<GitNote>(); - List<RefModel> notesRefs = getNotesRefs(repository, true, -1); - for (RefModel notesRef : notesRefs) { + if (!hasCommits(repository)) { + return list; + } + List<RefModel> noteBranches = getNoteBranches(repository, true, -1); + for (RefModel notesRef : noteBranches) { RevTree notesTree = JGitUtils.getCommit(repository, notesRef.getName()).getTree(); StringBuilder sb = new StringBuilder(commit.getName()); sb.insert(2, '/'); @@ -727,8 +1073,14 @@ return list; } - public static StoredConfig readConfig(Repository r) { - StoredConfig c = r.getConfig(); + /** + * 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) { @@ -739,19 +1091,32 @@ return c; } - public static boolean zip(Repository r, String basePath, String objectId, OutputStream os) - throws Exception { - RevCommit commit = getCommit(r, objectId); + /** + * Zips the contents of the tree at the (optionally) specified revision and + * the (optionally) specified basepath to the supplied outputstream. + * + * @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 + */ + public static boolean zip(Repository repository, String basePath, String objectId, + OutputStream os) { + RevCommit commit = getCommit(repository, objectId); if (commit == null) { return false; } boolean success = false; - RevWalk rw = new RevWalk(r); - TreeWalk tw = new TreeWalk(r); + RevWalk rw = new RevWalk(repository); + TreeWalk tw = new TreeWalk(repository); try { tw.addTree(commit.getTree()); ZipOutputStream zos = new ZipOutputStream(os); - zos.setComment("Generated by Git:Blit"); + zos.setComment("Generated by Gitblit"); if (!StringUtils.isEmpty(basePath)) { PathFilter f = PathFilter.create(basePath); tw.setFilter(f); @@ -769,7 +1134,7 @@ RevBlob blob = (RevBlob) rw.lookupAny(entid, entmode.getObjectType()); rw.parseBody(blob); - ObjectLoader ldr = r.open(blob.getId(), Constants.OBJ_BLOB); + ObjectLoader ldr = repository.open(blob.getId(), Constants.OBJ_BLOB); byte[] tmp = new byte[4096]; InputStream in = ldr.openStream(); int n; -- Gitblit v1.9.1