]> source.dussan.org Git - jgit.git/commitdiff
Add a DFS repository description and reference it in each pack 41/4541/3
authorDave Borowitz <dborowitz@google.com>
Fri, 7 Oct 2011 22:31:19 +0000 (15:31 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 4 Nov 2011 18:14:32 +0000 (11:14 -0700)
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

org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsObjDatabase.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsPackDescription.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepository.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryBuilder.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsRepositoryDescription.java [new file with mode: 0644]
org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/InMemoryRepository.java

index 8c95340756b4a66576a03c2da637a49e1b3302fd..5a6c630bff78ce24753d8f95a8f31363f5904af7 100644 (file)
@@ -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.
         *
index 88a1ec345f723ea47a67aee87682e1dfdc687198..9e1e597afe03409eec372d24aaf83d630037ea17 100644 (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;
        }
 
index df54f2fca52b15e5ba20d59e15b90fe79cceb826..577e1fa24974a6be6f776281935e912d806a6372 100644 (file)
@@ -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.
         *
index 6fd3ccaebb37d8d6e4ae13edd28f31f8775dec89..a41779f4d0ae3154daf773a415583ca170361d8e 100644 (file)
@@ -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 (file)
index 0000000..f51a03a
--- /dev/null
@@ -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() + "]";
+       }
+}
index 51e3af13438c7a2a0c9238195d70c375719ac764..635e68c2c9af21c07cea8c912247cff83872cb44 100644 (file)
@@ -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);
                }
        }