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" );
36 /******************************************************************
38 ** FUNCTION NAME : applydeltarpm
39 ** FUNCTION TYPE : bool
41 bool applydeltarpm( const char *const argv_r[],
42 const Progress & report_r = Progress() )
44 ExternalProgram prog( argv_r, ExternalProgram::Stderr_To_Stdout );
45 for ( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
48 report_r( str::strtonum<unsigned>( line ));
50 DBG << "Applydeltarpm : " << line;
52 return( prog.close() == 0 );
55 /////////////////////////////////////////////////////////////////
57 ///////////////////////////////////////////////////////////////////
59 /******************************************************************
61 ** FUNCTION NAME : haveApplydeltarpm
62 ** FUNCTION TYPE : bool
64 bool haveApplydeltarpm()
66 // To track changes in availability of applydeltarpm.
67 static TriBool _last = indeterminate;
68 PathInfo prog( applydeltarpm_prog );
69 bool have = prog.isX();
71 ; // TriBool! 'else' is not '_last != have'
74 // _last is 'indeterminate' or '!have'
76 MIL << "Found executable " << prog << endl;
78 WAR << "No executable " << prog << endl;
83 /******************************************************************
85 ** FUNCTION NAME : check
86 ** FUNCTION TYPE : bool
88 bool check( const std::string & sequenceinfo_r, bool quick_r )
90 if ( ! haveApplydeltarpm() )
93 const char *const argv[] = {
94 "/usr/bin/applydeltarpm",
95 ( quick_r ? "-C" : "-c" ),
96 "-s", sequenceinfo_r.c_str(),
100 return( applydeltarpm( argv ) );
103 /******************************************************************
105 ** FUNCTION NAME : check
106 ** FUNCTION TYPE : bool
108 bool check( const Pathname & delta_r, bool quick_r )
110 if ( ! haveApplydeltarpm() )
113 const char *const argv[] = {
114 "/usr/bin/applydeltarpm",
115 ( quick_r ? "-C" : "-c" ),
116 delta_r.asString().c_str(),
120 return( applydeltarpm( argv ) );
123 /******************************************************************
125 ** FUNCTION NAME : provide
126 ** FUNCTION TYPE : bool
128 bool provide( const Pathname & delta_r, const Pathname & new_r,
129 const Progress & report_r )
132 AutoDispose<const Pathname> guard( new_r, filesystem::unlink );
134 if ( ! haveApplydeltarpm() )
137 const char *const argv[] = {
138 "/usr/bin/applydeltarpm",
139 "-p", "-p", // twice to get percent output one per line
140 delta_r.asString().c_str(),
141 new_r.asString().c_str(),
145 if ( ! applydeltarpm( argv, report_r ) )
148 guard.resetDispose(); // no cleanup on success
152 /******************************************************************
154 ** FUNCTION NAME : provide
155 ** FUNCTION TYPE : bool
157 bool provide( const Pathname & old_r, const Pathname & delta_r,
158 const Pathname & new_r,
159 const Progress & report_r )
162 AutoDispose<const Pathname> guard( new_r, filesystem::unlink );
164 if ( ! haveApplydeltarpm() )
167 const char *const argv[] = {
168 "/usr/bin/applydeltarpm",
169 "-p", "-p", // twice to get percent output one per line
170 "-r", old_r.asString().c_str(),
171 delta_r.asString().c_str(),
172 new_r.asString().c_str(),
176 if ( ! applydeltarpm( argv, report_r ) )
179 guard.resetDispose(); // no cleanup on success
183 /////////////////////////////////////////////////////////////////
184 } // namespace applydeltarpm
185 ///////////////////////////////////////////////////////////////////
186 /////////////////////////////////////////////////////////////////
188 ///////////////////////////////////////////////////////////////////