blob: 2051ae3bb2d6f98f5a3d8ee281d8deb1fd776e02 [file] [log] [blame]
Dave Borowitz64455592013-02-21 12:28:01 -08001// Copyright (C) 2013 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
David Ostrovskydaf5cce2017-09-20 00:19:04 +020015package com.google.gerrit.testing;
Dave Borowitz64455592013-02-21 12:28:01 -080016
Dave Borowitz64455592013-02-21 12:28:01 -080017import com.google.common.collect.Sets;
David Ostrovskyb03a6e92019-05-26 14:11:47 +020018import com.google.gerrit.entities.Project;
Marija Savtchouk6a88e312021-08-20 16:50:26 +010019import com.google.gerrit.entities.Project.NameKey;
Dave Borowitz64455592013-02-21 12:28:01 -080020import com.google.gerrit.server.git.GitRepositoryManager;
21import com.google.gerrit.server.git.RepositoryCaseMismatchException;
Dave Borowitzc7078ab2017-04-24 13:42:19 +020022import com.google.inject.Inject;
Edwin Kempinfe105c22021-12-22 15:22:00 +010023import java.util.Collections;
Dave Borowitz292fa152016-11-13 09:56:32 -080024import java.util.HashMap;
25import java.util.Map;
Edwin Kempinfe105c22021-12-22 15:22:00 +010026import java.util.NavigableSet;
Dave Borowitz64455592013-02-21 12:28:01 -080027import org.eclipse.jgit.errors.RepositoryNotFoundException;
Shawn Pearce95c5dee2013-03-18 09:19:15 -070028import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
29import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
30import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
Dave Borowitz64455592013-02-21 12:28:01 -080031
Dave Borowitz64455592013-02-21 12:28:01 -080032/** Repository manager that uses in-memory repositories. */
33public class InMemoryRepositoryManager implements GitRepositoryManager {
Dave Borowitz826a7b62013-12-05 15:44:21 -080034 public static InMemoryRepository newRepository(Project.NameKey name) {
Dave Borowitz24b3e672017-07-28 12:55:47 -040035 return new Repo(name);
Dave Borowitz826a7b62013-12-05 15:44:21 -080036 }
37
Dave Borowitz7ffd9a82015-05-18 14:41:30 -070038 public static class Description extends DfsRepositoryDescription {
39 private final Project.NameKey name;
Dave Borowitz64455592013-02-21 12:28:01 -080040
41 private Description(Project.NameKey name) {
42 super(name.get());
Dave Borowitz7ffd9a82015-05-18 14:41:30 -070043 this.name = name;
Dave Borowitz64455592013-02-21 12:28:01 -080044 }
Dave Borowitz7ffd9a82015-05-18 14:41:30 -070045
46 public Project.NameKey getProject() {
47 return name;
48 }
Dave Borowitz64455592013-02-21 12:28:01 -080049 }
50
Dave Borowitz7ffd9a82015-05-18 14:41:30 -070051 public static class Repo extends InMemoryRepository {
Shawn Pearce1ac21e92016-11-14 12:57:34 -080052 private String description;
53
Dave Borowitz24b3e672017-07-28 12:55:47 -040054 private Repo(Project.NameKey name) {
Dave Borowitz64455592013-02-21 12:28:01 -080055 super(new Description(name));
Dave Borowitz24b3e672017-07-28 12:55:47 -040056 setPerformsAtomicTransactions(true);
Dave Borowitz64455592013-02-21 12:28:01 -080057 }
58
59 @Override
60 public Description getDescription() {
61 return (Description) super.getDescription();
62 }
Shawn Pearce1ac21e92016-11-14 12:57:34 -080063
64 @Override
65 public String getGitwebDescription() {
66 return description;
67 }
68
69 @Override
70 public void setGitwebDescription(String d) {
71 description = d;
72 }
Dave Borowitz64455592013-02-21 12:28:01 -080073 }
74
Dave Borowitzc7078ab2017-04-24 13:42:19 +020075 private final Map<String, Repo> repos;
76
Dave Borowitzc7078ab2017-04-24 13:42:19 +020077 @Inject
Dave Borowitz24b3e672017-07-28 12:55:47 -040078 public InMemoryRepositoryManager() {
Dave Borowitzc7078ab2017-04-24 13:42:19 +020079 this.repos = new HashMap<>();
80 }
Dave Borowitz64455592013-02-21 12:28:01 -080081
82 @Override
Marija Savtchouk6a88e312021-08-20 16:50:26 +010083 public synchronized Status getRepositoryStatus(NameKey name) {
84 try {
85 get(name);
86 return Status.ACTIVE;
87 } catch (RepositoryNotFoundException e) {
88 return Status.NON_EXISTENT;
89 }
90 }
91
92 @Override
Dave Borowitz292fa152016-11-13 09:56:32 -080093 public synchronized Repo openRepository(Project.NameKey name) throws RepositoryNotFoundException {
Dave Borowitz64455592013-02-21 12:28:01 -080094 return get(name);
95 }
96
97 @Override
Dave Borowitz7ffd9a82015-05-18 14:41:30 -070098 public synchronized Repo createRepository(Project.NameKey name)
Dave Borowitz64455592013-02-21 12:28:01 -080099 throws RepositoryCaseMismatchException, RepositoryNotFoundException {
100 Repo repo;
101 try {
102 repo = get(name);
103 if (!repo.getDescription().getRepositoryName().equals(name.get())) {
104 throw new RepositoryCaseMismatchException(name);
105 }
106 } catch (RepositoryNotFoundException e) {
Dave Borowitz24b3e672017-07-28 12:55:47 -0400107 repo = new Repo(name);
Dave Borowitz64c23402016-07-12 18:21:35 -0400108 repos.put(normalize(name), repo);
Dave Borowitz64455592013-02-21 12:28:01 -0800109 }
110 return repo;
111 }
112
113 @Override
Edwin Kempinfe105c22021-12-22 15:22:00 +0100114 public synchronized NavigableSet<Project.NameKey> list() {
115 NavigableSet<Project.NameKey> names = Sets.newTreeSet();
Dave Borowitz64455592013-02-21 12:28:01 -0800116 for (DfsRepository repo : repos.values()) {
Dave Borowitz5c9a6502019-04-19 09:14:35 -0700117 names.add(Project.nameKey(repo.getDescription().getRepositoryName()));
Dave Borowitz64455592013-02-21 12:28:01 -0800118 }
Edwin Kempinfe105c22021-12-22 15:22:00 +0100119 return Collections.unmodifiableNavigableSet(names);
Dave Borowitz64455592013-02-21 12:28:01 -0800120 }
121
Dave Borowitz64c23402016-07-12 18:21:35 -0400122 public synchronized void deleteRepository(Project.NameKey name) {
123 repos.remove(normalize(name));
124 }
125
Dave Borowitz292fa152016-11-13 09:56:32 -0800126 private synchronized Repo get(Project.NameKey name) throws RepositoryNotFoundException {
Dave Borowitz64c23402016-07-12 18:21:35 -0400127 Repo repo = repos.get(normalize(name));
Dave Borowitz64455592013-02-21 12:28:01 -0800128 if (repo != null) {
David Pursehoused545c292017-02-01 22:47:34 +0900129 repo.incrementOpen();
Dave Borowitz64455592013-02-21 12:28:01 -0800130 return repo;
Dave Borowitz64455592013-02-21 12:28:01 -0800131 }
David Pursehouse32324722016-06-01 21:20:02 +0900132 throw new RepositoryNotFoundException(name.get());
Dave Borowitz64455592013-02-21 12:28:01 -0800133 }
Dave Borowitz64c23402016-07-12 18:21:35 -0400134
135 private static String normalize(Project.NameKey name) {
136 return name.get().toLowerCase();
137 }
Dave Borowitz64455592013-02-21 12:28:01 -0800138}