comparison src/org/tmatesoft/hg/core/HgCloneCommand.java @ 539:9edfd5a223b8

Commit: handle empty repository case
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 13 Feb 2013 18:44:58 +0100
parents 243202f1bda5
children e4ee4bf4c7d0
comparison
equal deleted inserted replaced
538:dd4f6311af52 539:9edfd5a223b8
24 import java.io.File; 24 import java.io.File;
25 import java.io.FileOutputStream; 25 import java.io.FileOutputStream;
26 import java.io.IOException; 26 import java.io.IOException;
27 import java.util.ArrayList; 27 import java.util.ArrayList;
28 import java.util.Collections; 28 import java.util.Collections;
29 import java.util.LinkedList;
30 import java.util.TreeMap; 29 import java.util.TreeMap;
31 30
32 import org.tmatesoft.hg.internal.ByteArrayDataAccess; 31 import org.tmatesoft.hg.internal.ByteArrayDataAccess;
33 import org.tmatesoft.hg.internal.DataAccess; 32 import org.tmatesoft.hg.internal.DataAccess;
34 import org.tmatesoft.hg.internal.DataAccessProvider; 33 import org.tmatesoft.hg.internal.DataAccessProvider;
35 import org.tmatesoft.hg.internal.DataSerializer; 34 import org.tmatesoft.hg.internal.DataSerializer;
36 import org.tmatesoft.hg.internal.DigestHelper; 35 import org.tmatesoft.hg.internal.DigestHelper;
36 import org.tmatesoft.hg.internal.FNCacheFile;
37 import org.tmatesoft.hg.internal.Internals;
37 import org.tmatesoft.hg.internal.Lifecycle; 38 import org.tmatesoft.hg.internal.Lifecycle;
38 import org.tmatesoft.hg.internal.RepoInitializer; 39 import org.tmatesoft.hg.internal.RepoInitializer;
39 import org.tmatesoft.hg.internal.RevlogCompressor; 40 import org.tmatesoft.hg.internal.RevlogCompressor;
40 import org.tmatesoft.hg.internal.RevlogStreamWriter; 41 import org.tmatesoft.hg.internal.RevlogStreamWriter;
41 import org.tmatesoft.hg.repo.HgBundle; 42 import org.tmatesoft.hg.repo.HgBundle;
47 import org.tmatesoft.hg.repo.HgRemoteRepository; 48 import org.tmatesoft.hg.repo.HgRemoteRepository;
48 import org.tmatesoft.hg.repo.HgRepository; 49 import org.tmatesoft.hg.repo.HgRepository;
49 import org.tmatesoft.hg.repo.HgRuntimeException; 50 import org.tmatesoft.hg.repo.HgRuntimeException;
50 import org.tmatesoft.hg.util.CancelSupport; 51 import org.tmatesoft.hg.util.CancelSupport;
51 import org.tmatesoft.hg.util.CancelledException; 52 import org.tmatesoft.hg.util.CancelledException;
53 import org.tmatesoft.hg.util.Path;
52 import org.tmatesoft.hg.util.PathRewrite; 54 import org.tmatesoft.hg.util.PathRewrite;
53 import org.tmatesoft.hg.util.ProgressSupport; 55 import org.tmatesoft.hg.util.ProgressSupport;
54 56
55 /** 57 /**
56 * WORK IN PROGRESS, DO NOT USE 58 * WORK IN PROGRESS, DO NOT USE
153 private DataAccess prevRevContent; 155 private DataAccess prevRevContent;
154 private final DigestHelper dh = new DigestHelper(); 156 private final DigestHelper dh = new DigestHelper();
155 // recently processed nodes last, so that index in the array may be used as a linkRevision or baseRevision 157 // recently processed nodes last, so that index in the array may be used as a linkRevision or baseRevision
156 private final ArrayList<Nodeid> revisionSequence = new ArrayList<Nodeid>(); 158 private final ArrayList<Nodeid> revisionSequence = new ArrayList<Nodeid>();
157 159
158 private final LinkedList<String> fncacheFiles = new LinkedList<String>(); 160 private FNCacheFile fncacheFile;
159 private RepoInitializer repoInit; 161 private RepoInitializer repoInit;
160 private Lifecycle.Callback lifecycleCallback; 162 private Lifecycle.Callback lifecycleCallback;
161 private CancelledException cancelException; 163 private CancelledException cancelException;
162 164
163 private RevlogStreamWriter.HeaderWriter revlogHeader = new RevlogStreamWriter.HeaderWriter(true); 165 private RevlogStreamWriter.HeaderWriter revlogHeader = new RevlogStreamWriter.HeaderWriter(true);
174 revlogDataZip = new RevlogCompressor(sessionCtx); 176 revlogDataZip = new RevlogCompressor(sessionCtx);
175 } 177 }
176 178
177 public void initEmptyRepository() throws IOException { 179 public void initEmptyRepository() throws IOException {
178 repoInit.initEmptyRepository(hgDir); 180 repoInit.initEmptyRepository(hgDir);
181 try {
182 assert (repoInit.getRequires() & FNCACHE) != 0;
183 fncacheFile = new FNCacheFile(Internals.getInstance(new HgLookup(ctx).detect(hgDir)));
184 } catch (HgRepositoryNotFoundException ex) {
185 // SHALL NOT HAPPEN provided we initialized empty repository successfully
186 // TODO perhaps, with WriteDownMate moving to a more appropriate location,
187 // we could instantiate HgRepository (or Internals) by other means, without exception?
188 throw new IOException("Can't access fncache for newly created repository", ex);
189 }
179 } 190 }
180 191
181 public void complete() throws IOException { 192 public void complete() throws IOException {
182 FileOutputStream fncacheFile = new FileOutputStream(new File(hgDir, "store/fncache")); 193 fncacheFile.write();
183 for (String s : fncacheFiles) {
184 fncacheFile.write(s.getBytes());
185 fncacheFile.write(0x0A); // http://mercurial.selenic.com/wiki/fncacheRepoFormat
186 }
187 fncacheFile.close();
188 } 194 }
189 195
190 public void changelogStart() { 196 public void changelogStart() {
191 try { 197 try {
192 revlogHeader.offset(0).baseRevision(-1); 198 revlogHeader.offset(0).baseRevision(-1);
235 241
236 public void fileStart(String name) { 242 public void fileStart(String name) {
237 try { 243 try {
238 revlogHeader.offset(0).baseRevision(-1); 244 revlogHeader.offset(0).baseRevision(-1);
239 revisionSequence.clear(); 245 revisionSequence.clear();
240 fncacheFiles.add("data/" + name + ".i"); // TODO post-1.0 this is pure guess, 246 fncacheFile.add(Path.create(name));
241 // need to investigate more how filenames are kept in fncache
242 File file = new File(hgDir, filename = storagePathHelper.rewrite(name).toString()); 247 File file = new File(hgDir, filename = storagePathHelper.rewrite(name).toString());
243 file.getParentFile().mkdirs(); 248 file.getParentFile().mkdirs();
244 indexFile = new FileOutputStream(file); 249 indexFile = new FileOutputStream(file);
245 } catch (IOException ex) { 250 } catch (IOException ex) {
246 String m = String.format("Failed to write file %s", filename); 251 String m = String.format("Failed to write file %s", filename);