comparison src/org/tmatesoft/hg/internal/RevlogStreamFactory.java @ 621:99ad1e3a4e4d

RevlogStream: be aware of existence (not HgDataFile), facilitate use of an added HgDataFile over a commit; Rollback: be more sensitive about file changes (file size is not enough: write/rollback leaves it intact); tests
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Sat, 18 May 2013 22:23:57 +0200
parents e1b29756f901
children
comparison
equal deleted inserted replaced
620:272ecffccc8a 621:99ad1e3a4e4d
15 * contact TMate Software at support@hg4j.com 15 * contact TMate Software at support@hg4j.com
16 */ 16 */
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.IOException;
21 import java.lang.ref.SoftReference; 20 import java.lang.ref.SoftReference;
22 import java.util.HashMap; 21 import java.util.HashMap;
23 22
24 import org.tmatesoft.hg.repo.HgInvalidControlFileException;
25 import org.tmatesoft.hg.util.Path; 23 import org.tmatesoft.hg.util.Path;
26 24
27 /** 25 /**
28 * Factory to create {@link RevlogStream RevlogStreams}, cache-capable. 26 * Factory to create {@link RevlogStream RevlogStreams}, cache-capable.
29 * 27 *
55 /** 53 /**
56 * Perhaps, should be separate interface, like ContentLookup 54 * Perhaps, should be separate interface, like ContentLookup
57 * @param path - normalized file name 55 * @param path - normalized file name
58 * @return <code>null</code> if path doesn't resolve to a existing file 56 * @return <code>null</code> if path doesn't resolve to a existing file
59 */ 57 */
60 /*package-local*/ RevlogStream resolveStoreFile(Path path) { 58 /*package-local*/ RevlogStream getStoreFile(Path path, boolean onlyIfExists) {
61 final SoftReference<RevlogStream> ref = shallCacheRevlogs() ? streamsCache.get(path) : null; 59 final SoftReference<RevlogStream> ref = shallCacheRevlogs() ? streamsCache.get(path) : null;
62 RevlogStream cached = ref == null ? null : ref.get(); 60 RevlogStream cached = ref == null ? null : ref.get();
63 if (cached != null) { 61 if (cached != null) {
64 return cached; 62 return cached;
65 } 63 }
66 File f = repo.getFileFromDataDir(path); 64 File f = repo.getFileFromDataDir(path);
67 if (f.exists()) { 65 if (!onlyIfExists || f.exists()) {
68 RevlogStream s = create(f); 66 RevlogStream s = create(f);
69 if (shallCacheRevlogs()) { 67 if (shallCacheRevlogs()) {
70 streamsCache.put(path, new SoftReference<RevlogStream>(s)); 68 streamsCache.put(path, new SoftReference<RevlogStream>(s));
71 } 69 }
72 return s; 70 return s;
73 } 71 }
74 return null; 72 return null;
75 } 73 }
76 74
77 /*package-local*/ RevlogStream createStoreFile(Path path) throws HgInvalidControlFileException {
78 File f = repo.getFileFromDataDir(path);
79 try {
80 if (!f.exists()) {
81 f.getParentFile().mkdirs();
82 f.createNewFile();
83 }
84 RevlogStream s = create(f);
85 if (shallCacheRevlogs()) {
86 streamsCache.put(path, new SoftReference<RevlogStream>(s));
87 }
88 return s;
89 } catch (IOException ex) {
90 throw new HgInvalidControlFileException("Can't create a file in the storage", ex, f);
91 }
92 }
93
94 private boolean shallCacheRevlogs() { 75 private boolean shallCacheRevlogs() {
95 return streamsCache != null; 76 return streamsCache != null;
96 } 77 }
97 } 78 }