/******************************************************************************* * Copyright (C) 2012, Kevin Sawicki <kevin@github.com> * and other copyright owners as documented in the project's IP log. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.egit.ui.internal.commit; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.eclipse.egit.ui.UIPreferences; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.IMemento; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.XMLMemento; /** * Provides access to read and add new saved commit messages. */ public class CommitMessageHistory { private static final String KEY_MESSAGE = "message"; //$NON-NLS-1$ private static final String KEY_MESSAGES = "messages"; //$NON-NLS-1$ /** * @return saved commit messages */ public static Set<String> getCommitHistory() { String all = getPreferenceStore().getString( UIPreferences.COMMIT_DIALOG_HISTORY_MESSAGES); if (all.length() == 0) return Collections.emptySet(); int max = getCommitHistorySize(); if (max < 1) return Collections.emptySet(); XMLMemento memento; try { memento = XMLMemento.createReadRoot(new StringReader(all)); } catch (WorkbenchException e) { org.eclipse.egit.ui.Activator.logError( "Error reading commit message history", e); //$NON-NLS-1$ return Collections.emptySet(); } Set<String> messages = new LinkedHashSet<>(); for (IMemento child : memento.getChildren(KEY_MESSAGE)) { messages.add(child.getTextData()); if (messages.size() == max) break; } return messages; } /** * Save a new commit message. * * @param message */ public static void saveCommitHistory(String message) { if (message == null || message.length() == 0) return; int size = getCommitHistorySize(); if (size < 1) return; XMLMemento memento = XMLMemento.createWriteRoot(KEY_MESSAGES); memento.createChild(KEY_MESSAGE).putTextData(message); int count = 1; if (count < size) { Set<String> history = getCommitHistory(); history.remove(message); for (String previous : history) { memento.createChild(KEY_MESSAGE).putTextData(previous); count++; if (count == size) break; } } StringWriter writer = new StringWriter(); try { memento.save(writer); getPreferenceStore().setValue( UIPreferences.COMMIT_DIALOG_HISTORY_MESSAGES, writer.toString()); } catch (IOException e) { org.eclipse.egit.ui.Activator.logError( "Error writing commit message history", e); //$NON-NLS-1$ } } private static IPreferenceStore getPreferenceStore() { return org.eclipse.egit.ui.Activator.getDefault().getPreferenceStore(); } private static int getCommitHistorySize() { return getPreferenceStore().getInt( UIPreferences.COMMIT_DIALOG_HISTORY_SIZE); } }