diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java deleted file mode 100644 index 3645392f89..0000000000 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (C) 2010 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.gerrit.server.git.receive; - -import com.google.auto.value.AutoValue; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.gerrit.reviewdb.client.PatchSet; -import com.google.gerrit.reviewdb.client.Project; -import com.google.gerrit.reviewdb.client.RefNames; -import com.google.gerrit.server.index.change.ChangeField; -import com.google.gerrit.server.query.change.ChangeData; -import com.google.gerrit.server.query.change.InternalChangeQuery; -import com.google.gerrit.server.util.MagicBranch; -import com.google.gwtorm.server.OrmException; -import com.google.inject.Provider; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.transport.AdvertiseRefsHook; -import org.eclipse.jgit.transport.BaseReceivePack; -import org.eclipse.jgit.transport.ServiceMayNotContinueException; -import org.eclipse.jgit.transport.UploadPack; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** Exposes only the non refs/changes/ reference names. */ -public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook { - private static final Logger log = LoggerFactory.getLogger(ReceiveCommitsAdvertiseRefsHook.class); - - @VisibleForTesting - @AutoValue - public abstract static class Result { - public abstract Map<String, Ref> allRefs(); - - public abstract Set<ObjectId> additionalHaves(); - } - - private final Provider<InternalChangeQuery> queryProvider; - private final Project.NameKey projectName; - - public ReceiveCommitsAdvertiseRefsHook( - Provider<InternalChangeQuery> queryProvider, Project.NameKey projectName) { - this.queryProvider = queryProvider; - this.projectName = projectName; - } - - @Override - public void advertiseRefs(UploadPack us) { - throw new UnsupportedOperationException( - "ReceiveCommitsAdvertiseRefsHook cannot be used for UploadPack"); - } - - @Override - public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException { - Result r = advertiseRefs(HookUtil.ensureAllRefsAdvertised(rp)); - rp.setAdvertisedRefs(r.allRefs(), r.additionalHaves()); - } - - @VisibleForTesting - public Result advertiseRefs(Map<String, Ref> oldRefs) { - Map<String, Ref> r = Maps.newHashMapWithExpectedSize(oldRefs.size()); - Set<ObjectId> allPatchSets = Sets.newHashSetWithExpectedSize(oldRefs.size()); - for (Map.Entry<String, Ref> e : oldRefs.entrySet()) { - String name = e.getKey(); - if (!skip(name)) { - r.put(name, e.getValue()); - } - if (name.startsWith(RefNames.REFS_CHANGES)) { - allPatchSets.add(e.getValue().getObjectId()); - } - } - return new AutoValue_ReceiveCommitsAdvertiseRefsHook_Result( - r, advertiseOpenChanges(allPatchSets)); - } - - private static final ImmutableSet<String> OPEN_CHANGES_FIELDS = - ImmutableSet.of( - // Required for ChangeIsVisibleToPrdicate. - ChangeField.CHANGE.getName(), - ChangeField.REVIEWER.getName(), - // Required during advertiseOpenChanges. - ChangeField.PATCH_SET.getName()); - - private Set<ObjectId> advertiseOpenChanges(Set<ObjectId> allPatchSets) { - // Advertise some recent open changes, in case a commit is based on one. - int limit = 32; - try { - Set<ObjectId> r = Sets.newHashSetWithExpectedSize(limit); - for (ChangeData cd : - queryProvider - .get() - .setRequestedFields(OPEN_CHANGES_FIELDS) - .enforceVisibility(true) - .setLimit(limit) - .byProjectOpen(projectName)) { - PatchSet ps = cd.currentPatchSet(); - if (ps != null) { - ObjectId id = ObjectId.fromString(ps.getRevision().get()); - // Ensure we actually observed a patch set ref pointing to this - // object, in case the database is out of sync with the repo and the - // object doesn't actually exist. - if (allPatchSets.contains(id)) { - r.add(id); - } - } - } - return r; - } catch (OrmException err) { - log.error("Cannot list open changes of " + projectName, err); - return Collections.emptySet(); - } - } - - private static boolean skip(String name) { - return name.startsWith(RefNames.REFS_CHANGES) - || name.startsWith(RefNames.REFS_CACHE_AUTOMERGE) - || MagicBranch.isMagicBranch(name); - } -} |