@ -55,8 +55,6 @@ import java.io.EOFException;
import java.io.IOException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.InputStream ;
import java.io.OutputStream ;
import java.io.OutputStream ;
import java.io.OutputStreamWriter ;
import java.io.Writer ;
import java.text.MessageFormat ;
import java.text.MessageFormat ;
import java.util.ArrayList ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.Collections ;
@ -70,7 +68,6 @@ import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.PackProtocolException ;
import org.eclipse.jgit.errors.PackProtocolException ;
import org.eclipse.jgit.errors.UnpackException ;
import org.eclipse.jgit.errors.UnpackException ;
import org.eclipse.jgit.lib.Config ;
import org.eclipse.jgit.lib.Config ;
import org.eclipse.jgit.lib.Config.SectionParser ;
import org.eclipse.jgit.lib.Constants ;
import org.eclipse.jgit.lib.Constants ;
import org.eclipse.jgit.lib.NullProgressMonitor ;
import org.eclipse.jgit.lib.NullProgressMonitor ;
import org.eclipse.jgit.lib.ObjectId ;
import org.eclipse.jgit.lib.ObjectId ;
@ -81,6 +78,7 @@ import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Ref ;
import org.eclipse.jgit.lib.Ref ;
import org.eclipse.jgit.lib.RefUpdate ;
import org.eclipse.jgit.lib.RefUpdate ;
import org.eclipse.jgit.lib.Repository ;
import org.eclipse.jgit.lib.Repository ;
import org.eclipse.jgit.lib.Config.SectionParser ;
import org.eclipse.jgit.revwalk.ObjectWalk ;
import org.eclipse.jgit.revwalk.ObjectWalk ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevCommit ;
@ -157,14 +155,12 @@ public class ReceivePack {
private OutputStream rawOut ;
private OutputStream rawOut ;
private OutputStream msgOut ;
private PacketLineIn pckIn ;
private PacketLineIn pckIn ;
private PacketLineOut pckOut ;
private PacketLineOut pckOut ;
private Writer msgs ;
private SideBandOutputStream msgOut ;
private PackParser parser ;
private PackParser parser ;
/** The refs we advertised as existing at the start of the connection. */
/** The refs we advertised as existing at the start of the connection. */
@ -508,8 +504,8 @@ public class ReceivePack {
advertiseError . append ( what ) . append ( '\n' ) ;
advertiseError . append ( what ) . append ( '\n' ) ;
} else {
} else {
try {
try {
if ( msgs ! = null )
if ( msgOut ! = null )
msgs . write ( "error: " + what + "\n" ) ;
msgOut . write ( Constants . encode ( "error: " + what + "\n" ) ) ;
} catch ( IOException e ) {
} catch ( IOException e ) {
// Ignore write failures.
// Ignore write failures.
}
}
@ -528,8 +524,8 @@ public class ReceivePack {
* /
* /
public void sendMessage ( final String what ) {
public void sendMessage ( final String what ) {
try {
try {
if ( msgs ! = null )
if ( msgOut ! = null )
msgs . write ( what + "\n" ) ;
msgOut . write ( Constants . encode ( what + "\n" ) ) ;
} catch ( IOException e ) {
} catch ( IOException e ) {
// Ignore write failures.
// Ignore write failures.
}
}
@ -558,6 +554,7 @@ public class ReceivePack {
try {
try {
rawIn = input ;
rawIn = input ;
rawOut = output ;
rawOut = output ;
msgOut = messages ;
if ( timeout > 0 ) {
if ( timeout > 0 ) {
final Thread caller = Thread . currentThread ( ) ;
final Thread caller = Thread . currentThread ( ) ;
@ -572,8 +569,7 @@ public class ReceivePack {
pckIn = new PacketLineIn ( rawIn ) ;
pckIn = new PacketLineIn ( rawIn ) ;
pckOut = new PacketLineOut ( rawOut ) ;
pckOut = new PacketLineOut ( rawOut ) ;
if ( messages ! = null )
pckOut . setFlushOnEnd ( false ) ;
msgs = new OutputStreamWriter ( messages , Constants . CHARSET ) ;
enabledCapablities = new HashSet < String > ( ) ;
enabledCapablities = new HashSet < String > ( ) ;
commands = new ArrayList < ReceiveCommand > ( ) ;
commands = new ArrayList < ReceiveCommand > ( ) ;
@ -582,11 +578,6 @@ public class ReceivePack {
} finally {
} finally {
walk . release ( ) ;
walk . release ( ) ;
try {
try {
if ( pckOut ! = null )
pckOut . flush ( ) ;
if ( msgs ! = null )
msgs . flush ( ) ;
if ( sideBand ) {
if ( sideBand ) {
// If we are using side band, we need to send a final
// If we are using side band, we need to send a final
// flush-pkt to tell the remote peer the side band is
// flush-pkt to tell the remote peer the side band is
@ -594,16 +585,31 @@ public class ReceivePack {
// use the original output stream as rawOut is now the
// use the original output stream as rawOut is now the
// side band data channel.
// side band data channel.
//
//
new PacketLineOut ( output ) . end ( ) ;
( ( SideBandOutputStream ) msgOut ) . flushBuffer ( ) ;
( ( SideBandOutputStream ) rawOut ) . flushBuffer ( ) ;
PacketLineOut plo = new PacketLineOut ( output ) ;
plo . setFlushOnEnd ( false ) ;
plo . end ( ) ;
}
if ( biDirectionalPipe ) {
// If this was a native git connection, flush the pipe for
// the caller. For smart HTTP we don't do this flush and
// instead let the higher level HTTP servlet code do it.
//
if ( ! sideBand & & msgOut ! = null )
msgOut . flush ( ) ;
rawOut . flush ( ) ;
}
}
} finally {
} finally {
unlockPack ( ) ;
unlockPack ( ) ;
timeoutIn = null ;
timeoutIn = null ;
rawIn = null ;
rawIn = null ;
rawOut = null ;
rawOut = null ;
msgOut = null ;
pckIn = null ;
pckIn = null ;
pckOut = null ;
pckOut = null ;
msgs = null ;
refs = null ;
refs = null ;
enabledCapablities = null ;
enabledCapablities = null ;
commands = null ;
commands = null ;
@ -619,9 +625,10 @@ public class ReceivePack {
}
}
private void service ( ) throws IOException {
private void service ( ) throws IOException {
if ( biDirectionalPipe )
if ( biDirectionalPipe ) {
sendAdvertisedRefs ( new PacketLineOutRefAdvertiser ( pckOut ) ) ;
sendAdvertisedRefs ( new PacketLineOutRefAdvertiser ( pckOut ) ) ;
else
pckOut . flush ( ) ;
} else
refs = refFilter . filter ( db . getAllRefs ( ) ) ;
refs = refFilter . filter ( db . getAllRefs ( ) ) ;
if ( advertiseError ! = null )
if ( advertiseError ! = null )
return ;
return ;
@ -658,10 +665,10 @@ public class ReceivePack {
}
}
} ) ;
} ) ;
pckOut . end ( ) ;
pckOut . end ( ) ;
} else if ( msgs ! = null ) {
} else if ( msgOut ! = null ) {
sendStatusReport ( false , new Reporter ( ) {
sendStatusReport ( false , new Reporter ( ) {
void sendString ( final String s ) throws IOException {
void sendString ( final String s ) throws IOException {
msgs . write ( s + "\n" ) ;
msgOut . write ( Constants . encode ( s + "\n" ) ) ;
}
}
} ) ;
} ) ;
}
}
@ -761,8 +768,9 @@ public class ReceivePack {
rawOut = new SideBandOutputStream ( CH_DATA , MAX_BUF , out ) ;
rawOut = new SideBandOutputStream ( CH_DATA , MAX_BUF , out ) ;
msgOut = new SideBandOutputStream ( CH_PROGRESS , MAX_BUF , out ) ;
msgOut = new SideBandOutputStream ( CH_PROGRESS , MAX_BUF , out ) ;
pckOut = new PacketLineOut ( rawOut ) ;
pckOut = new PacketLineOut ( rawOut ) ;
msgs = new OutputStreamWriter ( msgOut , Constants . CHARSET ) ;
pckOut . setFlushOnEnd ( false ) ;
}
}
}
}