|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.eclipse.jgit.transport.BaseReceivePack
public abstract class BaseReceivePack
Base implementation of the side of a push connection that receives objects.
Contains high-level operations for initializing and closing streams, advertising refs, reading commands, and receiving and applying a pack. Subclasses compose these operations into full service implementations.
Nested Class Summary | |
---|---|
static class |
BaseReceivePack.FirstLine
Data in the first line of a request, the line itself plus capabilities. |
protected static class |
BaseReceivePack.ReceiveConfig
Configuration for receive operations. |
Field Summary | |
---|---|
protected Set<ObjectId> |
advertisedHaves
All SHA-1s shown to the client, which can be possible edges. |
protected boolean |
allowCreates
Should an incoming transfer permit create requests? |
protected boolean |
allowDeletes
Should an incoming transfer permit delete requests? |
protected boolean |
allowNonFastForwards
Should an incoming transfer permit non-fast-forward requests? |
protected boolean |
biDirectionalPipe
Is the client connection a bi-directional socket or pipe? |
protected boolean |
checkReceivedObjects
Should an incoming transfer validate objects? |
protected Repository |
db
Database we write the stored objects into. |
protected Set<String> |
enabledCapabilities
Capabilities requested by the client. |
protected OutputStream |
msgOut
Optional message output stream. |
protected PacketLineIn |
pckIn
Packet line input stream around rawIn . |
protected PacketLineOut |
pckOut
Packet line output stream around rawOut . |
protected InputStream |
rawIn
Raw input stream. |
protected OutputStream |
rawOut
Raw output stream. |
protected Map<String,Ref> |
refs
The refs we advertised as existing at the start of the connection. |
protected boolean |
reportStatus
If BasePackPushConnection.CAPABILITY_REPORT_STATUS is enabled. |
protected boolean |
sideBand
If BasePackPushConnection.CAPABILITY_SIDE_BAND_64K is enabled. |
protected RevWalk |
walk
Revision traversal support over db . |
Constructor Summary | |
---|---|
protected |
BaseReceivePack(Repository into)
Create a new pack receive for an open repository. |
Method Summary | |
---|---|
protected void |
close()
Close and flush (if necessary) the underlying streams. |
protected void |
enableCapabilities()
Enable capabilities based on a previously read capabilities line. |
protected void |
executeCommands()
Execute commands to update references. |
protected List<ReceiveCommand> |
filterCommands(ReceiveCommand.Result want)
Filter the list of commands according to result. |
Set<ObjectId> |
getAdvertisedObjects()
Get objects advertised to the client. |
protected Map<String,Ref> |
getAdvertisedOrDefaultRefs()
|
Map<String,Ref> |
getAdvertisedRefs()
Get refs which were advertised to the client. |
AdvertiseRefsHook |
getAdvertiseRefsHook()
|
List<ReceiveCommand> |
getAllCommands()
|
protected abstract String |
getLockMessageProcessName()
|
OutputStream |
getMessageOutputStream()
|
RefFilter |
getRefFilter()
|
PersonIdent |
getRefLogIdent()
|
Repository |
getRepository()
|
RevWalk |
getRevWalk()
|
int |
getTimeout()
|
protected boolean |
hasCommands()
|
protected boolean |
hasError()
|
protected void |
init(InputStream input,
OutputStream output,
OutputStream messages)
Initialize the instance with the given streams. |
boolean |
isAllowCreates()
|
boolean |
isAllowDeletes()
|
boolean |
isAllowNonFastForwards()
|
boolean |
isBiDirectionalPipe()
|
boolean |
isCheckReceivedObjects()
|
boolean |
isCheckReferencedObjectsAreReachable()
|
boolean |
isSideBand()
Check whether the client expects a side-band stream. |
protected boolean |
needPack()
|
protected void |
receivePackAndCheckConnectivity()
Receive a pack from the stream and check connectivity if necessary. |
protected void |
recvCommands()
Receive a list of commands from the input. |
protected void |
release()
Release any resources used by this object. |
void |
sendAdvertisedRefs(RefAdvertiser adv)
Generate an advertisement of available refs and capabilities. |
void |
sendError(String what)
Send an error message to the client. |
void |
sendMessage(String what)
Send a message to the client, if it supports receiving them. |
protected void |
sendStatusReport(boolean forClient,
Throwable unpackError,
org.eclipse.jgit.transport.BaseReceivePack.Reporter out)
Send a status report. |
void |
setAdvertisedRefs(Map<String,Ref> allRefs,
Set<ObjectId> additionalHaves)
Set the refs advertised by this ReceivePack. |
void |
setAdvertiseRefsHook(AdvertiseRefsHook advertiseRefsHook)
Set the hook used while advertising the refs to the client. |
void |
setAllowCreates(boolean canCreate)
|
void |
setAllowDeletes(boolean canDelete)
|
void |
setAllowNonFastForwards(boolean canRewind)
|
void |
setBiDirectionalPipe(boolean twoWay)
|
void |
setCheckReceivedObjects(boolean check)
|
void |
setCheckReferencedObjectsAreReachable(boolean b)
Validate all referenced but not supplied objects are reachable. |
void |
setMaxObjectSizeLimit(long limit)
Set the maximum allowed Git object size. |
void |
setRefFilter(RefFilter refFilter)
Set the filter used while advertising the refs to the client. |
void |
setRefLogIdent(PersonIdent pi)
Set the identity of the user appearing in the affected reflogs. |
void |
setTimeout(int seconds)
Set the timeout before willing to abort an IO call. |
protected void |
unlockPack()
Unlock the pack written by this object. |
protected void |
validateCommands()
Validate the command list. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected final Repository db
protected final RevWalk walk
db
.
protected boolean biDirectionalPipe
If true, this class assumes it can perform multiple read and write cycles with the client over the input and output streams. This matches the functionality available with a standard TCP/IP connection, or a local operating system or in-memory pipe.
If false, this class runs in a read everything then output results mode, making it suitable for single round-trip systems RPCs such as HTTP.
protected boolean checkReceivedObjects
protected boolean allowCreates
protected boolean allowDeletes
protected boolean allowNonFastForwards
protected InputStream rawIn
protected OutputStream rawOut
protected OutputStream msgOut
protected PacketLineIn pckIn
rawIn
.
protected PacketLineOut pckOut
rawOut
.
protected Map<String,Ref> refs
protected Set<ObjectId> advertisedHaves
protected Set<String> enabledCapabilities
protected boolean reportStatus
BasePackPushConnection.CAPABILITY_REPORT_STATUS
is enabled.
protected boolean sideBand
BasePackPushConnection.CAPABILITY_SIDE_BAND_64K
is enabled.
Constructor Detail |
---|
protected BaseReceivePack(Repository into)
into
- the destination repository.Method Detail |
---|
protected abstract String getLockMessageProcessName()
public final Repository getRepository()
public final RevWalk getRevWalk()
public final Map<String,Ref> getAdvertisedRefs()
setAdvertisedRefs(Map, Set)
has not been called yet.public void setAdvertisedRefs(Map<String,Ref> allRefs, Set<ObjectId> additionalHaves)
Intended to be called from a PreReceiveHook
.
allRefs
- explicit set of references to claim as advertised by this
ReceivePack instance. This overrides any references that
may exist in the source repository. The map is passed
to the configured getRefFilter()
. If null, assumes
all refs were advertised.additionalHaves
- explicit set of additional haves to claim as advertised. If
null, assumes the default set of additional haves from the
repository.public final Set<ObjectId> getAdvertisedObjects()
setAdvertisedRefs(Map, Set)
has not been called
yet.public boolean isCheckReferencedObjectsAreReachable()
public void setCheckReferencedObjectsAreReachable(boolean b)
If enabled, this instance will verify that references to objects not
contained within the received pack are already reachable through at least
one other reference displayed as part of getAdvertisedRefs()
.
This feature is useful when the application doesn't trust the client to
not provide a forged SHA-1 reference to an object, in an attempt to
access parts of the DAG that they aren't allowed to see and which have
been hidden from them via the configured AdvertiseRefsHook
or
RefFilter
.
Enabling this feature may imply at least some, if not all, of the same
functionality performed by setCheckReceivedObjects(boolean)
.
Applications are encouraged to enable both features, if desired.
b
- true
to enable the additional check.public boolean isBiDirectionalPipe()
public void setBiDirectionalPipe(boolean twoWay)
twoWay
- if true, this class will assume the socket is a fully
bidirectional pipe between the two peers and takes advantage
of that by first transmitting the known refs, then waiting to
read commands. If false, this class assumes it must read the
commands before writing output and does not perform the
initial advertising.public boolean isCheckReceivedObjects()
public void setCheckReceivedObjects(boolean check)
check
- true to enable checking received objects; false to assume all
received objects are valid.public boolean isAllowCreates()
public void setAllowCreates(boolean canCreate)
canCreate
- true to permit create ref commands to be processed.public boolean isAllowDeletes()
public void setAllowDeletes(boolean canDelete)
canDelete
- true to permit delete ref commands to be processed.public boolean isAllowNonFastForwards()
public void setAllowNonFastForwards(boolean canRewind)
canRewind
- true to permit the client to ask for non-fast-forward updates
of an existing ref.public PersonIdent getRefLogIdent()
public void setRefLogIdent(PersonIdent pi)
The timestamp portion of the identity is ignored. A new identity with the current timestamp will be created automatically when the updates occur and the log records are written.
pi
- identity of the user. If null the identity will be
automatically determined based on the repository
configuration.public AdvertiseRefsHook getAdvertiseRefsHook()
public RefFilter getRefFilter()
public void setAdvertiseRefsHook(AdvertiseRefsHook advertiseRefsHook)
If the AdvertiseRefsHook
chooses to call
setAdvertisedRefs(Map,Set)
, only refs set by this hook
and selected by the RefFilter
will be shown to the client.
Clients may still attempt to create or update a reference not advertised by
the configured AdvertiseRefsHook
. These attempts should be rejected
by a matching PreReceiveHook
.
advertiseRefsHook
- the hook; may be null to show all refs.public void setRefFilter(RefFilter refFilter)
Only refs allowed by this filter will be shown to the client.
The filter is run against the refs specified by the
AdvertiseRefsHook
(if applicable).
refFilter
- the filter; may be null to show all refs.public int getTimeout()
public void setTimeout(int seconds)
seconds
- number of seconds to wait (with no data transfer occurring)
before aborting an IO read or write operation with the
connected client.public void setMaxObjectSizeLimit(long limit)
If an object is larger than the given size the pack-parsing will throw an exception aborting the receive-pack operation.
limit
- the Git object size limit. If zero then there is not limit.public boolean isSideBand() throws RequestNotYetReadException
RequestNotYetReadException
- if the client's request has not yet been read from the wire, so
we do not know if they expect side-band. Note that the client
may have already written the request, it just has not been
read.public List<ReceiveCommand> getAllCommands()
public void sendError(String what)
If any error messages are sent before the references are advertised to the client, the errors will be sent instead of the advertisement and the receive operation will be aborted. All clients should receive and display such early stage errors.
If the reference advertisements have already been sent, messages are sent in a side channel. If the client doesn't support receiving messages, the message will be discarded, with no other indication to the caller or to the client.
PreReceiveHook
s should always try to use
ReceiveCommand.setResult(Result, String)
with a result status of
ReceiveCommand.Result.REJECTED_OTHER_REASON
to indicate any reasons for
rejecting an update. Messages attached to a command are much more likely
to be returned to the client.
what
- string describing the problem identified by the hook. The
string must not end with an LF, and must not contain an LF.public void sendMessage(String what)
If the client doesn't support receiving messages, the message will be discarded, with no other indication to the caller or to the client.
what
- string describing the problem identified by the hook. The
string must not end with an LF, and must not contain an LF.public OutputStream getMessageOutputStream()
protected boolean hasCommands()
protected boolean hasError()
protected void init(InputStream input, OutputStream output, OutputStream messages)
input
- raw input to read client commands and pack data from. Caller
must ensure the input is buffered, otherwise read performance
may suffer.output
- response back to the Git network client. Caller must ensure
the output is buffered, otherwise write performance may
suffer.messages
- secondary "notice" channel to send additional messages out
through. When run over SSH this should be tied back to the
standard error channel of the command execution. For most
other network connections this should be null.protected Map<String,Ref> getAdvertisedOrDefaultRefs()
protected void receivePackAndCheckConnectivity() throws IOException
IOException
- an error occurred during unpacking or connectivity checking.protected void unlockPack() throws IOException
IOException
- the pack could not be unlocked.public void sendAdvertisedRefs(RefAdvertiser adv) throws IOException, ServiceMayNotContinueException
adv
- the advertisement formatter.
IOException
- the formatter failed to write an advertisement.
ServiceMayNotContinueException
- the hook denied advertisement.protected void recvCommands() throws IOException
IOException
protected void enableCapabilities()
protected boolean needPack()
protected void validateCommands()
protected List<ReceiveCommand> filterCommands(ReceiveCommand.Result want)
want
- desired status to filter by.
protected void executeCommands()
protected void sendStatusReport(boolean forClient, Throwable unpackError, org.eclipse.jgit.transport.BaseReceivePack.Reporter out) throws IOException
forClient
- true if this report is for a Git client, false if it is for an
end-user.unpackError
- an error that occurred during unpacking, or null
out
- the reporter for sending the status strings.
IOException
- an error occurred writing the status report.protected void close() throws IOException
IOException
protected void release() throws IOException
IOException
- the pack could not be unlocked.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |