Remove ruby, golang and cargo build patterns

These patterns are being removed as they are not used or are going to
be reworked.

This change also removes support for multi-versioned packages which
were considered for go and cargo purposes.

Signed-off-by: William Douglas <william.douglas@intel.com>
This commit is contained in:
William Douglas
2023-03-16 12:40:18 -07:00
committed by William Douglas
parent 7168764db4
commit 74c0833cf4
20 changed files with 33 additions and 1193 deletions
+2 -14
View File
@@ -325,7 +325,6 @@ build_pattern
* R: R language package
* cpan: perl language package
* ruby: ruby language package
* configure: Traditional ``%configure`` autotools route
* configure_ac: Like ``configure``, but performs ``%reconfigure`` to
regenerate ``./configure``
@@ -339,9 +338,6 @@ build_pattern
* distutils3: Only build the Pythonic package with Python 3
* pyproject: Build the Pythonic package using the PEP 516 method
* meson: Build package with Meson/Ninja
* golang: Build Go package
* godep: A go dependency-only package
* \[WIP\] cargo: Build Rust package with Cargo
* \[WIP\] scons: Build package with Scons
series
@@ -367,14 +363,6 @@ pypi_overrides
+ 'colorama',
```
golang_libpath
When building go packages, the go import path will be guessed automatically
(e.g. building ``https://github.com/go-yaml/yaml/`` would get
``github.com/go-yaml/yaml``). While this is handy, it's not always correct (in
the previous example, the correct import path should be ``gopkg.in/yaml.v2``).
This could be easily fixed by placing ``gopkg.in/yaml.v`` in this file,
changing where the go bits will be placed.
service_restart
Each line in the file specifies the full path to a systemd unit file
installed by this package that should be restarted by clr-service-restart_.
@@ -616,8 +604,8 @@ For websites such as ``bitbucket`` or ``GitHub``, using ``get$`` and
``v$.tar.*`` style links, the project name itself is used from the URL and the
version is determined by stripping down the tag.
CPAN Perl packages, R packages, and rubygems.org rubygems are automatically
prefixed with their language name: ``perl-``, ``R-`` and ``rubygem-``
CPAN Perl packages, pypi ecosystem packages and R packages are automatically
prefixed with their respective names: ``perl-``, ``pypi-`` and ``R-``
respectively.
When these automated detections are not desirable, it is possible to override
-1
View File
@@ -210,7 +210,6 @@ def package(args, url, name, archives, workingdir):
filemanager = files.FileManager(conf, package)
content = tarball.Content(url, name, args.version, archives, conf, workingdir)
content.process(filemanager)
conf.create_versions(content.multi_version)
conf.content = content # hack to avoid recursive dependency on init
# Search up one level from here to capture multiple versions
_dir = content.path
-10
View File
@@ -139,16 +139,6 @@ class Build(object):
if not s:
return
self.must_restart += requirements.add_buildreq(f"pypi({s.lower().replace('-', '_')})", cache=True)
elif buildtool == 'ruby':
if s in config.gems:
self.must_restart += requirements.add_buildreq(config.gems[s], cache=True)
else:
self.must_restart += requirements.add_buildreq('rubygem-%s' % s, cache=True)
elif buildtool == 'ruby table':
if s in config.gems:
self.must_restart += requirements.add_buildreq(config.gems[s], cache=True)
else:
print("Unknown ruby gem match", s)
elif buildtool == 'catkin':
self.must_restart += requirements.add_pkgconfig_buildreq(s, config.config_opts.get('32bit'), cache=True)
self.must_restart += requirements.add_buildreq(s, cache=True)
-110
View File
@@ -174,50 +174,6 @@ def parse_modules_list(modules_string, is_cmake=False):
return res
def parse_go_mod(path):
"""Parse go.mod file for build requirements.
File content looks as follows:
module example.com/foo/bar
require (
github.com/BurntSushi/toml v0.3.1
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999
github.com/inconshreveable/mousetrap v1.0.0 // indirect
"github.com/spf13/cobra" v0.0.3
github.com/spf13/pflag v1.0.3 // indirect
)
Need to handle all require lines including //indirect.
Skip requires that use .git for now. May need to be handled
differently.
"""
reqs = []
with open(path, "r") as gfile:
dep_start = False
for line in gfile.readlines():
# Ideally the mod file is generated and the format is
# always correct but add a few defenses just in case
line = line.strip()
if line.startswith("//"):
# Skip comments
continue
if dep_start:
# End of the require section
if line.startswith(")"):
break
req = line.split()[:2]
req[0] = req[0].replace('"', '')
if req[0].endswith(".git"):
continue
reqs.append(req)
continue
if line.startswith("require ("):
dep_start = True
return reqs
def _get_desc_field(field, desc):
"""Get a field value from an R package DESCRIPTION file.
@@ -324,7 +280,6 @@ class Requirements(object):
self.extra_cmake = set()
self.extra_cmake_openmpi = set()
self.verbose = False
self.cargo_bin = False
self.pypi_provides = None
self.banned_buildreqs = set(["llvm-devel",
"gcj",
@@ -499,25 +454,6 @@ class Requirements(object):
self.configure_ac_line(buf, config.config_opts.get('32bit'))
f.close()
def parse_cargo_toml(self, filename, config):
"""Update build requirements using Cargo.toml.
Set the build requirements for building rust programs using cargo.
"""
config.set_build_pattern("cargo", 1)
if config.default_pattern != "cargo":
return
self.add_buildreq("rustc")
with util.open_auto(filename, "r") as ctoml:
cargo = toml.loads(ctoml.read())
if cargo.get("bin") or os.path.exists(os.path.join(os.path.dirname(filename), "src/main.rs")):
self.cargo_bin = True
if not cargo.get("dependencies"):
return
for cdep in cargo["dependencies"]:
if self.add_buildreq(cdep):
self.add_requires(cdep, config.os_packages)
def parse_r_description(self, filename, packages):
"""Update build/runtime requirements according to the R package description."""
deps = []
@@ -538,27 +474,6 @@ class Requirements(object):
def set_build_req(self, config):
"""Add build requirements based on the build pattern."""
if config.default_pattern == "ruby":
self.add_buildreq("ruby")
self.add_buildreq("rubygem-rdoc")
if config.default_pattern == "cargo":
self.add_buildreq("rustc")
def rakefile(self, filename, gems):
"""Scan Rakefile for build requirements."""
with util.open_auto(filename, "r") as f:
lines = f.readlines()
pat = re.compile(r"^require '(.*)'$")
for line in lines:
match = pat.search(line)
if match:
s = match.group(1)
if s != "rubygems" and s in gems:
print("Rakefile-dep: " + gems[s])
self.add_buildreq(gems[s])
else:
print("Rakefile-new: rubygem-" + s)
def parse_cmake(self, filename, cmake_modules, conf32):
"""Scan a .cmake or CMakeLists.txt file for what's it's actually looking for."""
@@ -794,8 +709,6 @@ class Requirements(object):
self.add_buildreq("buildreq-distutils36")
elif config.default_pattern == "distutils3":
self.add_buildreq("buildreq-distutils3")
elif config.default_pattern == "golang":
self.add_buildreq("buildreq-golang")
elif config.default_pattern == "cmake":
self.add_buildreq("buildreq-cmake")
elif config.default_pattern == "configure":
@@ -818,27 +731,8 @@ class Requirements(object):
for dirpath, _, files in os.walk(dirn):
default_score = 2 if dirpath == dirn else 1
if any(f.endswith(".go") for f in files):
self.add_buildreq("buildreq-golang")
config.set_build_pattern("golang", default_score)
if "go.mod" in files:
if "Makefile" not in files and "makefile" not in files:
# Go packages usually have make build systems so far
# so only use go directly if we can't find a Makefile
config.set_build_pattern("golang", default_score)
self.add_buildreq("buildreq-golang")
if config.default_pattern == "golang-mod" or config.default_pattern == "godep":
config.set_gopath = False
mod_path = os.path.join(dirpath, "go.mod")
reqs = parse_go_mod(mod_path)
for req in reqs:
# req[0] is a SCM url segment in the form, repo/XXX/dependency-name
# req[1] is the version of the dependency
pkg = "go-" + req[0].replace("/", "-")
self.add_buildreq(pkg)
if config.default_pattern == "godep":
self.add_requires(pkg, config.os_packages)
if "CMakeLists.txt" in files and "configure.ac" not in files:
self.add_buildreq("buildreq-cmake")
@@ -892,12 +786,8 @@ class Requirements(object):
config.set_build_pattern("meson", default_score)
for name in files:
if name.lower() == "cargo.toml" and dirpath == dirn:
self.parse_cargo_toml(os.path.join(dirpath, name), config)
if name.lower().startswith("configure."):
self.parse_configure_ac(os.path.join(dirpath, name), config)
if name.lower().startswith("rakefile") and config.default_pattern == "ruby":
self.rakefile(os.path.join(dirpath, name), config.gems)
if name.endswith(".pro") and config.default_pattern == "qmake":
self.qmake_profile(os.path.join(dirpath, name), config.qt_modules)
if name.lower() == "makefile":
-2
View File
@@ -93,8 +93,6 @@ def scan_for_tests(src_dir, config, requirements, content):
"perlcheck": perl_check,
"setup.py": setup_check,
"cmake": "cd clr-build; " + cmake_check,
"rakefile": "pushd %{buildroot}%{gem_dir}/gems/" + content.tarball_prefix + "\nrake --trace test TESTOPTS=\"-v\"\npopd",
"rspec": "pushd %{buildroot}%{gem_dir}/gems/" + content.tarball_prefix + "\nrspec -I.:lib spec/\npopd",
"meson": meson_check,
}
if config.config_opts.get('32bit'):
+1 -82
View File
@@ -105,7 +105,6 @@ class Config(object):
self.autoreconf = False
self.custom_desc = ""
self.custom_summ = ""
self.set_gopath = True
self.license_fetch = None
self.license_show = None
self.git_uri = None
@@ -131,16 +130,12 @@ class Config(object):
self.download_path = download_path
self.default_pattern = "make"
self.pattern_strength = 0
self.sources = {"unit": [], "gcov": [], "tmpfile": [], "sysuser": [], "archive": [], "destination": [], "godep": [], "version": []}
self.sources = {"unit": [], "gcov": [], "tmpfile": [], "sysuser": [], "archive": [], "destination": []}
self.archive_details = {}
self.conf_args_openmpi = '--program-prefix= --exec-prefix=$MPI_ROOT \\\n' \
'--libdir=$MPI_LIB --bindir=$MPI_BIN --sbindir=$MPI_BIN --includedir=$MPI_INCLUDE \\\n' \
'--datarootdir=$MPI_ROOT/share --mandir=$MPI_MAN -exec-prefix=$MPI_ROOT --sysconfdir=$MPI_SYSCONFIG \\\n' \
'--build=x86_64-generic-linux-gnu --host=x86_64-generic-linux-gnu --target=x86_64-clr-linux-gnu '
# Keep track of the package versions
self.versions = OrderedDict()
# Only parse the versions file once, and save the result for later
self.parsed_versions = OrderedDict()
# defines which files to rename and copy to autospec directory,
# used in commitmessage.py
self.transforms = {
@@ -257,8 +252,6 @@ class Config(object):
(r".*\.go:.*cannot find package \"(.*)\" in any of:", 0, 'go'),
(r"/usr/bin/env\: (.*)\: No such file or directory", 0, None),
(r"/usr/bin/python.*\: No module named (.*)", 0, None),
(r":in `require': cannot load such file -- ([a-zA-Z0-9\-\_:\/]+)", 0, 'ruby table'),
(r":in `require': cannot load such file -- ([a-zA-Z0-9\-\_:]+) ", 0, 'ruby'),
(r"Add the installation prefix of \"(.*)\" to CMAKE_PREFIX_PATH", 0, None),
(r"By not providing \"([a-zA-Z0-9]+).cmake\" in CMAKE_MODULE_PATH this project", 0, None),
(r"C library '(.*)' not found", 0, None),
@@ -268,24 +261,18 @@ class Config(object):
(r"Checking for (.*?)\.\.\.no", 0, None),
(r"Checking for (.*?)\s*: not found", 0, None),
(r"Checking for (.*?)\s>=.*\s*: not found", 0, None),
(r"Could not find '([a-zA-Z0-9\-\_]*)' \([~<>=]+ ([0-9.]+).*\) among [0-9]+ total gem", 0, 'ruby'),
(r"Could not find gem '([a-zA-Z0-9\-\_]+) \([~<>=0-9\.\, ]+\) ruby'", 0, 'ruby'),
(r"Could not find suitable distribution for Requirement.parse\('([a-zA-Z\-\.]*)", 0, None),
(r"Download error on https://pypi.python.org/simple/([a-zA-Z0-9\-\._:]+)/", 0, 'pypi'),
(r"Downloading https?://.*\.python\.org/packages/.*/.?/([A-Za-z]*)/.*", 0, None),
(r"ERROR: Could not find a valid gem '([a-zA-Z0-9\-\_\:]*)' \([>=]+ ([0-9.]+).*\)", 0, 'ruby'),
(r"ERROR: dependencies [']([a-zA-Z0-9\-\.]*)['].* are not available for package ['].*[']", 0, 'R'),
(r"ERROR: dependencies ['].*['], [']([a-zA-Z0-9\-\.]*)['],.* are not available for package ['].*[']", 0, 'R'),
(r"ERROR: dependencies.*[']([a-zA-Z0-9\-\.]*)['] are not available for package ['].*[']", 0, 'R'),
(r"ERROR: dependency [']([a-zA-Z0-9\-\.]*)['] is not available for package ['].*[']", 0, 'R'),
(r"Error: Unable to find (.*)", 0, None),
(r"Error: package [']([a-zA-Z0-9\-\.]*)['] required by", 0, 'R'),
(r"Gem::LoadError: Could not find '([a-zA-Z0-9\-\_]*)'", 0, 'ruby'),
(r"ImportError:.* No module named '?([a-zA-Z0-9\-\._]+)'?", 0, 'pypi'),
(r"ImportError\: ([a-zA-Z]+) module missing", 0, None),
(r"ImportError\: (?:No module|cannot import) named? (.*)", 0, None),
(r"LoadError: cannot load such file -- ([a-zA-Z0-9\-:\/\_]+)", 0, 'ruby table'),
(r"LoadError: cannot load such file -- ([a-zA-Z0-9\-:]+)/.*", 0, 'ruby'),
(r"ModuleNotFoundError.*No module named (.*)", 0, None),
(r"Native dependency '(.*)' not found", 0, "pkgconfig"),
(r"No library found for -l([a-zA-Z\-])", 0, None),
@@ -300,13 +287,11 @@ class Config(object):
(r"Target '[a-zA-Z0-9\-]' can't be generated as '(.*)' could not be found", 0, None),
(r"Unable to `import (.*)`", 0, None),
(r"Unable to find '(.*)'", 0, None),
(r"WARNING: [a-zA-Z\-\_]+ dependency on ([a-zA-Z0-9\-\_:]*) \([<>=~]+ ([0-9.]+).*\) .*", 0, 'ruby'),
(r"Warning: prerequisite ([a-zA-Z:]+) [0-9\.]+ not found.", 0, 'perl'),
(r"Warning\: no usable ([a-zA-Z0-9]+) found", 0, None),
(r"You need ([a-zA-Z0-9\-\_]*) to build this program.", 1, None),
(r"[Dd]ependency (.*) found: NO \(tried pkgconfig(?: and cmake)?\)", 0, 'pkgconfig'),
(r"[Dd]ependency (.*) found: NO", 0, None),
(r"[a-zA-Z0-9\-:]* is not installed: cannot load such file -- rdoc/([a-zA-Z0-9\-:]*)", 0, 'ruby'),
(r"\/bin\/ld: cannot find (-l[a-zA-Z0-9\_]+)", 0, None),
(r"^.*By not providing \"Find(.*).cmake\" in CMAKE_MODULE_PATH this.*$", 0, None),
(r"^.*Could not find a package configuration file provided by \"(.*)\".*$", 0, None),
@@ -354,18 +339,6 @@ class Config(object):
if ".cpan.org/" in url or ".metacpan.org/" in url:
self.set_build_pattern("cpan", 10)
# ruby
if "rubygems.org/" in url:
self.set_build_pattern("ruby", 10)
# rust crate
if "crates.io" in url:
self.set_build_pattern("cargo", 10)
# go dependency
if "proxy.golang.org" in url:
self.set_build_pattern("godep", 10)
# php modules from PECL
if "pecl.php.net" in url:
self.set_build_pattern("phpize", 10)
@@ -487,16 +460,6 @@ class Config(object):
cachefile.write("\n".join([version] + pkgs))
self.config_files.add('buildreq_cache')
def create_versions(self, versions):
"""Make versions file."""
with open(os.path.join(self.download_path, "versions"), 'w') as vfile:
for version in versions:
vfile.write(version)
if versions[version]:
vfile.write('\t' + versions[version])
vfile.write('\n')
self.config_files.add("versions")
def read_config_opts(self):
"""Read config options from path/options.conf."""
opts_path = os.path.join(self.download_path, 'options.conf')
@@ -690,40 +653,6 @@ class Config(object):
if patch not in self.old_patches and patch.endswith(".patch") and patch.startswith("cve-"):
self.cves.append(patch.upper().split(".PATCH")[0])
def parse_config_versions(self):
"""Parse the versions configuration file."""
# Only actually parse it the first time around
if not self.parsed_versions:
for line in self.read_conf_file(os.path.join(self.download_path, "versions")):
# Simply whitespace-separated fields
fields = line.split()
version = fields.pop(0)
if len(fields):
url = fields.pop(0)
else:
url = ""
# Catch and report duplicate URLs in the versions file. Don't stop,
# but assume only the first one is valid and drop the rest.
if version in self.parsed_versions and url != self.parsed_versions[version]:
print_warning("Already have a URL defined for {}: {}"
.format(version, self.parsed_versions[version]))
print_warning("Dropping {}, but you should check my work"
.format(url))
else:
self.parsed_versions[version] = url
if len(fields):
print_warning("Extra fields detected in `versions` file entry:\n{}"
.format(line))
print_warning("I'll delete them, but you should check my work")
# We'll combine what we just parsed from the versions file with any other
# versions that have already been defined, most likely the version actually
# provided in the Makefile's URL variable, so we don't drop any.
for version in self.parsed_versions:
self.versions[version] = self.parsed_versions[version]
return self.versions
def write_default_conf_file(self, name, wrapper, description):
"""Write default configuration file with description to file name."""
self.config_files.add(name)
@@ -950,12 +879,7 @@ class Config(object):
stderr=subprocess.DEVNULL) == 0:
self.autoreconf = True
# Parse the version-specific patch lists
update_security_sensitive = False
for versionp in self.versions:
self.verpatches[versionp] = self.read_conf_file(os.path.join(self.download_path, '.'.join(['series', versionp])))
if any(p.lower().startswith('cve-') for p in self.verpatches[versionp]):
update_security_sensitive = True
if any(p.lower().startswith('cve-') for p in self.patches):
update_security_sensitive = True
@@ -1046,11 +970,6 @@ class Config(object):
if not license.add_license(word, self.license_translations, self.license_blacklist):
print_warning("{}: blacklisted license {} ignored.".format(self.content.name + ".license", word))
content = self.read_conf_file(os.path.join(self.download_path, "golang_libpath"))
if content and content[0]:
self.content.golibpath = content[0]
print("golibpath : {}".format(self.content.golibpath))
if self.config_opts['use_clang']:
self.config_opts['funroll-loops'] = False
requirements.add_buildreq("llvm")
-2
View File
@@ -844,7 +844,6 @@ gdesktop-enums.h, gsettings-desktop-schemas-dev
gdk-pixbuf-xlib-2.0, gdk-pixbuf-dev
gdm, gdm-dev
gee-0.8, libgee-dev
gem, ruby
geoclue-2.0, geoclue-dev
geocode-glib-1.0, geocode-glib-dev
geos-config, geos-dev
@@ -1252,7 +1251,6 @@ qtattributionsscanner, qttools-dev
qtplugininfo, qttools-dev
qtwaylandscanner, qtwayland-dev
qvkgen, qtbase-dev
rake, rubygem-rake
raptor, raptor2-dev
rasqal, rasqal-dev
rcc, qtbase-dev
+1 -1
View File
@@ -382,7 +382,7 @@ class FileManager(object):
(r"^/usr/share/", "data"),
(r"^/usr/lib/perl5/", "perl", "/usr/lib/perl5/*"),
# finally move any dynamically loadable plugins (not
# perl/python/ruby/etc.. extensions) into lib package
# perl/python/etc.. extensions) into lib package
(r"^/usr/lib/.*/[a-zA-Z0-9._+-]*\.so", "lib"),
(r"^/usr/lib64/.*/[a-zA-Z0-9._+-]*\.so", "lib"),
(r"^/usr/lib32/.*/[a-zA-Z0-9._+-]*\.so", "lib32"),
-33
View File
@@ -1,33 +0,0 @@
# This file contains failure patterns and the ruby gems they are associated with
# in the form: <pattern>, <gem>
# This file is sorted with LC_COLLATE=C
# Lines beginning with '#' are ignored.
action_view/helpers/sanitize_helper, rubygem-actionview
appraisal/file, rubygem-appraisal
benchmark/ips, rubygem-benchmark-ips
builder, rubygem-builder
bundler, rubygem-bundler
bundler/gem_tasks, rubygem-rubygems-tasks
bundler/setup, rubygem-bundler
echoe, rubygem-echoe
gem_hadar, rubygem-gem_hadar
gherkin/rubify, rubygem-gherkin
guard/compat/test/helper, rubygem-guard-compat
hoe, rubygem-hoe
html/pipeline, rubygem-html-pipeline
minitest/autorun, rubygem-minitest
minitest/unit, rubygem-minitest
mocha/setup, rubygem-mocha
nokogiri/diff, rubygem-nokogiri-diff
pdf/reader, rubygem-pdf-reader
pry, rubygem-pry
rack/test, rubygem-rack-test
rack/utils, rubygem-rack
rake/extensiontask, rubygem-rake-compiler
redcarpet, rubygem-redcarpet
rspec/core, rubygem-rspec-core
rspec/core/rake_task, rubygem-rspec-core
rspec/its, rubygem-rspec-its
rspec/mocks, rubygem-rspec-mocks
sass, rubygem-sass
test/unit, rubygem-test-unit
+1 -57
View File
@@ -39,7 +39,6 @@ pubkey --gnupghome /opt/pki/gpghome
""".format(fn=__file__)
SEPT = "-------------------------------------------------------------------------------"
RUBYORG_API = "https://rubygems.org/api/v1/versions/{}.json"
PYPIORG_API = "https://pypi.python.org/pypi/{}/json"
KEYID_TRY = ""
KEYID = ""
@@ -596,57 +595,6 @@ def quit_verify():
Verifier.quit()
# GEM Verifier
class GEMShaVerifier(Verifier):
"""Verify signatures for ruby gems."""
def __init__(self, **kwargs):
"""Initialize gem verification."""
self.package_path = kwargs.get('package_path', None)
Verifier.__init__(self, **kwargs)
@staticmethod
def get_rubygems_info(package_name):
"""Get json dump of ruby gem."""
url = RUBYORG_API.format(package_name)
data = download.do_curl(url)
if data:
return json.loads(data.getvalue().decode('utf-8'))
else:
return None
@staticmethod
def get_gemnumber_sha(gems, number):
"""Get sha for a gem based on the gem's number."""
mygem = [gem for gem in gems if gem.get('number', -100) == number]
if len(mygem) == 1:
return mygem[0].get('sha', None)
else:
return None
def verify(self):
"""Verify ruby gem based on sha sum."""
gemname = os.path.basename(self.package_path).replace('.gem', '')
util.print_info("Verifying SHA256 checksum")
if os.path.exists(self.package_path) is False:
self.print_result(False, 'GEM was not found {}'.format(self.package_path))
return
name, _ = re.split(r'-\d+\.', gemname)
number = gemname.replace(name + '-', '')
geminfo = GEMShaVerifier.get_rubygems_info(name)
gemsha = GEMShaVerifier.get_gemnumber_sha(geminfo, number)
if geminfo is None:
self.print_result(False, "unable to parse info for gem {}".format(gemname))
else:
calcsha = self.calc_sum(self.package_path, hashlib.sha256)
self.print_result(gemsha == calcsha)
result = gemsha == calcsha
if result is False:
self.quit()
return result
VERIFIER_TYPES = {
'.gz': GPGVerifier,
'.tgz': GPGVerifier,
@@ -654,7 +602,6 @@ VERIFIER_TYPES = {
'.bz2': GPGVerifier,
'.xz': GPGVerifier,
'.zip': GPGVerifier,
'.gem': GEMShaVerifier,
}
@@ -894,10 +841,7 @@ def check(url, config, interactive=True):
verified = None
if package_check is not None:
verified = from_disk(url, package_path, package_check, config, interactive=interactive)
if not verified and package_path[-4:] == '.gem':
signature_file = get_signature_file(url, config.download_path)
verified = from_disk(url, package_path, signature_file, config, interactive=interactive)
if not verified and package_path[-4:] != '.gem':
if not verified:
util.print_info('None of {}.(asc|sig|sign|sha256) is found in {}'.format(package_name, config.download_path))
signature_file = get_signature_file(url, config.download_path)
if signature_file is not None:
+9 -168
View File
@@ -51,7 +51,6 @@ class Specfile(object):
self.default_desc = ""
self.locales = []
self.build_dirs = dict() # Build directories, indexed by source URL
self.golibpath = ""
self.need_avx2_flags = False
self.need_avx512_flags = False
self.tests_config = ""
@@ -130,8 +129,7 @@ class Specfile(object):
self._write("Version : {}\n".format(self.version))
self._write("Release : {}\n".format(str(self.release)))
self._write("URL : {}\n".format(self.url))
if not self.config.default_pattern == "godep":
self._write("Source0 : {}\n".format(self.url))
self._write("Source0 : {}\n".format(self.url))
def write_sources(self):
"""Append additional source files.
@@ -139,9 +137,8 @@ class Specfile(object):
Append systemd unit files, gcov, and additional source tarballs are the currently supported file types.
"""
count = 0
for source in sorted(self.config.sources["version"] + self.config.sources["unit"] + self.config.sources["archive"]
+ self.config.sources["tmpfile"] + self.config.sources["sysuser"] + self.config.sources["gcov"] # NOQA
+ self.config.sources["godep"]): # NOQA
for source in sorted(self.config.sources["unit"] + self.config.sources["archive"]
+ self.config.sources["tmpfile"] + self.config.sources["sysuser"] + self.config.sources["gcov"]): # NOQA
count += 1
self.source_index[source] = count
if self.config.urlban:
@@ -413,79 +410,16 @@ class Specfile(object):
'-DCMAKE_AR=/usr/bin/gcc-ar -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \\\n'
self._write_strip("{} {} {}".format(cmake_string, self.config.cmake_srcdir, self.extra_cmake_openmpi))
def write_prep(self, ruby_pattern=False):
def write_prep(self):
"""Write prep section to spec file."""
self._write_strip("%prep")
self.write_prep_prepend()
if ruby_pattern:
self._write_strip("gem unpack %{SOURCE0}")
self._write_strip("%setup -q -D -T -n " + self.content.tarball_prefix)
self._write_strip("gem spec %{{SOURCE0}} -l --ruby > {}.gemspec".format(self.name))
prefix = self.content.prefixes[self.url]
if self.config.default_pattern == 'R':
prefix = self.content.tarball_prefix
self._write_strip("%setup -q -n " + prefix)
else:
if self.config.default_pattern == "godep":
# No setup needed each source is installed as is
pass
else:
prefix = self.content.prefixes[self.url]
if self.config.default_pattern == 'R':
prefix = self.content.tarball_prefix
self._write_strip("%setup -q -n " + prefix)
elif prefix:
self._write_strip("%setup -q -n " + prefix)
else:
# Have to make up a path and create it
prefix = os.path.splitext(os.path.basename(self.url))[0]
self._write_strip("%setup -q -c -n " + prefix)
# Keep track of this build dir
self.build_dirs[self.url] = prefix
for archive in self.config.sources["archive"]:
# Skip POM files - they don't need to be extracted
if archive.endswith('.pom'):
continue
# Also JAR files
if archive.endswith('.jar'):
continue
# Patch files
if archive.endswith('.patch'):
continue
# Handle various archive types
extract_cmd = 'tar xf {}'
if archive.endswith('.zip'):
extract_cmd = 'unzip -q {}'
self._write_strip('cd %{_builddir}')
archive_file = os.path.basename(archive)
if self.config.archive_details.get(archive + "prefix"):
self._write_strip(extract_cmd.format('%{_sourcedir}/' + archive_file))
else:
# The archive doesn't have a prefix inside, so we have
# to create it, then extract the archive under the
# created directory, itself beneath BUILD
fake_prefix = os.path.splitext(os.path.basename(archive))[0]
self._write_strip("mkdir -p {}".format(fake_prefix))
self._write_strip("cd {}".format(fake_prefix))
self._write_strip(extract_cmd.format('%{_sourcedir}/' + archive_file))
self._write_strip('cd %{_builddir}/' + prefix)
# Now handle extra versions, indexed by SOURCE
for url in self.config.sources["version"]:
prefix = self.content.prefixes[url]
if prefix:
self._write_strip("cd ..")
self._write_strip("%setup -q -T -n {0} -b {1}"
.format(prefix,
self.source_index[url]))
else:
# Have to make up a path and create it
prefix = os.path.splitext(os.path.basename(url))[0]
self._write_strip("cd ..")
self._write_strip("%setup -q -T -c -n {0} -b {1}"
.format(prefix,
self.source_index[url]))
# Keep track of this build dir
self.build_dirs[url] = prefix
self._write_strip("%setup -q -n " + prefix)
for archive, destination in zip(self.config.sources["archive"], self.config.sources["destination"]):
if destination.startswith(':'):
@@ -561,9 +495,6 @@ class Specfile(object):
else:
lto = "-flto=auto"
if not self.config.set_gopath:
self._write_strip("export GOPROXY=file:///usr/share/goproxy")
if self.config.config_opts['optimize_size']:
if self.config.config_opts['use_clang']:
flags.extend(["-Os", "-ffunction-sections", "-fdata-sections"])
@@ -1481,42 +1412,6 @@ class Specfile(object):
self.write_find_lang()
self.write_check()
def write_ruby_pattern(self):
"""Write build pattern for ruby packages."""
self.write_prep(ruby_pattern=True)
self._write_strip("%build")
self.write_build_prepend()
self.write_proxy_exports()
self._write_strip("export LANG=C.UTF-8")
self._write_strip("gem build {}.gemspec".format(self.name))
self.write_build_append()
self._write_strip("\n")
self._write_strip("%install")
self.write_install_prepend()
self._write_strip("%global gem_dir $(ruby -e'puts Gem.default_dir')")
self._write_strip("gem install -V \\")
self._write_strip(" --local \\")
self._write_strip(" --force \\")
self._write_strip(" --install-dir .%{gem_dir} \\")
self._write_strip(" --bindir .%{_bindir} \\")
self._write_strip(" {}.gem".format(self.content.tarball_prefix))
self._write_strip("\n")
self._write_strip("mkdir -p %{buildroot}%{gem_dir}")
self._write_strip("cp -pa .%{gem_dir}/* \\")
self._write_strip(" %{buildroot}%{gem_dir}")
self._write_strip("\n")
self._write_strip("if [ -d .%{_bindir} ]; then")
self._write_strip(" mkdir -p %{buildroot}%{_bindir}")
self._write_strip(" cp -pa .%{_bindir}/* \\")
self._write_strip(" %{buildroot}%{_bindir}/")
self._write_strip("fi")
self._write_strip("\n")
self.write_find_lang()
self.write_check()
def write_cmake_pattern(self):
"""Write cmake pattern to spec file."""
self.write_prep()
@@ -1647,19 +1542,6 @@ class Specfile(object):
self._write_strip("\n")
self.write_make_install()
def write_cargo_pattern(self):
"""Write cargo build pattern to spec file."""
self.write_prep()
self._write_strip("%build")
self.write_build_prepend()
self.write_proxy_exports()
self._write_strip("cargo build --release")
self.write_build_append()
self._write_strip("\n")
self._write_strip("%install")
self.write_install_prepend()
self.write_license_files()
def write_cpan_pattern(self):
"""Write cpan build pattern to spec file."""
self.write_prep()
@@ -1708,47 +1590,6 @@ class Specfile(object):
self._write_strip("scons install " + self.config.extra_make_install)
self.write_license_files()
def write_golang_pattern(self):
"""Write build pattern for go packages."""
self.write_prep()
self._write_strip("%build")
self.write_build_prepend()
self.write_proxy_exports()
self._write_strip("export LANG=C.UTF-8")
if self.config.set_gopath:
self._write_strip("export GOPATH=\"$PWD\"")
self._write_strip("go build {}".format(self.config.extra_make))
else:
self._write_strip("export GOPROXY=file:///usr/share/goproxy")
self._write_strip("go mod vendor")
self._write_strip("go build -mod=vendor {}".format(self.config.extra_make))
self.write_build_append()
self._write_strip("\n")
self._write_strip("%install")
self._write_strip("rm -rf %{buildroot}")
self.write_install_prepend()
self.write_license_files()
self._write_strip("\n")
def write_godep_pattern(self):
"""Write godep build pattern to spec file."""
self.write_prep()
self._write_strip("%install")
self.write_install_prepend()
self._write_strip("rm -fr %{buildroot}")
# Remove golang default proxy prefix and filename to get proxy path for the install
proxy_path = os.path.join("%{buildroot}/usr/share/goproxy",
os.path.dirname(self.url[len("https://proxy.golang.org/"):]))
self._write_strip(f"mkdir -p {proxy_path}")
list_file = os.path.join(proxy_path, "list")
self._write_strip("# Create list file using packaged versions")
for ver in list(self.content.multi_version.keys()):
self._write_strip(f"echo {ver} >> {list_file}")
for idx, source in enumerate(sorted(self.config.sources["godep"])):
file_path = os.path.join(proxy_path, os.path.basename(source))
self._write_strip(f"install -m 0644 %{{SOURCE{idx+1}}} {file_path}")
self._write_strip("\n")
def write_meson_pattern(self):
"""Write meson build pattern to spec file."""
self.write_prep()
+14 -107
View File
@@ -20,15 +20,16 @@
import configparser
import os
import re
import sys
import tarfile
import zipfile
from collections import OrderedDict
import download
from util import do_regex, get_sha1sum, print_fatal, write_out
class Source(object):
class Source():
"""Holds data and methods for source code or archives management."""
def __init__(self, url, destination, path, pattern=None):
@@ -50,8 +51,6 @@ class Source(object):
"""Determine compression type."""
if self.url.lower().endswith(('.zip', 'jar')):
self.type = 'zip'
elif self.url.lower().endswith('list'):
self.type = 'go'
else:
self.type = 'tar'
@@ -71,14 +70,14 @@ class Source(object):
# When tarball is not empty
if len(lines) == 0:
print_fatal("Tar file doesn't appear to have any content")
exit(1)
sys.exit(1)
elif len(lines) > 1:
if 'package.xml' in lines and self.pattern in ['phpize']:
lines.remove('package.xml')
self.prefix = os.path.commonpath(lines)
else:
print_fatal("Not a valid tar file.")
exit(1)
sys.exit(1)
def set_zip_prefix(self):
"""Determine prefix folder name of zip file."""
@@ -90,14 +89,10 @@ class Source(object):
self.prefix = os.path.commonpath(lines)
else:
print_fatal("Zip file doesn't appear to have any content")
exit(1)
sys.exit(1)
else:
print_fatal("Not a valid zip file.")
exit(1)
def set_go_prefix(self):
"""Set empty prefix for go packages (*.list)."""
self.prefix = ''
sys.exit(1)
def extract(self, base_path):
"""Prepare extraction path and call specific extraction method."""
@@ -119,10 +114,6 @@ class Source(object):
with zipfile.ZipFile(self.path, 'r') as content:
content.extractall(path=extraction_path)
def extract_go(self, extraction_path):
"""Pretend to do something."""
return
def convert_version(ver_str, name):
"""Remove disallowed characters from the version."""
@@ -159,7 +150,7 @@ def convert_version(ver_str, name):
return ver_str.strip(".")
class Content(object):
class Content():
"""Detect static information about the project."""
def __init__(self, url, name, version, archives, config, base_path):
@@ -167,7 +158,6 @@ class Content(object):
self.name = name
self.rawname = ""
self.version = version
self.multi_version = OrderedDict()
self.release = "1"
self.url = url
self.path = ""
@@ -230,24 +220,6 @@ class Content(object):
if "domain" in config_f["package"]:
self.domain = config_f["package"].get("domain")
def set_multi_version(self, ver):
"""Add ver to multi_version set and return latest version."""
self.multi_version = self.config.parse_config_versions()
if ver:
# Some build patterns put multiple versions in the same package.
# For those patterns add to the multi_version list
if self.config.default_pattern in ["godep"]:
self.multi_version[ver] = ""
else:
self.multi_version = {ver: ""}
elif not self.multi_version:
# Fall back to ensure a version is always set
# (otherwise the last known version will be used)
self.multi_version = {"1": ""}
latest = sorted(self.multi_version.keys())[-1]
return latest
def name_and_version(self, filemanager):
"""Parse the url for the package name and version."""
tarfile = os.path.basename(self.url)
@@ -262,7 +234,7 @@ class Content(object):
if self.name and self.version:
# rawname == name in this case
self.rawname = self.name
self.version = convert_version(self.set_multi_version(self.version), self.name)
self.version = convert_version(self.version, self.name)
return
name = self.name
@@ -354,26 +326,6 @@ class Content(object):
name = match.group(1).strip()
version = convert_version(match.group(2), name)
# ruby
if "rubygems.org/" in self.url:
m = re.search(r"(.*?)[\-_](v*[0-9]+[a-zA-Z0-9\+_\.\-\~]*)\.gem", tarfile)
if m:
name = "rubygem-" + m.group(1).strip()
# remove release candidate tag from the package name
# https://rubygems.org/downloads/ruby-rc4-0.1.5.gem
b = name.find("-rc")
if b > 0:
name = name[:b]
self.rawname = m.group(1).strip()
version = convert_version(m.group(2), name)
# rust crate
if "crates.io" in self.url:
m = re.search(r"/crates.io/api/v[0-9]+/crates/(.*)/(.*)/download.*\.crate", self.url)
if m:
name = m.group(1).strip()
version = convert_version(m.group(2), name)
if "gitlab.com" in self.url:
# https://gitlab.com/leanlabsio/kanban/-/archive/1.7.1/kanban-1.7.1.tar.gz
m = re.search(r"gitlab\.com/.*/(.*)/-/archive/(?:VERSION_|[vVrR])?(.*)/", self.url)
@@ -397,7 +349,6 @@ class Content(object):
# override name and version from commandline
self.name = self.name if self.name else name
self.version = self.version if self.version else version
self.version = self.set_multi_version(self.version)
def set_gcov(self):
"""Set the gcov file name."""
@@ -405,52 +356,11 @@ class Content(object):
if os.path.isfile(gcov_path):
self.gcov_file = self.name + ".gcov"
def process_go_archives(self, go_archives):
"""Set up extra archives required by go packages."""
base_url = os.path.dirname(self.url)
for ver in self.multi_version:
url_info = os.path.join(base_url, f"{ver}.info")
url_mod = os.path.join(base_url, f"{ver}.mod")
url_zip = os.path.join(base_url, f"{ver}.zip")
# Append elements in pairs url and destination if doesn't exist
if url_info not in self.archives:
go_archives.extend([url_info, ':'])
if url_mod not in self.archives:
go_archives.extend([url_mod, ':'])
if url_zip not in self.archives:
go_archives.extend([url_zip, ''])
self.config.sources["godep"] += [url_info, url_mod, url_zip]
def process_multiver_archives(self, main_src, multiver_archives):
"""Set up multiversion archives."""
config_versions = self.config.parse_config_versions()
# Check if exist more than one version.
if len(config_versions) > 1:
for extraver in config_versions:
extraurl = config_versions[extraver]
if extraurl and extraurl != main_src.url:
self.config.sources["version"].append(extraurl)
multiver_archives.append(extraurl)
multiver_archives.append('')
self.set_multi_version(None)
def process_archives(self, main_src):
"""Process extra sources needed by package.
This sources include: archives, go archives and multiversion.
"""
go_archives = []
multiver_archives = []
def process_archives(self):
"""Process extra sources needed by package."""
src_objects = []
if os.path.basename(main_src.url) == "list":
# Add extra archives and multiversion for Go packages
self.process_go_archives(go_archives)
else:
# Add multiversion for the rest of the patterns
self.process_multiver_archives(main_src, multiver_archives)
full_archives = self.archives + go_archives + multiver_archives
full_archives = self.archives
# Download and extract full list
for arch_url, destination in zip(full_archives[::2], full_archives[1::2]):
src_path = self.check_or_get_file(arch_url, os.path.basename(arch_url), mode="a")
@@ -470,8 +380,6 @@ class Content(object):
self.set_giturl_and_domain()
# determine name and version of package
self.name_and_version(filemanager)
# Store the top-level version
self.config.versions[self.version] = self.url
# set gcov file information, must be done after name is set since the gcov
# name is created by adding ".gcov" to the package name (if a gcov file
# exists)
@@ -485,8 +393,7 @@ class Content(object):
self.path = os.path.join(self.base_path, self.tarball_prefix)
# Now that the metadata has been collected print the header
self.print_header()
# Download and process extra sources: archives, go archives and
# multiversion
archives_src = self.process_archives(main_src)
# Download and process extra sources: archives
archives_src = self.process_archives()
# Extract all sources
self.extract_sources(main_src, archives_src)
-8
View File
@@ -28,17 +28,13 @@ Checking for swig: not found|swig
Could NOT find swig|swig
Could not find wpa_supplicant|wpa_supplicant
Could not find xdg-open|xdg-utils
Could not find 'swig' (< 4) among 5 total gem|rubygem-swig
Could not find a package configuration file provided by "swig" etc etc|swig
Could not find gem 'swig (<= 3) ruby'|rubygem-swig
Could not find suitable distribution for Requirement.parse('swig')|swig
Dependency swig found: NO|swig
Dependency testpkg found: NO (tried pkgconfig and cmake)|pkgconfig(testpkg)
Dependency testpkg found: NO (tried pkgconfig)|pkgconfig(testpkg)
Download error on https://pypi.python.org/simple/swig/|pypi(swig)
Downloading https://test.python.org/packages/pkg/t/swig/1.23|swig
ERROR: Could not find a valid gem 'swig' (= 8) in any repository|rubygem-swig
ERROR: Could not find a valid gem 'swig' (= 8), here is why:|rubygem-swig
ERROR: dependencies 'swig' are not available for package 'something'|R-swig
ERROR: dependencies 'swig', 'swig2' are not available for package 'something'|R-swig
ERROR: dependencies swig are not available for package something|R-swig
@@ -48,14 +44,12 @@ ERROR: dependency swig is not available for package something|R-swig
Error: Unable to find swig|swig
Error: package 'swig' required by|R-swig
Error: package swig required by|R-swig
Gem::LoadError: Could not find 'swig'|rubygem-swig
ImportError: No module named 'swig'|pypi(swig)
ImportError: No module named swig|swig
ImportError: No module named swig|pypi(swig)
ImportError: cannot import name swig|swig
ImportError: swig module missing|swig
ImportError:..*: No module named swig|pypi(swig)
LoadError: cannot load such file -- swig/pkg|rubygem-swig
ModuleNotFoundError: No module named swig|swig
Native dependency 'swig' not found|pkgconfig(swig)
No local packages or working download links found for swig|pypi(swig)
@@ -70,7 +64,6 @@ Program swig found: NO|swig
Target 't' can't be generated as 'swig' could not be found|swig
Unable to `import swig`|swig
Unable to find 'swig'|swig
WARNING: package dependency on swig (= 5.4) ardilla|rubygem-swig
Warning: no usable swig found|swig
Warning: prerequisite swig 8 not found.|perl(swig)
You need swig to build this program.|swig
@@ -98,7 +91,6 @@ fatal error: swig: No such file or directory|swig
make: swig: Command not found|swig
make: help2man: No such file or directory|help2man
swig 8 is required to configure this module; please install it or upgrade your CPAN/CPANPLUS shell.|swig
swig is not installed: cannot load such file -- rdoc/swig|rubygem-swig
swig tool not found or not executable|swig
swig validation tool not found or not executable|swig
swig: command not found|swig
-306
View File
@@ -1270,312 +1270,6 @@ https://cran.r-project.org/src/contrib/tseries_0.10-42.tar.gz,R-tseries,0.10.42
http://pypi.debian.net/rtslib-fb/rtslib-fb-2.1.64.tar.gz,rtslib-fb,2.1.64
https://cran.r-project.org/src/contrib/TTR_0.23-2.tar.gz,R-TTR,0.23.2
ftp://ftp.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.xz,ruby,2.4.2
https://rubygems.org/downloads/actionmailer-5.0.0.1.gem,rubygem-actionmailer,5.0.0.1
https://rubygems.org/downloads/actionpack-5.0.0.1.gem,rubygem-actionpack,5.0.0.1
https://rubygems.org/downloads/actionview-5.0.0.1.gem,rubygem-actionview,5.0.0.1
https://rubygems.org/downloads/activejob-5.0.0.1.gem,rubygem-activejob,5.0.0.1
https://rubygems.org/downloads/activemodel-5.0.0.1.gem,rubygem-activemodel,5.0.0.1
https://rubygems.org/downloads/activerecord-5.0.0.1.gem,rubygem-activerecord,5.0.0.1
https://rubygems.org/downloads/activesupport-5.0.0.1.gem,rubygem-activesupport,5.0.0.1
https://rubygems.org/downloads/addressable-2.4.0.gem,rubygem-addressable,2.4.0
https://rubygems.org/downloads/ae-1.8.2.gem,rubygem-ae,1.8.2
https://rubygems.org/downloads/afm-0.2.2.gem,rubygem-afm,0.2.2
https://rubygems.org/downloads/allison-2.0.3.gem,rubygem-allison,2.0.3
https://rubygems.org/downloads/ammeter-1.1.4.gem,rubygem-ammeter,1.1.4
https://rubygems.org/downloads/ansi-1.5.0.gem,rubygem-ansi,1.5.0
https://rubygems.org/downloads/appraisal-2.1.0.gem,rubygem-appraisal,2.1.0
https://rubygems.org/downloads/arel-7.1.4.gem,rubygem-arel,7.1.4
https://rubygems.org/downloads/aruba-0.14.2.gem,rubygem-aruba,0.14.2
https://rubygems.org/downloads/Ascii85-1.0.2.gem,rubygem-Ascii85,1.0.2
https://rubygems.org/downloads/ast-2.3.0.gem,rubygem-ast,2.3.0
https://rubygems.org/downloads/astrolabe-1.3.1.gem,rubygem-astrolabe,1.3.1
https://rubygems.org/downloads/atomic-1.1.99.gem,rubygem-atomic,1.1.99
https://rubygems.org/downloads/axiom-types-0.1.1.gem,rubygem-axiom-types,0.1.1
https://rubygems.org/downloads/bacon-1.2.0.gem,rubygem-bacon,1.2.0
https://rubygems.org/downloads/bacon-colored_output-1.0.1.gem,rubygem-bacon-colored_output,1.0.1
https://rubygems.org/downloads/bcat-0.6.2.gem,rubygem-bcat,0.6.2
https://rubygems.org/downloads/bcrypt-3.1.11.gem,rubygem-bcrypt,3.1.11
https://rubygems.org/downloads/bcrypt-ruby-3.1.5.gem,rubygem-bcrypt-ruby,3.1.5
https://rubygems.org/downloads/benchmark-ips-2.7.2.gem,rubygem-benchmark-ips,2.7.2
https://rubygems.org/downloads/benchmark_suite-1.0.0.gem,rubygem-benchmark_suite,1.0.0
https://rubygems.org/downloads/blankslate-3.1.3.gem,rubygem-blankslate,3.1.3
https://rubygems.org/downloads/blockenspiel-0.5.0.gem,rubygem-blockenspiel,0.5.0
https://rubygems.org/downloads/bluecloth-2.2.0.gem,rubygem-bluecloth,2.2.0
https://rubygems.org/downloads/bones-3.8.3.gem,rubygem-bones,3.8.3
https://rubygems.org/downloads/brass-1.2.1.gem,rubygem-brass,1.2.1
https://rubygems.org/downloads/bson-4.1.1.gem,rubygem-bson,4.1.1
https://rubygems.org/downloads/bson_ext-1.12.5.gem,rubygem-bson_ext,1.12.5
https://rubygems.org/downloads/builder-3.2.2.gem,rubygem-builder,3.2.2
https://rubygems.org/downloads/bundler-1.13.6.gem,rubygem-bundler,1.13.6
https://rubygems.org/downloads/cane-3.0.0.gem,rubygem-cane,3.0.0
https://rubygems.org/downloads/capybara-2.10.1.gem,rubygem-capybara,2.10.1
https://rubygems.org/downloads/cells-4.1.3.gem,rubygem-cells,4.1.3
https://rubygems.org/downloads/cells-erb-0.0.9.gem,rubygem-cells-erb,0.0.9
https://rubygems.org/downloads/celluloid-0.17.3.gem,rubygem-celluloid,0.17.3
https://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gem,rubygem-cgi_multipart_eof_fix,2.5.0
https://rubygems.org/downloads/childprocess-0.5.9.gem,rubygem-childprocess,0.5.9
https://rubygems.org/downloads/chronic-0.10.2.gem,rubygem-chronic,0.10.2
https://rubygems.org/downloads/chronic_duration-0.10.6.gem,rubygem-chronic_duration,0.10.6
https://rubygems.org/downloads/closure-compiler-1.1.12.gem,rubygem-closure-compiler,1.1.12
https://rubygems.org/downloads/coderay-1.1.1.gem,rubygem-coderay,1.1.1
https://rubygems.org/downloads/code_statistics-0.2.13.gem,rubygem-code_statistics,0.2.13
https://rubygems.org/downloads/coercible-1.0.0.gem,rubygem-coercible,1.0.0
https://rubygems.org/downloads/coffee-rails-4.2.1.gem,rubygem-coffee-rails,4.2.1
https://rubygems.org/downloads/coffee-script-2.4.1.gem,rubygem-coffee-script,2.4.1
https://rubygems.org/downloads/coffee-script-source-1.10.0.gem,rubygem-coffee-script-source,1.10.0
https://rubygems.org/downloads/contest-0.1.3.gem,rubygem-contest,0.1.3
https://rubygems.org/downloads/cookiejar-0.3.3.gem,rubygem-cookiejar,0.3.3
https://rubygems.org/downloads/crack-0.4.3.gem,rubygem-crack,0.4.3
https://rubygems.org/downloads/crass-1.0.2.gem,rubygem-crass,1.0.2
https://rubygems.org/downloads/creole-0.5.0.gem,rubygem-creole,0.5.0
https://rubygems.org/downloads/cucumber-2.4.0.gem,rubygem-cucumber,2.4.0
https://rubygems.org/downloads/cucumber-core-2.0.0.gem,rubygem-cucumber-core,2.0.0
https://rubygems.org/downloads/curb-0.9.3.gem,rubygem-curb,0.9.3
https://rubygems.org/downloads/daemons-1.2.4.gem,rubygem-daemons,1.2.4
https://rubygems.org/downloads/database_cleaner-1.5.3.gem,rubygem-database_cleaner,1.5.3
https://rubygems.org/downloads/data_objects-0.10.17.gem,rubygem-data_objects,0.10.17
https://rubygems.org/downloads/delorean-2.1.0.gem,rubygem-delorean,2.1.0
https://rubygems.org/downloads/descendants_tracker-0.0.4.gem,rubygem-descendants_tracker,0.0.4
https://rubygems.org/downloads/detroit-0.4.0.gem,rubygem-detroit,0.4.0
https://rubygems.org/downloads/detroit-gem-0.4.0.gem,rubygem-detroit-gem,0.4.0
https://rubygems.org/downloads/detroit-standard-0.4.0.gem,rubygem-detroit-standard,0.4.0
https://rubygems.org/downloads/detroit-yard-0.2.0.gem,rubygem-detroit-yard,0.2.0
https://rubygems.org/downloads/devise-4.2.0.gem,rubygem-devise,4.2.0
https://rubygems.org/downloads/diff-lcs-1.2.5.gem,rubygem-diff-lcs,1.2.5
https://rubygems.org/downloads/diffy-3.1.0.gem,rubygem-diffy,3.1.0
https://rubygems.org/downloads/disposable-0.0.9.gem,rubygem-disposable,0.0.9
https://rubygems.org/downloads/dm-active_model-1.2.1.gem,rubygem-dm-active_model,1.2.1
https://rubygems.org/downloads/dm-aggregates-1.2.0.gem,rubygem-dm-aggregates,1.2.0
https://rubygems.org/downloads/dm-constraints-1.2.0.gem,rubygem-dm-constraints,1.2.0
https://rubygems.org/downloads/dm-core-1.2.1.gem,rubygem-dm-core,1.2.1
https://rubygems.org/downloads/dm-do-adapter-1.2.0.gem,rubygem-dm-do-adapter,1.2.0
https://rubygems.org/downloads/dm-migrations-1.2.0.gem,rubygem-dm-migrations,1.2.0
https://rubygems.org/downloads/dm-sqlite-adapter-1.2.0.gem,rubygem-dm-sqlite-adapter,1.2.0
https://rubygems.org/downloads/dm-timestamps-1.2.0.gem,rubygem-dm-timestamps,1.2.0
https://rubygems.org/downloads/dm-types-1.2.2.gem,rubygem-dm-types,1.2.2
https://rubygems.org/downloads/dm-validations-1.2.0.gem,rubygem-dm-validations,1.2.0
https://rubygems.org/downloads/docile-1.1.5.gem,rubygem-docile,1.1.5
https://rubygems.org/downloads/do_sqlite3-0.10.17.gem,rubygem-do_sqlite3,0.10.17
https://rubygems.org/downloads/echoe-4.6.6.gem,rubygem-echoe,4.6.6
https://rubygems.org/downloads/eco-1.0.0.gem,rubygem-eco,1.0.0
https://rubygems.org/downloads/eco-source-1.1.0.rc.1.gem,rubygem-eco-source,1.1.0.rc.1
https://rubygems.org/downloads/ejs-1.1.1.gem,rubygem-ejs,1.1.1
https://rubygems.org/downloads/em-http-request-1.1.5.gem,rubygem-em-http-request,1.1.5
https://rubygems.org/downloads/em-socksify-0.3.1.gem,rubygem-em-socksify,0.3.1
https://rubygems.org/downloads/equalizer-0.0.11.gem,rubygem-equalizer,0.0.11
https://rubygems.org/downloads/erbse-0.1.1.gem,rubygem-erbse,0.1.1
https://rubygems.org/downloads/ergo-0.3.0.gem,rubygem-ergo,0.3.0
https://rubygems.org/downloads/erubis-2.7.0.gem,rubygem-erubis,2.7.0
https://rubygems.org/downloads/eventmachine-1.2.0.1.gem,rubygem-eventmachine,1.2.0.1
https://rubygems.org/downloads/execjs-2.7.0.gem,rubygem-execjs,2.7.0
https://rubygems.org/downloads/facets-3.1.0.gem,rubygem-facets,3.1.0
https://rubygems.org/downloads/fakeweb-1.3.0.gem,rubygem-fakeweb,1.3.0
https://rubygems.org/downloads/faraday-0.9.2.gem,rubygem-faraday,0.9.2
https://rubygems.org/downloads/fastercsv-1.5.5.gem,rubygem-fastercsv,1.5.5
https://rubygems.org/downloads/flexmock-2.3.0.gem,rubygem-flexmock,2.3.0
https://rubygems.org/downloads/formatador-0.2.5.gem,rubygem-formatador,0.2.5
https://rubygems.org/downloads/fuubar-2.2.0.gem,rubygem-fuubar,2.2.0
https://rubygems.org/downloads/gauntlet-2.1.0.gem,rubygem-gauntlet,2.1.0
https://rubygems.org/downloads/gem_hadar-1.9.1.gem,rubygem-gem_hadar,1.9.1
https://rubygems.org/downloads/gem_plugin-0.2.3.gem,rubygem-gem_plugin,0.2.3
https://rubygems.org/downloads/gherkin-4.0.0.gem,rubygem-gherkin,4.0.0
https://rubygems.org/downloads/git-1.3.0.gem,rubygem-git,1.3.0
https://rubygems.org/downloads/github_api-0.14.5.gem,rubygem-github_api,0.14.5
https://rubygems.org/downloads/github-markup-1.4.0.gem,rubygem-github-markup,1.4.0
https://rubygems.org/downloads/globalid-0.3.7.gem,rubygem-globalid,0.3.7
https://rubygems.org/downloads/gritter-1.2.0.gem,rubygem-gritter,1.2.0
https://rubygems.org/downloads/guard-2.14.0.gem,rubygem-guard,2.14.0
https://rubygems.org/downloads/guard-compat-1.2.1.gem,rubygem-guard-compat,1.2.1
https://rubygems.org/downloads/guard-minitest-2.4.6.gem,rubygem-guard-minitest,2.4.6
https://rubygems.org/downloads/guard-rspec-4.7.3.gem,rubygem-guard-rspec,4.7.3
https://rubygems.org/downloads/haml-4.0.7.gem,rubygem-haml,4.0.7
https://rubygems.org/downloads/haml-rails-0.9.0.gem,rubygem-haml-rails,0.9.0
https://rubygems.org/downloads/hashie-3.4.6.gem,rubygem-hashie,3.4.6
https://rubygems.org/downloads/heredoc_unindent-1.2.0.gem,rubygem-heredoc_unindent,1.2.0
https://rubygems.org/downloads/heroku-api-0.4.2.gem,rubygem-heroku-api,0.4.2
https://rubygems.org/downloads/highline-1.7.8.gem,rubygem-highline,1.7.8
https://rubygems.org/downloads/hitimes-1.2.4.gem,rubygem-hitimes,1.2.4
https://rubygems.org/downloads/hoe-3.15.2.gem,rubygem-hoe,3.15.2
https://rubygems.org/downloads/hoe-bundler-1.3.0.gem,rubygem-hoe-bundler,1.3.0
https://rubygems.org/downloads/hoe-debugging-1.2.1.gem,rubygem-hoe-debugging,1.2.1
https://rubygems.org/downloads/hoe-doofus-1.0.0.gem,rubygem-hoe-doofus,1.0.0
https://rubygems.org/downloads/hoe-gemspec-1.0.0.gem,rubygem-hoe-gemspec,1.0.0
https://rubygems.org/downloads/hoe-gemspec2-1.2.0.gem,rubygem-hoe-gemspec2,1.2.0
https://rubygems.org/downloads/hoe-git-1.6.0.gem,rubygem-hoe-git,1.6.0
https://rubygems.org/downloads/hoe-highline-0.2.1.gem,rubygem-hoe-highline,0.2.1
https://rubygems.org/downloads/hoe-mercurial-1.4.1.gem,rubygem-hoe-mercurial,1.4.1
https://rubygems.org/downloads/hoe-rubygems-1.0.0.gem,rubygem-hoe-rubygems,1.0.0
https://rubygems.org/downloads/hoe-seattlerb-1.3.5.gem,rubygem-hoe-seattlerb,1.3.5
https://rubygems.org/downloads/hoe-travis-1.3.1.gem,rubygem-hoe-travis,1.3.1
https://rubygems.org/downloads/hpricot-0.8.6.gem,rubygem-hpricot,0.8.6
https://rubygems.org/downloads/html2haml-2.0.0.gem,rubygem-html2haml,2.0.0
https://rubygems.org/downloads/html-pipeline-2.4.2.gem,rubygem-html-pipeline,2.4.2
https://rubygems.org/downloads/http-2.0.3.gem,rubygem-http,2.0.3
https://rubygems.org/downloads/http-cookie-1.0.3.gem,rubygem-http-cookie,1.0.3
https://rubygems.org/downloads/http-form_data-1.0.1.gem,rubygem-http-form_data,1.0.1
https://rubygems.org/downloads/i18n-0.7.0.gem,rubygem-i18n,0.7.0
https://rubygems.org/downloads/ice_nine-0.11.2.gem,rubygem-ice_nine,0.11.2
https://rubygems.org/downloads/indexer-0.3.1.gem,rubygem-indexer,0.3.1
https://rubygems.org/downloads/ir_b-1.5.0.gem,rubygem-ir_b,1.5.0
https://rubygems.org/downloads/jeremymcanally-pending-0.1.gem,rubygem-jeremymcanally-pending,0.1
https://rubygems.org/downloads/jeweler-2.1.2.gem,rubygem-jeweler,2.1.2
https://rubygems.org/downloads/jquery-rails-4.2.1.gem,rubygem-jquery-rails,4.2.1
https://rubygems.org/downloads/jwt-1.5.6.gem,rubygem-jwt,1.5.6
https://rubygems.org/gems/kaminari-0.16.1.gem,rubygem-kaminari,0.16.1
https://rubygems.org/downloads/kpeg-1.1.0.gem,rubygem-kpeg,1.1.0
https://rubygems.org/downloads/kramdown-1.12.0.gem,rubygem-kramdown,1.12.0
https://rubygems.org/downloads/latest_ruby-0.0.5.gem,rubygem-latest_ruby,0.0.5
https://rubygems.org/downloads/launchy-2.4.3.gem,rubygem-launchy,2.4.3
https://rubygems.org/downloads/listen-3.1.5.gem,rubygem-listen,3.1.5
https://rubygems.org/downloads/lumberjack-1.0.10.gem,rubygem-lumberjack,1.0.10
https://rubygems.org/downloads/maruku-0.7.2.gem,rubygem-maruku,0.7.2
https://rubygems.org/downloads/mast-1.4.0.gem,rubygem-mast,1.4.0
https://rubygems.org/downloads/metaclass-0.0.4.gem,rubygem-metaclass,0.0.4
https://rubygems.org/downloads/method_source-0.8.2.gem,rubygem-method_source,0.8.2
https://rubygems.org/downloads/mime-types-2.6.1.gem,rubygem-mime-types,2.6.1
https://rubygems.org/downloads/mini_portile-0.6.2.gem,rubygem-mini_portile,0.6.2
https://rubygems.org/downloads/minitest-autotest-1.0.3.gem,rubygem-minitest-autotest,1.0.3
https://rubygems.org/downloads/minitest-focus-1.1.2.gem,rubygem-minitest-focus,1.1.2
https://rubygems.org/downloads/minitest-server-1.0.4.gem,rubygem-minitest-server,1.0.4
https://rubygems.org/downloads/minitest_tu_shim-1.3.3.gem,rubygem-minitest_tu_shim,1.3.3
https://rubygems.org/downloads/mocha-1.2.1.gem,rubygem-mocha,1.2.1
https://rubygems.org/downloads/mongoid-6.0.2.gem,rubygem-mongoid,6.0.2
https://rubygems.org/downloads/mongo_mapper-0.13.1.gem,rubygem-mongo_mapper,0.13.1
https://rubygems.org/downloads/moped-2.0.7.gem,rubygem-moped,2.0.7
https://rubygems.org/downloads/morecane-0.1.0.gem,rubygem-morecane,0.1.0
https://rubygems.org/downloads/multi_json-1.12.1.gem,rubygem-multi_json,1.12.1
https://rubygems.org/downloads/multipart-post-2.0.0.gem,rubygem-multipart-post,2.0.0
https://rubygems.org/downloads/multi_test-0.1.2.gem,rubygem-multi_test,0.1.2
https://rubygems.org/downloads/multi_xml-0.5.5.gem,rubygem-multi_xml,0.5.5
https://rubygems.org/downloads/mustache-1.0.3.gem,rubygem-mustache,1.0.3
https://rubygems.org/downloads/nanotest-0.9.4.1.gem,rubygem-nanotest,0.9.4.1
https://rubygems.org/downloads/nenv-0.3.0.gem,rubygem-nenv,0.3.0
https://rubygems.org/downloads/net-http-persistent-2.9.4.gem,rubygem-net-http-persistent,2.9.4
https://rubygems.org/downloads/netrc-0.11.0.gem,rubygem-netrc,0.11.0
https://rubygems.org/downloads/nokogiri-diff-0.2.0.gem,rubygem-nokogiri-diff,0.2.0
https://rubygems.org/downloads/nokogumbo-1.4.2.gem,rubygem-nokogumbo,1.4.2
https://rubygems.org/downloads/notiffany-0.1.1.gem,rubygem-notiffany,0.1.1
https://rubygems.org/downloads/notify-0.5.2.gem,rubygem-notify,0.5.2
https://rubygems.org/downloads/numerizer-0.2.0.gem,rubygem-numerizer,0.2.0
https://rubygems.org/downloads/oauth2-1.2.0.gem,rubygem-oauth2,1.2.0
https://rubygems.org/downloads/open4-1.3.4.gem,rubygem-open4,1.3.4
https://rubygems.org/downloads/origin-2.2.2.gem,rubygem-origin,2.2.2
https://rubygems.org/downloads/orm_adapter-0.5.0.gem,rubygem-orm_adapter,0.5.0
https://rubygems.org/downloads/parallel-1.9.0.gem,rubygem-parallel,1.9.0
https://rubygems.org/downloads/parser-2.3.1.4.gem,rubygem-parser,2.3.1.4
https://rubygems.org/downloads/patron-0.4.18.gem,rubygem-patron,0.4.18
https://rubygems.org/downloads/pdf-core-0.6.1.gem,rubygem-pdf-core,0.6.1
https://rubygems.org/downloads/pdf-inspector-1.2.1.gem,rubygem-pdf-inspector,1.2.1
https://rubygems.org/downloads/pdf-reader-1.4.0.gem,rubygem-pdf-reader,1.4.0
https://rubygems.org/downloads/permutation-0.1.8.gem,rubygem-permutation,0.1.8
https://rubygems.org/downloads/plucky-0.7.0.gem,rubygem-plucky,0.7.0
https://rubygems.org/downloads/powerpack-0.1.1.gem,rubygem-powerpack,0.1.1
https://rubygems.org/downloads/prawn-2.1.0.gem,rubygem-prawn,2.1.0
https://rubygems.org/downloads/prawn-manual_builder-0.2.0.gem,rubygem-prawn-manual_builder,0.2.0
https://rubygems.org/downloads/prawn-table-0.2.2.gem,rubygem-prawn-table,0.2.2
https://rubygems.org/downloads/pry-0.10.4.gem,rubygem-pry,0.10.4
https://rubygems.org/downloads/pry-doc-0.9.0.gem,rubygem-pry-doc,0.9.0
https://rubygems.org/downloads/racc-1.4.14.gem,rubygem-racc,1.4.14
https://rubygems.org/downloads/rack-2.0.1.gem,rubygem-rack,2.0.1
https://rubygems.org/downloads/rack-protection-1.5.3.gem,rubygem-rack-protection,1.5.3
https://rubygems.org/downloads/rack-test-0.6.3.gem,rubygem-rack-test,0.6.3
https://rubygems.org/downloads/rails-5.0.0.1.gem,rubygem-rails,5.0.0.1
https://rubygems.org/downloads/rails-deprecated_sanitizer-1.0.3.gem,rubygem-rails-deprecated_sanitizer,1.0.3
https://rubygems.org/downloads/rails-html-sanitizer-1.0.3.gem,rubygem-rails-html-sanitizer,1.0.3
https://rubygems.org/downloads/rainbow-2.1.0.gem,rubygem-rainbow,2.1.0
https://rubygems.org/downloads/rake-compiler-1.0.1.gem,rubygem-rake-compiler,1.0.1
https://rubygems.org/downloads/rake-compiler-dock-0.5.3.gem,rubygem-rake-compiler-dock,0.5.3
https://rubygems.org/downloads/rbench-0.2.3.gem,rubygem-rbench,0.2.3
https://rubygems.org/downloads/rb-inotify-0.9.7.gem,rubygem-rb-inotify,0.9.7
https://rubygems.org/downloads/rdiscount-2.2.0.1.gem,rubygem-rdiscount,2.2.0.1
https://rubygems.org/downloads/redcarpet-3.3.4.gem,rubygem-redcarpet,3.3.4
https://rubygems.org/downloads/RedCloth-4.3.2.gem,rubygem-RedCloth,4.3.2
https://rubygems.org/downloads/ref-2.0.0.gem,rubygem-ref,2.0.0
https://rubygems.org/downloads/representable-3.0.0.gem,rubygem-representable,3.0.0
https://rubygems.org/downloads/responders-2.3.0.gem,rubygem-responders,2.3.0
https://rubygems.org/downloads/rest-client-1.8.0.gem,rubygem-rest-client,1.8.0
https://rubygems.org/downloads/rexical-1.0.5.gem,rubygem-rexical,1.0.5
https://rubygems.org/downloads/ritex-1.0.1.gem,rubygem-ritex,1.0.1
https://rubygems.org/downloads/ronn-0.7.3.gem,rubygem-ronn,0.7.3
https://rubygems.org/downloads/rouge-2.0.6.gem,rubygem-rouge,2.0.6
https://rubygems.org/downloads/rspec-3.5.0.gem,rubygem-rspec,3.5.0
https://rubygems.org/downloads/rspec-core-3.5.4.gem,rubygem-rspec-core,3.5.4
https://rubygems.org/downloads/rspec-expectations-3.5.0.gem,rubygem-rspec-expectations,3.5.0
https://rubygems.org/downloads/rspec-fire-1.3.0.gem,rubygem-rspec-fire,1.3.0
https://rubygems.org/downloads/rspec-its-1.2.0.gem,rubygem-rspec-its,1.2.0
https://rubygems.org/downloads/rspec-mocks-3.5.0.gem,rubygem-rspec-mocks,3.5.0
https://rubygems.org/downloads/rspec-rails-3.5.2.gem,rubygem-rspec-rails,3.5.2
https://rubygems.org/downloads/rspec-spies-2.1.4.gem,rubygem-rspec-spies,2.1.4
https://rubygems.org/downloads/rspec-support-3.5.0.gem,rubygem-rspec-support,3.5.0
https://rubygems.org/downloads/rspectacular-0.70.7.gem,rubygem-rspectacular,0.70.7
https://rubygems.org/downloads/rubocop-0.44.1.gem,rubygem-rubocop,0.44.1
https://rubygems.org/downloads/ruby-rc4-0.1.5.gem,rubygem-ruby,0.1.5
https://rubygems.org/downloads/ruby-beautify-0.92.2.gem,rubygem-ruby-beautify,0.92.2
https://rubygems.org/downloads/rubyforge-2.0.4.gem,rubygem-rubyforge,2.0.4
https://rubygems.org/downloads/rubygems-tasks-0.2.4.gem,rubygem-rubygems-tasks,0.2.4
https://rubygems.org/downloads/ruby-progressbar-1.8.1.gem,rubygem-ruby-progressbar,1.8.1
https://rubygems.org/downloads/rubytest-0.8.1.gem,rubygem-rubytest,0.8.1
https://rubygems.org/downloads/rubytest-cli-0.2.0.gem,rubygem-rubytest-cli,0.2.0
https://rubygems.org/downloads/rubyzip-1.2.0.gem,rubygem-rubyzip,1.2.0
https://rubygems.org/downloads/rulebow-0.4.0.gem,rubygem-rulebow,0.4.0
https://rubygems.org/downloads/rvm-1.11.3.9.gem,rubygem-rvm,1.11.3.9
https://rubygems.org/downloads/safe_yaml-1.0.4.gem,rubygem-safe_yaml,1.0.4
https://rubygems.org/downloads/sanitize-4.0.0.gem,rubygem-sanitize,4.0.0
https://rubygems.org/downloads/sass-rails-5.0.6.gem,rubygem-sass-rails,5.0.6
https://rubygems.org/downloads/selenium-webdriver-3.0.0.gem,rubygem-selenium-webdriver,3.0.0
https://rubygems.org/downloads/shellany-0.0.1.gem,rubygem-shellany,0.0.1
https://rubygems.org/downloads/shindo-0.3.8.gem,rubygem-shindo,0.3.8
https://rubygems.org/downloads/shoulda-3.5.0.gem,rubygem-shoulda,3.5.0
https://rubygems.org/downloads/shoulda-context-1.2.1.gem,rubygem-shoulda-context,1.2.1
https://rubygems.org/downloads/shoulda-matchers-3.1.1.gem,rubygem-shoulda-matchers,3.1.1
https://rubygems.org/downloads/simplecov-0.12.0.gem,rubygem-simplecov,0.12.0
https://rubygems.org/downloads/simplecov-html-0.10.0.gem,rubygem-simplecov-html,0.10.0
https://rubygems.org/downloads/simplecov-json-0.2.gem,rubygem-simplecov-json,0.2
https://rubygems.org/downloads/simplecov-sublime-ruby-coverage-1.0.0.gem,rubygem-simplecov-sublime-ruby-coverage,1.0.0
https://rubygems.org/downloads/sinatra-1.4.7.gem,rubygem-sinatra,1.4.7
https://rubygems.org/downloads/slim-3.0.7.gem,rubygem-slim,3.0.7
https://rubygems.org/downloads/slop-4.4.1.gem,rubygem-slop,4.4.1
https://rubygems.org/downloads/source_map-3.0.1.gem,rubygem-source_map,3.0.1
https://rubygems.org/downloads/spec-5.3.4.gem,rubygem-spec,5.3.4
https://rubygems.org/downloads/sprockets-3.7.0.gem,rubygem-sprockets,3.7.0
https://rubygems.org/downloads/sprockets-rails-3.2.0.gem,rubygem-sprockets-rails,3.2.0
https://rubygems.org/downloads/sqlite3-1.3.12.gem,rubygem-sqlite3,1.3.12
https://rubygems.org/downloads/stringex-2.6.1.gem,rubygem-stringex,2.6.1
https://rubygems.org/downloads/syntax-1.2.1.gem,rubygem-syntax,1.2.1
https://rubygems.org/downloads/tdiff-0.3.3.gem,rubygem-tdiff,0.3.3
https://rubygems.org/downloads/temple-0.7.7.gem,rubygem-temple,0.7.7
https://rubygems.org/downloads/term-ansicolor-1.4.0.gem,rubygem-term-ansicolor,1.4.0
https://rubygems.org/downloads/test-construct-1.2.2.gem,rubygem-test-construct,1.2.2
https://rubygems.org/downloads/test_helper-0.0.1.gem,rubygem-test_helper,0.0.1
https://rubygems.org/downloads/test_xml-0.1.7.gem,rubygem-test_xml,0.1.7
https://rubygems.org/downloads/therubyracer-0.12.2.gem,rubygem-therubyracer,0.12.2
https://rubygems.org/downloads/thor-0.19.1.gem,rubygem-thor,0.19.1
https://rubygems.org/downloads/thoughtbot-shoulda-2.11.1.gem,rubygem-thoughtbot-shoulda,2.11.1
https://rubygems.org/downloads/thread_order-1.1.0.gem,rubygem-thread_order,1.1.0
https://rubygems.org/downloads/thread_safe-0.3.5.gem,rubygem-thread_safe,0.3.5
https://rubygems.org/downloads/tidy-ext-0.1.14.gem,rubygem-tidy-ext,0.1.14
https://rubygems.org/downloads/timecop-0.8.1.gem,rubygem-timecop,0.8.1
https://rubygems.org/downloads/timers-4.1.1.gem,rubygem-timers,4.1.1
https://rubygems.org/downloads/tins-1.12.0.gem,rubygem-tins,1.12.0
https://rubygems.org/downloads/travis-lint-2.0.0.gem,rubygem-travis-lint,2.0.0
https://rubygems.org/downloads/ttfunk-1.4.0.gem,rubygem-ttfunk,1.4.0
https://rubygems.org/downloads/turn-0.9.7.gem,rubygem-turn,0.9.7
https://rubygems.org/downloads/typhoeus-1.1.0.gem,rubygem-typhoeus,1.1.0
https://rubygems.org/downloads/tzinfo-1.2.2.gem,rubygem-tzinfo,1.2.2
https://rubygems.org/downloads/uber-0.0.15.gem,rubygem-uber,0.0.15
https://rubygems.org/downloads/uglifier-3.0.2.gem,rubygem-uglifier,3.0.2
https://rubygems.org/downloads/unf-0.1.4.gem,rubygem-unf,0.1.4
https://rubygems.org/downloads/unf_ext-0.0.7.2.gem,rubygem-unf_ext,0.0.7.2
https://rubygems.org/downloads/unindent-1.0.gem,rubygem-unindent,1.0
https://rubygems.org/downloads/uuidtools-2.1.5.gem,rubygem-uuidtools,2.1.5
https://rubygems.org/downloads/versionomy-0.5.0.gem,rubygem-versionomy,0.5.0
https://rubygems.org/downloads/virtus-1.0.5.gem,rubygem-virtus,1.0.5
https://rubygems.org/downloads/vulcan-0.8.2.gem,rubygem-vulcan,0.8.2
https://rubygems.org/downloads/warden-1.2.6.gem,rubygem-warden,1.2.6
https://rubygems.org/downloads/webmock-2.1.0.gem,rubygem-webmock,2.1.0
https://rubygems.org/downloads/yard-0.8.7.6.gem,rubygem-yard,0.8.7.6
https://rubygems.org/downloads/yui-compressor-0.12.0.gem,rubygem-yui-compressor,0.12.0
https://rubygems.org/downloads/ZenTest-4.11.1.gem,rubygem-ZenTest,4.11.1
https://github.com/clearcontainers/runtime/archive/3.0.2.tar.gz,runtime,3.0.2
https://github.com/hyperhq/runv/archive/v0.5.0.tar.gz,runv,0.5.0
https://static.rust-lang.org/dist/rustc-1.20.0-src.tar.gz,rustc,1.20.0
-71
View File
@@ -182,77 +182,6 @@ class TestBuildpattern(unittest.TestCase):
self.assertIn('pypi(testpkg)', reqs.buildreqs)
self.assertEqual(pkg.must_restart, 1)
def test_failed_pattern_ruby(self):
"""
Test failed_pattern with buildtool set to ruby, but no match in
config.gems, it should just prepend 'rubygem-' to the package name.
"""
conf = config.Config('')
reqs = buildreq.Requirements("")
pkg = build.Build()
pkg.failed_pattern('line to test for failure: testpkg.rb',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-testpkg', reqs.buildreqs)
self.assertEqual(pkg.must_restart, 1)
def test_failed_pattern_ruby_gem_match(self):
"""
Test failed_pattern with buildtool set to ruby and a match in
config.gems. In the particular case of test/unit, the result should
be rubygem-test-unit.
"""
conf = config.Config('')
conf.setup_patterns()
reqs = buildreq.Requirements("")
pkg = build.Build()
pkg.failed_pattern('line to test for failure: test/unit',
conf,
reqs,
r'(test/unit)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-test-unit', reqs.buildreqs)
self.assertEqual(pkg.must_restart, 1)
def test_failed_pattern_ruby_table(self):
"""
Test failed_pattern with buildtool set to ruby table and a match in
config.gems
"""
conf = config.Config('')
conf.setup_patterns()
reqs = buildreq.Requirements("")
pkg = build.Build()
pkg.failed_pattern('line to test for failure: test/unit',
conf,
reqs,
r'(test/unit)',
0, # verbose=0
buildtool='ruby table')
self.assertIn('rubygem-test-unit', reqs.buildreqs)
self.assertEqual(pkg.must_restart, 1)
def test_failed_pattern_ruby_table_no_match(self):
"""
Test failed_pattern with buildtool set to ruby table but no match in
config.gems. This should not modify anything.
"""
conf = config.Config('')
reqs = buildreq.Requirements("")
pkg = build.Build()
pkg.failed_pattern('line to test for failure: testpkg',
conf,
reqs,
r'(testpkg)',
0, # verbose=0
buildtool='ruby table')
self.assertEqual(reqs.buildreqs, set())
self.assertEqual(pkg.must_restart, 0)
def test_parse_buildroot_log_fail(self):
"""
Test parse_buildroot_log with a test log indicating failure due to
+1 -100
View File
@@ -201,104 +201,6 @@ class TestBuildreq(unittest.TestCase):
'intltool',
'sed']))
def test_parse_go_mod(self):
"""
Test parse_go_mod
"""
open_name = 'buildreq.open'
content = """module example.com/foo/bar
require (
github.com/example/foo v1.0.0
git.apache.org/skip.git v0.0.0-20180101111111-barf0000000d
github.com/redirect/bar v2.0.0 // indirect
"github.com/quote/baz" v0.0.3
"github.com/qdirect/raz" v1.0.3 // indirect
)"""
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
result = buildreq.parse_go_mod('filename')
self.assertEqual(len(result), 4)
self.assertEqual(len(result[0]), 2)
self.assertEqual(result[0][0], "github.com/example/foo")
self.assertEqual(result[0][1], "v1.0.0")
self.assertEqual(len(result[1]), 2)
self.assertEqual(result[1][0], "github.com/redirect/bar")
self.assertEqual(result[1][1], "v2.0.0")
self.assertEqual(len(result[2]), 2)
self.assertEqual(result[2][0], "github.com/quote/baz")
self.assertEqual(result[2][1], "v0.0.3")
self.assertEqual(len(result[3]), 2)
self.assertEqual(result[3][0], "github.com/qdirect/raz")
self.assertEqual(result[3][1], "v1.0.3")
def test_parse_cargo_toml(self):
"""
Test parse_cargo_toml
"""
def mock_loads(loadstr):
return {'dependencies': ['dep1', 'dep2', 'dep3'], 'bin': True}
def mock_exists(path):
return True
exists_backup = buildreq.os.path.exists
loads_backup = buildreq.toml.loads
buildreq.os.path.exists = mock_exists
buildreq.toml.loads = mock_loads
open_name = 'buildreq.util.open_auto'
content = 'does not matter, let us mock'
m_open = mock_open(read_data=content)
conf = config.Config("")
with patch(open_name, m_open, create=True):
self.reqs.parse_cargo_toml('filename', conf)
buildreq.os.path.exists = exists_backup
buildreq.toml.loads = loads_backup
self.assertEqual(self.reqs.buildreqs,
set(['rustc', 'dep1', 'dep2', 'dep3']))
self.assertTrue(self.reqs.cargo_bin)
self.assertEqual(conf.default_pattern, 'cargo')
def test_set_build_req_ruby(self):
"""
Test set_build_req with default_pattern set to ruby.
This is just a simple test for the inclusion of a single package, in
case the overall package list changes in the future.
"""
conf = config.Config("")
conf.default_pattern = "ruby"
self.reqs.set_build_req(conf)
self.assertIn('ruby', self.reqs.buildreqs)
def test_set_build_req_cargo(self):
"""
Test set_build_req with default_pattern set to cargo.
This is just a simple test for the inclusion of a single package, in
case the overall package list changes in the future.
"""
conf = config.Config("")
conf.default_pattern = "cargo"
self.reqs.set_build_req(conf)
self.assertIn('rustc', self.reqs.buildreqs)
def test_rakefile(self):
"""
Test rakefile parsing with both configured gems and unconfigured gems
"""
conf = config.Config("")
conf.setup_patterns()
open_name = 'buildreq.util.open_auto'
content = "line1\nrequire 'bundler/gem_tasks'\nline3\nrequire 'nope'"
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
self.reqs.rakefile('filename', conf.gems)
self.assertEqual(self.reqs.buildreqs, set(['rubygem-rubygems-tasks']))
@patch('buildreq.pypidata.get_pypi_name', get_pypi_name_wrapper)
def test_clean_python_req(self):
"""
@@ -496,7 +398,6 @@ class TestBuildreq(unittest.TestCase):
conf = config.Config("")
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'subdir', 'test.go'), 'w').close()
open(os.path.join(tmpd, 'setup.py'), 'w').close()
open(os.path.join(tmpd, 'CMakeLists.txt'), 'w').close()
open(os.path.join(tmpd, 'SConstruct'), 'w').close()
@@ -505,7 +406,7 @@ class TestBuildreq(unittest.TestCase):
self.reqs.scan_for_configure(tmpd, "", conf)
self.assertEqual(self.reqs.buildreqs,
set(['buildreq-golang', 'buildreq-cmake', 'buildreq-scons', 'buildreq-distutils3', 'buildreq-meson']))
set(['buildreq-cmake', 'buildreq-scons', 'buildreq-distutils3', 'buildreq-meson']))
def test_scan_for_configure_pypi(self):
"""
-1
View File
@@ -10,7 +10,6 @@ BUILD_PAT_URL = [
("https://pypi.python.org/packages/source/T/Tempita/Tempita-0.5.2.tar.gz", "distutils3"),
("https://cpan.metacpan.org/authors/id/T/TO/TODDR/IO-Tty-1.14.tar.gz", "cpan"),
("http://search.cpan.org/CPAN/authors/id/D/DS/DSKOLL/IO-stringy-2.111.tar.gz", "cpan"),
("https://proxy.golang.org/github.com/spf13/pflag/@v/list", "godep"),
("https://pecl.php.net//get/lua-2.0.6.tgz", "phpize"),
]
-51
View File
@@ -17,7 +17,6 @@ TESTKEYDIR = os.path.join(TESTDIR, "testkeys")
PACKAGE_URL = "http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.1.tar.gz"
XATTR_PKT_URL = "http://pypi.debian.net/xattr/xattr-0.9.1.tar.gz"
NO_SIGN_PKT_URL = "http://www.ferzkopp.net/Software/SDL_gfx-2.0/SDL_gfx-2.0.25.tar.gz"
GEM_PKT = "https://rubygems.org/downloads/hoe-debugging-1.2.1.gem"
NOSIGN_PKT_URL_BAD = "http://gnu.mirrors.pair.com/savannah/savannah/quagga/bad_quagga-1.1.0.tar.gz"
NOSIGN_PKT_URL = "http://download.savannah.gnu.org/releases/quagga/quagga-1.1.0.tar.gz"
NOSIGN_SIGN_URL = "http://download.savannah.gnu.org/releases/quagga/quagga-1.1.0.tar.gz.asc"
@@ -131,50 +130,6 @@ class TestDomainBasedVerifiers(unittest.TestCase):
self.assertTrue(result)
@patch('download.do_curl', mock_download_do_curl)
class TestGEMShaVerifier(unittest.TestCase):
def _mock_get_gem_info(pkg):
info = '''
[
{
"number": "2.0.0",
"sha": "2ac86b58bd2d0b4164c6d82e6d46381c987c47b0eb76428fd6e616370af2cc67"
},
{
"number": "1.2.1",
"sha": "b391da81ea5efb96d648e69c852e386a269129f543e371c8db64ada80342ac5f"
}
]
'''
return json.loads(info)
@patch('pkg_integrity.GEMShaVerifier.get_rubygems_info', _mock_get_gem_info)
def test_from_url(self):
with tempfile.TemporaryDirectory() as tmpd:
conf = config.Config(tmpd)
conf.rewrite_config_opts = unittest.mock.Mock()
conf.config_opts['verify_required'] = False
filen = os.path.basename(GEM_PKT)
shutil.copy(os.path.join(TESTDIR, filen), tmpd)
result = pkg_integrity.check(GEM_PKT, conf)
self.assertTrue(result)
@patch('pkg_integrity.GEMShaVerifier.get_rubygems_info', _mock_get_gem_info)
def test_non_matchingsha(self):
with tempfile.TemporaryDirectory() as tmpd:
conf = config.Config(tmpd)
conf.rewrite_config_opts = unittest.mock.Mock()
conf.config_opts['verify_required'] = False
out_file = os.path.join(tmpd, os.path.basename(GEM_PKT))
f = open(out_file, 'wb')
f.write(b'this is made up data that will force a failure')
f.close()
with self.assertRaises(SystemExit) as a:
pkg_integrity.check(GEM_PKT, conf)
self.assertEqual(a.exception.code, 1)
@patch('download.do_curl', mock_download_do_curl)
class TestGPGVerifier(unittest.TestCase):
@@ -370,12 +325,6 @@ class TestUtils(unittest.TestCase):
)
self.assertTrue(isinstance(y, pkg_integrity.GPGVerifier))
z = pkg_integrity.get_verifier('jeweler-2.1.1.gem')(
package_path='',
url='https://rubygems.org/downloads/jeweler-2.1.1.gem'
)
self.assertTrue(isinstance(z, pkg_integrity.GEMShaVerifier))
def test_parse_gpg_packets_for_keyid(self):
"""Test parse_gpg_packets() to retrieve keyid info."""
def check_packets(algo, key_id, packet_count, packet_with_val):
+4 -8
View File
@@ -78,20 +78,16 @@ class TestSpecfileWrite(unittest.TestCase):
self.specfile.config.sources["archive"] = ["archA", "archD", "archB", "archC"]
self.specfile.config.sources["tmpfile"] = ["tmp1", "tmp2"]
self.specfile.config.sources["gcov"] = ["pkg.gcov"]
self.specfile.config.sources["godep"] = ["pkg.godep"]
self.specfile.config.sources["version"] = ["pkg.oldver"]
self.specfile.write_sources()
expect = ["Source1 : archA\n",
"Source2 : archB\n",
"Source3 : archC\n",
"Source4 : archD\n",
"Source5 : pkg.gcov\n",
"Source6 : pkg.godep\n",
"Source7 : pkg.oldver\n",
"Source8 : pkg1.service\n",
"Source9 : pkg2.service\n",
"Source10 : tmp1\n",
"Source11 : tmp2\n"]
"Source6 : pkg1.service\n",
"Source7 : pkg2.service\n",
"Source8 : tmp1\n",
"Source9 : tmp2\n"]
self.assertEqual(expect, self.WRITES)
def test_write_summary(self):
-61
View File
@@ -79,7 +79,6 @@ SRC_CREATION = [
("https://example/src-prefix.tar", "", "/tmp/src-prefix.tar", CONTENT_PREFIX, "tar", "common-prefix", None),
("https://example/src-subdir.tar", "", "/tmp/src-subdir.tar", CONTENT_SUBDIR, "tar", "", "src-subdir"),
("https://example/src-no-extractable.tar", ":", "/tmp/src-no-extractable.tar", None, None, None, None),
("https://example/go-src/list", "", "/tmp/list", None, "go", "", "list"),
]
@@ -214,66 +213,6 @@ class TestTarball(unittest.TestCase):
self.content.set_gcov()
self.assertEqual(self.content.gcov_file, 'test.gcov')
def test_set_multi_version_no_ver(self):
versions = OrderedDict()
self.content.config.parse_config_versions = lambda: versions
self.content.config.default_pattern = ""
latest = self.content.set_multi_version("")
self.assertEqual(latest, "1")
self.assertNotEqual(id(self.content.multi_version), id(versions))
def test_set_multi_version_with_ver(self):
versions = OrderedDict()
self.content.config.parse_config_versions = lambda: versions
self.content.config.default_pattern = ""
latest = self.content.set_multi_version("3")
self.assertEqual(latest, "3")
self.assertNotEqual(id(self.content.multi_version), id(versions))
def test_process_go_archives(self):
"""Test for tarball.process_go_archives method."""
# Set up input values
self.content.url = 'https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/list'
self.content.multi_version = ['v0.3.1', 'v0.3.0', 'v0.2.0']
go_archives = []
go_archives_expected = [
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.1.info", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.1.mod", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.1.zip", "",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.0.info", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.0.mod", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.3.0.zip", "",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.2.0.info", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.2.0.mod", ":",
"https://proxy.golang.org/github.com/!burnt!sushi/toml/@v/v0.2.0.zip", "",
]
self.content.process_go_archives(go_archives)
self.assertEqual(go_archives, go_archives_expected)
def test_process_multiver_archives(self):
"""Test for tarball.process_multiver_archives method."""
# Set up input values
main_src = tarball.Source('https://example/src-5.0.tar', ':', '/tmp/src.tar')
multiver_archives = []
config_versions = {
'5.0': 'https://example/src-5.0.tar',
'4.0': 'https://example/src-4.0.tar',
'3.5': 'https://example/src-3.5.tar',
'3.0': 'https://example/src-3.0.tar',
}
expected_multiver_archives = [
'https://example/src-4.0.tar', '',
'https://example/src-3.5.tar', '',
'https://example/src-3.0.tar', '',
]
# Set up a return value for parse_config_versions method
attrs = {'parse_config_versions.return_value': config_versions}
conf = MagicMock()
conf.configure_mock(**attrs)
self.content.config = conf
self.content.process_multiver_archives(main_src, multiver_archives)
self.assertEqual(multiver_archives, expected_multiver_archives)
@patch('tarball.Source.set_prefix', Mock())
@patch('tarball.Source.extract', Mock())
def test_extract_sources(self):