-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 82 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.h | 1 |
2 files changed, 81 insertions, 2 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index c762633..452eca3 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp | |||
@@ -64,10 +64,14 @@ bool Ipkg :: runIpkg( ) | |||
64 | cmd += " ; "; | 64 | cmd += " ; "; |
65 | } | 65 | } |
66 | cmd += "ipkg -force-defaults"; | 66 | cmd += "ipkg -force-defaults"; |
67 | if ( option != "update" && option != "download" ) | 67 | |
68 | { | 68 | // only set the destination for an install operation |
69 | if ( option == "install" ) | ||
69 | cmd += " -dest "+ destination; | 70 | cmd += " -dest "+ destination; |
70 | 71 | ||
72 | |||
73 | if ( option != "update" && option != "download" ) | ||
74 | { | ||
71 | if ( flags & FORCE_DEPENDS ) | 75 | if ( flags & FORCE_DEPENDS ) |
72 | cmd += " -force-depends"; | 76 | cmd += " -force-depends"; |
73 | if ( flags & FORCE_REINSTALL ) | 77 | if ( flags & FORCE_REINSTALL ) |
@@ -156,13 +160,87 @@ bool Ipkg :: runIpkg( ) | |||
156 | } | 160 | } |
157 | 161 | ||
158 | delete dependantPackages; | 162 | delete dependantPackages; |
163 | |||
164 | // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file | ||
165 | // to workaround an ipkg bug which stops reinstall to a different location | ||
166 | if ( option == "remove" ) | ||
167 | removeStatusEntry(); | ||
159 | 168 | ||
169 | |||
160 | // emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") ); | 170 | // emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") ); |
161 | emit outputText( "Finished" ); | 171 | emit outputText( "Finished" ); |
162 | emit outputText( "" ); | 172 | emit outputText( "" ); |
163 | return ret; | 173 | return ret; |
164 | } | 174 | } |
165 | 175 | ||
176 | void Ipkg :: removeStatusEntry() | ||
177 | { | ||
178 | QString statusFile = destDir; | ||
179 | if ( statusFile.right( 1 ) != "/" ) | ||
180 | statusFile += "/"; | ||
181 | statusFile += "usr/lib/ipkg/status"; | ||
182 | QString outStatusFile = statusFile + ".tmp"; | ||
183 | |||
184 | emit outputText( "" ); | ||
185 | emit outputText( "Removing status entry..." ); | ||
186 | emit outputText( QString( "status file - " )+ statusFile ); | ||
187 | emit outputText( QString( "package - " )+ package ); | ||
188 | |||
189 | ifstream in( statusFile ); | ||
190 | ofstream out( outStatusFile ); | ||
191 | if ( !in.is_open() ) | ||
192 | { | ||
193 | emit outputText( QString( "Couldn't open status file - " )+ statusFile ); | ||
194 | return; | ||
195 | } | ||
196 | |||
197 | if ( !out.is_open() ) | ||
198 | { | ||
199 | emit outputText( QString( "Couldn't create tempory status file - " )+ outStatusFile ); | ||
200 | return; | ||
201 | } | ||
202 | |||
203 | char line[1001]; | ||
204 | char k[21]; | ||
205 | char v[1001]; | ||
206 | QString key; | ||
207 | QString value; | ||
208 | do | ||
209 | { | ||
210 | in.getline( line, 1000 ); | ||
211 | if ( in.eof() ) | ||
212 | continue; | ||
213 | |||
214 | k[0] = '\0'; | ||
215 | v[0] = '\0'; | ||
216 | |||
217 | sscanf( line, "%[^:]: %[^\n]", k, v ); | ||
218 | key = k; | ||
219 | value = v; | ||
220 | key = key.stripWhiteSpace(); | ||
221 | value = value.stripWhiteSpace(); | ||
222 | if ( key == "Package" && value == package ) | ||
223 | { | ||
224 | // Ignore all lines up to next empty | ||
225 | do | ||
226 | { | ||
227 | in.getline( line, 1000 ); | ||
228 | if ( in.eof() || QString( line ).stripWhiteSpace() == "" ) | ||
229 | continue; | ||
230 | } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" ); | ||
231 | } | ||
232 | |||
233 | out << line << endl; | ||
234 | } while ( !in.eof() ); | ||
235 | |||
236 | in.close(); | ||
237 | out.close(); | ||
238 | |||
239 | // Remove old status file and put tmp stats file in its place | ||
240 | remove( statusFile ); | ||
241 | rename( outStatusFile, statusFile ); | ||
242 | } | ||
243 | |||
166 | 244 | ||
167 | int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) | 245 | int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) |
168 | { | 246 | { |
diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h index 63588c4..55e9ff4 100644 --- a/noncore/settings/aqpkg/ipkg.h +++ b/noncore/settings/aqpkg/ipkg.h | |||
@@ -63,6 +63,7 @@ private: | |||
63 | QList<QString> *dependantPackages; | 63 | QList<QString> *dependantPackages; |
64 | 64 | ||
65 | int executeIpkgCommand( QString &cmd, const QString option ); | 65 | int executeIpkgCommand( QString &cmd, const QString option ); |
66 | void removeStatusEntry(); | ||
66 | void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); | 67 | void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); |
67 | QStringList* getList( const QString &packageFilename, const QString &destDir ); | 68 | QStringList* getList( const QString &packageFilename, const QString &destDir ); |
68 | void processFileList( const QStringList *fileList, const QString &destDir ); | 69 | void processFileList( const QStringList *fileList, const QString &destDir ); |