Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/FNCacheFile.java @ 616:5e0313485eef
encode directories as demanded by fncache format
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 14 May 2013 17:31:35 +0200 |
| parents | 6ca3d0c5b4bc |
| children | 507602cb4fb3 |
comparison
equal
deleted
inserted
replaced
| 615:84104448a0bf | 616:5e0313485eef |
|---|---|
| 17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
| 18 | 18 |
| 19 import java.io.File; | 19 import java.io.File; |
| 20 import java.io.FileOutputStream; | 20 import java.io.FileOutputStream; |
| 21 import java.io.IOException; | 21 import java.io.IOException; |
| 22 import java.nio.ByteBuffer; | |
| 23 import java.nio.CharBuffer; | |
| 24 import java.nio.channels.FileChannel; | |
| 22 import java.nio.charset.Charset; | 25 import java.nio.charset.Charset; |
| 23 import java.util.ArrayList; | 26 import java.util.ArrayList; |
| 24 import java.util.List; | 27 import java.util.List; |
| 25 | 28 |
| 26 import org.tmatesoft.hg.util.Path; | 29 import org.tmatesoft.hg.util.Path; |
| 39 */ | 42 */ |
| 40 public class FNCacheFile { | 43 public class FNCacheFile { |
| 41 | 44 |
| 42 private final Internals repo; | 45 private final Internals repo; |
| 43 // private final List<Path> files; | 46 // private final List<Path> files; |
| 44 private List<Path> added; | 47 private final List<Path> addedDotI; |
| 48 private final List<Path> addedDotD; | |
| 49 private final FNCachePathHelper pathHelper; | |
| 45 | 50 |
| 46 public FNCacheFile(Internals internalRepo) { | 51 public FNCacheFile(Internals internalRepo) { |
| 47 repo = internalRepo; | 52 repo = internalRepo; |
| 48 // files = new ArrayList<Path>(); | 53 // files = new ArrayList<Path>(); |
| 54 pathHelper = new FNCachePathHelper(); | |
| 55 addedDotI = new ArrayList<Path>(5); | |
| 56 addedDotD = new ArrayList<Path>(5); | |
| 49 } | 57 } |
| 50 | 58 |
| 51 /* | 59 /* |
| 52 * For append-only option, we don't care reading the original content | 60 * For append-only option, we don't care reading the original content |
| 53 public void read(Path.Source pathFactory) throws IOException { | 61 public void read(Path.Source pathFactory) throws IOException { |
| 65 } | 73 } |
| 66 } | 74 } |
| 67 */ | 75 */ |
| 68 | 76 |
| 69 public void write() throws IOException { | 77 public void write() throws IOException { |
| 70 if (added == null || added.isEmpty()) { | 78 if (addedDotI.isEmpty() && addedDotD.isEmpty()) { |
| 71 return; | 79 return; |
| 72 } | 80 } |
| 73 File f = fncacheFile(); | 81 File f = fncacheFile(); |
| 74 f.getParentFile().mkdirs(); | 82 f.getParentFile().mkdirs(); |
| 75 final Charset filenameEncoding = repo.getFilenameEncoding(); | 83 final Charset filenameEncoding = repo.getFilenameEncoding(); |
| 76 FileOutputStream fncacheFile = new FileOutputStream(f, true); | 84 ArrayList<CharBuffer> added = new ArrayList<CharBuffer>(); |
| 77 for (Path p : added) { | 85 for (Path p : addedDotI) { |
| 78 String s = "data/" + p.toString() + ".i"; // TODO post-1.0 this is plain wrong. (a) need .d files, too; (b) what about dh/ location? | 86 added.add(CharBuffer.wrap(pathHelper.rewrite(p))); |
| 79 fncacheFile.write(s.getBytes(filenameEncoding)); | 87 } |
| 80 fncacheFile.write(0x0A); // http://mercurial.selenic.com/wiki/fncacheRepoFormat | 88 for (Path p : addedDotD) { |
| 89 // XXX FNCachePathHelper always return name of an index file, need to change it into a name of data file, | |
| 90 // although the approach (to replace last char) is depressingly awful | |
| 91 CharSequence cs = pathHelper.rewrite(p); | |
| 92 CharBuffer cb = CharBuffer.allocate(cs.length()); | |
| 93 cb.append(cs); | |
| 94 cb.put(cs.length()-1, 'd'); | |
| 95 cb.flip(); | |
| 96 added.add(cb); | |
| 97 } | |
| 98 FileChannel fncacheFile = new FileOutputStream(f, true).getChannel(); | |
| 99 ByteBuffer lf = ByteBuffer.wrap(new byte[] { 0x0A }); | |
| 100 for (CharBuffer b : added) { | |
| 101 fncacheFile.write(filenameEncoding.encode(b)); | |
| 102 fncacheFile.write(lf); | |
| 103 lf.rewind(); | |
| 81 } | 104 } |
| 82 fncacheFile.close(); | 105 fncacheFile.close(); |
| 83 } | 106 } |
| 84 | 107 |
| 85 public void add(Path p) { | 108 public void addIndex(Path p) { |
| 86 if (added == null) { | 109 addedDotI.add(p); |
| 87 added = new ArrayList<Path>(); | 110 } |
| 88 } | 111 |
| 89 added.add(p); | 112 public void addData(Path p) { |
| 113 addedDotD.add(p); | |
| 90 } | 114 } |
| 91 | 115 |
| 92 private File fncacheFile() { | 116 private File fncacheFile() { |
| 93 return repo.getFileFromStoreDir("fncache"); | 117 return repo.getFileFromStoreDir("fncache"); |
| 94 } | 118 } |
