def check(self, **kwargs): '''Checks the ebuild sources and files for errors @param checkdir: string, directory path @param checkdir_relative: repolevel determined path @param changed: dictionary instance @returns: dictionary ''' checkdir = kwargs.get('checkdir') checkdirlist = kwargs.get('checkdirlist').get() checkdir_relative = kwargs.get('checkdir_relative') changed = kwargs.get('changed').changed new = kwargs.get('changed').new for y_file in checkdirlist: index = self.repo_settings.repo_config.find_invalid_path_char(y_file) if index != -1: y_relative = os.path.join(checkdir_relative, y_file) invcs = self.vcs_settings.vcs is not None inchangeset = vcs_new_changed(y_relative, changed, new) if invcs and not inchangeset: # If the file isn't in the VCS new or changed set, then # assume that it's an irrelevant temporary file (Manifest # entries are not generated for file names containing # prohibited characters). See bug #406877. index = -1 if index != -1: self.qatracker.add_error( "file.name", "%s/%s: char '%s'" % (checkdir, y_file, y_file[index])) if not ( y_file in ("ChangeLog", "metadata.xml") or y_file.endswith(".ebuild")): continue f = None try: line = 1 f = io.open( _unicode_encode( os.path.join(checkdir, y_file), encoding=_encodings['fs'], errors='strict'), mode='r', encoding=_encodings['repo.content']) for l in f: line += 1 except UnicodeDecodeError as ue: s = ue.object[:ue.start] l2 = s.count("\n") line += l2 if l2 != 0: s = s[s.rfind("\n") + 1:] self.qatracker.add_error( "file.UTF8", "%s/%s: line %i, just after: '%s'" % ( checkdir, y_file, line, s)) finally: if f is not None: f.close() return False
def check(self, **kwargs): '''Checks the ebuild sources and files for errors @param checkdir: string, directory path @param checkdir_relative: repolevel determined path @param changed: dictionary instance @returns: dictionary ''' checkdir = kwargs.get('checkdir') checkdirlist = kwargs.get('checkdirlist').get() checkdir_relative = kwargs.get('checkdir_relative') changed = kwargs.get('changed').changed new = kwargs.get('changed').new for y_file in checkdirlist: index = self.repo_settings.repo_config.find_invalid_path_char( y_file) if index != -1: y_relative = os.path.join(checkdir_relative, y_file) invcs = self.vcs_settings.vcs is not None inchangeset = vcs_new_changed(y_relative, changed, new) if invcs and not inchangeset: # If the file isn't in the VCS new or changed set, then # assume that it's an irrelevant temporary file (Manifest # entries are not generated for file names containing # prohibited characters). See bug #406877. index = -1 if index != -1: self.qatracker.add_error( "file.name", "%s/%s: char '%s'" % (checkdir, y_file, y_file[index])) if not (y_file in ("ChangeLog", "metadata.xml") or y_file.endswith(".ebuild")): continue f = None try: line = 1 f = io.open(_unicode_encode(os.path.join(checkdir, y_file), encoding=_encodings['fs'], errors='strict'), mode='r', encoding=_encodings['repo.content']) for l in f: line += 1 except UnicodeDecodeError as ue: s = ue.object[:ue.start] l2 = s.count("\n") line += l2 if l2 != 0: s = s[s.rfind("\n") + 1:] self.qatracker.add_error( "file.UTF8", "%s/%s: line %i, just after: '%s'" % (checkdir, y_file, line, s)) finally: if f is not None: f.close() return False
def check(self, **kwargs): '''Checks the ebuild sources and files for errors @param xpkg: the pacakge being checked @param checkdir: string, directory path @param checkdir_relative: repolevel determined path @returns: boolean ''' xpkg = kwargs.get('xpkg') checkdir = kwargs.get('checkdir') checkdir_relative = kwargs.get('checkdir_relative') changed = kwargs.get('changed').changed new = kwargs.get('changed').new _digests = self.digests(checkdir) fetchlist_dict = portage.FetchlistDict( checkdir, self.repoman_settings, self.portdb) myfiles_all = [] self._src_uri_error = False for mykey in fetchlist_dict: try: myfiles_all.extend(fetchlist_dict[mykey]) except portage.exception.InvalidDependString as e: self._src_uri_error = True try: self.portdb.aux_get(mykey, ["SRC_URI"]) except KeyError: # This will be reported as an "ebuild.syntax" error. pass else: self.qatracker.add_error( "SRC_URI.syntax", "%s.ebuild SRC_URI: %s" % (mykey, e)) del fetchlist_dict if not self._src_uri_error: # This test can produce false positives if SRC_URI could not # be parsed for one or more ebuilds. There's no point in # producing a false error here since the root cause will # produce a valid error elsewhere, such as "SRC_URI.syntax" # or "ebuild.sytax". myfiles_all = set(myfiles_all) for entry in _digests: if entry not in myfiles_all: self.qatracker.add_error("digest.unused", checkdir + "::" + entry) for entry in myfiles_all: if entry not in _digests: self.qatracker.add_error("digest.missing", checkdir + "::" + entry) del myfiles_all if os.path.exists(checkdir + "/files"): filesdirlist = os.listdir(checkdir + "/files") # Recurse through files directory, use filesdirlist as a stack; # appending directories as needed, # so people can't hide > 20k files in a subdirectory. while filesdirlist: y = filesdirlist.pop(0) relative_path = os.path.join(xpkg, "files", y) full_path = os.path.join(self.repo_settings.repodir, relative_path) try: mystat = os.stat(full_path) except OSError as oe: if oe.errno == 2: # don't worry about it. it likely was removed via fix above. continue else: raise oe if S_ISDIR(mystat.st_mode): if self.vcs_settings.status.isVcsDir(y): continue for z in os.listdir(checkdir + "/files/" + y): if self.vcs_settings.status.isVcsDir(z): continue filesdirlist.append(y + "/" + z) # Current policy is no files over 20 KiB, these are the checks. # File size between 20 KiB and 60 KiB causes a warning, # while file size over 60 KiB causes an error. elif mystat.st_size > 61440: self.qatracker.add_error( "file.size.fatal", "(%d KiB) %s/files/%s" % ( mystat.st_size // 1024, xpkg, y)) elif mystat.st_size > 20480: self.qatracker.add_error( "file.size", "(%d KiB) %s/files/%s" % ( mystat.st_size // 1024, xpkg, y)) index = self.repo_settings.repo_config.find_invalid_path_char(y) if index != -1: y_relative = os.path.join(checkdir_relative, "files", y) if self.vcs_settings.vcs is not None \ and not vcs_new_changed(y_relative, changed, new): # If the file isn't in the VCS new or changed set, then # assume that it's an irrelevant temporary file (Manifest # entries are not generated for file names containing # prohibited characters). See bug #406877. index = -1 if index != -1: self.qatracker.add_error( "file.name", "%s/files/%s: char '%s'" % (checkdir, y, y[index])) return False
def check(self, **kwargs): '''Checks the ebuild sources and files for errors @param xpkg: the pacakge being checked @param checkdir: string, directory path @param checkdir_relative: repolevel determined path @returns: boolean ''' xpkg = kwargs.get('xpkg') checkdir = kwargs.get('checkdir') checkdir_relative = kwargs.get('checkdir_relative') changed = kwargs.get('changed').changed new = kwargs.get('changed').new _digests = self.digests(checkdir) fetchlist_dict = portage.FetchlistDict(checkdir, self.repoman_settings, self.portdb) myfiles_all = [] self._src_uri_error = False for mykey in fetchlist_dict: try: myfiles_all.extend(fetchlist_dict[mykey]) except portage.exception.InvalidDependString as e: self._src_uri_error = True try: self.portdb.aux_get(mykey, ["SRC_URI"]) except KeyError: # This will be reported as an "ebuild.syntax" error. pass else: self.qatracker.add_error( "SRC_URI.syntax", "%s.ebuild SRC_URI: %s" % (mykey, e)) del fetchlist_dict if not self._src_uri_error: # This test can produce false positives if SRC_URI could not # be parsed for one or more ebuilds. There's no point in # producing a false error here since the root cause will # produce a valid error elsewhere, such as "SRC_URI.syntax" # or "ebuild.sytax". myfiles_all = set(myfiles_all) for entry in _digests: if entry not in myfiles_all: self.qatracker.add_error("digest.unused", checkdir + "::" + entry) for entry in myfiles_all: if entry not in _digests: self.qatracker.add_error("digest.missing", checkdir + "::" + entry) del myfiles_all if os.path.exists(checkdir + "/files"): filesdirlist = os.listdir(checkdir + "/files") # Recurse through files directory, use filesdirlist as a stack; # appending directories as needed, # so people can't hide > 20k files in a subdirectory. while filesdirlist: y = filesdirlist.pop(0) relative_path = os.path.join(xpkg, "files", y) full_path = os.path.join(self.repo_settings.repodir, relative_path) try: mystat = os.stat(full_path) except OSError as oe: if oe.errno == 2: # don't worry about it. it likely was removed via fix above. continue else: raise oe if S_ISDIR(mystat.st_mode): if self.vcs_settings.status.isVcsDir(y): continue for z in os.listdir(checkdir + "/files/" + y): if self.vcs_settings.status.isVcsDir(z): continue filesdirlist.append(y + "/" + z) # Current policy is no files over 20 KiB, these are the checks. # File size between 20 KiB and 60 KiB causes a warning, # while file size over 60 KiB causes an error. elif mystat.st_size > 61440: self.qatracker.add_error( "file.size.fatal", "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y)) elif mystat.st_size > 20480: self.qatracker.add_error( "file.size", "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y)) index = self.repo_settings.repo_config.find_invalid_path_char( y) if index != -1: y_relative = os.path.join(checkdir_relative, "files", y) if self.vcs_settings.vcs is not None \ and not vcs_new_changed(y_relative, changed, new): # If the file isn't in the VCS new or changed set, then # assume that it's an irrelevant temporary file (Manifest # entries are not generated for file names containing # prohibited characters). See bug #406877. index = -1 if index != -1: self.qatracker.add_error( "file.name", "%s/files/%s: char '%s'" % (checkdir, y, y[index])) return False