blob: a93efcf7d14847b266c65f21a2daada732fff598 [file] [log] [blame]
// Copyright (C) 2019 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.multisite.validation.dfsrefdb;
import java.io.IOException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
public interface SharedRefDatabase {
/** A null ref that isn't associated to any name. */
Ref NULL_REF = nullRef(null);
/**
* Create a new in-memory ref name associated with an NULL object id.
*
* @param refName ref name
* @return the new NULL ref object
*/
static Ref nullRef(String refName) {
return new Ref() {
@Override
public String getName() {
return refName;
}
@Override
public boolean isSymbolic() {
return false;
}
@Override
public Ref getLeaf() {
return null;
}
@Override
public Ref getTarget() {
return null;
}
@Override
public ObjectId getObjectId() {
return ObjectId.zeroId();
}
@Override
public ObjectId getPeeledObjectId() {
return ObjectId.zeroId();
}
@Override
public boolean isPeeled() {
return false;
}
@Override
public Storage getStorage() {
return Storage.NEW;
}
};
}
/**
* Create a new in-memory Ref name associated with an objectId.
*
* @param refName ref name
* @param objectId object id
*/
static Ref newRef(String refName, ObjectId objectId) {
return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
}
/**
* Verify in shared db if Ref is the most recent
*
* @param project project name of the ref
* @param ref to be checked against shared-ref db
* @return true if it is; false otherwise
* @throws SharedLockException if there was a problem locking the resource
*/
boolean isUpToDate(String project, Ref ref) throws SharedLockException;
/**
* Compare a reference, and put if it matches.
*
* <p>Two reference match if and only if they satisfy the following:
*
* <ul>
* <li>If one reference is a symbolic ref, the other one should be a symbolic ref.
* <li>If both are symbolic refs, the target names should be same.
* <li>If both are object ID refs, the object IDs should be same.
* </ul>
*
* @param project project name of the ref
* @param currRef old value to compare to. If the reference is expected to not exist the old value
* has a storage of {@link org.eclipse.jgit.lib.Ref.Storage#NEW} and an ObjectId value of
* {@code null}.
* @param newRefValue new reference to store.
* @return true if the put was successful; false otherwise.
* @throws java.io.IOException the reference cannot be put due to a system error.
*/
boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue) throws IOException;
/**
* Lock a reference for writing.
*
* @param project project name
* @param refName ref to lock
* @return lock object
* @throws SharedLockException if the lock cannot be obtained
*/
AutoCloseable lockRef(String project, String refName) throws SharedLockException;
/**
* Verify if the DB contains a value for the specific project and ref name
*
* @param project
* @param refName
* @return true if the ref exists on the project
*/
boolean exists(String project, String refName);
/**
* Clean project path from SharedRefDatabase
*
* @param project project name
* @throws IOException
*/
void removeProject(String project) throws IOException;
}