tikhomirov@580: /* tikhomirov@580: * Copyright (c) 2013 TMate Software Ltd tikhomirov@580: * tikhomirov@580: * This program is free software; you can redistribute it and/or modify tikhomirov@580: * it under the terms of the GNU General Public License as published by tikhomirov@580: * the Free Software Foundation; version 2 of the License. tikhomirov@580: * tikhomirov@580: * This program is distributed in the hope that it will be useful, tikhomirov@580: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@580: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@580: * GNU General Public License for more details. tikhomirov@580: * tikhomirov@580: * For information on how to redistribute this software under tikhomirov@580: * the terms of a license other than GNU General Public License tikhomirov@580: * contact TMate Software at support@hg4j.com tikhomirov@580: */ tikhomirov@580: package org.tmatesoft.hg.internal; tikhomirov@580: tikhomirov@580: import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; tikhomirov@580: tikhomirov@580: import java.io.File; tikhomirov@580: import java.io.IOException; tikhomirov@580: import java.nio.ByteBuffer; tikhomirov@580: import java.util.ArrayList; tikhomirov@580: import java.util.Arrays; tikhomirov@580: import java.util.Collections; tikhomirov@580: import java.util.List; tikhomirov@580: tikhomirov@580: import org.tmatesoft.hg.core.SessionContext; tikhomirov@580: tikhomirov@580: /** tikhomirov@580: * TODO Merge with RegularFileStats tikhomirov@580: * tikhomirov@580: * @author Artem Tikhomirov tikhomirov@580: * @author TMate Software Ltd. tikhomirov@580: */ tikhomirov@580: public class FileSystemHelper { tikhomirov@580: tikhomirov@580: private final SessionContext ctx; tikhomirov@580: private final List linkCmd, chmodCmd, statCmd; tikhomirov@580: private final ProcessExecHelper execHelper; tikhomirov@580: tikhomirov@580: public FileSystemHelper(SessionContext sessionContext) { tikhomirov@580: ctx = sessionContext; tikhomirov@580: if (Internals.runningOnWindows()) { tikhomirov@580: linkCmd = Arrays.asList("mklink", "%1", "%2"); tikhomirov@580: chmodCmd = Collections.emptyList(); tikhomirov@580: statCmd = Collections.emptyList(); tikhomirov@580: } else { tikhomirov@580: linkCmd = Arrays.asList("/bin/ln", "-s", "%2", "%1"); tikhomirov@580: chmodCmd = Arrays.asList("/bin/chmod", "+x", "%1"); tikhomirov@580: statCmd = Arrays.asList("stat", "--format=%a", "%1"); tikhomirov@580: } tikhomirov@580: execHelper = new ProcessExecHelper(); tikhomirov@580: } tikhomirov@580: tikhomirov@580: public void createSymlink(File parentDir, String linkName, byte[] target) throws IOException { tikhomirov@580: ArrayList command = new ArrayList(linkCmd); tikhomirov@580: command.set(command.indexOf("%1"), linkName); tikhomirov@580: String targetFilename = Internals.getFileEncoding(ctx).decode(ByteBuffer.wrap(target)).toString(); tikhomirov@580: command.set(command.indexOf("%2"), targetFilename); tikhomirov@580: execHelper.cwd(parentDir); tikhomirov@580: try { tikhomirov@580: execHelper.exec(command); tikhomirov@580: } catch (InterruptedException ex) { tikhomirov@580: throw new IOException(ex); tikhomirov@580: } tikhomirov@580: } tikhomirov@580: tikhomirov@580: public void setExecutableBit(File parentDir, String fname) throws IOException { tikhomirov@580: if (chmodCmd.isEmpty()) { tikhomirov@580: return; tikhomirov@580: } tikhomirov@580: ArrayList command = new ArrayList(chmodCmd); tikhomirov@580: command.set(command.indexOf("%1"), fname); tikhomirov@580: execHelper.cwd(parentDir); tikhomirov@580: try { tikhomirov@580: execHelper.exec(command); tikhomirov@580: } catch (InterruptedException ex) { tikhomirov@580: throw new IOException(ex); tikhomirov@580: } tikhomirov@580: } tikhomirov@580: tikhomirov@580: public int getFileMode(File file, int defaultValue) throws IOException { tikhomirov@580: if (statCmd.isEmpty()) { tikhomirov@580: return defaultValue; tikhomirov@580: } tikhomirov@580: ArrayList command = new ArrayList(statCmd); tikhomirov@580: command.set(command.indexOf("%1"), file.getAbsolutePath()); tikhomirov@580: String result = null; tikhomirov@580: try { tikhomirov@580: result = execHelper.exec(command).toString().trim(); tikhomirov@580: if (result.isEmpty()) { tikhomirov@580: return defaultValue; tikhomirov@580: } tikhomirov@580: return Integer.parseInt(result, 8); tikhomirov@580: } catch (InterruptedException ex) { tikhomirov@580: throw new IOException(ex); tikhomirov@580: } catch (NumberFormatException ex) { tikhomirov@580: ctx.getLog().dump(getClass(), Warn, ex, String.format("Bad value for access rights:%s", result)); tikhomirov@580: return defaultValue; tikhomirov@580: } tikhomirov@580: } tikhomirov@580: }