From b915a21821423232052e2e48ea14f288b3098c32 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 5 Sep 2012 00:02:31 +0000 Subject: Wed Sep 5 00:02:30 UTC 2012 --- testing/libreoffice/PKGBUILD | 17 +- testing/libreoffice/git_fixes.diff | 743 +++++++++++++++++++++++++++++ testing/libreoffice/libreoffice-common.csh | 7 + testing/libreoffice/libreoffice-common.sh | 7 + 4 files changed, 767 insertions(+), 7 deletions(-) create mode 100644 testing/libreoffice/git_fixes.diff (limited to 'testing/libreoffice') diff --git a/testing/libreoffice/PKGBUILD b/testing/libreoffice/PKGBUILD index 9a7e814e3..2b30c747e 100644 --- a/testing/libreoffice/PKGBUILD +++ b/testing/libreoffice/PKGBUILD @@ -1,4 +1,4 @@ -# $Id: PKGBUILD 165881 2012-09-02 17:17:47Z andyrtr $ +# $Id: PKGBUILD 165918 2012-09-03 20:33:25Z andyrtr $ # Maintainer: AndyRTR pkgbase="libreoffice" @@ -26,7 +26,7 @@ pkgname=('libreoffice-common' 'libreoffice-extension-nlpsolver') # svn up -r 142692 (last one with all extensions built _LOver=3.6.1.2 pkgver=3.6.1 -pkgrel=3 +pkgrel=4 arch=('i686' 'x86_64') license=('LGPL3') url="http://www.libreoffice.org/" @@ -82,6 +82,7 @@ source=(${_mirror}/${pkgbase}-{core,help,translations}-${_LOver}.tar.xz ${_additional_source_url}/ce5a1def34578b75959ac31210f031f6-libcdr-0.0.8.tar.bz2 ${_additional_source_url2}/185d60944ea767075d27247c3162b3bc-unowinreg.dll buildfix.diff + git_fixes.diff libreoffice-common.sh libreoffice-common.csh) noextract=(94e7f271e38c976462558b4278590178-libvisio-0.0.19.tar.bz2 18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz @@ -147,8 +148,9 @@ md5sums=('3ddcf145b74daa4361e48dafe97e7d21' 'ce5a1def34578b75959ac31210f031f6' '185d60944ea767075d27247c3162b3bc' '234e91ac65945ce1ab1e3839780e90f7' - 'f0e72d0e1bc93a50a3aa9d31350b156c' - '867c682b45f477f916786e00c45d7ab7') + '2445aca137bdbf0cf7526e91f768a1d0' + 'abcb1b0a7deaffe13ab3d7ca70becb49' + '72790a4103da259a55cadd66db931d00') build() { @@ -170,6 +172,7 @@ build() { # buildfixes & bugfixes patch -Np1 -i ${srcdir}/buildfix.diff + patch -Np1 -i ${srcdir}/git_fixes.diff #use the CFLAGS but remove the LibO overridden ones for i in $CFLAGS; do @@ -383,12 +386,12 @@ package_libreoffice-postgresql-connector() { # for directory in `grep ^%dir ${srcdir}/libreoffice-core-$_LOver/file-lists/postgresql_list.txt`; do # install -dm755 ${pkgdir}/${directory/\%dir/} # done -# # install files into the pkg from fakeinstall dir + # install files into the pkg from fakeinstall dir # for file in `grep -v ^%dir $srcdir/libreoffice-core-$_LOver/file-lists/postgresql_list.txt`; do # dirname=`dirname $file` -# # check if directory has been already been created - some are missing like manpages + # check if directory has been already been created - some are missing like manpages # [ -d ${pkgdir}/$dirname ] || install -dm755 ${pkgdir}/$dirname -# # mv file from fakeinstall to pkgdir + # mv file from fakeinstall to pkgdir # mv ${srcdir}/fakeinstall${file} ${pkgdir}$file # done } diff --git a/testing/libreoffice/git_fixes.diff b/testing/libreoffice/git_fixes.diff new file mode 100644 index 000000000..a4cd891cb --- /dev/null +++ b/testing/libreoffice/git_fixes.diff @@ -0,0 +1,743 @@ +From 427529801dee122250e44d2311b34651db92bbdb Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 21 Aug 2012 16:55:11 +0000 +Subject: Typo + +Change-Id: I41fd1463b6432818ee36e7f90e920a5fd98c7106 +(cherry picked from commit 1316cfe8a72f7c7bc2f5ad7644a2d4c54b77fc8b) + +Signed-off-by: Eike Rathke +--- +diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx +index d929787..55ebaca 100644 +--- a/desktop/source/app/app.cxx ++++ b/desktop/source/app/app.cxx +@@ -194,7 +194,7 @@ void removeTree(OUString const & url) { + osl::FileBase::RC rc = osl::Directory::remove(url); + SAL_WARN_IF( + rc != osl::FileBase::E_None, "desktop", +- "cannot remove directory " << url << ": " +rc); ++ "cannot remove directory " << url << ": " << +rc); + // at least on Windows XP removing some existing directories fails with + // osl::FileBase::E_ACCESS because they are read-only; but keeping those + // directories around should be harmless once they are empty +-- +cgit v0.9.0.2-2-gbebe +From b4f8acb41165a28b2db47acd3c6b624a4c507c54 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Fri, 24 Aug 2012 14:06:15 +0000 +Subject: Fix removeRdbFiles (caused extension update to fail) + +removeRdbFiles suffered from a confusion that ImplementationInfo.uri denotes the +corresponding component (.so, .jar, etc.), but not the .rdb file. So removing +an .rdb file silently failed to remove the corresponding implementations, so re- +installing a similar enough .rdb (as typically happens during extension update) +would fail due to duplicate implementation names. + +Change-Id: I25d4ff72656c99a3af509eef09e89c18cfd0aabe +Reviewed-on: https://gerrit.libreoffice.org/476 +Reviewed-by: Norbert Thiebaud +Tested-by: Norbert Thiebaud +--- +diff --git a/cppuhelper/source/defaultbootstrap.cxx b/cppuhelper/source/defaultbootstrap.cxx +index c3bdba3..7fd1e4a 100644 +--- a/cppuhelper/source/defaultbootstrap.cxx ++++ b/cppuhelper/source/defaultbootstrap.cxx +@@ -130,9 +130,10 @@ struct ImplementationInfo: private boost::noncopyable { + rtl::OUString const & theName, rtl::OUString const & theLoader, + rtl::OUString const & theUri, rtl::OUString const & thePrefix, + css::uno::Reference< css::uno::XComponentContext > const & +- theAlienContext): ++ theAlienContext, ++ rtl::OUString const & theRdbFile): + name(theName), loader(theLoader), uri(theUri), prefix(thePrefix), +- alienContext(theAlienContext) ++ alienContext(theAlienContext), rdbFile(theRdbFile) + {} + + explicit ImplementationInfo(rtl::OUString const & theName): name(theName) {} +@@ -142,6 +143,7 @@ struct ImplementationInfo: private boost::noncopyable { + rtl::OUString const uri; + rtl::OUString const prefix; + css::uno::Reference< css::uno::XComponentContext > const alienContext; ++ rtl::OUString const rdbFile; + std::vector< rtl::OUString > services; + std::vector< rtl::OUString > singletons; + }; +@@ -149,12 +151,12 @@ struct ImplementationInfo: private boost::noncopyable { + struct Implementation: private boost::noncopyable { + Implementation( + rtl::OUString const & name, rtl::OUString const & loader, +- rtl::OUString const & uri, +- rtl::OUString const & prefix = rtl::OUString(), +- css::uno::Reference< css::uno::XComponentContext > const & +- alienContext +- = css::uno::Reference< css::uno::XComponentContext >()): +- info(new ImplementationInfo(name, loader, uri, prefix, alienContext)), ++ rtl::OUString const & uri, rtl::OUString const & prefix, ++ css::uno::Reference< css::uno::XComponentContext > const & alienContext, ++ rtl::OUString const & rdbFile): ++ info( ++ new ImplementationInfo( ++ name, loader, uri, prefix, alienContext, rdbFile)), + loaded(false) + {} + +@@ -466,7 +468,7 @@ void Parser::handleImplementation() { + implementation_.reset( + new Implementation( + attrImplementation_, attrLoader_, attrUri_, attrPrefix_, +- alienContext_)); ++ alienContext_, reader_.getUrl())); + if (!data_->namedImplementations.insert( + NamedImplementations::value_type( + attrImplementation_, implementation_)). +@@ -1502,7 +1504,9 @@ bool ServiceManager::readLegacyRdbFile(rtl::OUString const & uri) { + boost::shared_ptr< Implementation > impl( + new Implementation( + name, readLegacyRdbString(uri, implKey, "UNO/ACTIVATOR"), +- readLegacyRdbString(uri, implKey, "UNO/LOCATION"))); ++ readLegacyRdbString(uri, implKey, "UNO/LOCATION"), ++ rtl::OUString(), ++ css::uno::Reference< css::uno::XComponentContext >(), uri)); + if (!data_.namedImplementations.insert( + NamedImplementations::value_type(name, impl)). + second) +@@ -1744,7 +1748,7 @@ void ServiceManager::removeRdbFiles(std::vector< rtl::OUString > const & uris) { + j != data_.namedImplementations.end();) + { + assert(j->second.get() != 0); +- if (j->second->info->uri == *i) { ++ if (j->second->info->rdbFile == *i) { + clear.push_back(j->second); + //TODO: The below leaves data_ in an inconsistent state upon + // exceptions: +-- +cgit v0.9.0.2-2-gbebe +From 6d261e7aac12a876acb6496085e5329632595d39 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Fri, 24 Aug 2012 14:45:20 +0000 +Subject: fdo#53968 etc.: Fix more "doesn't start after upgrade" problems + +* fdo#53968 revealed that multiple soffice.bin instances can run removeTree in + parallel. Therefore, demoted failures from exceptions to SAL_WARNs. (And + keeping fingers crossed.) + +* a8cdce148c76c93c5d41820610d6e6ac175e03a7 "fdo#53655: Ignore failure to remove + directories (as happens on Windows XP)" was due to a forgotten + osl::Directory::close before calling osl::Directory::remove after all. + +* UserInstallations have been seen in the wild where no extensions were + installed per-user (any longer), but user/uno_packages/cache/registry/ + com.sun.star.comp.deployment.component.PackageRegistryBackend/*.rdb files + contained data nevertheless. To reliably clean out any old junk, + refreshBundledExtensionsDir has been extended to cleanExtensionsCache which in + tandem with an extended Desktop::SynchronizeExtensionRepositories now cleanly + re-installs all bundled, shared, and per-user extensions after a LO upgrade. + +Change-Id: Ic6b5b6c1945d76eb3a65b6cd4512a657b7a835a0 +Reviewed-on: https://gerrit.libreoffice.org/477 +Reviewed-by: Norbert Thiebaud +Tested-by: Norbert Thiebaud +--- +diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx +index 25b6352..c830b02 100644 +--- a/desktop/inc/app.hxx ++++ b/desktop/inc/app.hxx +@@ -203,6 +203,7 @@ class Desktop : public Application + + sal_Bool m_bMinimized; + sal_Bool m_bInvisible; ++ bool m_bCleanedExtensionCache; + bool m_bServicesRegistered; + sal_uInt16 m_nAppEvents; + BootstrapError m_aBootstrapError; +diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx +index 55ebaca..5fb653b 100644 +--- a/desktop/source/app/app.cxx ++++ b/desktop/source/app/app.cxx +@@ -147,77 +147,81 @@ namespace { + + void removeTree(OUString const & url) { + osl::Directory dir(url); +- switch (dir.open()) { ++ osl::FileBase::RC rc = dir.open(); ++ switch (rc) { + case osl::FileBase::E_None: + break; + case osl::FileBase::E_NOENT: + return; //TODO: SAL_WARN if recursive + default: +- throw css::uno::RuntimeException( +- "cannot open directory " + url, +- css::uno::Reference< css::uno::XInterface >()); ++ SAL_WARN("desktop", "cannot open directory " << url << ": " << +rc); ++ return; + } + for (;;) { + osl::DirectoryItem i; +- osl::FileBase::RC rc = dir.getNextItem(i, SAL_MAX_UINT32); ++ rc = dir.getNextItem(i, SAL_MAX_UINT32); + if (rc == osl::FileBase::E_NOENT) { + break; + } + if (rc != osl::FileBase::E_None) { +- throw css::uno::RuntimeException( +- ("cannot iterate directory " + url + ": " +- + OUString::valueOf(static_cast< sal_Int32 >(rc))), +- css::uno::Reference< css::uno::XInterface >()); ++ SAL_WARN( ++ "desktop","cannot iterate directory " << url << ": " << +rc); ++ break; + } + osl::FileStatus stat( + osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName | + osl_FileStatus_Mask_FileURL); + rc = i.getFileStatus(stat); + if (rc != osl::FileBase::E_None) { +- throw css::uno::RuntimeException( +- ("cannot stat in directory " + url + ": " +- + OUString::valueOf(static_cast< sal_Int32 >(rc))), +- css::uno::Reference< css::uno::XInterface >()); ++ SAL_WARN( ++ "desktop", "cannot stat in directory " << url << ": " << +rc); ++ continue; + } + if (stat.getFileType() == osl::FileStatus::Directory) { //TODO: symlinks + removeTree(stat.getFileURL()); + } else { + rc = osl::File::remove(stat.getFileURL()); +- if (rc != osl::FileBase::E_None) { +- throw css::uno::RuntimeException( +- ("cannot remove file " + stat.getFileURL() + ": " +- + OUString::valueOf(static_cast< sal_Int32 >(rc))), +- css::uno::Reference< css::uno::XInterface >()); +- } ++ SAL_WARN_IF( ++ rc != osl::FileBase::E_None, "desktop", ++ "cannot remove file " << stat.getFileURL() << ": " << +rc); + } + } +- osl::FileBase::RC rc = osl::Directory::remove(url); ++ if (dir.isOpen()) { ++ rc = dir.close(); ++ SAL_WARN_IF( ++ rc != osl::FileBase::E_None, "desktop", ++ "cannot close directory " << url << ": " << +rc); ++ } ++ rc = osl::Directory::remove(url); + SAL_WARN_IF( + rc != osl::FileBase::E_None, "desktop", + "cannot remove directory " << url << ": " << +rc); +- // at least on Windows XP removing some existing directories fails with +- // osl::FileBase::E_ACCESS because they are read-only; but keeping those +- // directories around should be harmless once they are empty + } + +-// Remove any existing UserInstallation's user/extensions/bundled cache +-// remaining from old installations. Apparently due to the old +-// share/prereg/bundled mechanism (disabled since +-// 5c47e5f63a79a9e72ec4a100786b1bbf65137ed4 "fdo#51252 Disable copying +-// share/prereg/bundled to avoid startup crashes"), that cache could contain +-// corrupted information (like a UNO component registered twice, which got +-// changed from active to passive registration in one LO version, but the +-// version of the corresponding bundled extension only incremented in a later LO +-// version). At least in theory, this function could be removed again once no +-// UserInstallation can be poisoned by that old share/prereg/bundled mechanism +-// any more. (But then Desktop::SynchronizeExtensionRepositories might need to +-// be revisited, see 2d2b19dea1ab401b1b4971ff5b12b87bb11fd666 "Force +-// ExtensionManager resync when the implementation changes" which effectively +-// got reverted again now. Now, a mismatch between a UserInstallation's +-// user/extensions/bundled and an installation's share/extensions will always be +-// detected here and lead to a removal of user/extensions/bundled, so that +-// Desktop::SynchronizeExtensionRepositories will then definitely resync +-// share/extensions.) ++// Remove any existing UserInstallation's extensions cache data remaining from ++// old installations. This addresses at least two problems: ++// ++// For one, apparently due to the old share/prereg/bundled mechanism (disabled ++// since 5c47e5f63a79a9e72ec4a100786b1bbf65137ed4 "fdo#51252 Disable copying ++// share/prereg/bundled to avoid startup crashes"), the user/extensions/bundled ++// cache could contain corrupted information (like a UNO component registered ++// twice, which got changed from active to passive registration in one LO ++// version, but the version of the corresponding bundled extension only ++// incremented in a later LO version). ++// ++// For another, UserInstallations have been seen in the wild where no extensions ++// were installed per-user (any longer), but user/uno_packages/cache/registry/ ++// com.sun.star.comp.deployment.component.PackageRegistryBackend/*.rdb files ++// contained data nevertheless. ++// ++// When a LO upgrade is detected (i.e., no/ user/extensions/bundled/buildid or ++// one containing an old build ID), then user/extensions/bundled, ++// user/extensions/shared, and user/uno_packages/cache/registry/ ++// com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc are ++// removed. That should prevent any problems starting the service manager due ++// to old junk. Later on in Desktop::SynchronizeExtensionRepositories, the ++// removed cache data is recreated. ++// + // As a special case, if you create a UserInstallation with LO >= 3.6.1, then + // run an old LO <= 3.5.x using share/prereg/bundled on the same + // UserInstallation (so that it partially overwrites user/extensions/bundled, +@@ -230,33 +234,50 @@ void removeTree(OUString const & url) { + // <= 3.5.x messed with user/extensions/bundled in the meantime, then it would + // have rewritten the unorc (dropping the token), and LO >= 3.6.1 can detect + // that. +-void refreshBundledExtensionsDir() { ++// ++// Multiple instances of soffice.bin can execute this code in parallel for a ++// single UserInstallation, as it is called before OfficeIPCThread is set up. ++// Therefore, any errors here only lead to SAL_WARNs. ++// ++// At least in theory, this function could be removed again once no ++// UserInstallation can be poisoned by old junk any more. ++bool cleanExtensionCache() { + OUString buildId( + "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("version") ":buildid}"); + rtl::Bootstrap::expandMacros(buildId); //TODO: detect failure +- OUString dir("$BUNDLED_EXTENSIONS_USER"); +- rtl::Bootstrap::expandMacros(dir); //TODO: detect failure +- OUString url(dir + "/buildid"); +- OUString nonPrereg( +- "${$BUNDLED_EXTENSIONS_USER/registry/" +- "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc:" +- "LIBO_NON_PREREG_BUNDLED_EXTENSIONS}"); +- rtl::Bootstrap::expandMacros(nonPrereg); +- if (nonPrereg == "TRUE") { +- osl::File f(url); +- switch (f.open(osl_File_OpenFlag_Read)) { ++ OUString extDir( ++ "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ++ ":UserInstallation}/user/extensions"); ++ rtl::Bootstrap::expandMacros(extDir); //TODO: detect failure ++ OUString bundledDir = extDir + "/bundled"; ++ OUString buildIdFile(bundledDir + "/buildid"); ++ OUString bundledRcFile( ++ "$BUNDLED_EXTENSIONS_USER/registry/" ++ "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc"); ++ rtl::Bootstrap::expandMacros(bundledRcFile); //TODO: detect failure ++ rtl::Bootstrap bundledRc(bundledRcFile); ++ OUString nonPrereg; ++ if (bundledRc.getHandle() == 0 ++ || (bundledRc.getFrom("LIBO_NON_PREREG_BUNDLED_EXTENSIONS", nonPrereg) ++ && nonPrereg == "TRUE")) ++ { ++ osl::File f(buildIdFile); ++ osl::FileBase::RC rc = f.open(osl_File_OpenFlag_Read); ++ switch (rc) { + case osl::FileBase::E_None: + { + rtl::ByteSequence s1; +- osl::FileBase::RC rc = f.readLine(s1); +- if (f.close() != osl::FileBase::E_None) { +- SAL_WARN( +- "desktop", "cannot close " + url + " after reading"); +- } ++ rc = f.readLine(s1); ++ osl::FileBase::RC rc2 = f.close(); ++ SAL_WARN_IF( ++ rc2 != osl::FileBase::E_None, "desktop", ++ "cannot close " << buildIdFile << " after reading: " ++ << +rc2); + if (rc != osl::FileBase::E_None) { +- throw css::uno::RuntimeException( +- "cannot read from " + url, +- css::uno::Reference< css::uno::XInterface >()); ++ SAL_WARN( ++ "desktop", ++ "cannot read from " << buildIdFile << ": " << +rc); ++ break; + } + OUString s2( + reinterpret_cast< char const * >(s1.getConstArray()), +@@ -264,53 +285,56 @@ void refreshBundledExtensionsDir() { + // using ISO 8859-1 avoids any and all conversion errors; + // the content should only be a subset of ASCII, anyway + if (s2 == buildId) { +- return; ++ return false; + } + break; + } + case osl::FileBase::E_NOENT: + break; + default: +- throw css::uno::RuntimeException( +- "cannot open " + url + " for reading", +- css::uno::Reference< css::uno::XInterface >()); ++ SAL_WARN( ++ "desktop", ++ "cannot open " << buildIdFile << " for reading: " << +rc); ++ break; + } + } +- removeTree(dir); +- switch (osl::Directory::createPath(dir)) { +- case osl::FileBase::E_None: +- case osl::FileBase::E_EXIST: +- break; +- default: +- throw css::uno::RuntimeException( +- "cannot create path " + dir, +- css::uno::Reference< css::uno::XInterface >()); +- } +- osl::File f(url); +- if (f.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create) != +- osl::FileBase::E_None) +- { +- throw css::uno::RuntimeException( +- "cannot open " + url + " for writing", +- css::uno::Reference< css::uno::XInterface >()); ++ removeTree(extDir); ++ OUString userRcFile( ++ "$UNO_USER_PACKAGES_CACHE/registry/" ++ "com.sun.star.comp.deployment.component.PackageRegistryBackend/unorc"); ++ rtl::Bootstrap::expandMacros(userRcFile); //TODO: detect failure ++ osl::FileBase::RC rc = osl::File::remove(userRcFile); ++ SAL_WARN_IF( ++ rc != osl::FileBase::E_None && rc != osl::FileBase::E_NOENT, "desktop", ++ "cannot remove file " << userRcFile << ": " << +rc); ++ rc = osl::Directory::createPath(bundledDir); ++ SAL_WARN_IF( ++ rc != osl::FileBase::E_None && rc != osl::FileBase::E_EXIST, "desktop", ++ "cannot create path " << bundledDir << ": " << +rc); ++ osl::File f(buildIdFile); ++ rc = f.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create); ++ if (rc != osl::FileBase::E_None) { ++ SAL_WARN( ++ "desktop", ++ "cannot open " << buildIdFile << " for writing: " << +rc); ++ return true; + } + rtl::OString buf(OUStringToOString(buildId, RTL_TEXTENCODING_UTF8)); + // using UTF-8 avoids almost all conversion errors (and buildid + // containing single surrogate halves should never happen, anyway); the + // content should only be a subset of ASCII, anyway +- sal_uInt64 n; +- if (f.write(buf.getStr(), buf.getLength(), n) != osl::FileBase::E_None +- || n != static_cast< sal_uInt32 >(buf.getLength())) +- { +- throw css::uno::RuntimeException( +- "cannot write to " + url, +- css::uno::Reference< css::uno::XInterface >()); +- } +- if (f.close() != osl::FileBase::E_None) { +- throw css::uno::RuntimeException( +- "cannot close " + url + " after writing", +- css::uno::Reference< css::uno::XInterface >()); +- } ++ sal_uInt64 n = 0; ++ rc = f.write(buf.getStr(), buf.getLength(), n); ++ SAL_WARN_IF( ++ (rc != osl::FileBase::E_None ++ || n != static_cast< sal_uInt32 >(buf.getLength())), ++ "desktop", ++ "cannot write to " << buildIdFile << ": " << +rc << ", " << n); ++ rc = f.close(); ++ SAL_WARN_IF( ++ rc != osl::FileBase::E_None, "desktop", ++ "cannot close " << buildIdFile << " after writing: " << +rc); ++ return true; + } + + } +@@ -538,7 +562,8 @@ rtl::OUString ReplaceStringHookProc( const rtl::OUString& rStr ) + } + + Desktop::Desktop() +-: m_bServicesRegistered( false ) ++: m_bCleanedExtensionCache( false ) ++, m_bServicesRegistered( false ) + , m_aBootstrapError( BE_OK ) + { + RTL_LOGFILE_TRACE( "desktop (cd100003) ::Desktop::Desktop" ); +@@ -553,7 +578,7 @@ void Desktop::Init() + RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Init" ); + SetBootstrapStatus(BS_OK); + +- refreshBundledExtensionsDir(); ++ m_bCleanedExtensionCache = cleanExtensionCache(); + + // We need to have service factory before going further, but see fdo#37195. + // Doing this will mmap common.rdb, making it not overwritable on windows, +diff --git a/desktop/source/app/check_ext_deps.cxx b/desktop/source/app/check_ext_deps.cxx +index dd01d9b..a6221a9 100644 +--- a/desktop/source/app/check_ext_deps.cxx ++++ b/desktop/source/app/check_ext_deps.cxx +@@ -51,6 +51,7 @@ + #include "com/sun/star/deployment/ExtensionManager.hpp" + #include "com/sun/star/deployment/LicenseException.hpp" + #include "com/sun/star/deployment/ui/LicenseDialog.hpp" ++#include + #include + #include + #include +@@ -77,12 +78,15 @@ class SilentCommandEnv + task::XInteractionHandler, + ucb::XProgressHandler > + { ++ uno::Reference mxContext; + Desktop *mpDesktop; + sal_Int32 mnLevel; + sal_Int32 mnProgress; + + public: +- SilentCommandEnv( Desktop* pDesktop ); ++ SilentCommandEnv( ++ uno::Reference const & xContext, ++ Desktop* pDesktop ); + virtual ~SilentCommandEnv(); + + // XCommandEnvironment +@@ -105,12 +109,14 @@ public: + }; + + //----------------------------------------------------------------------------- +-SilentCommandEnv::SilentCommandEnv( Desktop* pDesktop ) +-{ +- mpDesktop = pDesktop; +- mnLevel = 0; +- mnProgress = 25; +-} ++SilentCommandEnv::SilentCommandEnv( ++ uno::Reference const & xContext, ++ Desktop* pDesktop ): ++ mxContext( xContext ), ++ mpDesktop( pDesktop ), ++ mnLevel( 0 ), ++ mnProgress( 25 ) ++{} + + //----------------------------------------------------------------------------- + SilentCommandEnv::~SilentCommandEnv() +@@ -144,10 +150,9 @@ void SilentCommandEnv::handle( Reference< task::XInteractionRequest> const & xRe + + if ( request >>= licExc ) + { +- uno::Reference< uno::XComponentContext > xContext = comphelper_getProcessComponentContext(); + uno::Reference< ui::dialogs::XExecutableDialog > xDialog( + deployment::ui::LicenseDialog::create( +- xContext, VCLUnoHelper::GetInterface( NULL ), ++ mxContext, VCLUnoHelper::GetInterface( NULL ), + licExc.ExtensionName, licExc.Text ) ); + sal_Int16 res = xDialog->execute(); + if ( res == ui::dialogs::ExecutableDialogResults::CANCEL ) +@@ -416,7 +421,20 @@ sal_Bool Desktop::CheckExtensionDependencies() + void Desktop::SynchronizeExtensionRepositories() + { + RTL_LOGFILE_CONTEXT(aLog,"desktop (jl) ::Desktop::SynchronizeExtensionRepositories"); +- dp_misc::syncRepositories( new SilentCommandEnv( this ) ); ++ uno::Reference< uno::XComponentContext > context( ++ comphelper_getProcessComponentContext()); ++ uno::Reference< ucb::XCommandEnvironment > silent( ++ new SilentCommandEnv(context, this)); ++ if (m_bCleanedExtensionCache) { ++ deployment::ExtensionManager::get(context)->reinstallDeployedExtensions( ++ true, "user", Reference(), silent); ++ task::OfficeRestartManager::get(context)->requestRestart( ++ silent->getInteractionHandler()); ++ } else { ++ // reinstallDeployedExtensions above already calls syncRepositories ++ // internally: ++ dp_misc::syncRepositories(m_bCleanedExtensionCache, silent); ++ } + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx +index 29ded17..7795e309 100644 +--- a/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx ++++ b/desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx +@@ -1124,7 +1124,7 @@ void ExtensionCmdQueue::acceptLicense( const uno::Reference< deployment::XPackag + + void ExtensionCmdQueue::syncRepositories( const uno::Reference< uno::XComponentContext > &xContext ) + { +- dp_misc::syncRepositories( new ProgressCmdEnv( xContext, NULL, OUSTR("Extension Manager") ) ); ++ dp_misc::syncRepositories( false, new ProgressCmdEnv( xContext, NULL, OUSTR("Extension Manager") ) ); + } + + void ExtensionCmdQueue::stop() +diff --git a/desktop/source/deployment/inc/dp_misc.h b/desktop/source/deployment/inc/dp_misc.h +index 29fd140..06e67aa 100644 +--- a/desktop/source/deployment/inc/dp_misc.h ++++ b/desktop/source/deployment/inc/dp_misc.h +@@ -154,8 +154,10 @@ void TRACE(::rtl::OUString const & sText); + recently added or removed. + */ + DESKTOP_DEPLOYMENTMISC_DLLPUBLIC +-void syncRepositories(::com::sun::star::uno::Reference< +- ::com::sun::star::ucb::XCommandEnvironment> const & xCmdEnv); ++void syncRepositories( ++ bool force, ++ ::com::sun::star::uno::Reference< ++ ::com::sun::star::ucb::XCommandEnvironment> const & xCmdEnv); + + } + +diff --git a/desktop/source/deployment/manager/dp_extensionmanager.cxx b/desktop/source/deployment/manager/dp_extensionmanager.cxx +index 68403f1..b3c21b4 100644 +--- a/desktop/source/deployment/manager/dp_extensionmanager.cxx ++++ b/desktop/source/deployment/manager/dp_extensionmanager.cxx +@@ -1205,9 +1205,10 @@ uno::Sequence< uno::Sequence > > + } + } + +-//only to be called from unopkg!!! ++// Only to be called from unopkg or soffice bootstrap (with force=true in the ++// latter case): + void ExtensionManager::reinstallDeployedExtensions( +- OUString const & repository, ++ sal_Bool force, OUString const & repository, + Reference const & xAbortChannel, + Reference const & xCmdEnv ) + throw (deploy::DeploymentException, +@@ -1220,10 +1221,11 @@ void ExtensionManager::reinstallDeployedExtensions( + xPackageManager = getPackageManager(repository); + + ::osl::MutexGuard guard(getMutex()); +- xPackageManager->reinstallDeployedPackages(xAbortChannel, xCmdEnv); ++ xPackageManager->reinstallDeployedPackages( ++ force, xAbortChannel, xCmdEnv); + //We must sync here, otherwise we will get exceptions when extensions + //are removed. +- dp_misc::syncRepositories(xCmdEnv); ++ dp_misc::syncRepositories(force, xCmdEnv); + const uno::Sequence< Reference > extensions( + xPackageManager->getDeployedPackages(xAbortChannel, xCmdEnv)); + +diff --git a/desktop/source/deployment/manager/dp_extensionmanager.hxx b/desktop/source/deployment/manager/dp_extensionmanager.hxx +index 22e2d41..ec1edbc 100644 +--- a/desktop/source/deployment/manager/dp_extensionmanager.hxx ++++ b/desktop/source/deployment/manager/dp_extensionmanager.hxx +@@ -182,7 +182,7 @@ public: + css::uno::RuntimeException); + + virtual void SAL_CALL reinstallDeployedExtensions( +- ::rtl::OUString const & repository, ++ sal_Bool force, ::rtl::OUString const & repository, + css::uno::Reference< css::task::XAbortChannel> const & xAbortChannel, + css::uno::Reference< css::ucb::XCommandEnvironment> const & xCmdEnv ) + throw ( +diff --git a/desktop/source/deployment/manager/dp_manager.cxx b/desktop/source/deployment/manager/dp_manager.cxx +index 8a08320c..8e3d109 100644 +--- a/desktop/source/deployment/manager/dp_manager.cxx ++++ b/desktop/source/deployment/manager/dp_manager.cxx +@@ -1164,14 +1164,14 @@ PackageManagerImpl::getDeployedPackages( + //ToDo: the function must not call registerPackage, do this in + //XExtensionManager.reinstallDeployedExtensions + void PackageManagerImpl::reinstallDeployedPackages( +- Reference const & /*xAbortChannel*/, ++ sal_Bool force, Reference const & /*xAbortChannel*/, + Reference const & xCmdEnv_ ) + throw (deployment::DeploymentException, + CommandFailedException, CommandAbortedException, + lang::IllegalArgumentException, RuntimeException) + { + check(); +- if (office_is_running()) ++ if (!force && office_is_running()) + throw RuntimeException( + OUSTR("You must close any running Office process before " + "reinstalling packages!"), static_cast(this) ); +diff --git a/desktop/source/deployment/manager/dp_manager.h b/desktop/source/deployment/manager/dp_manager.h +index 3b335d7..3c7f8d9 100644 +--- a/desktop/source/deployment/manager/dp_manager.h ++++ b/desktop/source/deployment/manager/dp_manager.h +@@ -236,6 +236,7 @@ public: + css::uno::RuntimeException); + + virtual void SAL_CALL reinstallDeployedPackages( ++ sal_Bool force, + css::uno::Reference const & xAbortChannel, + css::uno::Reference const & xCmdEnv ) + throw (css::deployment::DeploymentException, +diff --git a/desktop/source/deployment/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx +index b225db6..9ed579f 100644 +--- a/desktop/source/deployment/misc/dp_misc.cxx ++++ b/desktop/source/deployment/misc/dp_misc.cxx +@@ -591,7 +591,7 @@ void TRACE(::rtl::OString const & sText) + } + + void syncRepositories( +- Reference const & xCmdEnv) ++ bool force, Reference const & xCmdEnv) + { + OUString sDisable; + ::rtl::Bootstrap::get( OUSTR( "DISABLE_EXTENSION_SYNCHRONIZATION" ), sDisable, OUString() ); +@@ -602,7 +602,8 @@ void syncRepositories( + //synchronize shared before bundled otherewise there are + //more revoke and registration calls. + sal_Bool bModified = false; +- if (needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared"))) ++ if (force ++ || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("shared"))) + || needToSyncRepostitory(OUString(RTL_CONSTASCII_USTRINGPARAM("bundled")))) + { + xExtensionManager = +diff --git a/desktop/source/pkgchk/unopkg/unopkg_app.cxx b/desktop/source/pkgchk/unopkg/unopkg_app.cxx +index 43faed5..ef16ea1 100644 +--- a/desktop/source/pkgchk/unopkg/unopkg_app.cxx ++++ b/desktop/source/pkgchk/unopkg/unopkg_app.cxx +@@ -392,7 +392,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() + //synching is done in XExtensionManager.reinstall + if (!subcmd_gui && ! subCommand.equals(OUSTR("reinstall")) + && ! dp_misc::office_is_running()) +- dp_misc::syncRepositories(xCmdEnv); ++ dp_misc::syncRepositories(false, xCmdEnv); + + if ( subcmd_add || subCommand == "remove" ) + { +@@ -436,7 +436,7 @@ extern "C" DESKTOP_DLLPUBLIC int unopkg_main() + RTL_CONSTASCII_STRINGPARAM("reinstall") )) + { + xExtensionManager->reinstallDeployedExtensions( +- repository, Reference(), xCmdEnv); ++ false, repository, Reference(), xCmdEnv); + } + else if ( subCommand == "list" ) + { +diff --git a/offapi/com/sun/star/deployment/XExtensionManager.idl b/offapi/com/sun/star/deployment/XExtensionManager.idl +index b68ab20..2912e45 100644 +--- a/offapi/com/sun/star/deployment/XExtensionManager.idl ++++ b/offapi/com/sun/star/deployment/XExtensionManager.idl +@@ -260,6 +260,9 @@ interface XExtensionManager +

