import re
+import distutils.version
import os
from wizard import app, deploy, install, shell, util
return handler
def checkConfig(self, deployment):
return os.path.isfile(os.path.join(deployment.location, "LocalSettings.php"))
+ def detectVersion(self, deployment):
+ contents = deployment.read("includes/DefaultSettings.php")
+ regex = make_filename_regex("wgVersion")[1]
+ match = regex.search(contents)
+ if not match: return None
+ return distutils.version.LooseVersion(match.group(2)[1:-1])
def install(self, options):
try:
os.unlink("LocalSettings.php")
d.verifyTag(options.srv_path)
d.verifyGit(options.srv_path)
d.verifyConfigured()
+ d.verifyVersion()
repo = d.application.repository(options.srv_path)
version = calculate_newest_version(sh, repo)
if version == d.app_version.scripts_tag:
resolving the files, adding them using `git add`, and then
committing your changes with `git commit` (your log message
will be ignored), and then running `wizard upgrade --continue`."""
+
if not self.configured:
raise NotConfiguredError(self.location)
+ def verifyVersion(self):
+ """
+ Checks if our version and the version number recorded in a file
+ are consistent.
+ """
+ real = self.application.detectVersion(self)
+ if not real:
+ raise VersionDetectionError
+ elif not str(real) == self.app_version.pristine_tag.partition('-')[2]:
+ raise VersionMismatchError(real, self.version)
+
@property
def configured(self):
"""Whether or not an autoinstall has been configured/installed for use."""
non-versioned data in an application.
"""
raise NotImplemented
+ def detectVersion(self, deployment):
+ """
+ Checks source files to determine the version manually.
+ """
+ return None
@property
def extractors(self):
"""
means that an upstream rebase occurred, and new tags were
pulled, but local user commits were never rebased.""" % self.tag
+class VersionDetectionError(Error):
+ def __str__(self):
+ return """
+
+ERROR: Could not detect the real version of the application."""
+
+class VersionMismatchError(Error):
+ def __init__(self, real_version, git_version):
+ self.real_version = real_version
+ self.git_version = git_version
+ def __str__(self):
+ return """
+
+ERROR: The detected version %s did not match the Git
+version %s.""" % (self.real_version, self.git_version)
+
_application_list = [
"mediawiki", "wordpress", "joomla", "e107", "gallery2",
"phpBB", "advancedbook", "phpical", "trac", "turbogears", "django",