@ -1853,98 +1853,113 @@ public class ReceivePack {
/ * *
/ * *
* Send a status report .
* Send a status report .
*
*
* @param forClient
* true if this report is for a Git client , false if it is for an
* end - user .
* @param unpackError
* @param unpackError
* an error that occurred during unpacking , or { @code null }
* an error that occurred during unpacking , or { @code null }
* @param out
* the reporter for sending the status strings .
* @throws java . io . IOException
* @throws java . io . IOException
* an error occurred writing the status report .
* an error occurred writing the status report .
* @since 5 . 6
* @since 5 . 6
* /
* /
private void sendStatusReport ( final boolean forClient ,
private void sendStatusReport ( Throwable unpackError ) throws IOException {
final Throwable unpackError , final Reporter out )
Reporter out = new Reporter ( ) {
throws IOException {
@Override
if ( unpackError ! = null ) {
void sendString ( String s ) throws IOException {
out . sendString ( "unpack error " + unpackError . getMessage ( ) ) ; //$NON-NLS-1$
if ( reportStatus ) {
if ( forClient ) {
pckOut . writeString ( s + "\n" ) ; //$NON-NLS-1$
for ( ReceiveCommand cmd : commands ) {
} else if ( msgOut ! = null ) {
out . sendString ( "ng " + cmd . getRefName ( ) //$NON-NLS-1$
msgOut . write ( Constants . encode ( s + "\n" ) ) ; //$NON-NLS-1$
+ " n/a (unpacker error)" ) ; //$NON-NLS-1$
}
}
}
}
return ;
} ;
}
if ( forClient )
try {
out . sendString ( "unpack ok" ) ; //$NON-NLS-1$
if ( unpackError ! = null ) {
for ( ReceiveCommand cmd : commands ) {
out . sendString ( "unpack error " + unpackError . getMessage ( ) ) ; //$NON-NLS-1$
if ( cmd . getResult ( ) = = Result . OK ) {
if ( reportStatus ) {
if ( forClient )
for ( ReceiveCommand cmd : commands ) {
out . sendString ( "ok " + cmd . getRefName ( ) ) ; //$NON-NLS-1$
out . sendString ( "ng " + cmd . getRefName ( ) //$NON-NLS-1$
continue ;
+ " n/a (unpacker error)" ) ; //$NON-NLS-1$
}
}
return ;
}
}
final StringBuilder r = new StringBuilder ( ) ;
if ( reportStatus ) {
if ( forClient )
out . sendString ( "unpack ok" ) ; //$NON-NLS-1$
r . append ( "ng " ) . append ( cmd . getRefName ( ) ) . append ( " " ) ; //$NON-NLS-1$ //$NON-NLS-2$
}
else
for ( ReceiveCommand cmd : commands ) {
r . append ( " ! [rejected] " ) . append ( cmd . getRefName ( ) ) //$NON-NLS-1$
if ( cmd . getResult ( ) = = Result . OK ) {
. append ( " (" ) ; //$NON-NLS-1$
if ( reportStatus ) {
out . sendString ( "ok " + cmd . getRefName ( ) ) ; //$NON-NLS-1$
switch ( cmd . getResult ( ) ) {
}
case NOT_ATTEMPTED :
continue ;
r . append ( "server bug; ref not processed" ) ; //$NON-NLS-1$
}
break ;
final StringBuilder r = new StringBuilder ( ) ;
case REJECTED_NOCREATE :
if ( reportStatus ) {
r . append ( "creation prohibited" ) ; //$NON-NLS-1$
r . append ( "ng " ) . append ( cmd . getRefName ( ) ) . append ( " " ) ; //$NON-NLS-1$ //$NON-NLS-2$
break ;
} else {
r . append ( " ! [rejected] " ) . append ( cmd . getRefName ( ) ) //$NON-NLS-1$
case REJECTED_NODELETE :
. append ( " (" ) ; //$NON-NLS-1$
r . append ( "deletion prohibited" ) ; //$NON-NLS-1$
}
break ;
switch ( cmd . getResult ( ) ) {
case REJECTED_NONFASTFORWARD :
case NOT_ATTEMPTED :
r . append ( "non-fast forward" ) ; //$NON-NLS-1$
r . append ( "server bug; ref not processed" ) ; //$NON-NLS-1$
break ;
break ;
case REJECTED_CURRENT_BRANCH :
case REJECTED_NOCREATE :
r . append ( "branch is currently checked out" ) ; //$NON-NLS-1$
r . append ( "creation prohibited" ) ; //$NON-NLS-1$
break ;
break ;
case REJECTED_MISSING_OBJECT :
case REJECTED_NODELETE :
if ( cmd . getMessage ( ) = = null )
r . append ( "deletion prohibited" ) ; //$NON-NLS-1$
r . append ( "missing object(s)" ) ; //$NON-NLS-1$
break ;
else if ( cmd . getMessage ( )
. length ( ) = = Constants . OBJECT_ID_STRING_LENGTH ) {
case REJECTED_NONFASTFORWARD :
r . append ( "object " ) ; //$NON-NLS-1$
r . append ( "non-fast forward" ) ; //$NON-NLS-1$
r . append ( cmd . getMessage ( ) ) ;
break ;
r . append ( " missing" ) ; //$NON-NLS-1$
} else
case REJECTED_CURRENT_BRANCH :
r . append ( cmd . getMessage ( ) ) ;
r . append ( "branch is currently checked out" ) ; //$NON-NLS-1$
break ;
break ;
case REJECTED_OTHER_REASON :
case REJECTED_MISSING_OBJECT :
if ( cmd . getMessage ( ) = = null )
if ( cmd . getMessage ( ) = = null )
r . append ( "unspecified reason" ) ; //$NON-NLS-1$
r . append ( "missing object(s)" ) ; //$NON-NLS-1$
else
else if ( cmd . getMessage ( )
r . append ( cmd . getMessage ( ) ) ;
. length ( ) = = Constants . OBJECT_ID_STRING_LENGTH ) {
break ;
r . append ( "object " ) ; //$NON-NLS-1$
r . append ( cmd . getMessage ( ) ) ;
case LOCK_FAILURE :
r . append ( " missing" ) ; //$NON-NLS-1$
r . append ( "failed to lock" ) ; //$NON-NLS-1$
} else
break ;
r . append ( cmd . getMessage ( ) ) ;
break ;
case OK :
// We shouldn't have reached this case (see 'ok' case above).
case REJECTED_OTHER_REASON :
continue ;
if ( cmd . getMessage ( ) = = null )
r . append ( "unspecified reason" ) ; //$NON-NLS-1$
else
r . append ( cmd . getMessage ( ) ) ;
break ;
case LOCK_FAILURE :
r . append ( "failed to lock" ) ; //$NON-NLS-1$
break ;
case OK :
// We shouldn't have reached this case (see 'ok' case
// above).
continue ;
}
if ( ! reportStatus ) {
r . append ( ")" ) ; //$NON-NLS-1$
}
out . sendString ( r . toString ( ) ) ;
}
} finally {
if ( reportStatus ) {
pckOut . end ( ) ;
}
}
if ( ! forClient )
r . append ( ")" ) ; //$NON-NLS-1$
out . sendString ( r . toString ( ) ) ;
}
}
}
}
@ -2228,22 +2243,7 @@ public class ReceivePack {
unlockPack ( ) ;
unlockPack ( ) ;
}
}
if ( reportStatus ) {
sendStatusReport ( unpackError ) ;
sendStatusReport ( true , unpackError , new Reporter ( ) {
@Override
void sendString ( String s ) throws IOException {
pckOut . writeString ( s + "\n" ) ; //$NON-NLS-1$
}
} ) ;
pckOut . end ( ) ;
} else if ( msgOut ! = null ) {
sendStatusReport ( false , unpackError , new Reporter ( ) {
@Override
void sendString ( String s ) throws IOException {
msgOut . write ( Constants . encode ( s + "\n" ) ) ; //$NON-NLS-1$
}
} ) ;
}
if ( unpackError ! = null ) {
if ( unpackError ! = null ) {
// we already know which exception to throw. Ignore
// we already know which exception to throw. Ignore