+ Please use this in case of suspected cache inconsistencies only. +

++ @param force ++ set to true when called during soffice bootstrap after cleaning ++ old extension cache + @param repositroy + the name of the repository + @param xAbortChannel +@@ -268,6 +271,7 @@ interface XExtensionManager + command environment for error and progress handling + */ + void reinstallDeployedExtensions( ++ [in] boolean force, + [in] string repository, + [in] com::sun::star::task::XAbortChannel xAbortChannel, + [in] com::sun::star::ucb::XCommandEnvironment xCmdEnv ) +diff --git a/offapi/com/sun/star/deployment/XPackageManager.idl b/offapi/com/sun/star/deployment/XPackageManager.idl +index 12e7e0e..39ff04a 100644 +--- a/offapi/com/sun/star/deployment/XPackageManager.idl ++++ b/offapi/com/sun/star/deployment/XPackageManager.idl +@@ -225,12 +225,16 @@ interface XPackageManager + Please use this in case of suspected cache inconsistencies only. +

+ ++ @param force ++ set to true when called during soffice bootstrap after cleaning ++ old extension cache + @param xAbortChannel + abort channel to asynchronously abort the adding process + @param xCmdEnv + command environment for error and progress handling + */ + void reinstallDeployedPackages( ++ [in] boolean force, + [in] com::sun::star::task::XAbortChannel xAbortChannel, + [in] com::sun::star::ucb::XCommandEnvironment xCmdEnv ) + raises (DeploymentException, +-- +cgit v0.9.0.2-2-gbebe diff --git a/testing/libreoffice/libreoffice-common.csh b/testing/libreoffice/libreoffice-common.csh index af31d4432..5efa39404 100644 --- a/testing/libreoffice/libreoffice-common.csh +++ b/testing/libreoffice/libreoffice-common.csh @@ -1 +1,8 @@ #setenv PYTHONPATH ${PYTHONPATH}:/usr/lib/libreoffice/program + +# to force a certain look'n feel + +#setenv SAL_USE_VCLPLUGIN gen +#setenv SAL_USE_VCLPLUGIN kde4 +#setenv SAL_USE_VCLPLUGIN gtk +#setenv SAL_USE_VCLPLUGIN gtk3 diff --git a/testing/libreoffice/libreoffice-common.sh b/testing/libreoffice/libreoffice-common.sh index ee405b1aa..795867125 100644 --- a/testing/libreoffice/libreoffice-common.sh +++ b/testing/libreoffice/libreoffice-common.sh @@ -1 +1,8 @@ #export PYTHONPATH="$PYTHONPATH:/usr/lib/libreoffice/program" + +# to force a certain look'n feel + +#export SAL_USE_VCLPLUGIN=gen +#export SAL_USE_VCLPLUGIN=kde4 +#export SAL_USE_VCLPLUGIN=gtk +#export SAL_USE_VCLPLUGIN=gtk3 -- cgit v1.2.3-54-g00ecf