1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.internal.storage.file;
45
46 import java.io.File;
47 import java.io.FileNotFoundException;
48 import java.io.IOException;
49 import java.util.List;
50
51 import org.eclipse.jgit.internal.storage.pack.CachedPack;
52 import org.eclipse.jgit.internal.storage.pack.ObjectToPack;
53 import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
54 import org.eclipse.jgit.internal.storage.pack.StoredObjectRepresentation;
55
56 class LocalCachedPack extends CachedPack {
57 private final ObjectDirectory odb;
58
59 private final String[] packNames;
60
61 private PackFile[] packs;
62
63 LocalCachedPack(ObjectDirectory odb, List<String> packNames) {
64 this.odb = odb;
65 this.packNames = packNames.toArray(new String[packNames.size()]);
66 }
67
68 LocalCachedPack(List<PackFile> packs) {
69 odb = null;
70 packNames = null;
71 this.packs = packs.toArray(new PackFile[packs.size()]);
72 }
73
74 @Override
75 public long getObjectCount() throws IOException {
76 long cnt = 0;
77 for (PackFile pack : getPacks())
78 cnt += pack.getObjectCount();
79 return cnt;
80 }
81
82 void copyAsIs(PackOutputStream out, WindowCursor wc)
83 throws IOException {
84 for (PackFile pack : getPacks())
85 pack.copyPackAsIs(out, wc);
86 }
87
88 @Override
89 public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
90 try {
91 LocalObjectRepresentation local = (LocalObjectRepresentation) rep;
92 for (PackFile pack : getPacks()) {
93 if (local.pack == pack)
94 return true;
95 }
96 return false;
97 } catch (FileNotFoundException packGone) {
98 return false;
99 }
100 }
101
102 private PackFile[] getPacks() throws FileNotFoundException {
103 if (packs == null) {
104 PackFile[] p = new PackFile[packNames.length];
105 for (int i = 0; i < packNames.length; i++)
106 p[i] = getPackFile(packNames[i]);
107 packs = p;
108 }
109 return packs;
110 }
111
112 private PackFile getPackFile(String packName) throws FileNotFoundException {
113 for (PackFile pack : odb.getPacks()) {
114 if (packName.equals(pack.getPackName()))
115 return pack;
116 }
117 throw new FileNotFoundException(getPackFilePath(packName));
118 }
119
120 private String getPackFilePath(String packName) {
121 final File packDir = new File(odb.getDirectory(), "pack");
122 return new File(packDir, "pack-" + packName + ".pack").getPath();
123 }
124 }