1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/source/Applydeltarpm.cc
14 #include "zypp/base/Logger.h"
15 #include "zypp/base/String.h"
16 #include "zypp/repo/Applydeltarpm.h"
17 #include "zypp/ExternalProgram.h"
18 #include "zypp/AutoDispose.h"
19 #include "zypp/PathInfo.h"
20 #include "zypp/TriBool.h"
24 ///////////////////////////////////////////////////////////////////
26 { /////////////////////////////////////////////////////////////////
27 ///////////////////////////////////////////////////////////////////
28 namespace applydeltarpm
29 { /////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////
32 { /////////////////////////////////////////////////////////////////
34 const Pathname applydeltarpm_prog( "/usr/bin/applydeltarpm" );
35 const str::regex applydeltarpm_tick ( "([0-9]+) percent finished" );
37 /******************************************************************
39 ** FUNCTION NAME : applydeltarpm
40 ** FUNCTION TYPE : bool
42 bool applydeltarpm( const char *const argv_r[],
43 const Progress & report_r = Progress() )
45 ExternalProgram prog( argv_r, ExternalProgram::Stderr_To_Stdout );
47 for ( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
49 if ( report_r && str::regex_search( line, what, applydeltarpm_tick ) )
51 report_r( str::strtonum<unsigned>( what[1] ) );
54 DBG << "Applydeltarpm : " << line;
56 return( prog.close() == 0 );
59 /////////////////////////////////////////////////////////////////
61 ///////////////////////////////////////////////////////////////////
63 /******************************************************************
65 ** FUNCTION NAME : haveApplydeltarpm
66 ** FUNCTION TYPE : bool
68 bool haveApplydeltarpm()
70 // To track changes in availability of applydeltarpm.
71 static TriBool _last = indeterminate;
72 PathInfo prog( applydeltarpm_prog );
73 bool have = prog.isX();
75 ; // TriBool! 'else' is not '_last != have'
78 // _last is 'indeterminate' or '!have'
80 MIL << "Found executable " << prog << endl;
82 WAR << "No executable " << prog << endl;
87 /******************************************************************
89 ** FUNCTION NAME : check
90 ** FUNCTION TYPE : bool
92 bool check( const std::string & sequenceinfo_r, bool quick_r )
94 if ( ! haveApplydeltarpm() )
97 const char *const argv[] = {
98 "/usr/bin/applydeltarpm",
99 ( quick_r ? "-C" : "-c" ),
100 "-s", sequenceinfo_r.c_str(),
104 return( applydeltarpm( argv ) );
107 /******************************************************************
109 ** FUNCTION NAME : check
110 ** FUNCTION TYPE : bool
112 bool check( const Pathname & delta_r, bool quick_r )
114 if ( ! haveApplydeltarpm() )
117 const char *const argv[] = {
118 "/usr/bin/applydeltarpm",
119 ( quick_r ? "-C" : "-c" ),
120 delta_r.asString().c_str(),
124 return( applydeltarpm( argv ) );
127 /******************************************************************
129 ** FUNCTION NAME : provide
130 ** FUNCTION TYPE : bool
132 bool provide( const Pathname & delta_r, const Pathname & new_r,
133 const Progress & report_r )
136 AutoDispose<const Pathname> guard( new_r, filesystem::unlink );
138 if ( ! haveApplydeltarpm() )
141 const char *const argv[] = {
142 "/usr/bin/applydeltarpm",
143 "-p", "-p", // twice to get percent output one per line
144 delta_r.asString().c_str(),
145 new_r.asString().c_str(),
149 if ( ! applydeltarpm( argv, report_r ) )
152 guard.resetDispose(); // no cleanup on success
156 /******************************************************************
158 ** FUNCTION NAME : provide
159 ** FUNCTION TYPE : bool
161 bool provide( const Pathname & old_r, const Pathname & delta_r,
162 const Pathname & new_r,
163 const Progress & report_r )
166 AutoDispose<const Pathname> guard( new_r, filesystem::unlink );
168 if ( ! haveApplydeltarpm() )
171 const char *const argv[] = {
172 "/usr/bin/applydeltarpm",
173 "-p", "-p", // twice to get percent output one per line
174 "-r", old_r.asString().c_str(),
175 delta_r.asString().c_str(),
176 new_r.asString().c_str(),
180 if ( ! applydeltarpm( argv, report_r ) )
183 guard.resetDispose(); // no cleanup on success
187 /////////////////////////////////////////////////////////////////
188 } // namespace applydeltarpm
189 ///////////////////////////////////////////////////////////////////
190 /////////////////////////////////////////////////////////////////
192 ///////////////////////////////////////////////////////////////////