Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgCheckoutCommand.java @ 526:2f9ed6bcefa2
Initial support for Revert command with accompanying minor refactoring
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 15 Jan 2013 17:07:19 +0100 |
parents | 0be5be8d57e9 |
children | 47b7bedf0569 |
comparison
equal
deleted
inserted
replaced
525:0be5be8d57e9 | 526:2f9ed6bcefa2 |
---|---|
14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
16 */ | 16 */ |
17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
18 | 18 |
19 import static org.tmatesoft.hg.repo.HgRepositoryFiles.Dirstate; | |
20 | |
19 import java.io.File; | 21 import java.io.File; |
20 import java.io.FileOutputStream; | 22 import java.io.FileOutputStream; |
21 import java.io.IOException; | 23 import java.io.IOException; |
22 import java.nio.channels.FileChannel; | 24 import java.nio.channels.FileChannel; |
23 | 25 |
25 import org.tmatesoft.hg.internal.Experimental; | 27 import org.tmatesoft.hg.internal.Experimental; |
26 import org.tmatesoft.hg.internal.Internals; | 28 import org.tmatesoft.hg.internal.Internals; |
27 import org.tmatesoft.hg.internal.WorkingDirFileWriter; | 29 import org.tmatesoft.hg.internal.WorkingDirFileWriter; |
28 import org.tmatesoft.hg.repo.HgDataFile; | 30 import org.tmatesoft.hg.repo.HgDataFile; |
29 import org.tmatesoft.hg.repo.HgInvalidRevisionException; | 31 import org.tmatesoft.hg.repo.HgInvalidRevisionException; |
30 import org.tmatesoft.hg.repo.HgInvalidStateException; | |
31 import org.tmatesoft.hg.repo.HgManifest; | 32 import org.tmatesoft.hg.repo.HgManifest; |
33 import org.tmatesoft.hg.repo.HgManifest.Flags; | |
32 import org.tmatesoft.hg.repo.HgRepository; | 34 import org.tmatesoft.hg.repo.HgRepository; |
33 import org.tmatesoft.hg.repo.HgRuntimeException; | 35 import org.tmatesoft.hg.repo.HgRuntimeException; |
34 import org.tmatesoft.hg.repo.HgManifest.Flags; | |
35 import org.tmatesoft.hg.util.CancelledException; | 36 import org.tmatesoft.hg.util.CancelledException; |
36 import org.tmatesoft.hg.util.Path; | 37 import org.tmatesoft.hg.util.Path; |
37 | 38 |
38 /** | 39 /** |
39 * WORK IN PROGRESS. | 40 * WORK IN PROGRESS. |
91 * @throws HgIOException to indicate troubles updating files in working copy | 92 * @throws HgIOException to indicate troubles updating files in working copy |
92 * @throws HgException | 93 * @throws HgException |
93 * @throws CancelledException | 94 * @throws CancelledException |
94 */ | 95 */ |
95 public void execute() throws HgException, CancelledException { | 96 public void execute() throws HgException, CancelledException { |
96 Internals internalRepo = Internals.getInstance(repo); | 97 try { |
97 // remove tracked files from wd (perhaps, just forget 'Added'?) | 98 Internals internalRepo = Internals.getInstance(repo); |
98 // TODO | 99 // FIXME remove tracked files from wd (perhaps, just forget 'Added'?) |
99 final DirstateBuilder dirstateBuilder = new DirstateBuilder(internalRepo.buildFileNameEncodingHelper()); | 100 // TODO |
100 final Exception[] failure = new Exception[1]; | 101 final DirstateBuilder dirstateBuilder = new DirstateBuilder(internalRepo); |
101 HgManifest.Inspector worker = new HgManifest.Inspector() { | 102 final CheckoutWorker worker = new CheckoutWorker(internalRepo); |
102 | 103 HgManifest.Inspector insp = new HgManifest.Inspector() { |
103 public boolean next(Nodeid nid, Path fname, Flags flags) { | 104 |
104 try { | 105 public boolean next(Nodeid nid, Path fname, Flags flags) { |
105 HgDataFile df = repo.getFileNode(fname); | 106 if (worker.next(nid, fname, flags)) { |
106 int fileRevIndex = df.getRevisionIndex(nid); | 107 // new dirstate based on manifest |
107 // check out files based on manifest | 108 dirstateBuilder.recordNormal(fname, flags, worker.getLastWrittenFileSize()); |
108 // FIXME links! | 109 return true; |
109 WorkingDirFileWriter workingDirWriter = new WorkingDirFileWriter(repo); | 110 } |
110 workingDirWriter.processFile(df, fileRevIndex); | 111 return false; |
111 // new dirstate based on manifest | 112 } |
112 dirstateBuilder.recordNormal(fname, flags, workingDirWriter.bytesWritten()); | 113 |
114 public boolean end(int manifestRevision) { | |
115 return false; | |
116 } | |
117 | |
118 public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) { | |
113 return true; | 119 return true; |
114 } catch (IOException ex) { | |
115 failure[0] = ex; | |
116 } catch (HgRuntimeException ex) { | |
117 failure[0] = ex; | |
118 } | 120 } |
119 return false; | 121 }; |
122 dirstateBuilder.parents(repo.getChangelog().getRevision(revisionToCheckout), null); | |
123 repo.getManifest().walk(revisionToCheckout, revisionToCheckout, insp); | |
124 worker.checkFailed(); | |
125 File dirstateFile = internalRepo.getRepositoryFile(Dirstate); | |
126 try { | |
127 FileChannel dirstate = new FileOutputStream(dirstateFile).getChannel(); | |
128 dirstateBuilder.serialize(dirstate); | |
129 dirstate.close(); | |
130 } catch (IOException ex) { | |
131 throw new HgIOException("Can't write down new directory state", ex, dirstateFile); | |
120 } | 132 } |
121 | 133 // FIXME write down branch file |
122 public boolean end(int manifestRevision) { | 134 } catch (HgRuntimeException ex) { |
123 return false; | 135 throw new HgLibraryFailureException(ex); |
136 } | |
137 } | |
138 | |
139 static class CheckoutWorker { | |
140 private final Internals hgRepo; | |
141 private HgException failure; | |
142 private int lastWrittenFileSize; | |
143 | |
144 CheckoutWorker(Internals implRepo) { | |
145 hgRepo = implRepo; | |
146 } | |
147 | |
148 public boolean next(Nodeid nid, Path fname, Flags flags) { | |
149 try { | |
150 HgDataFile df = hgRepo.getRepo().getFileNode(fname); | |
151 int fileRevIndex = df.getRevisionIndex(nid); | |
152 // check out files based on manifest | |
153 // FIXME links! | |
154 WorkingDirFileWriter workingDirWriter = new WorkingDirFileWriter(hgRepo); | |
155 workingDirWriter.processFile(df, fileRevIndex); | |
156 lastWrittenFileSize = workingDirWriter.bytesWritten(); | |
157 return true; | |
158 } catch (IOException ex) { | |
159 failure = new HgIOException("Failed to write down file revision", ex, /*FIXME file*/null); | |
160 } catch (HgRuntimeException ex) { | |
161 failure = new HgLibraryFailureException(ex); | |
124 } | 162 } |
125 | 163 return false; |
126 public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) { | 164 } |
127 return true; | 165 |
166 public int getLastWrittenFileSize() { | |
167 return lastWrittenFileSize; | |
168 } | |
169 | |
170 public void checkFailed() throws HgException { | |
171 if (failure != null) { | |
172 throw failure; | |
128 } | 173 } |
129 }; | |
130 dirstateBuilder.parents(repo.getChangelog().getRevision(revisionToCheckout), null); | |
131 repo.getManifest().walk(revisionToCheckout, revisionToCheckout, worker); | |
132 if (failure[0] != null) { | |
133 if (failure[0] instanceof IOException) { | |
134 throw new HgIOException("Failed to write down file revision", failure[0], /*FIXME file*/null); | |
135 } | |
136 if (failure[0] instanceof HgRuntimeException) { | |
137 throw new HgLibraryFailureException((HgRuntimeException) failure[0]); | |
138 } | |
139 HgInvalidStateException e = new HgInvalidStateException("Unexpected exception"); | |
140 e.initCause(failure[0]); | |
141 throw e; | |
142 } | 174 } |
143 File dirstateFile = internalRepo.getFileFromRepoDir("dirstate"); | 175 }; |
144 try { | |
145 FileChannel dirstate = new FileOutputStream(dirstateFile).getChannel(); | |
146 dirstateBuilder.serialize(dirstate); | |
147 dirstate.close(); | |
148 } catch (IOException ex) { | |
149 throw new HgIOException("Can't write down new directory state", ex, dirstateFile); | |
150 } | |
151 // FIXME write down branch file | |
152 } | |
153 } | 176 } |