tikhomirov@1: /** tikhomirov@1: * Copyright (c) 2010 Artem Tikhomirov tikhomirov@1: */ tikhomirov@1: package com.tmate.hgkit.ll; tikhomirov@1: tikhomirov@1: import java.io.File; tikhomirov@1: import java.io.IOException; tikhomirov@3: import java.lang.ref.SoftReference; tikhomirov@3: import java.util.HashMap; tikhomirov@1: tikhomirov@1: /** tikhomirov@1: * @author artem tikhomirov@1: */ tikhomirov@1: public class LocalHgRepo extends HgRepository { tikhomirov@1: tikhomirov@1: private File repoDir; tikhomirov@1: private final String repoLocation; tikhomirov@1: tikhomirov@1: public LocalHgRepo(String repositoryPath) { tikhomirov@1: setInvalid(true); tikhomirov@1: repoLocation = repositoryPath; tikhomirov@1: } tikhomirov@1: tikhomirov@1: public LocalHgRepo(File repositoryRoot) throws IOException { tikhomirov@1: assert ".hg".equals(repositoryRoot.getName()) && repositoryRoot.isDirectory(); tikhomirov@1: setInvalid(false); tikhomirov@1: repoDir = repositoryRoot; tikhomirov@1: repoLocation = repositoryRoot.getParentFile().getCanonicalPath(); tikhomirov@1: } tikhomirov@1: tikhomirov@1: @Override tikhomirov@1: public String getLocation() { tikhomirov@1: return repoLocation; tikhomirov@1: } tikhomirov@3: tikhomirov@3: private final HashMap> streamsCache = new HashMap>(); tikhomirov@3: tikhomirov@3: /** tikhomirov@3: * path - repository storage path (i.e. one usually with .i or .d) tikhomirov@3: */ tikhomirov@3: @Override tikhomirov@3: protected RevlogStream resolve(String path) { tikhomirov@3: final SoftReference ref = streamsCache.get(path); tikhomirov@3: RevlogStream cached = ref == null ? null : ref.get(); tikhomirov@3: if (cached != null) { tikhomirov@3: return cached; tikhomirov@3: } tikhomirov@3: File f = new File(repoDir, path); tikhomirov@3: if (f.exists()) { tikhomirov@3: RevlogStream s = new RevlogStream(f); tikhomirov@3: streamsCache.put(path, new SoftReference(s)); tikhomirov@3: return s; tikhomirov@3: } tikhomirov@3: return null; tikhomirov@3: } tikhomirov@3: tikhomirov@3: @Override tikhomirov@3: public HgDataFile getFileNode(String path) { tikhomirov@3: String nPath = normalize(path); tikhomirov@3: String storagePath = toStoragePath(nPath); tikhomirov@3: RevlogStream content = resolve(storagePath); tikhomirov@3: // XXX no content when no file? or HgDataFile.exists() to detect that? How about files that were removed in previous releases? tikhomirov@3: return new HgDataFile(this, nPath, content); tikhomirov@3: } tikhomirov@3: tikhomirov@3: // FIXME much more to be done, see store.py:_hybridencode tikhomirov@3: private static String toStoragePath(String path) { tikhomirov@3: // XXX works for lowercase names only tikhomirov@3: return "store/data/" + path.replace('\\', '/') + ".i"; tikhomirov@3: } tikhomirov@3: tikhomirov@3: private static String normalize(String path) { tikhomirov@3: return path.replace('\\', '/'); tikhomirov@3: } tikhomirov@1: }