diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-27 01:04:16 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-27 01:04:16 -0600 |
commit | 5159cd2beb2e87806a5b54e9991b7895285c9d3e (patch) | |
tree | 9b70e8be47a390f8f4d56ead812ab0c9dad88709 /kconf_update | |
parent | c17cb900dcf52b8bd6dc300d4f103392900ec2b4 (diff) | |
download | tdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.tar.gz tdelibs-5159cd2beb2e87806a5b54e9991b7895285c9d3e.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'kconf_update')
-rw-r--r-- | kconf_update/CMakeLists.txt | 34 | ||||
-rw-r--r-- | kconf_update/Mainpage.dox | 31 | ||||
-rw-r--r-- | kconf_update/Makefile.am | 33 | ||||
-rw-r--r-- | kconf_update/README.kconf_update | 251 | ||||
-rw-r--r-- | kconf_update/kconf_update.cpp | 959 |
5 files changed, 0 insertions, 1308 deletions
diff --git a/kconf_update/CMakeLists.txt b/kconf_update/CMakeLists.txt deleted file mode 100644 index 2e25811a7..000000000 --- a/kconf_update/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -################################################# -# -# (C) 2010 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${TQT_INCLUDE_DIRS} - ${CMAKE_BINARY_DIR}/tdecore - ${CMAKE_SOURCE_DIR}/tdecore -) - -link_directories( - ${TQT_LIBRARY_DIRS} -) - - -##### kconf_update ############################## - -set( target kconf_update ) - -set( ${target}_SRCS - kconf_update.cpp -) - -tde_add_tdeinit_executable( ${target} AUTOMOC - SOURCES ${${target}_SRCS} - LINK tdecore-shared -) diff --git a/kconf_update/Mainpage.dox b/kconf_update/Mainpage.dox deleted file mode 100644 index 9db5adb3b..000000000 --- a/kconf_update/Mainpage.dox +++ /dev/null @@ -1,31 +0,0 @@ -/** @mainpage ./kconf_update - -kconf_update is a tool designed to update config files. Over time applications -sometimes need to rearrange the way configuration options are stored. Since -such an update shouldn't influence the configuration options that the user -has selected, the application must take care that the options stored in the -old way will still be honored. - -What used to happen is that the application looks up both the old and the -new configuration option and then decides which one to use. This method has -several drawbacks: -- The application may need to read more configuration files than strictly - needed, resulting in a slower startup. -- The application becomes bigger with code that will only be used once. - -kconf_update addresses these problems by offering a framework to update -configuration files without adding code to the application itself. - -See the README file for more information. - -@authors -Waldo Bastian \<bastian@kde.org\> - -@maintainers -[Unknown/None] - -@licenses -@lgpl - -*/ -// vim:ts=4:sw=4:expandtab:filetype=doxygen diff --git a/kconf_update/Makefile.am b/kconf_update/Makefile.am deleted file mode 100644 index afe3864d9..000000000 --- a/kconf_update/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -# This file is part of the KDE libraries -# Copyright (C) 2001 Waldo Bastian <bastian@kde.org> - -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. - -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. - -# You should have received a copy of the GNU Library General Public License -# along with this library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -INCLUDES= -I../kded $(all_includes) - -bin_PROGRAMS = -lib_LTLIBRARIES = -tdeinit_LTLIBRARIES = kconf_update.la - -kconf_update_la_SOURCES = kconf_update.cpp -kconf_update_la_LIBADD = $(LIB_TDECORE) $(LIB_QT) -kconf_update_la_LDFLAGS = $(all_libraries) -module -avoid-version - -METASOURCES = AUTO - -# Internal -# noinst_HEADERS = kconf_update.h - diff --git a/kconf_update/README.kconf_update b/kconf_update/README.kconf_update deleted file mode 100644 index c8229c735..000000000 --- a/kconf_update/README.kconf_update +++ /dev/null @@ -1,251 +0,0 @@ -README kconf_update - -Version: 1.1 -Author: Waldo Bastian <bastian@kde.org>, <bastian@suse.com> - -What it does -============ - -kconf_update is a tool designed to update config files. Over time applications -sometimes need to rearrange the way configuration options are stored. Since -such an update shouldn't influence the configuration options that the user -has selected, the application must take care that the options stored in the -old way will still be honored. - -What used to happen is that the application looks up both the old and the -new configuration option and then decides which one to use. This method has -several drawbacks: -* The application may need to read more configuration files than strictly -needed, resulting in a slower startup. -* The application becomes bigger with code that will only be used once. - -kconf_update addresses these problems by offering a framework to update -configuration files without adding code to the application itself. - - -How it works -============ - -Applications can install so called "update files" under -$TDEDIR/share/apps/kconf_update. An update file has ".upd" as extension and -contains instructions for transferring/converting configuration information -from one place to another. - -Updating the configuration happens automatically, either when KDE gets started -or when kded detects a new update file in the above mentioned location. - -Update files are separated into sections. Each section has an Id. When a -section describing a configuration change has been applied, the Id will be -stored in the file "kconf_updaterc". This information is used to make sure -that a configuration update is only performed once. - -If you overwrite an existing update file with a new version that contains a -new section, only the update instructions from this extra section will be -performed. - -File format of the update file -============================== - -Empty lines or lines that start with '#' are considered comments. -Commas (,) are used to seperate fields and may not occur as part -of any field and all of the keywords are case-sensitive, i.e. you -cannot say "key" instead of "Key" for example. - -For the rest the file is parsed and executed sequentially from top to bottom. -Each line can contain one entry. The following entries are recognized: - - -Id=<id> - -With <id> identifying the group of update entries that follows. Once a group -of entries have been applied, their <id> is stored and this group of entries -will not be applied again. - - -File=<oldfile>,<newfile> -File=<oldfile> - -Specifies that configuration information is read from <oldfile> and written -to <newfile>. If you only specify <oldfile>, the information is read from -as well as written to <oldfile>. - -Script=<script>[,<interpreter>] - -All entries from <oldfile> are piped into <script>. The output of script -is used as new entries for <newfile>. Existing entries can be deleted by -adding lines with "# DELETE [group]key" in the output of the script. -To delete a whole group use "# DELETEGROUP [group]". - -<script> should be installed into $(kde_datadir)/kconf_update, or -kconf_update will not be able to find it. It is not portable to install -binary applications in $kde_datadir, so you have to stick with interpreted -scripts like sh or perl scripts. From KDE 3.2 onwards it's also possible -to install kconf_update applications in $(kde_bindir)/kconf_update_bin, -which opens the door to kconf_update applications that are written in C++ -and use Qt's powerful string API instead. - -A workaround for KDE 3.1.x and older is to install a .sh script in -$(kde_datadir) that contains a simple exec: - - exec "`tde-config --prefix`/bin/kconf_update_bin/my_update_app" - -This is equivalent to what KDE 3.2 can do directly, but of course the .upd -file now points to the .sh script instead of the binary application. - -If Script was issued after a "Group" command the behavior is slightly -different: -All entries from <oldfile>/<oldgroup> are piped into <script>. The output -of script is used as new entries for <newfile>/<newgroup>, unless a different -group is specified with "[group]". Existing entries can be deleted from -<oldgroup> by adding lines with "# DELETE key" in the output of the script. -To delete <oldgroup> use "# DELETEGROUP". - -<interpreter> can be something like "perl". - -Since KDE 3.3 it is also possible to have a Script without specifying -<oldfile> or <newfile>. In that case the script is run but it will not be -fed any input and its output will simply be discarded. - -ScriptArguments=<arguments> - -If specified, the arguments will be passed to <script>. -IMPORTANT: It has to be specified before Script=. - -Group=<oldgroup>,<newgroup> -Group=<oldgroup> - -Specifies that configuration information is read from the group <oldgroup> -and written to <newgroup>. If you only specify <oldgroup>, the information -is read from as well as written to <oldgroup>. You can use <default> to -specify keys that are not under any group. - -RemoveGroup=<oldgroup> - -Specifies that <oldgroup> is removed entirely. This can be used -to remove obsolete entries or to force a revert to default values. - -Options=<option1>, <option2>, .... - -With this entry you can specify options that apply to the next "Script", -"Key" or "AllKeys" entry (only to the first!). Possible options are: - -- "copy" Copy the configuration item instead of moving it. This means that - the configuration item will not be deleted from <oldfile>/<oldgroup>. - -- "overwrite" Normally, a configuration item is not moved if an item with the - new name already exists. When this option is specified the old - configuration item will overwrite any existing item. - - -Key=<oldkey>,<newkey> -Key=<oldkey> - -Specifies that configuration information is read from the key <oldkey> -and written to <newkey>. If you only specify <oldkey>, the information -is read from as well as written to <oldkey>. - - -AllKeys - -Specifies that all configuration information in the selected group should -be moved (All keys). - -AllGroups - -Specifies that all configuration information from all keys in ALL -groups should be moved. - - -RemoveKey=<oldkey> - -Specifies that <oldkey> is removed from the selected group. This can be used -to remove obsolete entries or to force a revert to default values. - - -Example update file -=================== - -# This is comment -Id=kde2.2 -File=kioslaverc,kio_httprc -Group=Proxy Settings -Key=NoProxyFor -Key=UseProxy -Key=httpProxy,Proxy -Group=Cache Settings,Cache -Key=MaxCacheSize -Key=UseCache -Group=UserAgent -AllKeys -RemoveGroup=KDE -# End of file - - -The above update file extracts config information from the file "kioslaverc" -and stores it into the file "kio_httprc". - -It reads the keys "NoProxyFor", "UseProxy" and "httpProxy" from the group -"Proxy Settings" in the "kioslaverc" file. If any of these options are present -they are written to the keys "NoProxyFor", "UseProxy" and "Proxy" (!) in -the group "Proxy Settings" in the "kio_httprc" file. - -It also reads the keys "MaxCacheSize" and "UseCache" from the group -"Cache Settings" in the "kioslaverc" file and writes this information to the -keys "MaxCacheSize" and "UseCache" in the group "Cache" (!) in the -"kio_httprc" file. - -Then it takes all keys in the "UserAgent" group of the file "kioslaverc" -and moves then to the "UserAgent" group in the "kio_httprc" file. - -Finally it removes the entire "KDE" group in the kioslaverc file. - - -Debugging and testing -===================== - -If you are developing a kconf_update script and want to test or debug it you -need to make sure kconf_update runs again after each of your changes. There -are a number of ways to achieve this. - -The easiest is to not install the kconf_update script in the first place, but -manually call it through a pipe. If you want to test the update script for -your application KHello's config file khellorc, you can test by using - - cat ~/.trinity/share/config/khellorc | khello_conf_update.sh - -(assuming khello_conf_update.sh is the kconf_update script and ~/.trinity is your -$TDEHOME). This is easier than making install every time, but has the obvious -downside that you need to 'parse' your script's output yourself instead of -letting kconf_update do it and check the resulting output file. - -After 'make install' the kconf_update script is run by kded, but it does so -only once. This is of course the idea behind it, but while developing it can -be a problem. You can increase the revision number for each subsequent run -of 'make install' to force a new kconf_update run, but there's a better -approach that doesn't skyrocket the version number for a mediocre debug -session. - -kded doesn't really ignore scripts that it has already run right away. -Instead it checks the affected config file every time a .upd file is added -or changed. The reason it still doesn't run again on your config file lies -in the traces kconf_update leaves behind: it adds a special config group -'[$Version]' with a key 'update_info'. This key lists all kconf_update -scripts that have already been run on this config file. Just remove your -file's entry, 'make install', and kconf_update will happily run your script -again, without you having to increase the version number. - -If you want to know what kconf_update has been up to lately, have a look -at $TDEHOME/share/apps/kconf_update/update.log - - -Common Problems -=============== - -* kconf_update refuses to update an entry -If you change the value of an entry without changing the key or file, -make sure to tell kconf_update that it should overwrite the old entry -by adding "Options=overwrite". - - -Have fun, -Waldo diff --git a/kconf_update/kconf_update.cpp b/kconf_update/kconf_update.cpp deleted file mode 100644 index daf66ca9b..000000000 --- a/kconf_update/kconf_update.cpp +++ /dev/null @@ -1,959 +0,0 @@ -/* - * - * This file is part of the KDE libraries - * Copyright (c) 2001 Waldo Bastian <bastian@kde.org> - * - * $Id$ - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - **/ - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <stdlib.h> - -#include <tqfile.h> -#include <tqtextstream.h> - -#include <kconfig.h> -#include <ksimpleconfig.h> -#include <klocale.h> -#include <kcmdlineargs.h> -#include <kglobal.h> -#include <kstandarddirs.h> -#include <kaboutdata.h> -#include <kinstance.h> -#include <ktempfile.h> - -static KCmdLineOptions options[] = -{ - { "debug", I18N_NOOP("Keep output results from scripts"), 0 }, - { "check <update-file>", I18N_NOOP("Check whether config file itself requires updating"), 0 }, - { "+[file]", I18N_NOOP("File to read update instructions from"), 0 }, - KCmdLineLastOption -}; - -class KonfUpdate -{ -public: - KonfUpdate(); - ~KonfUpdate(); - TQStringList findUpdateFiles(bool dirtyOnly); - - TQTextStream &log(); - - bool checkFile(const TQString &filename); - void checkGotFile(const TQString &_file, const TQString &id); - - bool updateFile(const TQString &filename); - - void gotId(const TQString &_id); - void gotFile(const TQString &_file); - void gotGroup(const TQString &_group); - void gotRemoveGroup(const TQString &_group); - void gotKey(const TQString &_key); - void gotRemoveKey(const TQString &_key); - void gotAllKeys(); - void gotAllGroups(); - void gotOptions(const TQString &_options); - void gotScript(const TQString &_script); - void gotScriptArguments(const TQString &_arguments); - void resetOptions(); - - void copyGroup(TDEConfigBase *cfg1, const TQString &grp1, - TDEConfigBase *cfg2, const TQString &grp2); - -protected: - TDEConfig *config; - TQString currentFilename; - bool skip; - bool debug; - TQString id; - - TQString oldFile; - TQString newFile; - TQString newFileName; - TDEConfig *oldConfig1; // Config to read keys from. - TDEConfig *oldConfig2; // Config to delete keys from. - TDEConfig *newConfig; - - TQString oldGroup; - TQString newGroup; - TQString oldKey; - TQString newKey; - - bool m_bCopy; - bool m_bOverwrite; - bool m_bUseConfigInfo; - TQString m_arguments; - TQTextStream *m_textStream; - TQFile *m_file; - TQString m_line; - int m_lineCount; -}; - -KonfUpdate::KonfUpdate() - : m_textStream(0), m_file(0) -{ - bool updateAll = false; - oldConfig1 = 0; - oldConfig2 = 0; - newConfig = 0; - - config = new TDEConfig("kconf_updaterc"); - - TQStringList updateFiles; - TDECmdLineArgs *args=TDECmdLineArgs::parsedArgs(); - - debug = args->isSet("debug"); - - m_bUseConfigInfo = false; - if (args->isSet("check")) - { - m_bUseConfigInfo = true; - TQString file = locate("data", "kconf_update/"+TQFile::decodeName(args->getOption("check"))); - if (file.isEmpty()) - { - tqWarning("File '%s' not found.", args->getOption("check").data()); - log() << "File '" << TQFile::decodeName(args->getOption("check")) << "' passed on command line not found" << endl; - return; - } - updateFiles.append(file); - } - else if (args->count()) - { - for(int i = 0; i < args->count(); i++) - { - KURL url = args->url(i); - if (!url.isLocalFile()) - TDECmdLineArgs::usage(i18n("Only local files are supported.")); - updateFiles.append(url.path()); - } - } - else - { - if (config->readBoolEntry("autoUpdateDisabled", false)) - return; - updateFiles = findUpdateFiles(true); - updateAll = true; - } - - for(TQStringList::ConstIterator it = updateFiles.begin(); - it != updateFiles.end(); - ++it) - { - TQString file = *it; - updateFile(file); - } - - config->setGroup(TQString::null); - if (updateAll && !config->readBoolEntry("updateInfoAdded", false)) - { - config->writeEntry("updateInfoAdded", true); - updateFiles = findUpdateFiles(false); - - for(TQStringList::ConstIterator it = updateFiles.begin(); - it != updateFiles.end(); - ++it) - { - TQString file = *it; - checkFile(file); - } - updateFiles.clear(); - } -} - -KonfUpdate::~KonfUpdate() -{ - delete config; - delete m_file; - delete m_textStream; -} - -TQTextStream & -KonfUpdate::log() -{ - if (!m_textStream) - { - TQString file = locateLocal("data", "kconf_update/log/update.log"); - m_file = new TQFile(file); - if (m_file->open(IO_WriteOnly | IO_Append)) - { - m_textStream = new TQTextStream(m_file); - } - else - { - // Error - m_textStream = new TQTextStream(stderr, IO_WriteOnly); - } - } - - (*m_textStream) << TQDateTime::currentDateTime().toString( Qt::ISODate ) << " "; - - return *m_textStream; -} - -TQStringList KonfUpdate::findUpdateFiles(bool dirtyOnly) -{ - TQStringList result; - TQStringList list = TDEGlobal::dirs()->findAllResources("data", "kconf_update/*.upd", false, true); - for(TQStringList::ConstIterator it = list.begin(); - it != list.end(); - ++it) - { - TQString file = *it; - struct stat buff; - if (stat( TQFile::encodeName(file), &buff) == 0) - { - int i = file.findRev('/'); - if (i != -1) - file = file.mid(i+1); - config->setGroup(file); - time_t ctime = config->readUnsignedLongNumEntry("ctime"); - time_t mtime = config->readUnsignedLongNumEntry("mtime"); - if (!dirtyOnly || - (ctime != buff.st_ctime) || (mtime != buff.st_mtime)) - { - result.append(*it); - } - } - } - return result; -} - -bool KonfUpdate::checkFile(const TQString &filename) -{ - currentFilename = filename; - int i = currentFilename.findRev('/'); - if (i != -1) - currentFilename = currentFilename.mid(i+1); - skip = true; - TQFile file(filename); - if (!file.open(IO_ReadOnly)) - return false; - - TQTextStream ts(&file); - ts.setEncoding(TQTextStream::Latin1); - int lineCount = 0; - resetOptions(); - TQString id; - while(!ts.atEnd()) - { - TQString line = ts.readLine().stripWhiteSpace(); - lineCount++; - if (line.isEmpty() || (line[0] == '#')) - continue; - if (line.startsWith("Id=")) - id = currentFilename+":"+line.mid(3); - else if (line.startsWith("File=")) - checkGotFile(line.mid(5), id); - } - - return true; -} - -void KonfUpdate::checkGotFile(const TQString &_file, const TQString &id) -{ - TQString file; - int i = _file.find(','); - if (i == -1) - { - file = _file.stripWhiteSpace(); - } - else - { - file = _file.mid(i+1).stripWhiteSpace(); - } - -// tqDebug("File %s, id %s", file.latin1(), id.latin1()); - - KSimpleConfig cfg(file); - cfg.setGroup("$Version"); - TQStringList ids = cfg.readListEntry("update_info"); - if (ids.contains(id)) - return; - ids.append(id); - cfg.writeEntry("update_info", ids); -} - -/** - * Syntax: - * # Comment - * Id=id - * File=oldfile[,newfile] - * AllGroups - * Group=oldgroup[,newgroup] - * RemoveGroup=oldgroup - * Options=[copy,][overwrite,] - * Key=oldkey[,newkey] - * RemoveKey=ldkey - * AllKeys - * Keys= [Options](AllKeys|(Key|RemoveKey)*) - * ScriptArguments=arguments - * Script=scriptfile[,interpreter] - * - * Sequence: - * (Id,(File(Group,Keys)*)*)* - **/ -bool KonfUpdate::updateFile(const TQString &filename) -{ - currentFilename = filename; - int i = currentFilename.findRev('/'); - if (i != -1) - currentFilename = currentFilename.mid(i+1); - skip = true; - TQFile file(filename); - if (!file.open(IO_ReadOnly)) - return false; - - log() << "Checking update-file '" << filename << "' for new updates" << endl; - - TQTextStream ts(&file); - ts.setEncoding(TQTextStream::Latin1); - m_lineCount = 0; - resetOptions(); - while(!ts.atEnd()) - { - m_line = ts.readLine().stripWhiteSpace(); - m_lineCount++; - if (m_line.isEmpty() || (m_line[0] == '#')) - continue; - if (m_line.startsWith("Id=")) - gotId(m_line.mid(3)); - else if (skip) - continue; - else if (m_line.startsWith("Options=")) - gotOptions(m_line.mid(8)); - else if (m_line.startsWith("File=")) - gotFile(m_line.mid(5)); - else if (m_line.startsWith("Group=")) - gotGroup(m_line.mid(6)); - else if (m_line.startsWith("RemoveGroup=")) - { - gotRemoveGroup(m_line.mid(12)); - resetOptions(); - } - else if (m_line.startsWith("Script=")) - { - gotScript(m_line.mid(7)); - resetOptions(); - } - else if (m_line.startsWith("ScriptArguments=")) - gotScriptArguments(m_line.mid(16)); - else if (m_line.startsWith("Key=")) - { - gotKey(m_line.mid(4)); - resetOptions(); - } - else if (m_line.startsWith("RemoveKey=")) - { - gotRemoveKey(m_line.mid(10)); - resetOptions(); - } - else if (m_line == "AllKeys") - { - gotAllKeys(); - resetOptions(); - } - else if (m_line == "AllGroups") - { - gotAllGroups(); - resetOptions(); - } - else - { - log() << currentFilename << ": parse error in line " << m_lineCount << " : '" << m_line << "'" << endl; - } - } - // Flush. - gotId(TQString::null); - - struct stat buff; - stat( TQFile::encodeName(filename), &buff); - config->setGroup(currentFilename); - config->writeEntry("ctime", buff.st_ctime); - config->writeEntry("mtime", buff.st_mtime); - config->sync(); - return true; -} - - - -void KonfUpdate::gotId(const TQString &_id) -{ - if (!id.isEmpty() && !skip) - { - config->setGroup(currentFilename); - TQStringList ids = config->readListEntry("done"); - if (!ids.contains(id)) - { - ids.append(id); - config->writeEntry("done", ids); - config->sync(); - } - } - - // Flush pending changes - gotFile(TQString::null); - - config->setGroup(currentFilename); - TQStringList ids = config->readListEntry("done"); - if (!_id.isEmpty()) - { - if (ids.contains(_id)) - { - //tqDebug("Id '%s' was already in done-list", _id.latin1()); - if (!m_bUseConfigInfo) - { - skip = true; - return; - } - } - skip = false; - id = _id; - if (m_bUseConfigInfo) - log() << currentFilename << ": Checking update '" << _id << "'" << endl; - else - log() << currentFilename << ": Found new update '" << _id << "'" << endl; - } -} - -void KonfUpdate::gotFile(const TQString &_file) -{ - // Reset group - gotGroup(TQString::null); - - if (!oldFile.isEmpty()) - { - // Close old file. - delete oldConfig1; - oldConfig1 = 0; - - oldConfig2->setGroup("$Version"); - TQStringList ids = oldConfig2->readListEntry("update_info"); - TQString cfg_id = currentFilename + ":" + id; - if (!ids.contains(cfg_id) && !skip) - { - ids.append(cfg_id); - oldConfig2->writeEntry("update_info", ids); - } - oldConfig2->sync(); - delete oldConfig2; - oldConfig2 = 0; - - TQString file = locateLocal("config", oldFile); - struct stat s_buf; - if (stat(TQFile::encodeName(file), &s_buf) == 0) - { - if (s_buf.st_size == 0) - { - // Delete empty file. - unlink(TQFile::encodeName(file)); - } - } - - oldFile = TQString::null; - } - if (!newFile.isEmpty()) - { - // Close new file. - newConfig->setGroup("$Version"); - TQStringList ids = newConfig->readListEntry("update_info"); - TQString cfg_id = currentFilename + ":" + id; - if (!ids.contains(cfg_id) && !skip) - { - ids.append(cfg_id); - newConfig->writeEntry("update_info", ids); - } - newConfig->sync(); - delete newConfig; - newConfig = 0; - - newFile = TQString::null; - } - newConfig = 0; - - int i = _file.find(','); - if (i == -1) - { - oldFile = _file.stripWhiteSpace(); - } - else - { - oldFile = _file.left(i).stripWhiteSpace(); - newFile = _file.mid(i+1).stripWhiteSpace(); - if (oldFile == newFile) - newFile = TQString::null; - } - - if (!oldFile.isEmpty()) - { - oldConfig2 = new TDEConfig(oldFile, false, false); - TQString cfg_id = currentFilename + ":" + id; - oldConfig2->setGroup("$Version"); - TQStringList ids = oldConfig2->readListEntry("update_info"); - if (ids.contains(cfg_id)) - { - skip = true; - newFile = TQString::null; - log() << currentFilename << ": Skipping update '" << id << "'" << endl; - } - - if (!newFile.isEmpty()) - { - newConfig = new TDEConfig(newFile, false, false); - newConfig->setGroup("$Version"); - ids = newConfig->readListEntry("update_info"); - if (ids.contains(cfg_id)) - { - skip = true; - log() << currentFilename << ": Skipping update '" << id << "'" << endl; - } - } - else - { - newConfig = oldConfig2; - } - - oldConfig1 = new TDEConfig(oldFile, true, false); - } - else - { - newFile = TQString::null; - } - newFileName = newFile; - if (newFileName.isEmpty()) - newFileName = oldFile; -} - -void KonfUpdate::gotGroup(const TQString &_group) -{ - int i = _group.find(','); - if (i == -1) - { - oldGroup = _group.stripWhiteSpace(); - newGroup = oldGroup; - } - else - { - oldGroup = _group.left(i).stripWhiteSpace(); - newGroup = _group.mid(i+1).stripWhiteSpace(); - } -} - -void KonfUpdate::gotRemoveGroup(const TQString &_group) -{ - oldGroup = _group.stripWhiteSpace(); - - if (!oldConfig1) - { - log() << currentFilename << ": !! RemoveGroup without previous File specification in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - - if (!oldConfig1->hasGroup(oldGroup)) - return; - // Delete group. - oldConfig2->deleteGroup(oldGroup, true); - log() << currentFilename << ": RemoveGroup removes group " << oldFile << ":" << oldGroup << endl; -} - - -void KonfUpdate::gotKey(const TQString &_key) -{ - int i = _key.find(','); - if (i == -1) - { - oldKey = _key.stripWhiteSpace(); - newKey = oldKey; - } - else - { - oldKey = _key.left(i).stripWhiteSpace(); - newKey = _key.mid(i+1).stripWhiteSpace(); - } - - if (oldKey.isEmpty() || newKey.isEmpty()) - { - log() << currentFilename << ": !! Key specifies invalid key in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - if (!oldConfig1) - { - log() << currentFilename << ": !! Key without previous File specification in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - oldConfig1->setGroup(oldGroup); - if (!oldConfig1->hasKey(oldKey)) - return; - TQString value = oldConfig1->readEntry(oldKey); - newConfig->setGroup(newGroup); - if (!m_bOverwrite && newConfig->hasKey(newKey)) - { - log() << currentFilename << ": Skipping " << newFileName << ":" << newGroup << ":" << newKey << ", already exists."<< endl; - return; - } - log() << currentFilename << ": Updating " << newFileName << ":" << newGroup << ":" << newKey << " to '" << value << "'" << endl; - newConfig->writeEntry(newKey, value); - - if (m_bCopy) - return; // Done. - - // Delete old entry - if ((oldConfig2 == newConfig) && - (oldGroup == newGroup) && - (oldKey == newKey)) - return; // Don't delete! - oldConfig2->setGroup(oldGroup); - oldConfig2->deleteEntry(oldKey, false); - log() << currentFilename << ": Removing " << oldFile << ":" << oldGroup << ":" << oldKey << ", moved." << endl; - if (oldConfig2->deleteGroup(oldGroup, false)) { // Delete group if empty. - log() << currentFilename << ": Removing empty group " << oldFile << ":" << oldGroup << endl; - } -} - -void KonfUpdate::gotRemoveKey(const TQString &_key) -{ - oldKey = _key.stripWhiteSpace(); - - if (oldKey.isEmpty()) - { - log() << currentFilename << ": !! RemoveKey specifies invalid key in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - - if (!oldConfig1) - { - log() << currentFilename << ": !! Key without previous File specification in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - - oldConfig1->setGroup(oldGroup); - if (!oldConfig1->hasKey(oldKey)) - return; - log() << currentFilename << ": RemoveKey removes " << oldFile << ":" << oldGroup << ":" << oldKey << endl; - - // Delete old entry - oldConfig2->setGroup(oldGroup); - oldConfig2->deleteEntry(oldKey, false); - if (oldConfig2->deleteGroup(oldGroup, false)) { // Delete group if empty. - log() << currentFilename << ": Removing empty group " << oldFile << ":" << oldGroup << endl; - } -} - -void KonfUpdate::gotAllKeys() -{ - if (!oldConfig1) - { - log() << currentFilename << ": !! AllKeys without previous File specification in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - - TQMap<TQString, TQString> list = oldConfig1->entryMap(oldGroup); - for(TQMap<TQString, TQString>::Iterator it = list.begin(); - it != list.end(); ++it) - { - gotKey(it.key()); - } -} - -void KonfUpdate::gotAllGroups() -{ - if (!oldConfig1) - { - log() << currentFilename << ": !! AllGroups without previous File specification in line " << m_lineCount << " : '" << m_line << "'" << endl; - return; - } - - TQStringList allGroups = oldConfig1->groupList(); - for(TQStringList::ConstIterator it = allGroups.begin(); - it != allGroups.end(); ++it) - { - oldGroup = *it; - newGroup = oldGroup; - gotAllKeys(); - } -} - -void KonfUpdate::gotOptions(const TQString &_options) -{ - TQStringList options = TQStringList::split(',', _options); - for(TQStringList::ConstIterator it = options.begin(); - it != options.end(); - ++it) - { - if ( (*it).lower().stripWhiteSpace() == "copy") - m_bCopy = true; - - if ( (*it).lower().stripWhiteSpace() == "overwrite") - m_bOverwrite = true; - } -} - -void KonfUpdate::copyGroup(TDEConfigBase *cfg1, const TQString &grp1, - TDEConfigBase *cfg2, const TQString &grp2) -{ - cfg1->setGroup(grp1); - cfg2->setGroup(grp2); - TQMap<TQString, TQString> list = cfg1->entryMap(grp1); - for(TQMap<TQString, TQString>::Iterator it = list.begin(); - it != list.end(); ++it) - { - cfg2->writeEntry(it.key(), cfg1->readEntry(it.key())); - } -} - -void KonfUpdate::gotScriptArguments(const TQString &_arguments) -{ - m_arguments = _arguments; -} - -void KonfUpdate::gotScript(const TQString &_script) -{ - TQString script, interpreter; - int i = _script.find(','); - if (i == -1) - { - script = _script.stripWhiteSpace(); - } - else - { - script = _script.left(i).stripWhiteSpace(); - interpreter = _script.mid(i+1).stripWhiteSpace(); - } - - - if (script.isEmpty()) - { - log() << currentFilename << ": !! Script fails to specifiy filename in line " << m_lineCount << " : '" << m_line << "'" << endl; - skip = true; - return; - } - - - - TQString path = locate("data","kconf_update/"+script); - if (path.isEmpty()) - { - if (interpreter.isEmpty()) - path = locate("lib", "kconf_update_bin/"+script); - - if (path.isEmpty()) - { - log() << currentFilename << ": !! Script '" << script << "' not found in line " << m_lineCount << " : '" << m_line << "'" << endl; - skip = true; - return; - } - } - - if( !m_arguments.isNull()) - log() << currentFilename << ": Running script '" << script << "' with arguments '" << m_arguments << "'" << endl; - else - log() << currentFilename << ": Running script '" << script << "'" << endl; - - TQString cmd; - if (interpreter.isEmpty()) - cmd = path; - else - cmd = interpreter + " " + path; - - if( !m_arguments.isNull()) - { - cmd += ' '; - cmd += m_arguments; - } - - KTempFile tmp1; - tmp1.setAutoDelete(true); - KTempFile tmp2; - tmp2.setAutoDelete(true); - KTempFile tmp3; - tmp3.setAutoDelete(true); - - int result; - if (oldConfig1) - { - if (debug) - { - tmp1.setAutoDelete(false); - log() << "Script input stored in " << tmp1.name() << endl; - } - KSimpleConfig cfg(tmp1.name()); - - if (oldGroup.isEmpty()) - { - // Write all entries to tmpFile; - TQStringList grpList = oldConfig1->groupList(); - for(TQStringList::ConstIterator it = grpList.begin(); - it != grpList.end(); - ++it) - { - copyGroup(oldConfig1, *it, &cfg, *it); - } - } - else - { - copyGroup(oldConfig1, oldGroup, &cfg, TQString::null); - } - cfg.sync(); - result = system(TQFile::encodeName(TQString("%1 < %2 > %3 2> %4").arg(cmd, tmp1.name(), tmp2.name(), tmp3.name()))); - } - else - { - // No config file - result = system(TQFile::encodeName(TQString("%1 2> %2").arg(cmd, tmp3.name()))); - } - - // Copy script stderr to log file - { - TQFile output(tmp3.name()); - if (output.open(IO_ReadOnly)) - { - TQTextStream ts( &output ); - ts.setEncoding(TQTextStream::UnicodeUTF8); - while(!ts.atEnd()) - { - TQString line = ts.readLine(); - log() << "[Script] " << line << endl; - } - } - } - - if (result) - { - log() << currentFilename << ": !! An error occured while running '" << cmd << "'" << endl; - return; - } - - if (!oldConfig1) - return; // Nothing to merge - - if (debug) - { - tmp2.setAutoDelete(false); - log() << "Script output stored in " << tmp2.name() << endl; - } - - // Deleting old entries - { - TQString group = oldGroup; - TQFile output(tmp2.name()); - if (output.open(IO_ReadOnly)) - { - TQTextStream ts( &output ); - ts.setEncoding(TQTextStream::UnicodeUTF8); - while(!ts.atEnd()) - { - TQString line = ts.readLine(); - if (line.startsWith("[")) - { - int j = line.find(']')+1; - if (j > 0) - group = line.mid(1, j-2); - } - else if (line.startsWith("# DELETE ")) - { - TQString key = line.mid(9); - if (key[0] == '[') - { - int j = key.find(']')+1; - if (j > 0) - { - group = key.mid(1,j-2); - key = key.mid(j); - } - } - oldConfig2->setGroup(group); - oldConfig2->deleteEntry(key, false); - log() << currentFilename << ": Script removes " << oldFile << ":" << group << ":" << key << endl; - if (oldConfig2->deleteGroup(group, false)) { // Delete group if empty. - log() << currentFilename << ": Removing empty group " << oldFile << ":" << group << endl; - } - } - else if (line.startsWith("# DELETEGROUP")) - { - TQString key = line.mid(13).stripWhiteSpace(); - if (key[0] == '[') - { - int j = key.find(']')+1; - if (j > 0) - { - group = key.mid(1,j-2); - } - } - if (oldConfig2->deleteGroup(group, true)) { // Delete group - log() << currentFilename << ": Script removes group " << oldFile << ":" << group << endl; - } - } - } - } - } - - // Merging in new entries. - m_bCopy = true; - { - TDEConfig *saveOldConfig1 = oldConfig1; - TQString saveOldGroup = oldGroup; - TQString saveNewGroup = newGroup; - oldConfig1 = new TDEConfig(tmp2.name(), true, false); - - // For all groups... - TQStringList grpList = oldConfig1->groupList(); - for(TQStringList::ConstIterator it = grpList.begin(); - it != grpList.end(); - ++it) - { - oldGroup = *it; - if (oldGroup != "<default>") - { - newGroup = oldGroup; - } - gotAllKeys(); // Copy all keys - } - delete oldConfig1; - oldConfig1 = saveOldConfig1; - oldGroup = saveOldGroup; - newGroup = saveNewGroup; - } -} - -void KonfUpdate::resetOptions() -{ - m_bCopy = false; - m_bOverwrite = false; - m_arguments = TQString::null; -} - - -extern "C" KDE_EXPORT int kdemain(int argc, char **argv) -{ - TDEAboutData aboutData("kconf_update", I18N_NOOP("KConf Update"), - "1.0.2", - I18N_NOOP("TDE Tool for updating user configuration files"), - TDEAboutData::License_GPL, - "(c) 2001, Waldo Bastian"); - - aboutData.addAuthor("Waldo Bastian", 0, "bastian@kde.org"); - - TDECmdLineArgs::init(argc, argv, &aboutData); - TDECmdLineArgs::addCmdLineOptions(options); - - TDEInstance instance(&aboutData); - - KonfUpdate konfUpdate; - - return 0; -} |