From e8b3a18c45c41c26f52172d9a7335ee60a219f83 Mon Sep 17 00:00:00 2001 From: Benjamin Drung Date: Mon, 23 May 2011 23:41:00 +0200 Subject: [PATCH] Move suspicious-source and wrap-and-sort from ubuntu-dev-tools into devscripts. --- backportpackage | 3 +- bitesize | 3 +- debian/changelog | 6 +- debian/control | 5 +- debian/copyright | 6 - doc/suspicious-source.1 | 55 ----- doc/wrap-and-sort.1 | 74 ------- pbuilder-dist | 3 +- pull-debian-debdiff | 3 +- pull-debian-source | 3 +- pull-lp-source | 3 +- setup.py | 2 - sponsor-patch | 3 +- suspicious-source | 145 ------------- syncpackage | 3 +- ubuntutools/archive.py | 3 +- ubuntutools/builder.py | 2 +- ubuntutools/config.py | 2 +- ubuntutools/control.py | 83 -------- ubuntutools/logger.py | 68 ------- ubuntutools/sponsor_patch/bugtask.py | 3 +- ubuntutools/sponsor_patch/sponsor_patch.py | 3 +- ubuntutools/test/test_archive.py | 3 +- ubuntutools/test/test_config.py | 3 +- ubuntutools/test/test_update_maintainer.py | 3 +- ubuntutools/update_maintainer.py | 2 +- wrap-and-sort | 225 --------------------- 27 files changed, 35 insertions(+), 682 deletions(-) delete mode 100644 doc/suspicious-source.1 delete mode 100644 doc/wrap-and-sort.1 delete mode 100755 suspicious-source delete mode 100644 ubuntutools/control.py delete mode 100644 ubuntutools/logger.py delete mode 100755 wrap-and-sort diff --git a/backportpackage b/backportpackage index 330309b..8f68ee5 100755 --- a/backportpackage +++ b/backportpackage @@ -28,10 +28,11 @@ import tempfile from launchpadlib.launchpad import Launchpad import lsb_release +from devscripts.logger import Logger + from ubuntutools.archive import UbuntuSourcePackage, DownloadError from ubuntutools.config import UDTConfig, ubu_email from ubuntutools.builder import get_builder -from ubuntutools.logger import Logger from ubuntutools.question import YesNoQuestion def error(msg): diff --git a/bitesize b/bitesize index a170843..02bb595 100755 --- a/bitesize +++ b/bitesize @@ -27,7 +27,8 @@ from optparse import OptionParser from launchpadlib.launchpad import Launchpad from launchpadlib.errors import HTTPError -from ubuntutools.logger import Logger +from devscripts.logger import Logger + from ubuntutools.config import UDTConfig def error_out(msg): diff --git a/debian/changelog b/debian/changelog index fb6aa05..a19cf33 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,8 @@ ubuntu-dev-tools (0.124) UNRELEASED; urgency=low [ Benjamin Drung ] - * Move add-patch, edit-patch, and what-patch from ubuntu-dev-tools into - devscripts (Closes: #568481). + * Move add-patch, edit-patch, suspicious-source, what-patch, and wrap-and-sort + from ubuntu-dev-tools into devscripts (Closes: #568481). [ Daniel Holbach ] * bitesize: @@ -15,7 +15,7 @@ ubuntu-dev-tools (0.124) UNRELEASED; urgency=low * mk-sbuild: - maintainer_name isn't mandatory any more (LP: #787051) - -- Stefano Rivera Mon, 23 May 2011 17:14:49 +0100 + -- Benjamin Drung Mon, 23 May 2011 23:38:51 +0200 ubuntu-dev-tools (0.123) unstable; urgency=low diff --git a/debian/control b/debian/control index f34ff54..c4b3217 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Vcs-Bzr: lp:ubuntu-dev-tools Vcs-Browser: https://code.launchpad.net/~ubuntu-dev/ubuntu-dev-tools/trunk Build-Depends: dctrl-tools, debhelper (>= 7.0.50~), - devscripts, + devscripts (>= 2.10.74~), libwww-perl, lsb-release, pylint, @@ -111,12 +111,9 @@ Description: useful tools for Ubuntu developers - sponsor-patch - Downloads a patch from a Launchpad bug, patches the source package, and uploads it (to Ubuntu or a PPA) - submittodebian - automatically send your changes to Debian as a bug report. - - suspicious-source - outputs a list of files which are not common source - files. - syncpackage - helper to prepare .changes file to upload synced packages - ubuntu-build - give commands to the Launchpad build daemons from the command line. - ubuntu-distro-info - provides information about Ubuntu's distributions. - ubuntu-iso - output information of an Ubuntu ISO image. - update-maintainer - script to update maintainer field in ubuntu packages. - - wrap-and-sort - wrap long lines and sort items in packaging files. diff --git a/debian/copyright b/debian/copyright index 0b0502f..8e33d2e 100644 --- a/debian/copyright +++ b/debian/copyright @@ -175,29 +175,23 @@ Files: data/* doc/pull-debian-debdiff.1 doc/pull-debian-source.1 doc/sponsor-patch.1 - doc/suspicious-source.1 doc/ubuntu-dev-tools.5 doc/ubuntu-distro-info.1 doc/update-maintainer.1 - doc/wrap-and-sort.1 pull-debian-debdiff pull-debian-source sponsor-patch - suspicious-source test-data/* ubuntu-distro-info ubuntutools/archive.py ubuntutools/builder.py ubuntutools/config.py - ubuntutools/control.py ubuntutools/distro_info.py - ubuntutools/logger.py ubuntutools/question.py ubuntutools/sponsor_patch/* ubuntutools/test/* ubuntutools/update_maintainer.py update-maintainer - wrap-and-sort Copyright: 2009-2011, Benjamin Drung 2010, Evan Broder 2008, Siegfried-Angel Gevatter Pujals diff --git a/doc/suspicious-source.1 b/doc/suspicious-source.1 deleted file mode 100644 index dc2775c..0000000 --- a/doc/suspicious-source.1 +++ /dev/null @@ -1,55 +0,0 @@ -.\" Copyright (c) 2010, Benjamin Drung -.\" -.\" Permission to use, copy, modify, and/or distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.TH SUSPICIOUS\-SOURCE 1 "August 2010" "ubuntu-dev-tools" - -.SH NAME -suspicious\-source \- search for files that are not the GPL's -"preferred form of modification" - -.SH SYNOPSIS -\fBsuspicious\-source\fP [\fIoptions\fR] - -.SH DESCRIPTION -\fBsuspicious\-source\fP is a script that outputs a list of files which -are not common source files. -This should be run in the root of a source tree to find files which might -not be the "preferred form of modification" that the GPL and other licenses -require. -.PP -The files inside version control system directories (like -".bzr/" or "CVS/") are not considered. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR -show this help message and exit -.TP -\fB\-v\fR, \fB\-\-verbose\fR -print more information -.TP -\fB\-d\fR DIRECTORY, \fB\-\-directory\fR=\fIDIRECTORY\fR -check the files in the specified directory instead of the current directory -.TP -\fB\-m\fR MIMETYPE, \fB\-\-mimetype\fR=\fIMIMETYPE\fR -Add MIMETYPE to list of white-listed mime-types. -.TP -\fB\-e\fR EXTENSION, \fB\-\-extension\fR=\fIEXTENSION\fR -Add EXTENSION to list of white-listed extensions. - -.SH AUTHORS -\fBsuspicious\-source\fP and this manpage has been written by -Benjamin Drung . -.PP -Both are released under the ISC license. diff --git a/doc/wrap-and-sort.1 b/doc/wrap-and-sort.1 deleted file mode 100644 index 63f5415..0000000 --- a/doc/wrap-and-sort.1 +++ /dev/null @@ -1,74 +0,0 @@ -.\" Copyright (c) 2010, Benjamin Drung -.\" -.\" Permission to use, copy, modify, and/or distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.TH WRAP\-AND\-SORT 1 "September 2010" "ubuntu-dev-tools" -.SH NAME -wrap-and-sort \- wrap long lines and sort items in packaging files -.SH SYNOPSIS -.B wrap-and-sort -[\fIoptions\fR] - -.SH DESCRIPTION -\fBwrap\-and\-sort\fP wraps the package lists in Debian control files. By -default the lists will only split into multiple lines if the entries are longer -than 80 characters. \fBwrap\-and\-sort\fP sorts the package lists in Debian -control files and all .install files. Beside that \fBwrap\-and\-sort\fP removes -trailing spaces in these files. -.PP -This script should be run in the root of a Debian package tree. It searches for -control, control.in, copyright, copyright.in, install, and *.install in the -debian directory. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR -show this help message and exit -.TP -\fB\-a\fR, \fB\-\-wrap\-always\fR -wrap all package lists in the Debian control file -even if the entries are shorter than 80 characters and could fit in one line -line -.TP -\fB\-s\fR, \fB\-\-short\-indent\fR -only indent wrapped lines by one space (default is in\-line with the -field name) -.TP -\fB\-b\fR, \fB\-\-sort\-binary\-packages\fR -sort binary package paragraphs by name -.TP -\fB\-k\fR, \fB\-\-keep\-first\fR -When sorting binary package paragraphs, leave the first one at the top. -Unqualified -.BR debhelper (7) -configuration files are applied to the first package. -.TP -\fB\-n\fR, \fB\-\-no\-cleanup\fR -do not remove trailing whitespaces -.TP -\fB\-d \fIPATH\fR, \fB\-\-debian\-directory\fR=\fIPATH\fR -location of the \fIdebian\fR directory (default: \fB./debian\fR) -.TP -\fB\-f\fI FILE\fR, \fB\-\-file\fR=\fIFILE\fR -Wrap and sort only the specified file. -You can specify this parameter multiple times. -All supported files will be processed if no files are specified. -.TP -\fB\-v\fR, \fB\-\-verbose\fR -print all files that are touched - -.SH AUTHORS -\fBwrap\-and\-sort\fP and this manpage has been written by -Benjamin Drung . -.PP -Both are released under the ISC license. diff --git a/pbuilder-dist b/pbuilder-dist index 1e060d4..990bce0 100755 --- a/pbuilder-dist +++ b/pbuilder-dist @@ -33,8 +33,9 @@ import os import subprocess import sys +from devscripts.logger import Logger + from ubuntutools.distro_info import DebianDistroInfo -from ubuntutools.logger import Logger import ubuntutools.misc class PbuilderDist: diff --git a/pull-debian-debdiff b/pull-debian-debdiff index 1b03180..0320b8e 100755 --- a/pull-debian-debdiff +++ b/pull-debian-debdiff @@ -23,9 +23,10 @@ import sys import debian.debian_support import debian.changelog +from devscripts.logger import Logger + from ubuntutools.archive import DebianSourcePackage, DownloadError from ubuntutools.config import UDTConfig -from ubuntutools.logger import Logger def previous_version(package, version, distance): "Given an (extracted) package, determine the version distance versions ago" diff --git a/pull-debian-source b/pull-debian-source index df52d03..e418f8f 100755 --- a/pull-debian-source +++ b/pull-debian-source @@ -19,10 +19,11 @@ import optparse import sys +from devscripts.logger import Logger + from ubuntutools.archive import DebianSourcePackage, DownloadError, rmadison from ubuntutools.config import UDTConfig from ubuntutools.distro_info import DebianDistroInfo -from ubuntutools.logger import Logger def is_suite(version): """If version could be considered to be a Debian suite, return the diff --git a/pull-lp-source b/pull-lp-source index 30a17c5..47cf4ba 100755 --- a/pull-lp-source +++ b/pull-lp-source @@ -27,10 +27,11 @@ import os import sys from optparse import OptionParser +from devscripts.logger import Logger + from ubuntutools.archive import UbuntuSourcePackage, DownloadError from ubuntutools.config import UDTConfig from ubuntutools.distro_info import UbuntuDistroInfo -from ubuntutools.logger import Logger from ubuntutools.lp.lpapicache import Distribution, Launchpad from ubuntutools.lp.udtexceptions import (SeriesNotFoundException, PackageNotFoundException, diff --git a/setup.py b/setup.py index dd6f5f7..dcf14f6 100755 --- a/setup.py +++ b/setup.py @@ -47,13 +47,11 @@ scripts = ['404main', 'setup-packaging-environment', 'sponsor-patch', 'submittodebian', - 'suspicious-source', 'syncpackage', 'ubuntu-build', 'ubuntu-distro-info', 'ubuntu-iso', 'update-maintainer', - 'wrap-and-sort', ] if __name__ == '__main__': diff --git a/sponsor-patch b/sponsor-patch index 6784c09..0b64b9d 100755 --- a/sponsor-patch +++ b/sponsor-patch @@ -20,9 +20,10 @@ import shutil import sys import tempfile +from devscripts.logger import Logger + from ubuntutools.config import UDTConfig from ubuntutools.builder import get_builder -from ubuntutools.logger import Logger from ubuntutools.sponsor_patch.sponsor_patch import sponsor_patch def main(): diff --git a/suspicious-source b/suspicious-source deleted file mode 100755 index 2e7a549..0000000 --- a/suspicious-source +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2010-2011, Benjamin Drung -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import optparse -import os -import sys - -from ubuntutools.logger import Logger - -try: - import magic -except ImportError: - Logger.error("Please install 'python-magic' in order to use this utility.") - sys.exit(1) - -DEFAULT_WHITELISTED_MIMETYPES = [ - "application/vnd.font-fontforge-sfd", # font source: fontforge - "application/x-elc", - "application/x-empty", - "application/x-font-otf", # font object and source - "application/x-font-ttf", # font object and source - "application/x-font-woff", # font object and source - "application/x-symlink", - "application/xml", - "audio/x-wav", - "font/otf", # font object and source - "font/ttf", # font object and source - "image/gif", - "image/jpeg", - "image/png", - "image/svg+xml", - "image/vnd.adobe.photoshop", - "image/x-icns", - "image/x-ico", - "image/x-ms-bmp", - "image/x-portable-pixmap", - "message/rfc822", - "text/html", - "text/plain", - "text/rtf", - "text/troff", - "text/x-asm", - "text/x-c", - "text/x-c++", - "text/x-diff", - "text/x-fortran", - "text/x-java", - "text/x-lisp", - "text/x-m4", - "text/x-makefile", - "text/x-msdos-batch", - "text/x-pascal", - "text/x-perl", - "text/x-php", - "text/x-po", - "text/x-python", - "text/x-shellscript", - "text/x-tex", - "text/x-texinfo", -] - -DEFAULT_WHITELISTED_EXTENSIONS = [ - ".fea", # font source format: Adobe Font Development Kit for OpenType - ".fog", # font source format: Fontographer - ".g2n", # font source format: fontforge - ".gdh", # font source format: Graphite (headers) - ".gdl", # font source format: Graphite - ".glyph", # font source format: cross-toolkit UFO - ".icns", # Apple Icon Image format - ".java", # Java source files - ".plate", # font source format: Spiro - ".rsa", - ".sfd", # font source format: fontforge - ".sfdir", # font source format: fontforge - ".ttx", # font source format: fonttools - ".ufo", # font source format: cross-toolkit UFO - ".vfb" # font source format: FontLab - ".vtp", # font source format: OpenType (VOLT) - ".xgf", # font source format: Xgridfit -] - -def suspicious_source(whitelisted_mimetypes, whitelisted_extensions, directory, - verbose=False): - magic_cookie = magic.open(magic.MAGIC_MIME_TYPE) - magic_cookie.load() - - for root, dirs, files in os.walk(directory): - for f in files: - mimetype = magic_cookie.file(os.path.join(root, f)) - if mimetype not in whitelisted_mimetypes: - if not [x for x in whitelisted_extensions - if f.lower().endswith(x)]: - if verbose: - print "%s (%s)" % (os.path.join(root, f), mimetype) - else: - print os.path.join(root, f) - for vcs_dir in (".bzr", "CVS", ".git", ".svn"): - if vcs_dir in dirs: - dirs.remove(vcs_dir) - -def main(): - script_name = os.path.basename(sys.argv[0]) - usage = "%s [options]" % (script_name) - epilog = "See %s(1) for more info." % (script_name) - parser = optparse.OptionParser(usage=usage, epilog=epilog) - - parser.add_option("-v", "--verbose", help="print more information", - dest="verbose", action="store_true", default=False) - parser.add_option("-d", "--directory", - help="check the files in the specified directory", - dest="directory", default=".") - parser.add_option("-m", "--mimetype", metavar="MIMETYPE", - help="Add MIMETYPE to list of whitelisted mimetypes.", - dest="whitelisted_mimetypes", action="append", - default=DEFAULT_WHITELISTED_MIMETYPES) - parser.add_option("-e", "--extension", metavar="EXTENSION", - help="Add EXTENSION to list of whitelisted extensions.", - dest="whitelisted_extensions", action="append", - default=DEFAULT_WHITELISTED_EXTENSIONS) - - (options, args) = parser.parse_args() - - if len(args) != 0: - Logger.error("This script does not take any additional parameters.") - sys.exit(1) - - whitelisted_extensions = [x.lower() for x in options.whitelisted_extensions] - suspicious_source(options.whitelisted_mimetypes, whitelisted_extensions, - options.directory, options.verbose) - -if __name__ == "__main__": - main() diff --git a/syncpackage b/syncpackage index 9b911ed..8ec7fb6 100755 --- a/syncpackage +++ b/syncpackage @@ -28,13 +28,14 @@ import shutil import subprocess import sys +from devscripts.logger import Logger + from ubuntutools.archive import (DebianSourcePackage, UbuntuSourcePackage, DownloadError) from ubuntutools.config import UDTConfig, ubu_email from ubuntutools.requestsync.mail import (getDebianSrcPkg as requestsync_mail_getDebianSrcPkg) from ubuntutools.requestsync.lp import getDebianSrcPkg, getUbuntuSrcPkg -from ubuntutools.logger import Logger from ubuntutools.lp import udtexceptions from ubuntutools.lp.lpapicache import Launchpad diff --git a/ubuntutools/archive.py b/ubuntutools/archive.py index 6363c0b..8eb473d 100644 --- a/ubuntutools/archive.py +++ b/ubuntutools/archive.py @@ -40,8 +40,9 @@ import sys import debian.deb822 import debian.debian_support +from devscripts.logger import Logger + from ubuntutools.config import UDTConfig -from ubuntutools.logger import Logger from ubuntutools.lp.lpapicache import (Launchpad, Distribution, SourcePackagePublishingHistory) diff --git a/ubuntutools/builder.py b/ubuntutools/builder.py index d690c0a..fc5795d 100644 --- a/ubuntutools/builder.py +++ b/ubuntutools/builder.py @@ -21,7 +21,7 @@ import os import subprocess -from ubuntutools.logger import Logger +from devscripts.logger import Logger def _build_preparation(result_directory): """prepares the builder for building a package""" diff --git a/ubuntutools/config.py b/ubuntutools/config.py index 8793aa6..0680c0e 100644 --- a/ubuntutools/config.py +++ b/ubuntutools/config.py @@ -23,7 +23,7 @@ import shlex import socket import sys -from ubuntutools.logger import Logger +from devscripts.logger import Logger class UDTConfig(object): """Ubuntu Dev Tools configuration file (devscripts config file) and diff --git a/ubuntutools/control.py b/ubuntutools/control.py deleted file mode 100644 index 06a3899..0000000 --- a/ubuntutools/control.py +++ /dev/null @@ -1,83 +0,0 @@ -# control.py - Represents a debian/control file -# -# Copyright (C) 2010, Benjamin Drung -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""This module implements facilities to deal with Debian control.""" - -import os - -import debian.deb822 - -def _insert_after(paragraph, item_before, new_item, new_value): - """Insert new_item into directly after item_before - - New items added to a dictionary are appended.""" - item_found = False - for item in paragraph: - if item_found: - value = paragraph.pop(item) - paragraph[item] = value - if item == item_before: - item_found = True - paragraph[new_item] = new_value - if not item_found: - paragraph[new_item] = new_value - -class Control(object): - """Represents a debian/control file""" - - def __init__(self, filename): - assert os.path.isfile(filename), "%s does not exist." % (filename) - self.filename = filename - sequence = open(filename) - self.paragraphs = list() - for paragraph in debian.deb822.Deb822.iter_paragraphs(sequence): - self.paragraphs.append(paragraph) - - def get_maintainer(self): - """Returns the value of the Maintainer field.""" - return self.paragraphs[0].get("Maintainer") - - def get_original_maintainer(self): - """Returns the value of the XSBC-Original-Maintainer field.""" - return self.paragraphs[0].get("XSBC-Original-Maintainer") - - def save(self, filename=None): - """Saves the control file.""" - if filename: - self.filename = filename - content = u"\n".join([x.dump() for x in self.paragraphs]) - control_file = open(self.filename, "w") - control_file.write(content.encode("utf-8")) - control_file.close() - - def set_maintainer(self, maintainer): - """Sets the value of the Maintainer field.""" - self.paragraphs[0]["Maintainer"] = maintainer - - def set_original_maintainer(self, original_maintainer): - """Sets the value of the XSBC-Original-Maintainer field.""" - if "XSBC-Original-Maintainer" in self.paragraphs[0]: - self.paragraphs[0]["XSBC-Original-Maintainer"] = original_maintainer - else: - _insert_after(self.paragraphs[0], "Maintainer", - "XSBC-Original-Maintainer", original_maintainer) - - def strip_trailing_spaces(self): - """Strips all trailing spaces from the control file.""" - for paragraph in self.paragraphs: - for item in paragraph: - lines = paragraph[item].split("\n") - paragraph[item] = "\n".join([l.rstrip() for l in lines]) diff --git a/ubuntutools/logger.py b/ubuntutools/logger.py deleted file mode 100644 index f871e30..0000000 --- a/ubuntutools/logger.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# logger.py - A simple logging helper class -# -# Copyright (C) 2010, Benjamin Drung -# -# Permission to use, copy, modify, and/or distribute this software -# for any purpose with or without fee is hereby granted, provided -# that the above copyright notice and this permission notice appear -# in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import os -import sys - -def escape_arg(arg): - "Shell-escpae arg, if necessary" - if ' ' not in arg: - return arg - return '"%s"' % arg.replace('\\', r'\\').replace('"', r'\"') - -class Logger(object): - script_name = os.path.basename(sys.argv[0]) - verbose = False - - stdout = sys.stdout - stderr = sys.stderr - - @classmethod - def command(cls, cmd): - if cls.verbose: - print >> cls.stdout, "%s: I: %s" % (cls.script_name, - " ".join(escape_arg(arg) - for arg in cmd)) - - @classmethod - def debug(cls, message, *args): - if cls.verbose: - print >> cls.stderr, "%s: D: %s" % (cls.script_name, message % args) - - @classmethod - def error(cls, message, *args): - print >> cls.stderr, "%s: Error: %s" % (cls.script_name, message % args) - - @classmethod - def warn(cls, message, *args): - print >> cls.stderr, "%s: Warning: %s" % (cls.script_name, - message % args) - - @classmethod - def info(cls, message, *args): - if cls.verbose: - print >> cls.stdout, "%s: I: %s" % (cls.script_name, message % args) - - @classmethod - def normal(cls, message, *args): - print >> cls.stdout, "%s: %s" % (cls.script_name, message % args) - - @classmethod - def set_verbosity(cls, verbose): - cls.verbose = verbose diff --git a/ubuntutools/sponsor_patch/bugtask.py b/ubuntutools/sponsor_patch/bugtask.py index 1f1f4d4..3d8fc0e 100644 --- a/ubuntutools/sponsor_patch/bugtask.py +++ b/ubuntutools/sponsor_patch/bugtask.py @@ -21,8 +21,9 @@ import urllib import debian.debian_support +from devscripts.logger import Logger + from ubuntutools.distro_info import DebianDistroInfo -from ubuntutools.logger import Logger class BugTask(object): def __init__(self, bug_task, launchpad): diff --git a/ubuntutools/sponsor_patch/sponsor_patch.py b/ubuntutools/sponsor_patch/sponsor_patch.py index 7070c8e..4c5626f 100644 --- a/ubuntutools/sponsor_patch/sponsor_patch.py +++ b/ubuntutools/sponsor_patch/sponsor_patch.py @@ -26,8 +26,9 @@ import debian.changelog import debian.deb822 import launchpadlib.launchpad +from devscripts.logger import Logger + from ubuntutools.update_maintainer import update_maintainer -from ubuntutools.logger import Logger from ubuntutools.question import Question, YesNoQuestion, input_number from ubuntutools.sponsor_patch.bugtask import BugTask diff --git a/ubuntutools/test/test_archive.py b/ubuntutools/test/test_archive.py index 8f37d10..f977291 100644 --- a/ubuntutools/test/test_archive.py +++ b/ubuntutools/test/test_archive.py @@ -26,9 +26,10 @@ import urllib2 import debian.deb822 import mox +from devscripts.logger import Logger + import ubuntutools.archive from ubuntutools.config import UDTConfig -from ubuntutools.logger import Logger from ubuntutools.test import unittest from ubuntutools.test.example_package import ExamplePackage diff --git a/ubuntutools/test/test_config.py b/ubuntutools/test/test_config.py index b7e68ee..6e41485 100644 --- a/ubuntutools/test/test_config.py +++ b/ubuntutools/test/test_config.py @@ -22,8 +22,9 @@ from StringIO import StringIO import mox +from devscripts.logger import Logger + from ubuntutools.config import UDTConfig, ubu_email -from ubuntutools.logger import Logger from ubuntutools.test import unittest class ConfigTestCase(mox.MoxTestBase, unittest.TestCase): diff --git a/ubuntutools/test/test_update_maintainer.py b/ubuntutools/test/test_update_maintainer.py index dc68144..b2a95fd 100644 --- a/ubuntutools/test/test_update_maintainer.py +++ b/ubuntutools/test/test_update_maintainer.py @@ -23,7 +23,8 @@ import sys import mox -from ubuntutools.logger import Logger +from devscripts.logger import Logger + from ubuntutools.test import unittest from ubuntutools.update_maintainer import update_maintainer diff --git a/ubuntutools/update_maintainer.py b/ubuntutools/update_maintainer.py index 5514eb1..5eee5f9 100644 --- a/ubuntutools/update_maintainer.py +++ b/ubuntutools/update_maintainer.py @@ -21,7 +21,7 @@ import re import debian.changelog -from ubuntutools.logger import Logger +from devscripts.logger import Logger # Prior May 2009 these Maintainers were used: _PREVIOUS_UBUNTU_MAINTAINER = ( diff --git a/wrap-and-sort b/wrap-and-sort deleted file mode 100755 index d6dc44c..0000000 --- a/wrap-and-sort +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2010-2011, Benjamin Drung -# 2010, Stefano Rivera -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import glob -import optparse -import os -import os.path -import re -import sys - -from ubuntutools.control import Control - -CONTROL_LIST_FIELDS = ( - "Breaks", - "Build-Conflicts", - "Build-Depends", - "Build-Depends-Indep", - "Conflicts", - "Depends", - "Enhances", - "Provides", - "Recommends", - "Replaces", - "Suggests", - "Xb-Npp-MimeType", -) - -SUPPORTED_FILES = ( - "control", - "control.in", - "copyright", - "copyright.in", - "install", - "*.install", -) - -class WrapAndSortControl(Control): - def wrap_and_sort(self, wrap_always, short_indent, sort_paragraphs, - keep_first): - for paragraph in self.paragraphs: - for field in CONTROL_LIST_FIELDS: - if field in paragraph: - self._wrap_field(paragraph, field, wrap_always, - short_indent) - if "Uploaders" in paragraph: - self._wrap_field(paragraph, "Uploaders", wrap_always, - short_indent, False) - if "Architecture" in paragraph: - archs = set(paragraph["Architecture"].split()) - # Sort, with wildcard entries (such as linux-any) first: - archs = sorted(archs, key=lambda x: ("any" not in x, x)) - paragraph["Architecture"] = " ".join(archs) - - if sort_paragraphs: - first = self.paragraphs[:1 + int(keep_first)] - sortable = self.paragraphs[1 + int(keep_first):] - key = lambda x: x.get("Package") - self.paragraphs = first + sorted(sortable, key=key) - - def _wrap_field(self, control, entry, wrap_always, short_indent, sort=True): - packages = [x.strip() for x in control[entry].split(",")] - if sort: - # Remove duplicate entries - packages = set(packages) - # Not explicitly disallowed by Policy but known to break QA tools: - if "" in packages: - packages.remove("") - packages = sort_list(packages) - - length = len(entry) + sum([2 + len(package) for package in packages]) - if wrap_always or length > 80: - indentation = " " - if not short_indent: - indentation *= len(entry) + 2 - packages_with_indention = [indentation + x for x in packages] - packages_with_indention = ",\n".join(packages_with_indention) - if short_indent: - control[entry] = "\n" + packages_with_indention - else: - control[entry] = packages_with_indention.strip() - else: - control[entry] = ", ".join(packages).strip() - - -class Install(object): - def __init__(self, filename): - self.content = None - self.filename = None - self.open(filename) - - def open(self, filename): - assert os.path.isfile(filename), "%s does not exist." % (filename) - self.filename = filename - self.content = open(filename).readlines() - - def save(self, filename=None): - if filename: - self.filename = filename - install_file = open(self.filename, "w") - install_file.write("".join(self.content)) - install_file.close() - - def sort(self): - self.content = sorted(self.content) - - -def remove_trailing_whitespaces(filename): - assert os.path.isfile(filename), "%s does not exist." % (filename) - content = open(filename).read().rstrip() + "\n" - lines = content.split("\n") - lines = [l.rstrip() for l in lines] - new_content = "\n".join(lines) - f = open(filename, "w") - f.write(new_content) - f.close() - -def sort_list(unsorted_list): - normal = [x for x in unsorted_list if not x.startswith("${")] - param = [x for x in unsorted_list if x.startswith("${")] - return sorted(normal) + sorted(param) - -def wrap_and_sort(options): - control_files = [f for f in options.files if re.search("/control[^/]*$", f)] - for control_file in control_files: - if options.verbose: - print control_file - control = WrapAndSortControl(control_file) - if options.cleanup: - control.strip_trailing_spaces() - control.wrap_and_sort(options.wrap_always, options.short_indent, - options.sort_binary_packages, options.keep_first) - control.save() - - copyright_files = [f for f in options.files - if re.search("/copyright[^/]*$", f)] - for copyright_file in copyright_files: - if options.verbose: - print copyright_file - remove_trailing_whitespaces(copyright_file) - - install_files = [f for f in options.files if re.search("install$", f)] - for install_file in sorted(install_files): - if options.verbose: - print install_file - install = Install(install_file) - install.sort() - install.save() - -def get_files(debian_directory): - """Returns a list of files that should be wrapped and sorted.""" - files = [] - for supported_files in SUPPORTED_FILES: - files.extend(glob.glob(os.path.join(debian_directory, supported_files))) - return files - -def main(): - script_name = os.path.basename(sys.argv[0]) - usage = "%s [options]" % (script_name) - epilog = "See %s(1) for more info." % (script_name) - parser = optparse.OptionParser(usage=usage, epilog=epilog) - - parser.add_option("-a", "--wrap-always", dest="wrap_always", - help="wrap lists even if they fit into one 80 character " - "long line", action="store_true", default=False) - parser.add_option("-s", "--short-indent", dest="short_indent", - help="only indent wrapped lines by one space (default is " - "in-line with the field name)", - action="store_true", default=False) - parser.add_option("-b", "--sort-binary-packages", - help="Sort binary package paragraphs by name", - dest="sort_binary_packages", action="store_true", - default=False) - parser.add_option("-k", "--keep-first", - help="When sorting binary package paragraphs, leave the " - "first one at the top. Unqualified debhelper " - "configuration files are applied to the first " - "package.", - dest="keep_first", action="store_true", default=False) - parser.add_option("-n", "--no-cleanup", help="don't cleanup whitespaces", - dest="cleanup", action="store_false", default=True) - parser.add_option("-d", "--debian-directory", dest="debian_directory", - help="location of the 'debian' directory (default: " - "./debian)", metavar="PATH", default="debian") - parser.add_option("-f", "--file", metavar="FILE", - dest="files", action="append", default=list(), - help="Wrap and sort only the specified file.") - parser.add_option("-v", "--verbose", - help="print all files that are touched", - dest="verbose", action="store_true", default=False) - - (options, args) = parser.parse_args() - - if len(args) != 0: - parser.error("Unsupported additional parameters specified: %s" % \ - ", ".join(args)) - - if not os.path.isdir(options.debian_directory): - parser.error('Debian directory not found, expecting "%s".' % \ - options.debian_directory) - - not_found = [f for f in options.files if not os.path.isfile(f)] - if not_found: - parser.error('Specified files not found: %s' % ", ".join(not_found)) - - if not options.files: - options.files = get_files(options.debian_directory) - - wrap_and_sort(options) - -if __name__ == "__main__": - main()