From d4fe7d53ddf8f3e7ae046a511f0dc061f30d45ce Mon Sep 17 00:00:00 2001 From: ar Date: Tue, 01 Jun 2004 22:21:23 +0000 Subject: - convert to odebug framework --- (limited to 'libopie2') diff --git a/libopie2/opiepim/backend/obackendfactory.h b/libopie2/opiepim/backend/obackendfactory.h index 6f46652..3680ded 100644 --- a/libopie2/opiepim/backend/obackendfactory.h +++ b/libopie2/opiepim/backend/obackendfactory.h @@ -34,10 +34,7 @@ #ifndef OPIE_BACKENDFACTORY_H_ #define OPIE_BACKENDFACTORY_H_ -#include -#include -#include - +/* OPIE */ #include #include #include @@ -45,6 +42,7 @@ #include #include #include +#include #ifdef __USE_SQL #include @@ -52,6 +50,14 @@ #include #endif +#include + +/* QT */ +#include +#include + + + using namespace Opie; using namespace Opie::Pim; @@ -78,144 +84,144 @@ template class OBackendFactory { public: - OBackendFactory() {}; + OBackendFactory() {}; /** * Returns a selected backend implementation * @param type the type of the backend - * @param database the type of the used database + * @param database the type of the used database * @param appName The name of your application. It will be passed on to the backend. - * @param filename Filename of the database file if you don't want to access the default - * @see OPimGlobal() + * @param filename Filename of the database file if you don't want to access the default + * @see OPimGlobal() */ - static T* create( OPimGlobal::PimType type, OPimGlobal::DatabaseStyle database, - const QString& appName, const QString& filename = QString::null ){ - qWarning("Selected backend for %d is: %d", type, database ); - // If we should use the dafult database style, we have to request it - OPimGlobal::DatabaseStyle use_database = database; - if ( use_database == OPimGlobal::DEFAULT ){ - use_database = defaultDB( type ); - } - - switch ( type ){ - case OPimGlobal::TODOLIST: - - switch ( use_database ){ - default: // Use SQL if something weird is given. - // Fall through !! - case OPimGlobal::SQL: + static T* create( OPimGlobal::PimType type, OPimGlobal::DatabaseStyle database, + const QString& appName, const QString& filename = QString::null ){ + owarn << "Selected backend for " << type << " is: " << database << oendl; + // If we should use the dafult database style, we have to request it + OPimGlobal::DatabaseStyle use_database = database; + if ( use_database == OPimGlobal::DEFAULT ){ + use_database = defaultDB( type ); + } + + switch ( type ){ + case OPimGlobal::TODOLIST: + + switch ( use_database ){ + default: // Use SQL if something weird is given. + // Fall through !! + case OPimGlobal::SQL: #ifdef __USE_SQL - return (T*) new OPimTodoAccessBackendSQL( filename ); - break; + return (T*) new OPimTodoAccessBackendSQL( filename ); + break; #else - qWarning ("OBackendFactory:: sql Backend for TODO not implemented! Using XML instead!"); - // Fall through !! + owarn << "OBackendFactory:: sql Backend for TODO not implemented! Using XML instead!" << oendl; + // Fall through !! #endif - case OPimGlobal::XML: - return (T*) new OPimTodoAccessXML( appName, filename ); - break; - case OPimGlobal::VCARD: - return (T*) new OPimTodoAccessVCal( filename ); - break; - } - case OPimGlobal::CONTACTLIST: - switch ( use_database ){ - default: // Use SQL if something weird is given. - // Fall through !! - case OPimGlobal::SQL: + case OPimGlobal::XML: + return (T*) new OPimTodoAccessXML( appName, filename ); + break; + case OPimGlobal::VCARD: + return (T*) new OPimTodoAccessVCal( filename ); + break; + } + case OPimGlobal::CONTACTLIST: + switch ( use_database ){ + default: // Use SQL if something weird is given. + // Fall through !! + case OPimGlobal::SQL: #ifdef __USE_SQL - return (T*) new OPimContactAccessBackend_SQL( appName, filename ); - break; + return (T*) new OPimContactAccessBackend_SQL( appName, filename ); + break; #else - qWarning ("OBackendFactory:: sql Backend for CONTACT not implemented! Using XML instead!"); - // Fall through !! + owarn << "OBackendFactory:: sql Backend for CONTACT not implemented! Using XML instead!" << oendl; + // Fall through !! #endif - case OPimGlobal::XML: - return (T*) new OPimContactAccessBackend_XML( appName, filename ); - break; - case OPimGlobal::VCARD: - return (T*) new OPimContactAccessBackend_VCard( appName, filename ); - break; - } - case OPimGlobal::DATEBOOK: - switch ( use_database ){ - default: // Use SQL if something weird is given. - // Fall through !! - case OPimGlobal::SQL: + case OPimGlobal::XML: + return (T*) new OPimContactAccessBackend_XML( appName, filename ); + break; + case OPimGlobal::VCARD: + return (T*) new OPimContactAccessBackend_VCard( appName, filename ); + break; + } + case OPimGlobal::DATEBOOK: + switch ( use_database ){ + default: // Use SQL if something weird is given. + // Fall through !! + case OPimGlobal::SQL: #ifdef __USE_SQL - return (T*) new ODateBookAccessBackend_SQL( appName, filename ); - break; + return (T*) new ODateBookAccessBackend_SQL( appName, filename ); + break; #else - qWarning("OBackendFactory:: sql Backend for DATEBOOK not implemented! Using XML instead!"); - // Fall through !! + owarn << "OBackendFactory:: sql Backend for DATEBOOK not implemented! Using XML instead!" << oendl; + // Fall through !! #endif - case OPimGlobal::XML: - return (T*) new ODateBookAccessBackend_XML( appName, filename ); - break; - case OPimGlobal::VCARD: - qWarning("OBackendFactory:: VCal Backend for DATEBOOK not implemented!"); - return (T*) NULL; - break; - } - default: - return (T*) NULL; - } - - } - - /** - * Returns the style of the default database which is used to contact PIM data. + case OPimGlobal::XML: + return (T*) new ODateBookAccessBackend_XML( appName, filename ); + break; + case OPimGlobal::VCARD: + owarn << "OBackendFactory:: VCal Backend for DATEBOOK not implemented!" << oendl; + return (T*) NULL; + break; + } + default: + return (T*) NULL; + } + + } + + /** + * Returns the style of the default database which is used to contact PIM data. * @param type the type of the backend - * @see OPimGlobal() - */ - static OPimGlobal::DatabaseStyle defaultDB( OPimGlobal::PimType type ){ - QString group_name; - switch ( type ){ - case OPimGlobal::TODOLIST: - group_name = "todo"; - break; - case OPimGlobal::CONTACTLIST: - group_name = "contact"; - break; - case OPimGlobal::DATEBOOK: - group_name = "datebook"; - break; - default: - group_name = "unknown"; - } - - Config config( "pimaccess" ); - config.setGroup ( group_name ); - QString db_String = config.readEntry( "usebackend", "xml" ); - - QAsciiDict dictDbTypes( OPimGlobal::_END_DatabaseStyle ); - dictDbTypes.setAutoDelete( TRUE ); - - dictDbTypes.insert( "xml", new int (OPimGlobal::XML) ); - dictDbTypes.insert( "sql", new int (OPimGlobal::SQL) ); - dictDbTypes.insert( "vcard", new int (OPimGlobal::VCARD) ); - - int* db_find = dictDbTypes[ db_String ]; - - if ( !db_find ) - return OPimGlobal::UNKNOWN; - - return (OPimGlobal::DatabaseStyle) *db_find; - } + * @see OPimGlobal() + */ + static OPimGlobal::DatabaseStyle defaultDB( OPimGlobal::PimType type ){ + QString group_name; + switch ( type ){ + case OPimGlobal::TODOLIST: + group_name = "todo"; + break; + case OPimGlobal::CONTACTLIST: + group_name = "contact"; + break; + case OPimGlobal::DATEBOOK: + group_name = "datebook"; + break; + default: + group_name = "unknown"; + } + + Config config( "pimaccess" ); + config.setGroup ( group_name ); + QString db_String = config.readEntry( "usebackend", "xml" ); + + QAsciiDict dictDbTypes( OPimGlobal::_END_DatabaseStyle ); + dictDbTypes.setAutoDelete( TRUE ); + + dictDbTypes.insert( "xml", new int (OPimGlobal::XML) ); + dictDbTypes.insert( "sql", new int (OPimGlobal::SQL) ); + dictDbTypes.insert( "vcard", new int (OPimGlobal::VCARD) ); + + int* db_find = dictDbTypes[ db_String ]; + + if ( !db_find ) + return OPimGlobal::UNKNOWN; + + return (OPimGlobal::DatabaseStyle) *db_find; + } /** * Returns the default backend implementation for backendName. Which one is used, is defined - * by the configfile "pimaccess.conf". + * by the configfile "pimaccess.conf". * @param type The type of the backend (@see OPimGlobal()) * @param appName The name of your application. It will be passed on to the backend - * @see OPimGlobal() + * @see OPimGlobal() */ - static T* defaultBackend( OPimGlobal::PimType type, const QString& appName ){ - return create( type, OPimGlobal::DEFAULT, appName ); - } + static T* defaultBackend( OPimGlobal::PimType type, const QString& appName ){ + return create( type, OPimGlobal::DEFAULT, appName ); + } private: - OBackendPrivate* d; + OBackendPrivate* d; }; diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp index 5ffcb11..00d62ee 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp @@ -137,8 +137,8 @@ bool OPimContactAccessBackend_XML::save() // move the file over, I'm just going to use the system call // because, I don't feel like using QDir. if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { - qWarning( "problem renaming file %s to %s, errno: %d", - strNewFile.latin1(), m_journalName.latin1(), errno ); + owarn << "problem renaming file " << strNewFile << " to " << m_journalName + << ", errno: " << errno << oendl; // remove the tmp file... QFile::remove( strNewFile ); } @@ -278,15 +278,13 @@ QArray OPimContactAccessBackend_XML::queryByExample ( const OPimContact &qu // Check whether the birthday/anniversary date is between // the current/given date and the maximum date // ( maximum time range ) ! - qWarning("Checking if %s is between %s and %s ! ", - checkDate->toString().latin1(), - current.toString().latin1(), - queryDate->toString().latin1() ); + owarn << "Checking if " << checkDate->toString() << " is between " << current.toString() + << " and " << queryDate->toString() << " ! " << oendl; if ( current.daysTo( *queryDate ) >= 0 ){ if ( !( ( *checkDate >= current ) && ( *checkDate <= *queryDate ) ) ){ allcorrect = false; - qWarning (" Nope!.."); + owarn << " Nope!.." << oendl; } } } @@ -607,8 +605,8 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal /* Search Tag "Contacts" which is the parent of all Contacts */ while( element && !isJournal ){ if( element->tagName() != QString::fromLatin1("Contacts") ){ - //qWarning ("OPimContactDefBack::Searching for Tag \"Contacts\"! Found: %s", - // element->tagName().latin1()); + //owarn << "OPimContactDefBack::Searching for Tag \"Contacts\"! Found: " + // << element->tagName() << oendl; element = element->nextChild(); } else { element = element->firstChild(); @@ -618,16 +616,16 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal /* Parse all Contacts and ignore unknown tags */ while( element ){ if( element->tagName() != QString::fromLatin1("Contact") ){ - //qWarning ("OPimContactDefBack::Searching for Tag \"Contact\"! Found: %s", - // element->tagName().latin1()); + //owarn << "OPimContactDefBack::Searching for Tag \"Contact\"! Found: " + // << element->tagName() << oendl; element = element->nextChild(); continue; } /* Found alement with tagname "contact", now parse and store all * attributes contained */ - //qWarning("OPimContactDefBack::load element tagName() : %s", - // element->tagName().latin1() ); + //owarn << "OPimContactDefBack::load element tagName() : " + // << element->tagName() << oendl; QString dummy; foundAction = false; @@ -636,7 +634,7 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal contactMap.clear(); customMap.clear(); for( it = aMap.begin(); it != aMap.end(); ++it ){ - // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); + // owarn << "Read Attribute: " << it.key() << "=" << it.data() << oendl; int *find = dict[ it.key() ]; /* Unknown attributes will be stored as "Custom" elements */ @@ -662,7 +660,7 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal case JOURNALACTION: action = journal_action(it.data().toInt()); foundAction = true; - qWarning ("ODefBack(journal)::ACTION found: %d", action); + owarn << "ODefBack(journal)::ACTION found: " << action << oendl; break; case JOURNALROW: journalKey = it.data().toInt(); @@ -687,16 +685,14 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal break; case ACTION_REMOVE: if ( !remove (contact.uid()) ) - qWarning ("ODefBack(journal)::Unable to remove uid: %d", - contact.uid() ); + owarn << "ODefBack(journal)::Unable to remove uid: " << contact.uid() << oendl; break; case ACTION_REPLACE: if ( !replace ( contact ) ) - qWarning ("ODefBack(journal)::Unable to replace uid: %d", - contact.uid() ); + owarn << "ODefBack(journal)::Unable to replace uid: " << contact.uid() << oendl; break; default: - qWarning ("Unknown action: ignored !"); + owarn << "Unknown action: ignored !" << oendl; break; } }else{ diff --git a/libopie2/opiepim/core/ocontactaccess.cpp b/libopie2/opiepim/core/ocontactaccess.cpp index a372267..7a3d7cb 100644 --- a/libopie2/opiepim/core/ocontactaccess.cpp +++ b/libopie2/opiepim/core/ocontactaccess.cpp @@ -36,6 +36,16 @@ #include "ocontactaccess.h" #include "obackendfactory.h" +/* OPIE */ +#include +#include +#include +#include + +//#include +#include + +/* QT */ #include #include #include @@ -43,117 +53,112 @@ #include #include -//#include -#include - +/* STD */ #include #include #include #include -#include -#include -#include namespace Opie { OPimContactAccess::OPimContactAccess ( const QString appname, const QString , - OPimContactAccessBackend* end, bool autosync ): - OPimAccessTemplate( end ) + OPimContactAccessBackend* end, bool autosync ): + OPimAccessTemplate( end ) { /* take care of the backend. If there is no one defined, we - * will use the XML-Backend as default (until we have a cute SQL-Backend..). - */ + * will use the XML-Backend as default (until we have a cute SQL-Backend..). + */ if( end == 0 ) { - qWarning ("Using BackendFactory !"); - end = OBackendFactory::defaultBackend( OPimGlobal::CONTACTLIST, appname ); + owarn << "Using BackendFactory !" << oendl; + end = OBackendFactory::defaultBackend( OPimGlobal::CONTACTLIST, appname ); } - // Set backend locally and in template + // Set backend locally and in template m_backEnd = end; - OPimAccessTemplate::setBackEnd (end); + OPimAccessTemplate::setBackEnd (end); - /* Connect signal of external db change to function */ - QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this ); - connect( dbchannel, SIGNAL(received(const QCString&,const QByteArray&)), + /* Connect signal of external db change to function */ + QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this ); + connect( dbchannel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(copMessage(const QCString&,const QByteArray&)) ); - if ( autosync ){ - QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this ); - connect( syncchannel, SIGNAL(received(const QCString&,const QByteArray&)), - this, SLOT(copMessage(const QCString&,const QByteArray&)) ); - } + if ( autosync ){ + QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this ); + connect( syncchannel, SIGNAL(received(const QCString&,const QByteArray&)), + this, SLOT(copMessage(const QCString&,const QByteArray&)) ); + } } OPimContactAccess::~OPimContactAccess () { - /* The user may forget to save the changed database, therefore try to - * do it for him.. - */ - save(); - // delete m_backEnd; is done by template.. + /* The user may forget to save the changed database, therefore try to + * do it for him.. + */ + save(); + // delete m_backEnd; is done by template.. } bool OPimContactAccess::save () { - /* If the database was changed externally, we could not save the - * Data. This will remove added items which is unacceptable ! - * Therefore: Reload database and merge the data... - */ - if ( OPimAccessTemplate::wasChangedExternally() ) - reload(); + /* If the database was changed externally, we could not save the + * Data. This will remove added items which is unacceptable ! + * Therefore: Reload database and merge the data... + */ + if ( OPimAccessTemplate::wasChangedExternally() ) + reload(); - bool status = OPimAccessTemplate::save(); - if ( !status ) return false; + bool status = OPimAccessTemplate::save(); + if ( !status ) return false; - /* Now tell everyone that new data is available. - */ - QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" ); + /* Now tell everyone that new data is available. + */ + QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" ); - return true; + return true; } const uint OPimContactAccess::querySettings() { - return ( m_backEnd->querySettings() ); + return ( m_backEnd->querySettings() ); } bool OPimContactAccess::hasQuerySettings ( int querySettings ) const { - return ( m_backEnd->hasQuerySettings ( querySettings ) ); + return ( m_backEnd->hasQuerySettings ( querySettings ) ); } OPimRecordList OPimContactAccess::sorted( bool ascending, int sortOrder, int sortFilter, int cat ) const { - QArray matchingContacts = m_backEnd -> sorted( ascending, sortOrder, sortFilter, cat ); - return ( OPimRecordList(matchingContacts, this) ); + QArray matchingContacts = m_backEnd -> sorted( ascending, sortOrder, sortFilter, cat ); + return ( OPimRecordList(matchingContacts, this) ); } bool OPimContactAccess::wasChangedExternally()const { - return ( m_backEnd->wasChangedExternally() ); + return ( m_backEnd->wasChangedExternally() ); } void OPimContactAccess::copMessage( const QCString &msg, const QByteArray & ) { - if ( msg == "addressbookUpdated()" ){ - qWarning ("OPimContactAccess: Received addressbokUpdated()"); - emit signalChanged ( this ); - } else if ( msg == "flush()" ) { - qWarning ("OPimContactAccess: Received flush()"); - save (); - } else if ( msg == "reload()" ) { - qWarning ("OPimContactAccess: Received reload()"); - reload (); - emit signalChanged ( this ); - } + if ( msg == "addressbookUpdated()" ){ + owarn << "OPimContactAccess: Received addressbokUpdated()" << oendl; + emit signalChanged ( this ); + } else if ( msg == "flush()" ) { + owarn << "OPimContactAccess: Received flush()" << oendl; + save (); + } else if ( msg == "reload()" ) { + owarn << "OPimContactAccess: Received reload()" << oendl; + reload (); + emit signalChanged ( this ); + } } int OPimContactAccess::rtti() const { - return OPimResolver::AddressBook; + return OPimResolver::AddressBook; } } diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index e438980..55d600a 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h @@ -1,7 +1,7 @@ /* This file is part of the Opie Project Copyright (C) Holger Freyther - Copyright (C) Stefan Eilers + Copyright (C) Stefan Eilers =. Copyright (C) The Opie Team .=l. .>+-= @@ -30,14 +30,17 @@ #ifndef OPIE_PIM_ACCESS_TEMPLATE_H #define OPIE_PIM_ACCESS_TEMPLATE_H -#include - +/* OPIE */ #include #include #include #include #include +#include + +/* QT */ +#include namespace Opie { @@ -205,7 +208,7 @@ OPimAccessTemplate::OPimAccessTemplate( BackEnd* end ) } template OPimAccessTemplate::~OPimAccessTemplate() { - qWarning("~OPimAccessTemplate"); + owarn << "~OPimAccessTemplate" << oendl; delete m_backEnd; } template @@ -215,8 +218,8 @@ bool OPimAccessTemplate::load() { } template bool OPimAccessTemplate::reload() { - invalidateCache(); // zecke: I think this should be added (se) - return m_backEnd->reload(); + invalidateCache(); // zecke: I think this should be added (se) + return m_backEnd->reload(); } template bool OPimAccessTemplate::save() { @@ -260,7 +263,7 @@ T OPimAccessTemplate::find( int uid, const QArray& ar, * after a find this way we would * avoid two finds in QCache... */ - // qWarning("find it now %d", uid ); + // owarn << "find it now " << uid << oendl; if (m_cache.contains( uid ) ) { return m_cache.find( uid ); } diff --git a/libopie2/opiepim/core/opimcontact.cpp b/libopie2/opiepim/core/opimcontact.cpp index 48a74d0..36e9a93 100644 --- a/libopie2/opiepim/core/opimcontact.cpp +++ b/libopie2/opiepim/core/opimcontact.cpp @@ -1173,7 +1173,7 @@ void OPimContact::setAnniversary( const QDate &v ) QDate OPimContact::birthday() const { QString str = find( Qtopia::Birthday ); - // qWarning ("Birthday %s", str.latin1() ); + // owarn << "Birthday " << str << oendl; if ( !str.isEmpty() ) return OPimDateConversion::dateFromString ( str ); else @@ -1188,7 +1188,7 @@ QDate OPimContact::anniversary() const { QDate empty; QString str = find( Qtopia::Anniversary ); - // qWarning ("Anniversary %s", str.latin1() ); + // owarn << "Anniversary " << str << oendl; if ( !str.isEmpty() ) return OPimDateConversion::dateFromString ( str ); else diff --git a/libopie2/opiepim/core/opimnotifymanager.cpp b/libopie2/opiepim/core/opimnotifymanager.cpp index 0f863aa..516dc79 100644 --- a/libopie2/opiepim/core/opimnotifymanager.cpp +++ b/libopie2/opiepim/core/opimnotifymanager.cpp @@ -227,8 +227,8 @@ void OPimNotifyManager::alarmsFromString( const QString& str ) { QStringList alarm = QStringList::split( ":", ( *it ), TRUE ); // allow empty owarn << "alarm: " << alarm.join( "___" ) << "" << oendl; - qWarning( "alarm[0]: %s %s", alarm[ 0 ].latin1(), - OPimDateConversion::dateTimeFromString( alarm[ 0 ] ).toString().latin1() ); + owarn << "alarm[0]: " << alarm[ 0 ] << " " + << OPimDateConversion::dateTimeFromString( alarm[ 0 ] ).toString() << oendl; OPimAlarm al( alarm[ 2 ].toInt(), OPimDateConversion::dateTimeFromString( alarm[ 0 ] ), alarm[ 1 ].toInt() ); add( al ); diff --git a/libopie2/opiepim/core/opimrecordlist.h b/libopie2/opiepim/core/opimrecordlist.h index b23138d..1d5027f 100644 --- a/libopie2/opiepim/core/opimrecordlist.h +++ b/libopie2/opiepim/core/opimrecordlist.h @@ -33,6 +33,7 @@ /* OPIE */ #include #include +//#include /* QT */ #include @@ -189,7 +190,7 @@ OPimRecordListIterator::~OPimRecordListIterator() template OPimRecordListIterator::OPimRecordListIterator( const OPimRecordListIterator& it ) { - // qWarning("OPimRecordListIterator copy c'tor"); + //owarn << "OPimRecordListIterator copy c'tor" << oendl; m_uids = it.m_uids; m_current = it.m_current; m_temp = it.m_temp; @@ -215,7 +216,7 @@ OPimRecordListIterator &OPimRecordListIterator::operator=( const OPimRecor template T OPimRecordListIterator::operator*() { - //qWarning("operator* %d %d", m_current, m_uids[m_current] ); + //owarn << "operator* " << m_current << " " << m_uids[m_current] << oendl; if ( !m_end ) m_record = m_temp->find( m_uids[ m_current ], m_uids, m_current, m_direction ? Base::Forward : -- cgit v0.9.0.2