public void execute() throws HgException, CancelledException {
final HgRepositoryLock wdLock = repo.getWorkingDirLock();
wdLock.acquire();
try {
final ProgressSupport progress = getProgressSupport(null);
final CancelSupport cancellation = getCancelSupport(null, true);
cancellation.checkCancelled();
progress.start(files.size() + 2);
final int csetRevision;
if (changesetToCheckout.get() == HgRepository.WORKING_COPY) {
csetRevision = repo.getChangelog().getRevisionIndex(repo.getWorkingCopyParents().first());
} else {
csetRevision = changesetToCheckout.get();
}
Internals implRepo = Internals.getInstance(repo);
final DirstateBuilder dirstateBuilder = new DirstateBuilder(implRepo);
dirstateBuilder.fillFrom(new DirstateReader(implRepo, new Path.SimpleSource()));
progress.worked(1);
cancellation.checkCancelled();
final HgCheckoutCommand.CheckoutWorker worker = new HgCheckoutCommand.CheckoutWorker(implRepo);
HgManifest.Inspector insp = new HgManifest.Inspector() {
public boolean next(Nodeid nid, Path fname, Flags flags) {
if (worker.next(nid, fname, flags)) {
dirstateBuilder.recordUncertain(fname);
return true;
}
return false;
}
public boolean end(int manifestRevision) {
return false;
}
public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) {
return true;
}
};
for (Path file : files) {
File f = new File(repo.getWorkingDir(), file.toString());
if (f.isFile()) {
if (keepOriginal) {
File copy = new File(f.getParentFile(), f.getName() + ".orig");
if (copy.exists()) {
copy.delete();
}
f.renameTo(copy);
} else {
f.delete();
}
}
repo.getManifest().walkFileRevisions(file, insp, csetRevision);
worker.checkFailed();
progress.worked(1);
cancellation.checkCancelled();
}
Transaction.Factory trFactory = implRepo.getTransactionFactory();
Transaction tr = trFactory.create(repo);
try {
// TODO same code in HgAddRemoveCommand and similar in HgCommitCommand