Just as DfsPackDescription describes a pack but does not imply it is open in memory, a DfsRepositoryDescription describes a repository at a basic level without it necessarily being open. Change-Id: I890b5fccdda12c1090cfabf4083b5c0e98d717f6tags/v1.2.0.201112221803-r
@@ -111,15 +111,22 @@ public abstract class DfsObjDatabase extends ObjectDatabase { | |||
private final AtomicReference<PackList> packList; | |||
private final DfsRepository repository; | |||
private DfsReaderOptions readerOptions; | |||
/** | |||
* Initialize an object database for are repository. | |||
* Initialize an object database for our repository. | |||
* | |||
* @param repository | |||
* repository owning this object database. | |||
* | |||
* @param options | |||
* how readers should access the object database. | |||
*/ | |||
protected DfsObjDatabase(DfsReaderOptions options) { | |||
protected DfsObjDatabase(DfsRepository repository, | |||
DfsReaderOptions options) { | |||
this.repository = repository; | |||
this.packList = new AtomicReference<PackList>(NO_PACKS); | |||
this.readerOptions = options; | |||
} | |||
@@ -151,6 +158,11 @@ public abstract class DfsObjDatabase extends ObjectDatabase { | |||
return scanPacks(NO_PACKS).packs; | |||
} | |||
/** @return repository owning this object database. */ | |||
protected DfsRepository getRepository() { | |||
return repository; | |||
} | |||
/** | |||
* Generate a new unique name for a pack file. | |||
* |
@@ -57,6 +57,8 @@ import org.eclipse.jgit.storage.pack.PackWriter; | |||
* modified once initialized and presented to the JGit DFS library. | |||
*/ | |||
public class DfsPackDescription implements Comparable<DfsPackDescription> { | |||
private final DfsRepositoryDescription repoDesc; | |||
private final String packName; | |||
private long lastModified; | |||
@@ -74,7 +76,7 @@ public class DfsPackDescription implements Comparable<DfsPackDescription> { | |||
private PackWriter.Statistics stats; | |||
/** | |||
* Initialize a description by pack name. | |||
* Initialize a description by pack name and repository. | |||
* <p> | |||
* The corresponding index file is assumed to exist and end with ".idx" | |||
* instead of ".pack". If this is not true implementors must extend the | |||
@@ -85,11 +87,19 @@ public class DfsPackDescription implements Comparable<DfsPackDescription> { | |||
* | |||
* @param name | |||
* name of the pack file. Must end with ".pack". | |||
* @param repoDesc | |||
* description of the repo containing the pack file. | |||
*/ | |||
public DfsPackDescription(String name) { | |||
public DfsPackDescription(DfsRepositoryDescription repoDesc, String name) { | |||
this.repoDesc = repoDesc; | |||
this.packName = name; | |||
} | |||
/** @return description of the repository. */ | |||
public DfsRepositoryDescription getRepositoryDescription() { | |||
return repoDesc; | |||
} | |||
/** @return name of the pack file. */ | |||
public String getPackName() { | |||
return packName; | |||
@@ -231,8 +241,11 @@ public class DfsPackDescription implements Comparable<DfsPackDescription> { | |||
@Override | |||
public boolean equals(Object b) { | |||
if (b instanceof DfsPackDescription) | |||
return getPackName().equals(((DfsPackDescription) b).getPackName()); | |||
if (b instanceof DfsPackDescription) { | |||
DfsPackDescription desc = (DfsPackDescription) b; | |||
return getPackName().equals(desc.getPackName()) && | |||
getRepositoryDescription().equals(desc.getRepositoryDescription()); | |||
} | |||
return false; | |||
} | |||
@@ -57,6 +57,8 @@ import org.eclipse.jgit.storage.file.ReflogReader; | |||
public abstract class DfsRepository extends Repository { | |||
private final DfsConfig config; | |||
private final DfsRepositoryDescription description; | |||
/** | |||
* Initialize a DFS repository. | |||
* | |||
@@ -66,6 +68,7 @@ public abstract class DfsRepository extends Repository { | |||
protected DfsRepository(DfsRepositoryBuilder builder) { | |||
super(builder); | |||
this.config = new DfsConfig(); | |||
this.description = builder.getRepositoryDescription(); | |||
} | |||
@Override | |||
@@ -74,6 +77,11 @@ public abstract class DfsRepository extends Repository { | |||
@Override | |||
public abstract DfsRefDatabase getRefDatabase(); | |||
/** @return a description of this repository. */ | |||
public DfsRepositoryDescription getDescription() { | |||
return description; | |||
} | |||
/** | |||
* Check if the repository already exists. | |||
* |
@@ -60,6 +60,8 @@ public abstract class DfsRepositoryBuilder<B extends DfsRepositoryBuilder, R ext | |||
extends BaseRepositoryBuilder<B, R> { | |||
private DfsReaderOptions readerOptions; | |||
private DfsRepositoryDescription repoDesc; | |||
/** @return options used by readers accessing the repository. */ | |||
public DfsReaderOptions getReaderOptions() { | |||
return readerOptions; | |||
@@ -77,11 +79,30 @@ public abstract class DfsRepositoryBuilder<B extends DfsRepositoryBuilder, R ext | |||
return self(); | |||
} | |||
/** @return a description of the repository. */ | |||
public DfsRepositoryDescription getRepositoryDescription() { | |||
return repoDesc; | |||
} | |||
/** | |||
* Set the repository description. | |||
* | |||
* @param desc | |||
* new repository description object. | |||
* @return {@code this} | |||
*/ | |||
public B setRepositoryDescription(DfsRepositoryDescription desc) { | |||
repoDesc = desc; | |||
return self(); | |||
} | |||
@Override | |||
public B setup() throws IllegalArgumentException, IOException { | |||
super.setup(); | |||
if (getReaderOptions() == null) | |||
setReaderOptions(new DfsReaderOptions()); | |||
if (getRepositoryDescription() == null) | |||
setRepositoryDescription(new DfsRepositoryDescription()); | |||
return self(); | |||
} | |||
@@ -0,0 +1,91 @@ | |||
/* | |||
* Copyright (C) 2011, Google Inc. | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
* under the terms of the Eclipse Distribution License v1.0 which | |||
* accompanies this distribution, is reproduced below, and is | |||
* available at http://www.eclipse.org/org/documents/edl-v10.php | |||
* | |||
* All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or | |||
* without modification, are permitted provided that the following | |||
* conditions are met: | |||
* | |||
* - Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* - Redistributions in binary form must reproduce the above | |||
* copyright notice, this list of conditions and the following | |||
* disclaimer in the documentation and/or other materials provided | |||
* with the distribution. | |||
* | |||
* - Neither the name of the Eclipse Foundation, Inc. nor the | |||
* names of its contributors may be used to endorse or promote | |||
* products derived from this software without specific prior | |||
* written permission. | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND | |||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, | |||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
*/ | |||
package org.eclipse.jgit.storage.dfs; | |||
/** A description of a Git repository on a DFS. */ | |||
public class DfsRepositoryDescription { | |||
private final String repositoryName; | |||
/** Initialize a new, empty repository description. */ | |||
public DfsRepositoryDescription() { | |||
this(null); | |||
} | |||
/** | |||
* Initialize a new repository description. | |||
* | |||
* @param repositoryName | |||
* the name of the repository. | |||
*/ | |||
public DfsRepositoryDescription(String repositoryName) { | |||
this.repositoryName = repositoryName; | |||
} | |||
/** @return the name of the repository. */ | |||
public String getRepositoryName() { | |||
return repositoryName; | |||
} | |||
@Override | |||
public int hashCode() { | |||
if (getRepositoryName() != null) | |||
return getRepositoryName().hashCode(); | |||
return System.identityHashCode(this); | |||
} | |||
@Override | |||
public boolean equals(Object b) { | |||
if (b instanceof DfsRepositoryDescription){ | |||
String name = getRepositoryName(); | |||
String otherName = ((DfsRepositoryDescription) b).getRepositoryName(); | |||
return name != null ? name.equals(otherName) : this == b; | |||
} | |||
return false; | |||
} | |||
@Override | |||
public String toString() { | |||
return "DfsRepositoryDescription[" + getRepositoryName() + "]"; | |||
} | |||
} |
@@ -30,8 +30,13 @@ public class InMemoryRepository extends DfsRepository { | |||
private final DfsRefDatabase refdb; | |||
/** Initialize a new in-memory repository. */ | |||
public InMemoryRepository() { | |||
/** | |||
* Initialize a new in-memory repository. | |||
* | |||
* @param repoDesc | |||
* description of the repository. | |||
*/ | |||
public InMemoryRepository(DfsRepository repoDesc) { | |||
super(new DfsRepositoryBuilder<DfsRepositoryBuilder, InMemoryRepository>() { | |||
@Override | |||
public InMemoryRepository build() throws IOException { | |||
@@ -39,7 +44,7 @@ public class InMemoryRepository extends DfsRepository { | |||
} | |||
}); | |||
objdb = new MemObjDatabase(); | |||
objdb = new MemObjDatabase(this); | |||
refdb = new MemRefDatabase(); | |||
} | |||
@@ -57,8 +62,8 @@ public class InMemoryRepository extends DfsRepository { | |||
private final AtomicInteger packId = new AtomicInteger(); | |||
private List<DfsPackDescription> packs = new ArrayList<DfsPackDescription>(); | |||
MemObjDatabase() { | |||
super(new DfsReaderOptions()); | |||
MemObjDatabase(DfsRepository repo) { | |||
super(repo, new DfsReaderOptions()); | |||
} | |||
@Override | |||
@@ -69,7 +74,8 @@ public class InMemoryRepository extends DfsRepository { | |||
@Override | |||
protected DfsPackDescription newPack(PackSource source) { | |||
int id = packId.incrementAndGet(); | |||
return new MemPack("pack-" + id + "-" + source.name()); | |||
return new MemPack("pack-" + id + "-" + source.name(), | |||
getRepository().getDescription()); | |||
} | |||
@Override | |||
@@ -136,8 +142,8 @@ public class InMemoryRepository extends DfsRepository { | |||
private byte[] packIndex; | |||
MemPack(String name) { | |||
super(name); | |||
MemPack(String name, DfsRepositoryDescription repoDesc) { | |||
super(repoDesc, name); | |||
} | |||
} | |||