mirror of
https://github.com/rpm-software-management/tito.git
synced 2025-02-24 04:32:46 +00:00
Replace external sources in spec file copy during build.
This commit is contained in:
parent
199f332d4d
commit
381debd36b
3 changed files with 73 additions and 15 deletions
|
@ -1116,12 +1116,17 @@ class ExternalSourceBuilder(ConfigObject, BuilderBase):
|
||||||
user_config=user_config, args=args, **kwargs)
|
user_config=user_config, args=args, **kwargs)
|
||||||
|
|
||||||
# Project directory where we started this build:
|
# Project directory where we started this build:
|
||||||
self.pkg_dir = os.getcwd()
|
self.start_dir = os.getcwd()
|
||||||
|
|
||||||
self.build_tag = '%s-%s' % (self.project_name,
|
self.build_tag = '%s-%s' % (self.project_name,
|
||||||
get_spec_version_and_release(self.pkg_dir,
|
get_spec_version_and_release(self.start_dir,
|
||||||
'%s.spec' % self.project_name))
|
'%s.spec' % self.project_name))
|
||||||
|
|
||||||
|
# Assuming we're still in the start directory, get the absolute path
|
||||||
|
# to all sources specified:
|
||||||
|
self.manual_sources = [os.path.abspath(s) for s in kwargs['sources']]
|
||||||
|
debug("Got sources: %s" % self.manual_sources)
|
||||||
|
|
||||||
def tgz(self):
|
def tgz(self):
|
||||||
self.ran_tgz = True
|
self.ran_tgz = True
|
||||||
self._create_build_dirs()
|
self._create_build_dirs()
|
||||||
|
@ -1133,24 +1138,66 @@ class ExternalSourceBuilder(ConfigObject, BuilderBase):
|
||||||
self.spec_file = os.path.join(self.rpmbuild_sourcedir,
|
self.spec_file = os.path.join(self.rpmbuild_sourcedir,
|
||||||
'%s.spec' % self.project_name)
|
'%s.spec' % self.project_name)
|
||||||
shutil.copyfile(
|
shutil.copyfile(
|
||||||
os.path.join(self.pkg_dir, '%s.spec' % self.project_name),
|
os.path.join(self.start_dir, '%s.spec' % self.project_name),
|
||||||
self.spec_file)
|
self.spec_file)
|
||||||
print(" %s.spec" % self.project_name)
|
print(" %s.spec" % self.project_name)
|
||||||
|
|
||||||
# TODO: Make this a configurable strategy:
|
# TODO: Make this a configurable strategy:
|
||||||
files_in_src_dir = [f for f in os.listdir(self.pkg_dir) \
|
i = 0
|
||||||
if os.path.isfile(os.path.join(self.pkg_dir, f)) ]
|
replacements = []
|
||||||
print files_in_src_dir
|
for s in self.manual_sources:
|
||||||
for f in files_in_src_dir:
|
base_name = os.path.basename(s)
|
||||||
shutil.copyfile(os.path.join(self.pkg_dir, f),
|
dest_filepath = os.path.join(self.rpmbuild_sourcedir, base_name)
|
||||||
os.path.join(self.rpmbuild_sourcedir, f))
|
shutil.copyfile(s, dest_filepath)
|
||||||
|
self.sources.append(dest_filepath)
|
||||||
|
|
||||||
|
# Add a line to replace in the spec for each source:
|
||||||
|
source_regex = re.compile("^(source%s:\s*)(.+)$" % i, re.IGNORECASE)
|
||||||
|
new_line = "Source%s: %s" % (i, base_name)
|
||||||
|
replacements.append((source_regex, new_line))
|
||||||
|
|
||||||
|
# Replace version and release in spec:
|
||||||
|
version_regex = re.compile("^(version:\s*)(.+)$", re.IGNORECASE)
|
||||||
|
release_regex = re.compile("^(release:\s*)(.+)$", re.IGNORECASE)
|
||||||
|
|
||||||
|
self.replace_in_spec(replacements)
|
||||||
|
|
||||||
# Copy every normal file in the directory we ran tito from. This
|
# Copy every normal file in the directory we ran tito from. This
|
||||||
# will pick up any sources that were sitting around locally.
|
# will pick up any sources that were sitting around locally.
|
||||||
# TODO: how to copy only sources?
|
# TODO: how to copy only sources?
|
||||||
cmd = "/usr/bin/spectool --list-files '%s' | awk '{print $2}' |xargs -l1 --no-run-if-empty basename " % self.spec_file
|
#files_in_src_dir = [f for f in os.listdir(self.start_dir) \
|
||||||
result = run_command(cmd)
|
# if os.path.isfile(os.path.join(self.start_dir, f)) ]
|
||||||
self.sources = map(lambda x: os.path.join(self.rpmbuild_sourcedir, x), result.split("\n"))
|
#print files_in_src_dir
|
||||||
print(" Sources: %s" % self.sources)
|
#for f in files_in_src_dir:
|
||||||
|
# shutil.copyfile(os.path.join(self.start_dir, f),
|
||||||
|
# os.path.join(self.rpmbuild_sourcedir, f))
|
||||||
|
# TODO: extract version/release from filename?
|
||||||
|
# TODO: what filename?
|
||||||
|
#cmd = "/usr/bin/spectool --list-files '%s' | awk '{print $2}' |xargs -l1 --no-run-if-empty basename " % self.spec_file
|
||||||
|
#result = run_command(cmd)
|
||||||
|
#self.sources = map(lambda x: os.path.join(self.rpmbuild_sourcedir, x), result.split("\n"))
|
||||||
|
|
||||||
|
def replace_in_spec(self, replacements):
|
||||||
|
"""
|
||||||
|
Replace lines in the spec file using the given replacements.
|
||||||
|
|
||||||
|
Replacements are a tuple of a regex to look for, and a new line to
|
||||||
|
substitute in when the regex matches.
|
||||||
|
|
||||||
|
Replaces all lines with one pass through the file.
|
||||||
|
"""
|
||||||
|
in_f = open(self.spec_file, 'r')
|
||||||
|
out_f = open(self.spec_file + ".new", 'w')
|
||||||
|
for line in in_f.readlines():
|
||||||
|
for line_regex, new_line in replacements:
|
||||||
|
match = re.match(line_regex, line)
|
||||||
|
if match:
|
||||||
|
line = new_line
|
||||||
|
out_f.write(line)
|
||||||
|
|
||||||
|
in_f.close()
|
||||||
|
out_f.close()
|
||||||
|
shutil.move(self.spec_file + ".new", self.spec_file)
|
||||||
|
|
||||||
def _get_rpmbuild_dir_options(self):
|
def _get_rpmbuild_dir_options(self):
|
||||||
return ('--define "_sourcedir %s" --define "_builddir %s" '
|
return ('--define "_sourcedir %s" --define "_builddir %s" '
|
||||||
|
|
|
@ -362,6 +362,12 @@ class BuildModule(BaseCliModule):
|
||||||
default='',
|
default='',
|
||||||
metavar="COLLECTION", help="Build package for software collection.")
|
metavar="COLLECTION", help="Build package for software collection.")
|
||||||
|
|
||||||
|
# TODO: this is specific to the external source builder, implement a way for builders
|
||||||
|
# to inject additional cli options if they are configured.
|
||||||
|
self.parser.add_option("--source", dest="sources",
|
||||||
|
action="append", metavar="SOURCE_FILE",
|
||||||
|
help="Manually specified source file to be replaced in spec during build.")
|
||||||
|
|
||||||
def main(self, argv):
|
def main(self, argv):
|
||||||
BaseCliModule.main(self, argv)
|
BaseCliModule.main(self, argv)
|
||||||
|
|
||||||
|
@ -384,6 +390,7 @@ class BuildModule(BaseCliModule):
|
||||||
'auto_install': self.options.auto_install,
|
'auto_install': self.options.auto_install,
|
||||||
'rpmbuild_options': self.options.rpmbuild_options,
|
'rpmbuild_options': self.options.rpmbuild_options,
|
||||||
'scl': self.options.scl,
|
'scl': self.options.scl,
|
||||||
|
'sources': self.options.sources,
|
||||||
}
|
}
|
||||||
|
|
||||||
builder = create_builder(package_name, build_tag,
|
builder = create_builder(package_name, build_tag,
|
||||||
|
|
|
@ -70,9 +70,12 @@ class ExternalSourceBuilderTests(TitoGitTestFixture):
|
||||||
self.create_project_from_spec(EXT_SRC_PKG, pkg_dir=self.pkg_dir,
|
self.create_project_from_spec(EXT_SRC_PKG, pkg_dir=self.pkg_dir,
|
||||||
spec=spec,
|
spec=spec,
|
||||||
builder='tito.builder.ExternalSourceBuilder')
|
builder='tito.builder.ExternalSourceBuilder')
|
||||||
run_command('touch %s/extsrc-0.0.1.tar.gz' % self.pkg_dir)
|
self.source_filename = 'extsrc-0.0.2.tar.gz'
|
||||||
os.chdir(self.pkg_dir)
|
os.chdir(self.pkg_dir)
|
||||||
|
|
||||||
|
# Make a fake source file, do we need something more real?
|
||||||
|
run_command('touch %s' % self.source_filename)
|
||||||
|
|
||||||
self.output_dir = tempfile.mkdtemp("-titotestoutput")
|
self.output_dir = tempfile.mkdtemp("-titotestoutput")
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -83,7 +86,8 @@ class ExternalSourceBuilderTests(TitoGitTestFixture):
|
||||||
# We have not tagged here. Build --rpm should just work:
|
# We have not tagged here. Build --rpm should just work:
|
||||||
self.assertFalse(os.path.exists(
|
self.assertFalse(os.path.exists(
|
||||||
os.path.join(self.pkg_dir, 'rel-eng/packages/extsrc')))
|
os.path.join(self.pkg_dir, 'rel-eng/packages/extsrc')))
|
||||||
tito('build --rpm --output=%s --no-cleanup' % self.output_dir)
|
tito('build --rpm --output=%s --no-cleanup --source=%s --debug' %
|
||||||
|
(self.output_dir, self.source_filename))
|
||||||
self.assertTrue(os.path.exists(
|
self.assertTrue(os.path.exists(
|
||||||
os.path.join(self.output_dir, 'extsrc-0.0.1-1.fc20.src.rpm')))
|
os.path.join(self.output_dir, 'extsrc-0.0.1-1.fc20.src.rpm')))
|
||||||
self.assertTrue(os.path.exists(
|
self.assertTrue(os.path.exists(
|
||||||
|
|
Loading…
Add table
Reference in a new issue