update-maintainer: Add a function to restore the original maintainer.

This commit is contained in:
Stefano Rivera 2012-05-06 19:42:39 +02:00
parent ebe44bf04e
commit d692d7b79b
3 changed files with 88 additions and 28 deletions

1
debian/changelog vendored
View File

@ -19,6 +19,7 @@ ubuntu-dev-tools (0.142) UNRELEASED; urgency=low
* Allow mk-sbuild to be run by root if a configuration file exists * Allow mk-sbuild to be run by root if a configuration file exists
(LP: #888736) (LP: #888736)
* backportpackage: Allow unsigned backports (LP: #992739) * backportpackage: Allow unsigned backports (LP: #992739)
* update-maintainer: Add a function to restore the original maintainer.
-- Stefano Rivera <stefanor@debian.org> Wed, 25 Apr 2012 17:38:58 +0200 -- Stefano Rivera <stefanor@debian.org> Wed, 25 Apr 2012 17:38:58 +0200

View File

@ -30,6 +30,11 @@ _PREVIOUS_UBUNTU_MAINTAINER = (
) )
_UBUNTU_MAINTAINER = "Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>" _UBUNTU_MAINTAINER = "Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>"
class MaintainerUpdateException(Exception):
pass
class Control(object): class Control(object):
"""Represents a debian/control file""" """Represents a debian/control file"""
@ -79,6 +84,12 @@ class Control(object):
self._content = pattern.sub(r"\1\n" + original_maintainer, self._content = pattern.sub(r"\1\n" + original_maintainer,
self._content) self._content)
def remove_original_maintainer(self):
"""Strip out out the XSBC-Original-Maintainer line"""
pattern = re.compile("^(?:[XSBC]*-)?Original-Maintainer:.*?$.*?^",
re.MULTILINE | re.DOTALL)
self._content = pattern.sub('', self._content)
def _get_distribution(changelog_file): def _get_distribution(changelog_file):
"""get distribution of latest changelog entry""" """get distribution of latest changelog entry"""
@ -88,6 +99,38 @@ def _get_distribution(changelog_file):
# Strip things like "-proposed-updates" or "-security" from distribution # Strip things like "-proposed-updates" or "-security" from distribution
return distribution.split("-", 1)[0] return distribution.split("-", 1)[0]
def _find_files(debian_directory, verbose):
"""Find possible control files.
Returns (changelog, control files list)
Raises an exception if none can be found.
"""
possible_contol_files = [os.path.join(debian_directory, f) for
f in ["control.in", "control"]]
changelog_file = os.path.join(debian_directory, "changelog")
control_files = [f for f in possible_contol_files if os.path.isfile(f)]
# Make sure that a changelog and control file is available
if len(control_files) == 0:
raise MaintainerUpdateException(
"No control file found in %s." % debian_directory)
if not os.path.isfile(changelog_file):
raise MaintainerUpdateException(
"No changelog file found in %s." % debian_directory)
# If the rules file accounts for XSBC-Original-Maintainer, we should not
# touch it in this package (e.g. the python package).
rules_file = os.path.join(debian_directory, "rules")
if os.path.isfile(rules_file) and \
'XSBC-Original-' in open(rules_file).read():
if verbose:
print "XSBC-Original is managed by 'rules' file. Doing nothing."
control_files = []
return (changelog_file, control_files)
def update_maintainer(debian_directory, verbose=False): def update_maintainer(debian_directory, verbose=False):
"""updates the Maintainer field of an Ubuntu package """updates the Maintainer field of an Ubuntu package
@ -99,38 +142,20 @@ def update_maintainer(debian_directory, verbose=False):
Policy: https://wiki.ubuntu.com/DebianMaintainerField Policy: https://wiki.ubuntu.com/DebianMaintainerField
""" """
possible_contol_files = [os.path.join(debian_directory, f) for try:
f in ["control.in", "control"]] changelog_file, control_files = _find_files(debian_directory, verbose)
except MaintainerUpdateException, e:
changelog_file = os.path.join(debian_directory, "changelog") Logger.error(str(e))
control_files = [f for f in possible_contol_files if os.path.isfile(f)] raise
# Make sure that a changelog and control file is available
if len(control_files) == 0:
Logger.error("No control file found in %s.", debian_directory)
return(1)
if not os.path.isfile(changelog_file):
Logger.error("No changelog file found in %s.", debian_directory)
return(1)
# If the rules file accounts for XSBC-Original-Maintainer, we should not
# touch it in this package (e.g. the python package).
rules_file = os.path.join(debian_directory, "rules")
if os.path.isfile(rules_file) and \
'XSBC-Original-' in open(rules_file).read():
if verbose:
print "XSBC-Original is managed by 'rules' file. Doing nothing."
return(0)
distribution = _get_distribution(changelog_file) distribution = _get_distribution(changelog_file)
for control_file in control_files: for control_file in control_files:
control = Control(control_file) control = Control(control_file)
original_maintainer = control.get_maintainer() original_maintainer = control.get_maintainer()
if original_maintainer is None: if original_maintainer is None:
Logger.error("No Maintainer field found in %s.", control_file) Logger.error("No Maintainer field found in %s.", control_file)
return(1) raise MaintainerUpdateException("No Maintainer field found")
if original_maintainer.strip().lower() in _PREVIOUS_UBUNTU_MAINTAINER: if original_maintainer.strip().lower() in _PREVIOUS_UBUNTU_MAINTAINER:
if verbose: if verbose:
@ -149,7 +174,7 @@ def update_maintainer(debian_directory, verbose=False):
if distribution in ("stable", "testing", "unstable", "experimental"): if distribution in ("stable", "testing", "unstable", "experimental"):
if verbose: if verbose:
print "The package targets Debian. Doing nothing." print "The package targets Debian. Doing nothing."
return(0) return
if control.get_original_maintainer() is not None: if control.get_original_maintainer() is not None:
Logger.warn("Overwriting original maintainer: %s", Logger.warn("Overwriting original maintainer: %s",
@ -162,4 +187,24 @@ def update_maintainer(debian_directory, verbose=False):
control.set_maintainer(_UBUNTU_MAINTAINER) control.set_maintainer(_UBUNTU_MAINTAINER)
control.save() control.save()
return(0) return
def restore_maintainer(debian_directory, verbose=False):
"""Restore the original maintainer"""
try:
changelog_file, control_files = _find_files(debian_directory, verbose)
except MaintainerUpdateException, e:
Logger.error(str(e))
raise
for control_file in control_files:
control = Control(control_file)
orig_maintainer = control.get_original_maintainer()
if not orig_maintainer:
continue
if verbose:
print "Restoring original maintainer: %s" % orig_maintainer
control.set_maintainer(orig_maintainer)
control.remove_original_maintainer()
control.save()

View File

@ -18,7 +18,10 @@ import optparse
import os import os
import sys import sys
from ubuntutools.update_maintainer import update_maintainer from ubuntutools.update_maintainer import (update_maintainer,
restore_maintainer,
MaintainerUpdateException)
def main(): def main():
script_name = os.path.basename(sys.argv[0]) script_name = os.path.basename(sys.argv[0])
@ -28,6 +31,9 @@ def main():
parser.add_option("-d", "--debian-directory", dest="debian_directory", parser.add_option("-d", "--debian-directory", dest="debian_directory",
help="location of the 'debian' directory (default: " help="location of the 'debian' directory (default: "
"%default).", metavar="PATH", default="./debian") "%default).", metavar="PATH", default="./debian")
parser.add_option("-r", "--restore",
help="Restore the original maintainer",
action='store_true', default=False)
parser.add_option("-q", "--quiet", help="print no informational messages", parser.add_option("-q", "--quiet", help="print no informational messages",
dest="quiet", action="store_true", default=False) dest="quiet", action="store_true", default=False)
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
@ -37,7 +43,15 @@ def main():
"specified: %s") % (script_name, ", ".join(args)) "specified: %s") % (script_name, ", ".join(args))
sys.exit(1) sys.exit(1)
sys.exit(update_maintainer(options.debian_directory, not options.quiet)) if not options.restore:
operation = update_maintainer
else:
operation = restore_maintainer
try:
operation(options.debian_directory, not options.quiet)
except MaintainerUpdateException:
sys.exit(1)
if __name__ == "__main__": if __name__ == "__main__":
main() main()