/* * Syncany, www.syncany.org * Copyright (C) 2011-2016 Philipp C. Heckel <philipp.heckel@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.syncany.cli; import static java.util.Arrays.asList; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.List; import java.util.logging.Logger; import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.OptionSpec; import org.syncany.operations.OperationResult; import org.syncany.operations.log.LightweightDatabaseVersion; import org.syncany.operations.log.LogOperation; import org.syncany.operations.log.LogOperationOptions; import org.syncany.operations.log.LogOperationResult; public class LogCommand extends Command { protected static final Logger logger = Logger.getLogger(LogCommand.class.getSimpleName()); private static final String DATE_FORMAT_PATTERN = "yy-MM-dd HH:mm:ss"; private static final DateFormat DATE_FORMAT = new SimpleDateFormat(DATE_FORMAT_PATTERN); private boolean excludeEmpty; @Override public CommandScope getRequiredCommandScope() { return CommandScope.INITIALIZED_LOCALDIR; } @Override public boolean canExecuteInDaemonScope() { return true; } @Override public int execute(String[] operationArgs) throws Exception { LogOperationOptions operationOptions = parseOptions(operationArgs); LogOperationResult operationResult = new LogOperation(config, operationOptions).execute(); printResults(operationResult); return 0; } @Override public LogOperationOptions parseOptions(String[] operationArgs) throws Exception { LogOperationOptions operationOptions = new LogOperationOptions(); OptionParser parser = new OptionParser(); parser.allowsUnrecognizedOptions(); OptionSpec<Integer> optionMaxDatabaseVersionCountStr = parser.acceptsAll(asList("n", "database-count")).withRequiredArg().ofType(Integer.class); OptionSpec<Integer> optionStartDatabaseVersionIndexStr = parser.acceptsAll(asList("s", "database-start")).withRequiredArg().ofType(Integer.class); OptionSpec<Integer> optionMaxFileHistoryCountStr = parser.acceptsAll(asList("f", "file-count")).withRequiredArg().ofType(Integer.class); OptionSpec<Void> optionExcludeEmpty = parser.acceptsAll(asList("x", "exclude-empty")); OptionSet options = parser.parse(operationArgs); // -x, --exclude-empty excludeEmpty = options.has(optionExcludeEmpty); // -n, --database-count=.. if (options.has(optionMaxDatabaseVersionCountStr)) { operationOptions.setMaxDatabaseVersionCount(options.valueOf(optionMaxDatabaseVersionCountStr)); } // -s, --database-start=.. if (options.has(optionStartDatabaseVersionIndexStr)) { operationOptions.setStartDatabaseVersionIndex(options.valueOf(optionStartDatabaseVersionIndexStr)); } // -f, --file-count=.. if (options.has(optionMaxFileHistoryCountStr)) { operationOptions.setMaxFileHistoryCount(options.valueOf(optionMaxFileHistoryCountStr)); } return operationOptions; } @Override public void printResults(OperationResult operationResult) { LogOperationResult concreteOperationResult = (LogOperationResult) operationResult; List<LightweightDatabaseVersion> databaseVersions = concreteOperationResult.getDatabaseVersions(); Collections.reverse(databaseVersions); for (LightweightDatabaseVersion databaseVersion : databaseVersions) { boolean hasChanges = databaseVersion.getChangeSet().hasChanges(); boolean printDatabaseVersion = hasChanges || !excludeEmpty; if (printDatabaseVersion) { printDatabaseVersion(databaseVersion); } } } private void printDatabaseVersion(LightweightDatabaseVersion databaseVersion) { String dateStr = DATE_FORMAT.format(databaseVersion.getDate()); String clientStr = databaseVersion.getClient(); out.println(String.format("Database version from %s, by client %s", dateStr, clientStr)); if (databaseVersion.getChangeSet().hasChanges()) { for (String newFile : databaseVersion.getChangeSet().getNewFiles()) { out.println(" A "+newFile); } for (String changedFile : databaseVersion.getChangeSet().getChangedFiles()) { out.println(" M "+changedFile); } for (String deletedFile : databaseVersion.getChangeSet().getDeletedFiles()) { out.println(" D "+deletedFile); } } else { out.println(" (empty)"); } out.println(); } }