/usr/share/pyshared/gbp/scripts/import_orig.py is in git-buildpackage 0.6.0~git20120601.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 | # vim: set fileencoding=utf-8 :
#
# (C) 2006, 2007, 2009, 2011 Guido Guenther <agx@sigxcpu.org>
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""Import a new upstream version into a git repository"""
import ConfigParser
import os
import sys
import re
import tempfile
import gbp.command_wrappers as gbpc
from gbp.deb import (DebianPkgPolicy, do_uscan, parse_changelog_repo)
from gbp.deb.changelog import ChangeLog, NoChangeLogError
from gbp.deb.git import (GitRepositoryError, DebianGitRepository)
from gbp.config import GbpOptionParserDebian, GbpOptionGroup, no_upstream_branch_msg
from gbp.errors import (GbpError, GbpNothingImported)
import gbp.log
from gbp.scripts.common.import_orig import (OrigUpstreamSource, cleanup_tmp_tree,
ask_package_name, ask_package_version,
repacked_tarball_name, repack_source)
# Try to import readline, since that will cause raw_input to get fancy
# line editing and history capabilities. However, if readline is not
# available, raw_input will still work.
try:
import readline
except ImportError:
pass
def is_link_target(target, link):
"""does symlink link already point to target?"""
if os.path.exists(link):
if os.path.samefile(target, link):
return True
return False
def symlink_orig(archive, pkg, version):
"""
Create a symlink from I{archive} ti I{<pkg>_<version>.orig.tar.<ext>} so
pristine-tar will see the correct basename.
@return: archive path to be used by pristine tar
@rtype: C{str}
"""
if os.path.isdir(archive):
return None
ext = os.path.splitext(archive)[1]
if ext in ['.tgz', '.tbz2', '.tlz', '.txz' ]:
ext = ".%s" % ext[2:]
link = "../%s_%s.orig.tar%s" % (pkg, version, ext)
if os.path.basename(archive) != os.path.basename(link):
try:
if not is_link_target(archive, link):
os.symlink(os.path.abspath(archive), link)
except OSError, err:
raise GbpError, "Cannot symlink '%s' to '%s': %s" % (archive, link, err[1])
return link
else:
return archive
def upstream_import_commit_msg(options, version):
return options.import_msg % dict(version=version)
def detect_name_and_version(repo, source, options):
# Guess defaults for the package name and version from the
# original tarball.
(guessed_package, guessed_version) = source.guess_version() or ('', '')
# Try to find the source package name
try:
cp = ChangeLog(filename='debian/changelog')
sourcepackage = cp['Source']
except NoChangeLogError:
try:
# Check the changelog file from the repository, in case
# we're not on the debian-branch (but upstream, for
# example).
cp = parse_changelog_repo(repo, options.debian_branch, 'debian/changelog')
sourcepackage = cp['Source']
except NoChangeLogError:
if options.interactive:
sourcepackage = ask_package_name(guessed_package,
DebianPkgPolicy.is_valid_packagename,
DebianPkgPolicy.packagename_msg)
else:
if guessed_package:
sourcepackage = guessed_package
else:
raise GbpError, "Couldn't determine upstream package name. Use --interactive."
# Try to find the version.
if options.version:
version = options.version
else:
if options.interactive:
version = ask_package_version(guessed_version,
DebianPkgPolicy.is_valid_upstreamversion,
DebianPkgPolicy.upstreamversion_msg)
else:
if guessed_version:
version = guessed_version
else:
raise GbpError, "Couldn't determine upstream version. Use '-u<version>' or --interactive."
return (sourcepackage, version)
def find_source(options, args):
"""Find the tarball to import - either via uscan or via command line argument
@return: upstream source filename or None if nothing to import
@rtype: string
@raise GbpError: raised on all detected errors
"""
if options.uscan: # uscan mode
if args:
raise GbpError, "you can't pass both --uscan and a filename."
gbp.log.info("Launching uscan...")
try:
status, source = do_uscan()
except KeyError:
raise GbpError, "error running uscan - debug by running uscan --verbose"
if status:
if source:
gbp.log.info("using %s" % source)
args.append(source)
else:
raise GbpError, "uscan didn't download anything, and no source was found in ../"
else:
gbp.log.info("package is up to date, nothing to do.")
return None
if len(args) > 1: # source specified
raise GbpError, "More than one archive specified. Try --help."
elif len(args) == 0:
raise GbpError, "No archive to import specified. Try --help."
else:
archive = OrigUpstreamSource(args[0])
return archive
def set_bare_repo_options(options):
"""Modify options for import into a bare repository"""
if options.pristine_tar or options.merge:
gbp.log.info("Bare repository: setting %s%s options"
% (["", " '--no-pristine-tar'"][options.pristine_tar],
["", " '--no-merge'"][options.merge]))
options.pristine_tar = False
options.merge = False
def parse_args(argv):
try:
parser = GbpOptionParserDebian(command=os.path.basename(argv[0]), prefix='',
usage='%prog [options] /path/to/upstream-version.tar.gz | --uscan')
except ConfigParser.ParsingError, err:
gbp.log.err(err)
return None, None
import_group = GbpOptionGroup(parser, "import options",
"pristine-tar and filtering")
tag_group = GbpOptionGroup(parser, "tag options",
"options related to git tag creation")
branch_group = GbpOptionGroup(parser, "version and branch naming options",
"version number and branch layout options")
cmd_group = GbpOptionGroup(parser, "external command options", "how and when to invoke external commands and hooks")
for group in [import_group, branch_group, tag_group, cmd_group ]:
parser.add_option_group(group)
branch_group.add_option("-u", "--upstream-version", dest="version",
help="Upstream Version")
branch_group.add_config_file_option(option_name="debian-branch",
dest="debian_branch")
branch_group.add_config_file_option(option_name="upstream-branch",
dest="upstream_branch")
branch_group.add_option("--upstream-vcs-tag", dest="vcs_tag",
help="Upstream VCS tag add to the merge commit")
branch_group.add_boolean_config_file_option(option_name="merge", dest="merge")
tag_group.add_boolean_config_file_option(option_name="sign-tags",
dest="sign_tags")
tag_group.add_config_file_option(option_name="keyid",
dest="keyid")
tag_group.add_config_file_option(option_name="upstream-tag",
dest="upstream_tag")
import_group.add_config_file_option(option_name="filter",
dest="filters", action="append")
import_group.add_boolean_config_file_option(option_name="pristine-tar",
dest="pristine_tar")
import_group.add_boolean_config_file_option(option_name="filter-pristine-tar",
dest="filter_pristine_tar")
import_group.add_config_file_option(option_name="import-msg",
dest="import_msg")
cmd_group.add_config_file_option(option_name="postimport", dest="postimport")
parser.add_boolean_config_file_option(option_name="interactive",
dest='interactive')
parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False,
help="verbose command execution")
parser.add_config_file_option(option_name="color", dest="color", type='tristate')
# Accepted for compatibility
parser.add_option("--no-dch", dest='no_dch', action="store_true",
default=False, help="deprecated - don't use.")
parser.add_option("--uscan", dest='uscan', action="store_true",
default=False, help="use uscan(1) to download the new tarball.")
(options, args) = parser.parse_args(argv[1:])
gbp.log.setup(options.color, options.verbose)
if options.no_dch:
gbp.log.warn("'--no-dch' passed. This is now the default, please remove this option.")
return options, args
def main(argv):
ret = 0
tmpdir = ''
pristine_orig = None
(options, args) = parse_args(argv)
try:
source = find_source(options, args)
if not source:
return ret
try:
repo = DebianGitRepository('.')
except GitRepositoryError:
raise GbpError, "%s is not a git repository" % (os.path.abspath('.'))
# an empty repo has now branches:
initial_branch = repo.get_branch()
is_empty = False if initial_branch else True
if not repo.has_branch(options.upstream_branch) and not is_empty:
gbp.log.err(no_upstream_branch_msg % options.upstream_branch)
raise GbpError
(sourcepackage, version) = detect_name_and_version(repo, source, options)
(clean, out) = repo.is_clean()
if not clean and not is_empty:
gbp.log.err("Repository has uncommitted changes, commit these first: ")
raise GbpError, out
if repo.bare:
set_bare_repo_options(options)
if not source.is_dir():
tmpdir = tempfile.mkdtemp(dir='../')
source.unpack(tmpdir, options.filters)
gbp.log.debug("Unpacked '%s' to '%s'" % (source.path, source.unpacked))
if source.needs_repack(options):
gbp.log.debug("Filter pristine-tar: repacking '%s' from '%s'" % (source.path, source.unpacked))
(source, tmpdir) = repack_source(source, sourcepackage, version, tmpdir, options.filters)
pristine_orig = symlink_orig(source.path, sourcepackage, version)
# Don't mess up our repo with git metadata from an upstream tarball
try:
if os.path.isdir(os.path.join(source.unpacked, '.git/')):
raise GbpError, "The orig tarball contains .git metadata - giving up."
except OSError:
pass
try:
upstream_branch = [ options.upstream_branch, 'master' ][is_empty]
filter_msg = ["", " (filtering out %s)"
% options.filters][len(options.filters) > 0]
gbp.log.info("Importing '%s' to branch '%s'%s..." % (source.path,
upstream_branch,
filter_msg))
gbp.log.info("Source package is %s" % sourcepackage)
gbp.log.info("Upstream version is %s" % version)
import_branch = [ options.upstream_branch, None ][is_empty]
msg = upstream_import_commit_msg(options, version)
if options.vcs_tag:
parents = [repo.rev_parse("%s^{}" % options.vcs_tag)]
else:
parents = None
commit = repo.commit_dir(source.unpacked,
msg=msg,
branch=import_branch,
other_parents=parents,
)
if not commit:
raise GbpError, "Import of upstream version %s failed." % version
if options.pristine_tar:
if pristine_orig:
repo.pristine_tar.commit(pristine_orig, upstream_branch)
else:
gbp.log.warn("'%s' not an archive, skipping pristine-tar" % source.path)
tag = repo.version_to_tag(options.upstream_tag, version)
repo.create_tag(name=tag,
msg="Upstream version %s" % version,
commit=commit,
sign=options.sign_tags,
keyid=options.keyid)
if is_empty:
repo.create_branch(options.upstream_branch, rev=commit)
repo.force_head(options.upstream_branch, hard=True)
elif options.merge:
gbp.log.info("Merging to '%s'" % options.debian_branch)
repo.set_branch(options.debian_branch)
try:
repo.merge(tag)
except gbpc.CommandExecFailed:
raise GbpError, """Merge failed, please resolve."""
if options.postimport:
epoch = ''
if os.access('debian/changelog', os.R_OK):
# No need to check the changelog file from the
# repository, since we're certain that we're on
# the debian-branch
cp = ChangeLog(filename='debian/changelog')
if cp.has_epoch():
epoch = '%s:' % cp.epoch
info = { 'version': "%s%s-1" % (epoch, version) }
env = { 'GBP_BRANCH': options.debian_branch }
gbpc.Command(options.postimport % info, extra_env=env, shell=True)()
except gbpc.CommandExecFailed:
raise GbpError, "Import of %s failed" % source.path
except GbpNothingImported, err:
gbp.log.err(err)
repo.set_branch(initial_branch)
ret = 1
except GbpError, err:
if len(err.__str__()):
gbp.log.err(err)
ret = 1
if tmpdir:
cleanup_tmp_tree(tmpdir)
if not ret:
gbp.log.info("Successfully imported version %s of %s" % (version, source.path))
return ret
if __name__ == "__main__":
sys.exit(main(sys.argv))
# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
|