1 package org
.spearce
.jgit
.lib
;
3 import java
.io
.BufferedReader
;
5 import java
.io
.FileInputStream
;
6 import java
.io
.FileNotFoundException
;
7 import java
.io
.FileReader
;
8 import java
.io
.IOException
;
9 import java
.io
.InputStream
;
11 public class ObjectDatabase
{
12 private static final String
[] refSearchPaths
= { "", "refs/", "refs/tags/",
15 private final File db
;
17 private final File objectsDir
;
19 public ObjectDatabase(final File d
) {
20 db
= d
.getAbsoluteFile();
21 objectsDir
= new File(db
, "objects");
24 private InputStream
openObjectStream(final ObjectId objectId
)
27 final String n
= objectId
.toString();
28 return new FileInputStream(new File(new File(objectsDir
, n
29 .substring(0, 2)), n
.substring(2)));
30 } catch (FileNotFoundException fnfe
) {
35 public ObjectReader
openBlob(final ObjectId id
) throws IOException
{
36 final InputStream fis
= openObjectStream(id
);
42 final ObjectReader or
= new ObjectReader(id
, fis
);
43 if ("blob".equals(or
.getType())) {
46 throw new CorruptObjectException("Not a blob " + id
);
48 } catch (IOException ioe
) {
54 public Commit
openCommit(final ObjectId id
) throws IOException
{
55 final InputStream fis
= openObjectStream(id
);
61 final ObjectReader or
= new ObjectReader(id
, fis
);
63 if ("commit".equals(or
.getType())) {
64 return new Commit(this, id
, or
.getBufferedReader());
66 throw new CorruptObjectException("Not a commit: " + id
);
71 } catch (IOException ioe
) {
77 public Tree
openTree(final ObjectId id
) throws IOException
{
78 final InputStream fis
= openObjectStream(id
);
84 final ObjectReader or
= new ObjectReader(id
, fis
);
86 if ("commit".equals(or
.getType())) {
87 return openTree(new Commit(this, id
, or
.getBufferedReader())
89 } else if ("tree".equals(or
.getType())) {
90 return new Tree(this, id
, or
.getInputStream());
92 throw new CorruptObjectException("Not a tree-ish: " + id
);
97 } catch (IOException ioe
) {
103 private ObjectId
readRef(final String name
) throws IOException
{
104 final File f
= new File(db
, name
);
108 final BufferedReader fr
= new BufferedReader(new FileReader(f
));
110 final String line
= fr
.readLine();
111 if (line
== null || line
.length() == 0) {
114 if (line
.startsWith("ref: ")) {
115 return readRef(line
.substring("ref: ".length()));
117 if (ObjectId
.isId(line
)) {
118 return new ObjectId(line
);
120 throw new IOException("Not a ref: " + name
+ ": " + line
);
126 public ObjectId
resolveRevision(final String r
) throws IOException
{
129 if (ObjectId
.isId(r
)) {
130 id
= new ObjectId(r
);
133 for (int k
= 0; k
< refSearchPaths
.length
; k
++) {
134 id
= readRef(refSearchPaths
[k
] + r
);
143 public String
toString() {
144 return "ObjectDatabase[" + db
+ "]";