Mercurial > hg4j
diff src/org/tmatesoft/hg/repo/ext/Rebase.java @ 501:d2f6ab541330
Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 29 Oct 2012 19:04:13 +0100 |
parents | |
children | 6526d8adbc0f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/tmatesoft/hg/repo/ext/Rebase.java Mon Oct 29 19:04:13 2012 +0100 @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2012 TMate Software Ltd + * + * 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; version 2 of the License. + * + * 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. + * + * For information on how to redistribute this software under + * the terms of a license other than GNU General Public License + * contact TMate Software at support@hg4j.com + */ +package org.tmatesoft.hg.repo.ext; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.NoSuchElementException; + +import org.tmatesoft.hg.core.HgBadNodeidFormatException; +import org.tmatesoft.hg.core.HgIOException; +import org.tmatesoft.hg.core.Nodeid; +import org.tmatesoft.hg.internal.Internals; +import org.tmatesoft.hg.internal.LineReader; +import org.tmatesoft.hg.repo.HgInvalidFileException; +import org.tmatesoft.hg.repo.HgInvalidStateException; + +/** + * Support for standard Rebase extension. + * + * @see http://mercurial.selenic.com/wiki/RebaseExtension + * @since 1.1 + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class Rebase { + private Internals repo; + private Nodeid workingDirParent; + private Nodeid destRevision; + private Nodeid externalParent; + private Map<Nodeid, Nodeid> state; + private boolean collapse; + private boolean keepOriginalRevisions; + private boolean keepBranchNames; + + /*package-local*/ Rebase(Internals internalRepo) { + repo = internalRepo; + } + + public Rebase refresh() throws HgIOException { + workingDirParent = null; + destRevision = null; + externalParent = null; + state = null; + File f = repo.getFileFromRepoDir("rebasestate"); + if (!f.exists()) { + return this; + } + state = new HashMap<Nodeid, Nodeid>(); + try { + LineReader lr = new LineReader(f, repo.getSessionContext().getLog()); + ArrayList<String> contents = new ArrayList<String>(); + lr.read(new LineReader.SimpleLineCollector(), contents); + Iterator<String> it = contents.iterator(); + workingDirParent = Nodeid.fromAscii(it.next()); + destRevision = Nodeid.fromAscii(it.next()); + externalParent = Nodeid.fromAscii(it.next()); + collapse = "1".equals(it.next()); + keepOriginalRevisions = "1".equals(it.next()); + keepBranchNames = "1".equals(it.next()); + final String nullmerge = "-2"; + while (it.hasNext()) { + String line = it.next(); + int x = line.indexOf(':'); + if (x == -1) { + throw new HgInvalidStateException(line); + } + Nodeid oldRev = Nodeid.fromAscii(line.substring(0, x)); + Nodeid newRev; + if (line.regionMatches(x+1, nullmerge, 0, nullmerge.length())) { + newRev = null; + } else { + newRev = Nodeid.fromAscii(line.substring(x+1)); + } + state.put(oldRev, newRev); + } + } catch (NoSuchElementException ex) { + throw new HgIOException("Bad format of rebase state file", f); + } catch (HgBadNodeidFormatException ex) { + throw new HgIOException("Bad format of rebase state file", ex, f); + } catch (HgInvalidFileException ex) { + throw new HgIOException("Bad format of rebase state file", ex, f); + } + return this; + } + + /** + * Tells whether rebase process was interrupted to manually resolve a merge + * and can be resumed or aborted. + * + * @return <code>true</code> when rebase is in progress + */ + public boolean isRebaseInProgress() { + return state != null; + } + + public Nodeid getWorkingDirParent() { + assert isRebaseInProgress(); + return workingDirParent; + } + + public Nodeid getTarget() { + assert isRebaseInProgress(); + return destRevision; + } + + public Nodeid getExternalParent() { + assert isRebaseInProgress(); + assert collapse; + return externalParent; + } + + public boolean isCollapse() { + return collapse; + } + + public boolean isKeepOriginalRevisions() { + return keepOriginalRevisions; + } + + public boolean isKeepBranchNames() { + return keepBranchNames; + } +}