tikhomirov@490: /* tikhomirov@490: * Copyright (c) 2012 TMate Software Ltd tikhomirov@490: * tikhomirov@490: * This program is free software; you can redistribute it and/or modify tikhomirov@490: * it under the terms of the GNU General Public License as published by tikhomirov@490: * the Free Software Foundation; version 2 of the License. tikhomirov@490: * tikhomirov@490: * This program is distributed in the hope that it will be useful, tikhomirov@490: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@490: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@490: * GNU General Public License for more details. tikhomirov@490: * tikhomirov@490: * For information on how to redistribute this software under tikhomirov@490: * the terms of a license other than GNU General Public License tikhomirov@490: * contact TMate Software at support@hg4j.com tikhomirov@490: */ tikhomirov@490: package org.tmatesoft.hg.internal; tikhomirov@490: tikhomirov@490: import static org.tmatesoft.hg.internal.RequiresFile.*; tikhomirov@490: tikhomirov@490: import java.io.File; tikhomirov@490: import java.io.FileOutputStream; tikhomirov@490: import java.io.IOException; tikhomirov@490: import java.nio.charset.Charset; tikhomirov@490: tikhomirov@490: import org.tmatesoft.hg.core.SessionContext; tikhomirov@490: import org.tmatesoft.hg.util.PathRewrite; tikhomirov@490: tikhomirov@490: /** tikhomirov@490: * Responsible of `requires` processing both on repo read and repo write tikhomirov@490: * XXX needs better name, perhaps tikhomirov@490: * tikhomirov@490: * @author Artem Tikhomirov tikhomirov@490: * @author TMate Software Ltd. tikhomirov@490: */ tikhomirov@490: public class RepoInitializer { tikhomirov@490: private int requiresFlags; tikhomirov@490: tikhomirov@490: public RepoInitializer() { tikhomirov@490: } tikhomirov@490: tikhomirov@490: public RepoInitializer setRequires(int flags) { tikhomirov@490: requiresFlags = flags; tikhomirov@490: return this; tikhomirov@490: } tikhomirov@490: tikhomirov@490: public int getRequires() { tikhomirov@490: return requiresFlags; tikhomirov@490: } tikhomirov@490: tikhomirov@490: public void initEmptyRepository(File hgDir) throws IOException { tikhomirov@490: hgDir.mkdir(); tikhomirov@490: FileOutputStream requiresFile = new FileOutputStream(new File(hgDir, "requires")); tikhomirov@490: StringBuilder sb = new StringBuilder(40); tikhomirov@490: sb.append("revlogv1\n"); tikhomirov@490: if ((requiresFlags & STORE) != 0) { tikhomirov@490: sb.append("store\n"); tikhomirov@490: } tikhomirov@490: if ((requiresFlags & FNCACHE) != 0) { tikhomirov@490: sb.append("fncache\n"); tikhomirov@490: } tikhomirov@490: if ((requiresFlags & DOTENCODE) != 0) { tikhomirov@490: sb.append("dotencode\n"); tikhomirov@490: } tikhomirov@490: requiresFile.write(sb.toString().getBytes()); tikhomirov@490: requiresFile.close(); tikhomirov@490: new File(hgDir, "store").mkdir(); // with that, hg verify says ok. tikhomirov@490: } tikhomirov@490: tikhomirov@490: public PathRewrite buildDataFilesHelper(SessionContext ctx) { tikhomirov@490: Charset cs = Internals.getFileEncoding(ctx); tikhomirov@490: // StoragePathHelper needs fine-grained control over char encoding, hence doesn't use EncodingHelper tikhomirov@490: return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0, cs); tikhomirov@490: } tikhomirov@490: }