Java tutorial
/** * This file is part of git-as-svn. It is subject to the license terms * in the LICENSE file found in the top-level directory of this distribution * and at http://www.gnu.org/licenses/gpl-2.0.html. No part of git-as-svn, * including this file, may be copied, modified, propagated, or distributed * except according to the terms contained in the LICENSE file. */ package svnserver.repository.git; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNProperty; import svnserver.repository.VcsCopyFrom; import svnserver.repository.VcsFile; import svnserver.repository.git.filter.GitFilter; import svnserver.repository.git.prop.GitProperty; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * Git file. * * @author Artem V. Navrotskiy <bozaro@users.noreply.github.com> */ public interface GitFile extends GitEntry, VcsFile { @NotNull @Override default GitEntry createChild(@NotNull String name, boolean isDir) { return new GitEntryImpl(getRawProperties(), getFullPath(), GitProperty.emptyArray, name, isDir ? FileMode.TREE : FileMode.REGULAR_FILE); } @NotNull GitRepository getRepo(); int getRevision(); @Nullable GitFilter getFilter(); @NotNull @Override GitProperty[] getRawProperties(); @Nullable GitTreeEntry getTreeEntry(); @Nullable GitObject<ObjectId> getObjectId(); @NotNull @Override default Map<String, String> getProperties() throws IOException, SVNException { return getUpstreamProperties(); } @NotNull default Map<String, String> getUpstreamProperties() { final Map<String, String> result = new HashMap<>(); for (GitProperty prop : getRawProperties()) { prop.apply(result); } return result; } @NotNull @Override default Map<String, String> getRevProperties() throws IOException { final Map<String, String> props = new HashMap<>(); final GitRevision last = getLastChange(); props.put(SVNProperty.UUID, getRepo().getUuid()); props.put(SVNProperty.COMMITTED_REVISION, String.valueOf(last.getId())); putProperty(props, SVNProperty.COMMITTED_DATE, last.getDateString()); putProperty(props, SVNProperty.LAST_AUTHOR, last.getAuthor()); return props; } @NotNull @Override String getMd5() throws IOException, SVNException; @NotNull @Override String getContentHash() throws IOException, SVNException; @Override long getSize() throws IOException, SVNException; @NotNull @Override InputStream openStream() throws IOException, SVNException; @NotNull @Override default SVNNodeKind getKind() { final int objType = getFileMode().getObjectType(); switch (objType) { case Constants.OBJ_TREE: case Constants.OBJ_COMMIT: return SVNNodeKind.DIR; case Constants.OBJ_BLOB: return SVNNodeKind.FILE; default: throw new IllegalStateException("Unknown obj type: " + objType); } } @NotNull FileMode getFileMode(); @NotNull @Override Iterable<GitFile> getEntries() throws IOException, SVNException; @NotNull @Override default GitRevision getLastChange() throws IOException { final GitRepository repo = getRepo(); final int lastChange = repo.getLastChange(getFullPath(), getRevision()); if (lastChange < 0) { throw new IllegalStateException("Internal error: can't find lastChange revision for file: " + getFileName() + "@" + getRevision()); } return repo.sureRevisionInfo(lastChange); } @Nullable @Override VcsCopyFrom getCopyFrom() throws IOException; @Nullable GitFile getEntry(@NotNull String name) throws IOException, SVNException; static void putProperty(@NotNull Map<String, String> props, @NotNull String name, @Nullable String value) { if (value != null) { props.put(name, value); } } }