#!/usr/local/bin/python # # ---------------------------------------------------------------------------- # "THE BEER-WARE LICENSE" (Revision 42, (c) Poul-Henning Kamp): # Maxim Sobolev wrote this file. As long as you retain # this notice you can do whatever you want with this stuff. If we meet some # day, and you think this stuff is worth it, you can buy me a beer in return. # # Maxim Sobolev # ---------------------------------------------------------------------------- # # $FreeBSD$ # # MAINTAINER= sobomax@FreeBSD.org <- any unapproved commits to this file are # highly discouraged!!! # import os, os.path, popen2, types, sys, getopt, pickle # Global constants and semi-constants PKG_DBDIR = '/var/db/pkg' PORTSDIR = '/usr/ports' ROOT_PORTMK = '/usr/share/mk/bsd.port.mk' PLIST_FILE = '+CONTENTS' ORIGIN_PREF = '@comment ORIGIN:' MAKEFILE = 'Makefile' MAKE = 'make' ERR_PREF = 'Error:' WARN_PREF = 'Warning:' # Global variables # # PortInfo cache picache = {} # Useful aliases op_isdir = os.path.isdir op_join = os.path.join op_split = os.path.split op_abspath = os.path.abspath # # Query origin of specified installed package. # def getorigin(pkg): plist = op_join(PKG_DBDIR, pkg, PLIST_FILE) for line in open(plist).xreadlines(): if line.startswith(ORIGIN_PREF): origin = line[len(ORIGIN_PREF):].strip() break else: raise RuntimeError('%s: no origin recorded' % plist) return origin # # Execute external command and return content of its stdout. # def getcmdout(cmdline, filterempty = 1): pipe = popen2.Popen3(cmdline, 1) results = pipe.fromchild.readlines() for stream in (pipe.fromchild, pipe.tochild, pipe.childerr): stream.close() if pipe.wait() != 0: if type(cmdline) is types.StringType: cmdline = (cmdline) raise IOError('%s: external command returned non-zero error code' % \ cmdline[0]) if filterempty != 0: results = filter(lambda line: len(line.strip()) > 0, results) return results # # For a specified path (either dir or makefile) query requested make(1) # variables and return them as a tuple in exactly the same order as they # were specified in function call, i.e. querymakevars('foo', 'A', 'B') will # return a tuple with a first element being the value of A variable, and # the second one - the value of B. # def querymakevars(path, *vars): if op_isdir(path): path = op_join(path, MAKEFILE) dirname, makefile = op_split(path) cmdline = [MAKE, '-f', makefile] savedir = os.getcwd() os.chdir(dirname) try: for var in vars: cmdline.extend(('-V', var)) results = map(lambda line: line.strip(), getcmdout(cmdline, 0)) finally: os.chdir(savedir) return tuple(results) def parsedeps(depstr): return tuple(map(lambda dep: dep.split(':'), depstr.split())) # # For a specified port return either a new instance of the PortInfo class, # or existing instance from the cache. # def getpi(path): path = op_abspath(path) if not picache.has_key(path): picache[path] = PortInfo(path) return picache[path] # # Format text string according to requested constrains. Useful when you have # to display multi-line, variable width message on terminal. # def formatmsg(msg, wrapat = 78, seclindent = 0): words = msg.split() result = '' position = 0 for word in words: if position + 1 + len(word) > wrapat: result += '\n' + ' ' * seclindent + word position = seclindent + len(word) else: if position != 0: result += ' ' position += 1 result += word position += len(word) return result # # Class that contain main info about the port # class PortInfo: PKGNAME = None CATEGORIES = None MAINTAINER = None BUILD_DEPENDS = None LIB_DEPENDS = None RUN_DEPENDS = None PKGORIGIN = None # Cached values, to speed-up things __deps = None __bt_deps = None __rt_deps = None def __init__(self, path): self.PKGNAME, self.CATEGORIES, self.MAINTAINER, self.BUILD_DEPENDS, \ self.LIB_DEPENDS, self.RUN_DEPENDS, self.PKGORIGIN = \ querymakevars(path, 'PKGNAME', 'CATEGORIES', 'MAINTAINER', \ 'BUILD_DEPENDS', 'LIB_DEPENDS', 'RUN_DEPENDS', 'PKGORIGIN') def __str__(self): return 'PKGNAME:\t%s\nCATEGORIES:\t%s\nMAINTAINER:\t%s\n' \ 'BUILD_DEPENDS:\t%s\nLIB_DEPENDS:\t%s\nRUN_DEPENDS:\t%s\n' \ 'PKGORIGIN:\t%s' % (self.PKGNAME, self.CATEGORIES, self.MAINTAINER, \ self.BUILD_DEPENDS, self.LIB_DEPENDS, self.RUN_DEPENDS, \ self.PKGORIGIN) def getdeps(self): if self.__deps == None: result = [] for depstr in self.BUILD_DEPENDS, self.LIB_DEPENDS, \ self.RUN_DEPENDS: deps = tuple(map(lambda dep: dep[1], parsedeps(depstr))) result.append(deps) self.__deps = tuple(result) return self.__deps def get_bt_deps(self): if self.__bt_deps == None: topdeps = self.getdeps() topdeps = list(topdeps[0] + topdeps[1]) for dep in topdeps[:]: botdeps = filter(lambda dep: dep not in topdeps, \ getpi(dep).get_rt_deps()) topdeps.extend(botdeps) self.__bt_deps = tuple(topdeps) return self.__bt_deps def get_rt_deps(self): if self.__rt_deps == None: topdeps = self.getdeps() topdeps = list(topdeps[1] + topdeps[2]) for dep in topdeps[:]: botdeps = filter(lambda dep: dep not in topdeps, \ getpi(dep).get_rt_deps()) topdeps.extend(botdeps) self.__rt_deps = tuple(topdeps) return self.__rt_deps def write_msg(*message): if type(message) == types.StringType: message = message, message = tuple(filter(lambda line: line != None, message)) sys.stderr.writelines(message) # # Print optional message and usage information and exit with specified exit # code. # def usage(code, msg = None): myname = os.path.basename(sys.argv[0]) if msg != None: msg = str(msg) + '\n' write_msg(msg, "Usage: %s [-rb] [-l|L cachefile] [-s cachefile]\n" % \ myname) sys.exit(code) def main(): global picache # Parse command line arguments try: opts, args = getopt.getopt(sys.argv[1:], 'erbl:L:s:') except getopt.GetoptError, msg: usage(2, msg) if len(args) > 0 or len(opts) == 0 : usage(2) cachefile = None chk_bt_deps = 0 chk_rt_deps = 0 warn_as_err = 0 for o, a in opts: if o == '-b': chk_bt_deps = 1 elif o == '-r': chk_rt_deps = 1 elif o in ('-l', '-L'): # Try to load saved PortInfo cache try: picache = pickle.load(open(a)) except: picache = {} try: if o == '-L': os.unlink(a) except: pass elif o == '-s': cachefile = a elif o == '-e': warn_as_err = 1 # Load origins of all installed packages instpkgs = os.listdir(PKG_DBDIR) instpkgs = filter(lambda pkg: op_isdir(op_join(PKG_DBDIR, pkg)), instpkgs) origins = {} for pkg in instpkgs: origins[pkg] = getorigin(pkg) # Resolve dependencies for the current port info = getpi(os.getcwd()) deps = [] if chk_bt_deps != 0: deps.extend(filter(lambda d: d not in deps, info.get_bt_deps())) if chk_rt_deps != 0: deps.extend(filter(lambda d: d not in deps, info.get_rt_deps())) # Perform validation nerrs = 0 nwarns = 0 if warn_as_err == 0: warn_pref = WARN_PREF else: warn_pref = ERR_PREF err_pref = ERR_PREF for dep in deps: pi = getpi(dep) if pi.PKGORIGIN not in origins.values(): print formatmsg(seclindent = 7 * 0, msg = \ '%s package %s (%s) belongs to dependency chain, but ' \ 'isn\'t installed.' % (err_pref, pi.PKGNAME, pi.PKGORIGIN)) nerrs += 1 elif pi.PKGNAME not in origins.keys(): for instpkg in origins.keys(): if origins[instpkg] == pi.PKGORIGIN: break print formatmsg(seclindent = 9 * 0, msg = \ '%s package %s (%s) belongs to dependency chain, but ' \ 'package %s is installed instead. Perhaps it\'s an older ' \ 'version - update is highly recommended.' % (warn_pref, \ pi.PKGNAME, pi.PKGORIGIN, instpkg)) nwarns += 1 # Save PortInfo cache if requested if cachefile != None: try: pickle.dump(picache, open(cachefile, 'w')) except: pass if warn_as_err != 0: nerrs += nwarns return nerrs PORTSDIR, PKG_DBDIR = querymakevars(ROOT_PORTMK, 'PORTSDIR', 'PKG_DBDIR') if __name__ == '__main__': try: sys.exit(main()) except KeyboardInterrupt: pass /tr> * Remove expired port:rene2015-08-169-142/+1 * Update to upstream version 0.9.3riggs2015-08-163-9/+6 * Tidy-up a bit the Makefileromain2015-08-161-1/+1 * - Drop @dirrm* from plistamdmi32015-08-161-10/+0 * - Update to version 2.4.1pawel2015-08-165-43/+3 * Add a pkg-message to Perl 5.20+ about the /usr/bin/perl symlink.mat2015-08-166-2/+36 * Opps, forgot to actually add the patch file to actually give us the new disk ...brd2015-08-161-0/+385 * Mark broken.romain2015-08-161-0/+2 * Update to 4.0.3.20.romain2015-08-165-5/+21 * Fix build - perl used during build.shurd2015-08-161-1/+2 * - Remove MASTER_SITE_SUBDIRsunpoet2015-08-161-1/+1 * lang/squeak: image update to 4.6-15102jbeich2015-08-163-20/+24 * lang/urweb: update to 20150520jbeich2015-08-162-3/+3 * archivers/pigz: convert to system libzopfli and respect CC/CFLAGS/LDFLAGSjbeich2015-08-162-12/+13 * archivers/zopfli: update to 1.0.0.31 (snapshot)jbeich2015-08-163-11/+49 * deskutils/treesheets: update to 0.0.20150711jbeich2015-08-162-4/+6 * games/pioneers: minor cleanupjbeich2015-08-162-23/+23 * games/pioneers: update to 15.3jbeich2015-08-163-6/+7 * games/stonesoup: update to 0.16.2jbeich2015-08-162-3/+3 * games/openra: update GeoLite2 to August snapshotjbeich2015-08-162-3/+3 * devel/onscripter: update to 20150811jbeich2015-08-162-3/+3 * print/fontforge: sync version and mirrors with print/freetype2jbeich2015-08-162-5/+7 * net/scamper: update to 20141211ajbeich2015-08-163-3/+4 * sysutils/s6: update to 2.1.6.0jbeich2015-08-166-11/+20 * lang/execline: update to 2.1.3.0jbeich2015-08-163-6/+9 * devel/skalibs: update to 2.3.6.0jbeich2015-08-163-5/+7 * devel/android-tools-{adb,fastboot}-devel: update to m.p.890jbeich2015-08-164-15/+15 * devel/android-tools-*: consistently prefix distfiles with multi-githubjbeich2015-08-163-8/+8 * - Update Thunderbird to 38.2.0jbeich2015-08-167-126/+125 * - Update to 3.3.1sunpoet2015-08-162-3/+3 * - Update to 2.0.2sunpoet2015-08-162-3/+3 * - Update to 0.20.2sunpoet2015-08-162-3/+3 * - Update to 4.0.2sunpoet2015-08-162-3/+3 * - Cleanup outdated OSVERSION checksunpoet2015-08-161-7/+1 * - Update to 7.4.826sunpoet2015-08-162-3/+3 * - Update to 2.13.5sunpoet2015-08-163-5/+4 * - Add rubygem-puppet_forge1 1.0.5 (copied from rubygem-puppet_forge)sunpoet2015-08-166-1/+41 * - Add NO_ARCHsunpoet2015-08-162-2/+4 * - Add NO_ARCHsunpoet2015-08-162-1/+2 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-162-2/+3 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Add NO_ARCHsunpoet2015-08-162-1/+2 * - Add NO_ARCHsunpoet2015-08-162-1/+2 * - Add NO_ARCHsunpoet2015-08-162-1/+2 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update WWWsunpoet2015-08-161-1/+1 * - Update to 0.15sunpoet2015-08-162-3/+4 * - Update to 1.5.38danilo2015-08-162-3/+3 * - Update to 0.8.0nivit2015-08-164-10/+6 * Update to FreeCiv 2.5.1 (bugfix release)johans2015-08-163-4/+4 * - Remove qt4-linguist dependency; add qt4-network instead.vg2015-08-161-3/+4 * Update WWW to a better site.adamw2015-08-161-1/+1 * Update to 7.4.adamw2015-08-168-759/+765 * Add a patch for SpamAssassin bug #7231 that resolves an incompatibilityadamw2015-08-162-1/+28 * Remove the suggestion to add session.auto_start=1 to php.ini ifadamw2015-08-162-5/+3 * Update to sources from DragonFlyBSD 4.2.4.adamw2015-08-167-179/+3 * - Resurrect lang/quack port, unbreak, and update to the latest version (0.47)danfe2015-08-156-1/+50 * Update to 1.6.6.adamw2015-08-152-4/+3 * - Don't always depend on devel/argp-standalone - it is used only by v4l-utilsriggs2015-08-152-5/+84 * - Update to 0.18.0.novel2015-08-154-44/+3 * - Use base OpenSSL on FreeBSD 10.2kevlo2015-08-151-0/+9 * - Get rid of MASTER_SITE_SUBDIR (in fact, OLD subdirectory does not carrydanfe2015-08-151-3/+2 * editors/codelite: Up to version 8.1.bsam2015-08-159-196/+37 * Add missing RUN_DEPENDSfeld2015-08-151-5/+6 * Fix numerous issues with "Broken for more than 6 months" phrase:danfe2015-08-151-171/+171 * - Update to 10.2.0vg2015-08-153-43/+8 * - Fix PLISTsunpoet2015-08-151-0/+3 * - Update to 2.13.0sunpoet2015-08-152-3/+3 * - Update to 1.0.7sunpoet2015-08-152-3/+3 * - Update RUN_DEPENDS: use Rails 4 and newer rubygem-sass-railssunpoet2015-08-151-3/+4 * - Update to 2.0.5sunpoet2015-08-152-4/+4 * - Update to 2.0.0sunpoet2015-08-153-15/+7 * - Update to 2.15.4sunpoet2015-08-152-3/+3 * - Add NO_ARCHsunpoet2015-08-151-0/+1 * - Use CONFLICTS_INSTALL instead of CONFLICTSsunpoet2015-08-152-4/+5 * - Add LICENSEsunpoet2015-08-151-1/+4 * - Update to 0.30sunpoet2015-08-152-3/+3 * - Add NO_ARCHsunpoet2015-08-152-2/+3 * - Add NO_ARCHsunpoet2015-08-151-0/+1 * - Update to 20150815sunpoet2015-08-152-4/+4 * - Add NO_ARCHsunpoet2015-08-151-0/+1 * - Update to 5.2.1.2sunpoet2015-08-152-3/+3 * - Update to 2.6.0sunpoet2015-08-152-3/+3 * - Strip shared librarysunpoet2015-08-151-2/+6 * - Remove MASTER_SITE_SUBDIRsunpoet2015-08-151-1/+1 * - Add new port: textproc/R-cran-rmarkdowntota2015-08-154-0/+28 * devel/py-Jinja2: update to 2.8rm2015-08-153-26/+7 * Add non-default OPTION to support multimedia/openh264riggs2015-08-151-1/+6 * multimedia/spotify-websocket-api: as discussed with the author, mark this portrene2015-08-151-5/+9 * Remove the DEBUG option.shurd2015-08-151-4/+2 * Update to version 1.0shurd2015-08-152-40/+20 * Remove expired port:rene2015-08-155-48/+1 * Update to 5.4.44 release.ale2015-08-153-4/+3 * Update to 5.5.28 release.ale2015-08-152-3/+3 * Drop PORTREVISION.ale2015-08-151-1/+0 * Update to 5.6.26 release.ale2015-08-152-3/+3 * Update to 5.6.12 release.ale2015-08-152-3/+3 * - Add p5-List-Objects-Types 1.003001sunpoet2015-08-155-0/+33 * - Add p5-List-Objects-WithUtils 2.022001sunpoet2015-08-155-0/+88 * - Update to 2.0.3sunpoet2015-08-153-3/+3 * - Update to 1.6.0sunpoet2015-08-152-3/+3 * - Update to 0.43sunpoet2015-08-152-3/+4 * - Update to 0.40sunpoet2015-08-153-3/+4 * - Update to 2.08sunpoet2015-08-152-3/+3 * - Update to 0.9.1sunpoet2015-08-152-3/+3 * - Update to 0.004sunpoet2015-08-152-3/+3 * - Update to 7.44.0sunpoet2015-08-155-37/+7 * - Remove MASTER_SITE_SUBDIRsunpoet2015-08-151-1/+0 * - Remove MASTER_SITE_SUBDIRsunpoet2015-08-151-1/+0 * - Remove MASTER_SITE_SUBDIRsunpoet2015-08-151-1/+0 * Update to 6.15.adamw2015-08-152-3/+3 * - Update to 1.11tota2015-08-152-4/+4 * Update to 3.4shurd2015-08-154-8/+7 * Update to 3.4.2 (also updates comms/xcwcp).shurd2015-08-154-8/+8 * Update to 3.7.4shurd2015-08-152-4/+3 * Update to 8.2.12shurd2015-08-1519-55/+52 * Update to 3.22.13, fix portlint warnings.shurd2015-08-153-6/+18 * - Update to 1.23.10wen2015-08-152-10/+4 * Update to 1.86b.delphij2015-08-152-3/+3 * - Adjust default GSSAPI option:sunpoet2015-08-151-2/+9 * Upgrade HTTP/2 patch from v.1 to v.2.osa2015-08-152-3/+3 * security/afl: cannonicalize MAINTAINERpgollucci2015-08-151-1/+1 * Add explicit USES=iconv, libarchive was linking against libiconv/libcharsetantoine2015-08-151-3/+11 * Update MASTER_SITE_GNUPGfeld2015-08-151-11/+16 * Update MASTER_SITES to fix fetching problem due to abnormal version numberfeld2015-08-151-1/+1 * - Update to 0.7.2tota2015-08-152-3/+3 * Update pcsc-lite to 1.8.14arved2015-08-154-8/+8 * Add native disk metrics thanks to delphij, Ruben Kerkhofbrd2015-08-154-12/+93 * Update to 1.0.1olivierd2015-08-155-14/+14 * sysutils/terraform: update to 0.6.3swills2015-08-153-36/+36 * devel/py-grab: update to 0.6.22rm2015-08-152-6/+3 * devel/py-selection: update to 0.0.10rm2015-08-153-17/+3 * devel/py-weblib: update to 0.1.15rm2015-08-152-6/+3 * - Fix build by adding missing dependamdmi32015-08-151-1/+2 * Move ASSEMBLY to an i386/amd64 only OPTION_DEFAULTsbruno2015-08-151-1/+4 * - Fix build by adding missing dependamdmi32015-08-151-1/+1 * - Add empty directories to plistamdmi32015-08-152-1/+4 * Document MediaWiki multiple security vulnerabilitiesjunovitch2015-08-151-0/+45 * - Fix build by adding missing dependsamdmi32015-08-151-1/+1 * ports-mgmt/freebsd-bugzilla-cli: update 0.10.8->0.12.0pgollucci2015-08-153-3/+5 * ftp/vsftpd-ext: unbreak build on 9.x i386 and clean up portjunovitch2015-08-154-63/+8 * - Update to 3.3.17.1feld2015-08-153-4/+4 * Back out r394012 after r394231jbeich2015-08-155-15/+15 * Sync libvpx check for CVE-2015-448[56] with r394231jbeich2015-08-151-2/+2 * multimedia/libvpx: update to 1.4.0.488 (snapshot)jbeich2015-08-156-43/+62 * Document freeradius3 vulnerabilityfeld2015-08-151-0/+28 * - /var/log/bareos and /var/run/bareos are created by bareos-client now. Itacm2015-08-154-9/+5 * Update to 1.22.4.novel2015-08-153-4/+4 * - Replace bacula/bareosacm2015-08-151-2/+2 * - Fix build by adding missing dependsamdmi32015-08-151-1/+1 * Document gnutls vulnerabilitiesfeld2015-08-151-0/+65 * - Backport mpd5 fix (rev. 1224):garga2015-08-142-1/+18 * - Fix shebangsamdmi32015-08-141-0/+3 * - Add empty directories to plistamdmi32015-08-142-2/+4 * - Add missing files to plistamdmi32015-08-142-0/+13 * Update to 4.3.42ehaupt2015-08-142-2/+8 * - Fix shebangsamdmi32015-08-142-6/+3 * - Fix shebangsamdmi32015-08-141-1/+3 * - Place USES and shebang-related knobs after RUBYGEM_* as requested by sunpoe...amdmi32015-08-142-4/+4 * The SOCKS proxy and relay.decke2015-08-146-0/+73 * - Fix leftover files generated by shared-mime-infoamdmi32015-08-141-0/+1 * - Fix shebangsamdmi32015-08-141-0/+3 * - Fix build by adding missing dependencyamdmi32015-08-141-2/+2 * - Add missing file to plistamdmi32015-08-142-0/+2 * - Fix shebangsamdmi32015-08-141-1/+3 * security/nss: update legacy ckbi suffix to the one used in 3.19.1jbeich2015-08-141-1/+1 * security/{,ca_root_}nss: update to 3.19.3jbeich2015-08-144-7/+7 * Update to 0.13.9 release.ale2015-08-142-3/+3 * - update to 1.86dinoex2015-08-142-21/+26 * Update to 2.8.1garga2015-08-142-4/+3 * devel/android-tools-simpleperf: add new portjbeich2015-08-1414-0/+257 * emulators/ppsspp-devel: update to 1.0.1.809jbeich2015-08-142-4/+4 * Update to tzdata2015f:edwin2015-08-142-3/+3 * - Unbreak installation on freebsd 9antoine2015-08-141-4/+1 * devel/py-grab: update to 0.6.21rm2015-08-143-9/+25 * API to extract data from HTML and XML documents.rm2015-08-145-0/+42 * Weblib provides tools to solve typical tasks in web scraping:rm2015-08-144-0/+42 * Simple tools for processing strings in Russian (choose proper form for plurals,rm2015-08-144-0/+27 * Upgrade tilda to 1.2.4rodrigo2015-08-142-3/+3 * Update to 4.2.1olivierd2015-08-142-3/+3 * devel/py-boto: update to 2.38.0rm2015-08-142-3/+4 * devel/py-pyro: add NO_ARCH forgotten in previous commitrm2015-08-141-0/+1 * devel/py-pyro: update to 4.39rm2015-08-142-7/+6 * devel/py-serpent: update to 1.11rm2015-08-142-4/+5 * Python API Wrapper for Kayako 4.01.240rm2015-08-144-0/+24 * Stop using the "legacy" fmake, adjust the Makefile to workmi2015-08-142-5/+4 * net/py-ldap3: update to 0.9.8.7rm2015-08-142-3/+3 * www/py-w3lib: update to 1.12.0rm2015-08-142-3/+4 * www/py-flask-restful: update to 0.3.4rm2015-08-142-3/+4 * Update to 1.4.24arved2015-08-142-3/+3 * devel/py-asn1-modules: update to 0.0.7rm2015-08-143-9/+9 * emulators/i386-wine-devel: update to 1.7.49dbn2015-08-144-80/+137 * Remove expired port:rene2015-08-145-40/+1 * Add gtk-doc annotations for the glibtop_init functions. Their return valuekwm2015-08-142-1/+39 * net-p2p/zetacoin{-no11}: mark broken on armv6pgollucci2015-08-142-1/+3 * - Remove RG linksunpoet2015-08-14