@ -407,13 +407,13 @@ class Patch {
public :
void read_diff ( FILE * f )
void read_diff ( FileFd & f )
{
char buffer [ BLOCK_SIZE ] ;
bool cmdwanted = true ;
Change ch ( 0 ) ;
while ( fgets ( buffer , sizeof ( buffer ) , f ) )
while ( f . ReadLine ( buffer , sizeof ( buffer ) ) )
{
if ( cmdwanted ) {
char * m , * c ;
@ -534,66 +534,11 @@ class Patch {
}
} ;
bool LookupPatches ( const std : : string & Message , std : : vector < std : : string > & lines )
{
const char * Tag = " Patches " ;
const size_t Length = strlen ( Tag ) ;
std : : string : : const_iterator I , J ;
std : : clog < < " Looking for \" Patches: \" section in message: \n \n " < < Message < < " \n \n " ;
std : : clog . flush ( ) ;
for ( I = Message . begin ( ) ; I + Length < Message . end ( ) ; + + I )
{
if ( I [ Length ] = = ' : ' & & stringcasecmp ( I , I + Length , Tag ) = = 0 )
{
// found the tag, now read the patches
for ( ; ; ) {
for ( ; I < Message . end ( ) & & * I ! = ' \n ' ; + + I ) ;
if ( I < Message . end ( ) ) I + + ;
if ( I = = Message . end ( ) | | * I ! = ' ' )
break ;
while ( I < Message . end ( ) & & isspace ( * I ) ) I + + ;
for ( J = I ; J < Message . end ( ) & & * J ! = ' \n ' ; + + J )
;
do
J - - ;
while ( I < J & & isspace ( * J ) ) ;
if ( I < J )
lines . push_back ( std : : string ( I , + + J ) ) ;
else
break ;
I = J ;
}
std : : clog < < " Found " < < lines . size ( ) < < " patches! \n " ;
std : : clog . flush ( ) ;
return true ;
}
}
std : : clog < < " Found no patches! :( \n " ;
std : : clog . flush ( ) ;
return false ;
}
class RredMethod : public pkgAcqMethod {
private :
bool Debug ;
std : : vector < std : : string > patchpaths ;
protected :
virtual bool HandleMessage ( int Number , std : : string Message ) {
if ( Number = = 600 )
{
patchpaths . clear ( ) ;
LookupPatches ( Message , patchpaths ) ;
std : : clog < < " Ended up with " < < patchpaths . size ( ) < < " patches! \n " ;
std : : clog . flush ( ) ;
}
return pkgAcqMethod : : HandleMessage ( Number , Message ) ;
}
virtual bool Fetch ( FetchItem * Itm ) {
Debug = _config - > FindB ( " Debug::pkgAcquire::RRed " , false ) ;
URI Get = Itm - > Uri ;
@ -601,17 +546,29 @@ class RredMethod : public pkgAcqMethod {
FetchResult Res ;
Res . Filename = Itm - > DestFile ;
if ( Itm - > Uri . empty ( ) ) {
if ( Itm - > Uri . empty ( ) )
{
Path = Itm - > DestFile ;
Itm - > DestFile . append ( " .result " ) ;
} else
URIStart ( Res ) ;
std : : vector < std : : string > patchpaths ;
Patch patch ;
if ( patchpaths . empty ( ) )
{
if ( FileExists ( Path + " .ed " ) = = true )
patchpaths . push_back ( Path + " .ed " ) ;
else
{
_error - > PushToStack ( ) ;
std : : vector < std : : string > patches = GetListOfFilesInDir ( flNotFile ( Path ) , " gz " , true , false ) ;
_error - > RevertToStack ( ) ;
std : : string const baseName = Path + " .ed. " ;
for ( std : : vector < std : : string > : : const_iterator p = patches . begin ( ) ;
p ! = patches . end ( ) ; + + p )
if ( p - > compare ( 0 , baseName . length ( ) , baseName ) = = 0 )
patchpaths . push_back ( * p ) ;
}
std : : string patch_name ;
@ -624,13 +581,15 @@ class RredMethod : public pkgAcqMethod {
std : : clog < < " Patching " < < Path < < " with " < < patch_name
< < std : : endl ;
FILE * p = fopen ( patch_name . c_str ( ) , " r " ) ;
if ( p = = NULL ) {
std : : clog < < " Could not open patch file " < < patch_name < < std : : endl ;
FileFd p ;
// all patches are compressed, even if the name doesn't reflect it
if ( p . Open ( patch_name , FileFd : : ReadOnly , FileFd : : Gzip ) = = false ) {
std : : cerr < < " Could not open patch file " < < patch_name < < std : : endl ;
_error - > DumpErrors ( std : : cerr ) ;
abort ( ) ;
}
patch . read_diff ( p ) ;
fclose ( p ) ;
p . Close ( ) ;
}
if ( Debug = = true )
@ -697,10 +656,9 @@ int main(int argc, char **argv)
}
for ( ; i < argc ; i + + ) {
FILE * p ;
p = fopen ( argv [ i ] , " r " ) ;
if ( ! p ) {
perror ( argv [ i ] ) ;
FileFd p ;
if ( p . Open ( argv [ i ] , FileFd : : ReadOnly ) = = false ) {
_error - > DumpErrors ( std : : cerr ) ;
exit ( 1 ) ;
}
patch . read_diff ( p ) ;