Class PushCertificateStore
- java.lang.Object
-
- org.eclipse.jgit.transport.PushCertificateStore
-
- All Implemented Interfaces:
java.lang.AutoCloseable
public class PushCertificateStore extends java.lang.Object implements java.lang.AutoCloseable
Storage for recorded push certificates.Push certificates are stored in a special ref
refs/meta/push-certs
. The filenames in the tree are ref names followed by the special suffix@{cert}
, and the contents are the latest push cert affecting that ref. The special suffix allows storing certificates for both refs/foo and refs/foo/bar in case those both existed at some point.- Since:
- 4.1
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
PushCertificateStore.PendingCert
-
Field Summary
Fields Modifier and Type Field Description (package private) RevCommit
commit
private Repository
db
private java.util.List<PushCertificateStore.PendingCert>
pending
(package private) ObjectReader
reader
(package private) static java.lang.String
REF_NAME
Ref name storing push certificates.
-
Constructor Summary
Constructors Constructor Description PushCertificateStore(Repository db)
Create a new store backed by the given repository.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static java.lang.String
buildMessage(PushCertificate cert)
void
clear()
Clear pending certificates added withput(PushCertificate, PersonIdent)
.void
close()
private static boolean
commandsEqual(ReceiveCommand c1, ReceiveCommand c2)
PushCertificate
get(java.lang.String refName)
Get latest push certificate associated with a ref.java.lang.Iterable<PushCertificate>
getAll(java.lang.String refName)
Iterate over all push certificates affecting a ref.(package private) void
load()
private DirCache
newDirCache()
private TreeWalk
newTreeWalk(java.lang.String refName)
(package private) static java.lang.String
pathName(java.lang.String refName)
void
put(PushCertificate cert, PersonIdent ident)
Put a certificate to be saved to the store.void
put(PushCertificate cert, PersonIdent ident, java.util.Collection<ReceiveCommand> matching)
Put a certificate to be saved to the store, matching a set of commands.(package private) static PushCertificate
read(TreeWalk tw)
RefUpdate.Result
save()
Save pending certificates to the store.boolean
save(BatchRefUpdate batch)
Save pending certificates to the store in an existing batch ref update.private ObjectId
saveCert(ObjectInserter inserter, DirCache dc, PushCertificateStore.PendingCert pc, ObjectId curr)
private static void
sortPending(java.util.List<PushCertificateStore.PendingCert> pending)
private RefUpdate.Result
updateRef(ObjectId newId)
private ObjectId
write()
-
-
-
Field Detail
-
REF_NAME
static final java.lang.String REF_NAME
Ref name storing push certificates.- See Also:
- Constant Field Values
-
db
private final Repository db
-
pending
private final java.util.List<PushCertificateStore.PendingCert> pending
-
reader
ObjectReader reader
-
commit
RevCommit commit
-
-
Constructor Detail
-
PushCertificateStore
public PushCertificateStore(Repository db)
Create a new store backed by the given repository.- Parameters:
db
- the repository.
-
-
Method Detail
-
close
public void close()
Close resources opened by this store.
If
get(String)
was called, closes the cached object reader created by that method. Does not close the underlying repository.- Specified by:
close
in interfacejava.lang.AutoCloseable
-
get
public PushCertificate get(java.lang.String refName) throws java.io.IOException
Get latest push certificate associated with a ref.Lazily opens
refs/meta/push-certs
and reads from the repository as necessary. The state is cached between calls toget
; to reread the, callclose()
first.- Parameters:
refName
- the ref name to get the certificate for.- Returns:
- last certificate affecting the ref, or null if no cert was recorded for the last update to this ref.
- Throws:
java.io.IOException
- if a problem occurred reading the repository.
-
getAll
public java.lang.Iterable<PushCertificate> getAll(java.lang.String refName)
Iterate over all push certificates affecting a ref.Only includes push certificates actually stored in the tree; see class Javadoc for conditions where this might not include all push certs ever seen for this ref.
The returned iterable may be iterated multiple times, and push certs will be re-read from the current state of the store on each call to
Iterable.iterator()
. However, method calls on the returned iterator may fail ifsave
orclose
is called on the enclosing store during iteration.- Parameters:
refName
- the ref name to get certificates for.- Returns:
- iterable over certificates; must be fully iterated in order to close resources.
-
load
void load() throws java.io.IOException
- Throws:
java.io.IOException
-
read
static PushCertificate read(TreeWalk tw) throws java.io.IOException
- Throws:
java.io.IOException
-
put
public void put(PushCertificate cert, PersonIdent ident)
Put a certificate to be saved to the store.Writes the contents of this certificate for each ref mentioned. It is up to the caller to ensure this certificate accurately represents the state of the ref.
Pending certificates added to this method are not returned by
get(String)
andgetAll(String)
until after callingsave()
.- Parameters:
cert
- certificate to store.ident
- identity for the commit that stores this certificate. Pending certificates are sorted by identity timestamp duringsave()
.
-
put
public void put(PushCertificate cert, PersonIdent ident, java.util.Collection<ReceiveCommand> matching)
Put a certificate to be saved to the store, matching a set of commands.Like
put(PushCertificate, PersonIdent)
, except a value is only stored for a push certificate if there is a corresponding command in the list that exactly matches the old/new values mentioned in the push certificate.Pending certificates added to this method are not returned by
get(String)
andgetAll(String)
until after callingsave()
.- Parameters:
cert
- certificate to store.ident
- identity for the commit that stores this certificate. Pending certificates are sorted by identity timestamp duringsave()
.matching
- only store certs for the refs listed in this list whose values match the commands in the cert.
-
save
public RefUpdate.Result save() throws java.io.IOException
Save pending certificates to the store.One commit is created per certificate added with
put(PushCertificate, PersonIdent)
, in order of identity timestamps, and a single ref update is performed.The pending list is cleared if and only the ref update fails, which allows for easy retries in case of lock failure.
- Returns:
- the result of attempting to update the ref.
- Throws:
java.io.IOException
- if there was an error reading from or writing to the repository.
-
save
public boolean save(BatchRefUpdate batch) throws java.io.IOException
Save pending certificates to the store in an existing batch ref update.One commit is created per certificate added with
put(PushCertificate, PersonIdent)
, in order of identity timestamps, all commits are flushed, and a single command is added to the batch.The cached ref value and pending list are not cleared. If the ref update succeeds, the caller is responsible for calling
close()
and/orclear()
.- Parameters:
batch
- update to save to.- Returns:
- whether a command was added to the batch.
- Throws:
java.io.IOException
- if there was an error reading from or writing to the repository.
-
clear
public void clear()
Clear pending certificates added withput(PushCertificate, PersonIdent)
.
-
write
private ObjectId write() throws java.io.IOException
- Throws:
java.io.IOException
-
sortPending
private static void sortPending(java.util.List<PushCertificateStore.PendingCert> pending)
-
newDirCache
private DirCache newDirCache() throws java.io.IOException
- Throws:
java.io.IOException
-
saveCert
private ObjectId saveCert(ObjectInserter inserter, DirCache dc, PushCertificateStore.PendingCert pc, ObjectId curr) throws java.io.IOException
- Throws:
java.io.IOException
-
commandsEqual
private static boolean commandsEqual(ReceiveCommand c1, ReceiveCommand c2)
-
updateRef
private RefUpdate.Result updateRef(ObjectId newId) throws java.io.IOException
- Throws:
java.io.IOException
-
newTreeWalk
private TreeWalk newTreeWalk(java.lang.String refName) throws java.io.IOException
- Throws:
java.io.IOException
-
pathName
static java.lang.String pathName(java.lang.String refName)
-
buildMessage
private static java.lang.String buildMessage(PushCertificate cert)
-
-