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[0]);
66 }
67
68 LocalCachedPack(List<PackFile> packs) {
69 odb = null;
70 packNames = null;
71 this.packs = packs.toArray(new PackFile[0]);
72 }
73
74
75 @Override
76 public long getObjectCount() throws IOException {
77 long cnt = 0;
78 for (PackFile pack : getPacks())
79 cnt += pack.getObjectCount();
80 return cnt;
81 }
82
83 void copyAsIs(PackOutputStream out, WindowCursor wc)
84 throws IOException {
85 for (PackFile pack : getPacks())
86 pack.copyPackAsIs(out, wc);
87 }
88
89
90 @Override
91 public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) {
92 try {
93 LocalObjectRepresentation local = (LocalObjectRepresentation) rep;
94 for (PackFile pack : getPacks()) {
95 if (local.pack == pack)
96 return true;
97 }
98 return false;
99 } catch (FileNotFoundException packGone) {
100 return false;
101 }
102 }
103
104 private PackFile[] getPacks() throws FileNotFoundException {
105 if (packs == null) {
106 PackFile[] p = new PackFile[packNames.length];
107 for (int i = 0; i < packNames.length; i++)
108 p[i] = getPackFile(packNames[i]);
109 packs = p;
110 }
111 return packs;
112 }
113
114 private PackFile getPackFile(String packName) throws FileNotFoundException {
115 for (PackFile pack : odb.getPacks()) {
116 if (packName.equals(pack.getPackName()))
117 return pack;
118 }
119 throw new FileNotFoundException(getPackFilePath(packName));
120 }
121
122 private String getPackFilePath(String packName) {
123 final File packDir = odb.getPackDirectory();
124 return new File(packDir, "pack-" + packName + ".pack").getPath();
125 }
126 }