summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAuke Booij (tulcod) <auke@tulcod.com>2010-06-11 16:29:07 +0200
committerAuke Booij (tulcod) <auke@tulcod.com>2010-06-11 16:29:07 +0200
commitd28de642931909f6585ac0d9e1dcba4c199520a5 (patch)
tree4b0cf1a7f234ec06056253bdc51de66149582768
parentRemoving code which was commented away (diff)
downloadg-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-xg-cran.py50
1 files changed, 37 insertions, 13 deletions
diff --git a/g-cran.py b/g-cran.py
index 022c334..4dcf7af 100755
--- a/g-cran.py
+++ b/g-cran.py
@@ -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__