diff options
author | Dave Borowitz <dborowitz@google.com> | 2011-10-07 15:31:19 -0700 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2011-11-04 11:14:32 -0700 |
commit | 35d72ac806d73f0c2c2a1a9882321d08044bb6f8 (patch) | |
tree | 97fc37895e318d7a34b3b82b5ed57283f98fd25a /org.eclipse.jgit/src | |
parent | 5a38e5b440d884d95d503c34fa5b81a7a0e41be8 (diff) | |
download | jgit-35d72ac806d73f0c2c2a1a9882321d08044bb6f8.tar.gz jgit-35d72ac806d73f0c2c2a1a9882321d08044bb6f8.zip |
Add a DFS repository description and reference it in each pack
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: I890b5fccdda12c1090cfabf4083b5c0e98d717f6
Diffstat (limited to 'org.eclipse.jgit/src')
6 files changed, 165 insertions, 14 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java index 8c95340756..5a6c630bff 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java @@ -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. * diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java index 88a1ec345f..9e1e597afe 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java @@ -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; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepository.java index df54f2fca5..577e1fa249 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepository.java @@ -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. * diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryBuilder.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryBuilder.java index 6fd3ccaebb..a41779f4d0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryBuilder.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryBuilder.java @@ -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(); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryDescription.java new file mode 100644 index 0000000000..f51a03a07c --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryDescription.java @@ -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() + "]"; + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/InMemoryRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/InMemoryRepository.java index 51e3af1343..635e68c2c9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/InMemoryRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/InMemoryRepository.java @@ -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); } } |