// Copyright (C) 2020 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.googlesource.gerrit.plugins.replication.pull;

import com.google.common.base.Suppliers;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.data.RefUpdateAttribute;
import com.google.gerrit.server.events.RefUpdatedEvent;

public class FakeGitReferenceUpdatedEvent extends RefUpdatedEvent {
  FakeGitReferenceUpdatedEvent(
      Project.NameKey project,
      String ref,
      String oldObjectId,
      String newObjectId,
      String instanceId) {
    RefUpdateAttribute upd = new RefUpdateAttribute();
    upd.newRev = newObjectId;
    upd.oldRev = oldObjectId;
    upd.project = project.get();
    upd.refName = ref;
    this.refUpdate = Suppliers.ofInstance(upd);
    this.instanceId = instanceId;
  }
}
