Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgDataFile.java @ 115:c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 03 Feb 2011 23:32:08 +0100 |
parents | a3a2e5deb320 |
children | b1d6208fb517 |
comparison
equal
deleted
inserted
replaced
114:46291ec605a0 | 115:c0cc2535462c |
---|---|
16 */ | 16 */ |
17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
18 | 18 |
19 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 19 import static org.tmatesoft.hg.repo.HgRepository.TIP; |
20 | 20 |
21 import java.nio.ByteBuffer; | |
21 import java.util.ArrayList; | 22 import java.util.ArrayList; |
22 import java.util.Collection; | 23 import java.util.Collection; |
23 import java.util.TreeMap; | 24 import java.util.TreeMap; |
24 | 25 |
25 import org.tmatesoft.hg.core.Nodeid; | 26 import org.tmatesoft.hg.core.Nodeid; |
26 import org.tmatesoft.hg.core.Path; | 27 import org.tmatesoft.hg.core.Path; |
27 import org.tmatesoft.hg.internal.RevlogStream; | 28 import org.tmatesoft.hg.internal.RevlogStream; |
29 import org.tmatesoft.hg.util.ByteChannel; | |
28 | 30 |
29 | 31 |
30 | 32 |
31 /** | 33 /** |
32 * ? name:HgFileNode? | 34 * ? name:HgFileNode? |
40 // slashes, unix-style? | 42 // slashes, unix-style? |
41 // repo location agnostic, just to give info to user, not to access real storage | 43 // repo location agnostic, just to give info to user, not to access real storage |
42 private final Path path; | 44 private final Path path; |
43 private Metadata metadata; | 45 private Metadata metadata; |
44 | 46 |
45 /*package-local*/HgDataFile(HgRepository hgRepo, Path path, RevlogStream content) { | 47 /*package-local*/HgDataFile(HgRepository hgRepo, Path filePath, RevlogStream content) { |
46 super(hgRepo, content); | 48 super(hgRepo, content); |
47 this.path = path; | 49 path = filePath; |
48 } | 50 } |
49 | 51 |
52 /*package-local*/HgDataFile(HgRepository hgRepo, Path filePath) { | |
53 super(hgRepo); | |
54 path = filePath; | |
55 } | |
56 | |
57 // exists is not the best name possible. now it means no file with such name was ever known to the repo. | |
58 // it might be confused with files existed before but lately removed. | |
50 public boolean exists() { | 59 public boolean exists() { |
51 return content != null; // XXX need better impl | 60 return content != null; // XXX need better impl |
52 } | 61 } |
53 | 62 |
54 // human-readable (i.e. "COPYING", not "store/data/_c_o_p_y_i_n_g.i") | 63 // human-readable (i.e. "COPYING", not "store/data/_c_o_p_y_i_n_g.i") |
60 return content.dataLength(getLocalRevision(nodeid)); | 69 return content.dataLength(getLocalRevision(nodeid)); |
61 } | 70 } |
62 | 71 |
63 public byte[] content() { | 72 public byte[] content() { |
64 return content(TIP); | 73 return content(TIP); |
74 } | |
75 | |
76 public void content(int revision, ByteChannel sink) throws /*TODO typed*/Exception { | |
77 byte[] content = content(revision); | |
78 ByteBuffer buf = ByteBuffer.allocate(512); | |
79 int left = content.length; | |
80 int offset = 0; | |
81 do { | |
82 buf.put(content, offset, Math.min(left, buf.remaining())); | |
83 buf.flip(); | |
84 int consumed = sink.write(buf); | |
85 buf.compact(); | |
86 offset += consumed; | |
87 left -= consumed; | |
88 } while (left > 0); | |
65 } | 89 } |
66 | 90 |
67 // for data files need to check heading of the file content for possible metadata | 91 // for data files need to check heading of the file content for possible metadata |
68 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- | 92 // @see http://mercurial.selenic.com/wiki/FileFormats#data.2BAC8- |
69 @Override | 93 @Override |