| | |
| | | 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;
|
| | |
| | | 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;
|
| | |
| | | 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();
|
| | |
| | | * @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)));
|
| | |
| | | }
|
| | | }
|
| | | } 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();
|
| | |
| | | * @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;
|
| | | }
|
| | |
| | | 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
|
| | |
| | | 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;
|
| | | }
|
| | |
| | | // 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;
|
| | | }
|
| | |
| | | */
|
| | | 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;
|
| | | }
|
| | |
| | | }
|
| | | 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);
|
| | | }
|
| | | }
|