=== added directory '.bzr-builddeb'
=== renamed directory '.bzr-builddeb' => '.bzr-builddeb.moved'
=== added file '.bzr-builddeb/default.conf'
--- .bzr-builddeb/default.conf	1970-01-01 00:00:00 +0000
+++ .bzr-builddeb/default.conf	2012-09-12 18:51:22 +0000
@@ -0,0 +1,2 @@
+[BUILDDEB]
+native = True

=== added file '404main'
--- 404main	1970-01-01 00:00:00 +0000
+++ 404main	2012-09-12 18:51:22 +0000
@@ -0,0 +1,177 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2006-2007 (C) Pete Savage <petesavage@ubuntu.com>
+# Copyright 2007 (C) Siegfried-A. Gevatter <rainct@ubuntu.com>
+# Copyright 2009 (C) Canonical Ltd. (by Colin Watson <cjwatson@ubuntu.com>)
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+#
+# This script is used to check if a package and all its build
+# dependencies are in main or not.
+
+import sys
+
+import apt_pkg
+import apt
+
+from ubuntutools import subprocess
+
+def process_deps(cache, deps):
+    """Takes a list of (build) dependencies and processes it."""
+
+    for basedep in [d.or_dependencies[0] for d in deps]:
+        if not packages.has_key(basedep.name) and basedep.name != '':
+            # Check the (build) dependencies recursively
+            find_main(cache, basedep.name)
+
+
+def get_package_version(cache, distro, pack):
+    if pack not in cache:
+        return None
+    for version in (cache[pack].candidate, cache[pack].installed):
+        if not version:
+            continue
+        for origin in version.origins:
+            if origin.archive == distro:
+                return version
+    return None
+
+
+# Cache::CompTypeDeb isn't exposed via python-apt
+def comp_type_deb(op):
+    ops = ("", "<=", ">=", "<<", ">>", "=", "!=")
+    if (op & 15) < 7:
+        return ops[op & 15]
+    return ""
+
+
+def find_main(cache, pack):
+    """Searches the dependencies and build dependencies of a package recursively
+    to determine if they are all in the 'main' component or not."""
+
+    global packages
+
+    if pack in packages:
+        return
+
+    # Retrieve information about the package
+    version = get_package_version(cache, distro, pack)
+
+    if not version:
+        packages[pack] = False
+        return
+    elif [origin for origin in version.origins if origin.component == 'main']:
+        packages[pack] = True
+        return
+    else:
+        if not packages.has_key(pack):
+            packages[pack] = False
+
+        # Retrieve package dependencies
+        process_deps(cache, version.dependencies)
+
+        # Retrieve package build dependencies. There's no handy
+        # attribute on version for this, so unfortunately we have to
+        # do a lot of messing about with apt.
+        deps = []
+        src_records = apt_pkg.SourceRecords()
+        got_src = False
+        while src_records.lookup(version.source_name):
+            if pack in src_records.binaries:
+                got_src = True
+                break
+        if got_src:
+            # pylint: disable=E1101
+            for _, all_deps in src_records.build_depends.iteritems():
+                # pylint: enable=E1101
+                for or_deps in all_deps:
+                    base_deps = []
+                    for (name, ver, op) in or_deps:
+                        base_deps.append(apt.package.BaseDependency(name, op,
+                                                                    ver, False))
+                    deps.append(apt.package.Dependency(base_deps))
+
+        process_deps(cache, deps)
+
+def usage(exit_code):
+    print 'Usage: %s <package name> [<distribution>]' % sys.argv[0]
+    sys.exit(exit_code)
+
+def main():
+
+    global packages, distro
+
+    # Check if the amount of arguments is correct
+    if len(sys.argv) > 1 and sys.argv[1] in ('help', '-h', '--help'):
+        usage(0)
+
+    if len(sys.argv) < 2 or len(sys.argv) > 3:
+        usage(1)
+
+    cache = apt.cache.Cache()
+
+    if len(sys.argv) == 3 and sys.argv[2]:
+        distro = sys.argv[2]
+        if not get_package_version(cache, distro, 'bash'):
+            print u'«%s» is not a valid distribution.' % distro
+            print ('Remember that for 404main to work with a certain '
+                   'distribution it must be in your /etc/apt/sources.list '
+                   'file.')
+            sys.exit(1)
+    else:
+        cmd = ['lsb_release', '-cs']
+        process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+        distro = process.stdout.read().strip('\n')
+
+    if not get_package_version(cache, distro, sys.argv[1]):
+        print (u"Can't find package «%s» in distribution «%s»."
+               % (sys.argv[1], distro))
+        sys.exit(1)
+
+    print (u'Checking package «%s» in distribution «%s»...'
+           % (sys.argv[1], distro))
+
+    find_main(cache, sys.argv[1])
+
+    # True if everything checked until the point is in main
+    all_in_main = True
+
+    for package in packages:
+        if not packages[package]:
+            if all_in_main:
+                print 'The following packages aren\'t in main:'
+                all_in_main = False
+            print '  ', package
+
+    if all_in_main:
+        print (u'Package «%s» and all its dependencies and build dependencies '
+               u'are in main.') % sys.argv[1]
+
+if __name__ == '__main__':
+
+    # Global variable to hold the status of all packages
+    packages = {}
+
+    # Global variable to hold the target distribution
+    distro = ''
+
+    try:
+        main()
+    except KeyboardInterrupt:
+        print 'Aborted.'
+        sys.exit(1)

=== renamed file '404main' => '404main.moved'
=== added file 'GPL-2'
--- GPL-2	1970-01-01 00:00:00 +0000
+++ GPL-2	2012-09-12 18:51:22 +0000
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== renamed file 'GPL-2' => 'GPL-2.moved'
=== added file 'GPL-3'
--- GPL-3	1970-01-01 00:00:00 +0000
+++ GPL-3	2012-09-12 18:51:22 +0000
@@ -0,0 +1,676 @@
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+

=== renamed file 'GPL-3' => 'GPL-3.moved'
=== added file 'README.updates'
--- README.updates	1970-01-01 00:00:00 +0000
+++ README.updates	2012-09-12 18:51:22 +0000
@@ -0,0 +1,57 @@
+Updating the ubuntu-dev-tools package
+-------------------------------------
+
+Here are the steps that are recommended to take when updating the
+ubuntu-dev-tools package in Ubuntu.
+
+1)  Make sure that there are no new revisions to the package's trunk in Bazaar:
+
+    bzr pull lp:ubuntu-dev-tools
+
+2)  Check to make sure that all approved merges have been merged:
+
+    https://code.launchpad.net/ubuntu-dev-tools/+activereviews
+
+3)  Make sure that there is no low lying fruit that can be fixed at:
+
+    https://bugs.launchpad.net/ubuntu/+source/ubuntu-dev-tools
+
+4)  Check that the test suite passes
+
+    setup.py test
+
+5)  Before uploading the package change the UNRELEASED field in the
+    debian/changelog file to unstable. (ubuntu-dev-tools is maintained in Debian
+    and synced to Ubuntu)
+
+    If there is no UNRELEASED entry, make sure that the version for the current
+    one has not been uploaded by someone else already:
+
+    http://packages.qa.debian.org/u/ubuntu-dev-tools.html
+    https://launchpad.net/ubuntu/+source/ubuntu-dev-tools/+publishinghistory
+
+6)  Once the target release has been changed, commit it to Bazaar (where X.YY is
+    the new package version):
+
+    bzr commit -m "Uploaded X.YY to RELEASE."
+
+7)  Tag the new release in Bazaar:
+
+    bzr tag
+
+    For a full list of tags, please see: 'bzr tags'. This is so we can track
+    which Bazaar revision is in which release and makes bug triaging easier.
+
+8)  Create the new source package:
+
+    bzr bd -S
+
+9)  Upload the package to Debian with dput as normal:
+
+    dput ftp-master ubuntu-dev-tools_X.YY_$arch.changes
+
+10) Create a new blank entry with dch -i and mark it as UNRELEASED.
+
+11) After it's been dinstalled in Debian, sync to Ubuntu:
+
+    syncpackage ubuntu-dev-tools

=== renamed file 'README.updates' => 'README.updates.moved'
=== added file 'TODO'
--- TODO	1970-01-01 00:00:00 +0000
+++ TODO	2012-09-12 18:51:22 +0000
@@ -0,0 +1,10 @@
+TODO for the ubuntu-dev-tools package
+-------------------------------------
+
+- Fix all bugs at Launchpad:
+  https://bugs.launchpad.net/ubuntu/+source/ubuntu-dev-tools
+
+- Create missing and improve existing manpages (for all commands).
+
+- Ask all authors who have used GPL if they are happy with using "or any later"
+  versions of the license.

=== renamed file 'TODO' => 'TODO.moved'
=== added file 'backportpackage'
--- backportpackage	1970-01-01 00:00:00 +0000
+++ backportpackage	2012-09-12 18:51:22 +0000
@@ -0,0 +1,399 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# ##################################################################
+#
+# Copyright (C) 2010-2011, Evan Broder <evan@ebroder.net>
+# Copyright (C) 2010, Benjamin Drung <bdrung@ubuntu.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-2 for more details.
+#
+# ##################################################################
+
+import glob
+import optparse
+import os
+import shutil
+import sys
+import tempfile
+
+import lsb_release
+from devscripts.logger import Logger
+from httplib2 import Http, HttpLib2Error
+
+from ubuntutools.archive import (SourcePackage, DebianSourcePackage,
+                                 UbuntuSourcePackage, DownloadError)
+from ubuntutools.config import UDTConfig, ubu_email
+from ubuntutools.builder import get_builder
+from ubuntutools.lp.lpapicache import (Launchpad, Distribution,
+                                       SeriesNotFoundException,
+                                       PackageNotFoundException)
+from ubuntutools.misc import (system_distribution, vendor_to_distroinfo,
+                              codename_to_distribution)
+from ubuntutools.question import YesNoQuestion
+from ubuntutools import subprocess
+
+def error(msg):
+    Logger.error(msg)
+    sys.exit(1)
+
+def check_call(cmd, *args, **kwargs):
+    Logger.command(cmd)
+    ret = subprocess.call(cmd, *args, **kwargs)
+    if ret != 0:
+        error('%s returned %d.' % (cmd[0], ret))
+
+def parse(args):
+    usage = 'Usage: %prog [options] <source package name or .dsc URL/file>'
+    parser = optparse.OptionParser(usage)
+    parser.add_option('-d', '--destination',
+                      metavar='DEST',
+                      dest='dest_releases',
+                      default=[],
+                      action='append',
+                      help='Backport to DEST release '
+                           '(default: current release)')
+    parser.add_option('-s', '--source',
+                      metavar='SOURCE',
+                      dest='source_release',
+                      help='Backport from SOURCE release '
+                           '(default: devel release)')
+    parser.add_option('-S', '--suffix',
+                      metavar='SUFFIX',
+                      help='Suffix to append to version number '
+                           '(default: ~ppa1 when uploading to a PPA)')
+    parser.add_option('-b', '--build',
+                      default=False,
+                      action='store_true',
+                      help='Build the package before uploading '
+                           '(default: %default)')
+    parser.add_option('-B', '--builder',
+                      metavar='BUILDER',
+                      help='Specify the package builder (default: pbuilder)')
+    parser.add_option('-U', '--update',
+                      default=False,
+                      action='store_true',
+                      help='Update the build environment before '
+                           'attempting to build')
+    parser.add_option('-u', '--upload',
+                      metavar='UPLOAD',
+                      help='Specify an upload destination')
+    parser.add_option("-k", "--key",
+                      dest='keyid',
+                      help="Specify the key ID to be used for signing.")
+    parser.add_option('--dont-sign',
+                      dest='key', action='store_false',
+                      help='Do not sign the upload.')
+    parser.add_option('-y', '--yes',
+                      dest='prompt',
+                      default=True,
+                      action='store_false',
+                      help='Do not prompt before uploading to a PPA')
+    parser.add_option('-v', '--version',
+                      metavar='VERSION',
+                      help='Package version to backport (or verify)')
+    parser.add_option('-w', '--workdir',
+                      metavar='WORKDIR',
+                      help='Specify a working directory '
+                           '(default: temporary dir)')
+    parser.add_option('-r', '--release-pocket',
+                      default=False,
+                      action='store_true',
+                      help='Target the release pocket in the .changes file. '
+                           'Necessary (and default) for uploads to PPAs')
+    parser.add_option('-c', '--close',
+                      metavar='BUG',
+                      help='Bug to close in the changelog entry.')
+    parser.add_option('-m', '--mirror',
+                      metavar='URL',
+                      help='Preferred mirror (default: Launchpad)')
+    parser.add_option('-l', '--lpinstance',
+                      metavar='INSTANCE',
+                      help='Launchpad instance to connect to '
+                           '(default: production)')
+    parser.add_option('--no-conf',
+                      default=False,
+                      action='store_true',
+                      help="Don't read config files or environment variables")
+
+    opts, args = parser.parse_args(args)
+    if len(args) != 1:
+        parser.error('You must specify a single source package or a .dsc '
+                     'URL/path.')
+    config = UDTConfig(opts.no_conf)
+    if opts.builder is None:
+        opts.builder = config.get_value('BUILDER')
+    if not opts.update:
+        opts.update = config.get_value('UPDATE_BUILDER', boolean=True)
+    if opts.workdir is None:
+        opts.workdir = config.get_value('WORKDIR')
+    if opts.lpinstance is None:
+        opts.lpinstance = config.get_value('LPINSTANCE')
+    if opts.upload is None:
+        opts.upload = config.get_value('UPLOAD')
+    if opts.keyid is None:
+        opts.keyid = config.get_value('KEYID')
+    if not opts.upload and not opts.workdir:
+        parser.error('Please specify either a working dir or an upload target!')
+    if opts.upload and opts.upload.startswith('ppa:'):
+        opts.release_pocket = True
+
+    return opts, args, config
+
+
+def find_release_package(mirror, workdir, package, version, source_release,
+                         config):
+    srcpkg = None
+
+    if source_release:
+        distribution = codename_to_distribution(source_release)
+        if not distribution:
+            error('Unknown release codename %s' % source_release)
+        info = vendor_to_distroinfo(distribution)()
+        source_release = info.codename(source_release, default=source_release)
+    else:
+        distribution = system_distribution()
+    mirrors = [mirror] if mirror else []
+
+    mirrors.append(config.get_value('%s_MIRROR' % distribution.upper()))
+
+    if not version:
+        archive = Distribution(distribution.lower()).getArchive()
+        try:
+            spph = archive.getSourcePackage(package, source_release)
+        except (SeriesNotFoundException, PackageNotFoundException), e:
+            error(str(e))
+        version = spph.getVersion()
+
+    if distribution == 'Debian':
+        srcpkg = DebianSourcePackage(package,
+                                     version,
+                                     workdir=workdir,
+                                     mirrors=mirrors)
+    elif distribution == 'Ubuntu':
+        srcpkg = UbuntuSourcePackage(package,
+                                     version,
+                                     workdir=workdir,
+                                     mirrors=mirrors)
+
+    return srcpkg
+
+def find_package(mirror, workdir, package, version, source_release, config):
+    "Returns the SourcePackage"
+    if package.endswith('.dsc'):
+        return SourcePackage(version=version, dscfile=package,
+                             workdir=workdir, mirrors=(mirror,))
+
+    if not source_release and not version:
+        info = vendor_to_distroinfo(system_distribution())
+        source_release = info().devel()
+
+    srcpkg = find_release_package(mirror, workdir, package, version,
+                                  source_release, config)
+    if version and srcpkg.version != version:
+        error('Requested backport of version %s but version of %s in %s is %s'
+              % (version, package, source_release, srcpkg.version))
+
+    return srcpkg
+
+def get_backport_version(version, suffix, upload, release):
+    distribution = codename_to_distribution(release)
+    if not distribution:
+        error('Unknown release codename %s' % release)
+    series = Distribution(distribution.lower()).\
+        getSeries(name_or_version=release)
+
+    backport_version = version + ('~%s%s.1' % (distribution.lower(), series.version))
+    if suffix is not None:
+        backport_version += suffix
+    elif upload and upload.startswith('ppa:'):
+        backport_version += '~ppa1'
+    return backport_version
+
+def get_old_version(source, release):
+    try:
+        distribution = codename_to_distribution(release)
+        archive = Distribution(distribution.lower()).getArchive()
+        pkg = archive.getSourcePackage(source,
+                                       release,
+                                       ('Release', 'Security', 'Updates',
+                                        'Proposed', 'Backports'))
+        return pkg.getVersion()
+    except (SeriesNotFoundException, PackageNotFoundException), e:
+        pass
+
+def get_backport_dist(release, release_pocket):
+    if release_pocket:
+        return release
+    else:
+        return '%s-backports' % release
+
+def do_build(workdir, dsc, release, builder, update):
+    builder = get_builder(builder)
+    if not builder:
+        return
+
+    if update:
+        if 0 != builder.update(release):
+            sys.exit(1)
+
+    # builder.build is going to chdir to buildresult:
+    workdir = os.path.realpath(workdir)
+    return builder.build(os.path.join(workdir, dsc),
+                         release,
+                         os.path.join(workdir, "buildresult"))
+
+def do_upload(workdir, package, bp_version, changes, upload, prompt):
+    print 'Please check %s %s in file://%s carefully!' % \
+          (package, bp_version, workdir)
+    if prompt or upload == 'ubuntu':
+        question = 'Do you want to upload the package to %s' % upload
+        answer = YesNoQuestion().ask(question, "yes")
+        if answer == "no":
+            return
+
+    check_call(['dput', upload, changes], cwd=workdir)
+
+def orig_needed(upload, workdir, pkg):
+    '''Avoid a -sa if possible'''
+    if not upload or not upload.startswith('ppa:'):
+        return True
+    ppa = upload.split(':', 1)[1]
+    user, ppa = ppa.split('/', 1)
+
+    version = pkg.version.upstream_version
+
+    h = Http()
+    for filename in glob.glob(os.path.join(workdir,
+            '%s_%s.orig*' % (pkg.source, version))):
+        url = ('https://launchpad.net/~%s/+archive/%s/+files/%s'
+               % (user, ppa, filename))
+        try:
+            headers, body = h.request(url, 'HEAD')
+            if headers.status != 200:
+                return True
+        except HttpLib2Error, e:
+            Logger.info(e)
+            return True
+    return False
+
+def do_backport(workdir, pkg, suffix, close, release, release_pocket, build,
+                builder, update, upload, keyid, prompt):
+    dirname = '%s-%s' % (pkg.source, release)
+    srcdir = os.path.join(workdir, dirname)
+
+    if os.path.exists(srcdir):
+        question = 'Working directory %s already exists. Delete it?' % srcdir
+        if YesNoQuestion().ask(question, 'no') == 'no':
+            sys.exit(1)
+        shutil.rmtree(srcdir)
+
+    pkg.unpack(dirname)
+
+    bp_version = get_backport_version(pkg.version.full_version, suffix,
+                                      upload, release)
+    old_version = get_old_version(pkg.source, release)
+    bp_dist = get_backport_dist(release, release_pocket)
+
+    changelog = 'No-change backport to %s' % (release,)
+    if close:
+        changelog += ' (LP: #%s)' % (close,)
+    check_call(['dch',
+                '--force-bad-version',
+                '--force-distribution',
+                '--preserve',
+                '--newversion', bp_version,
+                '--distribution', bp_dist,
+                changelog],
+               cwd=srcdir)
+
+    cmd = ['debuild', '--no-lintian', '-S', '-nc', '-uc', '-us']
+    if orig_needed(upload, workdir, pkg):
+        cmd.append('-sa')
+    else:
+        cmd.append('-sd')
+    if old_version:
+        cmd.append('-v%s' % old_version)
+    env = os.environ.copy()
+    # An ubuntu.com e-mail address would make dpkg-buildpackage fail if there
+    # wasn't an Ubuntu maintainer for an ubuntu-versioned package. LP: #1007042
+    env.pop('DEBEMAIL', None)
+    check_call(cmd, cwd=srcdir, env=env)
+
+    fn_base = pkg.source + '_' + bp_version.split(':', 1)[-1]
+    changes = fn_base + '_source.changes'
+
+    if build:
+        if 0 != do_build(workdir, fn_base + '.dsc', release, builder, update):
+            sys.exit(1)
+    if keyid != False:
+        cmd = ['debsign']
+        if keyid:
+            cmd.append('-k' + keyid)
+        cmd.append(changes)
+        check_call(cmd, cwd=workdir)
+    if upload:
+        do_upload(workdir, pkg.source, bp_version, changes, upload, prompt)
+
+    shutil.rmtree(srcdir)
+
+def main(args):
+    ubu_email()
+
+    opts, (package_or_dsc,), config = parse(args[1:])
+
+    Launchpad.login_anonymously(service=opts.lpinstance)
+
+    if not opts.dest_releases:
+        distinfo = lsb_release.get_distro_information()
+        try:
+            opts.dest_releases = [distinfo['CODENAME']]
+        except KeyError:
+            error('No destination release specified and unable to guess yours.')
+
+    if opts.workdir:
+        workdir = os.path.expanduser(opts.workdir)
+    else:
+        workdir = tempfile.mkdtemp(prefix='backportpackage-')
+
+    if not os.path.exists(workdir):
+        os.makedirs(workdir)
+
+    try:
+        pkg = find_package(opts.mirror,
+                           workdir,
+                           package_or_dsc,
+                           opts.version,
+                           opts.source_release,
+                           config)
+        pkg.pull()
+
+        for release in opts.dest_releases:
+            do_backport(workdir,
+                        pkg,
+                        opts.suffix,
+                        opts.close,
+                        release,
+                        opts.release_pocket,
+                        opts.build,
+                        opts.builder,
+                        opts.update,
+                        opts.upload,
+                        opts.key,
+                        opts.prompt)
+    except DownloadError, e:
+        error(str(e))
+    finally:
+        if not opts.workdir:
+            shutil.rmtree(workdir)
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))

=== renamed file 'backportpackage' => 'backportpackage.moved'
=== added directory 'bash_completion'
=== renamed directory 'bash_completion' => 'bash_completion.moved'
=== added file 'bash_completion/pbuilder-dist'
--- bash_completion/pbuilder-dist	1970-01-01 00:00:00 +0000
+++ bash_completion/pbuilder-dist	2012-09-12 18:51:22 +0000
@@ -0,0 +1,46 @@
+# pbuilder-dist completion
+#
+# Copyright 2008 Stephan Hermann <sh@sourcecode.de>, created for
+# the Ubuntu MOTU Team.
+#
+# Released under the GNU General Public License, version 2
+#
+# Based upon cobwuilder's autocompletion, Copyright 2007 Cyril
+# Brulebois <cyril.brulebois@enst-bretagne.fr>
+
+have pbuilder-dist &&
+_pbuilder-dist()
+{
+    local cur prev options
+
+    COMPREPLY=()
+    cur=${COMP_WORDS[COMP_CWORD]}
+    prev=${COMP_WORDS[COMP_CWORD-1]}
+
+    options='create update build clean login execute'
+
+    case $prev in
+        build)
+            _filedir "dsc"
+            ;;
+        *)
+            COMPREPLY=( $( compgen -W "$options" | grep "^$cur" ) )
+            ;;
+    esac
+
+    return 0
+}
+[ "$have" ] && _pbuilder-aliases()
+{
+    local distro builder arch
+    for distro in $(ubuntu-distro-info --all; debian-distro-info --all) stable testing unstable; do
+        for builder in pbuilder cowbuilder; do
+            echo "$builder-$distro"
+            for arch in i386 amd64 armel armhf; do
+                echo "$builder-$distro-$arch"
+            done
+        done
+    done
+    return 0
+}
+[ "$have" ] && complete -F _pbuilder-dist -o filenames pbuilder-dist cowbuilder-dist $(_pbuilder-aliases)

=== added file 'bitesize'
--- bitesize	1970-01-01 00:00:00 +0000
+++ bitesize	2012-09-12 18:51:22 +0000
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+"""Add 'bitesize' tag to bugs and add a comment."""
+
+# Copyright (c) 2011 Canonical Ltd.
+#
+# bitesize is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3, or (at your option) any
+# later version.
+#
+# bitesize is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with bitesize; see the file COPYING.  If not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# Authors:
+#  Daniel Holbach <daniel.holbach@canonical.com>
+
+import sys
+from optparse import OptionParser
+
+from launchpadlib.launchpad import Launchpad
+from launchpadlib.errors import HTTPError
+
+from devscripts.logger import Logger
+
+from ubuntutools.config import UDTConfig
+
+def error_out(msg):
+    Logger.error(msg)
+    sys.exit(1)
+
+def save_entry(entry):
+    try:
+        entry.lp_save()
+    except HTTPError, error:
+        error_out(error.content)
+
+def tag_bug(bug):
+    bug.tags = bug.tags + ['bitesize'] # LP: #254901 workaround
+    save_entry(bug)
+
+def main():
+    usage = "Usage: %prog <bug number>"
+    opt_parser = OptionParser(usage)
+    opt_parser.add_option("-l", "--lpinstance", metavar="INSTANCE",
+                          help="Launchpad instance to connect to "
+                               "(default: production)",
+                          dest="lpinstance", default=None)
+    opt_parser.add_option("--no-conf",
+                          help="Don't read config files or "
+                               "environment variables.",
+                          dest="no_conf", default=False, action="store_true")
+    (options, args) = opt_parser.parse_args()
+    config = UDTConfig(options.no_conf)
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value("LPINSTANCE")
+    if len(args) < 1:
+        opt_parser.error("Need at least one bug number.")
+
+    launchpad = Launchpad.login_with("ubuntu-dev-tools", options.lpinstance)
+    if launchpad is None:
+        error_out("Couldn't authenticate to Launchpad.")
+
+    # check that the new main bug isn't a duplicate
+    try:
+        bug = launchpad.bugs[args[0]]
+    except HTTPError, error:
+        if error.response.status == 401:
+            error_out("Don't have enough permissions to access bug %s. %s" % \
+                      (args[0], error.content))
+        else:
+            raise
+    if 'bitesize' in bug.tags:
+        error_out("Bug is already marked as 'bitesize'.")
+    bug.newMessage(content="I'm marking this bug as 'bitesize' as it looks "
+                           "like an issue that is easy to fix and suitable "
+                           "for newcomers in Ubuntu development. If you need "
+                           "any help with fixing it, talk to me about it.")
+    bug.subscribe(person=launchpad.me)
+    tag_bug(launchpad.bugs[bug.id]) # fresh bug object, LP: #336866 workaround
+
+if __name__ == '__main__':
+    main()

=== renamed file 'bitesize' => 'bitesize.moved'
=== added file 'check-mir'
--- check-mir	1970-01-01 00:00:00 +0000
+++ check-mir	2012-09-12 18:51:22 +0000
@@ -0,0 +1,151 @@
+#!/usr/bin/python
+#
+# Check components of build dependencies and warn about universe/multiverse
+# ones, for a package destined for main/restricted
+#
+# Copyright (C) 2011 Canonical
+#
+# Authors:
+#  Martin Pitt
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 3.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+import sys
+import optparse
+import os.path
+
+import apt
+
+
+def check_support(apt_cache, pkgname, alt=False):
+    '''Check if pkgname is in main or restricted.
+
+    This prints messages if a package is not in main/restricted, or only
+    partially (i. e. source in main, but binary in universe).
+    '''
+    if alt:
+        prefix = '  ... alternative ' + pkgname
+    else:
+        prefix = ' * ' + pkgname
+
+    try:
+        pkg = apt_cache[pkgname]
+    except KeyError:
+        print >> sys.stderr, prefix, 'does not exist (pure virtual?)'
+        return False
+
+    section = pkg.candidate.section
+    if section.startswith('universe') or section.startswith('multiverse'):
+        # check if the source package is in main and thus will only need binary
+        # promotion
+        source_records = apt.apt_pkg.SourceRecords()
+        if not source_records.lookup(pkg.candidate.source_name):
+            print >> sys.stderr, 'ERROR: Cannot lookup source package for', \
+                                 pkg.name
+            print prefix, 'package is in', section.split('/')[0]
+            return False
+        src = apt.apt_pkg.TagSection(source_records.record)
+        if (src['Section'].startswith('universe') or
+            src['Section'].startswith('multiverse')):
+            print prefix, 'binary and source package is in', \
+                  section.split('/')[0]
+            return False
+        else:
+            print prefix, 'is in', section.split('/')[0] + ', but its source', \
+                  pkg.candidate.source_name, \
+                  ('is already in main; file an ubuntu-archive bug for '
+                   'promoting the current preferred alternative')
+            return True
+
+    if alt:
+        print prefix, 'is already in main; consider preferring it'
+
+    return True
+
+def check_build_dependencies(apt_cache, control):
+    print 'Checking support status of build dependencies...'
+
+    any_unsupported = False
+
+    for field in ('Build-Depends', 'Build-Depends-Indep'):
+        if field not in control.section:
+            continue
+        for or_group in apt.apt_pkg.parse_src_depends(control.section[field]):
+            pkgname = or_group[0][0]
+            if not check_support(apt_cache, pkgname):
+                # check non-preferred alternatives
+                for altpkg in or_group[1:]:
+                    if check_support(apt_cache, altpkg[0], alt=True):
+                        break
+                else:
+                    any_unsupported = True
+
+    return any_unsupported
+
+def check_binary_dependencies(apt_cache, control):
+    any_unsupported = False
+
+    print '\nChecking support status of binary dependencies...'
+    while True:
+        try:
+            control.next()
+        except StopIteration:
+            break
+
+        for field in ('Depends', 'Pre-Depends', 'Recommends'):
+            if field not in control.section:
+                continue
+            for or_group in apt.apt_pkg.parse_depends(control.section[field]):
+                pkgname = or_group[0][0]
+                if pkgname.startswith('$'):
+                    continue
+                if not check_support(apt_cache, pkgname):
+                    # check non-preferred alternatives
+                    for altpkg in or_group[1:]:
+                        if check_support(apt_cache, altpkg[0], alt=True):
+                            break
+                    else:
+                        any_unsupported = True
+
+    return any_unsupported
+
+def main():
+    description = "Check if any of a package's build or binary " + \
+                  "dependencies are in universe or multiverse. " + \
+                  "Run this inside an unpacked source package"
+    parser = optparse.OptionParser(description=description)
+    parser.parse_args()
+    apt_cache = apt.Cache()
+
+    if not os.path.exists('debian/control'):
+        print >> sys.stderr, ('debian/control not found. You need to run '
+                              'this tool in a source package directory')
+        sys.exit(1)
+
+    # get build dependencies from debian/control
+    control = apt.apt_pkg.TagFile(open('debian/control'))
+    control.next()
+
+    unsupported_build_deps = check_build_dependencies(apt_cache, control)
+    unsupported_binary_deps = check_binary_dependencies(apt_cache, control)
+
+    if unsupported_build_deps or unsupported_binary_deps:
+        print ('\nPlease check https://wiki.ubuntu.com/MainInclusionProcess if '
+               'this source package needs to get into in main/restricted, or '
+               'reconsider if the package really needs above dependencies.')
+    else:
+        print 'All dependencies are supported in main or restricted.'
+
+if __name__ == '__main__':
+    main()

=== renamed file 'check-mir' => 'check-mir.moved'
=== added file 'check-symbols'
--- check-symbols	1970-01-01 00:00:00 +0000
+++ check-symbols	2012-09-12 18:51:22 +0000
@@ -0,0 +1,134 @@
+#!/bin/bash
+#
+# Copyright (C) 2006-2007 Daniel Holbach <daniel.holbach@ubuntu.com>
+# Modified by Siegfried-A. Gevatter <rainct@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-2 for more details.
+#
+# ##################################################################
+#
+# This script is used to get a diff of the exported symbols of all .so files in
+# every binary package of package $1.
+
+# Required tools (besides awk, coreutils, grep and sed):
+# * apt-cache and apt-get (from apt)
+# * diff (from diffutils)
+# * dpkg
+# * lsb_release (from lsb-release)
+# * nm (from binutils)
+
+DISTRO=$(lsb_release -c -s)
+DEBLINE=""
+DEBUG=False
+
+usage() {
+    prog=$(basename $0)
+    cat <<EOF
+Usage: $prog [options] source-package [DEBDIR]
+
+Get a diff of the exported symbols of all .so files in every binary package of
+package the source package. The source package will be found in DEBDIR, defaulting to /var/cache/pbuilder/result.
+
+Options:
+  -h, --help  show this help message and exit
+EOF
+    exit $1
+}
+
+PACKAGE=""
+DEBDIR="/var/cache/pbuilder/result"
+POSITION=0
+while [ $# -gt 0 ]; do
+    case "$1" in
+        -h|--help)
+            usage 0
+            ;;
+        -*)
+            usage 1
+            ;;
+        *)
+            if [ $POSITION -eq 0 ]; then
+                PACKAGE="$1"
+            elif [ $POSITION -eq 1 ]; then
+                DEBDIR="$1"
+            else
+                echo "Too many arguments." >&2
+                usage 1
+            fi
+            POSITION=$(($POSITION+1))
+    esac
+    shift
+done
+
+if [ $POSITION -eq 0 ]; then
+    echo "Missing argument: source package name." >&2
+    usage 1
+fi
+
+VERSION=$(apt-cache madison "$PACKAGE" | grep -- "$DISTRO"'/.*Sources$' | awk '{print $3}')
+PACKAGES=$(apt-cache showsrc "$PACKAGE" | grep-dctrl -s Binary -F Version "$VERSION" | sed 's/Binary\:\ //g;s/\,//g' | sort -u)
+
+if [ `id -u` != "0" ]
+then
+    echo
+    echo -n "You might now be asked for your password, as this script requires"
+    echo " sudo privilegies in order to install the packages you want to check."
+    echo
+fi
+
+sudo apt-get install $PACKAGES
+echo
+
+for pack in $PACKAGES;
+do
+    for lib in `dpkg -L $pack | grep -E "\.so$" | sort -u`
+    do
+        LIBNAME=$(basename $lib)
+        nm -D $lib | cut -d' ' -f3 | sort -u > /tmp/$LIBNAME.old
+    done;
+    DEBLINE="$DEBLINE $DEBDIR/$pack*.deb "
+done
+
+if [[ -z $DEBLINE ]]; then
+    echo "Package doesn't exist: $PACKAGE."
+    exit 1
+fi
+
+NOFILE=True
+for filename in $DEBLINE; do
+    if [[ ${filename: -5} != "*.deb" ]]; then
+        NOFILE=False
+        [[ $DEBUG != True ]] || echo "Found binary file: $filename"
+    fi
+done
+
+if [[ $NOFILE == True ]]; then
+    echo "No matching binary files found in «$DEBDIR»."
+    exit 1
+fi
+
+sudo dpkg -i $DEBLINE;
+echo
+
+for pack in $PACKAGES;
+do
+    for lib in `dpkg -L $pack | grep -E "\.so$" | sort -u`
+    do
+        LIBNAME=$(basename $lib)
+        nm -D $lib | cut -d' ' -f3 | sort -u > /tmp/$LIBNAME.new
+        echo "Checking: $lib"
+        diff -u /tmp/$LIBNAME.{old,new}
+        rm /tmp/$LIBNAME.{old,new}
+    done;
+done

=== renamed file 'check-symbols' => 'check-symbols.moved'
=== added file 'dch-repeat'
--- dch-repeat	1970-01-01 00:00:00 +0000
+++ dch-repeat	2012-09-12 18:51:22 +0000
@@ -0,0 +1,192 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2007-2008 Canonical, Ltd.,
+#               2011,     Stefano Rivera <stefanor@ubuntu.com>
+# Author: Kees Cook <kees@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+#
+# This script is used to repeat a change log into an older release.  It
+# expects that --build-tree is laid out with each Ubuntu release as a
+# separate directory ("feisty", "edgy", etc).
+#
+# For example, if gimp had a security update prepared for Feisty in
+# $TREE/feisty/gimp-2.2.13, running "dch-repeat" in
+# $TREE/edgy/gimp-2.2.13 would pull in the latest changelog from the Feisty
+# build.
+
+use strict;
+use warnings;
+use Getopt::Long;
+use Cwd;
+use File::Glob ':glob';
+
+sub Usage
+{
+    print <<EOM;
+Usage: $0 [OPTIONS]
+ --build-tree PATH             Base of build trees
+ -s, --source-release RELEASE  Which release to snag a changelog from
+ --target-release RELEASE      Which release to build into
+ --devel-release RELEASE       Which release is the devel release
+ --pocket POCKET               Which pocket to use
+EOM
+    exit(0);
+}
+
+my @releases = undef;
+our $devel_release = undef;
+
+#Getopt::Long::Configure("bundling", "no_ignore_case");
+our $opt_build_tree = "/scratch/ubuntu/build";
+our $opt_pocket = undef;
+our $opt_package = undef;
+our $opt_source_release = undef;
+our $opt_target_release = undef;
+
+our $opt_help = undef;
+our $opt_verbose = undef;
+
+Usage() unless (GetOptions(
+    "build-tree=s",
+    "source-release|s=s",
+    "target-release=s",
+    "package|p=s",
+    "help|h",
+    "verbose|v",
+));
+Usage() if ($opt_help);
+
+@releases = split(/\s+/, `ubuntu-distro-info --supported`);
+$devel_release = `ubuntu-distro-info --devel`;
+chomp($devel_release);
+
+sub get_changelog($)
+{
+    my ($path) = @_;
+
+    open(LOG,"<$path/debian/changelog") || die "Cannot find changelog for '$path'\n";
+    my $log="";
+    my $line="";
+    # Skip to package name
+    $line = <LOG>;
+    # Collect changelog
+    while ($line=<LOG>) {
+        last if ($line=~/^\S/); # Stop on next changelog entry
+        $log.=$line;
+    }
+    close(LOG);
+    return $log;
+}
+
+sub replace_changelog($)
+{
+    my ($log) = @_;
+    open(LOG,"<debian/changelog") || die "Cannot find changelog\n";
+    open(NEWLOG,">debian/changelog.new") || die "Cannot write changelog\n";
+    my $line;
+    while ($line=<LOG>) {
+        last if ($line =~ /^\s*$/);
+        print NEWLOG $line || die "Changelog write failed: $!\n";
+    }
+    print NEWLOG $log || die "Changelog write failed: $!\n";
+    # Skip log items
+    while ($line=<LOG>) {
+        last if ($line =~ /^\S/);
+    }
+    print NEWLOG $line || die "Changelog write failed: $!\n";
+    while ($line=<LOG>) {
+        print NEWLOG $line || die "Changelog write failed: $!\n";
+    }
+    close(LOG);
+    close(NEWLOG) || die "Changelog close failed: $!\n";
+    rename("debian/changelog.new","debian/changelog") || die "Changelog rename failed: $!\n";
+}
+
+# By default examine Cwd for target release
+if (!defined($opt_target_release)) {
+    my $dir = getcwd;
+    if ($dir =~ m#^$opt_build_tree/([^/]+)/[^/]+$#) {
+        $opt_target_release = $1;
+    }
+    else {
+        die "No --target-release used, or current directory '$dir' outside of --build-tree of '$opt_build_tree'\n";
+    }
+}
+warn "target-release: '$opt_target_release'\n" if ($opt_verbose);
+
+# By default, examine changelog for package
+if (!defined($opt_package)) {
+    chomp($opt_package=`dpkg-parsechangelog | grep ^"Source: " | cut -d" " -f2`);
+    if ($opt_package eq "") {
+        die "Cannot figure out package name from changelog\n";
+    }
+}
+warn "package: '$opt_package\n" if ($opt_verbose);
+
+# By default, take changelog from newer release
+if (!defined($opt_source_release)) {
+    if ($opt_target_release eq $devel_release) {
+        die "No more recent release than '$devel_release' to take changelog from\n";
+    }
+    foreach my $i (0 .. $#releases) {
+        if ($releases[$i] eq $opt_target_release) {
+            $opt_source_release = $releases[$i+1];
+        }
+    }
+    if (!defined($opt_source_release)) {
+        die "Could not locate a newer release than '$releases[$#releases]'";
+    }
+}
+warn "source-release: '$opt_source_release\n" if ($opt_verbose);
+warn "devel-release: '$devel_release\n" if ($opt_verbose);
+
+# By default, use "security" pocket for non-devel releases
+if (!defined($opt_pocket)) {
+    if ($opt_target_release eq $devel_release) {
+        $opt_pocket = "";
+    }
+    else {
+        $opt_pocket = "security";
+    }
+}
+warn "pocket: '$opt_pocket'\n" if ($opt_verbose);
+
+# Source location
+my @dirs = grep((-d $_),bsd_glob("$opt_build_tree/$opt_source_release/$opt_package-*"));
+if (scalar(@dirs)==0) {
+    die "Cannot find '$opt_build_tree/$opt_source_release/$opt_package-*'\n";
+}
+elsif (scalar(@dirs)>1) {
+    warn "Multiple possible source dirs, using '$dirs[0]'\n";
+}
+warn "source dir: '$dirs[0]'\n" if ($opt_verbose);
+my $log = get_changelog($dirs[0]);
+my $args = "";
+if ($opt_pocket ne "") {
+    $args = "-s -D $opt_target_release-$opt_pocket";
+}
+else {
+    $args = "-i";
+}
+system("dch $args auto-changelog")==0 || die "dch failed: $!\n";
+replace_changelog($log);
+
+# Report!
+system("dpkg-parsechangelog");
+
+exit(0);

=== renamed file 'dch-repeat' => 'dch-repeat.moved'
=== added directory 'debian'
=== renamed directory 'debian' => 'debian.moved'
=== added file 'debian/NEWS'
--- debian/NEWS	1970-01-01 00:00:00 +0000
+++ debian/NEWS	2012-09-12 18:51:22 +0000
@@ -0,0 +1,49 @@
+ubuntu-dev-tools (0.135) unstable; urgency=low
+
+  reverse-build-depends was removed from ubuntu-dev-tools. reverse-depends -b
+  is equivalent.
+
+ -- Stefano Rivera <stefanor@debian.org>  Sat, 12 Nov 2011 13:11:21 +0200
+
+ubuntu-dev-tools (0.131) unstable; urgency=low
+
+  get-build-deps was removed from ubuntu-dev-tools. The newer mk-build-deps in
+  devscripts is equivalent (with the -ir options).
+
+ -- Stefano Rivera <stefanor@debian.org>  Sat, 10 Sep 2011 00:13:18 +0200
+
+ubuntu-dev-tools (0.129) unstable; urgency=low
+
+  Several tools that worked against Launchpad but were not specific to Ubuntu
+  have been migrated to the "lptools" project.
+
+  The following tools have moved:
+   - get-branches (renamed to lp-get-branches)
+   - grab-attachments (renamed to lp-grab-attachments)
+   - lp-project-upload
+   - lp-list-bugs
+   - lp-set-dup
+   - lp-shell
+
+  They can now be found in the lptools package (version 0.0.1~bzr28-1 or
+  later).
+
+ -- Jelmer Vernooij <jelmer@debian.org>  Fri, 02 Sep 2011 13:43:34 +0200
+
+ubuntu-dev-tools (0.119) unstable; urgency=low
+
+  launchpadlib 1.9 will cause some issues, as it uses the GNOME Keyring / KDE
+  wallet to store credentials.
+  https://help.launchpad.net/API/ThirdPartyIntegration
+
+  Known issues and workarounds:
+
+  Seeing keyring.backend.PasswordSetError or gnomekeyring.IOError when
+  using ubuntu-dev-tools on a remote machine?
+  Try ssh -X and run export `dbus-launch` in the ssh session.
+
+  Otherwise, uninstalling python-gnomekeyring will force the credentials to be
+  stored in ~/keyring_pass.cfg instead of a keyring, and bypass all these
+  issues.
+
+ -- Stefano Rivera <stefanor@debian.org>  Tue, 01 Mar 2011 15:01:01 +0200

=== added file 'debian/changelog'
--- debian/changelog	1970-01-01 00:00:00 +0000
+++ debian/changelog	2012-09-12 18:51:22 +0000
@@ -0,0 +1,2980 @@
+ubuntu-dev-tools (0.143) unstable; urgency=low
+
+  [ Iain Lane ]
+  * backportpackage: Fix filenames searched when looking for existing
+    .orig.tar.foo files (to determine if we need to upload it again or not).
+    (LP: #1007908)
+  * backportpackage: Unset DEBEMAIL when building source package. Fixes error
+    when building backports for packages with no Ubuntu changes.
+    (LP: #1007042)
+
+  [ Mathieu Trudel-Lapierre ]
+  * mk-sbuild: use and update messages to suggest using the source:$chroot way
+    of referring to source chroots instead of $chroot-source; since the latter
+    does not work with btrfs snapshot-based chroots. (LP: #1014669)
+
+  [ Lars Düsing ]
+  * Corrected brackets in man-page for sponsor-patch.
+
+  [ Stefano Rivera ]
+  * pbuilder-dist: Don't try to enable -updates for the current codename
+    referring to Debian testing, either (LP: #1011870)
+  * Correct spelling mistakes in package description, thanks Logan Rosen for
+    the patch (Closes: #678245)
+  * Correct metavar for --mirror in backportpackage (LP: #999727)
+  * submittodebian: Explitictly UTF-8 encode the bug body (LP: #1005834)
+  * backportpackage.1: Document --key and --dont-sign (LP: #1007564)
+  * seeded-in-ubuntu: Catch errors in parsing data, and don't keep unreadable
+    data cached (LP: #1008783)
+  * ubuntutools.archive: Improve error handling around rmadison calls
+    (LP: #1010951)
+  * submittodebian; Unset DEBEMAIL when building source package.
+    (LP: #1015066)
+
+  [ Benjamin Drung ]
+  * Add a man page for the reverse-build-depends wrapper script.
+
+ -- Benjamin Drung <bdrung@debian.org>  Fri, 22 Jun 2012 13:34:43 +0200
+
+ubuntu-dev-tools (0.142) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * mk-sbuild: Support kmod, when checking for overlayfs availability.
+  * pbuilder-dist: improve bash_completion for *.dsc files. Thanks Maarten
+    Bezemer. (Closes: #670924, LP: #770529)
+  * check-mir, check-symbols, grep-merges, pbuilder-dist-simple,
+    setup-packaging-environment, submittodebian, ubuntu-iso:
+    Do enough argument parsing to handle --help (LP: #988009)
+  * dgetlp: Require a UTF-8 locale, or it'll crash when displaying errors
+    (LP: #979117)
+  * pbuilder-dist: Don't try to enable -updates for Debian testing
+    (LP: #993006)
+  * pbuilder-dist, pull-debian-source, pull-lp-source, requestsync,
+    reverse-depends, submittodebian, syncpackage:
+    Handle outdated distro-info data. Fall back to sane defaults where
+    possible. (Closes: #673957)
+  * backportpackage: Avoid uploading orig tarballs if they are already present
+    in the destination PPA (LP: #691897)
+  * Allow mk-sbuild to be run by root if a configuration file exists
+    (LP: #888736)
+  * backportpackage: Allow unsigned backports (LP: #992739)
+  * update-maintainer: Add a function to restore the original maintainer.
+    - Update sponsor-patch to use the new API resulting from this change
+      (LP: #1002999)
+  * submittodebian: Revert Ubuntu Maintainer mangling, and re-build the source
+    package before diffing. (LP: #902233)
+
+  [ Evan Broder ]
+  * backportpackage: Add -c, --close flag to include a changelog closer.
+  * backportpackage: Switch to ~ubuntu12.04.1-style version numbers
+    instead of ~precise1, to make our version numbers more future-proof.
+  * backportpackage: Pass -v to debuild with last published version
+    number. This matches the way backports have traditionally been
+    generated by archive admins.
+
+ -- Stefano Rivera <stefanor@debian.org>  Mon, 28 May 2012 23:35:52 +0100
+
+ubuntu-dev-tools (0.141) unstable; urgency=low
+
+  * syncpackage: Log into Launchpad anonymously with --no-lp
+    (LP: #979849)
+  * seeded-in-ubuntu: Log into Launchpad anonymously.
+
+ -- Stefano Rivera <stefanor@debian.org>  Thu, 12 Apr 2012 23:46:24 +0200
+
+ubuntu-dev-tools (0.140) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * Bump Standards-Version to 3.9.3, no changes needed.
+  * Update machine-readable copyright Format to 1.0.
+  * pbuilder-dist: Use the same chroot, whether the system-architecture was
+    the supplied architecture or was chosen by default (LP: #943435)
+  * backportpackage
+    - Prompt to delete existing workdirs (LP: #885514)
+    - Support a BACKPORTPACKAGE_UPLOAD configuration/enviornment variable
+      (LP: #693217)
+  * requestsync:
+    - New packages from non-free or contrib go into multiverse (LP: #935643)
+    - Catch SeriesNotFoundException and display a friendly error (LP: #963888)
+
+  [ Daniel Hahler ]
+  * ubuntutools/archive.py: use ProxyHandler in _download_file.
+    This makes use of the system proxy (e.g. http_proxy).
+  * pbuilder-dist: Do not force default value for `--aptcache` argument
+    (LP: #956903)
+
+  [ John S Gruber ]
+  * Don't use --override-config with operations other than update.
+    (LP: #409696)
+
+ -- Stefano Rivera <stefanor@debian.org>  Thu, 29 Mar 2012 00:01:40 +0200
+
+ubuntu-dev-tools (0.139) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * syncpackage, backportpackage, sponsor-patch: Use -nc when building source
+    packages. Avoids needing build-deps on the build machine.
+  * sponsor-patch:
+    - Determine the task from the UDD branch.
+    - Support syncs of new packages.
+    - Support syncs from a non-default series (LP: #931644)
+    - Check for dependencies that the package doesn't Depend on. Recommend
+      dput, lintian, patch, quilt. (LP: #846385)
+  * Re-add dgetlp. Still needed for downloading source packages from +queue.
+    (LP: #919805)
+  * pbuilder-dist:
+    - Export DISTRIBUTION and ARCHITECTURE as well as DIST and ARCH. Thanks
+      Alessio Treglia. (Closes: #659060, LP: #423609)
+    - Pass DEB_BUILD_OPTIONS through (LP: #685786)
+  * reverse-depends: Now that Debian is supported server-side:
+    - Convert Debian release aliases to codenames.
+    - Default to the devel release of the vendor distribution.
+    - Provide transitional reverse-build-depends wrapper to help users
+      discover reverse-depends. (LP: #910420)
+  * backportpackage: Map Debian release aliases to codenames (LP: #918231)
+
+  [ Evan Broder]
+  * sponsor-patch, requestsync, syncpackage: Add a config variable for -k
+    arguments.
+
+ -- Stefano Rivera <stefanor@debian.org>  Wed, 15 Feb 2012 17:21:39 +0200
+
+ubuntu-dev-tools (0.138) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * sponsor-patch:
+    - Use syncpackage instead of subscribing ubuntu-archive for sync requests,
+      because syncpackage supports sponsorship now.
+    - Check if the sponsored bug is marked as duplicate (LP: #896733).
+    - Allow user to override sanity checks (LP: #896733).
+
+  [ Stefano Rivera ]
+  * Correct reference to qemu-user-static in pbuilder-dist.1 (Closes: #651999)
+  * mk-sbuild: Don't install devscripts by default (LP: #904502)
+  * backportpackage: Add --release-pocket option, rather than relying entirely
+    on heuristics (Closes: #651546)
+  * syncpackage: Mention sponsorship when closing bugs (LP: #904288)
+
+ -- Benjamin Drung <bdrung@debian.org>  Wed, 21 Dec 2011 22:38:35 +0100
+
+ubuntu-dev-tools (0.137) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * mk-sbuild: Make --eatmydata command line flag actually work.
+  * Remove dgetlp. No longer needed.
+  * Use httplib2 everywhere that we do https. The python stdlib doesn't do
+    certificate verification.
+  * requestbackport:
+    - Check for existing backport bugs first.
+    - Check that there are published binaries (i.e. not stuck in bin-NEW).
+  * pull-lp-source, requestbackport: Take the latest version from any
+    non-backports pocket. Implemented by making lpapicache's getSourcePackage
+    smarter.
+  * sponsor-patch: Build a source package for lintian to run on, when not
+    test-building syncs.
+  * sponsor-patch: Check the bug's title, not the task, when determining
+    source series for syncs.
+  * mk-sbuild, pbuilder-dist, ubuntu-build: Add armhf.
+  * pull-debian-source, pull-lp-source: Resolve the source package (via DDE),
+    if a binary package was requested (LP: #617349)
+  * submittodebian:
+    - Do the report boiler-plate checking in a script that wraps an editor, so
+      that we only edit the report once, after checking for duplicates.
+    - rm the tmpdir with a little more force (shutil.rmtree) (LP: #899399)
+  * New Tools: (LP: #876554)
+    - ubuntu-upload-permission: Query upload permissions.
+    - seeded-in-ubuntu: Query a package's seed status. Whether it is on
+      current daily images and/or part of the supported seed.
+  * syncpackage: Support sponsorship for native-syncs, now that LP does.
+
+  [ Andreas Moog ]
+  * sponsor-patch: Check permission to unsubscribe sponsors-team (LP: #896884)
+  * grep-merges: We already require a UTF-8 enabled terminal, so encode
+    package and uploader name in UTF-8 (LP: #694388)
+  * requestsync: Give user option to retry in case of temporary error
+    (LP: #850360)
+
+ -- Stefano Rivera <stefanor@debian.org>  Fri, 09 Dec 2011 12:59:29 +0200
+
+ubuntu-dev-tools (0.136) unstable; urgency=low
+
+  [ Marc Deslauriers ]
+  * mk-sbuild,doc/mk-sbuild.1: switch from aufs to overlayfs, as aufs is no
+    longer in the Precise kernel.
+
+  [ Stefano Rivera ]
+  * mk-sbuild,doc/mk-sbuild.1: aufs may still be used if overlayfs isn't
+    available (as is the case on Debian).
+  * mk-sbuild: debootstrap with all components, so that eatmydata can be
+    installed.
+  * EditFile: Don't try and store temporary files in /usr/bin.
+  * EditBugReport: Don't include a newline in the bug title.
+
+ -- Stefano Rivera <stefanor@debian.org>  Wed, 16 Nov 2011 14:33:04 +0200
+
+ubuntu-dev-tools (0.135) unstable; urgency=low
+
+  * grab-merge: Use wget -nv rather than -q, so that we see error messages
+    (LP: #881967)
+  * requestsync: Make --lp the default.
+  * submittodebian: Use prettier patch filenames (LP: #887333)
+  * mk-sbuild:
+    -Allow creating experimental chroots again (LP: #885499)
+    - experimental shouldn't be the default in experimental chroots.
+    - Add --eatmydata flag (LP: #888440)
+  * pbuilder-dist:
+    - Support using non-master mirrors. Thanks Mathieu Parent. (LP: #824285)
+    - Enable non-release pockets by default (LP: #781003)
+  * New scripts:
+    - reverse-depends: Replaces reverse-build-depends. Uses an UbuntuWire
+      webservice for determining all reverse(-build)-dependencies for a
+      package. (LP: #696373)
+    - requestbackport: Files a backport request bug report, including a full
+      testing checklist.
+  * Don't allow boilerplate prompts through in submittodebian and requestsync
+    (LP: #887336)
+  * Add changelog retrieval to lpapicache, and use this in syncpackage and
+    requestsync. The changelogs should be available in Launchpad sooner than
+    Debian PTS.
+
+ -- Stefano Rivera <stefanor@debian.org>  Tue, 15 Nov 2011 01:51:36 +0200
+
+ubuntu-dev-tools (0.134) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * mk-sbuild: Correct typo in variable name. Thanks Laurent Declercq.
+    (Closes: #645917)
+  * Remove massfile. Neglected and unused (LP: #145598)
+  * syncpackage, requestsync: Sync from testing for LTSs (LP: #876400)
+  * syncpackage:
+    - Ignore CURRENT blacklisting: it's buggy, and we don't have a good use
+      for it.
+    - Always display blacklist comments, if they exist.
+    - Display timestamps for DSD blacklist comments.
+    - Add --fakesync option, relegating --no-lp to really crazy corner cases.
+  * sponsor-patch: Compare new sync version to the current Ubuntu version,
+    rather than itself (LP: #878499)
+  * sponsor-patch.1: Mention syncs (LP: #882085)
+
+  [ Benjamin Drung ]
+  * syncpackage: Catch user abort.
+
+  [ Scott Moser ]
+  * mk-sbuild: better support apt http proxy (LP: #881654)
+
+ -- Stefano Rivera <stefanor@debian.org>  Fri, 28 Oct 2011 10:16:15 +0200
+
+ubuntu-dev-tools (0.133) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * mk-sbuild: Only grant access to the admin group when it exists
+    (Closes: #642824)
+  * Add Depends and Build-Depends for python-distro-info, which has split out
+    of distro-info.
+  * syncpackge: Gracefully deal with no available changelog from Debian (PTS
+    changelogs aren't available immediately)
+
+  [ Benjamin Drung ]
+  * syncpackage: Allow syncing to -proposed with --no-lp.
+
+ -- Benjamin Drung <bdrung@debian.org>  Wed, 19 Oct 2011 18:18:51 +0200
+
+ubuntu-dev-tools (0.132) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * sponsor-patch:
+    - Refactor code.
+    - Support sync requests and make ack-sync obsolete (LP: #764763).
+
+  [ Stefano Rivera ]
+  * syncpackage: Looks like we can't expect exactly one DSD record for every
+    source package (LP: #846890)
+
+ -- Benjamin Drung <bdrung@debian.org>  Thu, 22 Sep 2011 12:31:57 +0200
+
+ubuntu-dev-tools (0.131) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * doc/requestsync.1: Correct default value for REQUESTSYNC_SMTP_SERVER
+    (LP: #844992)
+  * import-bug-from-debian: Bugs are filed against source packages in Ubuntu.
+    (LP: #844734)
+  * Debian source publication records are all Published now, not pending
+    (LP: #845487)
+  * requestsync:
+    - Add nice error messages to gpg-signing code, rather than simple
+      assertions (LP: #537288)
+    - Extract current Ubuntu delta from changelog entries and provide for
+      editing (LP: #547925)
+  * submittodebian:
+    - Don't parse the entire changelog, to avoid bumping into past illegal
+      version numbers (LP: #727314)
+    - Iterate over changelog blocks rather than using Changelog's private
+      _blocks list.
+  * LP: #806633:
+    - ubuntutools.update_maintainer: Don't use strict changelog parsing
+    - sponsor-patch: Perform strict validation on the first changelog entry.
+  * setup-packaging-environment:
+    - Software Sources isn't on the Administration menu, post Gnome 2
+      (LP: #841975)
+    - Use apt-get rather than aptitude.
+  * Removed get-build-deps, mk-build-deps -ir is equivalent (LP: #158108)
+  * ubuntutools.archive:
+    - Add quiet option to silence downloading.
+    - Use wget-style progress bar (fixed width) (LP: #845787)
+  * Bump python-debian B-D and Depends to 0.1.20 for unicode Changelog
+    reading.
+  * backportpackage: Use absolute path of workdir when test-building.
+
+  [ Colin Watson ]
+  * syncpackage: Fix typo.
+
+  [ Benjamin Drung ]
+  * ubuntutools/requestsync: Follow PEP 8 naming conventions.
+
+ -- Stefano Rivera <stefanor@debian.org>  Sat, 10 Sep 2011 16:48:23 +0200
+
+ubuntu-dev-tools (0.130) unstable; urgency=low
+
+  * pull-lp-source: Support source packages with a bad version string
+    (LP: #844682).
+  * backportpackage:
+    - Search for newer versions in -{updates,security} on Ubuntu (LP: #823833).
+    - Use Ubuntu and Debian as fall back check in codename_to_distribution to
+      allow backporting to Ubuntu from a Debian system (LP: #823832).
+
+ -- Benjamin Drung <bdrung@debian.org>  Thu, 08 Sep 2011 22:04:11 +0200
+
+ubuntu-dev-tools (0.129) unstable; urgency=low
+
+  [ Colin Watson ]
+  * syncpackage: Convert to new LP API, with --no-lp available for the old
+    style of operation.
+  * syncpackage: Require -f/--force option to overwrite Ubuntu changes.
+
+  [ Jelmer Vernooij ]
+  * Remove several tools not specific to Ubuntu that have been migrated to
+    lptools (LP: #708886):
+   - get-branches (renamed to lp-get-branches)
+   - grab-attachments (renamed to lp-grab-attachments)
+   - lp-project-upload
+   - lp-list-bugs
+   - lp-set-dup
+   - lp-shell
+
+  [ Stefano Rivera ]
+  * syncpackage: Show changes to be synced when performing native syncs.
+  * syncpackage: Check the sync blacklist.
+  * syncpackage: Support --bug (extra bugs to be closed by the sync) with
+    native syncs. (Bugs are closed one individually, via the API, post-sync)
+  * dgetlp, submittodebian, 404main: Use unicode strings for literal strings
+    containing non-ASCII characters (LP: #836661)
+  * Recommend pbuilder | aptitude for get-build-deps, and exit with an error
+    if neither are installed (LP: #799368)
+  * get-build-deps: Tell aptitude not to follow Recommends (LP: #817500)
+  * doc/requestsync.1: Document the -C option (LP: #833408)
+  * ubuntutools.archive: Don't write .dsc files until we pull the entire
+    source package, just hold it in memory. Avoids littering the current
+    directory (LP: #838361)
+  * Run harvest as part of sponsor-patch (LP: #833699)
+
+  [ Julian Taylor ]
+  * requestsync: omit dups when checking for duplicate requests (LP: #842217)
+
+  [ Benjamin Drung ]
+  * sponsor-patch: Default to not upload the package.
+  * requestsync: Do not crash on user abort (Closes: #637168).
+
+ -- Benjamin Drung <bdrung@debian.org>  Tue, 06 Sep 2011 14:31:31 +0200
+
+ubuntu-dev-tools (0.128) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * ubuntutools.builder: Detect missing builder and fail early.
+  * backportpackage: Backport from local source packages again (LP: #801945)
+  * ubuntutools.test.test_archive: Forgive newer python-debian's for calling
+    GpgInfo.from_sequence() with the optional keyrings arguments.
+
+  [ Julian Taylor ]
+  * lp-shell: use ipython shell if available
+
+ -- Stefano Rivera <stefanor@debian.org>  Tue, 16 Aug 2011 11:15:18 +0200
+
+ubuntu-dev-tools (0.127) unstable; urgency=low
+
+  * Move debian-distro-info, distro-info, and ubuntu-distro-info from
+    ubuntu-dev-tools into distro-info.
+
+ -- Benjamin Drung <bdrung@debian.org>  Fri, 01 Jul 2011 22:07:18 +0200
+
+ubuntu-dev-tools (0.126) unstable; urgency=low
+
+  [ Evan Broder ]
+  * ubuntutools.misc: Add a new "system_distribution_chain", which returns
+    a list starting with the current distribution and working its way up
+    each distribution's parent.
+  * ubuntutools.misc: Add a function to find the distribution that
+    used a given release codename.
+  * backportpackage, doc/backportpackage.1: Accept codenames from any
+    distribution in the parenting chain. Makes it possible to, e.g.,
+    backport from Debian. (LP: #703099)
+  * ubuntutools.subprocess:
+    - New drop-in replacement wrapper module around subprocess that
+      backports the restore_signals kwarg and defaults close_fds=True
+    - Switch everything previously using subprocess to use
+      ubuntutools.subprocess instead (LP: #785854)
+
+  [ Stefano Rivera ]
+  * submittodebian: Write a usable .reportbugrc if it doesn't exist.
+    (LP: #800429)
+
+  [ Benjamin Drung ]
+  * Add experimental to list of Debian distributions.
+
+ -- Benjamin Drung <bdrung@debian.org>  Sat, 25 Jun 2011 16:38:49 +0200
+
+ubuntu-dev-tools (0.125ubuntu1) oneiric; urgency=low
+
+  [ Benjamin Drung ]
+  * backportpackage: Use --force-bad-version instead of --allow-lower-version
+    (which requires a parameter) for debchange.
+  * Adjust EOL date of Ubuntu 9.10 "Karmic Koala".
+
+  [ Stefano Rivera ]
+  * ubuntutools.archive: Display any errors rmadison emits, rather than
+    guessing at the cause. (LP: #788447)
+  * sponsor-patch: Use dch --release instead of --edit to work with
+    DEBCHANGE_RELEASE_HEURISTIC=changelog.
+
+  [ Dustin Kirkland ]
+  * doc/lp-project-upload.1, lp-project-upload:
+    - add support for optionally specifying files containing the changelog
+      and release notes for the release
+    - allows scripts to avoid the interactive editors
+    - document these changes in the manpage
+
+  [ Didier Roche ]
+  * lp-project-upload:
+    - fix a bug when new milestone wasn't specified (LP: #797170)
+  * get-build-deps:
+    - fix a wrong parser when some build-dep have an epoch
+
+  [ Brian Murray ]
+  * grab-attachments, doc/grab-attachments.1:
+    - add in download attachments from duplicates
+    - add in download attachments from all bugs about a package
+    - document new options in the manpage
+
+ -- Didier Roche <didrocks@ubuntu.com>  Fri, 24 Jun 2011 11:50:17 +0200
+
+ubuntu-dev-tools (0.124) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * Move add-patch, edit-patch, suspicious-source, what-patch, and wrap-and-sort
+    from ubuntu-dev-tools into devscripts (Closes: #568481).
+
+  [ Daniel Holbach ]
+  * bitesize:
+    - display error message properly (LP: #785973).
+    - error out if bug is already marked as 'bitesize'.
+    - rephrase bug comment and subscribe person who adds the comment.
+    - work-around LP:336866 and LP:254901.
+
+  [ Stefano Rivera ]
+  * mk-sbuild:
+    - maintainer_name isn't mandatory any more (LP: #787051)
+
+ -- Benjamin Drung <bdrung@debian.org>  Wed, 25 May 2011 18:27:46 +0200
+
+ubuntu-dev-tools (0.123) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * mk-sbuild:
+    - Disable daemons with a policy-rc.d script (like pbuilder does)
+    - Move package installation after option parsing.
+    - Exit 0 when showing help, and support -h.
+    - Determine distribution from release name (via distro-info).
+    - Reformat manpage.
+    - Install qemu-user-static instead of qemu-kvm-extras-static.
+    - Put schroot configuration in chroot.d/sbuild-$chroot (LP: #736808)
+    - Understand Debian distribution synonyms, and store the chroot under the
+      code name.
+    - Support Debian experimental.
+
+  [ Daniel Holbach ]
+  * bitesize, doc/bitesize.1: add script to tag a bug as bitesize and add a
+    comment that you are willing to help with fixing the bug.
+
+  [ Benjamin Drung ]
+  * sponsor-patch: Fix assertion error if a relative working directory
+    is specified (LP: #785923).
+
+ -- Benjamin Drung <bdrung@debian.org>  Fri, 20 May 2011 21:29:45 +0200
+
+ubuntu-dev-tools (0.122) unstable; urgency=low
+
+  [ Ted Gould ]
+  * lp-project-upload: Add an optional parameter for creating a new
+    milestone to add future bugs to.
+
+  [ Benjamin Drung ]
+  * data/ubuntu.csv: Update end-of-life dates.
+
+  [ Brian Murray ]
+  * grab-attachments: download the attachments to a folder named after the bug
+    number e.g. bug-1
+
+ -- Benjamin Drung <bdrung@debian.org>  Sat, 23 Apr 2011 13:52:01 +0200
+
+ubuntu-dev-tools (0.121) unstable; urgency=low
+
+  [ Daniel Holbach ]
+  * harvest, setup.py: install tool that queries Harvest for information
+    about open opportunities for a given source package.
+
+  [ Stefano Rivera ]
+  * ubuntutools.archive.rmadison: suite can be None, handle this correctly.
+  * pull-debian-debdiff: Convert distance to an integer, so it works when
+    specified.
+  * sponsor-patch, doc/sponsorpatch.1: Clarify that --upload or --workdir is
+    required. (LP: #712721)
+  * Drop Breaks: ${python:Breaks}, no longer used by dh_python2.
+
+  [ Benjamin Drung ]
+  * ubuntutools.update-maintainer: Do not use python-debian to parse
+    debian/control to avoid mangling this file (LP: #756373). The new
+    simplified parser has no problems with comments in debian/control
+    (LP: #701487, #713827).
+  * doc/setup-packaging-environment.1: Fix typo.
+  * Bump Standards-Version to 3.9.2 (no changes required).
+  * Drop transitional qemu-kvm-extras-static from alternative suggests.
+
+  [ Ted Gould ]
+  * lp-project-upload: Use a milestone that already exists if there is
+    one to use.
+
+ -- Benjamin Drung <bdrung@debian.org>  Tue, 19 Apr 2011 08:49:06 +0200
+
+ubuntu-dev-tools (0.120) unstable; urgency=low
+
+  [ Felix Geyer ]
+  * pull-lp-source.1: Document -d option.
+
+  [ Stefano Rivera ]
+  * ubuntutools.archive: Filter rmadison results. (LP: #710579)
+    - Canonicalise suites (use code-names) before passing them to rmadison.
+  * pull-{lp,debian}-source: Download requested versions, as well as simply
+    the latest version in a release.
+  * pull-{lp,debian}-source, pull-debian-debdiff: Catch KeyboardInterrupt.
+    (LP: #713845)
+  * pull-debian-source: Handle -p-u and -security suites.
+  * Bump X-Python-Version to >= 2.6, now that python-launchpadlib no longer
+    supports Python 2.5.
+
+  [ Julian Taylor ]
+  * add support for cowbuilder and cowbuilder-dist in builder.py
+    - allows use in sponsor-patch and backportpackage (LP: #728751)
+
+  [ Benjamin Drung ]
+  * data/ubuntu.csv: Add Oneiric Ocelot to the list of know releases.
+  * ubuntutools.distro_info: Fix TypeError crash and add a test case to
+    catch regressions (LP: #731398).
+
+ -- Stefano Rivera <stefanor@debian.org>  Sat, 12 Mar 2011 22:07:47 +0200
+
+ubuntu-dev-tools (0.119) unstable; urgency=low
+
+  * Support Launchpadlib 1.9. (LP: #725231, #725092)
+    - Document Launchpadlib 1.9 issues in NEWS.
+  * Remove manage-credentials, and credential handling code from
+    ubuntutools.lp.libsupport. Launchpadlib 1.9 handles this via
+    python-keyring. (LP: #387297, #645629, #689100)
+  * Use Launchpadlib.login_with() directly in scripts.
+  * Remove ubuntutools.lp.libsupport.approve_application, no longer used.
+  * Remove ubuntutools.lp.libsupport.get_launchpad, no longer used.
+  * Remove ubuntutools.lp.libsupport.translate_api_web, no longer used.
+  * Skip pylint test if it crashes.
+
+ -- Stefano Rivera <stefanor@debian.org>  Tue, 01 Mar 2011 15:04:40 +0200
+
+ubuntu-dev-tools (0.118) unstable; urgency=low
+
+  * requestsync: Use from...import require_utf8() to work around unexpected
+    scoping from a later import (LP: #723630)
+  * Add myself to Uploaders.
+
+ -- Stefano Rivera <stefanor@debian.org>  Wed, 23 Feb 2011 15:21:32 +0200
+
+ubuntu-dev-tools (0.117) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * dgetlp, import-bug-from-debian, suspicious-source:
+    Show error messages instead of having the import errors for
+    recommended packages (Closes: #613101, LP: #693813).
+  * update_maintainer.py: Update Maintainer field if it is set to
+    "Ubuntu Core Developers <ubuntu-devel@lists.ubuntu.com>".
+
+  [ Stefano Rivera ]
+  * ubuntutools/archive.py: Rewrite launchpadlib redirects to https when
+    fetching dscs.
+  * debian/control:
+    - Suggest qemu-user-static | qemu-kvm-extras-static. Ubuntu provides a
+      qemu-user-static package, like Debian, since natty.
+    - Drop Build-Depend on Recommend on libapt-pkg-perl. No longer used.
+  * grab-merge: Show help when no arguments are provided.
+  * pull-revu-source: Check for the availability of libwww-perl, and print a
+    more helpful error.
+  * requestsync, grep-merges: Require a UTF-8 locale. (Closes: #613114,
+    LP: #553795)
+
+ -- Benjamin Drung <bdrung@debian.org>  Tue, 22 Feb 2011 00:42:33 +0100
+
+ubuntu-dev-tools (0.116) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * suspicious-source:
+    - Add .icns and .java to extension whitelist.
+    - Add image/vnd.adobe.photoshop to the mime-type whitelist.
+  * data/debian.csv: Add wheezy and release date of squeeze.
+  * *distro-info: Add a "created" column to the data.
+  * wrap-and-sort: Wrap and sort Build-Conflicts too.
+  * Move debian-keyring from Suggests to Recommends (LP: #717245).
+  * ubuntutools/test/example_package.py: Use dpkg-source directly instead of
+    dpkg-buildpackage to avoid running fakeroot inside fakeroot which leads
+    to a FTBFS on natty.
+
+  [ Stefano Rivera ]
+  * debian/copyright:
+    - Files is space-separated, not comma.
+    - Bump Format revision.
+
+  [ Kees Cook ]
+  * ubuntutools/update_maintainer.py: do nothing if the rules file
+    already manages XSBC-Original (e.g. python).
+  * ubuntutools/test/test_update_maintainer.py: update test cases to
+    handle checking for debian/rules.
+  * mk-sbuild: work around apt's invocation of GPG needing root's
+    .gnupg directory to already exist.
+
+  [ Michael Bienia ]
+  * Use the new web_link attribute of LP objects instead of our own
+    translate_api_web() function.
+
+ -- Benjamin Drung <bdrung@debian.org>  Sat, 12 Feb 2011 19:02:59 +0100
+
+ubuntu-dev-tools (0.115) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * Catch DownloadErrors in ubuntutools.archive users. (LP: #708862)
+
+  [ Scott Kitterman ]
+  * Update requestsync to send to Launchpad's MX record instead of hard
+    coding to the old MX (fiordland) (LP: #710925)
+  * Recommend python-dns
+
+ -- Benjamin Drung <bdrung@debian.org>  Tue, 01 Feb 2011 13:58:07 +0100
+
+ubuntu-dev-tools (0.114) unstable; urgency=low
+
+  [ Stefano Rivera ]
+  * ubuntutools.archive: Handle source package in workdir correctly.
+    Add regression tests. (LP: #706403)
+  * syncpackage: Don't fakesync when we have a new orig tarball (LP: #707187)
+
+  [ Dustin Kirkland ]
+  * debian/control, debian/copyright, doc/errno.1, errno, setup.py:
+    - purge the errno utility per request of the ubuntu-dev-tools
+      maintainer;  errno now provided by the 'errno' package; (LP: #666540)
+
+  [ Benjamin Drung ]
+  * wrap-and-sort: Add option to use on individual file (LP: #699696).
+  * update_maintainer.py: Process control.in first.
+
+ -- Benjamin Drung <bdrung@debian.org>  Tue, 25 Jan 2011 22:58:05 +0100
+
+ubuntu-dev-tools (0.113) unstable; urgency=low
+
+  [ Benjamin Drung ]
+  * debian-distro-info, distro-info, ubuntu-distro-info: New tools.
+  * Use new ubuntutools.distro_info in various scripts.
+
+  [ Stefano Rivera ]
+  * backportpackage: dput correct changes filename (regression in 0.112)
+    (LP: #706010)
+  * Use new *-distro-info in:
+    - bash_completion/pbuilder-dist: To determine pbuilder file names.
+    - dch-repeat.
+    - reverse-build-depends.
+  * pbuilder-dist: Use ubuntutools.logger.
+  * pbuilder-dist-simple: Remove all mention of supporting Debian.
+    (LP: #481223)
+  * pull-debian-source: Rewritten in Python to take advantage of the new
+    ubuntutools library functions.
+
+ -- Benjamin Drung <bdrung@debian.org>  Sat, 22 Jan 2011 21:06:57 +0100
+
+ubuntu-dev-tools (0.112) unstable; urgency=low
+
+  [ Robert Collins ]
+  * manage-credentials: Finish migrating away from the Launchpad 'edge' service
+    root. (LP: #704657)
+
+  [ Stefano Rivera ]
+  * New source package downloading framework in ubuntutools.archive. Use in
+    many scripts.
+  * pull-lp-source: str() exceptions before passing to Logger (LP: #695523)
+
+ -- Benjamin Drung <bdrung@debian.org>  Thu, 20 Jan 2011 10:25:57 +0100
+
+ubuntu-dev-tools (0.111) natty; urgency=low
+
+  * ubuntutools/test/test_help.py: Blacklist --help test for check-mir, it
+    does not have help. Fixes FTBFS on the buildd.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Thu, 13 Jan 2011 20:15:41 -0600
+
+ubuntu-dev-tools (0.110) natty; urgency=low
+
+  * doc/check-mir.1: Fix typo.
+  * check-mir: Check binary dependencies, too.
+  * debian/control: Add check-mir to package description.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Thu, 13 Jan 2011 19:28:20 -0600
+
+ubuntu-dev-tools (0.109) natty; urgency=low
+
+  [ Stefano Rivera ]
+  * Convert debian/copyright to DEP5, make sure all scripts are listed
+    (LP: #692003)
+  * Drop preinst (pbuilder-dist bash_completion handling), it is not required
+    for any current upgrade path on Debian or Ubuntu.
+  * Switch to dh_python2:
+    - Use X-Python-Version instead of XS-Python-Version.
+    - Use ${python:Breaks} to specify Python version compatibility.
+  * Support reading configuration variables from devscripts configuration
+    files. (LP: #681693)
+    - Added ubuntu-dev-tools.5
+    - Support this in many u-d-t scripts, and update manpages.
+    - Deprecate old configuration environment variables.
+  * Support the combined "Name <email>" format in UBUMAIL, DEBFULLNAME, and
+    DEBEMAIL. (LP: #665202)
+  * Add the beginnings of a test suite. (LP: #690386)
+    - Switch to setuptools, to support setup.py test.
+    - Test for that every script can run --help and return 0.
+    - 404main, merge-changelog, pull-debian-debdiff, pull-debian-source,
+      pull-revu-source:
+      + Return 0 after showing help.
+    - Run pylint on Python source code.
+  * ubuntutools/common.py: Remove https_proxy unsetting code, working around
+    LP: #94130.
+  * edit-patch: Don't let cat error through if debian/source/format doesn't
+    exist.
+  * pull-debian-debdiff: Rewrite in Python, and use snapshot.debian.org.
+  * pull-lp-source: Support -d (LP: #681699)
+  * suspicious-source: Whitelist Python source code.
+  * import-bug-from-debian: Add --package option, for importing bugs from
+    pseudo-packages.
+
+  [ Michael Bienia ]
+  * ubuntutools/lp/lpapicache.py: Allow easier selection of 'staging' as LP
+    instance to use (LP: #693060).
+
+  [ Benjamin Drung ]
+  * sponsor-patch:
+    - Add new --lpinstance and --no-conf options.
+    - Support configuration files.
+    - Default to a temporary workdir and clean it up (LP: #691467).
+    - Fix 'str' object has no attribute 'startwith' crash caused by a typo.
+    - Fix crash if uploading to ubuntu without building the package before.
+    - Fix: The package was only uploaded if the target was "ubuntu".
+  * Recommend bzr-builddeb (used by sponsor-patch for branches).
+  * Add most dependencies to Build-Depends for successfully run the tests.
+  * Recommend python-gnupginterface (used by dgetlp).
+  * update-maintainer: Rewrite completely using python-debian (LP: #666504).
+  * ubuntutools/packages.py: Removed (used nowhere).
+
+  [ Michael Vogt ]
+  * add "add-patch" that provides the non-interactive version of
+    edit-patch
+
+  [ Martin Pitt ]
+  * Add check-mir script: Check components of build dependencies and warn
+    about universe/multiverse ones, for a package destined for
+    main/restricted. Add doc/check-mir.1 manpage.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Thu, 13 Jan 2011 19:16:33 -0600
+
+ubuntu-dev-tools (0.108) experimental; urgency=low
+
+  [ Stefano Rivera ]
+  * lp-shell, import-bug-from-debian:
+    Use the 'production' LP instance instead of 'edge' (which is going away).
+  * pbuilder-dist:
+    - Fix typo in local archive support, introduced in 0.107.
+    - Warn user if they run sudo pbuilder-dist (LP: #691999).
+  * Drop unnecessary debian/pycompat
+
+  [ Benjamin Drung ]
+  * pull-lp-source: Unquote URI to get "+" instead of "%2B" in the file name
+    (LP: #681114).
+  * sponsor-patch: Allow updating the build environment if the build failed.
+  * ubuntu-iso: Exit nonzero rather than crash if a wrong parameter is passed
+    (LP: #637020).
+
+  [ Colin Watson ]
+  * grep-merges: New tool.
+  * ubuntu-iso(1): Fix typo.
+
+  [ Evan Broder ]
+  * backportpackage: new script for testing backport requests in a PPA.
+  * sponsor-patch: Add --update option to make sure build environment is
+    up to date (LP: #689605)
+
+  [ Bilal Akhtar ]
+  * pbuilder-dist: Override the default build result location if
+    --buildresult is specified.
+  * sponsor-patch: Support building with pbuilder-dist.
+
+ -- Benjamin Drung <bdrung@ubuntu.com>  Sun, 19 Dec 2010 00:57:38 +0100
+
+ubuntu-dev-tools (0.107) experimental; urgency=low
+
+  [ Stefano Rivera ]
+  * edit-patch: Detect quilt patch-system in 3.0 (quilt) packages without any
+    patches yet.
+  * wrap-and-sort:
+    - Correct typo in options --wrap-allways -> --wrap-always
+    - Sort debian/install as well as debian/*.install
+    - Add one-space-indentation option: --short-indent
+    - Remove null-entry from trailing comma in sorted lists
+    - Add configurable debian directory location
+    - Sort Architecture (LP: #681131)
+    - Add --sort-binary-packages and --keep-first (LP: #681119)
+  * grab-merge, syncpackage: Export DEB_VENDOR=Ubuntu when unpacking source
+    packages. 3.0 (quilt) has optional per-vendor patch series.
+  * pbuilder-dist:
+    - Refactor to use subprocess.popen instead of os.system (LP: #398974)
+    - Catch OSErrors when creating directories (LP: #671067)
+    - Set HOME so pbuilder reads .pbuilderrc
+    - Add bidirectional workarounds for LP: #599695 (pbuilder uses the host
+      apt keyring). Complain if the target's keyring isn't installed.
+  * Use dpkg-vendor in ubuntutools.misc.system_distribution(), cache result.
+
+  [ Benjamin Drung ]
+  * wrap-and-sort: Remove duplicate items from sorted lists.
+  * syncpackage: Fix error message for failed downloads.
+  * sponsor-patch: Support building with sbuild (LP: #681242).
+
+  [ Daniel Holbach ]
+  * submittodebian: rephrase boilerplate text to be more polite, add reminder
+    to explain the patch sufficiently and add necessary information.
+
+  [ Colin Watson ]
+  * submittodebian: Encourage sending multiple independent pieces of the
+    Ubuntu patch in separate bug reports.
+
+ -- Benjamin Drung <bdrung@ubuntu.com>  Fri, 03 Dec 2010 00:14:25 +0100
+
+ubuntu-dev-tools (0.106) experimental; urgency=low
+
+  [ Kees Cook ]
+  * mk-sbuild: drop "priority" option; sbuild no longer uses it.
+
+  [ Benjamin Drung ]
+  * sponsor-patch: Call dpkg-source with --no-preparation to not apply patches
+    if the packages uses the 3.0 (quilt) format.
+  * debian/control: Use shorter addresses for VCS-* fields.
+
+  [ Michael Bienia ]
+  * pull-debian-source: Fix logical error in abort check (lp: #678072).
+
+ -- Benjamin Drung <bdrung@ubuntu.com>  Sun, 21 Nov 2010 15:41:43 +0100
+
+ubuntu-dev-tools (0.105) experimental; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist, doc/pbuilder-dist.1:
+     - Export the distribution and architecture information to the environment
+       so that it is available in pbuilderrc, etc. (LP: #628933).
+
+  [ Naty Bidart ]
+  * lp-project-upload: Add support handling multiple project series.
+
+  [ Kees Cook ]
+  * mk-sbuild: use --no-install-recommends on Debian too (Closes: #599699).
+
+  [ Marco Rodrigues ]
+  * pull-debian-source:
+     - Show message when a package isn't in Debian testing (LP: #529041).
+
+  [ Stefano Rivera ]
+  * doc/syncpackage.1:
+     - Add a warning that the use of syncpackage is discouraged.
+     - Correct and neaten options.
+  * syncpackage:
+     - Add --dont-sign parameter, for test builds.
+
+  [ Christopher James Halse Rogers ]
+  * mk-sbuild: Add support for btrfs-snapshot based chroots
+
+  [ Iain Lane ]
+  * pbuilder-dist: Explicitly use debian keyring when working with a
+    Debian chroot, working around #599695
+
+  [ Benjamin Drung ]
+  * syncpackage:
+    - Don't crash if environment variables aren't set (LP: #665202).
+    - Don't add quotation marks to changelog entries (LP: #668805).
+    - Show a error message instead of raising an error if Ubuntu contains a
+      newer version.
+    - Print an error message if the source-only build fails (LP: #668749).
+
+ -- Benjamin Drung <bdrung@ubuntu.com>  Sat, 30 Oct 2010 20:58:30 +0200
+
+ubuntu-dev-tools (0.104) experimental; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+     - Fix regression where pbuilder would get an empty string as first
+       positional argument.
+     - Update --debug-echo so that it doesn't hide empty parameters (now
+       that they are wrapped around quotes they are significant).
+
+ -- Benjamin Drung <bdrung@ubuntu.com>  Sat, 25 Sep 2010 13:14:46 +0200
+
+ubuntu-dev-tools (0.103) experimental; urgency=low
+
+  [ Benjamin Drung ]
+  * sponsor-patch:
+    - Fix NameError: global name 'debdiff_filename' is not defined.
+    - Add --workdir parameter to set the working directory.
+  * ubuntutools/update_maintainer.py: Fix failure if debian/control.in is a
+    directory.
+
+  [ Luca Falavigna ]
+  * debian/control:
+    - Add Benjamin Drung to Uploaders.
+    - Add DM-Upload-Allowed field, this way Benjamin can upload new
+      versions on his own.
+  * ubuntutools/misc.py:
+    - Use output of dpkg --print-architecture command to correctly display
+      platform architecture (Closes: #594424).
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+     - Do not show a warning when "experimental" is used; there is no
+       debootstrap file for it but it should just work anyway.
+     - Wrap any extra (user) arguments appended to the pbuilder command with
+       quotation marks, when needed (LP: #398989).
+  * bash_completion/pbuilder-dist:
+     - Enable auto-completion for "pbuilder-experimental".
+  * doc/pbuilder-dist.1:
+     - Move the documentation for --main-only (previously "mainonly") and
+       --debug-echo to a new Options section.
+
+  [ Stefano Rivera ]
+  * Add manpages for sponsor-patch and import-bug-from-debian.
+  * hugdaylist, manage-credentials, massfile, merge-changelog,
+    ubuntutools/requestsync/common.py: Some pyflakes-induced cleanup.
+  * ubuntutools/lp/libsupport.py: Support production API URLs in
+    translate_web_api.
+
+ -- Luca Falavigna <dktrkranz@debian.org>  Wed, 22 Sep 2010 18:13:27 +0200
+
+ubuntu-dev-tools (0.102) experimental; urgency=low
+
+  [ Dustin Kirkland ]
+  * errno, doc/errno.1, debian/control, debian/copyright, setup.py:
+    - add an errno utility, LP: #612267
+
+  [ Kees Cook ]
+  * mk-sbuild: update examples to include "-A".
+
+  [ Benjamin Drung ]
+  * suspicious-source: whitelist font source formats. Thanks to Nicolas
+    Spalinger for the patch (LP: #365147).
+  * Update the man page of suspicious-source to match the rewrite.
+  * syncpackage:
+    - Don't upload orig tarball if not needed.
+    - Print error message if the download fails (LP: #639899).
+    - Check if the specified Debian component is valid (LP: #639896).
+  * update-maintainer: Don't change the Maintainer field if the email is set
+    to a @lists.ubuntu.com address.
+  * sponsor-patch: New script to download a patch from a Launchpad bug, patch
+    the source package, build, check and uploads it (to Ubuntu or a PPA).
+  * wrap-and-sort: New script to wrap long lines and sort items in packaging
+    files.
+
+  [ Stefano Rivera ]
+  * update-maintainer: Correctly update the Maintainer field to the new Ubuntu
+    Developers address (instead of the calling user) when the package is not
+    in Debian.
+
+  [ Iain Lane ]
+  * all: Use production API rather than edge by default. Should be more
+    reliable and was advised by lifeless (LP team).
+
+  [ Michael Bienia ]
+  * Add 'natty' to recognized names and make it the default.
+
+  [ Colin Watson ]
+  * Fix NAME section of lp-set-dup(1).
+  * lp-list-bugs: New tool.
+
+ -- Luca Falavigna <dktrkranz@debian.org>  Mon, 20 Sep 2010 11:10:04 +0200
+
+ubuntu-dev-tools (0.101) unstable; urgency=low
+
+  [ Andrew Starr-Bochicchio ]
+  * syncpackage: Update manpage to reflect current usage. (Closes: #587142,
+    LP: #598477)
+  * ubuntu-build: Update manpage to reflect current usage. (LP: #490535)
+  * edit-patch: Add manpage. (LP: #538379)
+  * massfile: Add manpage.
+  * pull-debian-debdiff: Add manpage.
+  * setup-packaging-environment: Add manpage.
+  * ubuntu-iso: Add manpage.
+
+  [ Benjamin Drung ]
+  * Bump Standards-Version to 3.9.1 (no changes required).
+  * Switch to dpkg-source 3.0 (native) format.
+  * Switch to simple dh7 rule.
+  * syncpackage:
+    - Use Version class from python-debian to fix extraction of upstream
+      version for debian versions that contain more than one dash.
+    - Prepend script name to every output
+    - Output every executed command in verbose mode
+    - Print proper error message if the dsc file is malformed.
+  * update-maintainer: Add a --quiet option.
+  * suspicious-source: Replace with total rewrite in Python using python-magic.
+
+  [ Michael Bienia ]
+  * ubuntutools/lpapi/lpapicache.py: Use the new LP API method
+    archive.checkUpload() to check upload permissions.
+  * Add "import-bug-from-debian" written by James Westby.
+  * Add python-soappy to Recommends.
+  * requestsync: Fix bug where the variable 'hasLP' is not always set
+    (lp: #607874).
+
+  [ Steve Beattie ]
+  * mk-schroot: add debootstrap include/exclude options
+  * mk-schroot.1: document added options
+
+ -- Luca Falavigna <dktrkranz@debian.org>  Wed, 04 Aug 2010 10:06:44 +0000
+
+ubuntu-dev-tools (0.100) maverick; urgency=low
+
+  [ Luca Falavigna ]
+  * syncpackage: new script to easily upload pristine Debian packages.
+  * debian/ubuntu-dev-tools.preinst:
+    - It is no longer necessary to remove stale pycentral files.
+
+  [ Felix Geyer ]
+  * reverse-build-depends: Always display the correct default distribution
+    name in the usage text.
+
+  [ Iain Lane ]
+  * requestsync: Fall back to using rmadison when LP indicates that no new
+    version is available. The LP importer is often out of date wrt Debian when
+    rmadison isn't. (LP: #574398)
+
+  [ Benjamin Drung ]
+  * syncpackage:
+    - add more options and allow pulling packages from Debian.
+    - add mismatching source tarball detection (for fake syncs).
+  * update-maintainer:
+    - Remove duplicate Original-Maintainer field.
+    - Avoid duplicate Original-Maintainer field if maintainer is listed in
+      Uploaders too.
+
+  [ Michael Vogt ]
+  * edit-patch:
+    - support full path to the patch as well (LP: #585599)
+    - support adding existing patches (e.g. from launchpad)
+      thanks to David Futcher (LP: #586787)
+
+  [ Michael Bienia ]
+  * Update to the new python-debian version:
+    - Depend on python-debian >= 0.1.15
+    - Replace imports of debian_bundle with debian to fix the deprecation
+      warnings.
+
+  [ Daniel Hahler ]
+  * mk-sbuild: add $RELEASE to error message.
+
+ -- Michael Bienia <geser@ubuntu.com>  Thu, 17 Jun 2010 21:17:10 +0200
+
+ubuntu-dev-tools (0.99) lucid; urgency=low
+
+  [ Andrey Voronov ]
+  * pbuilder-dist: change requested/system arch order in check (LP: #557097)
+
+  [ Michael Bienia ]
+  * Update the defaults for maverick and let requestsync and
+    pull-debian-source default to unstable (lp: #472837).
+
+ -- Michael Bienia <geser@ubuntu.com>  Thu, 22 Apr 2010 21:31:48 +0200
+
+ubuntu-dev-tools (0.98) lucid; urgency=low
+
+  [ Ryan Kavanagh ]
+  * Added the merge-changelog script from
+    https://lists.ubuntu.com/archives/ubuntu-x/2009-June/000586.html for those
+    who need to manually merge packages.
+  * Fixed typo in doc/grab-merge.1
+
+  [ Soren Hansen ]
+  * Update get-branches to account for changes in LP's web UI. Really, someone
+    should update it to use the LP API, but for now, this will have to do.
+
+  [ Emmet Hikory ]
+  * doc/mk-sbuild.1: add missing options to summary
+
+  [ Michael Bienia ]
+  * lp-shell: Use "udt-lp-shell" as LP API consumer instead of the non-unique
+    "test" (lp: #558531).
+  * get-branches: Use the LP API to obtain a list of branches of a team.
+
+  [ Loïc Minier ]
+  * bash_completion/pbuilder-dist, dch-repeat: list maverick in possible
+    Ubuntu dists; the default dist for reverse-build-depends and
+    submittodebian should be changed in maverick.
+
+ -- Loïc Minier <loic.minier@ubuntu.com>  Fri, 16 Apr 2010 12:58:22 +0200
+
+ubuntu-dev-tools (0.97) lucid; urgency=low
+
+  [ Michael Bienia ]
+  * lp-shell:
+    + Support all known LP service names.
+    + Add support for using different LP API versions.
+    + Add option to login anonymously into LP.
+  * ubuntutools/lp/lpapicache.py, ubuntutools/lp/libsupport.py: Add support
+    for different LP API versions.
+  * ubuntutools/lp/__init__.py: Set the '1.0' LP API version as default.
+  * massfile: Updated to 1.0 LP API.
+  * doc/requestsync.1: Update the paragraph about sponsoring (lp: #538990).
+  * pull-lp-source: Use (anonymously) the LP API to get the URL for the .dsc
+    file instead of screen scraping.
+  * Apply patch from Julian Andres Klode for the python-apt 0.8 API transition
+    (Closes: #572091)
+  * ubuntutools/requestsync/mail.py: Fix some more encoding issues
+    (lp: #557828).
+
+  [ Michael Vogt ]
+  * edit-patch:
+    - fix quilt mode when dpkg already applied all the patches
+      (LP: #556297)
+
+ -- Michael Bienia <geser@ubuntu.com>  Thu, 08 Apr 2010 12:59:59 +0200
+
+ubuntu-dev-tools (0.96) lucid; urgency=low
+
+  [ Michael Bienia ]
+  * ubuntu-build: missed updating a function call.
+
+  [ Emmet Hikory ]
+  * mk-sbuild: Really don't use build-arm-chroot
+
+  [ Daniel Holbach ]
+  * hugdaylist, requestsync, doc/requestsync.1:
+    ubuntu-{main,universe}-sponsors → ubuntu-sponsors,
+    {ubuntu,motu}-release → ubuntu-release.
+  * ubuntutools/ppaput.py: removed, not necessary any more.
+  * debian/copyright: removed references to ppaput.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Mon, 15 Mar 2010 10:21:31 +0100
+
+ubuntu-dev-tools (0.95) lucid; urgency=low
+
+  * Update reverse-build-depends for lucid
+
+ -- Jonathan Riddell <jriddell@ubuntu.com>  Mon, 08 Mar 2010 13:33:47 +0000
+
+ubuntu-dev-tools (0.94) lucid; urgency=low
+
+  [ Luca Falavigna ]
+  * docs/lp-set-dup.1: add manpage for lp-set-dup.
+  * debian/control: bump Standards-Version to 3.8.4, no changes needed.
+
+  [ Emmet Hikory ]
+  * mk-sbuild: switch to use qemu-debootstrap for foreign chroots
+  * mk-sbuild: allow any foreign chroot (may not work, but we can try)
+  * pbuilder-dist: allow any foreign chroot (may not work, but we can try)
+  * doc/pbuilder-dist.1: update manpage to indicate general architecture
+  * pbuilder-dist: add self. before target_distro in powerpc check
+
+ -- Emmet Hikory <persia@ubuntu.com>  Mon, 08 Mar 2010 20:45:09 +0900
+
+ubuntu-dev-tools (0.93) lucid; urgency=low
+
+  [ Scott Moser ]
+  * rename mk-sbuild-lv to mk-sbuild, support union-type=aufs
+
+  [ Emmet Hikory ]
+  * Support qemu-arm-static -> qemu-kvm-extras-static transition
+  * mk-sbuild: automatically install qemu-kvm-extras-static if requested
+  * mk-sbuild: conditionally install lvm2 only for lvm-snapshot schroots
+  * mk-sbuild: rationalise architecture variables
+  * mk-sbuild: Generalise --type support and add "file" SCHROOT_TYPE
+  * mk-sbuild.1: Document the --type argument
+
+  [ Loïc Minier ]
+  * Demote qemu-kvm-extras-static to a Suggests since most people don't build
+    for armel.
+
+  [ Kees Cook ]
+  * requestsync: add -C to allow manually adding changelog when missing
+    (LP: #518574).
+  * mk-sbuild: clean up and make slight adjustments to new lvm/dir/file logic.
+  * mk-sbuild.1: update documentation to reflect alternative config file
+    names for distro and schroot type overrides.
+  * mk-sbuild, docs/mk-sbuild.1: document DEBOOTSTRAP_MIRROR for good
+    measure, thanks to Paul Holcomb.
+
+  [ Michael Bienia ]
+  * ubuntutools/requestsync/mail.py: Encode the report to utf-8 before passing
+    it to gpg for signing (LP: #522316).
+  * Add support for the other LP service roots (edge is still default)
+  * Depend on python-launchpadlib >= 1.5.4
+  * Also check package sets for upload permissions.
+  * lp-set-dup: Don't crash when accessing private bugs (LP: #525539)
+  * requestsync: Subscribe 'ubuntu-release' to Feature Freeze exceptions
+    (updated to current policy; LP: #532740)
+
+  [ Michael Vogt ]
+  * edit-patch: add wrapper around cdbs-edit-patch, dpatch-edit-patch, quilt
+    to transparently deal with the various patch systems.
+
+  [ Colin Watson ]
+  * lp-shell: Disable default apport excepthook, as this is intended for
+    interactive use.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Fri, 05 Mar 2010 19:16:32 -0800
+
+ubuntu-dev-tools (0.92) lucid; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * bash_completion/pbuilder-dist:
+     - Enable tab-completion for pbuilder-lucid and cowbuilder-lucid.
+
+  [ Emmet Hikory ]
+  * mk-sbuild-lv: support foreign armel schroots
+  * mk-sbuild-lv: use --arch=foo rather than --arch foo for debootstrap
+  * pbuilder-dist: Allow architecture-switching to armel on i386/amd64
+  * pbuilder-dist: use --arch=foo rather than --arch foo for debootstrap
+  * pbuilder-dist: change --mirror logic to use -ports when appropriate
+  * docs/pbuilder-dist.1: Document architecture-switching for armel
+  * debian/control: add qemu-arm-static to Recommends:
+
+  [ Michael Bienia ]
+  * ubuntutools/requestsync/mail.py:
+    Map "sid" back to "unstable" (and "squeeze" to "testing") else rmadison
+    gets a Python traceback from the remote site instead of the expected data
+    (lp: #508794).
+
+  [ Kees Cook ]
+  * mk-sbuild-lv: adjust schroot.conf template to document the -source
+    change further.
+
+ -- Emmet Hikory <persia@ubuntu.com>  Wed, 03 Feb 2010 11:39:12 -0800
+
+ubuntu-dev-tools (0.91) lucid; urgency=low
+
+  * mk-sbuild-lv: drop deprecated keys from schroot.conf template
+  * mk-sbuild-lv: enable -source access after security improvements of
+                  schroot.conf template in 0.88
+  * mk-sbuild-lv: document sudo requirement for -source access in final output
+
+ -- Emmet Hikory <persia@ubuntu.com>  Sun, 17 Jan 2010 11:08:32 +0900
+
+ubuntu-dev-tools (0.90) lucid; urgency=low
+
+  * Include changes which were committed to 0.88, but which I forgot to
+    upload.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Sat, 16 Jan 2010 16:28:54 +0100
+
+ubuntu-dev-tools (0.89) lucid; urgency=low
+
+  * Add lp-shell: Open an interactive Python shell with a
+    launchpadlib.Launchpad object "lp" which is ready for use.
+    If the first command line argument is "staging", this will be on staging
+    instead of production.
+  * Add doc/lp-shell.1: Manpage.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Wed, 13 Jan 2010 14:34:05 +0100
+
+ubuntu-dev-tools (0.88) lucid; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+     - Set "--mirror" option also for Ubuntu chroots, so that they work
+       on Debian.
+
+  [ Michael Bienia ]
+  * requestsync: Fix a bug that prevented sync requests for new packages with
+    a version smaller than 0.
+  * ubuntutools/requestsync/common.py: Decode the edited report file back from
+    UTF-8 so it can be encoded again in the next iteration (lp: #504263)
+
+  [ Luca Falavigna ]
+  * Fix some typos in man pages.
+
+  [ Kees Cook ]
+  * mk-sbuild-lv: drop deprecated sbuild configuration fields from template.
+  * what-patch: updated for 3.0 source format.
+
+ -- Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>  Fri, 15 Jan 2010 14:24:51 +0100
+
+ubuntu-dev-tools (0.87) lucid; urgency=low
+
+  * Revert the submittodebian change to inline patches.  This is a style
+    choice, the patch length has nothing to do with it; if there's demand for
+    patch inlining, this should be made a (non-default) option to
+    submittodebian.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Mon, 28 Dec 2009 14:41:31 -0800
+
+ubuntu-dev-tools (0.86) lucid; urgency=low
+
+  [ Emmet Hikory ]
+  * mk-sbuild-lv: Add richer support for ports architectures in Ubuntu
+  * mk-sbuild-lv: Really use -security for SOURCES_SECURITY_SUITE in Ubuntu
+
+  [ Kumar Appaiah ]
+  * submittodebian: if patch is relatively small (shorter than fifty
+    lines), display it inline instead of attaching to the report.
+
+  [ Michael Bienia ]
+  * ubuntutools/requestsync/common.py: convert the changelog into a unicode
+    string (lp: #498349)
+  * ubuntutools/requestsync/mail.py: rmadison() returns now the most recent
+    source line (Closes: #560758)
+
+  [ Iain Lane ]
+  * pull-debian-source: Return the most recent source line. Depend on
+    libapt-pkg-perl for the Debian version comparison required for this.
+
+  [ Steve Langasek ]
+  * submittodebian: os.system() doesn't throw exceptions, so attempt a
+    'bzr diff' first and check the return value; otherwise we get no output
+    at all from submittodebian in the non-bzr case.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Sun, 27 Dec 2009 13:03:56 -0800
+
+ubuntu-dev-tools (0.85) lucid; urgency=low
+
+  * submittodebian: switch to use lucid as the default distro tag.
+  * submittodebian: if the package is in bzr, look for bzr metadata first
+    before looking for a previous package revision in the parent dir.
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Fri, 11 Dec 2009 13:46:31 -0800
+
+ubuntu-dev-tools (0.84) lucid; urgency=low
+
+  [ Michael Bienia ]
+  * update-maintainer: Remove the check for LP credentials again as this
+    script doesn't use the LP API (Closes: #558598).
+  * Rename buildd to ubuntu-build to resolve filename conflict
+    (Closes: #558816).
+
+  [ Manny Vindiola ]
+  * grab-merge: Only download files listed multiple times in REPORT once
+
+  [ Luca Falavigna ]
+  * ubuntutools/lp/lpapicache.py: recent lazr.restfulclient does use of
+    unicode strings, use basestring to catch bot str and unicode.
+  * Depend on python-lazr.restfulclient, package was recently renamed
+    from python-lazr-restfulclient to match Python naming schema.
+
+  [ Jonathan Davies ]
+  * dch-repeat: Added Lucid to releases.
+
+ -- Luca Falavigna <dktrkranz@ubuntu.com>  Mon, 07 Dec 2009 10:18:55 +0100
+
+ubuntu-dev-tools (0.83) lucid; urgency=low
+
+  [ Iain Lane ]
+  * lpapicache: Do not immediately bail out if we have no credentials to
+    login. Clients are now expected to handle the lack of credentials
+    themselves.
+  * pull-lp-source: Make LP API use optional - fall back to a hardcoded
+    default release if we aren't using it. (LP: #477670)
+  * pull-lp-source: Detect more failure conditions and give a nice error
+    instead of a trace
+  * buildd, requestsync, grab-attachments, hugdaylist, update-maintainer:
+    Detect & bail if we don't have credentials and need them. These scripts
+    cannot continue under those circumstances.
+
+  [ Kees Cook ]
+  * mk-sbuild-lv: switch to ext4 by default.
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist, doc/pbuilder-dist.1:
+     - Add "--debug-echo" option which prints the resulting pbuilder/cowbuilder
+       commands instead of executing it.
+
+  [ Martin Pitt ]
+  * lp-project-upload: Generate tarball signature if it is not present yet.
+  * lp-project-upload: Invoke editor to specify changelog and release notes,
+    and add those to the project release.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Fri, 20 Nov 2009 16:59:08 -0600
+
+ubuntu-dev-tools (0.82) lucid; urgency=low
+
+  [ Iain Lane ]
+  * debian/control: Re-add XS-Python-Version - this is more standard
+  * debian/pyversions: Drop
+  * pbuilder-dist: Don't pass --logfile if we are trying to log in to the
+    chroot - the logfile option swallows the prompt, and we probably don't
+    want to log if we are using login anyway.
+
+  [ Nathan Handler ]
+  * debian/control: Mention lp-project-upload in Description
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * debian/control:
+     - Improve description of pbuilder-dist and mention cowbuilder-dist.
+  * pbuilder-dist:
+     - Abort if the host's architecture can't be determined.
+     - Error out instead of showing a traceback if pbuilder-dist is called
+       without any argument.
+  * pbuilder-dist, ubuntutools/misc.py:
+     - Move the functions used to determine the hosts architecture and
+       distribution to the ubuntutools.misc module.
+  * setup-packaging-environment, setup.py, debian/copyright, debian/control:
+     - Add a new script, setup-packaging-environment.
+
+  [ Luca Falavigna ]
+  * ubuntutools/requestsync/lp.py: explicitly import exceptions for
+    backward compatibility with Python 2.5.
+  * debian/control: re-enable support for python2.5.
+  * debian/copyright: update copyright holders.
+
+  [ Michael Bienia ]
+  * requestsync: request syncs from 'testing' by default (should be changed
+    back to 'unstable' for lucid+1)
+  * pull-debian-source: change default release to pull from to 'testing'
+
+ -- Iain Lane <laney@ubuntu.com>  Fri, 06 Nov 2009 10:37:43 +0000
+
+ubuntu-dev-tools (0.81) karmic; urgency=low
+
+  [ Iain Lane ]
+  * requestsync: Give an error message if no changelog entries - happens if,
+    for example, the new package's changelog hasn't yet been published on p.d.o
+  * update-maintainer: Also check if package is in experimental when looking
+    who to update maintainer to.
+  * update-maintainer: Prefer updating control.in to control; this is used by
+    some Debian packages, notably those maintained by pkg-gnome.
+  * debian/control: Update standards-version to 3.8.3, no changes
+  * debian/control, debian/pyversions: Remove XS-Python version to
+    debian/pyversions to silence a warning
+
+  [ Jonathan Davies ]
+  * debian/control: Included a short description of each script (LP: #406658).
+
+  [ Nathan Handler ]
+  * debian/control: Mention pull-revu-source in description
+
+  [ Joe Bernard ]
+  * Launchpad API changed causing pull-lp-source to fail to parse the .dsc
+    file from the URL contents (LP: #436006).
+
+ -- Iain Lane <laney@ubuntu.com>  Fri, 25 Sep 2009 20:20:49 +0100
+
+ubuntu-dev-tools (0.80) karmic; urgency=low
+
+  * mk-sbuild-lv: Export http_proxy. LP: #416438
+
+ -- Michael Terry <michael.terry@canonical.com>  Thu, 10 Sep 2009 10:53:30 -0400
+
+ubuntu-dev-tools (0.79) karmic; urgency=low
+
+  * Add lp-project-upload: Upload a release tarball to a Launchpad project.
+  * Add doc/lp-project-upload.1: Corresponding manpage.
+  * setup.py: Add lp-project-upload.
+  * debian/copyright: Add lp-project-upload.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Sat, 05 Sep 2009 16:42:10 +0200
+
+ubuntu-dev-tools (0.78) karmic; urgency=low
+
+  [ Nathan Handler ]
+  * setup.py: Add pull-revu-source to list of scripts
+
+  [ Steve Langasek ]
+  * Set XS-Python-Version to 2.6 or better, due to use of 2.6-specific
+    syntax in requestsync.
+  * Bump the python-all-dev build-dep as well
+
+ -- Steve Langasek <steve.langasek@ubuntu.com>  Tue, 01 Sep 2009 12:17:03 -0700
+
+ubuntu-dev-tools (0.77) karmic; urgency=low
+
+  [ Nathan Handler ]
+  * pull-revu-source: Update to use dsc.py to get dsc URL
+
+  [ Michael Bienia ]
+  * Install also the ubuntutools/requestsync/* modules (lp: #421627)
+
+ -- Michael Bienia <geser@ubuntu.com>  Tue, 01 Sep 2009 10:56:29 +0200
+
+ubuntu-dev-tools (0.76) karmic; urgency=low
+
+  [ Nicolas Valcárcel ]
+  * mk-sbuild-lv:
+    - Add check for built-in dm_snapshot (LP: #398414)
+
+  [ Andreas Moog ]
+  * update-maintainer:
+    - Don't silently fail when Maintainer-Field contains a comment
+      in brackets. (LP: #397144)
+    - Don't add second XSBC-Original-Maintainer if Maintainer was set
+      to Motu or Core-Dev.
+
+  [ Michael Bienia ]
+  * Drop python-launchpad-bugs from Depends.
+  * Add python-lazr-restfulclient to Depends.
+  * buildd: Add a --batch mode for batch retrying/rescoring of packages.
+  * requestsync:
+    - Use UBU* environment variables before the DEB* ones (lp: #400133)
+    - Split requestsync into a "mail" module and a "lpapi" module and use
+      the LP API only when --lp was used. In "mail" mode requestsync has
+      to ask some more questions for parts it can't find out without LP API.
+      (lp: #406659, #416955)
+
+  [ Iain Lane ]
+  * requestsync:
+    - Guard some calls when -n is specified
+    - Fetch changelog of specified version, not current version. If an
+      experimenal upload happened after the unstable one we're syncing, this
+      is considered to be current by p.d.o and we would get those changelog
+      entries in the sync request
+    - Remove trailing fullstop from sync bug title
+  * suspicious-source: Add *.hs *.el *.css to whitelist
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+     - Expand "~" in PBUILDFOLDER to the user's home directory.
+     - If there's a "etc/<distro>/apt.conf" file inside the build result
+       directory, pass it to pbuilder as --aptconfdir. Thanks to Paul Novotny
+       and Ryan Pavlik (LP: #363043).
+
+  [ Luca Falavigna ]
+  * Switch to python-support to ease initial import into Debian:
+    - debian/control: build-depend on python-support instead of pycentral,
+      also remove unneeded XB-Python-Version field from binary stanza.
+    - debian/rules: set DEB_PYTHON_SYSTEM to pysupport.
+    - ubuntu-dev-tools.preinst: remove stale pycentral files on upgrades.
+
+  [ Nathan Handler ]
+  * Add pull-revu-source and doc/pull-revu-source.1
+  * Update debian/copyright to include pull-revu-source
+
+ -- Nathan Handler <nhandler@ubuntu.com>  Sun, 30 Aug 2009 17:24:23 +0000
+
+ubuntu-dev-tools (0.75) karmic; urgency=low
+
+  [ Michael Bienia ]
+  * buildd:
+    - Use the LP API for retrying or rescoring builds.
+  * requestsync:
+    - Fix check for sponsorship when a new package should get synced.
+    - Add "done" as last email command when emailing the sync request
+      to stop parsing of the email body for further email commands
+      (lp: #372555)
+
+  [ Jonathan Davies ]
+  * update-maintainer:
+    - Rewrote in Python and adapted to use Maintainer field spec approved by
+      the Technical Board at:
+      - https://lists.ubuntu.com/archives/ubuntu-devel/2009-May/028213.html
+    - Do not make changes if maintainer email is set to an
+      @ubuntu.com email address.
+  * requestsync:
+    - Adapt to use new checkIsInDebian() function in ubuntutools/packages.py.
+    - urlopener module is no longer required here.
+  * pull-lp-source:
+    - Return an error message if dget is not installed.
+    - Use os.path.exists() instead of catching an error message
+      to check if dget is installed.
+  * TODO: pull-lp-source task done.
+  * ubuntutools/packages.py: Created checkIsInDebian() function.
+  * ubuntutools/lp/functions.py: Improved error messages, and made prettier
+    functions.
+  * ubuntutools/lp/libsupport.py: Fail if we're unable to import launchpadlib
+    (we need it to run stuff).
+  * ubuntutools/lp/urlopener.py: Removed - module no longer needed.
+  * ubuntutools/lp/cookie.py: Removed - module no longer needed - we use
+    Launchpad API support now.
+  * buildd:
+    - Use launchpadlib to check the Ubuntu release is valid.
+    - Moved Launchpad module imports here - speed up usage parsing to improve
+      user experience.
+    - Do not display override message if --arch is not used.
+    - Fix permissions warning message and do not mention teams as we check on
+      a per package basis.
+
+  [ Colin Watson ]
+  * Rewrite 404main using python-apt. Note that this requires python-apt
+    0.7.9, not in jaunty.
+  * Get rid of the last remaining use of subprocess.Popen(shell=True) in
+    404main.
+
+  [ Luke Yelavich ]
+  * lp-set-dup: Add missing % needed for string substitution. Thanks to
+    Robert Ancell for the fix.
+
+  [ Iain Lane ]
+  * requestsync: We need to use the output from madison, not just throw it
+    away.
+
+ -- Michael Bienia <geser@ubuntu.com>  Mon, 06 Jul 2009 17:46:21 +0200
+
+ubuntu-dev-tools (0.74) karmic; urgency=low
+
+  [ Kees Cook ]
+  * mk-sbuild-lv:
+    - Skip security repo for Debian unstable, thanks to Ryan Niebur
+      (LP: #371569).
+    - Change directory out of the way of schroot problems.
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * grab-merge:
+     - Show an error message if the package doesn't exist.
+     - Be paraonic and add "--one-file-system" to the rm call.
+     - Delete the directory just after creating it if the package
+       doesn't exist.
+
+  [ Iain Lane ]
+  * ubuntutools/lp/lp_functions.py,
+    ubuntutools/lp/udtexceptions.py:
+    - Add new public functions that expose features from LP API
+    - Modify isLPTeamMember to use LP API
+  * requestsync
+    - Use new functions to check if user can upload requested package directly
+      instead of checking team membership
+    - Default to current development release if no release is specified on
+      commandline
+    - Correct bug supervisor team to ubuntu-bugcontrol (LP: #374563)
+    - Remove team names from sponsorship message - makes the function much
+      simpler
+  * buildd
+    - Check if user has upload privileges instead of checking for team
+      membership when seeing if operations are permitted
+
+  [ Colin Watson ]
+  * update-maintainer:
+    - Convert to getopt so that '--section main' works as well as
+      '--section=main'.
+
+  [ Anders Kaseorg ]
+  * ubuntutools/lp/functions.py:
+    - Simplify isLPTeamMember.
+
+  [ Nathan Handler ]
+  * pull-debian-source: Modify to work for packages not in main (LP: #379822)
+
+ -- Nathan Handler <nhandler@ubuntu.com>  Sat, 23 May 2009 20:41:50 +0000
+
+ubuntu-dev-tools (0.73) karmic; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+    - Fallback to calling lsb_release if /etc/lsb-release doesn't
+       exist; this makes it possible to run pbuilder-dist on Debian.
+
+  [ Nathan Handler ]
+  * pull-debian-source:
+    - Use Getopt::Long
+
+  [ Colin Watson ]
+  * submittodebian:
+    - New release cycle; use "karmic" usertag.
+  * dch-repeat:
+    - Drop EOLed gutsy and add karmic.
+  * pull-lp-source:
+    - Set default release to karmic.
+  * reverse-build-depends:
+    - Set default release to karmic.
+  * bash_completion/pbuilder-dist:
+    - Add karmic.
+    - Add squeeze.
+  * requestsync:
+    - Send a "Content-Type: text/plain; charset=UTF-8" header (LP: #246307).
+
+  [ Daniel Hahler ]
+  * grab-merge: Output error message in case wget/rsync fails.
+
+ -- Daniel Hahler <ubuntu@thequod.de>  Thu, 30 Apr 2009 22:18:38 +0200
+
+ubuntu-dev-tools (0.72) jaunty; urgency=low
+
+  [ Jonathan Davies ]
+  * README.updates: Added - lists steps to take when updating this package.
+  * grab-merge: Added --help option and manpage (LP: #349109).
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist:
+     - Add squeeze as a Debian distribution. Thanks to Marco Rodrigues.
+
+  [ Nathan Handler ]
+  * pull-debian-source:
+    - Add support for etch/oldstable
+    - Make script work for codenames (etch, lenny, squeeze, sid)
+
+  [ Ryan Kavanagh ]
+  * Ported devscripts' build-rdeps to Ubuntu and replaced
+    reverse-build-depends. Updated it's manpage. (LP: #272273)
+
+  [ Kees Cook ]
+  * mk-sbuild-lv:
+    - Fully handle missing build log directories (LP: #342154).
+    - More generalized approach to Distro-specific logic (LP: #342158).
+
+  [ Scott Kitterman ]
+  * dgetlp:
+    - Port to hashlib module instead of md5 (deprecated in Python 2.6)
+  * Bump minimum python-all-dev version to 2.5
+
+ -- Scott Kitterman <scott@kitterman.com>  Wed, 15 Apr 2009 22:51:14 -0400
+
+ubuntu-dev-tools (0.71) jaunty; urgency=low
+
+  * requestsync: Fix unclosed string literal (LP: #346794)
+
+ -- Iain Lane <laney@ubuntu.com>  Sun, 22 Mar 2009 14:40:19 +0000
+
+ubuntu-dev-tools (0.70) jaunty; urgency=low
+
+  [ Mitsuya Shibata ]
+  * requestsync: Added -e option for FeatureFreezeException explanations and
+    updated manpage.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Thu, 19 Mar 2009 19:54:13 +0000
+
+ubuntu-dev-tools (0.69) jaunty; urgency=low
+
+  * mk-sbuild-lv: add --force-yes when installing $BUILD_PKGS (needed for
+    Dapper at least)
+  * mk-sbuild-lv: update sed command to use '-i' instead of redirecting
+    output to the opened file
+
+ -- Jamie Strandboge <jamie@ubuntu.com>  Tue, 17 Mar 2009 11:28:38 -0500
+
+ubuntu-dev-tools (0.68) jaunty; urgency=low
+
+  * debian/control: Moved debootstrap to Recommends from Depends.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Sun, 15 Mar 2009 15:30:48 +0000
+
+ubuntu-dev-tools (0.67) jaunty; urgency=low
+
+  [ Jonathan Davies ]
+  * mk-sbuild-lv: Changed default behaviour so that the initial build and log
+    directories are not created on first run; instead read settings file and
+    check if they exist (LP: #342154).
+  * requestsync: Reverted old madison.php workaround (LP: #183346).
+
+  [ Ryan Kavanagh ]
+  * mk-sbuild-lv: Added support for Debian chroots. Updated manpage.
+    (LP: #342158)
+
+  [ Mitsuya Shibata ]
+  * pull-debian-source: Detect existence of dget in multi-path environment.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Sat, 14 Mar 2009 22:40:05 +0000
+
+ubuntu-dev-tools (0.66) jaunty; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * debian/control:
+     - Add "debootstrap" as a Recommends (LP: #334848).
+  * pbuilder-dist:
+     - Better error messages if cowbuilder/pbuilder/debootstrap isn't installed.
+
+  [ Marco Rodrigues ]
+  * Remove workaround for Debian madison, it works fine now.
+
+  [ Nathan Handler ]
+  * pull-debian-source:
+    - Check if 'dget' is available
+    - Update Copyright/License info
+  * debian/copyright:
+    - Update my copyright information
+
+  [ Jonathan Davies ]
+  * Added grab-merge from merges.ubuntu.com (LP: #155098).
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Thu, 09 Mar 2009 17:01:19 +0000
+
+ubuntu-dev-tools (0.65) jaunty; urgency=low
+
+  [ Colin Watson ]
+  * manage-credentials: Fix typo.
+
+  [ Jonathan Davies ]
+  * requestsync: Only check existing reports if the --lp flag is used.
+
+  [ Luca Falavigna ]
+  * Add per-package upload permission checks:
+    - ubuntutools/lp/functions.py: implement isPerPackageUploader.
+    - requestsync: check if submitter has per-package upload permission
+      using isPerPackageUploader function and adjust report accordingly.
+
+  [ Iain Lane ]
+  * requestsync: Drop "please" in bug titles, per recent discussion on the
+    ubuntu-bugsquad ML.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Tue, 03 Mar 2009 19:55:19 +0000
+
+ubuntu-dev-tools (0.64) jaunty; urgency=low
+
+  * Import urllib2 and sys in lp/functions.py, fixing requestsync.
+  * Import ubuntutools.common explicitely in buildd and requestsync to get the
+    https_proxy fix.
+
+ -- Loic Minier <lool@dooz.org>  Fri, 06 Feb 2009 12:18:13 +0100
+
+ubuntu-dev-tools (0.63) jaunty; urgency=low
+
+  * debian/links: add it (forgot to do so before).
+  * bash-completion/pbuilder-dist: recognize cowbuilder- and -jaunty.
+  * pbuilder-dist:
+     - Fixed a bug which broke pbuilder-dist when "build" was omited; just
+       giving a .dsc works now.
+     - {p,cow}builder-dist will now complain if you try to build a .changes
+       file (or anything else that isn't a .dsc).
+
+ -- Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>  Thu, 05 Feb 2009 16:19:03 +0100
+
+ubuntu-dev-tools (0.62) jaunty; urgency=low
+
+  * Fix ubuntutools.lp.libsupport import in lp-set-dup.
+
+ -- Loic Minier <lool@dooz.org>  Wed, 04 Feb 2009 12:04:47 +0100
+
+ubuntu-dev-tools (0.61) jaunty; urgency=low
+
+  [ Terence Simpson ]
+  * dgetlp: Replaced Bash version with a new Python script.
+
+  [ Luca Falavigna ]
+  * setup.py: install ubuntutools/lp files.
+
+ -- Luca Falavigna <dktrkranz@ubuntu.com>  Tue, 03 Feb 2009 13:34:42 +0100
+
+ubuntu-dev-tools (0.60) jaunty; urgency=low
+
+  [ Jonathan Davies ]
+  * ubuntutools/common.py: Now split into multiple files depending on
+    function.
+  * Adjusted imports on all files as necessary for the change above.
+  * Removed ubuntutools/misc.py's mkdir function - superseded by
+    os.makedirs().
+  * dgetlp: Improved error message to show that dgetlp only accepts HTTP
+    URLs (LP: #322051).
+
+  [ Iain Lane ]
+  * requestsync: Only attempt to change bug importance if in ubuntu-dev, as it
+    will fail otherwise (LP: #320984).
+  * ubuntutools/lp/functions.py: Rename urlopener import as it conflicts with
+    a variable, causing an error.
+
+  [ Luca Falavigna ]
+  * pull-debian-source: do not fail if package name contains a hypen.
+  * buildd: display help message if no parameters are passed.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Sun, 01 Feb 2009 10:55:42 +0000
+
+ubuntu-dev-tools (0.59) jaunty; urgency=low
+
+  * Move /etc/bash_completion.d/pbuilder-dist/pbuilder-dist created in
+    pre-0.30 versions to /etc/bash_completion.d/pbuilder-dist in the preinst.
+
+ -- Loic Minier <lool@dooz.org>  Mon, 19 Jan 2009 18:02:55 +0100
+
+ubuntu-dev-tools (0.58) jaunty; urgency=low
+
+  [ Loic Minier ]
+  * Fix a bunch of hyphen-used-as-minus-sign lintian informational tags.
+  * Don't repeat Section in the binary package's control chunk (pleases
+    lintian).
+  * New script, lp-set-dup, allows marking a bug and all its dups as a
+    duplicate of a new main bug.
+   * Re-add debian/pycompat to have an idempotent clean:: as cdbs creates the
+     file during clean; Debian #512300.
+
+ -- Loic Minier <lool@dooz.org>  Mon, 19 Jan 2009 17:45:26 +0100
+
+ubuntu-dev-tools (0.57) jaunty; urgency=low
+
+  * requestsync: Skip existing bug check if no credentials are
+    found (LP: #318120).
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Sat, 17 Jan 2009 22:02:39 +0000
+
+ubuntu-dev-tools (0.56) jaunty; urgency=low
+
+  * manage-credentials: Tighted security by making credentials files and
+    folder world unreadable.
+  * common.py: Improved no credentials found error message to show which
+    consumer token is needed.
+  * requestsync: Catch credentials error to hide traceback.
+  * Moved common.py to ubuntutools/ subdirectory to avoid possible conflicts
+    in Python packaging and fixed all imports as necessary.
+  * debian/ubuntu-dev-tools.install: Removed common.py entry.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Sat, 17 Jan 2009 11:32:33 +0000
+
+ubuntu-dev-tools (0.55) jaunty; urgency=low
+
+  * manage-credentials: Use common.py's mkdir function to create as many
+    subdirectories as necessary for the credentials directory (LP: #317317).
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Thu, 15 Jan 2009 12:33:31 +0000
+
+ubuntu-dev-tools (0.54) jaunty; urgency=low
+
+  * manage-credentials:
+    - Save credentials to ~/.cache/lp_credentials/ by
+      default.
+    - Set service option default to edge.
+  * doc/manage-credentials.1: Update as necessary for the above.
+  * common.py:
+    - When credentials are not found, ask user to see
+      manage-credentials manpage.
+    - Load all token files for the consumer specified in the above
+      directory as necessary.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Wed, 14 Jan 2009 19:39:35 +0000
+
+ubuntu-dev-tools (0.53) jaunty; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * debian/copyright:
+     - Add information about manage-credentials.
+
+  [ Daniel Holbach ]
+  * debian/control: replace 'sb-release' with lsb-release, make package
+    installable again.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Wed, 14 Jan 2009 16:27:34 +0100
+
+ubuntu-dev-tools (0.52) jaunty; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * pbuilder-dist.new:
+    - Add compatibility for cowbuilder.
+    - Fix the mainonly support.
+    - Rename build.log to last_operation.log.
+  * pbuilder-dist, pbuilder-dist.new:
+    - Replace pbuilder-dist with pbuilder-dist.new.
+  * debian/links:
+    - Symlink /usr/bin/cowbuilder-dist to /usr/bin/pbuilder-dist, and the
+      same with the manpage.
+  * debian/control:
+    - Add cowdancer as alternative recommends to pbuilder.
+  * doc/pbuilder-dist.1:
+    - Update it to explain the usage for the new pbuilder-dist script.
+  * doc/mk-sbuild-lv.1:
+    - Fix an error (and get ride of a lintian warning).
+
+  [ Nathan Handler ]
+  * pull-debian-source:
+    - Pass -xu arguments to dget to be consistant with pull-lp-source
+    - Add support for packages with a name beginning with "lib" (LP: #314732)
+
+  [ Kees Cook ]
+  * mk-sbuild-lv:
+    - add --skip-updates to allow building security-only chroots.
+    - add "apt-utils" as a default package for sane dist-upgrades.
+
+  [ Jonathan Davies ]
+  * buildd: Don't show arch override message if operation to perform is
+    'status'.
+  * requestsync: If package is new, check the Ubuntu Archive team's bug list
+    for possible duplicate requests.
+  * doc/manage-credentials.1: Written up.
+  * doc/requestsync.1: Changed documentation to launchpadlib related-stuff.
+
+  [ Luca Falavigna ]
+  * requestsync:
+    - Catch AssertionError exception if rmadison returns with an error.
+
+  [ Markus Korn ]
+  * Added manage-credentials, a tool to create (and manage) credentials
+    which are used to access launchpad via the API.
+  * Ported: hugdaylist, massfile, grab-attachment and requestsync to
+    launchpadlib.
+  * Other misc. fixes and tweaks.
+  * Install common.py to correct location with py_modules and remove
+    hardcoded path from files.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Wed, 14 Jan 2009 13:21:35 +0000
+
+ubuntu-dev-tools (0.51) jaunty; urgency=low
+
+  * buildd: Added checks for arch-indep packages and packages which have no
+    builds in a release.
+  * hugdaylist: String improvements.
+  * requestsync:
+    - Use optparse instead of getopt for option parsing.
+    - Skip existing bug report check if python-launchpad-bugs is not
+      installed.
+    - Implemented sleeps to --lp bug reporting in case of a slow
+      Launchpad to stop mass bug filing (LP: #311289).
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Tue, 30 Dec 2008 15:51:55 +0000
+
+ubuntu-dev-tools (0.50.1) jaunty; urgency=low
+
+  * Modified setup.py to actually install pull-debian-source.
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Tue, 30 Dec 2008 15:39:35 +0000
+
+ubuntu-dev-tools (0.50) jaunty; urgency=low
+
+  [ Nathan Handler ]
+  * Add pull-debian-source script (LP: #289141)
+    - debian/copyright:
+      + Add myself to the Upstream Authors and Copyright sections
+      + Add pull-debian-source to the License section
+    - Add doc/pull-debian-source.1
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * debian/control: Add perl-modules and libwww-perl as Recommended packages
+
+  [ Iain Lane ]
+  * pbuilder-dist.new: Add 'experimental' to list of known Debian releases.
+    pbuilder-experimental works fine with pbuilder-dist.new.
+
+  [ Jonathan Davies ]
+  * buildd: Show which architectures are available in help and created a
+    list of them for easy addition of new ones.
+  * requestsync:
+    - Readd sponsorship flag and related documentation in
+      doc/requestsync.1 (LP: #270605).
+    - Do not check package's Launchpad bug list page if the package to be
+      synced is a new package. As this page does not exist for
+      it (LP: #312297).
+
+ -- Jonathan Davies <jpds@ubuntu.com>  Mon, 29 Dec 2008 18:45:02 +0000
+
+ubuntu-dev-tools (0.49) jaunty; urgency=low
+
+  [ Sarah Hobbs ]
+  * Add armel as an arch to buildd
+
+  [ Adrien Cunin ]
+  * Added ${misc:Depends} to dependencies to make lintian quiet
+
+ -- Adrien Cunin <adri2000@ubuntu.com>  Sun, 30 Nov 2008 23:23:01 +0100
+
+ubuntu-dev-tools (0.48) jaunty; urgency=low
+
+  * common.py, checkReleaseExists() and checkSourceExists(): Add support for
+    specifying pockets (e. g. release name "intrepid-proposed").
+  * buildd: Strip off pocket from release name when parsing the builds page,
+    so that this script works for pockets, too.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Tue, 11 Nov 2008 10:15:25 +0100
+
+ubuntu-dev-tools (0.47) jaunty; urgency=low
+
+  [ Kees Cook ]
+  * dch-repeat: drop "feisty" from the list of known releases.
+  * mk-sbuild-lv:
+    - only use --no-install-recommends on gutsy and later.
+    - catch errors produced by "finish.sh".
+
+  [ James Westby ]
+  * requestsync: tell the user when you are waiting for input from them after
+    giving the sponsorship warning, rather than appearing to hang.
+
+  [ Michael Casadevall ]
+  * buildd: Fixed rescore (tested by Sarah Hobbs)
+  * submittodebian: Changed default tag to Jaunty
+  * pbuilder-dist: Added jaunty to ubuntu releases
+  * pull-lp-source: Made jaunty the default
+  * dch-repeat: Added jaunty
+
+ -- Michael Casadevall <sonicmctails@gmail.com>  Sat, 08 Nov 2008 06:33:00 -0500
+
+ubuntu-dev-tools (0.46) intrepid; urgency=low
+
+  [ Daniel Hahler ]
+  * submittodebian: use "intrepid" for Usertags (LP: #276073)
+
+  [ Matt Zimmerman ]
+  * add new program 'ubuntuiso' which prints information about Ubuntu isos by
+    extracting files from them
+  * Add Recommends: genisoimage for ubuntuiso
+
+  [ Colin Watson ]
+  * update-maintainer: Convert to plain #! /bin/sh.
+
+  [ Cesare Tirabassi ]
+  * remove -X option from grep-dctrl. It doesn't obtain the wished behaviour.
+
+ -- Matt Zimmerman <mdz@ubuntu.com>  Thu, 02 Oct 2008 22:34:44 +0100
+
+ubuntu-dev-tools (0.45) intrepid; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * common.py:
+     - Trying to read from a locked sqlite cookie database isn't a fatal
+       error anymore.
+
+  [ Adrien Cunin ]
+  * update-maintainer:
+     - check at the beginning of the script that the necessary files are
+       readable/writable, and note which control files we are going to modify
+     - at the end, only modify those control files, so that the script doesn't
+       return 1 anymore when it was actually successful
+  * pbuilder-dist:
+     - Eliminated some warning with a better check for whether a given distro
+       already has a pbuilder chroot in $BASE_DIR, when that distro is not
+       known by the script
+     - Added intrepid as a known distro
+  * Return to previous versioning, without the ubuntu1 bit
+
+  [ Jonathan Patrick Davies ]
+  * buildd: Revert arch:status string format.
+
+  [ Cesare Tirabassi ]
+  * reverse-build-depends:
+    - add -X option to grep-dctrl so that it only works with exact matches
+      (LP: #272273).
+
+ -- Adrien Cunin <adri2000@ubuntu.com>  Wed, 24 Sep 2008 16:01:09 +0200
+
+ubuntu-dev-tools (0.44ubuntu1) intrepid; urgency=low
+
+  * Bazaar revision 203.
+
+  [ Colin Watson ]
+  * Fix a number of minor glitches in manual pages.
+
+  [ Jonathan Patrick Davies ]
+  * debian/control:
+    - Improved description.
+    - Wrapped Depends line and bumped debhelper build-dependency version to 6.
+  * debian/compat: Changed to 6.
+  * Moved https_proxy dropping code to common.py.
+  * requestsync: Check for already existing sync requests before filing a new
+    one.
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Tue, 02 Sep 2008 21:43:49 +0100
+
+ubuntu-dev-tools (0.43ubuntu1) intrepid; urgency=low
+
+  * Bazaar revision 195.
+
+  [ Jonathan Patrick Davies ]
+  * common.py:
+    - If loading a cookie file raises an exception exit.
+    - Improve cookie file writing.
+    - New function: isLPTeamMember() - checks if the user is a member of the
+      Launchpad team using cookies for authentication.
+    - New function: packageComponent() - returns which component a package in
+      Ubuntu is in.
+  * requestsync:
+    - Return an error when the script is unable to connect to
+      packages.debian.org (LP: #261916).
+    - Adapt team checking with the function above.
+  * buildd:
+    - Adapt privilege checking code to the new function above.
+    - Check which component the package is in.
+
+  [ Ryan Kavanagh ]
+  * dgetlp.1: New manpage
+  * dgetlp: fix typo in usage
+  * hugdaylist.1: New manpage
+  * s/requestsync/pull-lp-source/g in doc/pull-lp-source.1
+  * mk-sbuild-lv.1: New manpage
+
+  [ Karl Goetz ]
+  * Add a Recommends: on ca-certificates (LP: #247157).
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Sun, 31 Aug 2008 11:40:30 +0200
+
+ubuntu-dev-tools (0.42ubuntu1) intrepid; urgency=low
+
+  [Jonathan Patrick Davies]
+  * requestsync: Exit when connecting to Launchpad fails.
+  * doc/requestsync.1: Document new -d flag.
+  * common.py: New functions: checkReleaseExists() and checkSourceExists().
+  * buildd and pull-lp-source: Adapt code to use new functions above.
+
+  [ Jelmer Vernooij ]
+  * requestsync: Add -d option to allow overriding the Debian distro to sync
+  from. (LP: #253497)
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Sun, 24 Aug 2008 21:43:30 +0100
+
+ubuntu-dev-tools (0.41) intrepid; urgency=low
+
+  [ Loic Minier ]
+  * Replace .BB in doc/pbuilder-dist.1 with a newline to fix a syntax error.
+  * Drop spurious tab in buildd.
+  * When https_proxy is in the environment, output a warning and disable it as
+    urllib/urllib2 don't support it; see LP #122551.
+
+  [ Kees Cook ]
+  * common.py: allow for multiple firefox instances, check all possible
+    cookie files.
+
+ -- Kees Cook <kees@ubuntu.com>  Wed, 20 Aug 2008 10:58:24 -0700
+
+ubuntu-dev-tools (0.40ubuntu3) intrepid; urgency=low
+
+  * Import urllib2.
+
+ -- Loic Minier <lool@dooz.org>  Mon, 18 Aug 2008 12:07:27 +0200
+
+ubuntu-dev-tools (0.40ubuntu2) intrepid; urgency=low
+
+  * requestsync: Correct print statement redirect to sys,stderr.
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Mon, 18 Aug 2008 10:59:59 +0100
+
+ubuntu-dev-tools (0.40ubuntu1) intrepid; urgency=low
+
+  * Bazaar revision 174.
+  * buildd: Code cleanup on single arch options.
+  * doc/buildd.1: Created.
+  * doc/requestsync.1: Added note about sponsorship detecting.
+  * requestsync: Suggest using the --lp flag when mailing a request encounters
+    a failure.
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Sat, 16 Aug 2008 23:38:41 +0100
+
+ubuntu-dev-tools (0.39ubuntu1) intrepid; urgency=low
+
+  * Bazaar revision 169.
+
+  [ Jonathan Patrick Davies ]
+  * common.py: Use os.path.expanduser() instead of os.environ.
+  * buildd:
+    - Added optparse support for option handling.
+    - Added support to request the rebuilding or rescoring of only one
+      architecture.
+    - Various other improvements.
+  * hugdaylist: Improved number of bugs option handling.
+  * get-branches: Improved option handling.
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * debian/control:
+     - Add sbuild as an alternative recommends to pbuilder.
+  * what-patch, pull-debian-debdiff, mk-sbuild-lv, dch-repat, debian/copyright:
+     - Change the license of all scripts from Kees Cook to the GPL version 3
+       or later.
+     - Order the script names alphabetically in debian/copyright.
+  * common.py:
+     - Add functions mkdir and readlist.
+
+  [ Iain Lane ]
+  * pull-lp-source: Better handle errors when going to LP
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Thu, 14 Aug 2008 12:21:45 +0100
+
+ubuntu-dev-tools (0.38ubuntu1) intrepid; urgency=low
+
+  [ Jonathan Patrick Davies ]
+  * requestsync: Check if user is a member of ubuntu-core-dev if sync request
+    is for a package in main.
+  * common.py: Change cookie file permissions to read and write only by user.
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Tue, 12 Aug 2008 14:52:34 +0100
+
+ubuntu-dev-tools (0.37ubuntu1) intrepid; urgency=low
+
+  [ Jonathan Patrick Davies ]
+  * get-branches:
+    - Open the teams code page before making a new directory.
+    - Now check team option before anything else.
+    - Check that the team has branches before downloading.
+  * doc/get-branches.1: Created.
+  * hugdaylist: Improved argument and error handling.
+  * pull-lp-source:
+    - Use optparse for option handling.
+    - Check that the 'release' and 'package' actually exist on Launchpad.
+    - Use subprocess for dget calls.
+  * buildd: Imported from Martin Pitt's scripts.
+  * common.py: Python module to be used to enable the use of cookies
+    to authenticate with Launchpad.
+  * debian/ubuntu-dev-tools.install: Added line to install common.py above to
+    the correct location.
+  * requestsync:
+    - Use the functions in the common.py file above to authenticate with
+      Launchpad.
+    - Using the Launchpad cookie file, validate that the user is a member of
+      the ubuntu-dev team on Launchpad. Thus, checking if the user needs
+      sponsership or not (LP: #130648).
+  * doc/requestsync.1: Removed mention of -s flag. Obsoleted by the above.
+  * massfile:
+    - Use the functions in the common.py file above to authenticate with
+      Launchpad.
+  * debian/control: Changed XS-Python-Version to >= 2.5.
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * Add the GNU General Public License header to all scripts.
+  * Remove files AUTHORS (it duplicated content from debian/copyright) and
+    README (superseded by the manpages).
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Tue, 12 Aug 2008 14:48:35 +0100
+
+ubuntu-dev-tools (0.36ubuntu1) intrepid; urgency=low
+
+  [ Jonathan Patrick Davies ]
+  * doc/ Created new manpages for:
+    - what-patch.1.
+    - dch-repeat.1.
+    - grab-attachment.1.
+  * doc/requestsync.1: Described variables used by requestsync in man
+    page. (LP: #237595)
+  * hugdaylist:
+    - Added code to handle exceptions and short version of GPL.
+    - Rewrote option handling with optparse.
+    - Filter bugs subscribed to the ubuntu-archive team.
+  * get-branches:
+    - Rewrote option handling with optparse.
+    - Added short version of GPL to header.
+    - Fixed regular expressions to work with new Launchpad interface.
+    - Use subprocess.call() on Bazaar instead of os.system().
+  * debian/copyright: Updated Authors and copyrights.
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * Change the versioning scheme from 0.XX to 0.XXubuntu1. Delete
+    debian/source.lintian-overrides, as with this it isn't necessary anymore.
+  * General manpage cleanup (fix typos, use the same section names in all
+    manpages, etc).
+
+ -- Jonathan Patrick Davies <jpds@ubuntu.com>  Sun, 10 Aug 2008 22:02:05 +0100
+
+ubuntu-dev-tools (0.35) intrepid; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals ]
+  * doc/update-maintainer.1:
+     - Remove the reference to the --no-changelog option from the manpage.
+  * requestsync:
+     - If the email interface is used, check if DEBEMAIL is set before anything
+       else (LP: #254632).
+  * massfile, examples/massfile.instructions:
+     - Make it possible to give the created bugs a determined status.
+  * debian/control:
+     - Bump Standards Version to 3.8.0.
+  * debian/rules:
+     - It's not necessary anymore to remove usr/lib.
+  * setup.py:
+     - Order the scripts list alphabetically and add pull-lp-source.
+
+  [ Iain Lane ]
+  * Add pull-lp-source, which get source packages from LP to avoid mirror lag.
+  * pbuilder-dist.new:
+     - Set mirror and component for Debian distros.
+     - Use local apt cache if available.
+  * massfile:
+     - Modify it to work with Firefox 3 cookies, taking code from requestsync.
+     - Set the status to Confirmed, by default.
+
+ -- Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>  Sat, 09 Aug 2008 13:58:23 +0200
+
+ubuntu-dev-tools (0.34) intrepid; urgency=low
+
+  * update-maintainer: Remove dangling reference to --nochangelog
+    in usage function.
+
+ -- Luke Yelavich <themuso@ubuntu.com>  Mon, 28 Jul 2008 15:50:38 +1000
+
+ubuntu-dev-tools (0.33) intrepid; urgency=low
+
+  * update-maintainer: Stop mentioning "Modify Maintainer: value blabla" since
+    it is a required global policy anyway and totally pointless changelog
+    noise.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Fri, 18 Jul 2008 12:29:57 +0100
+
+ubuntu-dev-tools (0.32) intrepid; urgency=low
+
+  [ Iain Lane ]
+  * requestsync: Fix bug where requestsync would fall over when requesting
+    sync for package with no local changes.
+
+  [ Kees Cook ]
+  * dch-repeat: drop edgy, add intrepid.  Update Copyright years.
+
+  [ Mario Limonciello ]
+  * mk-sbuild-lv: Add lpia build support.
+  * mk-sbuild-lv: Copy mirror used for debootstrap into chroot too.
+
+ -- Mario Limonciello <mario_limonciello@dell.com>  Thu, 17 Jul 2008 11:20:49 -0500
+
+ubuntu-dev-tools (0.31) intrepid; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * pbuilder-dist.new:
+     - Rewrite the script in Python to make it more robust and faster.
+  * what-patch:
+     - If cdbs-edit-patch is used, output "cdbs (patchsys.mk)" instead of
+       just "cdbs" (LP: #195795).
+  * check-symbols:
+     - Add a brief explanation about why sudo privilegies are required
+       in order to run this script (LP: #194622).
+     - End with exit code 1 if there's an error.
+  * suspicious-source:
+     - Whitelist C# files (LP: #225691): *.cs.
+     - Whitelist manpages: *.[0-9].
+
+  [ Daniel Hahler ]
+  * requestsync:
+     - Use debian_bundle.changelog.Version for version comparison in
+       debian_changelog.
+     - Fix --lp for Firefox 3 (LP: #208808):
+       It now tries ~/.lpcookie.txt, ~/.mozilla/*/*/cookies.sqlite and
+       ~/.mozilla/*/*/cookies.txt to find a Launchpad cookie file.
+       Also added a hint that you can create a valid file, by logging into
+       Launchpad with Firefox.
+     - Added confirm loops, which displays the message to be send/posted and
+       either allows to edit (or forces to, in case of Ubuntu changes).
+       (LP: #194613, #194615)
+       This adds a convient edit_report method, which gets used both from the
+       Launchpad and mail code path.
+     - Do not fallback to submitting by email, if posting to Launchpad failed.
+       This hasn't been requested and therefore should not get done.
+     - post_bug: Catch IOError when setting bug importance (LP: #190061)
+     - mail_bug: Catch socket.error (LP: #190739)
+
+  [ Kees Cook ]
+  * mk-sbuild-lv
+    - don't install recommended packages during chroot install.
+    - allow customization of schroot.conf suffix and LV/snapshot sizes.
+  * what-patch:
+    - restore previous output behavior, added logic to verbose test instead.
+    - added details for each patch system report.
+  * pull-debian-debdiff:
+    - parse .dsc file for required source files.
+    - switch to GPLv3
+  * debian/control: add Depends needed for pull-debian-debdiff.
+  * debian/copyright:
+    - updated pull-debian-debdiff, which is now GPLv3.
+    - adjusted Copyright lines to make lintian happy.
+
+ -- Kees Cook <kees@ubuntu.com>  Fri, 13 Jun 2008 11:43:24 -0700
+
+ubuntu-dev-tools (0.30) hardy; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * pbuilder-dist-simple, doc/pbuilder-dist-simple.1, setup.py:
+     - Add the original pbuilder-dist script as pbuilder-dist-simple.
+  * setup.py:
+     - Really install reverse-build-depends (LP: #203523).
+  * debian/source.lintian-overrides:
+     - Override lintian's useless warnings (about this being a NMU).
+
+  [ Adrien Cunin ]
+  * debian/ubuntu-dev-tools.install: install bash_completion/pbuilder-dist in
+    /etc/bash_completion.d/ instead of /etc/bash_completion.d/pbuilder-dist/
+  * bash_completion/pbuilder-dist: apply the completion not only to
+    pbuilder-dist but also to pbuilder-{hardy,sid,etc.}
+
+ -- Siegfried-Angel Gevatter Pujals (RainCT) <rainct@ubuntu.com>  Tue, 08 Apr 2008 16:33:52 +0200
+
+ubuntu-dev-tools (0.29) hardy; urgency=low
+
+  * grab-attachments, setup.py: added grab-attachments tool. You give it bug
+    numbers, it gets you their attachments. Useful for sponsoring.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Mon, 10 Mar 2008 11:31:50 +0100
+
+ubuntu-dev-tools (0.28) hardy; urgency=low
+
+  [ Adrien Cunin ]
+  * pbuilder-dist:
+     - Fixed minor bash syntax error
+     - Removed quotes around the path when using --aptconfdir, otherwise
+       pbuilder create fails
+
+  [ Kees Cook ]
+  * mk-sbuild-lv: add --personality option from Jamie Strandboge (LP: #199181)
+  * check-symbols: rename temp files to avoid .so versioning confusion.
+
+ -- Kees Cook <kees@ubuntu.com>  Thu, 06 Mar 2008 11:05:02 -0800
+
+ubuntu-dev-tools (0.27) hardy; urgency=low
+
+  [ Andrew Hunter ]
+  * ppaput:
+    - Separated ppaput script from backend python modules (LP: #192184).
+    - Switched from homegrown option parseing to Optparse, much more
+      robust and less code duplication.
+
+  [ Daniel Holbach ]
+  * README, debian/rules, doc/ppaput.1.docbook, ppaput, setup.py: removed
+    ppaput for now. It has shortcomings and is not actively used in the
+    sponsoring process (LP: #194634).
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * This upload removes accidentaly uploaded files (LP: #194635, #194618,
+    #194621).
+  * Remove executable bit from AUTHORS file (LP: #194619).
+  * debian/control:
+     - Change the Vcs-Bzr address to the correct one.
+     - Move the reportbug dependency to Recommends.
+     - Drop docbook2x build dependency (see Daniel's changes).
+  * Move ppaput.py (the module) into new ubuntutools/ directory and
+    remove it's shabang.
+  * submittodebian:
+     - Check if reportbug is installed and if it isn't throw an error.
+  * suspicious-sources:
+     - Ignore .in files.
+  * pbuilder-dist:
+     - Apply patch from James Westby to fix a problem where it always
+       wanted to get the architecture to use as an option if a symlink
+       was being used .
+     - Fix a recently introduced problem where pbuilder-dist would always
+       want to know the architecture if a symlink was being used. Thanks to
+       Adrien Cunin and James Westby for their help on this (LP: #194633).
+     - Escape many variables to avoid possible problems there.
+     - Reorganize the code a bit and comment it.
+     - Accept "upgrade" as an alias for "update".
+     - Hide lsb_release's traceback if pbuilder-dist is manually aborted
+       while the distribution was being detected.
+  * 404main:
+     - Try to filter out entries from Debian and PPAs, thanks to Adrien
+       Cunin! (LP: #194704)
+     - Add limited support for multiple distributions (and update they
+       manpage to reflect this).
+     - TODO: Use python-apt instead of lots of pipes.
+  * debian/copyright.
+     - Add ppaput (the executable has been removed for now -see above-,
+       but there is still the module in the source package).
+  * debian/pycompat:
+     - Remove it, as it is not necessary for python-central.
+
+  [ Terence Simpson ]
+  * dgetlp:
+     - Fix bug where optaining the .orig.tar.gz would fail if the package
+       name contains hypens.
+     - Add support for native packages.
+
+ -- Siegfried-Angel Gevatter Pujals (RainCT) <rainct@ubuntu.com>  Sun, 24 Feb 2008 19:11:06 +0100
+
+ubuntu-dev-tools (0.26) hardy; urgency=low
+
+  [ Stephan Hermann ]
+  * pbuilder-dist: fixed a bug with the *sudo call.
+    changed from $SUDOREPLACE "pbuilder" to $SUDOREPLACE -- pbuilder ...
+
+  [ Daniel Hahler ]
+  * requestsync:
+    * If interaction is required (for an explanation to drop the Ubuntu
+      changes), edit the report in the sensible-editor.
+      When interaction is not required, ask the user if she wants to edit.
+      (LP: #190351)
+    * Exit, if versions in Ubuntu and Debian are the same already.
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * Add manpages for update-maintainer and 404main.
+  * Move pbuilder-dist.bash_completion into new bash_completion/
+    directory and tell dh_install to take care of the stuff there.
+  * Let update-maintainer also accept --no-changelog (in addition to
+    the current --nochangelog), improve its error messages and change
+    the default section to universe.
+  * Add AUTHORS section to doc/check-symbols.1, and little changes to
+    doc/suspicious-source.1.
+  * Fix some issues with the new pbuilder-dist code.
+
+ -- Siegfried-Angel Gevatter Pujals (RainCT) <rainct@ubuntu.com>  Sun, 17 Feb 2008 19:35:46 +0100
+
+ubuntu-dev-tools (0.25) hardy; urgency=low
+
+  [ Michael Bienia ]
+  * requestsync:
+    + Add work-around for a bug in Debian's madison.php not returning only the
+      'source' line (LP: #183346).
+    + Add support to file sync requests with python-launchpad-bugs (--lp)
+      (LP: #147994).
+    + Add line editing during input.
+  * doc/requestsync.1:
+    + Document new requestsync options.
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * what-patch:
+     - Print a list of files that have been modified outside the
+       debian/ directory (LP: #174933).
+     - Add -h and -q options.
+     - Add proper exit values.
+  * debian/control:
+     - Bump standards version to 3.7.3.
+     - Move python-central to Build-Depends-Indep.
+     - Rename XS-Vcs-{Bzr,Browser} fields to Vcs-{Bzr,Browser}.
+     - Bump minimum cdbs version to 0.4.49.
+  * Add Albert Damen to the Authors and Copyright Holders.
+  * Change my email address (to @ubuntu.com) everywhere.
+  * Add reverse-build-depends script and a manpage for it.
+  * Add requestsync and reverse-build-depends and massfile to
+    debian/copyright.
+  * Update README (add information for many missing scripts).
+  * Add the text "ubuntu-dev-tools" to the footer of all manpages.
+  * Remove duplicated ubuntu-dev-tools recommends (it's already a
+    dependency).
+
+  [ Stephan Hermann ]
+  * mk-sbuild-lv: check for debootstrap release names in
+    /usr/share/debootstreap/releases and not in /usr/lib/debootstrap/releases
+  * pbuilder-dist:
+    - check if $SYSCACHE is not set and stay with the default, if
+      SYSCACHE = 0 use the default from pbuilderrc or honor $DEBCACHE
+      (LP: #156183)
+    - removed $BINARCH check in pbuilder call, and set --debootstrapopts
+      directly, it doesn't matter when it's always set.  The Subshell call
+      didn't work  (LP: #175183)
+    - added support for --http-proxy, honours now $http_proxy or $HTTP_PROXY
+    - removed $COMPONENTS_LINE from pbuilder call, data is crippled in the
+      pbuilder chroot.
+      Instead of this behaviour add $BASE_DIR/etc/$DISTRIBUTION/apt.conf/
+      directory and install a sane sources.list, depending on the releases of Ubuntu
+      and add --aptconfdir to pbuilder call (LP: #175183)
+    - add support for gksudo|kdesudo|sudo depending on $DESKTOP_SESSION.
+      or if $PBUILDAUTH is set to something else, it will be used instead of
+      sudo|gksudo|kdesudo (LP: #172943)
+  * pbuilder-dist.bash_completion: (LP: #175728)
+    - added bash_completion instructions
+  * debian/rules:
+    - install pbuilder-dist.bash_completion to /etc/bash_completion.d/
+
+  [ Daniel Holbach ]
+  * hugdaylist: drop one Ubuntu filter statement.
+
+  [ Kees Cook ]
+  * what-patch: change default operation back to quiet mode -- script is used
+    in automated tools, so default behavior is best to leave unchanged.
+  * check-symbols: check for binary list very carefully.
+  * dch-repeat: add Hardy to distro list.
+  * mk-sbuild-lv: use -r instead of -f for possible debootstrap symlinks.
+
+ -- Stephan Hermann <sh@sourcecode.de>  Tue, 22 Jan 2008 19:28:34 +0100
+
+ubuntu-dev-tools (0.24) hardy; urgency=low
+
+  [ Soren Hansen ]
+  * Handle epochs properly in submittodebian.
+
+  [ Luke Yelavich ]
+  * update-maintainer: Default to main if rmadison gives no section output.
+    (LP: #179533)
+
+  [ Cesare Tirabassi ]
+  * Add man page for check-symbols (Thanks to Albert Damen - LP: #174123).
+
+  [ Michael Bienia ]
+  * requestsync:
+    + Set importance to wishlist.
+    + Strip some more whitespace.
+
+ -- Luke Yelavich <themuso@ubuntu.com>  Sun, 06 Jan 2008 21:52:26 +1100
+
+ubuntu-dev-tools (0.23) hardy; urgency=low
+
+  [ Daniel Holbach ]
+  * debian/control: bumped python-launchpad-bugs requirement to newest version
+    and made it a Recommends. All scripts in ubuntu-dev-tools using it fail
+    gracefully if it's not installed.
+  * hugdaylist:
+    - make use of text connector.
+    - commentary in wiki output.
+
+  [ Ryan Kavanagh ]
+  * Updated requestsync(1) to reflect the addition of the -k <keyid> and
+    removed a runon in DESCRIPTION.
+
+  [ Mathias Gug ]
+  * Add patch tag in submittodebian.
+
+  [ Luke Yelavich ]
+  * update-maintainer: Exit after displaying usage for --help.
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * pbuilder-dist:
+     - Move warning about changing $COMPONENTS's value to
+       the right place (it should be displayed if the installed version
+       of pbuilder is too old, not otherwise).
+     - Asume action is "build" if no recognized action is passed but
+       the next argument ends with .dsc (LP: #172940).
+  * dgetlp:
+     - Add "-h", "--help" and "--debug" (-d was already there)
+  * 404main:
+     - Cleanup and improvements
+     - Identify Pete Savage as it's original author
+     - Change the license to GPLv2+
+  * AUTHORS, debian/copyright:
+     - Add Pete Savage, as he wrote 404main
+  * what-patch:
+     - Ignore commented lines; patch by Daniel Hahler (LP: #163454)
+  * doc/pbuilder-dist.1:
+     - Update manpage to match recent changes (including those from 0.21).
+
+  [ Colin Watson ]
+  * Add a SYNOPSIS section to submittodebian(1) to clarify that it takes no
+    arguments.
+  * More *roff fixes.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Wed, 05 Dec 2007 09:57:41 +0100
+
+ubuntu-dev-tools (0.22) hardy; urgency=low
+
+  [ Luke Yelavich ]
+  * update-maintainer-field:
+    - Use rmadison instead of apt-cache madison.
+    - Added --nochangelog command-line argument.
+    - Check --section value.
+    - Reformatted usage information.
+    - Some code cleanup.
+
+  [ Laurent Bigonville ]
+  * requestsync:
+    -Always pass -u option to rmadison now that it defaults to ubuntu
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * Add dgetlp script (for «dgetting» from Launchpad)
+
+  [ Lucas Nussbaum ]
+  * Enabled support for Bugs/Debian/Usertagging in submittodebian
+
+  [ Michael Vogt ]
+  * debian/control:
+    - depend on reportbug (>= 3.39ubuntu1) to have working usertag support
+
+ -- Michael Vogt <michael.vogt@ubuntu.com>  Tue, 20 Nov 2007 12:15:20 +0100
+
+ubuntu-dev-tools (0.21) hardy; urgency=low
+
+  [ Laurent Bigonville ]
+  * debian/control: add a space before the Homepage pseudo-field
+  * pbuilder-dist: add hardy to the distribution list
+  * pbuilder-dist: Use new --components options (LP: #140964)
+  * pbuilder-dist: Add an empty --othermirror to override config in pbuilderrc
+
+  [ Kees Cook ]
+  * mk-sbuild-lv: fix gnupg install, adjust symlink creation
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * Add get-build-deps and it's documentation.
+  * Change the character encoding on all Python scripts to UTF-8
+  * submittodebian: better changelog location detection
+  * submittodebian: user-friendly error if python-debian isn't installed
+  * hugdaylist: improve error handling (less backtraces, more nice messages)
+  * pbuilder-dist: look for global variable $PBUILDFOLDER (LP: #160769)
+  * pbuilder-dist: check pbuilder version and only use --components if supported
+  * pbuilder-dist: don't chown "unknown distribution" warning if an environment
+    of that release already exists (LP: #160769)
+
+  [ Luke Yelavich ]
+  * debian/control:
+    - Move homepage to its own field in source package section.
+
+ -- Luke Yelavich <themuso@ubuntu.com>  Thu, 08 Nov 2007 09:57:31 +1100
+
+ubuntu-dev-tools (0.20) hardy; urgency=low
+
+  [ Cesare Tirabassi ]
+  * suspicious-source: add *.hh to list of excluded files
+  * suspicious-source: format excluded file list to fit 80 chars limit
+  * suspicious-source: corrected typos in script and manual page
+
+  [ Dainel Holbach ]
+  * hugdaylist: only mention 'unassigned bugs'.
+
+  [ Soren Hansen ]
+  * Added missing python-debian dependency (needed by submittodebian)
+
+ -- Soren Hansen <soren@ubuntu.com>  Tue, 23 Oct 2007 16:45:44 +0200
+
+ubuntu-dev-tools (0.19) gutsy; urgency=low
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * requestsync: allow to customize the SMTP server (LP: #144224)
+  * Add a short description for requestsync to the README file.
+
+  [ Laurent Bigonville ]
+  * pbuilder-dist: Fix error on chroot creation (LP: #146475)
+  * requestsync: allow to customize the SMTP port
+
+  [ Adrien Cunin ]
+  * README: minor and cosmetic changes
+
+ -- Adrien Cunin <adri2000@ubuntu.com>  Sun, 07 Oct 2007 00:24:46 +0200
+
+ubuntu-dev-tools (0.18) gutsy; urgency=low
+
+  * requestsync: add an option to "Add latest debian version to the title of
+    the bug" (LP: #132221)
+
+ -- Marco Rodrigues <gothicx@sapo.pt>  Fri, 05 Oct 2007 14:16:34 +0200
+
+ubuntu-dev-tools (0.17) gutsy; urgency=low
+
+  * submittodebian: backed out changes from last upload. This needs Debian Bug
+    445144 fixed.
+  * debian/control: don't Depends on a version of reportbug Ubuntu does not
+    have yet.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Fri, 05 Oct 2007 11:44:51 +0200
+
+ubuntu-dev-tools (0.16) gutsy; urgency=low
+
+  [ Lucas Nussbaum ]
+  * Added support for Bugs/Debian/Usertagging in submittodebian.
+
+  [ Daniel Holbach ]
+  * setup.py: actually install submittodebian.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Fri, 05 Oct 2007 11:05:29 +0200
+
+ubuntu-dev-tools (0.15) gutsy; urgency=low
+
+  [ Laurent Bigonville ]
+  * update-maintainer: correctly pass path to dch (LP: #141015)
+
+  [ Daniel Holbach ]
+  * ppaput:
+    - fix indentation issues.
+    - now respects the PPA section the package goes to (LP: #146161)
+    - add comment to bug about how to test the resulting .deb (LP: #145895)
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Mon, 01 Oct 2007 15:56:18 +0200
+
+ubuntu-dev-tools (0.14) gutsy; urgency=low
+
+  * massfile:
+    - fixed bug where to find example files,
+    - made url get checked beforehand.
+    - fixed bug, where description and summary were not updated with the
+      current source package.
+  * examples/massfile.instructions: added example buglist-url.
+  .
+  Thanks Andrew Mitchell, for helping out by fixing and clever advise.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Thu, 27 Sep 2007 11:43:55 +0200
+
+ubuntu-dev-tools (0.13) gutsy; urgency=low
+
+  * massfile: added script to file mass-bugs.
+  * debian/examples, examples/massfile.{instructions,list}: added example
+    files.
+  * setup.py: install massfile.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Thu, 27 Sep 2007 11:04:52 +0200
+
+ubuntu-dev-tools (0.12) gutsy; urgency=low
+
+  * hugdaylist: apply quick fix to not crash.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Mon, 24 Sep 2007 09:43:30 +0200
+
+ubuntu-dev-tools (0.11) gutsy; urgency=low
+
+  [ Daniel Holbach ]
+  * compare-packages, README: dropped compare-packages, debdiff has the same
+    functionality, when used with --from --to or on *.changes files.
+  * hugdaylist: prepare the list more carefully (filter out 'fixed committed'
+    bugs and bugs that have ubuntu-*-sponsors subscribed.
+
+  [ Siegfried-Angel Gevatter Pujals (RainCT) ]
+  * Added a manpage for suspicious-source.
+  * Fixed a bug in pbuilder-dist (it needed ftp.debian.org in sources.list to work with Debian).
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Mon, 24 Sep 2007 09:39:24 +0200
+
+ubuntu-dev-tools (0.10) gutsy; urgency=low
+
+  * compare-packages: added script to compare the contents of 'old' and 'new'
+    binary packages of the same source package. Useful to spot moved files,
+    dropped files, etc.
+  * README: briefly document added scripts.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Fri, 14 Sep 2007 11:23:36 +0200
+
+ubuntu-dev-tools (0.9) gutsy; urgency=low
+
+  * Added submittodebian.1
+
+ -- Soren Hansen <soren@ubuntu.com>  Thu, 13 Sep 2007 14:38:49 +0200
+
+ubuntu-dev-tools (0.8) gutsy; urgency=low
+
+  * Renamed revuput to ppaput.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Thu, 13 Sep 2007 14:35:18 +0200
+
+ubuntu-dev-tools (0.7) gutsy; urgency=low
+
+  [Colin Watson]
+  * Fix *roff use (hyphens vs. dashes, start each sentence on a new line).
+
+  [Daniel Holbach]
+  * revuput: deal with the case of NEW packages.
+  * hugdaylist: added a tool to write Wiki lists of bugs in <buglist url> as
+    in https://wiki.ubuntu.com/UbuntuBugDay/20070912
+  * debian/control: bumped python-launchpad-bugs version.
+
+ -- Colin Watson <cjwatson@ubuntu.com>  Wed, 12 Sep 2007 09:28:54 +0100
+
+ubuntu-dev-tools (0.6) gutsy; urgency=low
+
+  * Because I'm a bozo, fix up the version of the devscripts
+    Conflicts/Replaces.
+
+ -- Steve Kowalik <stevenk@ubuntu.com>  Wed, 12 Sep 2007 10:46:21 +1000
+
+ubuntu-dev-tools (0.5) gutsy; urgency=low
+
+  * Add requestsync and its manual page from devscripts. (LP: #138885)
+  * Add Conflicts/Replaces against devscripts 2.10.7ubuntu3.
+
+ -- Steve Kowalik <stevenk@ubuntu.com>  Wed, 12 Sep 2007 01:14:04 +1000
+
+ubuntu-dev-tools (0.4) gutsy; urgency=low
+
+  * revuput: added a tool to upload packages to PPA and file sponsoring bugs
+    automatically.
+  * doc/revuput.1.docbook, debian/control, debian/rules: build manpage for it
+    from DocBook.
+  * setup.py: install it.
+  * debian/control: add python-launchpad-bugs Depends.
+
+  [Soren Hansen]
+  * added submittodebian tool.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Fri, 07 Sep 2007 14:14:57 +0200
+
+ubuntu-dev-tools (0.3) gutsy; urgency=low
+
+  * debian/copyright: added Canonical copyright.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Tue, 04 Sep 2007 09:51:04 +0200
+
+ubuntu-dev-tools (0.2) gutsy; urgency=low
+
+  [ Martin Pitt ]
+  * Add suspicious-source: Output 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 'prefered form of modification' that the GPL and other
+    licenses require.
+
+  [ Luke Yelavich ]
+  * Removed ubuntu-cd and ubuntu-sync. They are currently undergoing
+    major reworking, and will be re-included when ready.
+
+ -- Luke Yelavich <themuso@ubuntu.com>  Sat,  4 Aug 2007 08:30:01 +1000
+
+ubuntu-dev-tools (0.1) gutsy; urgency=low
+
+  * Initial Release.
+
+ -- Daniel Holbach <daniel.holbach@ubuntu.com>  Fri, 01 Jun 2007 11:26:41 +0200

=== added file 'debian/clean'
--- debian/clean	1970-01-01 00:00:00 +0000
+++ debian/clean	2012-09-12 18:51:22 +0000
@@ -0,0 +1,2 @@
+*.egg-info/*
+test-data/example_*

=== added file 'debian/compat'
--- debian/compat	1970-01-01 00:00:00 +0000
+++ debian/compat	2012-09-12 18:51:22 +0000
@@ -0,0 +1,1 @@
+7

=== added file 'debian/control'
--- debian/control	1970-01-01 00:00:00 +0000
+++ debian/control	2012-09-12 18:51:22 +0000
@@ -0,0 +1,119 @@
+Source: ubuntu-dev-tools
+Section: devel
+Priority: optional
+Maintainer: Ubuntu Developers <ubuntu-dev-team@lists.alioth.debian.org>
+Uploaders: Benjamin Drung <bdrung@debian.org>,
+           Stefano Rivera <stefanor@debian.org>
+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 (>= 2.11.0~),
+               distro-info (>= 0.2~),
+               libwww-perl,
+               lsb-release,
+               pylint,
+               python-all (>= 2.6.5-13~),
+               python-apt (>= 0.7.93~),
+               python-debian (>= 0.1.20~),
+               python-distro-info (>= 0.4~),
+               python-gnupginterface,
+               python-httplib2,
+               python-launchpadlib (>= 1.5.7),
+               python-mox,
+               python-setuptools,
+               python-soappy,
+               python-unittest2
+X-Python-Version: >= 2.6
+Homepage: https://launchpad.net/ubuntu-dev-tools
+Standards-Version: 3.9.3
+
+Package: ubuntu-dev-tools
+Architecture: all
+Depends: binutils,
+         dctrl-tools,
+         devscripts (>= 2.11.0~),
+         diffstat,
+         distro-info (>= 0.2~),
+         dpkg-dev,
+         lsb-release,
+         python-apt (>= 0.7.93~),
+         python-debian (>= 0.1.20~),
+         python-distro-info (>= 0.4~),
+         python-httplib2,
+         python-launchpadlib (>= 1.5.7),
+         python-lazr.restfulclient,
+         sudo,
+         ${misc:Depends},
+         ${perl:Depends},
+         ${python:Depends}
+Recommends: bzr,
+            bzr-builddeb,
+            ca-certificates,
+            debian-archive-keyring,
+            debian-keyring,
+            debootstrap,
+            dput,
+            genisoimage,
+            libwww-perl,
+            lintian,
+            patch,
+            pbuilder | cowdancer | sbuild,
+            perl-modules,
+            python-dns,
+            python-gnupginterface,
+            python-soappy,
+            quilt,
+            reportbug (>= 3.39ubuntu1)
+Suggests: ipython, python-simplejson | python (>= 2.7), qemu-user-static
+Description: useful tools for Ubuntu developers
+ This is a collection of useful tools that Ubuntu developers use to make their
+ packaging work a lot easier.
+ .
+ Such tools include:
+ .
+  - 404main - used to check what components a package's deps are in, for
+    doing a main inclusion report for example.
+  - backportpackage - helper to test package backports
+  - bitesize - add the 'bitesize' tag to a bug and comment that you are
+    willing to help fix it.
+  - check-mir - check support status of build/binary dependencies
+  - check-symbols - will compare and give you a diff of the exported symbols of
+    all .so files in a binary package.
+  - dch-repeat - used to repeat a change log into an older release.
+  - dgetlp - download a source package from the Launchpad librarian.
+  - grab-merge - grabs a merge from merges.ubuntu.com easily.
+  - grep-merges - search for pending merges from Debian.
+  - harvest - grabs information about development opportunities from
+    http://harvest.ubuntu.com
+  - hugdaylist - compile HugDay lists from bug list URLs.
+  - import-bug-from-debian - copy a bug from the Debian BTS to Launchpad
+  - merge-changelog - manually merges two Debian changelogs with the same base
+    version.
+  - mk-sbuild - script to create LVM snapshot chroots via schroot and
+    sbuild.
+  - pbuilder-dist, cowbuilder-dist - wrapper script for managing several build
+    chroots (for different Ubuntu and Debian releases) on the same system.
+  - pull-debian-debdiff - attempts to find and download a specific version of
+    a Debian package and its immediate parent to generate a debdiff.
+  - pull-debian-source - downloads the latest source package available in
+    Debian of a package.
+  - pull-lp-source - downloads latest source package from Launchpad.
+  - pull-revu-source - downloads the latest source package from REVU
+  - requestbackport - file a backporting request.
+  - requestsync - files a sync request with Debian changelog and rationale.
+  - reverse-depends - find the reverse dependencies (or build dependencies) of
+    a package.
+  - seeded-in-ubuntu - query if a package is safe to upload during a freeze.
+  - setup-packaging-environment - assistant to get an Ubuntu installation
+    ready for packaging work.
+  - 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.
+  - syncpackage - helper to prepare .changes file to upload synced packages
+  - ubuntu-build - give commands to the Launchpad build daemons from the
+    command line.
+  - ubuntu-iso - output information of an Ubuntu ISO image.
+  - ubuntu-upload-permission - query / list the upload permissions for a
+    package.
+  - update-maintainer - script to update maintainer field in ubuntu packages.

=== added file 'debian/copyright'
--- debian/copyright	1970-01-01 00:00:00 +0000
+++ debian/copyright	2012-09-12 18:51:22 +0000
@@ -0,0 +1,191 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: Ubuntu Developer Tools
+Upstream-Contact: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Source: https://launchpad.net/ubuntu-dev-tools
+
+Files: *
+       backportpackage
+       bash_completion/pbuilder-dist
+       check-symbols
+       doc/backportpackage.1
+       doc/check-symbols.1
+       doc/requestsync.1
+       doc/ubuntu-iso.1
+       requestsync
+       setup.py
+       ubuntu-iso
+       ubuntutools/requestsync/lp.py
+       ubuntutools/requestsync/mail.py
+Copyright: 2007,      Albert Damen <albrt@gmx.net>
+           2010,      Benjamin Drung <bdrung@ubuntu.com>
+           2007-2010, Canonical Ltd.
+           2006-2007, Daniel Holbach <daniel.holbach@ubuntu.com>
+           2010,      Evan Broder <evan@ebroder.net>
+           2006-2007, Luke Yelavich <themuso@ubuntu.com>
+           2009-2010, Michael Bienia <geser@ubuntu.com>
+           2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+           2008,      Stephan Hermann <sh@sourcecode.de>
+           2007,      Steve Kowalik <stevenk@ubuntu.com>
+License: GPL-2
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, version 2 of the License.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ version 2 can be found in the /usr/share/common-licenses/GPL-2 file.
+
+Files: 404main
+       dgetlp
+       doc/404main.1
+       doc/dgetlp.1
+       doc/import-bug-from-debian.1
+       doc/pbuilder-dist-simple.1
+       doc/pbuilder-dist.1
+       doc/submittodebian.1
+       import-bug-from-debian
+       pbuilder-dist
+       pbuilder-dist-simple
+       submittodebian
+Copyright: 2007-2010, Canonical Ltd.
+           2009,      James Westby <james.westby@ubuntu.com>
+           2008,      Jamin W. Collins <jcollins@asgardsrealm.net>
+           2008,      Jordan Mantha <mantha@ubuntu.com>
+           2006-2007, Pete Savage <petesavage@ubuntu.com>
+           2009,      Ryan Kavanagh <ryanakca@kubuntu.org>
+           2007,      Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>
+           2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+           2008,      Terence Simpson <tsimpson@ubuntu.com>
+License: GPL-2+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ version 2 can be found in the /usr/share/common-licenses/GPL-2 file.
+
+Files: doc/bitesize.1
+       doc/grab-merge.1
+       doc/harvest.1
+       doc/hugdaylist.1
+       doc/merge-changelog.1
+       doc/setup-packaging-environment.1
+       doc/syncpackage.1
+       bitesize
+       grab-merge
+       harvest
+       hugdaylist
+       merge-changelog
+       setup-packaging-environment
+       syncpackage
+       ubuntutools/harvest.py
+Copyright: 2010,      Benjamin Drung <bdrung@ubuntu.com>
+           2007-2011, Canonical Ltd.
+           2008,      Jonathan Patrick Davies <jpds@ubuntu.com>
+           2008-2010, Martin Pitt <martin.pitt@canonical.com>
+           2009,      Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>
+           2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+License: GPL-3
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, version 3 of the License.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ version 3 can be found in the /usr/share/common-licenses/GPL-3 file.
+
+Files: dch-repeat
+       doc/dch-repeat.1
+       doc/grep-merges.1
+       doc/mk-sbuild.1
+       doc/pull-lp-source.1
+       doc/pull-revu-source.1
+       doc/ubuntu-build.1
+       grep-merges
+       mk-sbuild
+       pull-lp-source
+       pull-revu-source
+       ubuntu-build
+       ubuntutools/lp/libsupport.py
+       ubuntutools/lp/lpapicache.py
+       ubuntutools/misc.py
+Copyright: 2007-2010, Canonical Ltd.
+           2008-2009, Iain Lane <iain@orangesquash.org.uk>
+           2006,      John Dong <jdong@ubuntu.com>
+           2009,      Jonathan Davies <jpds@ubuntu.com>
+           2009,      Markus Korn <thekorn@gmx.de>
+           2009-2010, Michael Bienia <geser@ubuntu.com>
+           2009,      Nathan Handler <nhandler@ubuntu.com>
+           2007-2008, Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>
+           2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+License: GPL-3+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ version 3 can be found in the /usr/share/common-licenses/GPL-3 file.
+
+Files: doc/pull-debian-debdiff.1
+       doc/pull-debian-source.1
+       doc/requestbackport.1
+       doc/reverse-depends.1
+       doc/seeded-in-ubuntu.1
+       doc/sponsor-patch.1
+       doc/ubuntu-dev-tools.5
+       doc/ubuntu-upload-permission.1
+       doc/update-maintainer.1
+       enforced-editing-wrapper
+       pull-debian-debdiff
+       pull-debian-source
+       requestbackport
+       reverse-depends
+       seeded-in-ubuntu
+       sponsor-patch
+       test-data/*
+       ubuntu-upload-permission
+       ubuntutools/archive.py
+       ubuntutools/builder.py
+       ubuntutools/config.py
+       ubuntutools/question.py
+       ubuntutools/rdepends.py
+       ubuntutools/sponsor_patch/*
+       ubuntutools/test/*
+       ubuntutools/update_maintainer.py
+       update-maintainer
+Copyright: 2009-2011, Benjamin Drung <bdrung@ubuntu.com>
+           2010,      Evan Broder <evan@ebroder.net>
+           2008,      Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>
+           2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+License: ISC
+ 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.

=== added file 'debian/links'
--- debian/links	1970-01-01 00:00:00 +0000
+++ debian/links	2012-09-12 18:51:22 +0000
@@ -0,0 +1,2 @@
+/usr/bin/pbuilder-dist /usr/bin/cowbuilder-dist
+/usr/share/man/man1/pbuilder-dist.1.gz /usr/share/man/man1/cowbuilder-dist.1.gz

=== added file 'debian/rules'
--- debian/rules	1970-01-01 00:00:00 +0000
+++ debian/rules	2012-09-12 18:51:22 +0000
@@ -0,0 +1,12 @@
+#!/usr/bin/make -f
+
+%:
+	dh $@ --with python2
+
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+override_dh_auto_test:
+	set -e; \
+	for python in $(shell pyversions -r); do \
+		$$python setup.py test; \
+	done
+endif

=== added directory 'debian/source'
=== added file 'debian/source/format'
--- debian/source/format	1970-01-01 00:00:00 +0000
+++ debian/source/format	2012-09-12 18:51:22 +0000
@@ -0,0 +1,1 @@
+3.0 (native)

=== added file 'dgetlp'
--- dgetlp	1970-01-01 00:00:00 +0000
+++ dgetlp	2012-09-12 18:51:22 +0000
@@ -0,0 +1,335 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+# Copyright (C) 2008 Terence Simpson <tsimpson@ubuntu.com>
+# License:
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License along
+#  with this program; if not, write to the Free Software Foundation, Inc.,
+#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# This script simulates «dget»'s behaviour for files hosted at
+# launchpadlibrarian.net.
+#
+# Detailed description:
+# This script attempts to download the source package in the same
+# way as dget does, but from launchpadlibrarian.net, which doesn't
+# store all the files in the same directory. It (the script) assumes
+# that the files are stored in sequential directories on Launchpad
+# Librarian and attempts to download and then unpack them.
+# This is a Python rewrite of the original bash script
+
+import cStringIO
+import email.feedparser
+import hashlib
+import optparse
+import os
+import sys
+import urllib2
+
+try:
+    import GnuPGInterface
+except ImportError:
+    print >> sys.stderr, ("Please install 'python-gnupginterface' in order to "
+                          "use this utility.")
+    sys.exit(1)
+
+from ubuntutools import subprocess
+import ubuntutools.misc
+
+USAGE = u"""Usage: %prog [-d|(-v|-q)] <Launchpad URL>
+
+This scripts simulates «dget»'s behaviour for files hosted at
+launchpadlibrarian.net.
+
+If you specify the -d option then it won't do anything, except download the
+.dsc file, but just print the commands it would run otherwise.
+
+Example:
+    %prog http://launchpadlibrarian.net/10348157/coreutils_5.97-5.4ubuntu1.dsc
+"""
+
+BASE_URL = "http://launchpadlibrarian.net/"
+
+Debug = Verbose = Quiet = False
+
+def unsign(data):
+    if data.splitlines()[0] != "-----BEGIN PGP SIGNED MESSAGE-----":
+        return data
+    oldstdout = sys.stdout
+    oldstderr = sys.stderr
+    sys.stdout = sys.__stdout__
+    sys.stderr = sys.__stderr__
+    gpg = GnuPGInterface.GnuPG()
+    proc = gpg.run(["--decrypt"], create_fhs=['stdin', 'stdout'])
+    proc.handles['stdin'].write(data)
+    proc.handles['stdin'].close()
+    plain = proc.handles['stdout'].read()
+    proc.handles['stdout'].close()
+    try:
+        proc.wait()
+    except:
+        pass
+    sys.stdout = oldstdout
+    sys.stderr = oldstderr
+    return plain
+
+def get_entries(data):
+    parser = email.feedparser.FeedParser()
+    parser.feed(data)
+    return parser.close()
+
+class DscParse(object):
+    """Attempt to get the file list from the .dsc file"""
+    def __init__(self, data):
+        """
+        __init__(data)
+        Given the contents of a .dsc, parse it and extract it's content
+        """
+        self.entries = get_entries(unsign(data))
+        self.files = [x.strip().split() for x in
+                      self.entries['Files'].splitlines()]
+
+    def verify_all(self):
+        """
+        verify_all()
+        Verifies all the files, first checking the size, then the md5 sum.
+        Currently not used in this utility.
+        """
+        assert self.files, "I have no files"
+        ret = []
+        for f in self.files:
+            ret.append(self.verify(f))
+        return ret
+
+    def verify(self, name):
+        """
+        verify(name)
+        Verify the file 'name', first checking the size, then the md5 sum.
+        """
+        assert self.files, "I have no files"
+        f = None
+        if isinstance(name, list):
+            f = name
+        else:
+            for i in self.files:
+                if i[2] == name:
+                    f = i
+        if not f:
+            raise ValueError, "%s is not in the .dsc" % name
+        (md5sum, size, name) = tuple(f)
+        stat = os.stat(name)
+        if str(stat.st_size) != size:
+            return (False, name, "Expected a size of %s, got %s" % \
+                (size, stat.st_size))
+        return self.getsum(name, md5sum)
+
+    def getsum(self, name, md5sum=None):
+        """
+        getsum(name[, md5sum])
+        Read the file 'name' (in 1MB chunks) and generate an md5 sum,
+        then compares that to the md5 sum in the .dsc file.
+        """
+        chunk_size = 1073741824
+        fd = open(name, 'rb')
+        res = hashlib.md5()
+        if not md5sum:
+            assert self.files, "I have no files"
+            md5sum = [x[0] for x in self.files if x[2] == name][0]
+        data = fd.read(chunk_size)
+        while data:
+            res.update(data)
+            data = fd.read(chunk_size)
+        if res.hexdigest() != md5sum:
+            return (False, name, "Expected md5sum of %r, got %r" % \
+                                 (md5sum, res.hexdigest()))
+        return (True, name, None)
+
+    def is_native(self):
+        """
+        is_native()
+        Returns True if this .dsc describes a native debian package;
+        else false.
+        """
+        return len(self.files) == 1
+
+    # Access to fields in the .dsc via a dict-like interface
+    def __getitem__(self, item):
+        """
+        x.__getitem(item) -> x[item]
+        """
+        return self.entries.__getitem__(item)
+
+    def __contains__(self, item):
+        """
+        x.__contains__(item) -> item in x
+        """
+        return self.entries.__contains__(item)
+
+    def __getattr__(self, attr):
+        """
+        x.__getattr__(attr) -> item.attr
+        """
+        return getattr(self.entries, attr)
+
+def error(ret, msg, *args):
+    """Prints an error message, unless quiet is set, and exits with ret"""
+    if not Quiet:
+        print >> sys.stderr, msg % args
+    sys.exit(ret)
+
+def debug(msg, *args):
+    """If debugging is enabled, print a message"""
+    if Debug:
+        print >> sys.stderr, msg % args
+
+def info(msg, *args):
+    """If verbose is enabled, print a message"""
+    if Verbose:
+        print msg % tuple(args)
+
+def status(msg, *args):
+    """Prints a message, unless quiet is enabled"""
+    if not Quiet:
+        print msg % tuple(args)
+
+def download(dscinfo, number, filename, verify=True):
+    """download filename"""
+    ftype = filename.endswith(".diff.gz") and "diff.gz" or \
+        filename.endswith(".orig.tar.gz") and "orig.tar.gz" or \
+        filename.endswith(".dsc") and "dsc" or "tar.gz"
+    if verify and os.path.exists(filename):
+        info('Verifying "%s"', filename)
+        res = dscinfo.verify(filename)
+        if not res[0]:
+            error(104, "Verification of %s failed: %s", filename, res[2])
+    status("Getting %s", filename)
+    debug("%s%s/%s", BASE_URL, number, filename)
+    try:
+        fd = urllib2.urlopen("%s%s/%s" % (BASE_URL, number, filename))
+        outfd = open(filename, 'wb')
+        outfd.write(fd.read())
+        fd.close()
+        outfd.close()
+    except urllib2.HTTPError, err:
+        status(u"Failed to fetch «%s» file, aborting.", ftype)
+        error(106, "Error: (%d %s)", err.code, err.msg)
+    except urllib2.URLError, err:
+        status(u"Failed to fetch «%s» file, aborting.", ftype)
+        error(105, "Error: %s", err)
+    except IOError, err:
+        status('Could not create "%s"', filename)
+        error(107, "Error: %s", err)
+
+def unpack(filename):
+    out = open('/dev/null', 'w')
+    err = open('/dev/null', 'w')
+    cmd = ["dpkg-source", "-x", filename]
+    ret = subprocess.call(cmd, stdout=out, stderr=err)
+    out.close()
+    err.close()
+    if ret:
+        status("Failed to unpack source, aborting.")
+        sys.exit(108)
+
+def get_host(url):
+    return urllib2.splithost(urllib2.splittype(url)[1])[0]
+
+def main():
+    global Debug, Verbose, Quiet
+    parser = optparse.OptionParser(usage=USAGE)
+    parser.add_option("-d", "--debug", action="store_true", dest="debug",
+                      default=False, help="Enable debugging")
+    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
+                      default=False, help="Enable verbose output")
+    parser.add_option("-q", "--quiet", action="store_true", dest="quiet",
+                      default=False, help="Never print any output")
+
+    (options, args) = parser.parse_args()
+    ubuntutools.misc.require_utf8()
+
+    if len(args) != 1:
+        parser.error("Missing URL")
+    Debug = options.debug
+    Verbose = options.verbose
+    Quiet = options.quiet
+    if Verbose and Quiet:
+        error(4, "Specifying both --verbose and --quiet does not make sense")
+    if Quiet:
+        sys.stderr = cStringIO.StringIO()
+        sys.stdout = cStringIO.StringIO()
+
+    url = args[0]
+
+    if url.startswith("https://"):
+        url = url.replace("https://", "http://", 1)
+
+    if not url.startswith("http://"):
+        url = "http://" + url
+
+    if get_host(url).startswith("www."):
+        url = url.replace("www.", "", 1)
+
+    if get_host(url) != get_host(BASE_URL):
+        error(1, "Error: This utility only works for files on %s.\n"
+                 "Maybe you want to try dget?", BASE_URL)
+
+    (number, filename) = url.split('/')[3:]
+
+    if not filename.endswith('.dsc'):
+        error(2, "You have to provide the URL for the .dsc file.")
+
+    try:
+        number = int(number)
+    except:
+        error(3, "Bad URL format")
+
+    if os.path.exists(filename):
+        os.remove(filename)
+
+    download(None, number, filename, False)
+    try:
+        fd = open(filename)
+        dsc_data = fd.read()
+        fd.close()
+    except Exception:
+        status("Error: Please report this bug, providing the URL and attach"
+               " the following backtrace")
+        raise
+
+    dscinfo = DscParse(dsc_data)
+
+# launchpadlibrarian.net seems to store in this order:
+# For native packages:
+# <number>/.changes
+# <number>+1/.tar.gz
+# <number>+2/.dsc
+# For non-native packages:
+# <number>/.changes
+# <number>+1/.orig.tar.gz
+# <number>+2/.diff.gz
+# <number>+3/.dsc
+##
+# *Assuming* this does not change, we can figure out where the files are on
+# launchpadlibrarian.net relative to the .dsc file we're given.
+
+# Only one file listed in the .dsc means it's native package
+    if len(dscinfo.files) == 1:
+        download(dscinfo, number-1, dscinfo.files[0][-1]) # .tar.gz
+    else:
+        download(dscinfo, number-1, dscinfo.files[1][-1]) # .diff.gz
+        download(dscinfo, number-2, dscinfo.files[0][-1]) # .orig.tar.gz
+
+    status("Unpacking")
+    unpack(filename)
+
+if __name__ == "__main__":
+    main()

=== renamed file 'dgetlp' => 'dgetlp.moved'
=== added directory 'doc'
=== renamed directory 'doc' => 'doc.moved'
=== added file 'doc/404main.1'
--- doc/404main.1	1970-01-01 00:00:00 +0000
+++ doc/404main.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,29 @@
+.TH 404main 1 "February 17, 2008" "ubuntu-dev-tools"
+
+.SH NAME
+404main \- check if all build dependencies of a package are in main
+
+.SH SYNOPSIS
+\fB404main\fP <\fIpackage name\fP> [<\fIdistribution\fP>]
+
+.SH DESCRIPTION
+\fB404main\fP is a script that can be used to check if a package and
+all its build dependencies are in Ubuntu's main component or not.
+
+.SH CAVEATS
+\fB404main\fP will take the dependencies and build dependencies of the
+packages from the distribution you have first in your
+/etc/apt/sources.list file.
+.PP
+Also, because of this the <\fIdistribution\fP> option is NOT trustworthy; if
+the dependencies changed YOU WILL GET INCORRECT RESULTS.
+
+.SH SEE ALSO
+.BR apt-cache (8)
+
+.SH AUTHORS
+\fB404main\fP was written by Pete Savage <petesavage@ubuntu.com> and
+this manpage by Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 2 or
+later.

=== added file 'doc/backportpackage.1'
--- doc/backportpackage.1	1970-01-01 00:00:00 +0000
+++ doc/backportpackage.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,190 @@
+.TH BACKPORTPACKAGE "1" "December 2010" "ubuntu-dev-tools"
+.SH NAME
+backportpackage \- helper to test package backports
+.SH SYNOPSIS
+.TP
+.B backportpackage \fR[\fIadditional options\fR]
+\-\-upload <\fIupload target\fR>
+.br
+<\fIsource package name or .dsc URL/file\fR>
+.PP
+.B backportpackage \-h
+.SH DESCRIPTION
+\fBbackportpackage\fR fetches a package from one distribution release
+or from a specified .dsc path or URL and creates a no-change backport
+of that package to one or more Ubuntu releases release, optionally
+doing a test build of the package and/or uploading the resulting
+backport for testing.
+.PP
+Unless a working directory is specified, the backported package is
+fetched and built in a temporary directory in \fB/tmp\fR, which is
+removed once the script finishes running.
+.PP
+\fBbackportpackage\fR is only recommended for testing backports in a
+PPA, not uploading backports to the Ubuntu archive.
+.SH OPTIONS
+.TP
+.B \-d \fIDEST\fR, \fB\-\-destination\fR=\fIDEST\fR
+Backport the package to the specified Ubuntu release. If this option
+is unspecified, then \fBbackportpackage\fR defaults to the release on
+which it is currently running.
+.TP
+.B \-s \fISOURCE\fR, \fB\-\-source\fR=\fISOURCE\fR
+Backport the package from the specified release, which can be any
+release of your distribution or any of your distribution's parent
+distributions. If neither this option nor \fB\-\-version\fR are
+specified, then \fBbackportpackage\fR defaults to the current
+development release for your distribution.
+.TP
+.B \-S \fISUFFIX\fR, \fB\-\-suffix\fR=\fISUFFIX\fR
+Add the specified suffix to the version number when
+backporting. \fBbackportpackage\fR will always append
+~ubuntu\fIDESTINATION\fR.1 to the original version number, and if
+\fISUFFIX\fR is specified, it is appended to that, to get version
+numbers of the form
+\fIORIGINAL_VERSION\fR~ubuntu\fIDESTINATION\fR.1\fISUFFIX\fR. If the
+backported package is being uploaded to a PPA, then \fISUFFIX\fR
+defaults to \fB~ppa1\fR, otherwise the default is blank.
+.TP
+.B \-b\fR, \fB\-\-build
+Build the package with the specified builder before uploading. Note
+for \fBcowbuilder\fR(8) and \fBpbuilder\fR(8) users:
+This assumes the common configuration,
+where the \fBARCH\fR and \fBDIST\fR environment is read by \fBpbuilderrc\fR(5)
+to select the correct base image.
+.TP
+.B \-B \fIBUILDER\fR, \fB\-\-builder\fR=\fIBUILDER
+Use the specified builder to build the package. Supported are
+\fBcowbuilder\fR(8), \fBcowbuilder-dist\fR(1), \fBpbuilder\fR(8),
+\fBpbuilder-dist\fR(1), and \fBsbuild\fR(1).
+The default is \fBpbuilder\fR(8).
+.TP
+.B \-U\fR, \fB\-\-update
+Update the build environment before attempting to build.
+.TP
+.B \-u \fIUPLOAD\fR, \fB\-\-upload\fR=\fIUPLOAD\fR
+Upload to \fIUPLOAD\fR with \fBdput\fR(1) (after confirmation).
+.TP
+.B \-k \fIKEYID\fR, \fB\-\-key\fR=\fIKEYID\fR
+Specify the key ID to be used for signing.
+.TP
+.B \-\-dont\-sign
+Do not sign the upload.
+.TP
+.B \-y\fR, \fB\-\-yes
+Do not prompt before uploading to a PPA. For everyone's safety, this
+option is ignored if \fIUPLOAD\fR is \fBubuntu\fR.
+.TP
+.B \-v \fIVERSION\fR, \fB\-\-version\fR=\fIVERSION\fR
+If the \fB\-\-source\fR option is specified, then
+\fBbackportpackage\fR verifies that the current version of \fIsource
+package\fR in \fISOURCE\fR is the same as \fIVERSION\fR. Otherwise,
+\fBbackportpackage\fR finds version \fIVERSION\fR of \fIsource
+package\fR in your distribution's publishing history, regardless of
+the release in which it was published (or if that version is still
+current). This option is ignored if a .dsc URL or path is passed in
+instead of a source package name.
+.TP
+.B \-w \fIWORKDIR\fR, \fB\-\-workdir\fR=\fIWORKDIR\fR
+If \fIWORKDIR\fR is specified, then all files are downloaded,
+unpacked, built into, and otherwise manipulated in
+\fIWORKDIR\fR. Otherwise, a temporary directory is created, which is
+deleted before \fIbackportpackage\fR exits.
+.TP
+.B \-r\fR, \fB\-\-release\-pocket
+Target the upload at the release pocket, rather than the
+\fB\-backports\fR pocket.
+This is required for Launchpad PPAs, which are pocket-less (and the
+default, when the upload target is a PPA).
+.TP
+.B \-m \fIMIRROR\fR, \fB\-\-mirror\fR=\fIMIRROR\fR
+Use the specified mirror.
+Should be in the form \fBhttp://archive.ubuntu.com/ubuntu\fR.
+If the package isn't found on this mirror, \fBbackportpackage\fR
+will use Launchpad.
+.TP
+.B \-c \fIBUG\fR, \fB\-\-close\fR=\fIBUG\fR
+Include a Launchpad closer for the specified bug in the auto-generated
+changelog. In the future, this may actually close the bug, but
+currently does not.
+.TP
+.B \-l \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Use the specified instance of Launchpad (e.g. "staging"), instead of
+the default of "production".
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.SH ENVIRONMENT
+.TP
+.BR DEBFULLNAME ", " DEBEMAIL ", " UBUMAIL
+Used to determine the uploader (if not supplied as options).
+See
+.BR ubuntu\-dev\-tools (5)
+for details.
+.P
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR BACKPORTPACKAGE_BUILDER ", " UBUNTUTOOLS_BUILDER
+The default value for \fB\-\-builder\fR.
+.TP
+.BR BACKPORTPACKAGE_UPDATE_BUILDER ", " UBUNTUTOOLS_UPDATE_BUILDER
+The default value for \fB--update\fR.
+.TP
+.B BACKPORTPACKAGE_UPLOAD
+The default value for \fB--upload\fR.
+.TP
+.BR BACKPORTPACKAGE_WORKDIR ", " UBUNTUTOOLS_WORKDIR
+The default value for \fB--workdir\fR.
+.TP
+.BR BACKPORTPACKAGE_UBUNTU_MIRROR ", " UBUNTUTOOLS_UBUNTU_MIRROR
+The default value for \fB\-\-mirror\fR if the specified \fISOURCE\fR
+release is an Ubuntu release.
+.TP
+.BR BACKPORTPACKAGE_DEBIAN_MIRROR ", " UBUNTUTOOLS_DEBIAN_MIRROR
+The default value for \fB\-\-mirror\fR if the specified \fISOURCE\fR
+release is a Debian release.
+.TP
+.BR BACKPORTPACKAGE_LPINSTANCE ", " UBUNTUTOOLS_LPINSTANCE
+The default value for \fB--lpinstance\fR.
+.SH EXAMPLES
+Test-build in your PPA a backport of znc from the current development
+release to your workstation's release, deleting the build products
+afterwards:
+.IP
+.nf
+.B backportpackage -u ppa:\fIuser\fR/\fIppa\fB znc
+.fi
+.PP
+Backport squashfs-tools from Maverick to both Karmic and Lucid and
+test-build both locally, leaving all build products in the current
+working directory:
+.IP
+.nf
+.B backportpackage -b -s maverick -d karmic -d lucid -w . \\\\
+.B "  "squashfs-tools
+.fi
+.PP
+Fetch a package from a PPA, backport it to Hardy, then upload it back
+to the same PPA:
+.IP
+.nf
+.B backportpackage -d hardy -u ppa:\fIuser\fR/\fIppa\fR \\\\
+.B "  "https://launchpad.net/\fIsome/file.dsc\fR
+.fi
+.SH SEE ALSO
+.BR ubuntu\-dev\-tools (5)
+.SH AUTHOR
+\fBbackportpackage\fR and this manpage were written by Evan Broder
+<evan@ebroder.net>
+.PP
+Both are released under GNU General Public License, version 2.

=== added file 'doc/bitesize.1'
--- doc/bitesize.1	1970-01-01 00:00:00 +0000
+++ doc/bitesize.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,54 @@
+.TH bitesize "1" "May 9 2010" "ubuntu-dev-tools"
+.SH NAME
+bitesize \- Add \fBbitesize\fR tag to bugs and add a comment.
+
+.SH SYNOPSIS
+.B bitesize \fR<\fIbug number\fR>
+.br
+.B bitesize \-\-help
+
+.SH DESCRIPTION
+\fBbitesize\fR adds a bitesize tag to the bug, if it's not there yet. It
+also adds a comment to the bug indicating that you are willing to help with
+fixing it.
+It checks for permission to operate on a given bug first,
+then perform required tasks on Launchpad.
+
+.SH OPTIONS
+Listed below are the command line options for \fBbitesize\fR:
+.TP
+.BR \-h ", " \-\-help
+Display a help message and exit.
+.TP
+.B \-l \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Use the specified instance of Launchpad (e.g. "staging"), instead of
+the default of "production".
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR BITESIZE_LPINSTANCE ", " UBUNTUTOOLS_LPINSTANCE
+The default value for \fB--lpinstance\fR.
+
+.SH SEE ALSO
+.BR ubuntu\-dev\-tools (5)
+
+.SH AUTHORS
+\fBbitesize\fR and this manual page were written by Daniel Holbach
+<daniel.holbach@canonical.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version 3.

=== added file 'doc/check-mir.1'
--- doc/check-mir.1	1970-01-01 00:00:00 +0000
+++ doc/check-mir.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,18 @@
+.TH check\-mir "1" "13 January 2011" "ubuntu-dev-tools"
+.SH NAME
+check\-mir \- check support status of dependencies
+
+.SH SYNOPSIS
+.B check\-mir
+
+.SH DESCRIPTION
+This script checks if any of a package's build or binary dependencies is
+in universe/multiverse. If the source package is destined for Ubuntu main or
+restricted, these either need to be eliminated or need to be promoted to main,
+following \fBhttps://wiki.ubuntu.com/MainInclusionProcess\fR.
+
+There are no options, just run it in a source package directory.
+
+.SH AUTHOR
+.B check\-mir
+was written by Martin Pitt <martin.pitt@ubuntu.com>.

=== added file 'doc/check-symbols.1'
--- doc/check-symbols.1	1970-01-01 00:00:00 +0000
+++ doc/check-symbols.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,58 @@
+.TH "CHECK\-SYMBOLS" "1" "December 9, 2007" "ubuntu-dev-tools"
+
+.SH "NAME"
+check\-symbols \- verify symbols exported by a new library version
+
+.SH "SYNOPSIS"
+\fBcheck\-symbols\fP <\fIsource\-package\fR\> [\fIDEBDIR\fR]
+
+.SH "DESCRIPTION"
+To verify the symbols exported by a new library version, run
+\fBcheck\-symbols\fP with the name of the source package as argument.
+\fBcheck\-symbols\fP will first determine the symbols exported by the
+existing and installed library version, then install the new library and
+compare the symbols exported by the new library version with the symbols
+exported by the old version.
+For each of the symbols found, \fBcheck\-symbols\fP will list if the symbol
+is new, unchanged or has been removed in the new library version.
+.PP
+In case the source package contains multiple binary library packages,
+all library files in each of the binary packages will be verified.
+.PP
+\fBcheck\-symbols\fP uses \fBnm\fP \-D to determine
+the exported symbols of the libraries.
+.PP
+If no value is given for DEBDIR, the script will assume the new library
+deb files are stored in /var/cache/pbuilder/result.
+
+.SH "EXAMPLES"
+\fBcheck\-symbols\fP telepathy\-glib .
+.TP
+This will:
+.RS 2
+.TP 2
+\(bu Use \fBnm\fP \-D to determine the exported symbols of the old,
+installed versions of the libraries provided by telepathy\-glib.
+.TP 2
+\(bu Install the binary libraries provided by the new version of
+telepathy\-glib.
+.TP 2
+\(bu Compare the output of \fBnm\fP \-D of the new libraries with the
+output of the old version.
+.TP 2
+\(bu List the result in diff format.
+.RE
+
+.SH "BUGS"
+.nf
+Please report bugs on:
+https://bugs.launchpad.net/ubuntu/+source/ubuntu\-dev\-tools/
+.fi
+
+.SH "SEE ALSO"
+.BR nm (1)
+
+.SH "AUTHOR"
+\fBcheck\-symbols\fP was written by Daniel Holbach <daniel.holbach@ubuntu.com>
+and this manpage by Albert Damen <albrt@gmx.net>. Both are licensed
+under the GNU General Public License, version 2.

=== added file 'doc/dch-repeat.1'
--- doc/dch-repeat.1	1970-01-01 00:00:00 +0000
+++ doc/dch-repeat.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,56 @@
+.TH DCH\-REPEAT "1" "10 August 2008" "ubuntu-dev-tools"
+.SH NAME
+dch\-repeat \- repeats a changelog entry into an older release
+
+.SH SYNOPSIS
+.B dch\-repeat \-\-build\-tree <\fIPATH\fR>
+.br
+.B dch\-repeat \-\-source\-release <\fIRELEASE\fR>
+.br
+.B dch\-repeat \-\-target\-release <\fIRELEASE\fR>
+.br
+.B dch\-repeat \-\-devel\-release <\fIRELEASE\fR>
+.br
+.B dch\-repeat \-\-pocket <\fIPOCKET\fR>
+.br
+.B dch\-repeat \-h
+
+.SH DESCRIPTION
+\fBdch\-repeat\fR is used to repeat a changelog into an older release.
+It expects that \-\-build\-tree is laid out with each Ubuntu release as a
+separate directory ("feisty", "edgy", etc).
+.PP
+For example, if gimp had a security update prepared for Feisty in
+$TREE/feisty/gimp\-2.2.13, running \fBdch\-repeat\fR in
+$TREE/edgy/gimp\-2.2.13 would pull in the latest changelog from the Feisty
+build.
+
+.SH OPTIONS
+Listed below are the command line options for \fBdch\-repeat\fR:
+.TP
+.B \-h or \-\-help
+Display a help message and exit.
+.TP
+.B \-\-build\-tree PATH
+Base of build trees. Default is /scratch/ubuntu/build.
+.TP
+.B \-s or \-\-source\-release RELEASE
+Which release to take changelog from.
+.TP
+.B \-\-target\-release RELEASE
+Which release to build into.
+.TP
+.B \-\-devel\-release RELEASE
+Which release is the development release.
+.TP
+.B \-\-pocket POCKET
+Which pocket to use.
+
+.SH AUTHOR
+\fBdch-repeat\fR was written by Kees Cook <kees@ubuntu.com>.
+This manual page was written by Jonathan Patrick Davies <jpds@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 2.
+
+.SH SEE ALSO
+.BR dch(1).

=== added file 'doc/dgetlp.1'
--- doc/dgetlp.1	1970-01-01 00:00:00 +0000
+++ doc/dgetlp.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,40 @@
+.TH DGETLP "1" "27 August 2008" "ubuntu-dev-tools"
+
+.SH NAME
+dgetlp \- simulate ``dget'' behaviour for files hosted at librarian.launchpad.net
+
+.SH SYNOPSIS
+.B dgetlp [\fB\-d\fP|\fB(\fB\-v\fP|\fB\-q\fP)\fP] <\fBLaunchpad DSC URL\fP>
+
+.SH DESCRIPTION
+\fBdgetlp\fR simulates dget behaviour by downloading and extracting the
+<\fBLaunchpad DSC URL\fP> from the Launchpad Librarian.
+
+.SH OPTIONS
+Listed below are the command line options for dgetlp:
+.TP
+.B \-h, \-\-help
+show this help message and exit.
+.TP
+.B \-d, \-\-debug
+Enable debugging.
+.TP
+.B \-v, \-\-verbose
+Enable verbose output.
+.TP
+.B \-q, \-\-quiet
+Never print any output.
+.TP
+.B <Launchpad DSC URL>
+This is the source package that you would like to be downloaded from the
+Launchpad Librarian.
+
+.SH EXAMPLE
+.B dgetlp http://launchpadlibrarian.net/10348157/coreutils_5.97-5.4ubuntu1.dsc
+
+.SH AUTHOR
+\fBdgetlp\fR was written by Terence Simpson <tsimpson@ubuntu.com> and
+modified by Siegfried-A. Gevatter <rainct@ubuntu.com>. The python rewrite
+was written by Terence Simpson <tsimpson@ubuntu.com> based off the original.
+This man page was written by Ryan Kavanagh <ryanakca@kubuntu.org>.
+Both are released under the GNU General Public License, version 2 or later.

=== added file 'doc/grab-merge.1'
--- doc/grab-merge.1	1970-01-01 00:00:00 +0000
+++ doc/grab-merge.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,18 @@
+.TH grab\-merge 1 "March 26, 2009" "ubuntu-dev-tools"
+
+.SH NAME
+grab\-merge \- grabs a merge's files from merges.ubuntu.com.
+
+.SH SYNOPSIS
+\fBgrab\-merge\fP <\fIpackage name\fP>
+
+.SH DESCRIPTION
+\fBgrab\-merge\fP is a script that downloads a merge's packaging files and report
+from merges.ubuntu.com. Placing them in a new directory for working from.
+
+.SH AUTHORS
+\fBgrab\-merge\fP was written by Scott James Remnant <scott@ubuntu.com> and
+this manpage by Jonathan Davies <jpds@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 2 or
+later.

=== added file 'doc/grep-merges.1'
--- doc/grep-merges.1	1970-01-01 00:00:00 +0000
+++ doc/grep-merges.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,26 @@
+.TH grep\-merges 1 "December 15, 2010" "ubuntu-dev-tools"
+.SH NAME
+grep\-merges \- search for outstanding merges from Debian
+.SH SYNOPSIS
+.B grep\-merges
+.RI [ string ]
+.SH DESCRIPTION
+.B grep\-merges
+searches merges.ubuntu.com for pending merges from Debian.
+If a
+.I string
+is given, it will list all merges whose source package name, last changelog
+author, or last uploader contain that string.
+Otherwise, it will list all merges.
+.SH EXAMPLES
+.nf
+$ grep\-merges cjwatson
+tzsetup Colin Watson <cjwatson@ubuntu.com>
+console-setup   Colin Watson <cjwatson@ubuntu.com>
+.fi
+.SH AUTHOR
+.B grep\-merges
+and this manual page were written by Colin Watson <cjwatson@ubuntu.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version
+3 or (at your option) any later version.

=== added file 'doc/harvest.1'
--- doc/harvest.1	1970-01-01 00:00:00 +0000
+++ doc/harvest.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,19 @@
+.TH harvest 1 "March 21, 2011" "ubuntu-dev-tools"
+
+.SH NAME
+harvest \- grabs information about a given source package from harvest.ubuntu.com.
+
+.SH SYNOPSIS
+\fBharvest\fP <\fIsource package name\fP>
+
+.SH DESCRIPTION
+\fBharvest\fP is a script that downloads information about development
+opportunities from harvest.ubuntu.com and gives a summary of the types of
+opportunities.
+
+.SH AUTHORS
+\fBharvest\fP and its manpage were written by Daniel Holbach
+<daniel.holbach@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 3 or
+later.

=== added file 'doc/hugdaylist.1'
--- doc/hugdaylist.1	1970-01-01 00:00:00 +0000
+++ doc/hugdaylist.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,26 @@
+.TH HUGDAYLIST "1" "August 27, 2008" "ubuntu-dev-tools"
+
+.SH NAME
+hugdaylist \- produce MoinMoin wiki formatted tables based on a Launchpad bug list
+
+.SH SYNOPSIS
+.B hugdaylist [\fB\-n\fP|\fB\-\-number <NUMBER>\fP] \fBlaunchpad-buglist-url\fP
+
+.SH DESCRIPTION
+\fBhugdaylist\fP produces MoinMoin wiki formatted tables based on a
+Launchpad bug list
+
+.SH OPTIONS
+.TP
+\fB\-\-number=<NUMBER>\fP
+This option allows you to specify the number of entries to output.
+.TP
+\fBlaunchpad-buglist-url\fP
+Required, this option is a URL pointing to a launchpad bug list.
+
+.SH AUTHOR
+\fBhugdaylist\fP has been written by Canonical Ltd., Daniel Holbach
+<daniel.holbach@canonical.com> and Jonathan Patrick Davies <jpds@ubuntu.com>.
+This manual page was written by Ryan Kavanagh <ryanakca@kubuntu.org>.
+.PP
+Both are released under the GNU General Public License, version 3.

=== added file 'doc/import-bug-from-debian.1'
--- doc/import-bug-from-debian.1	1970-01-01 00:00:00 +0000
+++ doc/import-bug-from-debian.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,60 @@
+.TH import\-bug\-from\-debian "1" "September 21 2010" "ubuntu-dev-tools"
+.SH NAME
+import\-bug\-from\-debian \- Import bugs from Debian's BTS, and file
+them against Ubuntu in LP.
+
+.SH SYNOPSIS
+.B import\-bug\-from\-debian \fR[\fIoptions\fR] \fIbug\fR...
+.br
+.B import\-bug\-from\-debian \-h
+
+.SH DESCRIPTION
+\fBimport\-bug\-from\-debian\fR clones bugs from Debian's BTS into
+Launchpad. Each \fIbug\fR listed on the command line has its initial
+report re-filed against the same source package in Ubuntu.
+The Ubuntu bug is linked back to its Debian counterpart.
+
+Each \fIbug\fR may be provided either as a bug number or URL.
+
+.SH OPTIONS
+.TP
+.BR \-b ", " \-\-browserless
+Don't open the bug in a browser at the end.
+.TP
+.BR \-h ", " \-\-help
+Display a help message and exit.
+.TP
+.B \-l \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Use the specified instance of Launchpad (e.g. "staging"), instead of
+the default of "production".
+.TP
+.B \-p \fIPACKAGE\fR, \fB\-\-package\fR=\fIPACKAGE\fR
+Launchpad package to file bug against, if not the same source package
+name as Debian.
+Useful for importing removal bugs filed against \fBftp.debian.org\fR.
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR IMPORT_BUG_FROM_DEBIAN_LPINSTANCE ", " UBUNTUTOOLS_LPINSTANCE
+The default value for \fB--lpinstance\fR.
+.SH SEE ALSO
+.BR ubuntu\-dev\-tools (5)
+.SH AUTHORS
+\fBimport\-bug\-from\-debian\fR was written by James Westby
+<james.westby@ubuntu.com>,
+and this manual page was written by Stefano Rivera <stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version 2.

=== added file 'doc/merge-changelog.1'
--- doc/merge-changelog.1	1970-01-01 00:00:00 +0000
+++ doc/merge-changelog.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,20 @@
+.TH merge-changelog 1 "February 15, 2010" "ubuntu-dev-tools"
+
+.SH NAME
+merge\-changelog \- merges two changelogs with a common base
+
+.SH SYNOPSIS
+\fBmerge\-changelog\fP <\fIleft changelog\fP> <\fIright changelog\fP>
+
+.SH DESCRIPTION
+\fBmerge\-changelog\fP takes two changelogs that once shared a common source,
+merges them back together, and prints the merged result to stdout.  This
+is useful if you need to manually merge a ubuntu package with a new
+Debian release of the package.
+
+.SH AUTHORS
+\fBmerge\-changelog\fP was written by Scott James Remnant <scott@ubuntu.com>
+and Bryce Harrington <bryce@ubuntu.com>. This manpage was written by Ryan
+Kavanagh <ryanakca@kubuntu.org>.
+.PP
+Both are released under the GNU General Public License, version 3.

=== added file 'doc/mk-sbuild.1'
--- doc/mk-sbuild.1	1970-01-01 00:00:00 +0000
+++ doc/mk-sbuild.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,142 @@
+.TH MK\-SBUILD "1" "09 February 2010" "ubuntu-dev-tools"
+
+.SH NAME
+mk\-sbuild \- creates chroots via schroot and sbuild
+
+.SH SYNOPSIS
+\fBmk\-sbuild\fR [\fIoptions\fR...] <\fIrelease\fR>
+
+.SH DESCRIPTION
+\fBmk\-sbuild\fR creates chroots via schroot and sbuild.
+
+.SH OPTIONS
+Listed below are the command line options for mk\-sbuild:
+.TP
+.B \-\-arch\fR=\fIARCH
+What architecture to select (defaults to the native architecture).
+.TP
+.B \-\-name\fR=\fINAME
+Base name for the schroot (arch is appended).
+.TP
+.B \-\-personality\fR=\fIPERSONALITY
+What personality to use (defaults to match \fB\-\-arch\fR).
+.TP
+.B \-\-debug
+Turn on script debugging.
+.TP
+.B \-\-skip\-updates
+Do not include the \fB\-updates\fR pocket in the installed
+\fBsources.list\fR.
+.TP
+.B \-\-source\-template\fR=\fIFILE
+Use \fIFILE\fR as the \fBsources.list\fR template (defaults to
+\fI$HOME\fB/.mk\-sbuild.sources\fR).
+.TP
+.B \-\-debootstrap\-mirror\fR=\fIURL
+Use \fIURL\fR as the debootstrap source (defaults to
+\fBhttp://ports.ubuntu.com\fR where appropriate, official Ubuntu
+repositories for the supported architectures).
+.TP
+.B \-\-debootstrap\-include\fR=\fIalpha,beta
+Pass along a comma separated list of packages to debootstrap's
+\fB\-\-include\fR argument. See \fBdebootstrap\fR (8) for more details.
+.TP
+.B \-\-debootstrap\-exclude\fR=\fIalpha,beta
+Pass along a comma separated list of packages to debootstrap's
+\fB\-\-exclude\fR argument.
+\fBWARNING:\fR be careful using this option as you can end up
+excluding essential package. See \fBdebootstrap \fR(8) for more details.
+.TP
+.B \-\-distro\fR=\fIDISTRO
+Enable distro-specific logic.
+When not provided, the distribution is determined from \fIrelease\fR.
+Currently known distros: "\fBdebian\fR" and "\fBubuntu\fR".
+.TP
+.B \-\-vg\fR=\fIVOLUME_GROUP
+Specify a volume group, and subsequently use a default \fBSCHROOT_TYPE\fR of
+"\fBlvm-snapshot\fR" rather than "\fBdirectory\fR" (via overlayfs or
+aufs) mounts.
+.TP
+.B \-\-type\fR=\fISHROOT_TYPE
+Specify a \fBSCHROOT_TYPE\fR.  Supported values are "\fBdirectory\fR"
+(default if \fB\-\-vg\fR not specified), "\fBlvm-snapshot\fR" (default
+if \fB\-\-vg\fR specified), "\fBbtrfs-snapshot\fR", and "\fBfile\fR".
+
+.SH ENVIRONMENT VARIABLES
+.TP
+.B LV_SIZE
+Size of source LVs (defaults to 5G).
+.TP
+.B SNAPSHOT_SIZE
+Size of snapshot LVs (defaults to 4G).
+.TP
+.B SCHROOT_CONF_SUFFIX
+Lines to append to schroot entries.
+.TP
+.B SKIP_UPDATES
+Do not include the \fB\-updates\fR pocket (same as
+\fB\-\-skip\-updates\fR)
+.TP
+.B DEBOOTSTRAP_MIRROR
+Mirror location (same as \fB\-\-debootstrap-mirror\fR)
+.TP
+.B DEBOOTSTRAP_INCLUDE
+Comma separated list of packages to include when bootstrapping (same as
+\fB\-\-debootstrap-include\fR)
+.TP
+.B DEBOOTSTRAP_EXCLUDE
+Comma separated list of packages to exclude when bootstrapping (same as
+\fB\-\-debootstrap-exclude\fR; see warning above)
+.TP
+.B SOURCE_CHROOTS_DIR
+Use \fBSOURCE_CHROOTS_DIR\fR as home of schroot source directories.
+(default \fB/var/lib/schroot/chroots\fR)
+.TP
+.B SOURCE_CHROOTS_TGZ
+Use \fBSOURCE_CHROOTS_TGZ\fR as home of schroot source tarballs.
+(default \fB/var/lib/schroot/tarballs\fR)
+.TP
+.B CHROOT_SNAPSHOT_DIR
+Use \fBCHROOT_SNAPSHOT_DIR\fR as home of mounted btrfs snapshots.
+(default \fB/var/lib/schroot/snapshots\fR)
+
+
+.SH FILES
+.TP
+.IB $HOME /.mk\-sbuild.rc
+Sourced for environment variables (defined above).
+.TP
+.IB $HOME /.mk\-sbuild.sources\fR[\fB. $DISTRO\fR]
+Can contain a customized \fBsources.list\fR.
+It will be read when creating the schroot.
+If a file with "\fB.ubuntu\fR" or "\fB.debian\fR" is found (as
+appropriate) it will use used instead.
+See \fBsources.list\fR (5) for more details on the format.
+.TP
+.IB $HOME /.mk\-sbuild.schroot.conf\fR[\fB. $SCHROOT_TYPE\fR]
+Can contain a customized configuration section to be inserted into
+\fB/etc/schroot/schroot.conf\fR.
+If a file with "\fB.lvm-snapshot\fR", "\fB.directory\fR", "\fB.file\fR",
+or "\fBbtrfs-snapshot\fR" is found (as appropriate) that file will use used instead.
+See \fBschroot.conf\fR (5) for more details on the format.
+.SH USING THE CHROOTS
+.TP
+To CHANGE the golden image: \fBsudo schroot \-c \fI${SCHROOT_NAME}\fB\-source \-u root\fR
+.TP
+To ENTER an image snapshot: \fBschroot \-c \fI$SCHROOT_NAME\fR
+.TP
+To BUILD within a snapshot: \fBsbuild \-A \-d \fI$SCHROOT_NAME $PACKAGE\fB*.dsc\fR
+.TP
+for example, to update the packages in a \fBsid\-amd64\fR golden image:
+\fBschroot \-c sid\-amd64\-source \-u root -- sh \-c "apt-get \-qq update && apt-get \-qy upgrade && apt-get clean" </dev/null\fR
+
+.SH SEE ALSO
+.BR sbuild\-setup (7),
+.BR sources.list (5),
+.BR schroot.conf (5),
+.B https://help.ubuntu.com/community/SbuildLVMHowto
+
+.SH AUTHOR
+\fBmk\-sbuild\fR was written by Kees Cook <kees@ubuntu.com>.
+This man page was written by Ryan Kavanagh <ryanakca@kubuntu.org>.
+Both are released under the GNU General Public License, version 3 or later.

=== added file 'doc/pbuilder-dist-simple.1'
--- doc/pbuilder-dist-simple.1	1970-01-01 00:00:00 +0000
+++ doc/pbuilder-dist-simple.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,53 @@
+.TH PBUILDER\-DIST\-SIMPLE 1 "February 25, 2008" "ubuntu\-dev\-tools"
+
+.SH NAME
+pbuilder\-dist\-simple \- simple multi\-release pbuilder wrapper
+
+.SH SYNOPSIS
+\fBpbuilder\-\fI<dist>\fR\fP \fIoperation\fR [\fI...\fR]
+
+.SH DESCRIPTION
+\fBpbuilder\-dist\-simple\fP is a wrapper that makes it easy to use
+pbuilder with chroots for many different Ubuntu distributions.
+If you need more features than \fBpbuilder\-dist\-simple\fP provides, have a
+look at
+.BR pbuilder\-dist (1).
+
+.SH USAGE
+Create one symlink to \fBpbuilder\-dist\-simple\fP for each distribution
+for which you want a build environment, naming them like "pbuilder\-lucid",
+"pbuilder\-natty", etc.
+.PP
+Replace \fIoperation\fP with the action you want \fBpbuilder\-dist\-simple\fP
+to do (create, update, build, clean, login or execute).
+
+.SH EXAMPLES
+.TP
+pbuilder\-natty create
+Creates a \fBpbuilder\fP environment for Ubuntu Natty.
+.TP
+pbuilder\-lucid update
+Updates an existing Ubuntu Lucid environment.
+.TP
+pbuilder\-lucid build ./sample_1.0\-0ubuntu1.dsc
+Builds the specified package on an already existing Ubuntu Lucid environment.
+
+.SH FILES
+By default, \fBpbuilder\-dist\-simple\fP will store all the files it
+generates in \fB~/pbuilder/\fP.
+This can be changed by modifying the BASE_DIR value on the top of the script
+to any other directory you want.
+If the directory doesn't exit, it will be created at runtime.
+
+.SH SEE ALSO
+.BR pbuilder (1),
+.BR pbuilderrc (5),
+.BR pbuilder\-dist (1)
+
+.SH AUTHORS
+\fBpbuilder\-dist\fP was originally written by Jamin W. Collins
+<jcollins@asgardsrealm.net> and Jordan Mantha <mantha@ubuntu.com>, and
+this manpage by Siegfried\-A. Gevatter <rainct@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 2 or
+later.

=== added file 'doc/pbuilder-dist.1'
--- doc/pbuilder-dist.1	1970-01-01 00:00:00 +0000
+++ doc/pbuilder-dist.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,155 @@
+.TH PBUILDER\-DIST 1 "January 10, 2008" "ubuntu-dev-tools"
+
+.SH NAME
+pbuilder\-dist, cowbuilder\-dist \- multi-distribution pbuilder/cowbuilder wrapper
+
+.SH SYNOPSIS
+\fBpbuilder\-dist\fP \fIdistribution\fR [\fIarchitecture\fR] \fIoperation\fR
+[\fBoptions\fP] [\fI...\fR]
+
+\fBcowbuilder\-dist\fP \fIdistribution\fR [\fIarchitecture\fR] \fIoperation\fR
+[\fBoptions\fP] [\fI...\fR]
+
+.SH DESCRIPTION
+\fBpbuilder\-dist\fP is a wrapper that makes it easy to use pbuilder with many different
+versions of Ubuntu and/or Debian.
+.PP
+It is common to symlink this script in order to give it many names in the form of
+\fBpbuilder\-\fIdistribution\fP\fR or \fBpbuilder\-\fIdistribution\fR\-\fIarchitecture\fP\fR,
+like for example \fBpbuilder\-feisty\fP, \fBpbuilder\-sid\fP, \fBpbuilder\-gutsy\-i386\fP, etc.
+.PP
+The same applies to \fBcowbuilder\-dist\fP, which uses cowbuilder. The main
+difference between both is that pbuilder compresses the created chroot as a
+a tarball, thus using less disc space but needing to uncompress (and possibly
+compress) its contents again on each run, and cowbuilder doesn't do this.
+
+.SH USAGE
+There are many arguments listed on the synopsis; each of them, if used, has to be used exactly in
+the same order as it appears there.
+In case you renamed the script to \fBpbuilder\-\fIdistribution\fP\fR, do not
+use the \fBdistribution\fP parameter; same with \fBi386\fP / \fBamd64\fP if
+the name also contains \-\fIarchitecture\fR.
+.TP
+\fBdistribution\fP
+Replace this with the codename of the version of Ubuntu or Debian you want to use.
+.TP
+\fBarchitecture\fP
+This optional parameter will attempt to construct a chroot in a foreign
+architecture.
+For some architecture pairs (e.g. i386 on an amd64 install), the chroot
+will be created natively.
+For others (e.g. armel on an i386 install), qemu\-user\-static will be
+used.
+Note that some combinations (e.g. amd64 on an i386 install) require
+special separate kernel handling, and may break in unexpected ways.
+.TP
+\fBoperation\fP
+Replace this with the action you want \fBpbuilder\fP to do (create, update,
+build, clean, login or execute).
+If you don't specify any action, but the next argument is a .dsc file, it
+will assume that it should build.
+Check its manpage for more details.
+.TP
+\fB[...]\fP
+.br
+Replace this with other parameters, if needed.
+For example, if \fBbuild\fP is the option, you will need to also specify
+a .dsc file. As a special feature, if you specify a .dsc file you can
+skip the \fBbuild\fP option and this script will automatically assume that
+building is the action you want to do.
+
+.SH OPTIONS
+.TP
+\fB\-\-main\-only\fP (deprecated: \fBmainonly\fP)
+If you specify this option, only packages from the \fImain\fP (in Debian) or
+\fImain\fP and \fIrestricted\fP (in Ubuntu) components will be used. By
+default, all official components are enabled. This only has effect when
+creating a new environment.
+.TP
+\fB\-\-debug\-echo\fP
+The generated \fBpbuilder\fP/\fBcowbuilder\fP command will be printed to the
+standard output instead of being executed. This is useful for debugging.
+.TP
+\fB\-\-buildresult\fP \fBDIRECTORY\fP (pbuilder\-dist only)
+If this option is specified, the resultant files of the \fBpbuilder\fP build
+are placed in \fBDIRECTORY\fP.
+.TP
+\fB\-\-release\-only\fP
+Only use the release pocket.
+Default for development releases.
+.TP
+\fB\-\-security\-only\fP
+Only use the release and security pockets.
+Suitable environment for preparing security updates.
+.TP
+\fB\-\-updates\-only\fP
+Only use the release, security, and updates pocket.
+Not the proposed\-updates pocket.
+
+.SH EXAMPLES
+.TP
+pbuilder\-dist gutsy create
+Creates a \fBpbuilder\fP environment for Ubuntu Gutsy, with all components enabled.
+.TP
+pbuilder\-sid \-\-main\-only create
+Creates a \fBpbuilder\fP environment for Debian Sid, with only the main component.
+.TP
+pbuilder\-feisty build ./sample_1.0\-0ubuntu1.dsc
+Builds the specified package on an already existing Ubuntu Feisty environment.
+.TP
+pbuilder\-dist feisty withlog build ./sample_1.0\-0ubuntu1.dsc
+Same as above, but stores \fBpbuilder\fP's output on a file.
+.TP
+pbuilder\-etch i386 update
+Updates an existing i386-architecture Debian Etch environment on an amd64 system.
+.TP
+cowbuilder-experimental create
+Creates a \fBcowbuilder\fP environment for Debian Experimental.
+
+.SH FILES AND ENVIRONMENT VARIABLES
+By default, \fBpbuilder\-dist\fP will store all the files it generates in
+\fB~/pbuilder/\fP. This can be changed by setting the \fBPBUILDFOLDER\fP
+environment variable. If the directory doesn't exist, it will be created on
+the run.
+.PP
+A file with the log of the last operation, called last_operation.log, will be
+saved in the results subdirectory of each build environment.
+.PP
+The default authentication method is \fBsudo\fP. You can change this by
+setting the \fBPBUILDAUTH\fP variable.
+.PP
+By default, \fBpbuilder\-dist\fP use the master Debian and Ubuntu mirrors.
+The pbuilder \fBMIRRORSITE\fP and \fBOTHERMIRROR\fP variables are
+supported, as are the standard ubuntu\-dev\-tools variables:
+\fBUBUNTUTOOLS_DEBIAN_MIRROR\fP, \fBPBUILDER_DIST_DEBIAN_MIRROR\fP,
+\fBUBUNTUTOOLS_DEBSEC_MIRROR\fP, \fBPBUILDER_DIST_DEBSEC_MIRROR\fP,
+\fBUBUNTUTOOLS_UBUNTU_MIRROR\fP, \fBPBUILDER_DIST_UBUNTU\fP,
+\fBUBUNTUTOOLS_UBUNTU_PORTS_MIRROR\fP, and
+\fBPBUILDER_DIST_UBUNTU_PORTS_MIRROR\fP.
+See \fBubuntu\-dev\-tools\fP (5) for details.
+.PP
+You may also want to know that \fBpbuilder\-dist\fP exports \fBDIST\fP and
+\fBARCH\fP environment variables to the invoked process, containing the name
+of the distribution and the architecture targeted by the current build. You
+can make use of them, for example, in \fBpbuilderrc\fP.
+
+.SH BUGS
+If you experience any problem with this script contact me on rainct@ubuntu.com
+or file a bug at https://bugs.launchpad.net/ubuntu/+source/ubuntu\-dev\-tools.
+.PP
+Please ensure first that the problem is really this script and not an issue
+with \fBpbuilder\fP or \fBcowbuilder\fP themselves.
+
+.SH SEE ALSO
+.BR pbuilder (1),
+.BR pbuilderrc (5),
+.BR cowbuilder (1),
+.BR ubuntu\-dev\-tools (5).
+
+.SH AUTHORS
+\fBpbuilder\-dist\fP and this manual page were written by Siegfried-A. Gevatter
+<rainct@ubuntu.com>, with contributions from Iain Lane
+<iain@orangesquash.org.uk>, Emmet Hikory <persia@ubuntu.com> and others.
+
+\fBpbuilder\-dist\fP is released under the GNU General Public License, version
+2 or later.

=== added file 'doc/pull-debian-debdiff.1'
--- doc/pull-debian-debdiff.1	1970-01-01 00:00:00 +0000
+++ doc/pull-debian-debdiff.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,91 @@
+.\" Copyright (C) 2010, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 PULL-DEBIAN-DEBDIFF "1" "December 2010" "ubuntu-dev-tools"
+.SH NAME
+\fBpull-debian-debdiff\fR \- find, download, and generate a debdiff
+
+.SH SYNOPSIS
+\fBpull-debian-debdiff\fR [\fIoptions\fR] <\fIpackage\fR>
+<\fIversion\fR> [\fIdistance\fR]
+
+.SH DESCRIPTION
+\fBpull-debian-debdiff\fR attempts to find and download a specific
+version of a Debian package and its immediate parent to generate a
+debdiff.
+
+.SH OPTIONS
+.TP
+.I package
+The source package to download and diff.
+.TP
+.I version
+The most recent of the two versions you want to diff.
+.TP
+.I distance
+If specified (default \fB1\fR), the debdiff is against that many
+versions previous.
+.TP
+.BR \-h ", " \-\-help
+Display the usage instructions and exit.
+.TP
+.BR \-f ", " \-\-fetch
+Simply download the specified version and exit.
+.TP
+.B \-d \fIDEBIAN_MIRROR\fR, \fB\-\-debian\-mirror\fR=\fIDEBIAN_MIRROR\fR
+Use the specified mirror.
+Should be in the form \fBhttp://ftp.debian.org/debian\fR.
+If the package isn't found on this mirror, \fBpull\-debian\-source\fR
+will fall back to the default mirror.
+.TP
+.B \-s \fIDEBSEC_MIRROR\fR, \fB\-\-debsec\-mirror\fR=\fIDEBSEC_MIRROR\fR
+Use the specified Debian security mirror.
+Should be in the form \fBhttp://security.debian.org\fR.
+If the package isn't found on this mirror, \fBpull\-debian\-source\fR
+will fall back to the default mirror.
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR PULL_DEBIAN_DEBDIFF_DEBIAN_MIRROR ", " UBUNTUTOOLS_DEBIAN_MIRROR
+The default value for \fB\-\-debian\-mirror\fR.
+.TP
+.BR PULL_DEBIAN_DEBDIFF_DEBSEC_MIRROR ", " UBUNTUTOOLS_DEBSEC_MIRROR
+The default value for \fB\-\-debsec\-mirror\fR.
+
+.SH SEE ALSO
+.BR debdiff (1),
+.BR dget (1),
+.BR pull\-debian\-source (1),
+.BR ubuntu\-dev\-tools (5)
+
+.SH AUTHORS
+\fBpull-debian-debdiff\fR was written by Stefano Rivera
+<stefanor@ubuntu.com>, a clone of a tool by Kees Cook <kees@ubuntu.com>.
+
+This manual page was written by Stefano Rivera, based on the original by
+Andrew Starr\-Bochicchio <a.starr.b@gmail.com>.

=== added file 'doc/pull-debian-source.1'
--- doc/pull-debian-source.1	1970-01-01 00:00:00 +0000
+++ doc/pull-debian-source.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,89 @@
+.\" Copyright (C) 2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 PULL\-DEBIAN\-SOURCE "1" "22 January 2011" "ubuntu\-dev\-tools"
+
+.SH NAME
+pull\-debian\-source \- download and extract a source package from Debian
+
+.SH SYNOPSIS
+.B pull\-debian\-source \fR[\fIoptions\fR] <\fIsource package\fR>
+[\fIrelease\fR|\fIversion\fR]
+
+.SH DESCRIPTION
+\fBpull\-debian\-source\fR downloads and extracts the specified
+\fIversion\fR of \fIsource package\fR, or the latest version in the
+specified Debian \fIrelease\fR.
+.P
+\fBpull\-debian\-source\fR will try the preferred mirror, default
+mirror, security mirror, and fall back to \fBLaunchpad\fR or
+\fBsnapshot.debian.org\fR, in search of the requested version.
+
+.SH OPTIONS
+.TP
+.I source package
+The source package to download from Debian.
+.TP
+.I release
+The release to download the source package from. Defaults to
+\fBunstable\fR.
+.TP
+.I version
+The specific version of the package to download.
+.TP
+.BR \-d ", " \-\-download\-only
+Do not extract the source package.
+.TP
+.B \-m \fIDEBIAN_MIRROR\fR, \fB\-\-mirror\fR=\fIDEBIAN_MIRROR\fR
+Use the specified mirror.
+Should be in the form \fBhttp://ftp.debian.org/debian\fR.
+If the package isn't found on this mirror, \fBpull\-debian\-source\fR
+will fall back to the default mirror.
+.TP
+.B \-s \fIDEBSEC_MIRROR\fR, \fB\-\-security\-mirror\fR=\fIDEBSEC_MIRROR\fR
+Use the specified mirror.
+Should be in the form \fBhttp://security.debian.org\fR.
+If the package isn't found on this mirror, \fBpull\-debian\-source\fR
+will fall back to the default mirror.
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.TP
+.BR \-h ", " \-\-help
+Display the usage instructions and exit.
+
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR PULL_DEBIAN_SOURCE_DEBIAN_MIRROR ", " UBUNTUTOOLS_DEBIAN_MIRROR
+The default value for \fB\-\-mirror\fR.
+.TP
+.BR PULL_DEBIAN_SOURCE_DEBSEC_MIRROR ", " UBUNTUTOOLS_DEBSEC_MIRROR
+The default value for \fB\-\-security\-mirror\fR.
+
+.SH SEE ALSO
+.BR dget (1),
+.BR pull\-debian\-debdiff (1),
+.BR pull\-lp\-source (1),
+.BR ubuntu\-dev\-tools (5)

=== added file 'doc/pull-lp-source.1'
--- doc/pull-lp-source.1	1970-01-01 00:00:00 +0000
+++ doc/pull-lp-source.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,79 @@
+.TH PULL\-LP\-SOURCE "1" "4 August 2008" "ubuntu-dev-tools"
+
+.SH NAME
+pull\-lp\-source \- download a source package from Launchpad
+
+.SH SYNOPSIS
+.B pull\-lp\-source \fR[\fIoptions\fR]\fB \fBsource package\fR
+[\fIrelease\fR|\fIversion\fR]
+
+.SH DESCRIPTION
+\fBpull\-lp\-source\fR downloads and extracts the specified
+\fIversion\fR of <\fBsource package\fR> from Launchpad, or the latest
+version of the specified \fIrelease\fR.
+To request a version from a particular pocket say
+\fIrelease\fB\-\fIpocket\fR (with a magic \fB\-release\fR for only the
+release pocket).
+If no \fIversion\fR or \fIrelease\fR is specified, the latest version in
+the development release will be downloaded.
+
+.SH OPTIONS
+Listed below are the command line options for pull\-lp\-source:
+.TP
+.B source package
+This is the source package that you would like to be downloaded from Launchpad.
+.TP
+.B version
+This is the version of the source package to be downloaded.
+.TP
+.B release
+This is the release that you would like the source package to be downloaded from.
+This value defaults to the current development release.
+.TP
+.BR \-h ", " \-\-help
+Display a help message and exit.
+.TP
+.BR \-d ", " \-\-download\-only
+Do not extract the source package.
+.TP
+.B \-m \fIUBUNTU_MIRROR\fR, \fB\-\-mirror\fR=\fIUBUNTU_MIRROR\fR
+Use the specified Ubuntu mirror.
+Should be in the form \fBhttp://archive.ubuntu.com/ubuntu\fR.
+If the package isn't found on this mirror, \fBpull\-lp\-source\fR will
+fall back to Launchpad, as its name implies.
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+.TP
+.B
+DIST
+Specifies the default target.
+
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR PULL_LP_SOURCE_UBUNTU_MIRROR ", " UBUNTUTOOLS_UBUNTU_MIRROR
+The default value for \fB\-\-mirror\fR.
+
+.SH SEE ALSO
+.BR dget (1),
+.BR pull\-debian\-source (1),
+.BR pull\-debian\-debdiff (1),
+.BR ubuntu\-dev\-tools (5)
+
+.SH AUTHOR
+.PP
+\fBpull\-lp\-source\fR and this manual page were written by Iain Lane
+<iain@orangesquash.org.uk>.
+Both are released under the GNU General Public License, version 3 or later.

=== added file 'doc/pull-revu-source.1'
--- doc/pull-revu-source.1	1970-01-01 00:00:00 +0000
+++ doc/pull-revu-source.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,27 @@
+.TH PULL\-REVU\-SOURCE "1" "30 August 2009" "ubuntu-dev-tools"
+
+.SH NAME
+pull\-revu\-source \- download a source package from REVU
+
+.SH SYNOPSIS
+.B pull\-revu\-source \fR[\fB\-h\fR]\fB <\fBsource package\fR>
+
+.SH DESCRIPTION
+\fBpull\-revu\-source\fR downloads and extracts the latest version of
+<\fBsource package\fR> from REVU.
+
+.SH OPTIONS
+Listed below are the command line options for pull\-revu\-source:
+.TP
+.B \-h, \-\-help
+Display the usage instructions and exit.
+.TP
+.B <source package>
+This is the source package that you would like to be downloaded from Debian.
+
+.SH AUTHOR
+.PP
+\fBpull\-revu\-source\fR and this manual page were written by Nathan Handler
+<nhandler@ubuntu.com>. \fBpull\-revu\-source\fR is based on \fBrevupull\fR in
+\fBkubuntu\-dev\-tools\fR, written by Harald Sitter <apachelogger@ubuntu.com>.
+Both are released under the GNU General Public License, version 3 or later.

=== added file 'doc/requestbackport.1'
--- doc/requestbackport.1	1970-01-01 00:00:00 +0000
+++ doc/requestbackport.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,56 @@
+.\" Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 requestbackport 1 "November 2011" ubuntu\-dev\-tools
+
+.SH NAME
+requestbackport \- File a backport request bug
+
+.SH SYNOPSIS
+.B requestbackport \fR[\fIoptions\fR] \fIpackage\fR
+
+.SH DESCRIPTION
+Determine the intermediate releases that \fIpackage\fR needs to be
+backported to, list all reverse\-dependencies, and file the backporting
+request.
+\fBrequestbackport\fR will include a testing checklist in the bug.
+
+.SH OPTIONS
+.TP
+\fB\-d\fR \fIDEST\fR, \fB\-\-destination\fR=\fIDEST\fR
+Backport to \fIDEST\fR release and necessary intermediate
+releases. Default: current stable release.
+.TP
+\fB\-s\fR \fISOURCE\fR, \fB\-\-source\fR=\fISOURCE\fR
+Backport from \fISOURCE\fR release.
+Default: current development release.
+.TP
+\fB\-l\fR \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Launchpad instance to connect to.
+Default: \fBproduction\fR.
+.TP
+\fB\-\-no\-conf\fR
+Don't read config files or environment variables
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Display a help message and exit.
+
+.SH SEE ALSO
+.BR backportpackage (1),
+.BR reverse\-depends (1).
+
+.SH AUTHORS
+\fBreverse\-depends\fR and this manpage were written by Stefano Rivera
+<stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the ISC License.

=== added file 'doc/requestsync.1'
--- doc/requestsync.1	1970-01-01 00:00:00 +0000
+++ doc/requestsync.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,141 @@
+.TH REQUESTSYNC "1" "19 January 2008" "ubuntu-dev-tools"
+.SH NAME
+requestsync \- helper to file sync requests for Ubuntu
+.SH SYNOPSIS
+.B requestsync\fR [\fB\-d \fIdistro\fR] [\fB\-nse\fR] [\fB\-k \fIkeyid\fR] <\fBsource package\fR> [\fBtarget release\fR] [\fIbase version\fR]
+.br
+.B requestsync \-\-lp\fR [\fB\-nse\fR] <\fBsource package\fR> <\fBtarget release\fR> [\fIbase version\fR]
+.br
+.B requestsync \-h
+.SH DESCRIPTION
+\fBrequestsync\fR looks at the versions of <source package> in Debian and
+Ubuntu and prompts for an explanation of why the Ubuntu changes (if there
+are any) should be dropped.
+The changelog entry is then downloaded from packages.debian.org, and the
+sync request bug is filed in launchpad.
+Alternatively, the sync request can be filed by GPG\-signed email (option
+\fB\-\-email\fR).
+
+.PP
+\fBrequestsync\fR checks if you have the permissions to request the sync from
+the archive administrators directly by checking if you have upload permissions
+for that package through package set permissions or component permissions. If
+you don't have upload permissions, the script will subscribe the necessary
+team with approval rights to the bug report for you.
+
+This check is only performed if \fBrequestsync\fR is allowed to use the LP API
+(not email submission). In the other case \fBrequestsync\fR relies on that you
+answer the question about upload permissions honestly to determine if a team
+with approval rights is to be subscribed to the bug.
+
+If you have permission to upload the package directly, then you may prefer
+to use \fBsyncpackage\fR instead to copy the package using the Launchpad
+API. At some future point, \fBrequestsync\fR will be changed to do this
+automatically.
+
+.PP
+\fBrequestsync\fR uses launchpadlib authentication to file its requests.
+
+.SH OPTIONS
+Listed below are the command line options for requestsync:
+.TP
+.B \-h
+Display a help message and exit.
+.TP
+.B \-d
+Specifies which Debian distribution a package should be synced from.
+Default is \fItesting\fR in LTS cycles, otherwise \fIunstable\fR.
+.TP
+.B \-n
+Specifies that the package is a new package, and requestsync should not
+attempt to look it up in Ubuntu since it will not exist.
+.TP
+.B \-k \fI<keyid>\fR
+Specifies your GPG key.
+This is only used if the sync request is mailed to Launchpad.
+.TP
+.B \-\-email
+Use GPG\-signed email to file the bug, rather than launchpadlib.
+.TP
+.B \-s
+Specifies that you require sponsorship.
+You need this option if you don't have upload permissions for that package.
+This disables the upload permissions check described above.
+.TP
+.B \-C
+Allow changelog to be manually filled in when missing.
+\fBrequestsync\fR gets Debian changelogs from packages.debian.org, which
+isn't in sync with the Debian archive.
+To request a sync before the changelog is available, pass this option,
+and provide the changelog entries yourself.
+.TP
+.B \-e
+Use this flag after FeatureFreeze for non-bug fix syncs. \fBrequestsync\fR will
+subscribe ubuntu-release team instead of sponsorship team.
+.TP
+.B \-l \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Use the specified instance of Launchpad (e.g. "staging"), instead of
+the default of "production".
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.TP
+.B <source package>
+This is the source package that you would like to be synced from Debian.
+.TP
+.B <target release>
+This is the release that you would like the source package to be synced
+into.
+This should always be the latest development release of Ubuntu.
+.TP
+.B [base version]
+In some cases, the base version (where the Ubuntu package started differing
+from the Debian package) cannot be automatically determined.
+Specify this option in this case.
+
+.SH ENVIRONMENT
+\fBrequestsync\fR uses the following variables which should be set in your
+shell's configuration by adding \fIexport VARIABLE=\fR lines, where VARIABLE is
+one of the following:
+.TP
+.BR UBUMAIL ", " DEBEMAIL
+Specifies which email should be used when sending to Launchpad.
+.P
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+
+.SH CONFIGURATION VARIABLES
+.TP
+.B REQUESTSYNC_SMTP_SERVER
+Set which SMTP server to use when sending mail.
+If unspecified this defaults to launchpad's SMTP servers (the
+eventual destination).
+.TP
+.B REQUESTSYNC_SMTP_PORT
+Sets which port of the SMTP server to use. Default is 25.
+.TP
+.BR REQUESTSYNC_SMTP_USER " and " REQUESTSYNC_SMTP_PASS
+Sets the username and password to use when authenticating to the SMTP server.
+.TP
+.BR REQUESTSYNC_USE_LPAPI
+Setting this to \fIno\fR is equivalent to running with \fB--email\fR.
+.TP
+.BR REQUESTSYNC_LPINSTANCE ", " UBUNTUTOOLS_LPINSTANCE
+The default value for \fB--lpinstance\fR.
+.TP
+.BR REQUESTSYNC_KEYID ", " UBUNTUTOOLS_KEYID
+The default value for \fB-k\fR.
+
+.SH SEE ALSO
+.BR rmadison (1),
+.BR syncpackage (1),
+.BR ubuntu\-dev\-tools (5)
+
+.SH AUTHOR
+.B requestsync
+and this manual page were written by the Ubuntu MOTU Team.
+.PP
+Both are released under the GNU General Public License, version 2.

=== added file 'doc/reverse-build-depends.1'
--- doc/reverse-build-depends.1	1970-01-01 00:00:00 +0000
+++ doc/reverse-build-depends.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,13 @@
+.TH REVERSE-BUILD-DEPENDS "1" "June 2012" "ubuntu-dev-tools"
+.SH NAME
+reverse-build-depends \- find packages that depend on a specific package to
+build (reverse build depends)
+.SH SYNOPSIS
+.TP
+.B reverse-build-depends \fR[\fIoptions\fR] \fIpackage
+.SH DESCRIPTION
+\fBreverse-build-depends\fR has been replaced by \fBreverse-depends \-b\fR.
+This script now wraps \fBreverse-depends\fR.
+Please use it in the future.
+.SH SEE ALSO
+.BR reverse-depends (1)

=== added file 'doc/reverse-depends.1'
--- doc/reverse-depends.1	1970-01-01 00:00:00 +0000
+++ doc/reverse-depends.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,81 @@
+.\" Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 reverse\-depends 1 "November 2011" ubuntu\-dev\-tools
+
+.SH NAME
+reverse\-depends \- List the reverse\-dependencies (or
+build\-dependencies) of a package
+
+.SH SYNOPSIS
+.B reverse\-depends \fR[\fIoptions\fR] \fIpackage
+
+.SH DESCRIPTION
+List reverse\-dependencies (or build\-dependencies) of \fIpackage\fR.
+If the package name is prefixed with \fBsrc:\fR then the
+reverse\-dependencies of all the binary packages that the specified
+source package builds will be listed.
+
+.SH OPTIONS
+.TP
+\fB\-r\fR \fIRELEASE\fR, \fB\-\-release\fR=\fIRELEASE\fR
+Query dependencies in \fIRELEASE\fR.
+Default: current development release.
+.TP
+\fB\-R\fR, \fB\-\-without\-recommends\fR
+Only consider Depends relationships, not Recommends.
+.TP
+\fB\-s\fR, \fB\-\-with\-suggests\fR
+Also consider Suggests relationships.
+.TP
+\fB\-b\fR, \fB\-\-build\-depends\fR
+Query build dependencies.
+Synonym for \fB\-\-arch\fR=\fIsource\fR.
+.TP
+\fB\-a\fR \fIARCH\fR, \fB\-\-arch\fR=\fIARCH\fR
+Query dependencies in \fIARCH\fR.
+Besides valid architecture names, the special values \fBany\fR and
+\fBsource\fR may be used.
+\fBany\fR displays all reverse dependencies, the union across all
+architecture.
+\fBsource\fR displays build dependencies.
+Default: \fBany\fR.
+.TP
+\fB\-c\fR \fICOMPONENT\fR, \fB\-\-component\fR=\fICOMPONENT\fR
+Only consider reverse\-dependencies in \fICOMPONENT\fR. Can
+be specified multiple times.
+Default: all components.
+.TP
+\fB\-l\fR, \fB\-\-list\fR
+Display a simple, machine\-readable list.
+.TP
+\fB\-u\fR \fIURL\fR, \fB\-\-service\-url\fR=\fIURL\fR
+Reverse Dependencies web\-service \fIURL\fR.
+Default: UbuntuWire's service at
+\fBhttp://qa.ubuntuwire.org/rdepends/\fR.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Display a help message and exit
+
+.SH EXAMPLES
+All reverse dependencies of source package bash:
+.IP
+.nf
+.B reverse\-depends src:bash
+.fi
+
+.SH AUTHORS
+\fBreverse\-depends\fR and this manpage were written by Stefano Rivera
+<stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the ISC License.

=== added file 'doc/seeded-in-ubuntu.1'
--- doc/seeded-in-ubuntu.1	1970-01-01 00:00:00 +0000
+++ doc/seeded-in-ubuntu.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,60 @@
+.\" Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 seeded\-in\-ubuntu 1 "December 2011" ubuntu\-dev\-tools
+
+.SH NAME
+seeded\-in\-ubuntu \- Determine whether a package is safe to upload
+during a freeze
+
+.SH SYNOPSIS
+.B seeded\-in\-ubuntu \fR[\fIoptions\fR] \fIpackage\fR...
+
+.SH DESCRIPTION
+Lists all the current daily images containing the specified packages.
+Or whether the package is part of the supported seed.
+.PP
+If it isn't on an image, it should be safe to upload.
+During the final freeze, one should avoid packages in the supported seed
+too.
+.PP
+An index of the current manifests is downloaded from UbuntuWire.
+
+.SH OPTIONS
+.TP
+\fB\-b\fR, \fB\-\-binary\fR
+The packages specified are binary packages.
+This is faster than source packages, as otherwise we must query LP to
+determine the binary packages that every specified source package
+builds.
+.TP
+\fB\-u\fR \fIURL\fR, \fB\-\-data\-url\fR=\fIURL\fR
+URL for index of seeded packages.
+Default: UbuntuWire's service at
+\fBhttp://qa.ubuntuwire.org/ubuntu-seeded-packages/seeded.json.gz\fR.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Display a help message and exit
+
+.SH EXAMPLES
+All the images that contain unity:
+.IP
+.nf
+.B seeded\-in\-ubuntu -b unity
+.fi
+
+.SH AUTHORS
+\fBseeded\-in\-ubuntu\fR and this manpage were written by Stefano Rivera
+<stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the ISC License.

=== added file 'doc/setup-packaging-environment.1'
--- doc/setup-packaging-environment.1	1970-01-01 00:00:00 +0000
+++ doc/setup-packaging-environment.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,16 @@
+.TH PULL-DEBIAN-DEBDIFF "1" "June 2010" "ubuntu-dev-tools"
+.SH NAME
+\fBsetup-packaging-environment\fR \- helps one to get started with Ubuntu development
+
+.SH SYNOPSIS
+\fBsetup-packaging-environment\fR
+
+.SH DESCRIPTION
+\fBsetup-packaging-environment\fR aims to make it more straightforward for new contributors to get their Ubuntu installation ready for packaging work. It ensures that all four components from Ubuntu's official repositories are enabled along with their corresponding source repositories. It also installs a minimal set of packages needed for Ubuntu packaging work (ubuntu-dev-tools, devscripts, debhelper, cdbs, patchutils, pbuilder, and build-essential). Finally, it assists in defining the DEBEMAIL and DEBFULLNAME environment variables.
+
+.SH AUTHORS
+\fBsetup-packaging-environment\fR was written by Siegfried-A. Gevatter <rainct@ubuntu.com>.
+
+This manual page was written by Andrew Starr-Bochicchio <a.starr.b@gmail.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version 3 or later.

=== added file 'doc/sponsor-patch.1'
--- doc/sponsor-patch.1	1970-01-01 00:00:00 +0000
+++ doc/sponsor-patch.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,166 @@
+.TH sponsor\-patch "1" "September 21 2010" "ubuntu-dev-tools"
+.SH NAME
+sponsor\-patch \- Prepare, test\-build, and sponsor an upload.
+
+.SH SYNOPSIS
+.B sponsor\-patch \fR[\fIoptions\fR] \fIbug
+.br
+.B sponsor\-patch \-h
+
+.SH DESCRIPTION
+\fBsponsor\-patch\fR downloads the patch or Bazaar branch linked to an
+Ubuntu bug, applies it, generates a review diff, (optionally) test
+builds it, runs
+.BR lintian (1)
+and, after review and confirmation, can upload it.
+
+\fBsponsor\-patch\fR can be used for sponsoring patches, syncs and
+merges from Debian, SRUs, and creating debdiffs from patches.
+If \fIbug\fR has multiple patches or branches linked, it will prompt the
+user to select one.
+The same applies to bug tasks.
+If the attached patch is not a debdiff,
+.BR edit-patch (1)
+is used to apply it.
+
+.nr step 1 1
+Some obvious checks are performed, in particular:
+.IP \n[step]. 4
+.BR update\-maintainer (1)
+is run on the source package to ensure that the \fBMaintainer\fR field
+meets the Ubuntu policy.
+.IP \n+[step].
+The version number must be greater than the current version in the
+archive.
+The \fBchanges\fR file is also correctly generated to list all changes
+since the current version in the archive.
+.IP \n+[step].
+The changelog must automatically close the sponsorship bug.
+.IP \n+[step].
+The changelog target must be valid.
+.IP \n+[step].
+The changelog timestamp is touched.
+
+.PP
+Should any checks (or the build) fail, the user has an option to edit
+the patched source and try building it again.
+.PP
+Unless a working directory is specified, the sources and patches will be
+downloaded into a temporary directory in \fB/tmp\fR, which is removed once the
+script finishes running.
+The output of the build tool will be placed in \fIworkdir\fR/\fBbuildresult/\fR.
+
+.PP
+One of \fB\-\-upload\fR, \fB\-\-workdir\fR, or \fB--sponsor\fR must be
+specified.
+
+.SH OPTIONS
+.TP
+.BR \-b ", " \-\-build
+Build the package with the specified builder. Note for \fBpbuilder\fR(8) and
+\fBcowbuilder\fR(8) users:
+This assumes the common configuration, where the \fBARCH\fR and \fBDIST\fR
+environment is read by \fBpbuilderrc\fR(5) to select the correct base image.
+.TP
+.B \-B \fIBUILDER\fR, \fB\-\-builder\fR=\fIBUILDER
+Use the specify builder to build the package.
+Supported are \fBcowbuilder\fR(8), \fBcowbuilder-dist\fR(1), \fBpbuilder\fR(8),
+\fBpbuilder-dist\fR(1), and \fBsbuild\fR(1).
+The default is \fBpbuilder\fR(8).
+.TP
+.BR \-e ", " \-\-edit
+Launch a sub-shell to allow editing of the patched source before
+building.
+.TP
+.BR \-h ", " \-\-help
+Display a help message and exit.
+.TP
+.B \-k \fIKEY\fR, \fB\-\-key\fR=\fIKEY
+Specify a key ID for signing the upload.
+.TP
+.B \-l \fIINSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Use the specified instance of Launchpad (e.g. "staging"), instead of
+the default of "production".
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.TP
+.BR \-s ", " \-\-sponsor
+Shortcut for sponsored uploads. Equivalent to \fB\-b \-u ubuntu\fR.
+.TP
+.B \-u \fIDEST\fR, \fB\-\-upload\fR=\fIDEST
+Upload to \fIDEST\fR with \fBdput\fR(1) (after confirmation).
+.TP
+.BR \-U ", " \-\-update
+Update the build environment before attempting to build.
+.TP
+.BR \-v ", " \-\-verbose
+Print more information.
+.TP
+.B \-w \fIDIR\fR, \fB\-\-workdir\fR=\fIDIR
+Use the specified working directory, creating it if necessary.
+If \fIWORKDIR\fR is not specified, a temporary directory is created, which is
+deleted before \fIsponsor-patch\fR exits.
+
+.SH ENVIRONMENT
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as environment
+variables.
+Variables in the environment take precedence to those in configuration files.
+
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR SPONSOR_PATCH_BUILDER ", " UBUNTUTOOLS_BUILDER
+The default value for \fB\-\-builder\fR.
+.TP
+.BR SPONSOR_PATCH_LPINSTANCE ", " UBUNTUTOOLS_LPINSTANCE
+The default value for \fB--lpinstance\fR.
+.TP
+.BR SPONSOR_PATCH_UPDATE_BUILDER ", " UBUNTUTOOLS_UPDATE_BUILDER
+The default value for \fB--update\fR.
+.TP
+.BR SPONSOR_PATCH_WORKDIR ", " UBUNTUTOOLS_WORKDIR
+The default value for \fB--workdir\fR.
+.TP
+.BR SPONSOR_PATCH_KEYID ", " UBUNTUTOOLS_KEYID
+The default value for \fB--key\fR.
+
+.SH EXAMPLES
+Test-building and sponsoring an upload of bug \fB1234\fR:
+.IP
+.nf
+.B sponsor\-patch -s 1234
+.fi
+
+.PP
+Performing a test build of bug \fB1234\fR in your PPA:
+.IP
+.nf
+.B sponsor\-patch -u ppa:\fIuser\fR/\fIppa\fB 1234
+.fi
+
+.SH SEE ALSO
+.BR bzr (1),
+.BR debchange (1),
+.BR debdiff (1),
+.BR dput (1),
+.BR edit-patch (1),
+.BR lintian (1),
+.BR cowbuilder (8),
+.BR cowbuilder-dist (1),
+.BR pbuilder (8),
+.BR pbuilder-dist (1),
+.BR sbuild (1),
+.BR ubuntu\-dev\-tools (5),
+.BR update\-maintainer (1)
+
+.SH AUTHORS
+\fBsponsor\-patch\fR was written by Benjamin Drung <bdrung@ubuntu.com>,
+and this manual page was written by Stefano Rivera <stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the ISC License.

=== added file 'doc/submittodebian.1'
--- doc/submittodebian.1	1970-01-01 00:00:00 +0000
+++ doc/submittodebian.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,30 @@
+.TH SUBMITTODEBIAN 1 "Dec 2007" "ubuntu-dev-tools"
+.SH NAME
+submittodebian \- submit changes in Debian source tree to Debian
+.SH SYNOPSIS
+.B submittodebian
+.SH DESCRIPTION
+This manual page documents briefly the
+.B submittodebian
+command.
+.PP
+.B submittodebian
+was created to help bridge a gap between Debian and Ubuntu, namely by making it trivially easy to submit your changes to a Debian package to the Debian bug tracking system.
+.PP
+It expects to find the .dsc and diff.gz of the current version (which you likely just created) and the previous one in the parent directory.
+By examining debian/changelog it will extract the information it needs to:
+.PP
+1. Extract the debdiff containing your changes.
+.PP
+2. Open the debdiff in your $EDITOR so that you can remove any Ubuntu specific changes.
+.PP
+3. Extract your changelog entry so that you can create a bug report from it.
+.PP
+4. Start reportbug with the debdiff attached and with the text of the changelog entry.
+.SH SEE ALSO
+.BR reportbug (1).
+.br
+.SH AUTHOR
+submittodebian and this man page were written by Soren Hansen <soren@ubuntu.com>.
+.PP
+Both are released under the GNU General Public License, version 2 or later.

=== added file 'doc/syncpackage.1'
--- doc/syncpackage.1	1970-01-01 00:00:00 +0000
+++ doc/syncpackage.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,155 @@
+.TH SYNCPACKAGE "1" "June 2010" "ubuntu-dev-tools"
+.SH NAME
+syncpackage \- copy source packages from Debian to Ubuntu
+.\"
+.SH SYNOPSIS
+.B syncpackage
+[\fIoptions\fR] \fI<.dsc URL/path or package name>\fR
+.\"
+.SH DESCRIPTION
+\fBsyncpackage\fR causes a source package to be copied from Debian to
+Ubuntu.
+.PP
+\fBsyncpackage\fR allows you to upload files with the same checksums of the
+Debian ones, as the common script used by Ubuntu archive administrators does,
+this way you can preserve source files integrity between the two distributions.
+.PP
+\fBsyncpackage\fR will detect source tarballs with mismatching
+checksums, and can perform fake syncs.
+.\"
+.SH WARNING
+The use of \fBsyncpackage \-\-no\-lp\fR, which generates a changes file to
+be directly uploaded to the Ubuntu primary archive or a PPA, is discouraged
+by the Ubuntu Archive Administrators, as it introduces an unnecessary window
+for error.
+This only exists for backward compatibility, for unusual corner cases
+(such as fakesyncs), and for uploads to archives other than the Ubuntu
+primary archive.
+Omitting this option will cause Launchpad to perform the sync request
+directly, which is the preferred method for uploads to the Ubuntu primary
+archive.
+.\"
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Show help message and exit
+.TP
+\fB\-d\fI DIST\fR, \fB\-\-distribution\fR=\fIDIST\fR
+Debian distribution to sync from. Default is \fItesting\fR during LTS
+cycles, and \fIunstable\fR otherwise.
+.TP
+\fB\-r\fI RELEASE\fR, \fB\-\-release\fR=\fIRELEASE\fR
+Specify target Ubuntu release. Default: current development release.
+.TP
+\fB\-V\fI DEBVERSION\fR, \fB\-\-debian\-version\fR=\fIDEBVERSION\fR
+Specify the version to sync from.
+.TP
+\fB\-c\fI COMPONENT\fR, \fB\-\-component\fR=\fICOMPONENT\fR
+Specify the component to sync from.
+.TP
+\fB\-b\fI BUG\fR, \fB\-\-bug\fR=\fIBUG\fR
+Mark a Launchpad bug as being fixed by this upload.
+.TP
+\fB\-s\fI USERNAME\fR, \fB\-\-sponsor\fR=\fIUSERNAME\fR
+Sponsor the sync for \fIUSERNAME\fR (a Launchpad username).
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+Display more progress information.
+.TP
+\fB\-F\fR, \fB\-\-fakesync\fR
+Perform a fakesync, to work around a tarball mismatch between Debian and
+Ubuntu.
+This option ignores blacklisting, and performs a local sync.
+It implies \fB\-\-no\-lp\fR, and will leave a signed \fB.changes\fR file
+for you to upload.
+.TP
+\fB\-f\fR, \fB\-\-force\fR
+Force sync over the top of Ubuntu changes.
+.TP
+.B \-\-no\-conf
+Do not read any configuration files, or configuration from environment
+variables.
+.TP
+\fB\-l\fI INSTANCE\fR, \fB\-\-lpinstance\fR=\fIINSTANCE\fR
+Launchpad instance to connect to (default: production).
+.TP
+.B \-\-simulate
+Show what would be done, but don't actually do it.
+.\"
+.SH LOCAL SYNC PREPARATION OPTIONS
+.TP
+Options that only apply when using \fB\-\-no\-lp\fR:
+.TP
+.B \-\-no\-lp
+Construct sync locally, rather than letting Launchpad copy the package
+directly.
+It will leave a signed \fB.changes\fR file for you to upload.
+See the \fBWARNING\fR above.
+.TP
+\fB\-n\fI UPLOADER_NAME\fR, \fB\-\-uploader\-name\fR=\fIUPLOADER_NAME\fR
+Use UPLOADER_NAME as the name of the maintainer for this upload instead
+of evaluating DEBFULLNAME and UBUMAIL.
+This option may only be used in \fB\-\-no\-lp\fR mode.
+.TP
+\fB\-e\fI UPLOADER_EMAIL\fR, \fB\-\-uploader\-email\fR=\fIUPLOADER_EMAIL\fR
+Use UPLOADER_EMAIL as the email address of the maintainer for this
+upload instead of evaluating DEBEMAIL and UBUMAIL.
+This option may only be used in \fB\-\-no\-lp\fR mode.
+.TP
+\fB\-k\fI KEYID\fR, \fB\-\-key\fR=\fIKEYID\fR
+Specify the key ID to be used for signing.
+.TP
+\fB\-\-dont-sign\fR
+Do not sign the upload.
+.TP
+.B \-d \fIDEBIAN_MIRROR\fR, \fB\-\-debian\-mirror\fR=\fIDEBIAN_MIRROR\fR
+Use the specified mirror.
+Should be in the form \fBhttp://ftp.debian.org/debian\fR.
+If the package isn't found on this mirror, \fBsyncpackage\fR will fall
+back to the default mirror.
+.TP
+.B \-s \fIUBUNTU_MIRROR\fR, \fB\-\-debsec\-mirror\fR=\fIUBUNTU_MIRROR\fR
+Use the specified Debian security mirror.
+Should be in the form \fBhttp://archive.ubuntu.com/ubuntu\fR.
+If the package isn't found on this mirror, \fBsyncpackage\fR will fall
+back to the default mirror.
+.\"
+.SH ENVIRONMENT
+.TP
+.BR DEBFULLNAME ", " DEBEMAIL ", " UBUMAIL
+Used to determine the uploader (if not supplied as options).
+See
+.BR ubuntu\-dev\-tools (5)
+for details.
+.P
+All of the \fBCONFIGURATION VARIABLES\fR below are also supported as
+environment variables.
+Variables in the environment take precedence to those in configuration
+files.
+.\"
+.SH CONFIGURATION VARIABLES
+The following variables can be set in the environment or in
+.BR ubuntu\-dev\-tools (5)
+configuration files.
+In each case, the script\-specific variable takes precedence over the
+package\-wide variable.
+.TP
+.BR SYNCPACKAGE_DEBIAN_MIRROR ", " UBUNTUTOOLS_DEBIAN_MIRROR
+The default value for \fB\-\-debian\-mirror\fR.
+.TP
+.BR SYNCPACKAGE_UBUNTU_MIRROR ", " UBUNTUTOOLS_DEBSEC_MIRROR
+The default value for \fB\-\-ubuntu\-mirror\fR.
+.TP
+.BR SYNCPACKAGE_KEYID ", " UBUNTUTOOLS_KEYID
+The default value for \fB\-\-key\fR.
+.\"
+.SH SEE ALSO
+.BR requestsync (1),
+.BR ubuntu\-dev\-tools (5)
+.\"
+.SH AUTHOR
+\fBsyncpackage\fR was written by Martin Pitt <martin.pitt@canonical.com> and Benjamin Drung <bdrung@ubuntu.com>.
+.PP
+This manual page were written by Luca Falavigna <dktrkranz@ubuntu.com>
+.PP
+Both are released under GNU General Public License, version 3.

=== added file 'doc/ubuntu-build.1'
--- doc/ubuntu-build.1	1970-01-01 00:00:00 +0000
+++ doc/ubuntu-build.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,71 @@
+.TH UBUNTU-BUILD "1" "June 2010" "ubuntu-dev-tools"
+.SH NAME
+ubuntu-build \- command-line interface to Launchpad build operations
+
+.SH SYNOPSIS
+.B ubuntu-build <srcpackage> <release> <operation>
+
+.SH DESCRIPTION
+\fBubuntu-build\fR provides a command line interface to the Launchpad build
+operations.
+
+.SH OPERATIONS
+Listed below are the available operations for \fBubuntu-build\fR:
+.TP
+.B status
+Outputs the build status of the package on Launchpad on all architectures.
+.TP
+.B retry
+Requests that the package has another attempt at rebuilding from source.
+This will only work if the package has \fIFailed to build\fR on Launchpad.
+.TP
+.B rescore
+Requests that the package's build priority be raised in the build queue.
+Only members of the Launchpad build administrators may issue this operation,
+and it may only be performed on packages which \fINeed building\fR.
+
+.SH OPTIONS
+Listed below are the command line options for \fBubuntu-build\fR:
+.TP
+.B \-h or \-\-help
+Display a help message and exit.
+.TP
+Retry and rescore options:
+.IP
+These options may only be used with the 'retry' and 'rescore'
+operations.
+.IP
+\fB\-a\fR ARCHITECTURE, \fB\-\-arch\fR=\fIARCHITECTURE\fR
+Rebuild or rescore a specific architecture. Valid
+architectures include: amd64, sparc, powerpc, i386,
+armel, armhf, ia64, lpia, hppa.
+.TP
+Batch processing:
+.IP
+These options and parameter ordering is only available in \fB\-\-batch\fR
+mode. Usage: ubuntu\-build \fB\-\-batch\fR [options] <package>...
+.IP
+\fB\-\-batch\fR
+Enable batch mode
+.IP
+\fB\-\-series\fR=\fISERIES\fR
+Selects the Ubuntu series to operate on (default:
+current development series)
+.IP
+\fB\-\-retry\fR
+Retry builds (give\-back).
+.IP
+\fB\-\-rescore\fR=\fIPRIORITY\fR
+Rescore builds to <priority>.
+.IP
+\fB\-\-arch2\fR=\fIARCHITECTURE\fR
+Affect only 'architecture' (can be used several
+times). Valid architectures are: amd64, sparc,
+powerpc, i386, armel, armhf, ia64, lpia, hppa.
+
+.SH AUTHORS
+\fBubuntu-build\fR was written by Martin Pitt <martin.pitt@canonical.com>, and
+this manual page was written by Jonathan Patrick Davies <jpds@ubuntu.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version 3
+or (at your option) any later version.

=== added file 'doc/ubuntu-dev-tools.5'
--- doc/ubuntu-dev-tools.5	1970-01-01 00:00:00 +0000
+++ doc/ubuntu-dev-tools.5	2012-09-12 18:51:22 +0000
@@ -0,0 +1,110 @@
+.\" Copyright (C) 2010, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 ubuntu\-dev\-tools "5" "December 19 2010" "ubuntu\-dev\-tools"
+.SH NAME
+ubuntu\-dev\-tools \- Configuration for the ubuntu\-dev\-tools package.
+
+.SH DESCRIPTION
+The \fBubuntu\-dev\-tools\fR package is similar in scope to the
+.BR devscripts (1)
+package, providing a collection of scripts which may be of use
+to Ubuntu and Debian developers or others wishing to build Debian packages.
+
+Some of these scripts have options which may be configured on a
+system\-wide and per\-user basis.
+These options are configured in
+.BR devscripts.conf (5).
+
+All variables are described in the script's manpages. Package\-wide
+variables begin with "\fIUBUNTUTOOLS\fR" and are listed below.
+
+Every script which reads the configuration files can be forced to ignore
+them by using the \fB\-\-no\-conf\fR command\-line option.
+
+.SH ENVIRONMENT
+All \fBubuntu\-dev\-tools\fR configuration variables can be set (and
+overridden) by setting them in the environment (unlike
+\fBdevscripts\fR).
+
+In addition, several scripts use the following environment variables:
+
+.TP
+.B UBUMAIL
+Overrides \fBDEBEMAIL\fR and \fBDEBFULLNAME\fR when the target is
+clearly Ubuntu.
+Can either contain an e-mail address or \fBFull Name
+<email@example.org>\fR.
+
+.TP
+.BR DEBEMAIL ", " DEBFULLNAME
+As in
+.BR devscripts (1).
+
+.SH PACKAGE\-WIDE VARIABLES
+The currently recognised package\-wide variables are:
+.TP
+.B UBUNTUTOOLS_BUILDER
+This specifies the preferred test\-builder, one of
+.BR pbuilder " (default), " sbuild ", " pbuilder\-dist .
+.TP
+.B UBUNTUTOOLS_DEBIAN_MIRROR
+The preferred Debian archive mirror.
+Should be of the form \fBhttp://ftp.debian.org/debian\fR (no trailing
+slash).
+If not specified, the master will be used.
+.TP
+.B UBUNTUTOOLS_DEBSEC_MIRROR
+The preferred Debian security archive mirror.
+Should be of the form \fBhttp://security.debian.org\fR (no trailing
+slash).
+If not specified, the master will be used.
+.TP
+.B UBUNTUTOOLS_UBUNTU_MIRROR
+The preferred Ubuntu archive mirror.
+Should be of the form \fBhttp://archive.ubuntu.com/ubuntu\fR (no
+trailing slash).
+If not specified, the master will be used.
+.TP
+.B UBUNTUTOOLS_UBUNTU_PORTS_MIRROR
+The preferred Ubuntu archive mirror.
+Should be of the form \fBhttp://ports.ubuntu.com\fR (no
+trailing slash).
+If not specified, the master will be used.
+.TP
+.B UBUNTUTOOLS_LPINSTANCE
+The launchpad instance to communicate with. e.g. \fBproduction\fR
+(default) or \fBstaging\fR.
+.TP
+.B UBUNTUTOOLS_MIRROR_FALLBACK
+Whether or not to fall\-back to the master archive mirror.
+This is usually the desired behaviour, as mirrors can lag the masters.
+If on a private network with only a local mirror, you may want to set
+this to \fBno\fR.
+.RB "One of " yes " (default) or " no .
+.TP
+.B UBUNTUTOOLS_UPDATE_BUILDER
+Whether or not to update the test\-builder before each test build.
+.RB "One of " yes " or " no " (default).
+.TP
+.B UBUNTUTOOLS_WORKDIR
+The directory to use for preparing source packages etc.
+When unset, defaults to a directory in \fI/tmp/\fR named after the
+script.
+
+.SH SEE ALSO
+.BR devscripts (1),
+.BR devscripts.conf (5)
+
+.SH AUTHORS
+This manpage was written by Stefano Rivera <stefanor@ubuntu.com>.

=== added file 'doc/ubuntu-iso.1'
--- doc/ubuntu-iso.1	1970-01-01 00:00:00 +0000
+++ doc/ubuntu-iso.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,16 @@
+.TH UBUNTU_ISO "1" "June 2010" "ubuntu-dev-tools"
+.SH NAME
+\fBubuntu-iso\fR \- tool to examine Ubuntu CD (ISO) installation media
+
+.SH SYNOPSIS
+\fBubuntu-iso\fR <path to ISO>
+
+.SH DESCRIPTION
+When given a path to an ISO, \fBubuntu-iso\fR will determine whether it is an Ubuntu ISO or not. If it is, it will extract and display the version information.
+
+.SH AUTHORS
+\fBubuntu-iso\fR was written by Matt Zimmerman <mdz@ubuntu.com>.
+
+This manual page was written by Andrew Starr-Bochicchio <a.starr.b@gmail.com>.
+.PP
+Both are released under the terms of the GNU General Public License, version 2.

=== added file 'doc/ubuntu-upload-permission.1'
--- doc/ubuntu-upload-permission.1	1970-01-01 00:00:00 +0000
+++ doc/ubuntu-upload-permission.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,60 @@
+.\" Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+.\"
+.\" 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 ubuntu\-upload\-permission 1 "November 2011" ubuntu\-dev\-tools
+
+.SH NAME
+ubuntu\-upload\-permission \- Query upload rights and (optionally) list
+the people and teams with upload rights for a package
+
+.SH SYNOPSIS
+.B ubuntu\-upload\-permission \fR[\fIoptions\fR] \fIpackage
+
+.SH DESCRIPTION
+\fBubuntu\-upload\-permission\fR checks if the user has upload
+permissions for \fIpackage\fR.
+If the \fB\-\-list\-uploaders\fR option is provided, all the people and
+teams that do have upload rights for \fIpackage\fR will be listed.
+
+.SH OPTIONS
+.TP
+\fB\-r\fR \fIRELEASE\fR, \fB\-\-release\fR=\fIRELEASE\fR
+Query permissions in \fIRELEASE\fR.
+Default: current development release.
+.TP
+\fB\-a\fR, \fB\-\-list\-uploaders\fR
+List all the people and teams who have upload rights for \fIpackage\fR.
+.TP
+\fB\-t\fR, \fB\-\-list\-team\-members\fR
+List all the members of every team with rights. (Implies
+\fB\-\-list\-uploaders\fR)
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Display a help message and exit
+
+.SH EXIT STATUS
+.TP
+.B 0
+You have the necessary upload rights.
+.TP
+.B 1
+You don't have the necessary upload rights.
+.TP
+.B 2
+There was an error.
+
+.SH AUTHORS
+\fBubuntu\-upload\-permission\fR and this manpage were written by
+Stefano Rivera <stefanor@ubuntu.com>.
+.PP
+Both are released under the terms of the ISC License.

=== added file 'doc/update-maintainer.1'
--- doc/update-maintainer.1	1970-01-01 00:00:00 +0000
+++ doc/update-maintainer.1	2012-09-12 18:51:22 +0000
@@ -0,0 +1,47 @@
+.\" Copyright (c) 2008, Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>
+.\"               2010, Benjamin Drung <bdrung@ubuntu.com>
+.\"
+.\" 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 UPDATE\-MAINTAINER "1" "December 2010" "ubuntu-dev-tools"
+
+.SH NAME
+update\-maintainer \- change the Maintainer field in a Debian source package
+
+.SH SYNOPSIS
+.B update\-maintainer
+[\fIoptions\fR]
+
+.SH DESCRIPTION
+\fBupdate\-maintainer\fP updates the Maintainer field in the source of
+an Ubuntu package to match the DebianMaintainerField specification.
+
+.SH OPTIONS
+.TP
+\fB\-d \fIPATH\fR, \fB\-\-debian\-directory\fR=\fIPATH\fR
+location of the \fIdebian\fR directory (default: \fB./debian\fR)
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+show a help message and exit
+.TP
+\fB\-q\fR, \fB\-\-quiet\fR
+print no informational messages
+
+.SH SEE ALSO
+See https://wiki.ubuntu.com/DebianMaintainerField for more information.
+
+.SH AUTHOR
+\fBupdate-maintainer\fP has been written by Benjamin Drung <bdrung@ubuntu.com>
+and this manual page by Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>.
+.PP
+Both are released under the ISC license.

=== added file 'enforced-editing-wrapper'
--- enforced-editing-wrapper	1970-01-01 00:00:00 +0000
+++ enforced-editing-wrapper	2012-09-12 18:51:22 +0000
@@ -0,0 +1,62 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+#
+# 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.
+#
+#
+# Wraps sensisible-editor in checks for remaining boilerplate.
+# Configured through environment variables:
+# UDT_EDIT_WRAPPER_EDITOR: The user's usual $EDITOR
+# UDT_EDIT_WRAPPER_VISUAL: The user's usual $VISUAL
+# UDT_EDIT_WRAPPER_TEMPLATE_RE: An extra boilerplate-detecting regex.
+# UDT_EDIT_WRAPPER_FILE_DESCRIPTION: The type of file being edited.
+
+import optparse
+import os
+import re
+
+from ubuntutools.question import EditFile
+
+
+def main():
+    parser = optparse.OptionParser('%prog [options] filename')
+    options, args = parser.parse_args()
+
+    if len(args) != 1:
+        parser.error('A filename must be specified')
+    body = args[0]
+    if not os.path.isfile(body):
+        parser.error('File %s does not exist' % body)
+
+    if 'UDT_EDIT_WRAPPER_EDITOR' in os.environ:
+        os.environ['EDITOR'] = os.environ['UDT_EDIT_WRAPPER_EDITOR']
+    else:
+        del os.environ['EDITOR']
+
+    if 'UDT_EDIT_WRAPPER_VISUAL' in os.environ:
+        os.environ['VISUAL'] = os.environ['UDT_EDIT_WRAPPER_VISUAL']
+    else:
+        del os.environ['VISUAL']
+
+    placeholders = []
+    if 'UDT_EDIT_WRAPPER_TEMPLATE_RE' in os.environ:
+        placeholders.append(re.compile(
+            os.environ['UDT_EDIT_WRAPPER_TEMPLATE_RE']))
+
+    description = os.environ.get('UDT_EDIT_WRAPPER_FILE_DESCRIPTION', 'file')
+
+    EditFile(body, description, placeholders).edit()
+
+if __name__ == '__main__':
+    main()

=== renamed file 'enforced-editing-wrapper' => 'enforced-editing-wrapper.moved'
=== added file 'grab-merge'
--- grab-merge	1970-01-01 00:00:00 +0000
+++ grab-merge	2012-09-12 18:51:22 +0000
@@ -0,0 +1,124 @@
+#!/bin/sh
+# grab-merge - grab a merge
+#
+# Copyright © 2008 Canonical Ltd.
+# Author: Scott James Remnant <scott@ubuntu.com>.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of version 3 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Uncomment if you have an account on casey
+#RSYNC=y
+
+# Uncomment if you know that this deletes all the files in the CWD
+#EXPERT=y
+
+# Or uncomment if you want to use named subdirectories
+SUBDIR=y
+
+set -e
+
+MERGE=$1
+
+if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then
+    echo "Usage: $0 <package name>"
+    echo ""
+    echo "grab-merge downloads a merge's packaging files and report from"
+    echo "merges.ubuntu.com, placing them into a new subdirectory for working"
+    echo "from."
+
+    exit 0
+fi
+
+if [ "$SUBDIR" = "y" ]; then
+    [ -d "$MERGE" ] || { mkdir $MERGE; CREATED_DIR=1; }
+    cd $MERGE
+fi
+
+if [ "$EXPERT" != "y" ] && [ -n "$(ls)" ]; then
+    echo -n "Are you sure you want to delete all the files in $(pwd) [yN]? "
+    read ANSWER
+    [ "$ANSWER" = "y" ] || exit 1
+fi
+
+if [ "${MERGE#lib}" != "${MERGE}" ]; then
+    HASH=${MERGE%${MERGE#????}}
+else
+    HASH=${MERGE%${MERGE#?}}
+fi
+
+if [ "$RSYNC" = "y" ]; then
+    URL="merges.ubuntu.com:/srv/patches.ubuntu.com/merges/$HASH/$MERGE/"
+    rsync --verbose --archive --progress --compress --delete \
+        "$URL" . || { echo "Error while rsyncing $URL"; exit 1; }
+else
+    rm -rf  --one-file-system *
+    wget -nv https://merges.ubuntu.com/$HASH/$MERGE/REPORT || {
+            echo "Package not found on merges.ubuntu.com."
+            [ "$CREATED_DIR" != "1" ] || { cd ..; rmdir $MERGE; }
+            exit 1
+        }
+
+    for NAME in $(sed -n -e "/^    /p" REPORT); do
+        if [ ! -f "$NAME" ]; then
+            echo "Getting $NAME..."
+            URL="https://merges.ubuntu.com/$HASH/$MERGE/$NAME"
+            wget -q "$URL" || { echo "Error downloading $URL"; exit 1; }
+        fi
+    done
+fi
+echo
+
+if grep "^generated: " REPORT >/dev/null; then
+    VERSION=$(sed -n -e "/^generated:/s/^generated: *//p" REPORT)
+    DEB_VENDOR=Ubuntu dpkg-source -x ${MERGE}_${VERSION#*:}.dsc
+    echo
+else
+    TARBALL=$(sed -n -e "/\.src\.tar\.gz$/p" REPORT)
+
+    echo unpacking $TARBALL
+    tar xf $TARBALL
+    echo
+fi
+
+if grep "^  C" REPORT; then
+    echo
+fi
+
+echo "#!/bin/sh" > merge-genchanges
+echo "exec $(sed -n -e '/^  $ /s/^  $ //p' REPORT) \"\$@\"" \
+    >> merge-genchanges
+chmod +x merge-genchanges
+
+echo "#!/bin/sh" > merge-buildpackage
+echo "exec $(sed -n -e '/^  $ /s/^  $ dpkg-genchanges/dpkg-buildpackage/p' REPORT) \"\$@\"" \
+    >> merge-buildpackage
+chmod +x merge-buildpackage
+
+echo "#!/bin/sh" > merge-debuild
+echo "exec $(sed -n -e '/^  $ /s/^  $ dpkg-genchanges/debuild/p' REPORT) \"\$@\"" \
+    >> merge-debuild
+chmod +x merge-debuild
+
+echo "Run ../merge-genchanges , ../merge-buildpackage or ../merge-debuild when done"
+
+if grep "^Vcs-" *.dsc >/dev/null; then
+    echo
+    echo "*** WARNING ***"
+    echo
+    echo "It looks like this package is maintained in revision control:"
+    echo
+    grep "^Vcs-" *.dsc
+    echo
+    echo "You almost certainly don't want to continue without investigating."
+    exit 1
+fi

=== renamed file 'grab-merge' => 'grab-merge.moved'
=== added file 'grep-merges'
--- grep-merges	1970-01-01 00:00:00 +0000
+++ grep-merges	2012-09-12 18:51:22 +0000
@@ -0,0 +1,74 @@
+#! /usr/bin/python
+#
+# grep-merges - search for pending merges from Debian
+#
+# Copyright (C) 2010 Canonical Ltd.
+# Authors:
+#  - Colin Watson <cjwatson@ubuntu.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import optparse
+import sys
+import json
+
+from httplib2 import Http, HttpLib2Error
+
+import ubuntutools.misc
+
+
+def main():
+    parser = optparse.OptionParser(usage='%prog [options] [string]',
+            description='List pending merges from Debian matching string')
+    args = parser.parse_args()[1]
+
+    if len(args) > 1:
+        parser.error('Too many arguments')
+    elif len(args) == 1:
+        match = args[0]
+    else:
+        match = None
+
+    ubuntutools.misc.require_utf8()
+
+    for component in ('main', 'main-manual',
+                      'restricted', 'restricted-manual',
+                      'universe', 'universe-manual',
+                      'multiverse', 'multiverse-manual'):
+
+        url = 'https://merges.ubuntu.com/%s.json' % component
+        try:
+            headers, page = Http().request(url)
+        except HttpLib2Error, e:
+            print >> sys.stderr, str(e)
+            sys.exit(1)
+        if headers.status != 200:
+            print >> sys.stderr, "%s: %s %s" % (url, headers.status,
+                                                headers.reason)
+            sys.exit(1)
+
+        for merge in json.loads(page):
+            package = merge['source_package']
+            author, uploader = '', ''
+            if 'user' in merge:
+                author = merge['user']
+            if 'uploader' in merge:
+                uploader = '(%s)' % merge['uploader']
+            pretty_uploader = ' '.join((author, uploader)).strip()
+            if (match is None or
+                match in package or match in author or match in uploader):
+                print '%s\t%s' % (package.encode("utf-8"), pretty_uploader.encode("utf-8"))
+
+if __name__ == '__main__':
+    main()

=== renamed file 'grep-merges' => 'grep-merges.moved'
=== added file 'harvest'
--- harvest	1970-01-01 00:00:00 +0000
+++ harvest	2012-09-12 18:51:22 +0000
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+
+# Copyright (C) 2011 Canonical Ltd., Daniel Holbach
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-3 for more details.
+#
+# ##################################################################
+#
+#
+# harvest - grabs information about development opportunities from
+#           harvest.ubuntu.com
+#
+#
+# Daniel Holbach
+# (c) 2011 Canonical
+
+from optparse import OptionParser
+import sys
+
+from devscripts.logger import Logger
+
+from ubuntutools.harvest import Harvest
+
+def main():
+    usage = "usage: %prog source-package-name"
+    opt_parser = OptionParser(usage)
+    args = opt_parser.parse_args()[1]
+    if len(args) != 1:
+        opt_parser.print_help()
+        sys.exit(1)
+    pkg = args[0].strip()
+
+    print Harvest(pkg).report()
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.error("Aborted.")
+        sys.exit(1)

=== renamed file 'harvest' => 'harvest.moved'
=== added file 'hugdaylist'
--- hugdaylist	1970-01-01 00:00:00 +0000
+++ hugdaylist	2012-09-12 18:51:22 +0000
@@ -0,0 +1,136 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Canonical Ltd., Daniel Holbach
+# Copyright (C) 2008 Jonathan Patrick Davies <jpds@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-3 for more details.
+#
+# ##################################################################
+#
+#
+# hugdaylist - produces MoinMoin wiki formatted tables based on a Launchpad bug
+#              list.
+#
+# hugdaylist <url>
+# - produces lists like https://wiki.ubuntu.com/UbuntuBugDay/20070912?action=raw
+#
+# hugdaylist -n <howmany> <url>
+# - will only list <howmany> URLs.
+
+import sys
+from optparse import OptionParser
+
+from launchpadlib.launchpad import Launchpad
+
+from ubuntutools.lp.libsupport import translate_web_api
+
+def check_args():
+    howmany = -1
+    url = ""
+
+    # Our usage options.
+    usage = "usage: %prog [-n <number>] launchpad-buglist-url"
+    opt_parser = OptionParser(usage)
+
+    # Options - namely just the number of bugs to output.
+    opt_parser.add_option("-n", "--number", type="int",
+                          dest="number", help="Number of entries to output.")
+
+    # Parse arguments.
+    (options, args) = opt_parser.parse_args()
+
+    # Check if we want a number other than the default.
+    howmany = options.number
+
+    # Check that we have an URL.
+    if not args:
+        print >> sys.stderr, "An URL pointing to a Launchpad bug list is " \
+           "required."
+        opt_parser.print_help()
+        sys.exit(1)
+    else:
+        url = args[0]
+
+    return (howmany, url)
+
+def filter_unsolved(task):
+    # TODO: don't use this filter here, only check status and assignee of
+    #   the given task
+    # Filter out special types of bugs:
+    # - https://wiki.ubuntu.com/Bugs/HowToTriage#Special%20types%20of%20bugs
+    # this is expensive, parse name out of self_link instead?
+    subscriptions = set(s.person.name for s in task.bug.subscriptions)
+    if (task.status != "Fix Committed" and
+        (not task.assignee or task.assignee.name in ['motu','desktop-bugs']) and
+         'ubuntu-sponsors' not in subscriptions and
+         'ubuntu-archive' not in subscriptions):
+        return True
+    return False
+
+def main():
+    (howmany, url) = check_args()
+    if len(url.split("?", 1)) == 2:
+        # search options not supported, because there is no mapping web ui
+        # options <-> API options
+        print >> sys.stderr, "Options in url are not supported, url: %s" % url
+        sys.exit(1)
+
+    launchpad = None
+    try:
+        launchpad = Launchpad.login_with("ubuntu-dev-tools", 'production')
+    except IOError, error:
+        print error
+        sys.exit(1)
+
+    api_url = translate_web_api(url, launchpad)
+    try:
+        product = launchpad.load(api_url)
+    except Exception, error:
+        response = getattr(error, "response", {})
+        if response.get("status", None) == "404":
+            print >> sys.stderr, ("The URL at '%s' does not appear to be a "
+                                  "valid url to a product") % url
+            sys.exit(1)
+        else:
+            raise
+
+    bug_list = [b for b in product.searchTasks() if filter_unsolved(b)]
+
+    if not bug_list:
+        print "Bug list of %s is empty." % url
+        sys.exit(0)
+    if howmany == -1:
+        howmany = len(bug_list)
+
+    print """
+## ||<rowbgcolor="#CCFFCC"> This task is done || somebody || ||
+## ||<rowbgcolor="#FFFFCC"> This task is assigned || somebody || <status> ||
+## ||<rowbgcolor="#FFEBBB"> This task isn't || ... || ||
+## ||<rowbgcolor="#FFCCCC"> This task is blocked on something || somebody || <explanation> ||
+
+|| Bug || Subject || Triager ||"""
+
+    for i in list(bug_list)[:howmany]:
+        bug = i.bug
+        print '||<rowbgcolor="#FFEBBB"> [%s %s] || %s || ||' % \
+            (bug.web_link, bug.id, bug.title)
+
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        print >> sys.stderr, "Aborted."
+        sys.exit(1)

=== renamed file 'hugdaylist' => 'hugdaylist.moved'
=== added file 'import-bug-from-debian'
--- import-bug-from-debian	1970-01-01 00:00:00 +0000
+++ import-bug-from-debian	2012-09-12 18:51:22 +0000
@@ -0,0 +1,137 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+
+# Copyright © 2009 James Westby <james.westby@ubuntu.com>,
+#             2010, 2011 Stefano Rivera <stefanor@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# ##################################################################
+
+from optparse import OptionParser, SUPPRESS_HELP
+import re
+import sys
+import webbrowser
+
+from devscripts.logger import Logger
+try:
+    import SOAPpy
+except ImportError:
+    Logger.error("Please install 'python-soappy' in order to use this utility.")
+    sys.exit(1)
+
+from launchpadlib.launchpad import Launchpad
+
+from ubuntutools.config import UDTConfig
+
+def main():
+    bug_re = re.compile(r"bug=(\d+)")
+
+    url = 'http://bugs.debian.org/cgi-bin/soap.cgi'
+    namespace = 'Debbugs/SOAP'
+    debbugs = SOAPpy.SOAPProxy(url, namespace)
+
+    # debug
+    #debbugs.config.dumpSOAPOut = 1
+    #debbugs.config.dumpSOAPIn = 1
+
+    parser = OptionParser(usage="%prog [option] bug ...")
+    parser.add_option("-b", "--browserless",
+                      help="Don't open the bug in the browser at the end",
+                      dest="browserless", action="store_true")
+    parser.add_option("-l", "--lpinstance", metavar="INSTANCE",
+                      help="Launchpad instance to connect to "
+                           "(default: production)",
+                      dest="lpinstance", default=None)
+    parser.add_option("-n", "--dry-run",
+                      help=SUPPRESS_HELP,
+                      dest="lpinstance", action="store_const", const="staging")
+    parser.add_option("-p", "--package", metavar="PACKAGE",
+                      help="Launchpad package to file bug against "
+                           "(default: Same as Debian)",
+                      dest="package", default=None)
+    parser.add_option("--no-conf", dest="no_conf", default=False,
+                      help="Don't read config files or environment variables.",
+                      action="store_true")
+    (options, args) = parser.parse_args()
+
+    config = UDTConfig(options.no_conf)
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value("LPINSTANCE")
+
+    launchpad = Launchpad.login_with("ubuntu-dev-tools", options.lpinstance)
+
+    debian = launchpad.distributions['debian']
+    ubuntu = launchpad.distributions['ubuntu']
+    lp_debbugs = launchpad.bug_trackers.getByName(name='debbugs')
+
+    bug_nums = []
+
+    for bug_num in args:
+        if bug_num.startswith("http"):
+            # bug URL
+            match = bug_re.search(bug_num)
+            if match is None:
+                Logger.error("Can't determine bug number from %s", bug_num)
+                sys.exit(1)
+            bug_num = match.groups()[0]
+        bug_num = bug_num.lstrip("#")
+        bug_num = int(bug_num)
+        bug_nums.append(bug_num)
+
+    bugs = debbugs.get_status(*bug_nums)
+
+    if len(bug_nums) > 1:
+        bugs = bugs[0]
+
+    if not bugs:
+        Logger.error("Cannot find any of the listed bugs")
+        sys.exit(1)
+
+    for bug in bugs:
+        bug = bug.value
+        ubupackage = package = bug.source
+        if options.package:
+            ubupackage = options.package
+        bug_num = bug.bug_num
+        subject = bug.subject
+        log = debbugs.get_bug_log(bug_num)
+        summary = log[0][0]
+        target = ubuntu.getSourcePackage(name=ubupackage)
+        if target is None:
+            Logger.error("Source package '%s' is not in Ubuntu. Please specify "
+                         "the destination source package with --package",
+                         ubupackage)
+            sys.exit(1)
+
+        u_bug = launchpad.bugs.createBug(target=target, title=subject,
+                description='Imported from Debian bug '
+                            'http://bugs.debian.org/%d:\n\n%s'
+                            % (bug_num, summary))
+        d_sp = debian.getSourcePackage(name=package)
+        if d_sp is None and options.package:
+            d_sp = debian.getSourcePackage(name=options.package)
+        d_task = u_bug.addTask(target=d_sp)
+        d_watch = u_bug.addWatch(remote_bug=bug_num, bug_tracker=lp_debbugs)
+        d_task.bug_watch = d_watch
+        d_task.lp_save()
+        Logger.normal("Opened %s", u_bug.web_link)
+        if not options.browserless:
+            webbrowser.open(u_bug.web_link)
+
+if __name__ == '__main__':
+    main()

=== renamed file 'import-bug-from-debian' => 'import-bug-from-debian.moved'
=== added file 'merge-changelog'
--- merge-changelog	1970-01-01 00:00:00 +0000
+++ merge-changelog	2012-09-12 18:51:22 +0000
@@ -0,0 +1,274 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright © 2008 Canonical Ltd.
+# Author: Scott James Remnant <scott at ubuntu.com>.
+# Hacked up by: Bryce Harrington <bryce at ubuntu.com>
+# Change merge_changelog to merge-changelog: Ryan Kavanagh
+#                                            <ryanakca@kubuntu.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of version 3 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import re
+import sys
+
+def usage(exit_code=1):
+    print '''Usage: merge-changelog <left changelog> <right changelog>
+
+merge-changelog takes two changelogs that once shared a common source,
+merges them back together, and prints the merged result to stdout.  This
+is useful if you need to manually merge a ubuntu package with a new
+Debian release of the package.
+'''
+    sys.exit(exit_code)
+
+########################################################################
+# Changelog Management
+########################################################################
+
+# Regular expression for top of debian/changelog
+CL_RE = re.compile(r'^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)((\s+[-0-9a-z]+)+)\;',
+                   re.IGNORECASE)
+
+def merge_changelog(left_changelog, right_changelog):
+    """Merge a changelog file."""
+
+    left_cl = read_changelog(left_changelog)
+    right_cl = read_changelog(right_changelog)
+
+    for right_ver, right_text in right_cl:
+        while len(left_cl) and left_cl[0][0] > right_ver:
+            (left_ver, left_text) = left_cl.pop(0)
+            print left_text
+
+        while len(left_cl) and left_cl[0][0] == right_ver:
+            (left_ver, left_text) = left_cl.pop(0)
+
+        print right_text
+
+    for _, left_text in left_cl:
+        print left_text
+
+    return False
+
+def read_changelog(filename):
+    """Return a parsed changelog file."""
+    entries = []
+
+    changelog_file = open(filename)
+    try:
+        (ver, text) = (None, "")
+        for line in changelog_file:
+            match = CL_RE.search(line)
+            if match:
+                try:
+                    ver = Version(match.group(2))
+                except ValueError:
+                    ver = None
+
+                text += line
+            elif line.startswith(" -- "):
+                if ver is None:
+                    ver = Version("0")
+
+                text += line
+                entries.append((ver, text))
+                (ver, text) = (None, "")
+            elif len(line.strip()) or ver is not None:
+                text += line
+    finally:
+        changelog_file.close()
+
+    if len(text):
+        entries.append((ver, text))
+
+    return entries
+
+########################################################################
+# Version parsing code
+########################################################################
+# Regular expressions make validating things easy
+VALID_EPOCH = re.compile(r'^[0-9]+$')
+VALID_UPSTREAM = re.compile(r'^[A-Za-z0-9+:.~-]*$')
+VALID_REVISION = re.compile(r'^[A-Za-z0-9+.~]+$')
+
+# Character comparison table for upstream and revision components
+CMP_TABLE = "~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-.:"
+
+
+class Version(object):
+    """Debian version number.
+
+    This class is designed to be reasonably transparent and allow you
+    to write code like:
+
+    |   s.version >= '1.100-1'
+
+    The comparison will be done according to Debian rules, so '1.2' will
+    compare lower.
+
+    Properties:
+      epoch       Epoch
+      upstream    Upstream version
+      revision    Debian/local revision
+    """
+
+    def __init__(self, ver):
+        """Parse a string or number into the three components."""
+        self.epoch = 0
+        self.upstream = None
+        self.revision = None
+
+        ver = str(ver)
+        if not len(ver):
+            raise ValueError
+
+        # Epoch is component before first colon
+        idx = ver.find(":")
+        if idx != -1:
+            self.epoch = ver[:idx]
+            if not len(self.epoch):
+                raise ValueError
+            if not VALID_EPOCH.search(self.epoch):
+                raise ValueError
+            ver = ver[idx+1:]
+
+        # Revision is component after last hyphen
+        idx = ver.rfind("-")
+        if idx != -1:
+            self.revision = ver[idx+1:]
+            if not len(self.revision):
+                raise ValueError
+            if not VALID_REVISION.search(self.revision):
+                raise ValueError
+            ver = ver[:idx]
+
+        # Remaining component is upstream
+        self.upstream = ver
+        if not len(self.upstream):
+            raise ValueError
+        if not VALID_UPSTREAM.search(self.upstream):
+            raise ValueError
+
+        self.epoch = int(self.epoch)
+
+    def get_without_epoch(self):
+        """Return the version without the epoch."""
+        string = self.upstream
+        if self.revision is not None:
+            string += "-%s" % (self.revision,)
+        return string
+
+    without_epoch = property(get_without_epoch)
+
+    def __str__(self):
+        """Return the class as a string for printing."""
+        string = ""
+        if self.epoch > 0:
+            string += "%d:" % (self.epoch,)
+        string += self.upstream
+        if self.revision is not None:
+            string += "-%s" % (self.revision,)
+        return string
+
+    def __repr__(self):
+        """Return a debugging representation of the object."""
+        return "<%s epoch: %d, upstream: %r, revision: %r>" \
+               % (self.__class__.__name__, self.epoch,
+                  self.upstream, self.revision)
+
+    def __cmp__(self, other):
+        """Compare two Version classes."""
+        other = Version(other)
+
+        result = cmp(self.epoch, other.epoch)
+        if result != 0:
+            return result
+
+        result = deb_cmp(self.upstream, other.upstream)
+        if result != 0:
+            return result
+
+        result = deb_cmp(self.revision or "", other.revision or "")
+        if result != 0:
+            return result
+
+        return 0
+
+
+def strcut(string, idx, accept):
+    """Cut characters from string that are entirely in accept."""
+    ret = ""
+    while idx < len(string) and string[idx] in accept:
+        ret += string[idx]
+        idx += 1
+
+    return (ret, idx)
+
+def deb_order(string, idx):
+    """Return the comparison order of two characters."""
+    if idx >= len(string):
+        return 0
+    elif string[idx] == "~":
+        return -1
+    else:
+        return CMP_TABLE.index(string[idx])
+
+def deb_cmp_str(x, y):
+    """Compare two strings in a deb version."""
+    idx = 0
+    while (idx < len(x)) or (idx < len(y)):
+        result = deb_order(x, idx) - deb_order(y, idx)
+        if result < 0:
+            return -1
+        elif result > 0:
+            return 1
+
+        idx += 1
+
+    return 0
+
+def deb_cmp(x, y):
+    """Implement the string comparison outlined by Debian policy."""
+    x_idx = y_idx = 0
+    while x_idx < len(x) or y_idx < len(y):
+        # Compare strings
+        (x_str, x_idx) = strcut(x, x_idx, CMP_TABLE)
+        (y_str, y_idx) = strcut(y, y_idx, CMP_TABLE)
+        result = deb_cmp_str(x_str, y_str)
+        if result != 0:
+            return result
+
+        # Compare numbers
+        (x_str, x_idx) = strcut(x, x_idx, "0123456789")
+        (y_str, y_idx) = strcut(y, y_idx, "0123456789")
+        result = cmp(int(x_str or "0"), int(y_str or "0"))
+        if result != 0:
+            return result
+
+    return 0
+
+
+def main():
+    if len(sys.argv) > 1 and sys.argv[1] in ('-h', '--help'):
+        usage(0)
+    if len(sys.argv) != 3:
+        usage(1)
+
+    left_changelog = sys.argv[1]
+    right_changelog = sys.argv[2]
+
+    merge_changelog(left_changelog, right_changelog)
+    sys.exit(0)
+
+if __name__ == '__main__':
+    main()

=== renamed file 'merge-changelog' => 'merge-changelog.moved'
=== added file 'mk-sbuild'
--- mk-sbuild	1970-01-01 00:00:00 +0000
+++ mk-sbuild	2012-09-12 18:51:22 +0000
@@ -0,0 +1,744 @@
+#!/bin/bash
+#
+# Copyright 2006-2011 (C) Canonical Ltd.
+# Authors:
+#  Kees Cook <kees@ubuntu.com>
+#  Emmet Hikory <persia@ubuntu.com>
+#  Scott Moser <smoser@ubuntu.com>
+#  Stefano Rivera <stefanor@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+#
+# This script creates chroots designed to be used in a snapshot mode
+# (with LVM, btrfs, overlayfs, or aufs) with schroot and sbuild.
+# Much love to "man sbuild-setup", https://wiki.ubuntu.com/PbuilderHowto,
+# and https://help.ubuntu.com/community/SbuildLVMHowto.
+#
+# It will deal with sbuild having not be installed and configured before.
+set -e
+
+# Set up configurable defaults (loaded after option processing)
+LV_SIZE="5G"
+SNAPSHOT_SIZE="4G"
+SOURCE_CHROOTS_DIR="/var/lib/schroot/chroots"
+SOURCE_CHROOTS_TGZ="/var/lib/schroot/tarballs"
+CHROOT_SNAPSHOT_DIR="/var/lib/schroot/snapshots"
+
+function usage()
+{
+    echo "Usage: $0 [OPTIONS] Release" >&2
+    echo "Options:"
+    echo "  --arch=ARCH                What architecture to select"
+    echo "  --name=NAME                Base name for the schroot (arch is appended)"
+    echo "  --personality=PERSONALITY  What personality to use (defaults to match --arch)"
+    echo "  --vg=VG                    use LVM snapshots, with group VG"
+    echo "  --debug                    Turn on script debugging"
+    echo "  --skip-updates             Do not include -updates pocket in sources.list"
+    echo "  --source-template=FILE     Use FILE as the sources.list template"
+    echo "  --debootstrap-mirror=URL   Use URL as the debootstrap source"
+    echo "  --debootstrap-include=list Comma separated list of packages to include"
+    echo "  --debootstrap-exclude=list Comma separated list of packages to exclude"
+    echo "  --debootstrap-proxy=URL    Use PROXY as apt proxy"
+    echo "  --eatmydata                Install and use eatmydata"
+    echo "  --distro=DISTRO            Install specific distro:"
+    echo "                                 'ubuntu' or 'debian' "
+    echo "                                 (defaults to determining from release name)"
+    echo "  --type=SCHROOT_TYPE        Define the schroot type:"
+    echo "                                 'directory'(default), 'file', or 'btrfs-snapshot'"
+    echo "                                 'lvm-snapshot' is selected via --vg"
+    echo ""
+    echo "Configuration (via ~/.mk-sbuild.rc)"
+    echo "  LV_SIZE                    Size of source LVs (default ${LV_SIZE})"
+    echo "  SNAPSHOT_SIZE              Size of snapshot LVs (default ${SNAPSHOT_SIZE})"
+    echo "  SOURCE_CHROOTS_DIR         Directory to store directory source chroots"
+    echo "  SOURCE_CHROOTS_TGZ         Directory to store file source chroots"
+    echo "  CHROOT_SNAPSHOT_DIR        Directory to mount open btrfs snaphshot chroots (default ${CHROOT_SNAPSHOT_DIR})"
+    echo "  SCHROOT_CONF_SUFFIX        Lines to append to schroot.conf entries"
+    echo "  SKIP_UPDATES               Enable --skip-updates"
+    echo "  DEBOOTSTRAP_MIRROR         Mirror location (same as --debootstrap-mirror)"
+    echo "  DEBOOTSTRAP_INCLUDE        Included packages (same as --debootstrap-include)"
+    echo "  DEBOOTSTRAP_EXCLUDE        Excluded packages (same as --debootstrap-exclude)"
+    echo "  DEBOOTSTRAP_PROXY          Apt proxy (same as --debootstrap-proxy)"
+    echo "  EATMYDATA                  Enable --eatmydata"
+    echo "  TEMPLATE_SOURCES           A template for sources.list"
+    echo "  TEMPLATE_SCHROOTCONF       A template for schroot.conf stanza"
+    if [ -z "$1" ]; then
+        exit 1
+    fi
+    exit $1
+}
+
+
+if [ -z "$1" ]; then
+    usage
+fi
+OPTS=`getopt -o 'h' --long "help,debug,skip-updates,eatmydata,arch:,name:,source-template:,debootstrap-mirror:,debootstrap-include:,debootstrap-exclude:,debootstrap-proxy:,personality:,distro:,vg:,type:" -- "$@"`
+eval set -- "$OPTS"
+
+VG=""
+DISTRO=""
+name=""
+proxy="_unset_"
+EATMYDATA=0
+
+while :; do
+    case "$1" in
+        --debug)
+            set -x
+            shift
+            ;;
+        --arch)
+            CHROOT_ARCH="$2"
+            if [ "$2" = "i386" ] || [ "$2" = "lpia" ] && [ -z "$personality" ];
+            then
+                personality="linux32"
+            fi
+            shift 2
+            ;;
+        --personality)
+            personality="$2"
+            shift 2
+            ;;
+        --skip-updates)
+            SKIP_UPDATES="1"
+            shift
+            ;;
+        --name)
+            name="$2"
+            shift 2
+            ;;
+        --source-template)
+            TEMPLATE_SOURCES="$2"
+            shift 2
+            if [ ! -r $TEMPLATE_SOURCES ]; then
+                echo "W: Template file $TEMPLATE_SOURCES is not readable"
+                echo "W: Continuing with default sources!"
+            fi
+            ;;
+        --debootstrap-mirror)
+            DEBOOTSTRAP_MIRROR="$2"
+            shift 2
+            ;;
+        --debootstrap-include)
+            DEBOOTSTRAP_INCLUDE="$2"
+            shift 2
+            ;;
+        --debootstrap-exclude)
+            DEBOOTSTRAP_EXCLUDE="$2"
+            shift 2
+            ;;
+        --debootstrap-proxy)
+            proxy="$2"
+            shift 2
+            ;;
+        --eatmydata)
+            EATMYDATA=1
+            shift
+            ;;
+        --distro)
+            DISTRO="$2"
+            shift 2
+            ;;
+        --vg)
+            VG="$2"
+            shift 2
+            ;;
+        --type)
+            SCHROOT_TYPE="$2"
+            shift 2
+            ;;
+        --)
+            shift
+            break
+            ;;
+        -h|--help|*)
+            usage 0
+            ;;
+     esac
+done
+
+# For when schroot enters the chroot, we cannot be in a directory that
+# will not exist in the chroot.
+cd /
+
+if [ -w /etc/passwd -a ! -e ~/.sbuildrc -a ! -e ~/.mk-sbuild.rc ]; then
+    cat >&2 <<EOF
+It's recommended to run this script as a regular user, not root, so that it
+uses the configuration files in your home directory.
+It will use sudo to escalate to root as necessary.
+
+If you really do want to use it as root, create a .sbuildrc or .mk-sbuild.rc
+in root's home.
+EOF
+    exit 1
+fi
+
+# Perform once-only things to initially set up for using sbuild+schroot
+if [ ! -w /var/lib/sbuild ]; then
+    # Load all the packages you'll need to do work
+    sudo apt-get install sbuild schroot debootstrap
+    # Add self to the sbuild group
+    sudo adduser "$USER" sbuild
+
+    # Prepare a usable default .sbuildrc
+    if [ ! -e ~/.sbuildrc ]; then
+        cat > ~/.sbuildrc <<EOM
+# *** VERIFY AND UPDATE \$mailto and \$maintainer_name BELOW ***
+
+# Mail address where logs are sent to (mandatory, no default!)
+\$mailto = '$USER';
+
+# Name to use as override in .changes files for the Maintainer: field
+#\$maintainer_name='$USER <$USER@localhost>';
+
+# Directory for chroot symlinks and sbuild logs.  Defaults to the
+# current directory if unspecified.
+#\$build_dir='$HOME/ubuntu/build';
+
+# Directory for writing build logs to
+\$log_dir="$HOME/ubuntu/logs";
+
+# don't remove this, Perl needs it:
+1;
+EOM
+        sensible-editor ~/.sbuildrc
+        # Create target directories, if needed
+        eval $(egrep '^\$(build|log)_dir[ 	]*=' ~/.sbuildrc | cut -c2-)
+        if [ -n "$log_dir" ]; then
+            mkdir -p "$log_dir"
+        fi
+        if [ -n "$build_dir" ]; then
+            mkdir -p "$build_dir"
+        fi
+    else
+        echo "Your ~/.sbuildrc already exists -- leaving it as-is."
+    fi
+
+    echo '***********************************************'
+    echo '* Before continuing, you MUST restart your    *'
+    echo '* session to gain "sbuild" group permissions! *'
+    echo '***********************************************'
+    exit 0
+fi
+
+if ! id | fgrep -q '(sbuild)'; then
+    echo "You must be a member of the 'sbuild' group." >&2
+    exit 1
+fi
+
+# To build the chroot, we need to know which release of Ubuntu to debootstrap
+RELEASE="$1"
+if [ -z "$RELEASE" ]; then
+    usage
+fi
+
+# Determine distribution and possible synonyms
+synonym=""
+EXPERIMENTAL=0
+if [ "$RELEASE" = "experimental" ]; then
+    DISTRO="${DISTRO:-debian}"
+    EXPERIMENTAL=1
+    name="${name:-experimental}"
+    RELEASE=$(debian-distro-info --devel)
+elif debian-distro-info --all | grep -Fqx "$RELEASE"; then
+    DISTRO="${DISTRO:-debian}"
+    if [ "$RELEASE" = $(debian-distro-info --devel) ]; then
+        synonym=unstable
+    elif [ "$RELEASE" = $(debian-distro-info --testing) ]; then
+        synonym=testing
+    elif [ "$RELEASE" = $(debian-distro-info --stable) ]; then
+        synonym=stable
+    elif [ "$RELEASE" = $(debian-distro-info --old) ]; then
+        synonym=oldstable
+    fi
+elif ubuntu-distro-info --all | grep -Fqx "$RELEASE"; then
+    DISTRO="${DISTRO:-ubuntu}"
+elif [ "$RELEASE" = "unstable" ]; then
+    DISTRO="${DISTRO:-debian}"
+    synonym="$RELEASE"
+    RELEASE=$(debian-distro-info --devel)
+elif [ "$RELEASE" = "testing" ]; then
+    DISTRO="${DISTRO:-debian}"
+    synonym="$RELEASE"
+    RELEASE=$(debian-distro-info --testing)
+elif [ "$RELEASE" = "stable" ]; then
+    DISTRO="${DISTRO:-debian}"
+    synonym="$RELEASE"
+    RELEASE=$(debian-distro-info --stable)
+elif [ "$RELEASE" = "oldstable" ]; then
+    DISTRO="${DISTRO:-debian}"
+    synonym="$RELEASE"
+    RELEASE=$(debian-distro-info --old)
+elif [ -z "$DISTRO" ]; then
+    echo "Unable to determine distribution, please provide --distro" >&2
+    exit 1
+fi
+
+# By default, name the schroot the same as the release
+if [ -z "$name" ]; then
+    name="$RELEASE"
+else
+    # Disable synonym when a custom name is used:
+    synonym=""
+fi
+
+# By default, use the native architecture.
+HOST_ARCH=$(dpkg --print-architecture)
+if [ -z "$CHROOT_ARCH" ]; then
+    CHROOT_ARCH="$HOST_ARCH"
+fi
+
+CHROOT_NAME="${name}-${CHROOT_ARCH}"
+
+if [ -z "$synonym" ]; then
+    CHROOT_SYNONYM=""
+else
+    CHROOT_SYNONYM="${synonym}-${CHROOT_ARCH}"
+fi
+
+# Load customizations
+if [ -r ~/.mk-sbuild.rc ]; then
+    . ~/.mk-sbuild.rc
+fi
+
+# Will eatmydata be available?
+if [ $EATMYDATA -eq 1 ]; then
+    case "$RELEASE" in
+        hardy|lucid|maverick|lenny|squeeze)
+            echo "eatmydata is known not to be available in $RELEASE, ignoring --eatmydata"
+            EATMYDATA=0
+            ;;
+        *)
+            DEBOOTSTRAP_INCLUDE="${DEBOOTSTRAP_INCLUDE:+$DEBOOTSTRAP_INCLUDE,}eatmydata"
+            ;;
+    esac
+fi
+
+if [ -z "$SCHROOT_TYPE" ]; then
+    # To build the LV, we need to know which volume group to use
+    if [ -n "$VG" ]; then
+        SCHROOT_TYPE="lvm-snapshot"
+    else
+        SCHROOT_TYPE="directory"
+    fi
+fi
+
+case "$SCHROOT_TYPE" in
+"lvm-snapshot")
+    # Make sure LVM tools that operate on the snapshots have needed module
+    if ! sudo dmsetup targets | grep -q ^snapshot; then
+        sudo modprobe dm_snapshot
+        echo dm_snapshot | sudo tee -a /etc/modules >/dev/null
+    fi
+
+    # Set up some variables for use in the paths and names
+    CHROOT_LV="${name}_${CHROOT_ARCH}_chroot"
+    CHROOT_PATH="/dev/$VG/$CHROOT_LV"
+
+    # Install lvm2 if missing
+    if ! dpkg -l lvm2 >/dev/null 2>&1; then
+        sudo apt-get install lvm2
+    fi
+
+    # Does the specified VG exist?  (vgdisplay doesn't set error codes...)
+    if [ `sudo vgdisplay -c "$VG" | wc -l` -eq 0 ]; then
+        echo "Volume group '${VG}' does not appear to exist" >&2
+        exit 1
+    fi
+    ;;
+"directory")
+    if [ ! -d "${SOURCE_CHROOTS_DIR}" ]; then
+        sudo mkdir -p "${SOURCE_CHROOTS_DIR}"
+    fi
+    # Set up some variables for use in the paths and names
+    CHROOT_PATH="${SOURCE_CHROOTS_DIR}/${CHROOT_NAME}"
+    ;;
+"file")
+    if [ ! -d "$SOURCE_CHROOTS_TGZ" ]; then
+        sudo mkdir -p "$SOURCE_CHROOTS_TGZ"
+    fi
+    # Set up some variables for use in the paths and names
+    CHROOT_PATH="${SOURCE_CHROOTS_TGZ}/${CHROOT_NAME}.tgz"
+    ;;
+"btrfs-snapshot")
+    if [ ! -d "${SOURCE_CHROOTS_DIR}" ]; then
+        sudo mkdir -p "${SOURCE_CHROOTS_DIR}"
+    fi
+    if [ ! -d "${CHROOT_SNAPSHOT_DIR}" ]; then
+        sudo mkdir -p "${CHROOT_SNAPSHOT_DIR}"
+    fi
+    CHROOT_PATH="${SOURCE_CHROOTS_DIR}/${CHROOT_NAME}"
+    ;;
+*)
+    echo 'unknown source type!?' >&2
+    exit 1
+    ;;
+esac
+
+# Is the specified release known to debootstrap?
+variant_opt="--variant=buildd"
+if [ ! -r "/usr/share/debootstrap/scripts/$RELEASE" ]; then
+    echo "Specified release ($RELEASE) not known to debootstrap" >&2
+    exit 1
+fi
+
+BUILD_PKGS="build-essential fakeroot apt-utils"
+# Handle distro-specific logic, unknown to debootstrap
+case "$DISTRO" in
+ubuntu)
+    if [ -z "$DEBOOTSTRAP_MIRROR" ]; then
+        case "$CHROOT_ARCH" in
+        amd64 | i386)
+            DEBOOTSTRAP_MIRROR="http://archive.ubuntu.com/ubuntu"
+            ;;
+        armhf | armel | hppa | ia64 | lpia | sparc)
+            DEBOOTSTRAP_MIRROR="http://ports.ubuntu.com/ubuntu-ports"
+            ;;
+        powerpc)
+            if [ "$RELEASE" != "dapper" ]; then
+                DEBOOTSTRAP_MIRROR="http://ports.ubuntu.com/ubuntu-ports"
+            else
+                DEBOOTSTRAP_MIRROR="http://archive.ubuntu.com/ubuntu"
+            fi
+            ;;
+        esac
+    fi
+    if [ -z "$COMPONENTS" ]; then
+        COMPONENTS="main restricted universe multiverse"
+    fi
+    if [ -z "$SOURCES_SECURITY_SUITE" ]; then
+        SOURCES_SECURITY_SUITE="RELEASE-security"
+    fi
+    if [ -z "$SOURCES_SECURITY_URL" ]; then
+        case "$CHROOT_ARCH" in
+        amd64 | i386)
+            SOURCES_SECURITY_URL="http://security.ubuntu.com/ubuntu"
+            ;;
+        armhf | armel | hppa | ia64 | lpia | sparc)
+            SOURCES_SECURITY_URL="http://ports.ubuntu.com/ubuntu-ports"
+            ;;
+        powerpc)
+            if [ "$RELEASE" != "dapper" ]; then
+                SOURCES_SECURITY_URL="http://ports.ubuntu.com/ubuntu-ports"
+            else
+                SOURCES_SECURITY_URL="http://security.ubuntu.com/ubuntu"
+            fi
+            ;;
+        esac
+    fi
+    # Add edgy+ buildd tools
+    if [ "$RELEASE" != "breezy" ] && [ "$RELEASE" != "dapper" ]; then
+        # Disable recommends for a smaller chroot (gutsy and later only)
+        BUILD_PKGS="--no-install-recommends $BUILD_PKGS"
+        # Add buildd tools
+        BUILD_PKGS="$BUILD_PKGS pkg-create-dbgsym pkgbinarymangler"
+    fi
+    ;;
+debian)
+    if [ -z "$DEBOOTSTRAP_MIRROR" ]; then
+        DEBOOTSTRAP_MIRROR="http://ftp.debian.org/debian"
+    fi
+    if [ -z "$COMPONENTS" ]; then
+        COMPONENTS="main non-free contrib"
+    fi
+    # Debian only performs security updates
+    SKIP_UPDATES=1
+    if [ -z "$SOURCES_SECURITY_SUITE" ]; then
+        SOURCES_SECURITY_SUITE="RELEASE/updates"
+    fi
+    if [ -z "$SOURCES_SECURITY_URL" ]; then
+        SOURCES_SECURITY_URL="http://security.debian.org/"
+    fi
+    # Unstable (aka "sid") does not have a security repository
+    if [ "$RELEASE" = 'unstable' ] || [ "$RELEASE" = 'sid' ]; then
+        SKIP_SECURITY=1
+    fi
+    # Keep the chroot as minimal as possible
+    BUILD_PKGS="--no-install-recommends $BUILD_PKGS"
+    ;;
+*)
+    echo "Unknown --distro '$DISTRO': aborting" >&2
+    exit 1
+    ;;
+esac
+
+debootstrap_opts="--components=$(echo $COMPONENTS | tr ' ' ,)"
+if [ -n "$DEBOOTSTRAP_INCLUDE" ] ; then
+    debootstrap_opts="$debootstrap_opts --include=$DEBOOTSTRAP_INCLUDE"
+fi
+
+if [ -n "$DEBOOTSTRAP_EXCLUDE" ] ; then
+    debootstrap_opts="$debootstrap_opts --exclude=$DEBOOTSTRAP_EXCLUDE"
+fi
+
+# if http_proxy is set in the environment (even empty) set 'proxy' to it
+[ "$proxy" = "_unset_" -a "${DEBOOTSTRAP_PROXY-xx}" != "xx" ] &&
+    proxy=${DEBOOTSTRAP_PROXY}
+[ "$proxy" = "_unset_" -a "${http_proxy-xx}" != "xx" ] && proxy=${http_proxy}
+if [ "$proxy" = "_unset_" ]; then
+    _out=$(apt-config shell x Acquire::HTTP::Proxy) &&
+        _out=$(sh -c 'eval $1 && echo $x' -- "$_out") && [ -n "$_out" ] &&
+        proxy="$_out"
+fi
+[ "$proxy" = "_unset_" ] && proxy=""
+
+DEBOOTSTRAP_COMMAND=debootstrap
+# Use qemu-kvm-extras-static for foreign chroots
+if [ "$CHROOT_ARCH" != "$HOST_ARCH" ] ; then
+    case "$CHROOT_ARCH-$HOST_ARCH" in
+    # Sometimes we don't need qemu
+    amd64-i386|amd64-lpia|arm-armel|armel-arm|armel-armhf|armhf-armel|i386-amd64|i386-lpia|lpia-i386|powerpc-ppc64|ppc64-powerpc|sparc-sparc64|sparc64-sparc)
+        ;;
+    # Sometimes we do
+    *)
+        DEBOOTSTRAP_COMMAND=qemu-debootstrap
+        if ! which "$DEBOOTSTRAP_COMMAND"; then
+            sudo apt-get install qemu-user-static
+        fi
+        ;;
+    esac
+fi
+
+case "$SCHROOT_TYPE" in
+"lvm-snapshot")
+    # Allocate the "golden" chroot LV
+    sudo lvcreate -n "$CHROOT_LV" -L "$LV_SIZE" "$VG"
+    sudo mkfs -t ext4 "$CHROOT_PATH"
+
+    # Mount
+    MNT=`mktemp -d -t schroot-XXXXXX`
+    sudo mount "$CHROOT_PATH" "$MNT"
+    ;;
+"directory")
+    MNT="${CHROOT_PATH}"
+    if [ -d "${MNT}" ]; then
+        echo "E: ${MNT} already exists; aborting" >&2
+        exit 1
+    fi
+    sudo mkdir -p "${MNT}"
+    ;;
+"btrfs-snapshot")
+    MNT="${CHROOT_PATH}"
+    if sudo btrfs subvolume list "${MNT}" >/dev/null 2>&1; then
+        echo "E: Subvolume ${MNT} already exists; aborting" >&2
+        exit 1
+    fi
+    sudo btrfs subvolume create "${MNT}"
+    ;;
+"file")
+    MNT=`mktemp -d -t schroot-XXXXXX`
+esac
+
+# Debian doesn't have overlayfs yet
+case "$SCHROOT_TYPE" in
+    directory|file)
+    if grep -q '\soverlayfs$' /proc/filesystems \
+            || /sbin/modprobe -q --dry-run overlayfs; then
+        OVERLAY_FS=overlayfs
+    else
+        OVERLAY_FS=aufs
+    fi
+esac
+
+# work around apt's GPG invocation that fails without root's .gnupg directory
+sudo mkdir -p -m 0700 "$MNT"/root/.gnupg
+
+# debootstrap the chroot
+sudo ${proxy:+"http_proxy=${proxy}"} "$DEBOOTSTRAP_COMMAND" --arch="$CHROOT_ARCH" $variant_opt $debootstrap_opts "$RELEASE" "$MNT" "${DEBOOTSTRAP_MIRROR:-http://archive.ubuntu.com/ubuntu}"
+
+# Update the package sources
+TEMP_SOURCES=`mktemp -t sources-XXXXXX`
+if [ -z "$TEMPLATE_SOURCES" ]; then
+    TEMPLATE_SOURCES=~/.mk-sbuild.sources
+fi
+if [ -r "$TEMPLATE_SOURCES" ]; then
+    cat "$TEMPLATE_SOURCES" > "$TEMP_SOURCES"
+else
+    cat > "$TEMP_SOURCES" <<EOM
+deb ${DEBOOTSTRAP_MIRROR} RELEASE ${COMPONENTS}
+deb-src ${DEBOOTSTRAP_MIRROR} RELEASE ${COMPONENTS}
+EOM
+    if [ "$EXPERIMENTAL" -eq 1 ]; then
+        cat >> "$TEMP_SOURCES" <<EOM
+deb ${DEBOOTSTRAP_MIRROR} experimental ${COMPONENTS}
+deb-src ${DEBOOTSTRAP_MIRROR} experimental ${COMPONENTS}
+EOM
+    fi
+    if [ -z "$SKIP_UPDATES" ]; then
+        cat >> "$TEMP_SOURCES" <<EOM
+deb ${DEBOOTSTRAP_MIRROR} RELEASE-updates ${COMPONENTS}
+deb-src ${DEBOOTSTRAP_MIRROR} RELEASE-updates ${COMPONENTS}
+EOM
+    fi
+    if [ -z "$SKIP_SECURITY" ]; then
+        cat >> "$TEMP_SOURCES" <<EOM
+deb ${SOURCES_SECURITY_URL} ${SOURCES_SECURITY_SUITE} ${COMPONENTS}
+deb-src ${SOURCES_SECURITY_URL} ${SOURCES_SECURITY_SUITE} ${COMPONENTS}
+EOM
+    fi
+fi
+cat "$TEMP_SOURCES" | sed -e "s|RELEASE|$RELEASE|g" | \
+    sudo bash -c "cat > $MNT/etc/apt/sources.list"
+rm -f "$TEMP_SOURCES"
+
+# Copy the timezone (comment this out if you want to leave the chroot at UTC)
+sudo cp /etc/localtime /etc/timezone "$MNT"/etc/
+# Create a schroot entry for this chroot
+TEMP_SCHROOTCONF=`mktemp -t schrootconf-XXXXXX`
+TEMPLATE_SCHROOTCONF=~/.mk-sbuild.schroot.conf
+TYPED_TEMPLATE_SCHROOTCONF="${TEMPLATE_SCHROOTCONF}.${SCHROOT_TYPE}"
+
+if [ -r "${TYPED_TEMPLATE_SCHROOTCONF}" ]; then
+    cat "${TYPED_TEMPLATE_SCHROOTCONF}" > "$TEMP_SCHROOTCONF"
+elif [ -r "${TEMPLATE_SCHROOTCONF}" ]; then
+    cat "$TEMPLATE_SCHROOTCONF" > "$TEMP_SCHROOTCONF"
+else
+    ADMIN_GROUPS="sbuild,root"
+    if getent group admin > /dev/null; then
+        ADMIN_GROUPS+=",admin"
+    fi
+    cat > "$TEMP_SCHROOTCONF" <<EOM
+[CHROOT_NAME]
+description=CHROOT_NAME
+groups=$ADMIN_GROUPS
+root-groups=$ADMIN_GROUPS
+# Uncomment these lines to allow members of these groups to access
+# the -source chroots directly (useful for automated updates, etc).
+#source-root-users=$ADMIN_GROUPS
+#source-root-groups=$ADMIN_GROUPS
+type=SCHROOT_TYPE
+EOM
+    if [ $EATMYDATA -eq 1 ]; then
+    cat >> "$TEMP_SCHROOTCONF" <<EOM
+command-prefix=eatmydata
+EOM
+    fi
+    case "$SCHROOT_TYPE" in
+    "lvm-snapshot")
+        cat >> "$TEMP_SCHROOTCONF" <<EOM
+device=CHROOT_PATH
+mount-options=-o noatime
+lvm-snapshot-options=--size SNAPSHOT_SIZE
+EOM
+    ;;
+    directory|file)
+        cat >> "${TEMP_SCHROOTCONF}" <<EOM
+union-type=$OVERLAY_FS
+${SCHROOT_TYPE}=CHROOT_PATH
+EOM
+    ;;
+    btrfs-snapshot)
+        cat >> "${TEMP_SCHROOTCONF}" <<EOM
+btrfs-source-subvolume=CHROOT_PATH
+btrfs-snapshot-directory=CHROOT_SNAPSHOT_DIR
+EOM
+    ;;
+    esac
+fi
+if [ ! -z "$personality" ]; then
+    echo "personality=$personality" >> "$TEMP_SCHROOTCONF"
+fi
+if [ ! -z "$CHROOT_SYNONYM" ]; then
+    echo "aliases=$CHROOT_SYNONYM" >> "$TEMP_SCHROOTCONF"
+fi
+if [ ! -z "$SCHROOT_CONF_SUFFIX" ]; then
+    echo "$SCHROOT_CONF_SUFFIX" >> "$TEMP_SCHROOTCONF"
+fi
+sed -e "s|CHROOT_NAME|$CHROOT_NAME|g" \
+    -e "s|CHROOT_PATH|$CHROOT_PATH|g" \
+    -e "s|SNAPSHOT_SIZE|$SNAPSHOT_SIZE|g" \
+    -e "s|SCHROOT_TYPE|$SCHROOT_TYPE|g" \
+    -e "s|CHROOT_SNAPSHOT_DIR|$CHROOT_SNAPSHOT_DIR|g" \
+    "$TEMP_SCHROOTCONF" \
+    | sudo tee "/etc/schroot/chroot.d/sbuild-$CHROOT_NAME" > /dev/null
+rm -f "$TEMP_SCHROOTCONF"
+
+# Disable daemons in chroot:
+sudo bash -c "cat >> $MNT/usr/sbin/policy-rc.d" <<EOM
+#!/bin/sh
+while true; do
+    case "\$1" in
+      -*) shift ;;
+      makedev) exit 0;;
+      x11-common) exit 0;;
+      *) exit 101;;
+    esac
+done
+EOM
+sudo chmod a+x "$MNT"/usr/sbin/policy-rc.d
+
+# Create image finalization script
+sudo bash -c "cat >> $MNT/finish.sh" <<EOM
+#!/bin/bash
+#set -x
+set -e
+if [ -n "$proxy" ]; then
+   mkdir -p /etc/apt/apt.conf.d/
+   cat > /etc/apt/apt.conf.d/99mk-sbuild-proxy <<EOF
+## proxy settings copied from mk-sbuild
+Acquire { HTTP { Proxy "$proxy"; }; };
+EOF
+fi
+# Reload package lists
+apt-get update || true
+# Pull down signature requirements
+apt-get -y --force-yes install gnupg ${DISTRO}-keyring
+# Reload package lists
+apt-get update || true
+# Disable debconf questions so that automated builds won't prompt
+echo set debconf/frontend Noninteractive | debconf-communicate
+echo set debconf/priority critical | debconf-communicate
+# Install basic build tool set, trying to match buildd
+apt-get -y --force-yes install $BUILD_PKGS
+# Set up expected /dev entries
+if [ ! -r /dev/stdin ];  then ln -s /proc/self/fd/0 /dev/stdin;  fi
+if [ ! -r /dev/stdout ]; then ln -s /proc/self/fd/1 /dev/stdout; fi
+if [ ! -r /dev/stderr ]; then ln -s /proc/self/fd/2 /dev/stderr; fi
+# Clean up
+rm /finish.sh
+apt-get clean
+EOM
+sudo chmod a+x "$MNT"/finish.sh
+
+case "$SCHROOT_TYPE" in
+"lvm-snapshot")
+    sudo umount "$MNT"
+    rmdir "$MNT"
+    ;;
+"directory"|"btrfs-snapshot")
+    ;;
+"file")
+    cd "$MNT"
+    sudo tar czf "$CHROOT_PATH" .
+    cd /
+    sudo rm -r "$MNT"
+    ;;
+esac
+
+# Run finalization script on the "golden" copy via schroot.
+sudo schroot -c source:$CHROOT_NAME -u root /finish.sh
+
+# Finished
+echo ""
+echo "Done building $CHROOT_NAME."
+echo ""
+echo " To CHANGE the golden image: sudo schroot -c source:${CHROOT_NAME} -u root"
+echo " To ENTER an image snapshot: schroot -c ${CHROOT_NAME}"
+echo " To BUILD within a snapshot: sbuild -A -d ${CHROOT_NAME} PACKAGE*.dsc"
+echo ""
+
+# vi: set et:

=== renamed file 'mk-sbuild' => 'mk-sbuild.moved'
=== added file 'pbuilder-dist'
--- pbuilder-dist	1970-01-01 00:00:00 +0000
+++ pbuilder-dist	2012-09-12 18:51:22 +0000
@@ -0,0 +1,493 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010, Siegfried-A. Gevatter <rainct@ubuntu.com>,
+#               2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+# With some changes by Iain Lane <iain@orangesquash.org.uk>
+# Based upon pbuilder-dist-simple by Jamin Collins and Jordan Mantha.
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-2 for more details.
+#
+# ##################################################################
+#
+# This script is a wrapper to be able to easily use pbuilder/cowbuilder for
+# different distributions (eg, Gutsy, Hardy, Debian unstable, etc).
+#
+# You can create symlinks to a pbuilder-dist executable to get different
+# configurations. For example, a symlink called pbuilder-hardy will assume
+# that the target distribution is always meant to be Ubuntu Hardy.
+
+import os
+import sys
+
+from devscripts.logger import Logger
+from distro_info import DebianDistroInfo, UbuntuDistroInfo, DistroDataOutdated
+
+import ubuntutools.misc
+from ubuntutools.config import UDTConfig
+from ubuntutools import subprocess
+from ubuntutools.question import YesNoQuestion
+
+
+class PbuilderDist:
+    def __init__(self, builder):
+        # Base directory where pbuilder will put all the files it creates.
+        self.base = None
+
+        # Name of the operation which pbuilder should perform.
+        self.operation = None
+
+        # Wheter additional components should be used or not. That is,
+        # 'universe' and 'multiverse' for Ubuntu chroots and 'contrib'
+        # and 'non-free' for Debian.
+        self.extra_components = True
+
+        # Extra pockets, useful on stable releases
+        self.enable_security = True
+        self.enable_updates = True
+        self.enable_proposed = True
+
+        # File where the log of the last operation will be saved.
+        self.logfile = None
+
+        # System architecture
+        self.system_architecture = None
+
+        # Build architecture
+        self.build_architecture = None
+
+        # System's distribution
+        self.system_distro = None
+
+        # Target distribution
+        self.target_distro = None
+
+        # This is an identificative string which will either take the form
+        # 'distribution' or 'distribution-architecture'.
+        self.chroot_string = None
+
+        # Authentication method
+        self.auth = 'sudo'
+
+        # Builder
+        self.builder = builder
+
+        self._debian_distros = DebianDistroInfo().all + \
+                               ['stable', 'testing', 'unstable']
+
+
+        # Ensure that the used builder is installed
+        paths = set(os.environ['PATH'].split(':'))
+        paths |= set(('/sbin', '/usr/sbin', '/usr/local/sbin'))
+        if not any(os.path.exists(os.path.join(p, builder)) for p in paths):
+            Logger.error('Could not find "%s".', builder)
+            sys.exit(1)
+
+        ##############################################################
+
+        self.base = os.path.expanduser(os.environ.get('PBUILDFOLDER',
+                                                      '~/pbuilder/'))
+
+        if 'SUDO_USER' in os.environ:
+            Logger.warn('Running under sudo. '
+                        'This is probably not what you want. '
+                        'pbuilder-dist will use sudo itself, when necessary.')
+        if os.stat(os.environ['HOME']).st_uid != os.getuid():
+            Logger.error("You don't own $HOME")
+            sys.exit(1)
+
+        if not os.path.isdir(self.base):
+            try:
+                os.makedirs(self.base)
+            except OSError:
+                Logger.error('Cannot create base directory "%s"', self.base)
+                sys.exit(1)
+
+        if 'PBUILDAUTH' in os.environ:
+            self.auth = os.environ['PBUILDAUTH']
+
+        self.system_architecture = ubuntutools.misc.host_architecture()
+        self.system_distro = ubuntutools.misc.system_distribution()
+        if not self.system_architecture or not self.system_distro:
+            sys.exit(1)
+
+        self.target_distro = self.system_distro
+
+    def set_target_distro(self, distro):
+        """ PbuilderDist.set_target_distro(distro) -> None
+
+        Check if the given target distribution name is correct, if it
+        isn't know to the system ask the user for confirmation before
+        proceeding, and finally either save the value into the appropiate
+        variable or finalize pbuilder-dist's execution.
+        """
+        if not distro.isalpha():
+            Logger.error('"%s" is an invalid distribution codename.', distro)
+            sys.exit(1)
+
+        if not os.path.isfile(os.path.join('/usr/share/debootstrap/scripts/',
+                                           distro)):
+            if os.path.isdir('/usr/share/debootstrap/scripts/'):
+                # Debian experimental doesn't have a debootstrap file but
+                # should work nevertheless.
+                if distro not in self._debian_distros:
+                    answer = YesNoQuestion().ask(
+                            'Warning: Unknown distribution "%s". '
+                            'Do you want to continue' % distro, 'no')
+                    if answer == 'yes':
+                        sys.exit(0)
+            else:
+                Logger.error('Please install package "debootstrap".')
+                sys.exit(1)
+
+        self.target_distro = distro
+
+    def set_operation(self, operation):
+        """ PbuilderDist.set_operation -> None
+
+        Check if the given string is a valid pbuilder operation and
+        depending on this either save it into the appropiate variable
+        or finalize pbuilder-dist's execution.
+        """
+        arguments = ('create', 'update', 'build', 'clean', 'login', 'execute')
+
+        if operation not in arguments:
+            if operation.endswith('.dsc'):
+                if os.path.isfile(operation):
+                    self.operation = 'build'
+                    return [operation]
+                else:
+                    Logger.error('Could not find file "%s".', operation)
+                    sys.exit(1)
+            else:
+                Logger.error('"%s" is not a recognized argument.\n'
+                             'Please use one of these: %s.',
+                             operation, ', '.join(arguments))
+                sys.exit(1)
+        else:
+            self.operation = operation
+            return []
+
+    def get_command(self, remaining_arguments = None):
+        """ PbuilderDist.get_command -> string
+
+        Generate the pbuilder command which matches the given configuration
+        and return it as a string.
+        """
+        if not self.build_architecture:
+            self.build_architecture = self.system_architecture
+
+        if self.build_architecture == self.system_architecture:
+            self.chroot_string = self.target_distro
+        else:
+            self.chroot_string = (self.target_distro + '-'
+                                  + self.build_architecture)
+
+        prefix = os.path.join(self.base, self.chroot_string)
+        if '--buildresult' not in remaining_arguments:
+            result = '%s_result/' % prefix
+        else:
+            location_of_arg = remaining_arguments.index('--buildresult')
+            result = remaining_arguments[location_of_arg+1]
+            remaining_arguments.pop(location_of_arg+1)
+            remaining_arguments.pop(location_of_arg)
+
+        if '--buildplace' not in remaining_arguments:
+            buildplace = '%s_build/' % prefix
+        else:
+            location_of_arg = remaining_arguments.index('--buildplace')
+            buildplace = remaining_arguments[location_of_arg+1]
+            remaining_arguments.pop(location_of_arg+1)
+            remaining_arguments.pop(location_of_arg)
+
+        if not self.logfile and self.operation != 'login':
+            self.logfile = os.path.normpath('%s/last_operation.log' % result)
+
+        if not os.path.isdir(result):
+            try:
+                os.makedirs(result)
+            except OSError:
+                Logger.error('Cannot create results directory "%s"', result)
+                sys.exit(1)
+
+        if not os.path.isdir(buildplace):
+            try:
+                os.makedirs(buildplace)
+            except OSError:
+                Logger.error('Cannot create buildplace directory "%s"', result)
+                sys.exit(1)
+
+        arguments = [
+            '--%s' % self.operation,
+            '--distribution', self.target_distro,
+            '--buildresult', result,
+            '--buildplace', buildplace,
+        ]
+
+        if self.operation == 'update':
+            arguments += ['--override-config']
+
+        if self.builder == 'pbuilder':
+            arguments += ['--basetgz', prefix + '-base.tgz']
+        elif self.builder == 'cowbuilder':
+            arguments += ['--basepath', prefix + '-base.cow']
+        else:
+            Logger.error('Unrecognized builder "%s".', self.builder)
+            sys.exit(1)
+
+        if self.logfile:
+            arguments += ['--logfile', self.logfile]
+
+        if os.path.exists('/var/cache/archive/'):
+            arguments += ['--bindmounts', '/var/cache/archive/']
+
+        localrepo = '/var/cache/archive/' + self.target_distro
+        if os.path.exists(localrepo):
+            arguments += [
+                    '--othermirror',
+                    'deb file:///var/cache/archive/ %s/' % self.target_distro,
+            ]
+
+        config = UDTConfig()
+        if self.target_distro in self._debian_distros:
+            mirror = os.environ.get('MIRRORSITE',
+                    config.get_value('DEBIAN_MIRROR'))
+            components = 'main'
+            if self.extra_components:
+                components += ' contrib non-free'
+        else:
+            mirror = os.environ.get('MIRRORSITE',
+                    config.get_value('UBUNTU_MIRROR'))
+            if self.build_architecture not in ('amd64', 'i386'):
+                mirror = os.environ.get('MIRRORSITE',
+                    config.get_value('UBUNTU_PORTS_MIRROR'))
+            components = 'main restricted'
+            if self.extra_components:
+                components += ' universe multiverse'
+
+        arguments += ['--mirror', mirror]
+
+        othermirrors = []
+        if self.target_distro in self._debian_distros:
+            debian_info = DebianDistroInfo()
+            try:
+                codename = debian_info.codename(self.target_distro,
+                                                default=self.target_distro)
+            except DistroDataOutdated, e:
+                Logger.warn(e)
+            if codename in (debian_info.devel(), 'experimental'):
+                self.enable_security = False
+                self.enable_updates = False
+                self.enable_proposed = False
+            elif codename in (debian_info.testing(), 'testing'):
+                self.enable_updates = False
+
+            if self.enable_security:
+                othermirrors.append('deb %s %s/updates %s'
+                                    % (config.get_value('DEBSEC_MIRROR'),
+                                       self.target_distro, components))
+            if self.enable_updates:
+                othermirrors.append('deb %s %s-updates %s'
+                                    % (mirror, self.target_distro, components))
+            if self.enable_proposed:
+                othermirrors.append('deb %s %s-proposed-updates %s'
+                                    % (mirror, self.target_distro, components))
+        else:
+            try:
+                dev_release = self.target_distro == UbuntuDistroInfo().devel()
+            except DistroDataOutdated, e:
+                Logger.warn(e)
+                dev_release = True
+
+            if dev_release:
+                self.enable_security = False
+                self.enable_updates = False
+                self.enable_proposed = False
+
+            if self.enable_security:
+                othermirrors.append('deb %s %s-security %s'
+                                    % (mirror, self.target_distro, components))
+            if self.enable_updates:
+                othermirrors.append('deb %s %s-updates %s'
+                                    % (mirror, self.target_distro, components))
+            if self.enable_proposed:
+                othermirrors.append('deb %s %s-proposed %s'
+                                    % (mirror, self.target_distro, components))
+
+        if 'OTHERMIRROR' in os.environ:
+            othermirrors += os.environ['OTHERMIRROR'].split('|')
+
+        if othermirrors:
+            arguments += ['--othermirror', '|'.join(othermirrors)]
+
+        # Work around LP:#599695
+        if (ubuntutools.misc.system_distribution() == 'Debian'
+                and self.target_distro not in self._debian_distros):
+            if not os.path.exists(
+                    '/usr/share/keyrings/ubuntu-archive-keyring.gpg'):
+                Logger.error('ubuntu-keyring not installed')
+                sys.exit(1)
+            arguments += [
+                    '--debootstrapopts',
+                    '--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg',
+            ]
+        elif (ubuntutools.misc.system_distribution() == 'Ubuntu'
+                and self.target_distro in self._debian_distros):
+            if not os.path.exists(
+                    '/usr/share/keyrings/debian-archive-keyring.gpg'):
+                Logger.error('debian-archive-keyring not installed')
+                sys.exit(1)
+            arguments += [
+                    '--debootstrapopts',
+                    '--keyring=/usr/share/keyrings/debian-archive-keyring.gpg',
+            ]
+
+        arguments += ['--components', components]
+
+        if self.build_architecture != self.system_architecture:
+            arguments += ['--debootstrapopts',
+                          '--arch=' + self.build_architecture]
+
+        apt_conf_dir = os.path.join(self.base,
+                                    'etc/%s/apt.conf' % self.target_distro)
+        if os.path.exists(apt_conf_dir):
+            arguments += ['--aptconfdir', apt_conf_dir]
+
+        # Append remaining arguments
+        if remaining_arguments:
+            arguments.extend(remaining_arguments)
+
+        # Export the distribution and architecture information to the
+        # environment so that it is accessible to ~/.pbuilderrc (LP: #628933).
+        # With both common variable name schemes (BTS: #659060).
+        return [
+            self.auth,
+            'HOME=' + os.path.expanduser('~'),
+            'ARCHITECTURE=' + self.build_architecture,
+            'DISTRIBUTION=' + self.target_distro,
+            'ARCH=' + self.build_architecture,
+            'DIST=' + self.target_distro,
+            'DEB_BUILD_OPTIONS=' + os.environ.get('DEB_BUILD_OPTIONS', ''),
+            self.builder,
+        ] + arguments
+
+def show_help(exit_code = 0):
+    """ help() -> None
+
+    Print a help message for pbuilder-dist, and exit with the given code.
+    """
+    print 'See  man pbuilder-dist  for more information.'
+
+    sys.exit(exit_code)
+
+def main():
+    """ main() -> None
+
+    This is pbuilder-dist's main function. It creates a PbuilderDist
+    object, modifies all necessary settings taking data from the
+    executable's name and command line options and finally either ends
+    the script and runs pbuilder itself or exists with an error message.
+    """
+    script_name = os.path.basename(sys.argv[0])
+    parts = script_name.split('-')
+
+    # Copy arguments into another list for save manipulation
+    args = sys.argv[1:]
+
+    if ('-' in script_name and parts[0] not in ('pbuilder', 'cowbuilder')
+            or len(parts) > 3):
+        Logger.error('"%s" is not a valid name for a "pbuilder-dist" '
+                     'executable.', script_name)
+        sys.exit(1)
+
+    if len(args) < 1:
+        Logger.error('Insufficient number of arguments.')
+        show_help(1)
+
+    if args[0] in ('-h', '--help', 'help'):
+        show_help(0)
+
+    app = PbuilderDist(parts[0])
+
+    if len(parts) > 1 and parts[1] != 'dist' and '.' not in parts[1]:
+        app.set_target_distro(parts[1])
+    else:
+        app.set_target_distro(args.pop(0))
+
+    if len(parts) > 2:
+        requested_arch = parts[2]
+    elif len(args) > 0 and args[0] in (
+            'alpha', 'amd64', 'arm', 'armeb', 'armel', 'armhf', 'i386', 'lpia',
+            'm68k', 'mips', 'mipsel', 'powerpc', 'ppc64', 'sh4', 'sh4eb',
+            'sparc', 'sparc64'):
+        requested_arch = args.pop(0)
+    else:
+        requested_arch = None
+
+    if requested_arch:
+        app.build_architecture = requested_arch
+        # For some foreign architectures we need to use qemu
+        if (requested_arch != app.system_architecture
+                and (app.system_architecture, requested_arch) not in [
+                    ('amd64', 'i386'), ('amd64', 'lpia'), ('arm', 'armel'),
+                    ('armel', 'arm'), ('armel', 'armhf'), ('armhf', 'armel'),
+                    ('i386', 'lpia'), ('lpia', 'i386'), ('powerpc', 'ppc64'),
+                    ('ppc64', 'powerpc'), ('sparc', 'sparc64'),
+                    ('sparc64', 'sparc')]):
+            args += ['--debootstrap', 'qemu-debootstrap']
+
+    if 'mainonly' in sys.argv or '--main-only' in sys.argv:
+        app.extra_components = False
+        if 'mainonly' in sys.argv:
+            args.remove('mainonly')
+        else:
+            args.remove('--main-only')
+
+    if '--release-only' in sys.argv:
+        args.remove('--release-only')
+        app.enable_security = False
+        app.enable_updates = False
+        app.enable_proposed = False
+    elif '--security-only' in sys.argv:
+        args.remove('--security-only')
+        app.enable_updates = False
+        app.enable_proposed = False
+    elif '--updates-only' in sys.argv:
+        args.remove('--updates-only')
+        app.enable_proposed = False
+
+    if len(args) < 1:
+        Logger.error('Insufficient number of arguments.')
+        show_help(1)
+
+    # Parse the operation
+    args = app.set_operation(args.pop(0)) + args
+
+    if app.operation == 'build' and '.dsc' not in ' '.join(args):
+        Logger.error('You have to specify a .dsc file if you want to build.')
+        sys.exit(1)
+
+    # Execute the pbuilder command
+    if not '--debug-echo' in args:
+        sys.exit(subprocess.call(app.get_command(args)))
+    else:
+        print app.get_command([arg for arg in args if arg != '--debug-echo'])
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.error('Manually aborted.')
+        sys.exit(1)

=== added file 'pbuilder-dist-simple'
--- pbuilder-dist-simple	1970-01-01 00:00:00 +0000
+++ pbuilder-dist-simple	2012-09-12 18:51:22 +0000
@@ -0,0 +1,73 @@
+#!/bin/sh
+#
+# Copyright (C) Jamin W. Collins <jcollins@asgardsrealm.net>
+# Copyright (C) Jordan Mantha <mantha@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+#
+# This script is a wrapper to be able to easily use pbuilder for
+# different Ubuntu distributions (eg, Lucid, Natty, etc).
+#
+# Create symlinks to this script naming them 'pbuilder-lucid',
+# 'pbuilder-natty', etc. If you want additional features try out the more
+# advanced script 'pbuilder-dist'.
+
+OPERATION=$1
+DISTRIBUTION=`basename $0 | cut -f2 -d '-'`
+PROCEED=false
+BASE_DIR="$HOME/pbuilder"
+
+usage() {
+    prog=$(basename $0)
+    cat <<EOF
+Usage: $prog command [pbuilder-options...]
+
+A simple multi-release pbuilder wrapper
+
+Valid commands are:
+    create
+    update
+    build
+    clean
+    login
+    execute
+
+Options:
+  -h, --help  show this help message and exit
+EOF
+   exit $1
+}
+
+case $OPERATION in
+    create|update|build|clean|login|execute)
+        ;;
+    -h|--help)
+        usage 0
+        ;;
+    *)
+        usage 1
+        ;;
+esac
+shift
+if [ ! -d $BASE_DIR/${DISTRIBUTION}_result ]; then
+    mkdir -p $BASE_DIR/${DISTRIBUTION}_result/
+fi
+sudo pbuilder $OPERATION \
+  --basetgz $BASE_DIR/$DISTRIBUTION-base.tgz \
+  --distribution $DISTRIBUTION \
+  --buildresult $BASE_DIR/$DISTRIBUTION_result \
+  --othermirror "deb http://archive.ubuntu.com/ubuntu $DISTRIBUTION universe multiverse" "$@"

=== renamed file 'pbuilder-dist-simple' => 'pbuilder-dist-simple.moved'
=== renamed file 'pbuilder-dist' => 'pbuilder-dist.moved'
=== added file 'pull-debian-debdiff'
--- pull-debian-debdiff	1970-01-01 00:00:00 +0000
+++ pull-debian-debdiff	2012-09-12 18:51:22 +0000
@@ -0,0 +1,113 @@
+#!/usr/bin/python
+# pull-debian-debdiff - find and download a specific version of a Debian
+#                       package and its immediate parent to generate a debdiff.
+#
+# Copyright (C) 2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+# Inspired by a tool of the same name by Kees Cook.
+#
+# 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 sys
+
+import debian.debian_support
+import debian.changelog
+
+from devscripts.logger import Logger
+
+from ubuntutools.archive import DebianSourcePackage, DownloadError
+from ubuntutools.config import UDTConfig
+
+def previous_version(package, version, distance):
+    "Given an (extracted) package, determine the version distance versions ago"
+    upver = debian.debian_support.Version(version).upstream_version
+    filename = '%s-%s/debian/changelog' % (package, upver)
+    changelog_file = open(filename, 'r')
+    changelog = debian.changelog.Changelog(changelog_file.read())
+    changelog_file.close()
+    seen = 0
+    for entry in changelog:
+        if entry.distributions == 'UNRELEASED':
+            continue
+        if seen == distance:
+            return entry.version.full_version
+        seen += 1
+    return False
+
+def main():
+    parser = optparse.OptionParser('%prog [options] <package> <version> '
+                                   '[distance]')
+    parser.add_option('-f', '--fetch',
+                      dest='fetch_only', default=False, action='store_true',
+                      help="Only fetch the source packages, don't diff.")
+    parser.add_option('-d', '--debian-mirror', metavar='DEBIAN_MIRROR',
+                      dest='debian_mirror',
+                      help='Preferred Debian mirror '
+                           '(default: http://ftp.debian.org/debian)')
+    parser.add_option('-s', '--debsec-mirror', metavar='DEBSEC_MIRROR',
+                      dest='debsec_mirror',
+                      help='Preferred Debian Security mirror '
+                           '(default: http://security.debian.org)')
+    parser.add_option('--no-conf',
+                      dest='no_conf', default=False, action='store_true',
+                      help="Don't read config files or environment variables")
+
+    opts, args = parser.parse_args()
+    if len(args) < 2:
+        parser.error('Must specify package and version')
+    elif len(args) > 3:
+        parser.error('Too many arguments')
+    package = args[0]
+    version = args[1]
+    distance = int(args[2]) if len(args) > 2 else 1
+
+    config = UDTConfig(opts.no_conf)
+    if opts.debian_mirror is None:
+        opts.debian_mirror = config.get_value('DEBIAN_MIRROR')
+    if opts.debsec_mirror is None:
+        opts.debsec_mirror = config.get_value('DEBSEC_MIRROR')
+    mirrors = [opts.debsec_mirror, opts.debian_mirror]
+
+    Logger.normal('Downloading %s %s', package, version)
+
+    newpkg = DebianSourcePackage(package, version, mirrors=mirrors)
+    try:
+        newpkg.pull()
+    except DownloadError, e:
+        Logger.error('Failed to download: %s', str(e))
+        sys.exit(1)
+    newpkg.unpack()
+
+    if opts.fetch_only:
+        sys.exit(0)
+
+    oldversion = previous_version(package, version, distance)
+    if not oldversion:
+        Logger.error('No previous version could be found')
+        sys.exit(1)
+    Logger.normal('Downloading %s %s', package, oldversion)
+
+    oldpkg = DebianSourcePackage(package, oldversion, mirrors=mirrors)
+    try:
+        oldpkg.pull()
+    except DownloadError, e:
+        Logger.error('Failed to download: %s', str(e))
+        sys.exit(1)
+    oldpkg.unpack()
+    print 'file://' + oldpkg.debdiff(newpkg, diffstat=True)
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.normal('User abort.')

=== renamed file 'pull-debian-debdiff' => 'pull-debian-debdiff.moved'
=== added file 'pull-debian-source'
--- pull-debian-source	1970-01-01 00:00:00 +0000
+++ pull-debian-source	2012-09-12 18:51:22 +0000
@@ -0,0 +1,143 @@
+#!/usr/bin/python
+#
+# pull-debian-source -- pull a source package from Launchpad
+# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+# Inspired by a tool of the same name by Nathan Handler.
+#
+# 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 json
+import optparse
+import sys
+import urllib2
+
+from devscripts.logger import Logger
+from distro_info import DebianDistroInfo, DistroDataOutdated
+
+from ubuntutools.archive import DebianSourcePackage, DownloadError, rmadison
+from ubuntutools.config import UDTConfig
+
+
+def is_suite(version):
+    """If version could be considered to be a Debian suite, return the
+    canonical suite name. Otherwise None
+    """
+    debian_info = DebianDistroInfo()
+    debian_releases = debian_info.all + ['experimental']
+
+    if '-' in version:
+        release, pocket = version.split('-', 1)
+        release = debian_info.codename(release, default=release)
+        if release in debian_releases:
+            if pocket in ('proposed-updates', 'p-u'):
+                return (release + '-proposed-updates')
+            elif pocket == 'security':
+                return (release + '-security')
+    else:
+        release = debian_info.codename(version, default=version)
+        if release in debian_releases:
+            return release
+    return None
+
+
+def source_package_for(binary, release):
+    """Query DDE to find the source package for a particular binary"""
+    try:
+        release = DebianDistroInfo().codename(release, default=release)
+    except DistroDataOutdated, e:
+        Logger.warn(e)
+    url = ('http://dde.debian.net/dde/q/udd/dist/d:debian/r:%s/p:%s/?t=json'
+           % (release, binary))
+    try:
+        data = json.load(urllib2.urlopen(url))['r']
+    except urllib2.URLError, e:
+        Logger.error('Unable to retrieve package information from DDE: '
+                     '%s (%s)', url, str(e))
+        return None
+    except ValueError, e:
+        Logger.error('Unable to parse JSON response from DDE: '
+                     '%s (%s)', url, str(e))
+        return None
+    if not data:
+        return None
+    return data[0]['source']
+
+
+def main():
+    usage = 'Usage: %prog <package> [release|version]'
+    parser = optparse.OptionParser(usage)
+    parser.add_option('-d', '--download-only',
+                      dest='download_only', default=False, action='store_true',
+                      help='Do not extract the source package')
+    parser.add_option('-m', '--mirror', metavar='DEBIAN_MIRROR',
+                      dest='debian_mirror',
+                      help='Preferred Debian mirror (default: %s)'
+                           % UDTConfig.defaults['DEBIAN_MIRROR'])
+    parser.add_option('-s', '--security-mirror', metavar='DEBSEC_MIRROR',
+                      dest='debsec_mirror',
+                      help='Preferred Debian Security mirror (default: %s)'
+                           % UDTConfig.defaults['DEBSEC_MIRROR'])
+    parser.add_option('--no-conf',
+                      dest='no_conf', default=False, action='store_true',
+                      help="Don't read config files or environment variables")
+    (options, args) = parser.parse_args()
+    if not args:
+        parser.error('Must specify package name')
+    elif len(args) > 2:
+        parser.error('Too many arguments. '
+                     'Must only specify package and (optionally) release.')
+
+    config = UDTConfig(options.no_conf)
+    if options.debian_mirror is None:
+        options.debian_mirror = config.get_value('DEBIAN_MIRROR')
+    if options.debsec_mirror is None:
+        options.debsec_mirror = config.get_value('DEBSEC_MIRROR')
+
+    package = args[0].lower()
+
+    version = args[1] if len(args) > 1 else 'unstable'
+    component = None
+
+    suite = is_suite(version)
+    if suite is not None:
+        line = list(rmadison('debian', package, suite, 'source'))
+        if not line:
+            source_package = source_package_for(package, suite)
+            if source_package != None and package != source_package:
+                package = source_package
+                line = list(rmadison('debian', package, suite, 'source'))
+            if not line:
+                Logger.error('Unable to find %s in Debian suite "%s".', package,
+                             suite)
+                sys.exit(1)
+        line = line[-1]
+        version = line['version']
+        component = line['component']
+
+    Logger.normal('Downloading %s version %s', package, version)
+    srcpkg = DebianSourcePackage(package, version, component=component,
+                                 mirrors=[options.debian_mirror,
+                                          options.debsec_mirror])
+    try:
+        srcpkg.pull()
+    except DownloadError, e:
+        Logger.error('Failed to download: %s', str(e))
+        sys.exit(1)
+    if not options.download_only:
+        srcpkg.unpack()
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.normal('User abort.')

=== renamed file 'pull-debian-source' => 'pull-debian-source.moved'
=== added file 'pull-lp-source'
--- pull-lp-source	1970-01-01 00:00:00 +0000
+++ pull-lp-source	2012-09-12 18:51:22 +0000
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+#
+# pull-lp-source -- pull a source package from Launchpad
+# Basic usage: pull-lp-source <source package> [<release>]
+#
+# Copyright (C) 2008,      Iain Lane <iain@orangesquash.org.uk>,
+#               2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+
+
+import json
+import os
+import sys
+import urllib2
+from optparse import OptionParser
+
+from devscripts.logger import Logger
+from distro_info import UbuntuDistroInfo, DistroDataOutdated
+
+from ubuntutools.archive import UbuntuSourcePackage, DownloadError
+from ubuntutools.config import UDTConfig
+from ubuntutools.lp.lpapicache import Distribution, Launchpad
+from ubuntutools.lp.udtexceptions import (SeriesNotFoundException,
+                                          PackageNotFoundException,
+                                          PocketDoesNotExistError)
+from ubuntutools.misc import split_release_pocket
+
+
+def source_package_for(binary, release):
+    """Query DDE to find the source package for a particular binary
+    Should really do this with LP, but it's not possible LP: #597041
+    """
+    url = ('http://dde.debian.net/dde/q/udd/dist/d:ubuntu/r:%s/p:%s/?t=json'
+           % (release, binary))
+    try:
+        data = json.load(urllib2.urlopen(url))['r']
+    except urllib2.URLError, e:
+        Logger.error('Unable to retrieve package information from DDE: '
+                     '%s (%s)', url, str(e))
+        return None
+    if not data:
+        return None
+    return data[0]['source']
+
+
+def main():
+    usage = "Usage: %prog <package> [release|version]"
+    opt_parser = OptionParser(usage)
+    opt_parser.add_option('-d', '--download-only',
+                          dest='download_only', default=False,
+                          action='store_true',
+                          help="Do not extract the source package")
+    opt_parser.add_option('-m', '--mirror', metavar='UBUNTU_MIRROR',
+                          dest='ubuntu_mirror',
+                          help='Preferred Ubuntu mirror (default: Launchpad)')
+    opt_parser.add_option('--no-conf',
+                          dest='no_conf', default=False, action='store_true',
+                          help="Don't read config files or environment "
+                               "variables")
+    (options, args) = opt_parser.parse_args()
+    if not args:
+        opt_parser.error("Must specify package name")
+
+    config = UDTConfig(options.no_conf)
+    if options.ubuntu_mirror is None:
+        options.ubuntu_mirror = config.get_value('UBUNTU_MIRROR')
+
+    # Login anonymously to LP
+    Launchpad.login_anonymously()
+
+    package = str(args[0]).lower()
+
+    ubuntu_info = UbuntuDistroInfo()
+    if len(args) > 1:  # Custom distribution specified.
+        version = str(args[1])
+    else:
+        try:
+            version = os.getenv('DIST') or ubuntu_info.devel()
+        except DistroDataOutdated, e:
+            Logger.warn("%s\nOr specify a distribution.", e)
+            sys.exit(1)
+    component = None
+
+    # Release, not package version number:
+    release = None
+    pocket = None
+    try:
+        (release, pocket) = split_release_pocket(version, default=None)
+    except PocketDoesNotExistError, e:
+        pass
+    if release in ubuntu_info.all:
+        archive = Distribution('ubuntu').getArchive()
+        try:
+            spph = archive.getSourcePackage(package, release, pocket)
+        except SeriesNotFoundException, e:
+            Logger.error(str(e))
+            sys.exit(1)
+        except PackageNotFoundException, e:
+            source_package = source_package_for(package, release)
+            if source_package is not None and source_package != package:
+                try:
+                    spph = archive.getSourcePackage(source_package, release,
+                                                    pocket)
+                    package = source_package
+                except PackageNotFoundException:
+                    Logger.error(str(e))
+                    sys.exit(1)
+            else:
+                Logger.error(str(e))
+                sys.exit(1)
+
+        version = spph.getVersion()
+        component = spph.getComponent()
+
+    Logger.normal('Downloading %s version %s', package, version)
+    srcpkg = UbuntuSourcePackage(package, version, component=component,
+                                 mirrors=[options.ubuntu_mirror])
+    try:
+        srcpkg.pull()
+    except DownloadError, e:
+        Logger.error('Failed to download: %s', str(e))
+        sys.exit(1)
+    if not options.download_only:
+        srcpkg.unpack()
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.normal('User abort.')

=== renamed file 'pull-lp-source' => 'pull-lp-source.moved'
=== added file 'pull-revu-source'
--- pull-revu-source	1970-01-01 00:00:00 +0000
+++ pull-revu-source	2012-09-12 18:51:22 +0000
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+# Script Name: pull-revu-source
+# Author: Nathan Handler <nhandler@ubuntu.com>
+# Usage: pull-revu-source <source package>
+# Copyright (C) 2009 Nathan Handler <nhandler@ubuntu.com>
+# Based on revupull in kubuntu-dev-tools,
+# written by Harald Sitter <apachelogger@ubuntu.com>
+# License: GNU General Public License
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# On Debian GNU/Linux systems, the complete text of the GNU General
+# Public License can be found in the /usr/share/common-licenses/GPL-3 file.
+
+use warnings;
+use strict;
+use File::Basename;
+use Getopt::Long;
+
+my $REVU = "revu.ubuntuwire.com";
+
+my($package) = lc($ARGV[0]) || usage(2);
+my($help)=0;
+GetOptions('help' => \$help);
+usage(0) if($help);
+
+eval { require LWP::Simple; };
+if ($@=~ m#^Can\'t locate LWP/Simple#) {
+	print(STDERR "Please install libwww-perl.\n");
+	exit(1);
+}
+use LWP::Simple;
+
+dget(getURL());
+
+sub getURL {
+	my($url) = "http://" . $REVU . "/dsc.py?url&package=" . $package;
+	my($page)=get($url);
+	die("Could Not Get $url") unless (defined $page);
+	return $page;
+}
+
+sub dget {
+	my($dsc) = @_;
+	exec("dget -xu $dsc");
+}
+
+sub usage {
+	my($exit) = @_;
+	my($name)=basename($0);
+	print("USAGE: $name [-h] <source package>\n");
+	exit($exit);
+}

=== renamed file 'pull-revu-source' => 'pull-revu-source.moved'
=== added file 'requestbackport'
--- requestbackport	1970-01-01 00:00:00 +0000
+++ requestbackport	2012-09-12 18:51:22 +0000
@@ -0,0 +1,294 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+#
+# 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.
+
+from collections import defaultdict
+import optparse
+import re
+import sys
+
+import apt
+from devscripts.logger import Logger
+from distro_info import UbuntuDistroInfo
+
+from ubuntutools.lp.lpapicache import Launchpad, Distribution
+from ubuntutools.lp.udtexceptions import PackageNotFoundException
+from ubuntutools.config import UDTConfig
+from ubuntutools.rdepends import query_rdepends, RDependsException
+from ubuntutools.question import (YesNoQuestion, EditBugReport,
+                                  confirmation_prompt)
+
+
+class DestinationException(Exception):
+    pass
+
+
+def determine_destinations(source, destination):
+    ubuntu_info = UbuntuDistroInfo()
+    if destination is None:
+        destination = ubuntu_info.stable()
+
+    if source not in ubuntu_info.all:
+        raise DestinationException("Source release %s does not exist" % source)
+    if destination not in ubuntu_info.all:
+        raise DestinationException("Destination release %s does not exist"
+                                   % destination)
+    if destination not in ubuntu_info.supported():
+        raise DestinationException("Destination release %s is not supported"
+                                   % destination)
+
+    found = False
+    destinations = []
+    support_gap = False
+    for release in ubuntu_info.all:
+        if release == destination:
+            found = True
+        if release == source:
+            break
+        if found:
+            if support_gap:
+                if ubuntu_info.is_lts(release):
+                    support_gap = False
+                else:
+                    continue
+            if release not in ubuntu_info.supported():
+                support_gap = True
+                continue
+            destinations.append(release)
+
+    assert found
+    assert len(destinations) > 0
+
+    return destinations
+
+
+def check_existing(package, destinations):
+    """Search for possible existing bug reports"""
+    # The LP bug search is indexed, not substring:
+    query = re.findall(r'[a-z]+', package)
+    bugs = []
+    for release in destinations:
+        project = Launchpad.projects[release + '-backports']
+        bugs += project.searchTasks(omit_duplicates=True,
+                                    search_text=query,
+                                    status=["Incomplete", "New", "Confirmed",
+                                            "Triaged", "In Progress",
+                                            "Fix Committed"])
+    if not bugs:
+        return
+
+    Logger.normal("There are existing bug reports that look similar to your "
+                  "request. Please check before continuing:")
+
+    for bug in sorted(set(bug_task.bug for bug_task in bugs)):
+        Logger.normal(" * LP: #%-7i: %s  %s", bug.id, bug.title, bug.web_link)
+
+    confirmation_prompt()
+
+
+def find_rdepends(releases, published_binaries):
+    intermediate = defaultdict(lambda: defaultdict(list))
+
+    # We want to display every pubilshed binary, even if it has no rdepends
+    for binpkg in published_binaries:
+        intermediate[binpkg]
+
+    for arch in ('any', 'source'):
+        for release in releases:
+            for binpkg in published_binaries:
+                try:
+                    raw_rdeps = query_rdepends(binpkg, release, arch)
+                except RDependsException:
+                    # Not published? TODO: Check
+                    continue
+                for relationship, rdeps in raw_rdeps.iteritems():
+                    for rdep in rdeps:
+                        if rdep['Package'] in published_binaries:
+                            continue
+                        intermediate[binpkg][rdep['Package']] \
+                                .append((release, relationship))
+
+    output = []
+    for binpkg, rdeps in intermediate.iteritems():
+        output += ['', binpkg, '-' * len(binpkg)]
+        for pkg, appearences in rdeps.iteritems():
+            output += ['* %s' % pkg]
+            for release, relationship in appearences:
+                output += ['  [ ] %s (%s)' % (release, relationship)]
+
+    found_any = sum(len(rdeps) for rdeps in intermediate.itervalues())
+    if found_any:
+        output = [
+            "Reverse dependencies:",
+            "=====================",
+            "The following reverse-dependencies need to be tested against the "
+            "new version of %(package)s. "
+            "For reverse-build-dependencies (-Indep), please test that the "
+            "package still builds against the new %(package)s. "
+            "For reverse-dependencies, please test that the version of the "
+            "package currently in the release still works with the new "
+            "%(package)s installed. "
+            "Reverse- Recommends, Suggests, and Enhances don't need to be "
+            "tested, and are listed for completeness-sake."
+           ] + output
+    else:
+        output = ["No reverse dependencies"]
+
+    return output
+
+
+def locate_package(package, distribution):
+    archive = Distribution('ubuntu').getArchive()
+    for pass_ in ('source', 'binary'):
+        try:
+            package_spph = archive.getSourcePackage(package, distribution)
+            return package_spph
+        except PackageNotFoundException, e:
+            if pass_ == 'binary':
+                Logger.error(str(e))
+                sys.exit(1)
+
+        try:
+            apt_pkg = apt.Cache()[package]
+        except KeyError:
+            continue
+        package = apt_pkg.candidate.source_name
+        Logger.normal("Binary package specified, considering its source "
+                      "package instead: %s", package)
+
+
+def request_backport(package_spph, source, destinations):
+
+    published_binaries = set()
+    for bpph in package_spph.getBinaries():
+        published_binaries.add(bpph.getPackageName())
+
+    if not published_binaries:
+        Logger.error("%s (%s) has no published binaries in %s. ",
+                     package_spph.getPackageName(), package_spph.getVersion(),
+                     source)
+        Logger.normal("Is it stuck in bin-NEW? It can't be backported until "
+                      "the binaries have been accepted.")
+        sys.exit(1)
+
+    testing = []
+    testing += ["You can test-build the backport in your PPA with "
+                "backportpackage:"]
+    testing += ["$ backportpackage -u ppa:<lp username>/<ppa name> "
+                "-s %s -d %s %s"
+                % (source, dest, package_spph.getPackageName())
+                for dest in destinations]
+    testing += [""]
+    for dest in destinations:
+        testing += ['* %s:' % dest]
+        testing += ["[ ] Package builds without modification"]
+        testing += ["[ ] %s installs cleanly and runs" % binary
+                    for binary in published_binaries]
+
+    subst = {
+        'package': package_spph.getPackageName(),
+        'version': package_spph.getVersion(),
+        'component': package_spph.getComponent(),
+        'source': package_spph.getSeriesAndPocket(),
+        'destinations': ', '.join(destinations),
+    }
+    subject = ("Please backport %(package)s %(version)s (%(component)s) "
+               "from %(source)s" % subst)
+    body = ('\n'.join(
+            [
+             "Please backport %(package)s %(version)s (%(component)s) "
+             "from %(source)s to %(destinations)s.",
+             "",
+             "Reason for the backport:",
+             "========================",
+             ">>> Enter your reasoning here <<<",
+             "",
+             "Testing:",
+             "========",
+             "Mark off items in the checklist [X] as you test them, "
+             "but please leave the checklist so that backporters can quickly "
+             "evaluate the state of testing.",
+             ""
+            ]
+            + testing
+            + [""]
+            + find_rdepends(destinations, published_binaries)
+            + [""]
+        ) % subst)
+
+    editor = EditBugReport(subject, body)
+    editor.edit()
+    subject, body = editor.get_report()
+
+    Logger.normal('The final report is:\nSummary: %s\nDescription:\n%s\n',
+                  subject, body)
+    if YesNoQuestion().ask("Request this backport", "yes") == "no":
+        sys.exit(1)
+
+    targets = [Launchpad.projects['%s-backports' % destination]
+               for destination in destinations]
+    bug = Launchpad.bugs.createBug(title=subject, description=body,
+                                   target=targets[0])
+    for target in targets[1:]:
+        bug.addTask(target=target)
+
+    Logger.normal("Backport request filed as %s", bug.web_link)
+
+
+def main():
+    parser = optparse.OptionParser('%prog [options] package')
+    parser.add_option('-d', '--destination', metavar='DEST',
+                      help='Backport to DEST release and necessary '
+                           'intermediate releases '
+                           '(default: current stable release)')
+    parser.add_option('-s', '--source', metavar='SOURCE',
+                      help='Backport from SOURCE release '
+                           '(default: current devel release)')
+    parser.add_option('-l', '--lpinstance', metavar='INSTANCE', default=None,
+                      help='Launchpad instance to connect to '
+                           '(default: production).')
+    parser.add_option('--no-conf', action='store_true',
+                      dest='no_conf', default=False,
+                      help="Don't read config files or environment variables")
+    options, args = parser.parse_args()
+
+    if len(args) != 1:
+        parser.error("One (and only one) package must be specified")
+    package = args[0]
+
+    config = UDTConfig(options.no_conf)
+
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value('LPINSTANCE')
+    Launchpad.login(options.lpinstance)
+
+    if options.source is None:
+        options.source = Distribution('ubuntu').getDevelopmentSeries().name
+
+    try:
+        destinations = determine_destinations(options.source,
+                                              options.destination)
+    except DestinationException, e:
+        Logger.error(str(e))
+        sys.exit(1)
+
+    check_existing(package, destinations)
+
+    package_spph = locate_package(package, options.source)
+    request_backport(package_spph, options.source, destinations)
+
+
+if __name__ == '__main__':
+    main()

=== renamed file 'requestbackport' => 'requestbackport.moved'
=== added file 'requestsync'
--- requestsync	1970-01-01 00:00:00 +0000
+++ requestsync	2012-09-12 18:51:22 +0000
@@ -0,0 +1,369 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# (C) 2007 Canonical Ltd., Steve Kowalik
+# Authors:
+#  Martin Pitt <martin.pitt@ubuntu.com>
+#  Steve Kowalik <stevenk@ubuntu.com>
+#  Michael Bienia <geser@ubuntu.com>
+#  Daniel Hahler <ubuntu@thequod.de>
+#  Iain Lane <laney@ubuntu.com>
+#  Jonathan Davies <jpds@ubuntu.com>
+#  Markus Korn <thekorn@gmx.de> (python-launchpadlib support)
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-2 for more details.
+#
+# ##################################################################
+
+import optparse
+import os
+import sys
+
+from debian.changelog import Version
+from distro_info import UbuntuDistroInfo, DistroDataOutdated
+
+from ubuntutools.config import UDTConfig, ubu_email
+from ubuntutools.lp import udtexceptions
+from ubuntutools.misc import require_utf8
+from ubuntutools.question import confirmation_prompt, EditBugReport
+
+#
+# entry point
+#
+
+def main():
+    ubu_info = UbuntuDistroInfo()
+    DEFAULT_SOURCE = 'unstable'
+    try:
+        if ubu_info.is_lts(ubu_info.devel()):
+            DEFAULT_SOURCE = 'testing'
+    except DistroDataOutdated, e:
+        print >> sys.stderr, str(e)
+
+    # Our usage options.
+    usage = ('Usage: %prog [options] '
+             '<source package> [<target release> [base version]]')
+    parser = optparse.OptionParser(usage)
+
+    parser.add_option('-d', type='string',
+                      dest='dist', default=DEFAULT_SOURCE,
+                      help='Debian distribution to sync from.')
+    parser.add_option('-k', type='string',
+                      dest='keyid', default=None,
+                      help='GnuPG key ID to use for signing report '
+                           '(only used when emailing the sync request).')
+    parser.add_option('-n', action='store_true',
+                      dest='newpkg', default=False,
+                      help='Whether package to sync is a new package in '
+                           'Ubuntu.')
+    parser.add_option('--email', action='store_true', default=False,
+                      help='Use a PGP-signed email for filing the sync '
+                           'request, rather than the LP API.')
+    parser.add_option('--lp', dest='deprecated_lp_flag',
+                      action='store_true', default=False,
+                      help=optparse.SUPPRESS_HELP)
+    parser.add_option('-l', '--lpinstance', metavar='INSTANCE',
+                      dest='lpinstance', default=None,
+                      help='Launchpad instance to connect to '
+                           '(default: production).')
+    parser.add_option('-s', action='store_true',
+                      dest='sponsorship', default=False,
+                      help='Force sponsorship')
+    parser.add_option('-C', action='store_true',
+                      dest='missing_changelog_ok', default=False,
+                      help='Allow changelog to be manually filled in '
+                           'when missing')
+    parser.add_option('-e', action='store_true',
+                      dest='ffe', default=False,
+                      help='Use this after FeatureFreeze for non-bug fix '
+                           'syncs, changes default subscription to the '
+                           'appropriate release team.')
+    parser.add_option('--no-conf', action='store_true',
+                      dest='no_conf', default=False,
+                      help="Don't read config files or environment variables")
+
+    (options, args) = parser.parse_args()
+
+    if not len(args):
+        parser.print_help()
+        sys.exit(1)
+
+    require_utf8()
+
+    config = UDTConfig(options.no_conf)
+
+    if options.deprecated_lp_flag:
+        print "The --lp flag is now default, ignored."
+    if options.email:
+        options.lpapi = False
+    else:
+        options.lpapi = config.get_value('USE_LPAPI', default=True,
+                                         boolean=True)
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value('LPINSTANCE')
+
+    if options.keyid is None:
+        options.keyid = config.get_value('KEYID')
+
+    if not options.lpapi:
+        if options.lpinstance == 'production':
+            bug_mail_domain = 'bugs.launchpad.net'
+        elif options.lpinstance == 'staging':
+            bug_mail_domain = 'bugs.staging.launchpad.net'
+        else:
+            print >> sys.stderr, ('Error: Unknown launchpad instance: %s'
+                                  % options.lpinstance)
+            sys.exit(1)
+
+    mailserver_host = config.get_value('SMTP_SERVER',
+                                       default=None,
+                                       compat_keys=['UBUSMTP', 'DEBSMTP'])
+    if not options.lpapi and not mailserver_host:
+        try:
+            import DNS
+            DNS.DiscoverNameServers()
+            mxlist = DNS.mxlookup(bug_mail_domain)
+            firstmx = mxlist[0]
+            mailserver_host = firstmx[1]
+        except ImportError:
+            print >> sys.stderr, ('Please install python-dns to support '
+                                  'Launchpad mail server lookup.')
+            sys.exit(1)
+
+    mailserver_port = config.get_value('SMTP_PORT', default=25,
+                                       compat_keys=['UBUSMTP_PORT',
+                                                    'DEBSMTP_PORT'])
+    mailserver_user = config.get_value('SMTP_USER',
+                                       compat_keys=['UBUSMTP_USER',
+                                                    'DEBSMTP_USER'])
+    mailserver_pass = config.get_value('SMTP_PASS',
+                                       compat_keys=['UBUSMTP_PASS',
+                                                    'DEBSMTP_PASS'])
+
+    # import the needed requestsync module
+    if options.lpapi:
+        from ubuntutools.requestsync.lp import (check_existing_reports,
+                                                get_debian_srcpkg,
+                                                get_ubuntu_srcpkg,
+                                                get_ubuntu_delta_changelog,
+                                                need_sponsorship, post_bug)
+        from ubuntutools.lp.lpapicache import Distribution, Launchpad
+        # See if we have LP credentials and exit if we don't -
+        # cannot continue in this case
+
+        try:
+            # devel for changelogUrl()
+            Launchpad.login(service=options.lpinstance, api_version='devel')
+        except IOError:
+            sys.exit(1)
+    else:
+        from ubuntutools.requestsync.mail import (check_existing_reports,
+                                                  get_debian_srcpkg,
+                                                  get_ubuntu_srcpkg,
+                                                  get_ubuntu_delta_changelog,
+                                                  mail_bug, need_sponsorship)
+        if not any(x in os.environ for x in ('UBUMAIL', 'DEBEMAIL', 'EMAIL')):
+            print >> sys.stderr, (
+                'E: The environment variable UBUMAIL, DEBEMAIL or EMAIL needs '
+                'to be set to let this script mail the sync request.')
+            sys.exit(1)
+
+    newsource = options.newpkg
+    sponsorship = options.sponsorship
+    distro = options.dist
+    ffe = options.ffe
+    lpapi = options.lpapi
+    need_interaction = False
+    force_base_version = None
+    srcpkg = args[0]
+
+    if len(args) == 1:
+        if lpapi:
+            release = Distribution('ubuntu').getDevelopmentSeries().name
+        else:
+            release = ubu_info.devel()
+        print >> sys.stderr, 'W: Target release missing - assuming %s' % release
+    elif len(args) == 2:
+        release = args[1]
+    elif len(args) == 3:
+        release = args[1]
+        force_base_version = Version(args[2])
+    else:
+        print >> sys.stderr, 'E: Too many arguments.'
+        parser.print_help()
+        sys.exit(1)
+
+    # Get the current Ubuntu source package
+    try:
+        ubuntu_srcpkg = get_ubuntu_srcpkg(srcpkg, release)
+        ubuntu_version = Version(ubuntu_srcpkg.getVersion())
+        ubuntu_component = ubuntu_srcpkg.getComponent()
+        newsource = False  # override the -n flag
+    except udtexceptions.PackageNotFoundException:
+        ubuntu_srcpkg = None
+        ubuntu_version = Version('~')
+        ubuntu_component = None  # Set after getting the Debian info
+        if not newsource:
+            print ("'%s' doesn't exist in 'Ubuntu %s'.\n"
+                   "Do you want to sync a new package?"
+                   % (srcpkg, release))
+            confirmation_prompt()
+            newsource = True
+    except udtexceptions.SeriesNotFoundException, error:
+        print >> sys.stderr, "E: %s" % error
+        sys.exit(1)
+
+    # Get the requested Debian source package
+    try:
+        debian_srcpkg = get_debian_srcpkg(srcpkg, distro)
+        debian_version = Version(debian_srcpkg.getVersion())
+        debian_component = debian_srcpkg.getComponent()
+    except udtexceptions.PackageNotFoundException, error:
+        print >> sys.stderr, "E: %s" % error
+        sys.exit(1)
+    except udtexceptions.SeriesNotFoundException, error:
+        print >> sys.stderr, "E: %s" % error
+        sys.exit(1)
+
+    if ubuntu_component is None:
+        if debian_component == 'main':
+            ubuntu_component = 'universe'
+        else:
+            ubuntu_component = 'multiverse'
+
+    # Stop if Ubuntu has already the version from Debian or a newer version
+    if (ubuntu_version >= debian_version) and options.lpapi:
+        # try rmadison
+        import ubuntutools.requestsync.mail
+        try:
+            debian_srcpkg = ubuntutools.requestsync.mail.get_debian_srcpkg(
+                    srcpkg, distro)
+            debian_version = Version(debian_srcpkg.getVersion())
+            debian_component = debian_srcpkg.getComponent()
+        except udtexceptions.PackageNotFoundException, error:
+            print >> sys.stderr, "E: %s" % error
+            sys.exit(1)
+
+    if ubuntu_version == debian_version:
+        print  >> sys.stderr, ('E: The versions in Debian and Ubuntu are the '
+                               'same already (%s). Aborting.'
+                               % ubuntu_version)
+        sys.exit(1)
+    if ubuntu_version > debian_version:
+        print >> sys.stderr, ('E: The version in Ubuntu (%s) is newer than '
+                              'the version in Debian (%s). Aborting.'
+                              % (ubuntu_version, debian_version))
+        sys.exit(1)
+
+    # -s flag not specified - check if we do need sponsorship
+    if not sponsorship:
+        sponsorship = need_sponsorship(srcpkg, ubuntu_component, release)
+
+    if not sponsorship and not ffe:
+        print >> sys.stderr, ('Consider using syncpackage(1) for syncs that '
+                              'do not require feature freeze exceptions.')
+
+    # Check for existing package reports
+    if not newsource:
+        check_existing_reports(srcpkg)
+
+    # Generate bug report
+    pkg_to_sync = ('%s %s (%s) from Debian %s (%s)'
+                   % (srcpkg, debian_version, ubuntu_component,
+                      distro, debian_component))
+    title = "Sync %s" % pkg_to_sync
+    if ffe:
+        title = "FFe: " + title
+    report = "Please sync %s\n\n" % pkg_to_sync
+
+    if 'ubuntu' in str(ubuntu_version):
+        need_interaction = True
+
+        print ('Changes have been made to the package in Ubuntu.\n'
+               'Please edit the report and give an explanation.\n'
+               'Not saving the report file will abort the request.')
+        report += (u'Explanation of the Ubuntu delta and why it can be '
+                   u'dropped:\n%s\n>>> ENTER_EXPLANATION_HERE <<<\n\n'
+                   % get_ubuntu_delta_changelog(ubuntu_srcpkg))
+
+    if ffe:
+        need_interaction = True
+
+        print ('To approve FeatureFreeze exception, you need to state\n'
+               'the reason why you feel it is necessary.\n'
+               'Not saving the report file will abort the request.')
+        report += ('Explanation of FeatureFreeze exception:\n'
+                   '>>> ENTER_EXPLANATION_HERE <<<\n\n')
+
+    if need_interaction:
+        confirmation_prompt()
+
+    base_version = force_base_version or ubuntu_version
+
+    if newsource:
+        report += 'All changelog entries:\n\n'
+    else:
+        report += ('Changelog entries since current %s version %s:\n\n'
+                   % (release, ubuntu_version))
+    changelog = debian_srcpkg.getChangelog(since_version=base_version)
+    if not changelog:
+        if not options.missing_changelog_ok:
+            print >> sys.stderr, ("E: Did not retrieve any changelog entries. "
+                                  "Do you need to specify '-C'? "
+                                  "Was the package recently uploaded? (check "
+                                  "http://packages.debian.org/changelogs/)")
+            sys.exit(1)
+        else:
+            need_interaction = True
+            changelog = "XXX FIXME: add changelog here XXX"
+    report += changelog
+
+    editor = EditBugReport(title, report)
+    editor.edit(optional=not need_interaction)
+    title, report = editor.get_report()
+
+    if 'XXX FIXME' in report:
+        print >> sys.stderr, ("E: changelog boilerplate found in report, "
+                              "please manually add changelog when using '-C'")
+        sys.exit(1)
+
+    # bug status and bug subscriber
+    status = 'confirmed'
+    subscribe = 'ubuntu-archive'
+    if sponsorship:
+        status = 'new'
+        subscribe = 'ubuntu-sponsors'
+    if ffe:
+        status = 'new'
+        subscribe = 'ubuntu-release'
+
+    srcpkg = not newsource and srcpkg or None
+    if lpapi:
+        # Map status to the values expected by LP API
+        mapping = {'new': 'New', 'confirmed': 'Confirmed'}
+        # Post sync request using LP API
+        post_bug(srcpkg, subscribe, mapping[status], title, report)
+    else:
+        email_from = ubu_email(export=False)[1]
+        # Mail sync request
+        mail_bug(srcpkg, subscribe, status, title, report, bug_mail_domain,
+                 options.keyid, email_from, mailserver_host, mailserver_port,
+                 mailserver_user, mailserver_pass)
+
+if __name__ == '__main__':
+    try:
+        main()
+    except KeyboardInterrupt:
+        print "\nUser abort."
+        sys.exit(2)

=== renamed file 'requestsync' => 'requestsync.moved'
=== added file 'reverse-build-depends'
--- reverse-build-depends	1970-01-01 00:00:00 +0000
+++ reverse-build-depends	2012-09-12 18:51:22 +0000
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+cat >&2 <<EOF
+reverse-build-depends has been replaced by reverse-depends -b
+This script now wraps reverse-depends.
+Please use it in the future.
+
+EOF
+
+exec $(dirname $0)/reverse-depends -b "$@"

=== renamed file 'reverse-build-depends' => 'reverse-build-depends.moved'
=== added file 'reverse-depends'
--- reverse-depends	1970-01-01 00:00:00 +0000
+++ reverse-depends	2012-09-12 18:51:22 +0000
@@ -0,0 +1,170 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+#
+# 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 sys
+
+from devscripts.logger import Logger
+from distro_info import DistroDataOutdated
+
+from ubuntutools.misc import (system_distribution, vendor_to_distroinfo,
+                              codename_to_distribution)
+from ubuntutools.rdepends import query_rdepends, RDependsException
+
+
+def main():
+    system_distro_info = vendor_to_distroinfo(system_distribution())()
+    try:
+        default_release = system_distro_info.devel()
+    except DistroDataOutdated, e:
+        Logger.warn(e)
+        default_release = 'unstable'
+
+    parser = optparse.OptionParser('%prog [options] package',
+        description="List reverse-dependencies of package. "
+                    "If the package name is prefixed with src: then the "
+                    "reverse-dependencies of all the binary packages that "
+                    "the specified source package builds will be listed.")
+    parser.add_option('-r', '--release', metavar='RELEASE',
+                      default=default_release,
+                      help='Query dependencies in RELEASE. '
+                      'Default: %s' % default_release)
+    parser.add_option('-R', '--without-recommends',
+                      action='store_false', dest='recommends', default=True,
+                      help='Only consider Depends relationships, '
+                           'not Recommends')
+    parser.add_option('-s', '--with-suggests',
+                      action='store_true', dest='suggests', default=False,
+                      help='Also consider Suggests relationships')
+    parser.add_option('-b', '--build-depends',
+                      action='store_const', dest='arch', const='source',
+                      help='Query build dependencies (synonym for '
+                            '--arch=source)')
+    parser.add_option('-a', '--arch', metavar='ARCH', default='any',
+                      help='Query dependencies in ARCH. '
+                           'Default: any')
+    parser.add_option('-c', '--component', metavar='COMPONENT',
+                      action='append',
+                      help='Only consider reverse-dependencies in COMPONENT. '
+                           'Can be specified multiple times. Default: all')
+    parser.add_option('-l', '--list',
+                      action='store_true', default=False,
+                      help='Display a simple, machine-readable list')
+    parser.add_option('-u', '--service-url', metavar='URL',
+                      dest='server', default=None,
+                      help='Reverse Dependencies webservice URL. '
+                           'Default: UbuntuWire')
+
+    options, args = parser.parse_args()
+
+    if len(args) != 1:
+        parser.error("One (and only one) package must be specified")
+    package = args[0]
+
+    opts = {}
+    if options.server is not None:
+        opts['server'] = options.server
+
+    # Convert unstable/testing aliases to codenames:
+    distribution = codename_to_distribution(options.release)
+    if not distribution:
+        parser.error('Unknown release codename %s' % options.release)
+    distro_info = vendor_to_distroinfo(distribution)()
+    try:
+        options.release = distro_info.codename(options.release,
+                                               default=options.release)
+    except DistroDataOutdated:
+        # We already printed a warning
+        pass
+
+    try:
+        data = query_rdepends(package, options.release, options.arch, **opts)
+    except RDependsException, e:
+        Logger.error(str(e))
+        sys.exit(1)
+
+    if options.arch == 'source':
+        fields = ['Reverse-Build-Depends', 'Reverse-Build-Depends-Indep']
+    else:
+        fields = ['Reverse-Depends']
+        if options.recommends:
+            fields.append('Reverse-Recommends')
+        if options.suggests:
+            fields.append('Reverse-Suggests')
+
+    for field in data.keys():
+        if field not in fields:
+            del data[field]
+
+    if options.component:
+        for field, rdeps in data.items():
+            filtered = [rdep for rdep in rdeps
+                        if rdep['Component'] in options.component]
+            if not filtered:
+                del data[field]
+            else:
+                data[field] = filtered
+
+    if options.list:
+        display_consise(data)
+    else:
+        display_verbose(data)
+
+
+def display_verbose(data):
+    if not data:
+        print "No reverse dependencies found"
+        return
+
+    all_archs = set()
+    # This isn't accurate, but we make up for it by displaying what we found
+    for rdeps in data.itervalues():
+        for rdep in rdeps:
+            if 'Architectures' in rdep:
+                all_archs.update(rdep['Architectures'])
+
+    for field, rdeps in data.iteritems():
+        print field
+        print '=' * len(field)
+        rdeps.sort(key=lambda x: x['Package'])
+        for rdep in rdeps:
+            line = '* %s' % rdep['Package']
+            if all_archs and set(rdep['Architectures']) != all_archs:
+                line += ' [%s]' % ' '.join(sorted(rdep['Architectures']))
+            if 'Dependency' in rdep:
+                if len(line) < 30:
+                    line += ' ' * (30 - len(line))
+                line += '  (for %s)' % rdep['Dependency']
+            print line
+        print
+
+    if all_archs:
+        print ("Packages without architectures listed are "
+               "reverse-dependencies in: %s"
+               % ', '.join(sorted(list(all_archs))))
+
+
+def display_consise(data):
+    result = set()
+    for rdeps in data.itervalues():
+        for rdep in rdeps:
+            result.add(rdep['Package'])
+
+    print u'\n'.join(sorted(list(result)))
+
+
+if __name__ == '__main__':
+    main()

=== renamed file 'reverse-depends' => 'reverse-depends.moved'
=== added file 'seeded-in-ubuntu'
--- seeded-in-ubuntu	1970-01-01 00:00:00 +0000
+++ seeded-in-ubuntu	2012-09-12 18:51:22 +0000
@@ -0,0 +1,139 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
+#
+# 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 collections
+import gzip
+import json
+import optparse
+import os
+import time
+import urllib
+
+from devscripts.logger import Logger
+
+from ubuntutools.lp.lpapicache import (Distribution, Launchpad,
+                                       PackageNotFoundException)
+
+DATA_URL = 'http://qa.ubuntuwire.org/ubuntu-seeded-packages/seeded.json.gz'
+
+
+def load_index(url):
+    '''Download a new copy of the image contents index, if necessary,
+    and read it.
+    '''
+    cachedir = os.path.expanduser('~/.cache/ubuntu-dev-tools')
+    fn = os.path.join(cachedir, 'seeded.json.gz')
+
+    if (not os.path.isfile(fn)
+            or time.time() - os.path.getmtime(fn) > 60 * 60 * 2):
+        if not os.path.isdir(cachedir):
+            os.makedirs(cachedir)
+        urllib.urlretrieve(url, fn)
+
+    try:
+        with gzip.open(fn, 'r') as f:
+            return json.load(f)
+    except Exception, e:
+        Logger.error("Unable to parse seed data: %s. "
+                     "Deleting cached data, please try again.",
+                     str(e))
+        os.unlink(fn)
+
+
+def resolve_binaries(sources):
+    '''Return a dict of source:binaries for all binary packages built by
+    sources
+    '''
+    archive = Distribution('ubuntu').getArchive()
+    binaries = {}
+    for source in sources:
+        try:
+            spph = archive.getSourcePackage(source)
+        except PackageNotFoundException, e:
+            Logger.error(str(e))
+            continue
+        binaries[source] = sorted(set(bpph.getPackageName()
+                                      for bpph in spph.getBinaries()))
+
+    return binaries
+
+
+def present_on(appearences):
+    '''Format a list of (flavor, type) tuples into a human-readable string'''
+    present = collections.defaultdict(set)
+    for flavor, type_ in appearences:
+        present[flavor].add(type_)
+    for flavor, types in present.iteritems():
+        if len(types) > 1:
+            types.discard('supported')
+    output = ['  %s: %s' % (flavor, ', '.join(sorted(types)))
+              for flavor, types in present.iteritems()]
+    output.sort()
+    return '\n'.join(output)
+
+
+def output_binaries(index, binaries):
+    '''Print binaries found in index'''
+    for binary in binaries:
+        if binary in index:
+            print "%s is seeded in:" % binary
+            print present_on(index[binary])
+        else:
+            print "%s is not seeded." % binary
+
+
+def output_by_source(index, by_source):
+    '''Print binaries found in index. Grouped by source'''
+    for source, binaries in by_source.iteritems():
+        seen = False
+        for binary in binaries:
+            if binary in index:
+                seen = True
+                print "%s (from %s) is seeded in:" % (binary, source)
+                print present_on(index[binary])
+        if not seen:
+            print "%s's binaries are not seeded." % source
+
+
+def main():
+    '''Query which images the specified packages are on'''
+    parser = optparse.OptionParser('%prog [options] package...')
+    parser.add_option('-b', '--binary',
+                      default=False, action='store_true',
+                      help="Binary packages are being specified, "
+                           "not source packages (fast)")
+    parser.add_option('-u', '--data-url', metavar='URL',
+                      default=DATA_URL,
+                      help='URL for the seeded packages index. '
+                           'Default: UbuntuWire')
+    options, args = parser.parse_args()
+
+    if len(args) < 1:
+        parser.error("At least one package must be specified")
+
+    # Login anonymously to LP
+    Launchpad.login_anonymously()
+
+    index = load_index(options.data_url)
+    if options.binary:
+        output_binaries(index, args)
+    else:
+        binaries = resolve_binaries(args)
+        output_by_source(index, binaries)
+
+
+if __name__ == '__main__':
+    main()

=== renamed file 'seeded-in-ubuntu' => 'seeded-in-ubuntu.moved'
=== added file 'setup-packaging-environment'
--- setup-packaging-environment	1970-01-01 00:00:00 +0000
+++ setup-packaging-environment	2012-09-12 18:51:22 +0000
@@ -0,0 +1,211 @@
+#! /bin/sh
+#
+# Copyright (C) 2009 Siegfried-A. Gevatter <rainct@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 3 or later.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+#
+# This assistants's aim is to make it more straightforward for new
+# contributors to get their Ubuntu installation ready for packaging work.
+
+separator1() {
+    echo '------------------------------------------------------'
+    echo
+}
+
+separator2() {
+    echo '======================================================'
+    echo
+}
+
+await_response() {
+    echo
+    echo -n "Press enter when you're ready to continue... "
+    read line # Wait for a key press
+    echo
+}
+
+usage() {
+    prog=$(basename $0)
+    cat <<EOF
+Usage: $prog [options]
+
+Configure your machine for packaging work
+
+Options:
+  -h, --help  show this help message and exit
+EOF
+   exit $1
+}
+
+while [ $# -gt 0 ]; do
+    case "$1" in
+        -h|--help)
+            usage 0
+            ;;
+        *)
+            usage 1
+            ;;
+    esac
+    shift
+done
+
+# ##################################################################
+
+if [ "$(lsb_release -is)" != "Ubuntu" ]
+then
+    echo "Error: This script has been created for Ubuntu, but you are "
+    echo "running «$(lsb_release -is)». Aborting."
+    exit 1
+fi
+
+echo "Welcome to the Ubuntu Packaging Environment setup!"
+separator1
+echo "This assistant will help you setting up your computer with everything"
+echo "necessary for getting started with Ubuntu development."
+await_response
+separator2
+
+echo "Enabling the main, restricted, universe and multiverse components..."
+separator1
+echo "Further steps will require packages from the «main» and «universe»"
+echo "components. It's advisable for «restricted» and «multiverse» to also"
+echo "be enabled, so that your apt cache knows about all official Ubuntu"
+echo "packages."
+echo
+echo "This is the list of repositories enabled on your system:"
+cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list | \
+grep '^[ ]*deb[ ]' | while read line
+do
+    echo " - $line"
+done
+echo
+echo "Please check that the list above contains all four components from"
+echo "Ubuntu's official repositories, and enable any missing component"
+echo "(you can do this using Software Sources). Do this now."
+await_response
+separator2
+
+echo "Installing recommended packages..."
+separator1
+echo "In order to do packaging work, you'll need a minimal set of packages."
+echo "Those, together with other packages which, though optional, have proven"
+echo "to be useful, will now be installed."
+echo
+sudo apt-get install ubuntu-dev-tools devscripts debhelper cdbs patchutils pbuilder build-essential
+separator2
+
+echo "Enabling the source repository"
+separator1
+echo "In order to do packaging work comfortably, you'll want to have"
+echo "information about all of Ubuntu's source packages in your apt"
+echo "cache. This will make it possible for you to:"
+echo " - Check information about them without the need to go online."
+echo " - Download the latest version of a source package with a single command."
+echo
+echo "This is the list of source repositories enabled on your system:"
+cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list | \
+grep '^[ ]*deb-src[ ]' | while read line
+do
+    echo " - $line"
+done
+echo
+echo "Please check that the list above contains all four components, from"
+echo "Ubuntu's official repositories and for the current development version"
+echo "(important: even if you're using a stable Ubuntu release, the deb-src"
+echo "line needs to be for the latest, in-development, Ubuntu version)".
+echo
+echo "Enable any missing component (eg., by editing your /etc/apt/sources.list"
+echo "file). Do this now."
+await_response
+separator2
+
+echo "Defining the DEBEMAIL and DEBFULLNAME environment variables"
+separator1
+echo "Most packaging tools make use of the DEBEMAIL and DEBFULLNAME"
+echo "environment variables to know who you are."
+echo
+skip_step=false
+if [ -n "$DEBFULLNAME" -a -n "$DEBEMAIL" ]
+then
+    echo "This variables currently have the following value on your system:"
+    echo "Full name (and comment): $DEBFULLNAME"
+    echo "Valid e-mail address: $DEBEMAIL"
+    echo
+    echo -n "Is this information correct? [yn] "
+    while read line
+    do
+        if [ "$line" = "y" ]
+        then
+            skip_step=true
+            break
+        fi
+        if [ "$line" = "n" ]
+        then
+            break
+        fi
+        echo -n "Please write on of «y» or «n»: "
+    done
+    echo
+fi
+show_gpg_info() {
+    if [ -n "gpg --list-secret-keys 2>/dev/null" ]
+    then
+        echo
+        echo "Note: Write your name and e-mail exactly like in your GPG key."
+        echo "For reference, here are your GPG identities:"
+        gpg --list-secret-keys | grep uid | cut -c4- | sed 's/^[ ]*//;' | \
+        while read line
+        do
+            echo " - $line"
+        done
+    fi
+}
+if [ "$skip_step" = false -a "$(basename $SHELL)" != "bash" ]
+then
+    echo "Please export the DEBEMAIL and DEBFULLNAME variables in your"
+    echo "shell's configuration file."
+    show_gpg_info
+    skip_step=true
+    await_response
+fi
+if [ "$skip_step" = false ]
+then
+    echo
+    echo "Please indicate your name and e-mail address. This information will"
+    echo "be added to your ~/.bashrc."
+    show_gpg_info
+    echo
+    echo -n "Full name (and comment): "
+    read line
+    echo "export DEBFULLNAME=\"$(echo $line | sed 's/^[ ]*//;s/[ ]*$//')\"" >> ~/.bashrc
+    echo -n "Valid e-mail address: "
+    read line
+    echo "export DEBEMAIL=\"$(echo $line | sed 's/^[ ]*//;s/[ ]*$//')\"" >> ~/.bashrc
+    echo
+fi
+separator2
+
+echo "Thank you!"
+separator1
+echo "If you've followed all instructions carefully, your system does now"
+echo "have the basic tools and configurations recommended for Ubuntu"
+echo "development."
+echo
+echo "Some resources which may be useful during your path are:"
+echo " - The Ubuntu Packaging Guide: http://wiki.ubuntu.com/PackagingGuide"
+echo " - The Ubuntu Developers IRC channel: #ubuntu-motu on irc.freenode.net"
+echo
+echo "May the source be with you!"

=== renamed file 'setup-packaging-environment' => 'setup-packaging-environment.moved'
=== added file 'setup.py'
--- setup.py	1970-01-01 00:00:00 +0000
+++ setup.py	2012-09-12 18:51:22 +0000
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+
+from setuptools import setup
+import glob
+import os
+import re
+
+# look/set what version we have
+changelog = "debian/changelog"
+if os.path.exists(changelog):
+    head=open(changelog).readline()
+    match = re.compile(".*\((.*)\).*").match(head)
+    if match:
+        version = match.group(1)
+
+scripts = ['404main',
+           'backportpackage',
+           'bitesize',
+           'check-mir',
+           'check-symbols',
+           'dch-repeat',
+           'dgetlp',
+           'grab-merge',
+           'grep-merges',
+           'harvest',
+           'hugdaylist',
+           'import-bug-from-debian',
+           'merge-changelog',
+           'mk-sbuild',
+           'pbuilder-dist',
+           'pbuilder-dist-simple',
+           'pull-debian-debdiff',
+           'pull-debian-source',
+           'pull-lp-source',
+           'pull-revu-source',
+           'requestbackport',
+           'requestsync',
+           'reverse-build-depends',
+           'reverse-depends',
+           'seeded-in-ubuntu',
+           'setup-packaging-environment',
+           'sponsor-patch',
+           'submittodebian',
+           'syncpackage',
+           'ubuntu-build',
+           'ubuntu-iso',
+           'ubuntu-upload-permission',
+           'update-maintainer',
+          ]
+
+if __name__ == '__main__':
+    setup(name='ubuntu-dev-tools',
+          version=version,
+          scripts=scripts,
+          packages=['ubuntutools',
+                    'ubuntutools/lp',
+                    'ubuntutools/requestsync',
+                    'ubuntutools/sponsor_patch',
+                    'ubuntutools/test',
+                   ],
+          data_files=[('/etc/bash_completion.d',
+                       glob.glob("bash_completion/*")),
+                      ('share/man/man1', glob.glob("doc/*.1")),
+                      ('share/man/man5', glob.glob("doc/*.5")),
+                      ('share/ubuntu-dev-tools', ['enforced-editing-wrapper']),
+                     ],
+          test_suite='ubuntutools.test.discover',
+    )

=== renamed file 'setup.py' => 'setup.py.moved'
=== added file 'sponsor-patch'
--- sponsor-patch	1970-01-01 00:00:00 +0000
+++ sponsor-patch	2012-09-12 18:51:22 +0000
@@ -0,0 +1,133 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2010-2011, Benjamin Drung <bdrung@ubuntu.com>
+#
+# 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 shutil
+import sys
+import tempfile
+
+from devscripts.logger import Logger
+
+from ubuntutools.config import UDTConfig
+from ubuntutools.builder import get_builder
+from ubuntutools.sponsor_patch.sponsor_patch import (sponsor_patch,
+                                                     check_dependencies)
+
+def parse(script_name):
+    """Parse the command line parameters."""
+    usage = ("%s [options] <bug number>\n" % (script_name)
+             + "One of --upload, --workdir, or --sponsor must be specified.")
+    epilog = "See %s(1) for more info." % (script_name)
+    parser = optparse.OptionParser(usage=usage, epilog=epilog)
+
+    parser.add_option("-b", "--build", dest="build",
+                      help="Build the package with the specified builder.",
+                      action="store_true", default=False)
+    parser.add_option("-B", "--builder", dest="builder", default=None,
+                      help="Specify the package builder (default pbuilder)")
+    parser.add_option("-e", "--edit",
+                      help="launch sub-shell to allow editing of the patch",
+                      dest="edit", action="store_true", default=False)
+    parser.add_option("-k", "--key", dest="keyid", default=None,
+                      help="Specify the key ID to be used for signing.")
+    parser.add_option("-l", "--lpinstance", dest="lpinstance", default=None,
+                      help="Launchpad instance to connect to "
+                           "(default: production)",
+                      metavar="INSTANCE")
+    parser.add_option("--no-conf", dest="no_conf", default=False,
+                      help="Don't read config files or environment variables.",
+                      action="store_true")
+    parser.add_option("-s", "--sponsor", help="sponsoring; equals -b -u ubuntu",
+                      dest="sponsoring", action="store_true", default=False)
+    parser.add_option("-u", "--upload", dest="upload", default=None,
+                      help="Specify an upload destination (default none).")
+    parser.add_option("-U", "--update", dest="update", default=False,
+                      action="store_true",
+                      help="Update the build environment before building.")
+    parser.add_option("-v", "--verbose", help="print more information",
+                      dest="verbose", action="store_true", default=False)
+    parser.add_option("-w", "--workdir", dest="workdir", default=None,
+                      help="Specify a working directory (default is a "
+                           "temporary directory, deleted afterwards).")
+
+    (options, args) = parser.parse_args()
+    Logger.set_verbosity(options.verbose)
+    check_dependencies()
+
+    if len(args) == 0:
+        Logger.error("No bug number specified.")
+        sys.exit(1)
+    elif len(args) > 1:
+        Logger.error("Multiple bug numbers specified: %s" % (", ".join(args)))
+        sys.exit(1)
+
+    bug_number = args[0]
+    if bug_number.isdigit():
+        bug_number = int(bug_number)
+    else:
+        Logger.error("Invalid bug number specified: %s" % (bug_number))
+        sys.exit(1)
+
+    config = UDTConfig(options.no_conf)
+    if options.builder is None:
+        options.builder = config.get_value("BUILDER")
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value("LPINSTANCE")
+    if not options.update:
+        options.update = config.get_value("UPDATE_BUILDER", boolean=True)
+    if options.workdir is None:
+        options.workdir = config.get_value("WORKDIR")
+    if options.keyid is None:
+        options.keyid = config.get_value("KEYID")
+
+    if options.sponsoring:
+        options.build = True
+        options.upload = "ubuntu"
+
+    return (options, bug_number)
+
+def main():
+    script_name = os.path.basename(sys.argv[0])
+    (options, bug_number) = parse(script_name)
+
+    builder = get_builder(options.builder)
+    if not builder:
+        sys.exit(1)
+
+    if not options.upload and not options.workdir:
+        Logger.error("Please specify either a working directory or an upload "
+                     "target!")
+        sys.exit(1)
+
+    if options.workdir is None:
+        workdir = tempfile.mkdtemp(prefix=script_name+"-")
+    else:
+        workdir = options.workdir
+
+    try:
+        sponsor_patch(bug_number, options.build, builder, options.edit,
+                      options.keyid, options.lpinstance, options.update,
+                      options.upload, workdir)
+    except KeyboardInterrupt:
+        print "\nUser abort."
+        sys.exit(2)
+    finally:
+        if options.workdir is None:
+            shutil.rmtree(workdir)
+
+if __name__ == "__main__":
+    main()

=== renamed file 'sponsor-patch' => 'sponsor-patch.moved'
=== added file 'submittodebian'
--- submittodebian	1970-01-01 00:00:00 +0000
+++ submittodebian	2012-09-12 18:51:22 +0000
@@ -0,0 +1,255 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# submittodebian - tool to submit patches to Debian's BTS
+# Copyright (C) 2007, 2009 Canonical Ltd.
+# Author: Soren Hansen <soren@ubuntu.com>,
+#         Steve Langasek <slangasek@canonical.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL for more details.
+#
+# ##################################################################
+
+import optparse
+import os
+import re
+import shutil
+import sys
+from tempfile import mkdtemp
+
+from distro_info import UbuntuDistroInfo, DistroDataOutdated
+
+from ubuntutools.config import ubu_email
+from ubuntutools.question import YesNoQuestion, EditFile
+from ubuntutools.subprocess import call, check_call, Popen, PIPE
+from ubuntutools.update_maintainer import update_maintainer, restore_maintainer
+
+try:
+    from debian.changelog import Changelog
+except ImportError:
+    print (u"This utility requires modules from the «python-debian» package, "
+           u"which isn't currently installed.")
+    sys.exit(1)
+
+
+def get_most_recent_debian_version(changelog):
+    for block in changelog:
+        version = block.version.full_version
+        if not re.search('(ubuntu|build)', version):
+            return version
+
+
+def get_bug_body(changelog):
+    entry = next(iter(changelog))
+    msg = """
+In Ubuntu, the attached patch was applied to achieve the following:
+
+## ---------------- REPLACE THIS WITH ACTUAL INFORMATION ---------------------
+## Please add all necessary information about why the change needed to go in
+## Ubuntu, quote policy, spec or any other background material and why it can
+## and should be used in Debian too.  If the patch is composed of multiple
+## independent pieces, please send them as separate bug reports.
+## ---------------- REPLACE THIS WITH ACTUAL INFORMATION ---------------------
+
+%s
+
+Thanks for considering the patch.
+""" % ("\n".join([a for a in entry.changes()]))
+    return msg
+
+
+def build_source_package():
+    if os.path.isdir('.bzr'):
+        cmd = ['bzr', 'bd', '-S', '--', '-uc', '-us', '-nc']
+    else:
+        cmd = ['debuild', '-S', '-uc', '-us', '-nc']
+    env = os.environ.copy()
+    # Unset DEBEMAIL in case there's an @ubuntu.com e-mail address
+    env.pop('DEBEMAIL', None)
+    check_call(cmd, env=env)
+
+
+def gen_debdiff(tmpdir, changelog):
+    pkg = changelog.package
+
+    changelog_it = iter(changelog)
+    newver = next(changelog_it).version
+    oldver = next(changelog_it).version
+
+    debdiff = os.path.join(tmpdir, '%s_%s.debdiff' % (pkg, newver))
+
+    devnull = open('/dev/null', 'w')
+    diff_cmd = ['bzr', 'diff', '-r', 'tag:' + str(oldver)]
+    if call(diff_cmd, stdout=devnull, stderr=devnull) == 1:
+        print "Extracting bzr diff between %s and %s" % (oldver, newver)
+    else:
+        if oldver.epoch is not None:
+            oldver = str(oldver)[str(oldver).index(":") + 1:]
+        if newver.epoch is not None:
+            newver = str(newver)[str(newver).index(":") + 1:]
+
+        olddsc = '../%s_%s.dsc' % (pkg, oldver)
+        newdsc = '../%s_%s.dsc' % (pkg, newver)
+
+        check_file(olddsc)
+        check_file(newdsc)
+
+        print "Generating debdiff between %s and %s" % (oldver, newver)
+        diff_cmd = ['debdiff', olddsc, newdsc]
+
+    diff = Popen(diff_cmd, stdout=PIPE)
+    debdiff_f = open(debdiff, 'w')
+    filterdiff = Popen(['filterdiff', '-x', '*changelog*'],
+                       stdin=diff.stdout, stdout=debdiff_f)
+    diff.stdout.close()
+    filterdiff.wait()
+    debdiff_f.close()
+    devnull.close()
+
+    return debdiff
+
+
+def check_file(fname, critical=True):
+    if os.path.exists(fname):
+        return fname
+    else:
+        if not critical:
+            return False
+        print u"Couldn't find «%s».\n" % fname
+        sys.exit(1)
+
+
+def submit_bugreport(body, debdiff, deb_version, changelog):
+    try:
+        devel = UbuntuDistroInfo().devel()
+    except DistroDataOutdated, e:
+        print str(e)
+        devel = ''
+
+    if os.path.dirname(sys.argv[0]).startswith('/usr/bin'):
+        editor_path = '/usr/share/ubuntu-dev-tools'
+    else:
+        editor_path = os.path.dirname(sys.argv[0])
+    env = dict(os.environ.items())
+    if 'EDITOR' in env:
+        env['UDT_EDIT_WRAPPER_EDITOR'] = env['EDITOR']
+    if 'VISUAL' in env:
+        env['UDT_EDIT_WRAPPER_VISUAL'] = env['VISUAL']
+    env['EDITOR'] = os.path.join(editor_path, 'enforced-editing-wrapper')
+    env['VISUAL'] = os.path.join(editor_path, 'enforced-editing-wrapper')
+    env['UDT_EDIT_WRAPPER_TEMPLATE_RE'] = (
+            '.*REPLACE THIS WITH ACTUAL INFORMATION.*')
+    env['UDT_EDIT_WRAPPER_FILE_DESCRIPTION'] = 'bug report'
+
+    cmd = ('reportbug',
+           '--no-check-available',
+           '--no-check-installed',
+           '--pseudo-header', 'User: ubuntu-devel@lists.ubuntu.com',
+           '--pseudo-header', 'Usertags: origin-ubuntu %s ubuntu-patch'
+                              % devel,
+           '--tag', 'patch',
+           '--attach', debdiff,
+           '--bts', 'debian',
+           '--include', body,
+           '--package-version', deb_version,
+           changelog.package)
+    check_call(cmd, env=env)
+
+
+def check_reportbug_config():
+    fn = os.path.expanduser('~/.reportbugrc')
+    if os.path.exists(fn):
+        return
+    email = ubu_email()[1]
+    reportbugrc = """# Reportbug configuration generated by submittodebian(1)
+# See reportbug.conf(5) for the configuration file format.
+
+# Use Debian's reportbug SMTP Server:
+# Note: it's limited to 5 connections per hour, and cannot CC you at submission
+# time. See /usr/share/doc/reportbug/README.Users.gz for more details.
+smtphost reportbug.debian.org:587
+header "X-Debbugs-CC: %s"
+no-cc
+
+# Use GMail's SMTP Server:
+#smtphost smtp.googlemail.com:587
+#smtpuser "<your address>@gmail.com"
+#smtptls
+""" % email
+
+    with file(fn, 'w') as f:
+        f.write(reportbugrc)
+
+    print """\
+You have not configured reportbug. Assuming this is the first time you have
+used it. Writing a ~/.reportbugrc that will use Debian's mail server, and CC
+the bug to you at <%s>
+
+--- Generated ~/.reportbugrc ---
+%s
+--- End of ~/.reportbugrc ---
+
+If this is not correct, please exit now and edit ~/.reportbugrc or run
+reportbug --configure for its configuration wizard.
+""" % (email, reportbugrc.strip())
+
+    if YesNoQuestion().ask("Continue submitting this bug", "yes") == "no":
+        sys.exit(1)
+
+
+def main():
+    description = 'Submit the Ubuntu changes in a package to Debian. ' + \
+                  'Run inside an unpacked Ubuntu source package.'
+    parser = optparse.OptionParser(description=description)
+    parser.parse_args()
+
+    if not os.path.exists('/usr/bin/reportbug'):
+        print(u"This utility requires the «reportbug» package, which isn't "
+              u"currently installed.")
+        sys.exit(1)
+
+    check_reportbug_config()
+    changelog_file = (check_file('debian/changelog', critical=False) or
+                      check_file('../debian/changelog'))
+    changelog = Changelog(file(changelog_file).read())
+
+    deb_version = get_most_recent_debian_version(changelog)
+    bug_body = get_bug_body(changelog)
+
+    tmpdir = mkdtemp()
+    body = os.path.join(tmpdir, 'bug_body')
+    fp = open(body, 'w')
+    fp.write(bug_body.encode('utf-8'))
+    fp.close()
+
+    restore_maintainer('debian')
+    build_source_package()
+    update_maintainer('debian')
+
+    debdiff = gen_debdiff(tmpdir, changelog)
+
+    # Build again as the user probably doesn't expect the Maintainer to be
+    # reverted in the most recent build
+    build_source_package()
+
+    EditFile(debdiff, 'debdiff').edit(optional=True)
+
+    submit_bugreport(body, debdiff, deb_version, changelog)
+    os.unlink(body)
+    os.unlink(debdiff)
+    shutil.rmtree(tmpdir)
+
+if __name__ == '__main__':
+    main()

=== renamed file 'submittodebian' => 'submittodebian.moved'
=== added file 'syncpackage'
--- syncpackage	1970-01-01 00:00:00 +0000
+++ syncpackage	2012-09-12 18:51:22 +0000
@@ -0,0 +1,752 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008-2010 Martin Pitt <martin.pitt@canonical.com>,
+#               2010      Benjamin Drung <bdrung@ubuntu.com>,
+#               2010-2011 Stefano Rivera <stefanor@ubuntu.com>
+#
+# ##################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# See file /usr/share/common-licenses/GPL-3 for more details.
+#
+# ##################################################################
+
+import codecs
+import optparse
+import os
+import re
+import shutil
+import sys
+import textwrap
+import urllib
+
+import debian.debian_support
+from devscripts.logger import Logger
+from distro_info import UbuntuDistroInfo, DistroDataOutdated
+from lazr.restfulclient.errors import HTTPError
+
+from ubuntutools.archive import (DebianSourcePackage, UbuntuSourcePackage,
+                                 DownloadError)
+from ubuntutools.config import UDTConfig, ubu_email
+from ubuntutools.requestsync.mail import (
+        get_debian_srcpkg as requestsync_mail_get_debian_srcpkg)
+from ubuntutools.requestsync.lp import get_debian_srcpkg, get_ubuntu_srcpkg
+from ubuntutools.lp import udtexceptions
+from ubuntutools.lp.lpapicache import (Distribution, Launchpad, PersonTeam,
+                                       SourcePackagePublishingHistory)
+from ubuntutools.misc import split_release_pocket
+from ubuntutools.question import YesNoQuestion
+from ubuntutools import subprocess
+
+
+class Version(debian.debian_support.Version):
+    def strip_epoch(self):
+        '''Removes the epoch from a Debian version string.
+
+        strip_epoch(1:1.52-1) will return "1.52-1" and strip_epoch(1.1.3-1)
+        will return "1.1.3-1".
+        '''
+        parts = self.full_version.split(':')
+        if len(parts) > 1:
+            del parts[0]
+        version_without_epoch = ':'.join(parts)
+        return version_without_epoch
+
+    def get_related_debian_version(self):
+        '''Strip the ubuntu-specific bits off the version'''
+        related_debian_version = self.full_version
+        uidx = related_debian_version.find('ubuntu')
+        if uidx > 0:
+            related_debian_version = related_debian_version[:uidx]
+        uidx = related_debian_version.find('build')
+        if uidx > 0:
+            related_debian_version = related_debian_version[:uidx]
+        return Version(related_debian_version)
+
+    def is_modified_in_ubuntu(self):
+        '''Did Ubuntu modify this (and mark the version appropriately)?'''
+        return 'ubuntu' in self.full_version
+
+
+def remove_signature(dscname):
+    '''Removes the signature from a .dsc file if the .dsc file is signed.'''
+
+    dsc_file = open(dscname)
+    if dsc_file.readline().strip() == "-----BEGIN PGP SIGNED MESSAGE-----":
+        unsigned_file = []
+        # search until begin of body found
+        for line in dsc_file:
+            if line.strip() == "":
+                break
+
+        # search for end of body
+        for line in dsc_file:
+            if line.strip() == "":
+                break
+            unsigned_file.append(line)
+
+        dsc_file.close()
+        dsc_file = open(dscname, "w")
+        dsc_file.writelines(unsigned_file)
+        dsc_file.close()
+
+
+def add_fixed_bugs(changes, bugs):
+    '''Add additional Launchpad bugs to the list of fixed bugs in changes
+       file.'''
+
+    changes = [l for l in changes.split("\n") if l.strip() != ""]
+    # Remove duplicates
+    bugs = set(str(bug) for bug in bugs)
+
+    for i in xrange(len(changes)):
+        if changes[i].startswith("Launchpad-Bugs-Fixed:"):
+            bugs.update(changes[i][22:].strip().split(" "))
+            changes[i] = "Launchpad-Bugs-Fixed: %s" % (" ".join(bugs))
+            break
+        elif i == len(changes) - 1:
+            # Launchpad-Bugs-Fixed entry does not exist in changes file
+            line = "Launchpad-Bugs-Fixed: %s" % (" ".join(bugs))
+            changes.append(line)
+
+    return "\n".join(changes + [""])
+
+
+def sync_dsc(src_pkg, debian_dist, release, name, email, bugs, ubuntu_mirror,
+             keyid=None, simulate=False, force=False, fakesync=False):
+    '''Local sync, trying to emulate sync-source.py
+    Grabs a source package, replaces the .orig.tar with the one from Ubuntu,
+    if necessary, writes a sync-appropriate .changes file, and signs it.
+    '''
+
+    uploader = name + " <" + email + ">"
+
+    src_pkg.pull_dsc()
+    new_ver = Version(src_pkg.dsc["Version"])
+
+    try:
+        series = release.split("-")[0]
+        ubuntu_source = get_ubuntu_srcpkg(src_pkg.source, series)
+        ubuntu_ver = Version(ubuntu_source.getVersion())
+        ubu_pkg = UbuntuSourcePackage(src_pkg.source, ubuntu_ver.full_version,
+                                      ubuntu_source.getComponent(),
+                                      mirrors=[ubuntu_mirror])
+        ubu_pkg.pull_dsc()
+        need_orig = ubuntu_ver.upstream_version != new_ver.upstream_version
+    except udtexceptions.PackageNotFoundException:
+        ubuntu_ver = Version('~')
+        ubu_pkg = None
+        need_orig = True
+        Logger.normal('%s does not exist in Ubuntu.', name)
+
+    Logger.debug('Source %s: current version %s, new version %s',
+                 src_pkg.source, ubuntu_ver, new_ver)
+    Logger.debug('Needs source tarball: %s', str(need_orig))
+
+    cur_ver = ubuntu_ver.get_related_debian_version()
+    if ubuntu_ver.is_modified_in_ubuntu():
+        if not force:
+            Logger.error('--force is required to discard Ubuntu changes.')
+            sys.exit(1)
+
+        Logger.warn('Overwriting modified Ubuntu version %s, '
+                    'setting current version to %s',
+                    ubuntu_ver.full_version, cur_ver.full_version)
+    if simulate:
+        return
+
+    try:
+        src_pkg.pull()
+    except DownloadError, e:
+        Logger.error('Failed to download: %s', str(e))
+        sys.exit(1)
+    src_pkg.unpack()
+
+    needs_fakesync = not (need_orig or ubu_pkg.verify_orig())
+
+    if needs_fakesync and fakesync:
+        Logger.warn('Performing a fakesync')
+    elif not needs_fakesync and fakesync:
+        Logger.error('Fakesync not required, aborting.')
+        sys.exit(1)
+    elif needs_fakesync and not fakesync:
+        Logger.error('The checksums of the Debian and Ubuntu packages '
+                     'mismatch. A fake sync using --fakesync is required.')
+        sys.exit(1)
+
+    if fakesync:
+        # Download Ubuntu files (override Debian source tarballs)
+        try:
+            ubu_pkg.pull()
+        except DownloadError, e:
+            Logger.error('Failed to download: %s', str(e))
+            sys.exit(1)
+
+    # change into package directory
+    directory = src_pkg.source + '-' + new_ver.upstream_version
+    Logger.command(('cd', directory))
+    os.chdir(directory)
+
+    # read Debian distribution from debian/changelog if not specified
+    if debian_dist is None:
+        line = open("debian/changelog").readline()
+        debian_dist = line.split(" ")[2].strip(";")
+
+    if not fakesync:
+        # create the changes file
+        changes_filename = "%s_%s_source.changes" % \
+                           (src_pkg.source, new_ver.strip_epoch())
+        cmd = ["dpkg-genchanges", "-S", "-v" + cur_ver.full_version,
+               "-DDistribution=" + release,
+               "-DOrigin=debian/" + debian_dist,
+               "-e" + uploader]
+        if need_orig:
+            cmd.append("-sa")
+        else:
+            cmd.append("-sd")
+        if not Logger.verbose:
+            cmd += ["-q"]
+        Logger.command(cmd + ['>', '../' + changes_filename])
+        process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+        changes = process.communicate()[0]
+
+        # Add additional bug numbers
+        if len(bugs) > 0:
+            changes = add_fixed_bugs(changes, bugs)
+
+        # remove extracted (temporary) files
+        Logger.command(('cd', '..'))
+        os.chdir('..')
+        shutil.rmtree(directory, True)
+
+        # write changes file
+        changes_file = open(changes_filename, "w")
+        changes_file.writelines(changes)
+        changes_file.close()
+
+        # remove signature and sign package
+        remove_signature(src_pkg.dsc_name)
+        if keyid is not False:
+            cmd = ["debsign", changes_filename]
+            if not keyid is None:
+                cmd.insert(1, "-k" + keyid)
+            Logger.command(cmd)
+            subprocess.check_call(cmd)
+    else:
+        # Create fakesync changelog entry
+        new_ver = Version(new_ver.full_version + "fakesync1")
+        changes_filename = "%s_%s_source.changes" % \
+                           (src_pkg.source, new_ver.strip_epoch())
+        if len(bugs) > 0:
+            message = "Fake sync due to mismatching orig tarball (LP: %s)." % \
+                      (", ".join(["#" + str(b) for b in bugs]))
+        else:
+            message = "Fake sync due to mismatching orig tarball."
+        cmd = ['dch', '-v', new_ver.full_version, '--force-distribution',
+               '-D', release, message]
+        env = {'DEBFULLNAME': name, 'DEBEMAIL': email}
+        Logger.command(cmd)
+        subprocess.check_call(cmd, env=env)
+
+        # update the Maintainer field
+        cmd = ["update-maintainer"]
+        if not Logger.verbose:
+            cmd.append("-q")
+        Logger.command(cmd)
+        subprocess.check_call(cmd)
+
+        # Build source package
+        cmd = ["debuild", "--no-lintian", "-nc", "-S",
+               "-v" + cur_ver.full_version]
+        if need_orig:
+            cmd += ['-sa']
+        if keyid:
+            cmd += ["-k" + keyid]
+        Logger.command(cmd)
+        returncode = subprocess.call(cmd)
+        if returncode != 0:
+            Logger.error('Source-only build with debuild failed. '
+                         'Please check build log above.')
+            sys.exit(1)
+
+
+def fetch_source_pkg(package, dist, version, component, ubuntu_release,
+                     mirror):
+    """Download the specified source package.
+    dist, version, component, mirror can all be None.
+    """
+    if mirror is None:
+        mirrors = []
+    else:
+        mirrors = [mirror]
+
+    if package.endswith('.dsc'):
+        return DebianSourcePackage(dscfile=package, mirrors=mirrors)
+
+    if dist is None:
+        ubu_info = UbuntuDistroInfo()
+        try:
+            if ubu_info.is_lts(ubu_info.devel()):
+                dist = 'testing'
+            else:
+                dist = 'unstable'
+        except DistroDataOutdated, e:
+            Logger.warn(e)
+            dist = 'unstable'
+
+    requested_version = version
+    if type(version) == str:
+        version = Version(version)
+
+    if version is None or component is None:
+        try:
+            debian_srcpkg = get_debian_srcpkg(package, dist)
+        except (udtexceptions.PackageNotFoundException,
+                udtexceptions.SeriesNotFoundException), e:
+            Logger.error(str(e))
+            sys.exit(1)
+        if version is None:
+            version = Version(debian_srcpkg.getVersion())
+        try:
+            ubuntu_srcpkg = get_ubuntu_srcpkg(package, ubuntu_release)
+            ubuntu_version = Version(ubuntu_srcpkg.getVersion())
+        except udtexceptions.PackageNotFoundException:
+            ubuntu_version = Version('~')
+        except udtexceptions.SeriesNotFoundException, e:
+            Logger.error(str(e))
+            sys.exit(1)
+        if ubuntu_version >= version:
+            # The LP importer is maybe out of date
+            debian_srcpkg = requestsync_mail_get_debian_srcpkg(package, dist)
+            if requested_version is None:
+                version = Version(debian_srcpkg.getVersion())
+            if ubuntu_version >= version:
+                Logger.error("Version in Debian %s (%s) isn't newer than "
+                             "Ubuntu %s (%s)",
+                             version, dist, ubuntu_version, ubuntu_release)
+                sys.exit(1)
+        if component is None:
+            component = debian_srcpkg.getComponent()
+
+    assert component in ('main', 'contrib', 'non-free')
+
+    return DebianSourcePackage(package, version.full_version, component,
+                               mirrors=mirrors)
+
+
+def copy(src_pkg, release, bugs, sponsoree=None, simulate=False, force=False):
+    """Copy a source package from Debian to Ubuntu using the Launchpad API."""
+    ubuntu = Distribution('ubuntu')
+    debian_archive = Distribution('debian').getArchive()
+    ubuntu_archive = ubuntu.getArchive()
+    if release is None:
+        ubuntu_series = ubuntu.getDevelopmentSeries().name
+        ubuntu_pocket = 'Release'
+    else:
+        ubuntu_series, ubuntu_pocket = split_release_pocket(release)
+
+    # Ensure that the provided Debian version actually exists.
+    try:
+        debian_spph = SourcePackagePublishingHistory(
+                debian_archive.getPublishedSources(
+                    source_name=src_pkg.source,
+                    version=src_pkg.version.full_version,
+                    exact_match=True)[0]
+                )
+    except IndexError:
+        Logger.error('Debian version %s has not been picked up by LP yet. '
+                     'Please try again later.',
+                     src_pkg.version)
+        sys.exit(1)
+
+    try:
+        ubuntu_spph = get_ubuntu_srcpkg(src_pkg.source,
+                                        ubuntu_series, ubuntu_pocket)
+        ubuntu_pkg = UbuntuSourcePackage(src_pkg.source,
+                                         ubuntu_spph.getVersion(),
+                                         ubuntu_spph.getComponent(),
+                                         mirrors=[])
+
+        Logger.normal('Source %s -> %s/%s: current version %s, new version %s',
+                      src_pkg.source, ubuntu_series, ubuntu_pocket,
+                      ubuntu_pkg.version, src_pkg.version)
+
+        ubuntu_version = Version(ubuntu_pkg.version.full_version)
+        base_version = ubuntu_version.get_related_debian_version()
+        if not force and ubuntu_version.is_modified_in_ubuntu():
+            Logger.error('--force is required to discard Ubuntu changes.')
+            sys.exit(1)
+
+        # Check whether a fakesync would be required.
+        src_pkg.pull_dsc()
+        ubuntu_pkg.pull_dsc()
+        if not src_pkg.dsc.compare_dsc(ubuntu_pkg.dsc):
+            Logger.error('The checksums of the Debian and Ubuntu packages '
+                         'mismatch. A fake sync using --fakesync is required.')
+            sys.exit(1)
+    except udtexceptions.PackageNotFoundException:
+        base_version = Version('~')
+        Logger.normal('Source %s -> %s/%s: not in Ubuntu, new version %s',
+                      src_pkg.source, ubuntu_series, ubuntu_pocket,
+                      src_pkg.version)
+
+    changes = debian_spph.getChangelog(since_version=base_version)
+    if changes:
+        changes = changes.strip()
+        Logger.normal("New changes:\n%s", changes)
+
+    if simulate:
+        return
+
+    if sponsoree:
+        Logger.normal("Sponsoring this sync for %s (%s)",
+                      sponsoree.display_name, sponsoree.name)
+    answer = YesNoQuestion().ask("Sync this package", "no")
+    if answer != "yes":
+        return
+
+    try:
+        ubuntu_archive.copyPackage(
+            source_name=src_pkg.source,
+            version=src_pkg.version.full_version,
+            from_archive=debian_archive,
+            to_series=ubuntu_series,
+            to_pocket=ubuntu_pocket,
+            include_binaries=False,
+            sponsored=sponsoree)
+    except HTTPError, error:
+        Logger.error("HTTP Error %s: %s", error.response.status,
+                     error.response.reason)
+        Logger.error(error.content)
+        sys.exit(1)
+
+    Logger.normal('Request succeeded; you should get an e-mail once it is '
+                  'processed.')
+    bugs = sorted(set(bugs))
+    if bugs:
+        Logger.normal("Launchpad bugs to be closed: %s",
+                      ', '.join(str(bug) for bug in bugs))
+        Logger.normal('Please wait for the sync to be successful before '
+                      'closing bugs.')
+        answer = YesNoQuestion().ask("Close bugs", "yes")
+        if answer == "yes":
+            close_bugs(bugs, src_pkg.source, src_pkg.version.full_version,
+                       changes, sponsoree)
+
+
+def is_blacklisted(query):
+    """"Determine if package "query" is in the sync blacklist
+    Returns tuple of (blacklisted, comments)
+    blacklisted is one of False, 'CURRENT', 'ALWAYS'
+    """
+    series = Launchpad.distributions['ubuntu'].current_series
+    lp_comments = series.getDifferenceComments(source_package_name=query)
+    blacklisted = False
+    comments = [u'%s\n  -- %s  %s'
+                % (c.body_text, c.comment_author.name,
+                   c.comment_date.strftime('%a, %d %b %Y %H:%M:%S +0000'))
+                for c in lp_comments]
+
+    for diff in series.getDifferencesTo(source_package_name_filter=query):
+        if (diff.status == 'Blacklisted current version'
+                and blacklisted != 'ALWAYS'):
+            blacklisted = 'CURRENT'
+        if diff.status == 'Blacklisted always':
+            blacklisted = 'ALWAYS'
+
+    # Old blacklist:
+    url = 'http://people.canonical.com/~ubuntu-archive/sync-blacklist.txt'
+    with codecs.EncodedFile(urllib.urlopen(url), 'UTF-8') as f:
+        applicable_lines = []
+        for line in f:
+            if not line.strip():
+                applicable_lines = []
+                continue
+            m = re.match(r'^\s*([a-z0-9.+-]+)?', line)
+            source = m.group(0)
+            applicable_lines.append(line)
+            if source and query == source:
+                comments += ["From sync-blacklist.txt:"] + applicable_lines
+                blacklisted = 'ALWAYS'
+                break
+
+    return (blacklisted, comments)
+
+
+def close_bugs(bugs, package, version, changes, sponsoree):
+    """Close the correct task on all bugs, with changes"""
+    ubuntu = Launchpad.distributions['ubuntu']
+    message = ("This bug was fixed in the package %s - %s"
+               % (package, version))
+    if sponsoree:
+        message += '\nSponsored for %s (%s)' % (sponsoree.display_name,
+                                                sponsoree.name)
+    if changes:
+        message += "\n\n---------------\n" + changes
+    for bug in bugs:
+        bug = Launchpad.bugs[bug]
+        if bug.duplicate_of is not None:
+            bug = bug.duplicate_of
+        for task in bug.bug_tasks:
+            target = task.target
+            if target == ubuntu or (target.name == package and
+               getattr(target, 'distribution', None) == ubuntu):
+                if task.status != 'Fix Released':
+                    Logger.normal("Closed bug %s", task.web_link)
+                    task.status = 'Fix Released'
+                    task.lp_save()
+                    bug.newMessage(content=message)
+                break
+        else:
+            Logger.error(u"Cannot find any tasks on LP: #%i to close.", bug.id)
+
+
+def parse():
+    """Parse given command-line parameters."""
+
+    usage = "%prog [options] <.dsc URL/path or package name>"
+    epilog = "See %s(1) for more info." % os.path.basename(sys.argv[0])
+    parser = optparse.OptionParser(usage=usage, epilog=epilog)
+
+    parser.add_option("-d", "--distribution",
+                      help="Debian distribution to sync from.")
+    parser.add_option("-r", "--release",
+                      help="Specify target Ubuntu release.")
+    parser.add_option("-V", "--debian-version",
+                      help="Specify the version to sync from.")
+    parser.add_option("-c", "--component",
+                      help="Specify the Debian component to sync from.")
+    parser.add_option("-b", "--bug", metavar="BUG",
+                      dest="bugs", action="append", default=list(),
+                      help="Mark Launchpad bug BUG as being fixed by this "
+                           "upload.")
+    parser.add_option("-s", "--sponsor", metavar="USERNAME",
+                      dest="sponsoree", default=None,
+                      help="Sponsor the sync for USERNAME (a Launchpad "
+                           "username).")
+    parser.add_option("-v", "--verbose",
+                      action="store_true", default=False,
+                      help="Display more progress information.")
+    parser.add_option("-F", "--fakesync",
+                      action="store_true", default=False,
+                      help="Perform a fakesync (a sync where Debian and "
+                           "Ubuntu have a .orig.tar mismatch). "
+                           "This implies --no-lp and will leave a signed "
+                           ".changes file for you to upload.")
+    parser.add_option("-f", "--force",
+                      action="store_true", default=False,
+                      help="Force sync over the top of Ubuntu changes.")
+    parser.add_option('--no-conf',
+                      default=False, action='store_true',
+                      help="Don't read config files or environment variables.")
+    parser.add_option('-l', '--lpinstance', metavar='INSTANCE',
+                      help='Launchpad instance to connect to '
+                           '(default: production).')
+    parser.add_option('--simulate',
+                      default=False, action='store_true',
+                      help="Show what would be done, but don't actually do "
+                           "it.")
+
+    no_lp = optparse.OptionGroup(parser, "Local sync preparation options",
+            "Options that only apply when using --no-lp.  "
+            "WARNING: The use of --no-lp is not recommended for uploads "
+            "targeted at Ubuntu. "
+            "The archive-admins discourage its use, except for fakesyncs.")
+    no_lp.add_option("--no-lp",
+                     dest="lp", action="store_false", default=True,
+                     help="Construct sync locally, rather than letting "
+                          "Launchpad copy the package directly. "
+                          "It will leave a signed .changes file for you to "
+                          "upload.")
+    no_lp.add_option("-n", "--uploader-name",
+                     help="Use UPLOADER_NAME as the name of the maintainer "
+                          "for this upload.")
+    no_lp.add_option("-e", "--uploader-email",
+                     help="Use UPLOADER_EMAIL as email address of the "
+                          "maintainer for this upload.")
+    no_lp.add_option("-k", "--key",
+                     dest="keyid",
+                     help="Specify the key ID to be used for signing.")
+    no_lp.add_option('--dont-sign',
+                     dest='keyid', action='store_false',
+                     help='Do not sign the upload.')
+    no_lp.add_option('-D', '--debian-mirror', metavar='DEBIAN_MIRROR',
+                     help='Preferred Debian mirror '
+                          '(default: %s)'
+                          % UDTConfig.defaults['DEBIAN_MIRROR'])
+    no_lp.add_option('-U', '--ubuntu-mirror', metavar='UBUNTU_MIRROR',
+                     help='Preferred Ubuntu mirror '
+                          '(default: %s)'
+                          % UDTConfig.defaults['UBUNTU_MIRROR'])
+    parser.add_option_group(no_lp)
+
+    (options, args) = parser.parse_args()
+
+    if options.fakesync:
+        options.lp = False
+
+    if len(args) == 0:
+        parser.error('No .dsc URL/path or package name specified.')
+    if len(args) > 1:
+        parser.error('Multiple .dsc URLs/paths or package names specified: '
+                     + ', '.join(args))
+
+    try:
+        options.bugs = [int(b) for b in options.bugs]
+    except TypeError:
+        parser.error('Invalid bug number(s) specified.')
+
+    if options.component not in (None, "main", "contrib", "non-free"):
+        parser.error('%s is not a valid Debian component. '
+                     'It should be one of main, contrib, or non-free.'
+                     % options.component)
+
+    if options.lp and options.uploader_name:
+        parser.error('Uploader name can only be overridden using --no-lp.')
+    if options.lp and options.uploader_email:
+        parser.error('Uploader email address can only be overridden using '
+                     '--no-lp.')
+    # --key, --dont-sign, --debian-mirror, and --ubuntu-mirror are just
+    # ignored with options.lp, and do not require warnings.
+
+    if options.lp:
+        if args[0].endswith('.dsc'):
+            parser.error('.dsc files can only be synced using --no-lp.')
+
+    return (options, args[0])
+
+
+def main():
+    '''Handle parameters and get the ball rolling'''
+    (options, package) = parse()
+
+    Logger.verbose = options.verbose
+    config = UDTConfig(options.no_conf)
+    if options.debian_mirror is None:
+        options.debian_mirror = config.get_value('DEBIAN_MIRROR')
+    if options.ubuntu_mirror is None:
+        options.ubuntu_mirror = config.get_value('UBUNTU_MIRROR')
+
+    if options.keyid is None:
+        options.keyid = config.get_value('KEYID')
+
+    if options.lpinstance is None:
+        options.lpinstance = config.get_value('LPINSTANCE')
+
+    try:
+        # devel for copyPackage and changelogUrl
+        kwargs = {'service': options.lpinstance,
+                  'api_version': 'devel'}
+        if options.lp:
+            Launchpad.login(**kwargs)
+        else:
+            Launchpad.login_anonymously(**kwargs)
+    except IOError:
+        sys.exit(1)
+
+    if options.release is None:
+        ubuntu = Launchpad.distributions["ubuntu"]
+        options.release = ubuntu.current_series.name
+
+    if not options.fakesync and not options.lp:
+        Logger.warn("The use of --no-lp is not recommended for uploads "
+                    "targeted at Ubuntu. "
+                    "The archive-admins discourage its use, except for "
+                    "fakesyncs.")
+
+    sponsoree = None
+    if options.sponsoree:
+        try:
+            sponsoree = PersonTeam(options.sponsoree)
+        except KeyError:
+            Logger.error('Cannot find the username "%s" in Launchpad.',
+                         options.sponsoree)
+            sys.exit(1)
+
+    if sponsoree and options.uploader_name is None:
+        options.uploader_name = sponsoree.display_name
+    elif options.uploader_name is None:
+        options.uploader_name = ubu_email(export=False)[0]
+
+    if sponsoree and options.uploader_email is None:
+        try:
+            options.uploader_email = sponsoree.preferred_email_address.email
+        except ValueError:
+            if not options.lp:
+                Logger.error("%s doesn't have a publicly visible e-mail "
+                             "address in LP, please provide one "
+                             "--uploader-email option", sponsoree.display_name)
+                sys.exit(1)
+    elif options.uploader_email is None:
+        options.uploader_email = ubu_email(export=False)[1]
+
+    src_pkg = fetch_source_pkg(package, options.distribution,
+                               options.debian_version,
+                               options.component,
+                               options.release.split("-")[0],
+                               options.debian_mirror)
+
+    blacklisted, comments = is_blacklisted(src_pkg.source)
+    blacklist_fail = False
+    if blacklisted:
+        messages = []
+
+        if blacklisted == 'CURRENT':
+            Logger.debug("Source package %s is temporarily blacklisted "
+                         "(blacklisted_current). "
+                         "Ubuntu ignores these for now. "
+                         "See also LP: #841372", src_pkg.source)
+        else:
+            if options.fakesync:
+                messages += ["Doing a fakesync, overriding blacklist."]
+            else:
+                blacklist_fail = True
+                messages += ["If this package needs a fakesync, "
+                             "use --fakesync",
+                             "If you think this package shouldn't be "
+                             "blacklisted, please file a bug explaining your "
+                             "reasoning and subscribe ~ubuntu-archive."]
+
+        if blacklist_fail:
+            Logger.error(u"Source package %s is blacklisted.", src_pkg.source)
+        elif blacklisted == 'ALWAYS':
+            Logger.normal(u"Source package %s is blacklisted.", src_pkg.source)
+        if messages:
+            for message in messages:
+                for line in textwrap.wrap(message):
+                    Logger.normal(line)
+
+    if comments:
+        Logger.normal("Blacklist Comments:")
+        for comment in comments:
+            for line in textwrap.wrap(comment):
+                Logger.normal(u"  " + line)
+
+    if blacklist_fail:
+        sys.exit(1)
+
+    if options.lp:
+        copy(src_pkg, options.release, options.bugs, sponsoree,
+             options.simulate, options.force)
+    else:
+        os.environ['DEB_VENDOR'] = 'Ubuntu'
+        sync_dsc(src_pkg, options.distribution, options.release,
+                 options.uploader_name, options.uploader_email, options.bugs,
+                 options.ubuntu_mirror, options.keyid, options.simulate,
+                 options.force, options.fakesync)
+
+
+if __name__ == "__main__":
+    try:
+        main()
+    except KeyboardInterrupt:
+        Logger.normal('User abort.')

=== renamed file 'syncpackage' => 'syncpackage.moved'
=== added directory 'test-data'
=== renamed directory 'test-data' => 'test-data.moved'
=== added directory 'test-data/blank-example'
=== added file 'test-data/blank-example/content'
--- test-data/blank-example/content	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/content	2012-09-12 18:51:22 +0000
@@ -0,0 +1,1 @@
+upstream

=== added directory 'test-data/blank-example/debian'
=== added file 'test-data/blank-example/debian/compat'
--- test-data/blank-example/debian/compat	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/debian/compat	2012-09-12 18:51:22 +0000
@@ -0,0 +1,1 @@
+7

=== added file 'test-data/blank-example/debian/control'
--- test-data/blank-example/debian/control	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/debian/control	2012-09-12 18:51:22 +0000
@@ -0,0 +1,12 @@
+Source: example
+Section: misc
+Priority: extra
+Maintainer: Ubuntu Developers <ubuntu-dev-team@lists.alioth.debian.org>
+Build-Depends: debhelper (>= 7.0.50~)
+Standards-Version: 3.9.1
+
+Package: example
+Architecture: all
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: Example package for testing purposes
+ An example package used by the test suite. Useless.

=== added file 'test-data/blank-example/debian/copyright'
--- test-data/blank-example/debian/copyright	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/debian/copyright	2012-09-12 18:51:22 +0000
@@ -0,0 +1,17 @@
+Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=152
+Source: https://launchpad.net/ubuntu-dev-tools
+
+Files: *
+Copyright: 2010-2011, Stefano Rivera <stefanor@ubuntu.com>
+License: ISC
+ 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.

=== added file 'test-data/blank-example/debian/rules'
--- test-data/blank-example/debian/rules	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/debian/rules	2012-09-12 18:51:22 +0000
@@ -0,0 +1,4 @@
+#!/usr/bin/make -f
+
+%:
+	dh $@

=== added directory 'test-data/blank-example/debian/source'
=== added file 'test-data/blank-example/debian/source/format'
--- test-data/blank-example/debian/source/format	1970-01-01 00:00:00 +0000
+++ test-data/blank-example/debian/source/format	2012-09-12 18:51:22 +0000
@@ -0,0 +1,1 @@
+3.0 (quilt)

=== added file 'ubuntu-build'
--- ubuntu-build	1970-01-01 00:00:00 +0000
+++ ubuntu-build	2012-09-12 18:51:22 +0000
@@ -0,0 +1,274 @@
+#!/usr/bin/python
+#
+#   ubuntu-build - command line interface for Launchpad buildd operations.
+#
+#   Copyright (C) 2007 Canonical Ltd.
+#   Authors:
+#    - Martin Pitt <martin.pitt@canonical.com>
+#    - Jonathan Davies <jpds@ubuntu.com>
+#    - Michael Bienia <geser@ubuntu.com>
+#
+#   This program is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Our modules to import.
+import sys
+from optparse import OptionGroup
+from optparse import OptionParser
+from ubuntutools.lp.udtexceptions import (SeriesNotFoundException,
+                                          PackageNotFoundException,
+                                          PocketDoesNotExistError,)
+from ubuntutools.lp.lpapicache import Distribution, PersonTeam
+from ubuntutools.misc import split_release_pocket
+
+def main():
+    # Usage.
+    usage = "%prog <srcpackage> <release> <operation>\n\n"
+    usage += "Where operation may be one of: rescore, retry, or status.\n"
+    usage += "Only Launchpad Buildd Admins may rescore package builds."
+
+    # Valid architectures.
+    valid_archs = set(["armel", "armhf", "amd64", "hppa", "i386", "ia64",
+                       "lpia", "powerpc", "sparc"])
+
+    # Prepare our option parser.
+    opt_parser = OptionParser(usage)
+
+    # Retry options
+    retry_rescore_options = OptionGroup(opt_parser, "Retry and rescore options",
+                                        "These options may only be used with "
+                                        "the 'retry' and 'rescore' operations.")
+    retry_rescore_options.add_option("-a", "--arch", type="string",
+                                     action="append", dest="architecture",
+                                     help="Rebuild or rescore a specific "
+                                          "architecture. Valid architectures "
+                                          "include: %s." %
+                                          ", ".join(valid_archs))
+
+    # Batch processing options
+    batch_options = OptionGroup(opt_parser, "Batch processing",
+                                "These options and parameter ordering is only "
+                                "ava