diff --git a/README.rst b/README.rst index c968f24..672ec5f 100644 --- a/README.rst +++ b/README.rst @@ -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 diff --git a/autospec/autospec.py b/autospec/autospec.py index 016f992..b8d0bd7 100644 --- a/autospec/autospec.py +++ b/autospec/autospec.py @@ -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 diff --git a/autospec/build.py b/autospec/build.py index 2e6930a..6d4ed4d 100644 --- a/autospec/build.py +++ b/autospec/build.py @@ -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) diff --git a/autospec/buildreq.py b/autospec/buildreq.py index 6374a99..a46202b 100644 --- a/autospec/buildreq.py +++ b/autospec/buildreq.py @@ -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": diff --git a/autospec/check.py b/autospec/check.py index 3e71fd3..fa49dbc 100644 --- a/autospec/check.py +++ b/autospec/check.py @@ -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'): diff --git a/autospec/config.py b/autospec/config.py index 1dbef29..e0a6a6e 100644 --- a/autospec/config.py +++ b/autospec/config.py @@ -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") diff --git a/autospec/failed_commands b/autospec/failed_commands index 09b0229..ed043ce 100644 --- a/autospec/failed_commands +++ b/autospec/failed_commands @@ -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 diff --git a/autospec/files.py b/autospec/files.py index e25a719..b598bb9 100644 --- a/autospec/files.py +++ b/autospec/files.py @@ -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"), diff --git a/autospec/gems b/autospec/gems deleted file mode 100644 index 206556d..0000000 --- a/autospec/gems +++ /dev/null @@ -1,33 +0,0 @@ -# This file contains failure patterns and the ruby gems they are associated with -# in the form: , -# 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 diff --git a/autospec/pkg_integrity.py b/autospec/pkg_integrity.py index e1575a1..a874d42 100644 --- a/autospec/pkg_integrity.py +++ b/autospec/pkg_integrity.py @@ -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: diff --git a/autospec/specfiles.py b/autospec/specfiles.py index ce41f41..04bbb54 100644 --- a/autospec/specfiles.py +++ b/autospec/specfiles.py @@ -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() diff --git a/autospec/tarball.py b/autospec/tarball.py index dc6d010..1e12568 100644 --- a/autospec/tarball.py +++ b/autospec/tarball.py @@ -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) diff --git a/tests/builderrors b/tests/builderrors index 45cf1ad..76407ba 100644 --- a/tests/builderrors +++ b/tests/builderrors @@ -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 diff --git a/tests/packageurls b/tests/packageurls index 5ca8a94..0e28274 100644 --- a/tests/packageurls +++ b/tests/packageurls @@ -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 diff --git a/tests/test_build.py b/tests/test_build.py index 199d78b..e014ff0 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -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 diff --git a/tests/test_buildreq.py b/tests/test_buildreq.py index 95c5de0..a934f22 100644 --- a/tests/test_buildreq.py +++ b/tests/test_buildreq.py @@ -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): """ diff --git a/tests/test_config.py b/tests/test_config.py index a27ac8e..9ee6497 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -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"), ] diff --git a/tests/test_pkg_integrity.py b/tests/test_pkg_integrity.py index 83576b9..0dca099 100644 --- a/tests/test_pkg_integrity.py +++ b/tests/test_pkg_integrity.py @@ -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): diff --git a/tests/test_specfile.py b/tests/test_specfile.py index dfaa621..76db567 100644 --- a/tests/test_specfile.py +++ b/tests/test_specfile.py @@ -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): diff --git a/tests/test_tarball.py b/tests/test_tarball.py index 64d7713..522e9f2 100644 --- a/tests/test_tarball.py +++ b/tests/test_tarball.py @@ -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):