diff options
author | Auke Booij (tulcod) <auke@tulcod.com> | 2010-06-11 16:29:07 +0200 |
---|---|---|
committer | Auke Booij (tulcod) <auke@tulcod.com> | 2010-06-11 16:29:07 +0200 |
commit | d28de642931909f6585ac0d9e1dcba4c199520a5 (patch) | |
tree | 4b0cf1a7f234ec06056253bdc51de66149582768 | |
parent | Removing code which was commented away (diff) | |
download | g-cran-d28de642931909f6585ac0d9e1dcba4c199520a5.tar.gz g-cran-d28de642931909f6585ac0d9e1dcba4c199520a5.tar.bz2 g-cran-d28de642931909f6585ac0d9e1dcba4c199520a5.zip |
Parsing the PACKAGES file now seems to work. The sync, list-packages and list-categories actions appear to work correctly.
-rwxr-xr-x | g-cran.py | 50 |
1 files changed, 37 insertions, 13 deletions
@@ -8,7 +8,33 @@ from ebuild import * __doc__="Usage: "+sys.argv[0]+" <local repository directory> <action> [<action arguments>...]" REPO_MYDIR=".g-cran" -REPO_CONFFILE="settings.cfg" + +def pmsify_package_version(version_str): + return version_str.replace('-','.') #some CRAN-style versions have the form 0.1-1, which we transform into 0.1.1 + +def pmsify_package_list(package_list): + #note: the following returns a list of tuples + matches=re.findall(r'\s*(([^,]+\([^()]+?\))|([^,]+))\s*',package_list) #split into packages + versions + packages=[] + for package_part in matches: #process each package match + if len(package_part[1])>len(package_part[2]): #versioned package identifier + parse=re.match(r'([^,]+)\(([^()]+?)\)',package_part[1]) + pkg_name=parse.group(1) + versions=parse.group(2) + #fixme version specifiers + if pkg_name=='R': + category='dev-lang' + else: + category='dev-R' + packages.append(category+'/'+pkg_name) + else: + pkg_name=package_part[2] + if pkg_name=='R': + category='dev-lang' + else: + category='dev-R' #assume it's a CRAN package + packages.append(category+'/'+pkg_name) + return packages #Parse package options into values we can work with in accordance with PMS def pmsify_packages_data(data): @@ -19,16 +45,15 @@ def pmsify_packages_data(data): data['package']='_'+package_name if re.match('.*-[0-9]+',data['package']): data['package']=package_name+'_' - #data['package']=data['package'] if 'version' not in data: #set a version even if we have none - data['version']='0' + data['version']='0' else: - data['version']=data['version'].replace('-','.') #some CRAN-style versions have the form 0.1-1, which we transform into 0.1.1 + data['version']=pmsify_package_version(data['version']) if 'depends' in data: - #dependencies=re.split('([a-zA-Z0-9+_-]+[ \t]+\(.+?\)[ \t]+)',data['depends']) - dependencies=re.split(r'([a-zA-Z0-9+_-]+[ \t]+\\(.+?\\))|([a-zA-Z0-9+_-]+)[ \t]+',data['depends']) #split into packages + versions - data['depends']=['dev-lang/R',]+dependencies #fixme check - else: #some packages don't set dependencies + #data['depends']=['dev-lang/R',]+dependencies #fixme check + #fixme + data['depends']=pmsify_package_list(data['depends']) + else: #some packages don't set dependencies, so force dependency on R data['depends']=['dev-lang/R',] return data @@ -41,7 +66,7 @@ def read_packages(package_filename): new_package=dict(rfc822.Message(file_parts).items()) #read part of PACKAGES file pmsify_packages_data(new_package) #fix values packages.append(new_package) #store in dict - print packages + return packages def action_sync(repo_location,remote_uri): if not os.path.isdir(os.path.join(repo_location, REPO_MYDIR)): @@ -51,16 +76,15 @@ def action_sync(repo_location,remote_uri): raise IOError packages_filename=os.path.join(repo_location, REPO_MYDIR, 'PACKAGES') urllib.urlretrieve(remote_uri+'/src/contrib/PACKAGES',packages_filename) - read_packages(packages_filename) raise NotImplementedError def list_categories(repo_location): print "dev-R" def list_packages(repo_location): - package_file=read_packages(os.path.join(repo_location,REPO_MYDIR,'PACKAGES')) - for package, package_metadata in package_file.items(): - print "dev-R/"+package+"-"+package_metadata['version'] + packages=read_packages(os.path.join(repo_location,REPO_MYDIR,'PACKAGES')) + for package in packages: + print 'dev-R/'+package['package'],package['version'] def usage(): print __doc__ |