galaxy-dev
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
March 2010
- 36 participants
- 171 discussions
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/182a7947e63a
changeset: 3460:182a7947e63a
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Tue Mar 02 11:17:05 2010 -0500
description:
Fix bug that prevents new Galaxy visitors from viewing an accessible/published workflow. Viewing an accessible/published workflow requires a history because rendering parameters require a history, so a history is now created for visitors that do not already have one.
diffstat:
templates/workflow/display.mako | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diffs (15 lines):
diff -r 8bd2ace6c92d -r 182a7947e63a templates/workflow/display.mako
--- a/templates/workflow/display.mako Tue Mar 02 10:47:23 2010 -0500
+++ b/templates/workflow/display.mako Tue Mar 02 11:17:05 2010 -0500
@@ -85,6 +85,11 @@
</%def>
<%def name="render_item( workflow, steps )">
+ <%
+ # HACK: Rendering workflow steps requires that trans have a history; however, if a user's first visit to Galaxy is here, he won't have a history
+ # and an error will occur. To prevent this error, make sure user has a history.
+ trans.get_history( create=True )
+ %>
<table class="annotated-item">
<tr><th>Step</th><th class="annotation">Description/Notes</th></tr>
%for i, step in enumerate( steps ):
1
0
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/8bd2ace6c92d
changeset: 3459:8bd2ace6c92d
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Tue Mar 02 10:47:23 2010 -0500
description:
Change color space FASTA file type from fastqsolid to fastqcssanger.
Cripple accepted tool input formats for many of the FASTQ tools to only allow only fastqsanger and fastqcssanger to be used.
diffstat:
datatypes_conf.xml.sample | 2 +-
lib/galaxy/datatypes/sequence.py | 6 +-
lib/galaxy_utils/sequence/fasta.py | 2 +-
lib/galaxy_utils/sequence/fastq.py | 6 +-
test-data/combine_phiX_out_1.fastqcssanger | 576 +++++++++++++
test-data/combine_phiX_out_1.fastqsolid | 576 -------------
test-data/combine_phiX_out_2.fastqcssanger | 576 +++++++++++++
test-data/combine_phiX_out_2.fastqsolid | 576 -------------
test-data/fastq_combiner_no_qual_ascii_out_1.fastqcssanger | 576 +++++++++++++
test-data/fastq_combiner_no_qual_ascii_out_1.fastqsolid | 576 -------------
test-data/illumina_full_range_as_cssanger.fastqcssanger | 8 +
test-data/illumina_full_range_as_solid.fastqsolid | 8 -
test-data/sanger_full_range_as_cssanger.fastqcssanger | 8 +
test-data/sanger_full_range_as_solid.fastqsolid | 8 -
test-data/solexa_full_range_as_cssanger.fastqcssanger | 8 +
test-data/solexa_full_range_as_solid.fastqsolid | 8 -
tool_conf.xml.sample | 19 +-
tools/fastq/fastq_combiner.py | 2 +-
tools/fastq/fastq_combiner.xml | 15 +-
tools/fastq/fastq_filter.xml | 32 +-
tools/fastq/fastq_groomer.xml | 50 +-
tools/fastq/fastq_manipulation.xml | 19 +-
tools/fastq/fastq_paired_end_joiner.xml | 4 +-
tools/fastq/fastq_paired_end_splitter.xml | 2 +-
tools/fastq/fastq_stats.xml | 12 +-
tools/fastq/fastq_to_fasta.xml | 2 +-
tools/fastq/fastq_trimmer.xml | 12 +-
27 files changed, 1848 insertions(+), 1841 deletions(-)
diffs (truncated from 4157 to 3000 lines):
diff -r 19d8ba4269ba -r 8bd2ace6c92d datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample Tue Mar 02 09:51:05 2010 -0500
+++ b/datatypes_conf.xml.sample Tue Mar 02 10:47:23 2010 -0500
@@ -35,7 +35,7 @@
<datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true"/>
<datatype extension="fastqsanger" type="galaxy.datatypes.sequence:FastqSanger" display_in_upload="true"/>
<datatype extension="fastqsolexa" type="galaxy.datatypes.sequence:FastqSolexa" display_in_upload="true"/>
- <datatype extension="fastqsolid" type="galaxy.datatypes.sequence:FastqSolid" display_in_upload="true"/>
+ <datatype extension="fastqcssanger" type="galaxy.datatypes.sequence:FastqCSSanger" display_in_upload="true"/>
<datatype extension="fastqillumina" type="galaxy.datatypes.sequence:FastqIllumina" display_in_upload="true"/>
<datatype extension="genetrack" type="galaxy.datatypes.tracks:GeneTrack">
<!-- <display file="genetrack.xml" /> -->
diff -r 19d8ba4269ba -r 8bd2ace6c92d lib/galaxy/datatypes/sequence.py
--- a/lib/galaxy/datatypes/sequence.py Tue Mar 02 09:51:05 2010 -0500
+++ b/lib/galaxy/datatypes/sequence.py Tue Mar 02 10:47:23 2010 -0500
@@ -224,9 +224,9 @@
"""Class representing a FASTQ sequence ( the Illumina 1.3+ variant )"""
file_ext = "fastqillumina"
-class FastqSolid( Fastq ):
- """Class representing a FASTQ sequence ( the SOLiD (color space) variant )"""
- file_ext = "fastqsolid"
+class FastqCSSanger( Fastq ):
+ """Class representing a Color Space FASTQ sequence ( e.g a SOLiD variant )"""
+ file_ext = "fastqcssanger"
try:
from galaxy import eggs
diff -r 19d8ba4269ba -r 8bd2ace6c92d lib/galaxy_utils/sequence/fasta.py
--- a/lib/galaxy_utils/sequence/fasta.py Tue Mar 02 09:51:05 2010 -0500
+++ b/lib/galaxy_utils/sequence/fasta.py Tue Mar 02 10:47:23 2010 -0500
@@ -104,7 +104,7 @@
def __init__( self, fh ):
self.file = fh
def write( self, fastq_read ):
- #this will include SOLiD adapter base if applicable
+ #this will include color space adapter base if applicable
self.file.write( ">%s\n%s\n" % ( fastq_read.identifier[1:], fastq_read.sequence ) )
def close( self ):
return self.file.close()
diff -r 19d8ba4269ba -r 8bd2ace6c92d lib/galaxy_utils/sequence/fastq.py
--- a/lib/galaxy_utils/sequence/fastq.py Tue Mar 02 09:51:05 2010 -0500
+++ b/lib/galaxy_utils/sequence/fastq.py Tue Mar 02 10:47:23 2010 -0500
@@ -176,8 +176,8 @@
score_system = 'solexa'
sequence_space = 'base'
-class fastqSolidRead( fastqSequencingRead ):
- format = 'solid' #color space
+class fastqCSSangerRead( fastqSequencingRead ):
+ format = 'cssanger' #color space
ascii_min = 33
ascii_max = 126
quality_min = 0
@@ -260,7 +260,7 @@
FASTQ_FORMATS = {}
-for format in [ fastqIlluminaRead, fastqSolexaRead, fastqSangerRead, fastqSolidRead ]:
+for format in [ fastqIlluminaRead, fastqSolexaRead, fastqSangerRead, fastqCSSangerRead ]:
FASTQ_FORMATS[ format.format ] = format
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/combine_phiX_out_1.fastqcssanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/combine_phiX_out_1.fastqcssanger Tue Mar 02 10:47:23 2010 -0500
@@ -0,0 +1,576 @@
+@1831_573_1004_F3
+T00030133312212111300011021310132222
++
+4 29 27 34 5 5 24 24 20 17 10 34 29 20 27 13 30 27 22 24 11 28 19 17 27 17 24 17 25 27 7 24 14 12 22
+@1831_573_1050_F3
+T03330322230322112131010221102122113
++
+8 26 31 31 16 22 30 31 28 29 22 30 30 31 32 23 30 28 28 31 19 32 30 32 19 8 5 10 13 6 5 10 6 16 11
+@1831_573_1067_F3
+T00023032023103330112220321200200002
++
+13 10 10 2 4 7 6 11 4 14 3 11 10 5 16 2 5 8 11 8 5 10 6 9 6 9 4 2 3 5 2 4 7 6 3
+@1831_573_1219_F3
+T11211130300300301021212330201121310
++
+31 31 31 28 19 14 10 8 20 8 19 15 23 30 6 21 21 20 29 9 14 20 30 27 21 16 6 26 27 18 11 25 11 20 12
+@1831_573_1242_F3
+T02132003121011302100130302112221121
++
+29 29 29 25 25 29 16 22 28 32 20 30 31 31 28 26 22 32 28 26 17 13 21 15 29 23 17 27 23 28 22 19 10 26 26
+@1831_573_1333_F3
+T00200312330110101013212313222303112
++
+8 28 6 31 2 4 18 28 13 29 8 14 18 19 9 16 16 22 11 11 14 21 12 19 10 13 24 22 19 17 19 20 21 27 8
+@1831_573_1362_F3
+T21203131001102231121211101111321131
++
+34 33 31 31 30 31 31 30 31 34 31 33 32 30 31 29 31 27 31 23 32 31 30 31 6 13 23 6 30 16 22 25 11 10 30
+@1831_573_1448_F3
+T23101211223113320132212331313312022
++
+22 22 28 32 8 30 11 13 31 32 31 31 25 31 31 27 28 14 22 8 31 27 12 2 23 21 21 17 4 24 21 16 18 5 10
+@1831_573_1490_F3
+T31312310323301210002210123101021011
++
+31 31 31 31 30 11 31 30 30 31 3 29 27 28 29 10 4 14 9 29 9 16 11 8 30 17 21 5 16 17 6 24 4 22 13
+@1831_573_1523_F3
+T10322001220012223202202222001230222
++
+7 11 14 14 9 11 2 23 6 6 13 21 6 6 21 6 17 5 17 22 14 23 15 8 4 5 2 15 6 4 2 9 11 17 6
+@1831_573_1578_F3
+T21202302100010020121100311022120111
++
+31 30 28 31 27 31 34 31 30 31 31 30 30 28 29 31 26 22 27 27 23 27 21 24 19 8 18 20 16 16 7 10 16 27 13
+@1831_573_1647_F3
+T10222233301013033120132223202022123
++
+28 30 31 31 27 31 31 30 30 30 26 32 28 28 31 31 26 24 30 31 30 18 28 26 21 13 19 14 26 21 25 28 14 26 19
+@1831_573_1684_F3
+T13310013212312012302121010221231123
++
+22 29 16 25 23 27 31 18 24 31 31 30 30 24 28 26 31 31 27 29 30 31 31 27 26 27 30 22 29 22 21 30 24 29 30
+@1831_573_1769_F3
+T33220123030232212032021032302233131
++
+22 20 19 22 19 24 5 5 22 21 22 4 14 22 26 18 3 12 22 26 18 2 11 18 14 14 2 11 19 20 14 2 5 15 21
+@1831_573_1853_F3
+T11000012111222211310103212122102331
++
+21 19 13 14 33 31 31 22 17 33 10 14 19 30 31 30 22 30 10 31 24 14 10 24 24 13 6 8 17 27 17 5 8 17 5
+@1831_573_1943_F3
+T20300123032210232001222122001132111
++
+7 29 14 9 16 11 8 11 31 12 8 6 15 9 29 20 6 3 14 30 21 31 14 13 5 30 23 14 7 6 8 32 19 18 11
+@1831_573_1977_F3
+T22212302221310332321002303112011311
++
+31 31 30 21 31 23 31 31 24 32 31 28 19 21 18 18 32 22 30 24 30 27 18 25 10 22 29 6 31 4 31 30 4 18 17
+@1831_574_109_F3
+T13122332123301331032220222133301033
++
+15 22 21 20 16 2 19 23 16 22 29 31 21 20 27 17 25 23 19 22 16 21 28 22 23 23 27 16 24 24 20 13 22 30 21
+@1831_574_148_F3
+T01200113123030012202302312200010231
++
+27 26 12 29 18 26 26 18 29 14 14 29 15 26 26 22 28 11 28 19 12 19 14 10 29 15 17 24 27 24 27 21 17 19 26
+@1831_574_185_F3
+T21123333211302300321312212102123121
++
+31 27 19 26 4 4 31 22 29 2 9 29 24 22 4 21 26 10 23 3 2 27 15 22 4 16 18 22 17 3 4 27 20 19 2
+@1831_574_243_F3
+T30221011230013102201033131203302330
++
+2 31 31 31 24 20 31 28 24 30 9 29 27 19 20 3 27 31 27 19 4 31 24 30 22 2 28 30 29 22 5 29 30 24 22
+@1831_574_257_F3
+T00301133110002100302003000000102301
++
+4 29 29 33 29 8 31 30 29 33 31 33 30 31 16 4 9 4 11 2 10 15 15 13 6 7 10 5 20 5 4 2 3 18 5
+@1831_574_293_F3
+T23213210003000103010211331300320130
++
+5 6 8 22 6 13 9 4 2 5 3 6 14 13 3 2 2 3 13 3 5 9 8 10 9 3 2 23 4 5 4 2 5 5 4
+@1831_574_389_F3
+T21032213032101122333230212301312020
++
+8 8 3 29 14 29 23 8 25 17 31 25 17 16 18 26 26 13 16 8 31 18 4 21 19 4 10 8 27 22 8 10 3 24 17
+@1831_574_575_F3
+T33313322100212102033032123311211302
++
+22 30 31 29 28 30 31 29 23 31 31 31 28 31 21 9 4 5 27 28 6 20 31 27 27 6 11 15 27 28 19 9 20 14 27
+@1831_574_592_F3
+T33103330110123102223122023103310330
++
+22 18 12 20 8 16 24 11 11 27 31 29 19 15 21 22 27 17 13 12 23 21 19 18 19 21 26 24 27 16 14 26 17 16 17
+@1831_574_617_F3
+T20021031221222021210021322200223211
++
+31 29 31 30 26 29 30 28 31 28 28 31 29 31 28 20 30 31 10 31 25 31 19 15 31 29 27 25 15 8 6 8 21 19 12
+@1831_574_725_F3
+T32010020322130330333010031120313210
++
+24 6 29 30 20 17 10 20 28 26 19 3 21 26 27 23 13 16 27 19 22 9 24 10 30 22 7 10 20 26 12 8 13 8 19
+@1831_574_734_F3
+T31132301200020012302210322213222222
++
+13 12 5 13 3 17 5 27 9 7 12 4 8 25 14 8 4 20 25 8 14 4 22 10 11 24 15 18 19 9 32 13 30 22 15
+@1831_574_824_F3
+T30212100033032123311211302122020013
++
+26 31 31 31 26 26 8 11 10 31 27 12 27 22 26 27 5 23 24 30 30 5 17 24 30 27 3 17 25 32 27 8 26 23 30
+@1831_574_959_F3
+T11212130220131221111002020123311211
++
+22 32 28 26 10 30 31 24 26 14 27 31 26 27 23 2 5 5 14 9 4 7 4 13 15 3 15 3 17 8 10 16 3 12 16
+@1831_574_1062_F3
+T30112230030300221001032033012211012
++
+19 31 23 17 16 27 14 14 25 16 18 21 14 23 27 16 14 20 13 19 17 22 13 26 29 17 23 23 14 15 27 16 3 8 14
+@1831_574_1092_F3
+T02013221200031031212200000111130310
++
+27 23 30 13 11 24 23 8 15 18 4 2 11 11 11 7 11 10 10 3 6 21 24 6 2 24 6 22 2 6 26 21 13 4 17
+@1831_574_1103_F3
+T20313113203302010303131123021310121
++
+31 30 30 29 30 31 28 29 31 31 32 27 29 30 28 31 28 28 27 25 30 27 26 20 23 6 5 5 8 25 10 18 20 6 16
+@1831_574_1116_F3
+T21011310123202303021021112021231011
++
+8 31 10 10 11 8 14 8 30 13 14 8 4 27 8 17 29 13 28 28 25 23 30 5 26 19 19 5 14 5 11 8 14 9 19
+@1831_574_1194_F3
+T23303101033322220312200222013013312
++
+25 20 29 26 11 30 30 24 31 24 31 30 31 16 31 31 28 31 18 28 31 29 31 19 30 31 31 24 19 30 22 20 14 11 21
+@1831_574_1204_F3
+T21330132231321322010303023221203200
++
+32 32 20 32 20 33 31 20 25 26 31 31 11 13 24 30 32 16 30 2 13 30 26 18 8 11 29 23 17 4 8 28 6 22 9
+@1831_574_1306_F3
+T10332133020311023221213100301001220
++
+15 17 13 22 5 4 6 6 13 3 5 2 6 4 2 2 3 2 6 2 4 6 8 6 8 3 6 3 4 3 11 8 6 13 16
+@1831_574_1387_F3
+T12301331310032132101301303230121111
++
+12 30 32 30 30 25 31 30 31 31 24 30 31 31 30 24 34 26 25 29 5 8 13 11 11 8 26 5 6 27 5 22 7 14 6
+@1831_574_1431_F3
+T12011023331022213001123111301312011
++
+29 22 30 29 24 33 32 23 24 22 26 10 23 9 28 21 2 21 13 10 20 5 12 2 17 21 3 15 13 11 20 5 6 3 16
+@1831_574_1560_F3
+T32212313302203320020222113111011111
++
+28 8 8 5 21 20 27 19 28 29 24 24 31 25 20 24 22 7 16 5 26 10 5 7 4 5 19 2 11 2 5 5 5 9 3
+@1831_574_1591_F3
+T23202101330322130221230222201123202
++
+28 28 27 32 29 27 30 31 22 23 31 27 28 26 31 5 31 21 29 23 25 30 11 29 27 5 5 27 22 29 23 7 23 10 24
+@1831_574_1624_F3
+T20122200222132200313011102302210332
++
+2 27 21 13 5 7 11 22 12 10 8 8 22 13 13 6 14 26 19 18 13 8 24 17 22 13 7 27 23 20 5 16 18 12 8
+@1831_574_1826_F3
+T13012312120112021233030302313201111
++
+10 31 27 27 11 8 8 19 20 24 27 30 13 10 20 22 6 12 6 5 21 30 16 8 7 26 16 26 15 5 4 19 11 2 3
+@1831_574_1903_F3
+T30232100103132133321330310210101221
++
+27 24 20 21 30 31 29 26 22 31 31 31 23 25 31 29 23 29 27 28 24 29 24 29 31 17 28 22 16 30 16 25 21 26 14
+@1831_574_1961_F3
+T02333101331223303300200011100032200
++
+21 29 12 15 22 12 31 29 7 17 6 31 27 2 15 21 19 31 4 20 4 31 31 21 13 5 27 27 7 24 8 28 25 19 22
+@1831_575_54_F3
+T13331330322230200102132110132013200
++
+29 28 31 31 21 23 27 17 26 27 23 26 30 31 27 29 10 24 29 22 11 11 21 24 22 17 5 20 22 25 19 5 24 27 23
+@1831_575_80_F3
+T33133322233322221003332230323312313
++
+9 30 20 29 27 31 30 14 28 20 4 7 5 13 20 8 10 2 14 15 6 14 6 29 2 3 14 6 18 22 2 7 8 21 5
+@1831_575_192_F3
+T30013012111133003301010212123302011
++
+15 25 23 27 11 24 7 13 28 14 8 2 4 23 3 11 19 6 27 11 25 8 18 14 13 6 13 20 27 11 29 12 26 22 6
+@1831_575_197_F3
+T33312113010133020301131330001310032
++
+11 12 25 30 19 21 18 31 32 25 23 23 30 21 30 19 18 22 27 28 13 17 5 16 13 26 31 21 22 13 19 31 4 17 11
+@1831_575_223_F3
+T10121010002202131221210302100121020
++
+31 30 29 30 23 30 31 25 30 26 29 10 3 6 4 5 11 10 2 3 13 12 12 2 4 3 16 6 5 2 12 22 3 5 6
+@1831_575_420_F3
+T31110103220000101310112112001020212
++
+23 17 30 13 29 30 7 12 6 6 17 10 13 13 31 8 11 3 4 16 31 26 6 8 16 8 30 10 8 22 13 6 8 13 13
+@1831_575_434_F3
+T30312132120223101113223301211113311
++
+27 31 31 29 27 31 33 31 29 28 31 31 30 29 29 27 31 30 26 8 31 30 26 21 13 30 28 19 11 6 6 26 14 18 8
+@1831_575_444_F3
+T33022120112320220100202132332113320
++
+27 17 31 31 26 27 13 28 30 31 27 10 28 25 32 27 27 31 30 27 27 14 29 31 29 27 7 27 23 29 19 5 20 26 29
+@1831_575_459_F3
+T31330310210101223330110231120131100
++
+30 31 31 34 31 30 32 31 31 32 31 30 30 32 31 31 6 21 31 31 33 6 28 26 34 31 6 19 27 28 24 11 31 16 13
+@1831_575_506_F3
+T31210200111210121332321310110132301
++
+23 30 8 17 9 20 31 18 10 13 22 28 30 32 25 23 31 11 14 5 8 25 31 18 22 14 27 23 24 6 10 19 9 8 9
+@1831_575_569_F3
+T10210201321323001012232322323002203
++
+14 6 24 12 11 31 17 24 10 19 22 24 4 5 29 24 2 5 15 23 28 29 22 2 24 29 11 21 24 14 10 6 9 18 8
+@1831_575_622_F3
+T01100031122111023002323113231210111
++
+31 32 23 33 28 31 31 30 27 31 30 27 29 29 28 30 24 21 27 19 24 22 8 27 19 14 27 6 25 19 10 26 22 19 10
+@1831_575_644_F3
+T11332003221203131231202200030110130
++
+27 27 23 29 13 29 5 11 10 8 23 13 16 15 6 25 20 7 14 12 21 17 5 9 13 28 14 4 7 13 27 5 5 16 23
+@1831_575_663_F3
+T32210013303112103322311101322021210
++
+31 31 31 31 31 32 27 14 26 32 29 31 21 29 15 22 24 17 27 20 24 21 21 25 30 26 17 20 10 25 29 27 16 11 10
+@1831_575_681_F3
+T23131132033020103031013233200101021
++
+13 22 17 30 13 8 17 20 26 24 21 12 16 19 6 9 13 15 18 6 2 19 2 10 10 3 8 14 23 10 4 14 7 7 5
+@1831_575_711_F3
+T03032331231101231020121210002332121
++
+19 4 10 25 17 7 2 6 16 10 13 8 5 9 19 20 12 2 11 27 32 12 4 19 26 29 10 8 8 27 26 2 2 9 5
+@1831_575_730_F3
+T31010102200110302123032330331011111
++
+11 4 23 27 4 12 6 8 20 11 9 16 5 28 2 8 7 16 9 16 8 12 29 22 3 13 11 19 6 19 6 5 6 9 5
+@1831_575_904_F3
+T20111213300020123200333321131121211
++
+30 27 29 27 13 21 23 24 31 31 22 31 27 20 19 25 19 28 31 29 21 24 28 25 10 21 12 28 19 17 26 23 27 25 2
+@1831_575_938_F3
+T13103102220022130222233301013033120
++
+26 25 31 31 25 30 31 26 28 23 26 29 28 26 26 25 28 27 24 18 27 19 13 26 27 21 25 17 27 24 26 19 8 23 22
+@1831_575_970_F3
+T23201311301023133303023011202220221
++
+28 31 28 31 28 26 31 31 29 27 31 31 25 24 27 25 28 30 26 29 31 28 30 24 29 29 30 31 25 17 28 28 28 27 20
+@1831_575_991_F3
+T33312212031111111012212120321121210
++
+31 29 29 26 22 30 30 30 14 19 27 25 25 25 11 2 5 9 4 6 3 12 12 20 12 2 7 22 8 5 5 11 12 8 4
+@1831_575_1138_F3
+T23320002011320012120333103233301321
++
+27 28 15 26 4 16 24 18 21 10 30 24 21 30 11 30 20 27 25 17 29 31 21 31 27 25 26 19 29 13 22 26 9 25 16
+@1831_575_1157_F3
+T13121323330203331222022230133102321
++
+31 33 31 33 29 30 32 30 32 31 30 24 6 30 26 30 5 23 30 31 31 21 26 27 31 28 10 27 25 24 24 10 24 21 20
+@1831_575_1180_F3
+T32003310122102323303101123331133110
++
+14 27 33 29 20 30 6 25 14 22 23 30 26 16 26 20 20 25 24 24 22 31 31 29 24 19 28 22 27 16 23 21 12 29 22
+@1831_575_1283_F3
+T02232200301300220130032321323131333
++
+4 34 31 32 20 19 29 27 30 32 22 23 31 27 30 17 29 25 2 29 28 30 31 17 29 23 15 25 6 30 21 24 13 6 22
+@1831_575_1302_F3
+T01201303312333123130200123201013021
++
+5 16 17 29 14 2 17 6 5 12 17 5 4 6 22 10 3 4 9 2 3 14 16 7 5 5 16 17 14 3 11 17 11 11 9
+@1831_575_1310_F3
+T31332131312021303211310220101211133
++
+21 27 27 29 21 21 18 30 24 24 31 7 31 22 28 16 16 31 25 31 31 14 22 30 30 27 31 27 26 29 6 18 12 22 26
+@1831_575_1321_F3
+T11001010233200122122022023000203212
++
+15 26 33 31 30 31 29 28 32 31 27 32 30 29 31 29 30 21 29 31 20 29 6 19 31 24 30 8 22 31 22 30 14 23 24
+@1831_575_1373_F3
+T21213011223311001221321132013121220
++
+32 31 31 31 29 31 26 28 24 27 31 30 30 22 31 29 31 25 31 26 31 26 16 22 30 21 18 15 14 22 28 19 11 17 27
+@1831_575_1419_F3
+T33222200303001021230212332001013020
++
+29 14 14 18 12 29 5 12 13 12 29 4 16 16 14 31 5 14 5 22 25 27 11 12 16 28 11 10 17 27 21 6 4 5 27
+@1831_575_1436_F3
+T13210313021212303321202113301220331
++
+9 17 31 28 26 18 24 9 18 27 9 19 27 25 29 20 17 29 29 24 6 22 25 27 28 6 15 28 29 16 6 16 18 21 27
+@1831_575_1442_F3
+T33132010022331132101132123132020222
++
+23 29 20 23 27 30 22 29 10 16 33 21 12 14 24 27 27 25 20 30 29 32 25 16 31 30 20 18 24 13 31 19 14 16 29
+@1831_575_1454_F3
+T11131130011012021120222231313211113
++
+17 19 28 30 23 28 21 20 23 24 28 15 25 32 28 25 30 29 21 27 26 31 14 11 19 10 12 21 10 14 6 13 11 7 11
+@1831_575_1500_F3
+T11010000223111301132313011130103021
++
+17 30 31 31 30 32 31 30 23 27 21 27 25 24 23 20 28 24 24 24 24 24 28 28 33 18 27 20 27 27 11 22 30 29 24
+@1831_575_1535_F3
+T21312012030320112110211013300131121
++
+31 33 28 31 27 31 31 33 30 25 32 31 31 28 29 31 30 21 23 31 28 30 31 20 30 22 26 25 21 27 27 26 29 20 27
+@1831_575_1724_F3
+T33123002323300220213232301000010010
++
+24 27 33 13 10 31 8 11 17 9 13 4 8 8 8 19 4 17 31 26 22 2 4 7 4 10 3 23 8 8 23 20 4 5 20
+@1831_575_1829_F3
+T21033321320111321230233302313101021
++
+17 17 7 9 6 4 13 18 3 10 22 8 31 5 4 3 6 18 9 10 9 2 14 2 14 9 10 15 13 28 5 2 8 10 15
+@1831_575_1898_F3
+T31330110303103131001110300102101330
++
+31 33 29 31 31 5 16 14 8 8 6 19 15 8 4 2 23 14 13 4 2 23 3 7 7 2 26 19 6 3 6 21 18 11 11
+@1831_575_1964_F3
+T22010201103202213200201301300232123
++
+16 29 18 24 8 31 17 27 17 14 31 10 24 30 17 28 5 8 29 29 31 9 21 17 28 20 5 17 27 19 17 13 6 30 10
+@1831_576_32_F3
+T13012100120333032211330300332022110
++
+10 27 29 30 29 30 28 22 27 17 8 20 17 17 26 29 27 27 31 19 15 31 29 22 15 19 27 29 20 28 17 18 31 10 5
+@1831_576_74_F3
+T30103313210232220102021223012112100
++
+23 28 31 31 30 31 29 7 30 30 27 33 20 30 31 31 31 24 27 31 29 27 10 29 27 26 31 6 26 29 21 24 21 16 30
+@1831_576_86_F3
+T10320000121033022010011030032211310
++
+22 23 16 16 8 17 25 9 13 10 10 20 27 14 25 18 10 19 18 24 17 19 9 8 8 14 25 11 21 5 17 24 8 17 14
+@1831_576_89_F3
+T02132333203332020020220033002121120
++
+17 8 21 24 10 11 6 13 19 28 12 11 29 14 29 7 9 3 2 8 18 15 18 15 9 6 7 11 4 8 17 2 2 3 11
+@1831_576_266_F3
+T30322223101312011300311121221333223
++
+27 31 31 30 28 26 27 30 22 28 31 29 24 11 29 31 16 3 5 5 23 24 3 14 25 29 22 6 18 16 22 23 4 5 21
+@1831_576_327_F3
+T22112331301313021321001332120332130
++
+27 31 30 31 21 31 31 26 27 31 30 29 27 31 29 28 28 18 31 25 28 28 27 18 31 31 29 20 18 27 24 29 27 21 28
+@1831_576_331_F3
+T32012133301311223023011232112333030
++
+26 12 17 8 10 7 9 13 9 16 14 26 20 4 13 12 24 5 2 14 16 6 10 7 3 9 3 2 2 7 8 4 14 3 13
+@1831_576_387_F3
+T00101211032031120300200222001230022
++
+14 23 8 13 3 20 2 16 2 9 4 13 3 2 2 13 9 2 3 4 2 2 12 4 11 10 11 16 2 5 4 13 4 8 8
+@1831_576_406_F3
+T00223133010210122221320212103132011
++
+27 19 27 29 4 4 16 19 25 9 19 21 20 21 8 5 27 17 20 16 5 17 10 18 2 5 16 24 11 21 5 19 29 20 7
+@1831_576_449_F3
+T31312001121222231100020132132100220
++
+7 10 6 5 6 13 11 11 3 14 10 13 8 3 3 23 5 4 2 10 30 5 11 2 8 12 5 2 2 2 22 11 10 2 9
+@1831_576_519_F3
+T03011321130130133213131202130321131
++
+28 28 19 21 27 24 22 31 29 17 14 21 30 26 17 27 19 32 23 23 16 29 24 16 17 16 10 27 16 14 19 13 24 10 22
+@1831_576_603_F3
+T21003032313302312320131221001330311
++
+31 31 19 21 28 31 34 13 30 30 27 32 22 24 31 31 26 12 27 31 31 29 17 24 33 30 29 20 20 27 33 22 20 24 23
+@1831_576_655_F3
+T02001023130302322122200313123123102
++
+28 31 32 32 24 31 31 27 21 9 29 31 31 20 14 27 31 29 24 6 28 26 29 22 10 31 30 24 29 14 24 26 10 11 4
+@1831_576_677_F3
+T13330131023320301031013230210103022
++
+21 17 24 15 5 14 9 15 2 5 6 5 11 13 17 6 2 5 9 3 5 7 6 2 12 4 7 3 9 2 4 3 8 2 4
+@1831_576_718_F3
+T31232113331022231333313223132231213
++
+3 19 2 2 2 3 15 2 2 2 4 7 2 2 2 2 2 2 2 2 2 11 2 2 2 2 4 2 2 2 2 3 2 2 2
+@1831_576_722_F3
+T31230320322120231333030031100313200
++
+7 9 11 12 11 2 2 13 8 9 5 7 9 16 4 9 7 4 7 12 17 2 10 8 12 2 13 5 12 2 4 4 3 6 8
+@1831_576_754_F3
+T30221231132103120112331303112133020
++
+13 19 14 14 2 7 13 3 8 6 6 11 29 7 5 2 16 3 27 11 2 2 4 7 7 11 2 20 30 2 15 9 4 16 9
+@1831_576_815_F3
+T23022113203032010120310102321001031
++
+27 18 29 31 30 24 29 31 30 33 28 29 28 26 29 32 30 30 30 28 29 25 17 20 28 19 13 17 20 30 21 27 20 22 13
+@1831_576_882_F3
+T13230020122320223230022031020110122
++
+30 17 21 30 23 30 31 25 19 29 31 29 24 21 30 30 27 27 28 20 6 16 27 29 24 23 19 21 28 27 24 27 16 29 23
+@1831_576_898_F3
+T10230132312121033222231132231233213
++
+28 31 31 34 17 30 34 29 30 27 29 31 23 23 21 33 30 26 30 13 30 30 23 22 28 33 27 23 27 16 20 30 30 28 13
+@1831_576_923_F3
+T21322010320202013210121223010123122
++
+22 21 13 20 16 28 26 13 21 24 24 27 24 21 29 26 26 19 24 27 26 26 16 16 26 27 31 20 24 25 24 28 21 19 22
+@1831_576_930_F3
+T21322103230123110323102012021020013
++
+17 2 9 15 13 17 5 13 25 7 7 2 6 16 19 6 2 2 12 8 2 4 3 3 17 4 2 3 14 16 5 2 4 14 2
+@1831_576_1019_F3
+T22032121213231032210312001103122312
++
+17 27 3 29 3 11 16 11 5 10 10 5 31 11 13 8 6 10 14 10 2 24 6 21 24 14 21 6 17 7 10 12 6 24 12
+@1831_576_1068_F3
+T00020232013101330112220321203220211
++
+25 29 29 27 28 19 30 26 31 22 28 30 30 24 30 26 24 29 20 31 24 30 25 23 31 25 28 20 6 26 22 26 6 2 19
+@1831_576_1131_F3
+T10233122200222132200313011102302210
++
+16 15 19 31 2 31 14 31 11 19 29 24 30 17 10 30 16 20 22 16 31 6 11 29 28 26 7 22 20 24 26 9 24 17 27
+@1831_576_1168_F3
+T31013300131121323122002113301002010
++
+29 31 34 34 21 31 31 17 30 24 28 29 22 30 26 22 21 27 26 19 21 22 31 26 24 11 15 4 17 21 6 6 11 19 3
+@1831_576_1207_F3
+T21001132013000122220301213221213010
++
+4 3 29 17 11 7 5 30 19 30 7 11 31 25 27 5 11 31 29 30 3 5 25 23 32 4 4 28 15 13 4 11 20 24 22
+@1831_576_1289_F3
+T03021210023110200323310302013121203
++
+31 24 27 29 16 33 31 31 26 22 31 31 21 21 18 28 28 17 23 11 20 6 25 23 27 27 11 13 28 17 29 29 13 20 15
+@1831_576_1329_F3
+T01100302102020113003022000120002100
++
+27 29 5 15 11 23 22 15 14 32 31 31 14 20 13 26 28 26 25 6 5 31 18 6 5 3 3 4 11 10 2 7 3 5 17
+@1831_576_1367_F3
+T12231310311233110031222013332011023
++
+30 30 31 31 27 29 31 31 28 31 27 31 27 28 31 29 31 30 30 24 25 30 27 28 29 28 27 23 26 20 24 31 22 23 22
+@1831_576_1416_F3
+T33021233100123120313103133211203221
++
+10 6 26 30 13 13 16 13 27 31 6 13 28 10 21 13 20 30 22 27 15 12 30 22 26 7 4 28 29 20 21 13 24 23 31
+@1831_576_1461_F3
+T32022221221112233100210223002100100
++
+2 16 5 22 19 2 7 2 7 5 2 2 3 2 11 6 2 2 2 4 2 4 4 2 9 2 5 4 4 2 2 4 4 4 6
+@1831_576_1605_F3
+T30232100103132133321330310210101221
++
+21 27 31 34 31 31 29 16 26 31 25 26 27 27 31 31 24 31 30 30 30 24 27 18 30 20 12 17 16 28 19 23 22 22 11
+@1831_576_1664_F3
+T31212101001312110320301201002011120
++
+31 31 30 29 30 31 28 32 25 31 31 29 31 28 6 28 27 29 28 8 13 29 28 24 9 23 8 7 22 2 14 10 10 26 8
+@1831_576_1671_F3
+T22313332300211322113223102231322313
++
+31 31 30 31 20 29 31 31 23 5 23 30 17 20 2 5 8 5 20 5 5 8 16 20 5 5 11 5 19 4 5 11 5 21 4
+@1831_576_1729_F3
+T11233312313010012320101302101023030
++
+31 30 31 30 27 30 27 31 29 32 30 14 28 28 30 29 30 22 29 30 31 23 27 30 31 29 24 24 26 29 27 10 15 28 29
+@1831_576_1880_F3
+T13032121323320213301001310130212003
++
+15 20 16 20 14 22 24 17 11 25 11 22 14 4 14 15 20 11 4 3 8 25 10 2 23 4 17 7 16 22 20 19 8 8 18
+@1831_576_1982_F3
+T00032312310201201333221212000011030
++
+11 31 31 30 31 11 32 29 27 31 24 31 28 30 31 24 33 28 23 27 21 31 31 21 31 17 27 32 30 29 13 22 27 10 31
+@1831_576_1987_F3
+T30022313313231221213220132001011320
++
+8 2 2 7 8 7 2 5 2 2 8 4 8 14 12 2 4 3 16 16 2 4 18 29 6 2 2 5 3 11 2 3 3 6 10
+@1831_576_2014_F3
+T31123201010100321122111102113021003
++
+31 31 31 24 11 33 17 24 12 20 29 6 30 11 10 30 22 24 10 14 32 6 26 6 17 31 6 20 5 14 24 11 21 5 16
+@1831_576_2028_F3
+T20131211210311112023201213120201100
++
+20 27 29 24 29 20 6 17 7 5 22 15 22 13 23 2 5 5 18 24 11 15 4 22 14 2 7 2 11 9 4 5 20 9 10
+@1831_577_40_F3
+T11111212330120012020200031313303003
++
+24 17 14 19 7 6 13 6 8 7 27 9 30 2 3 8 4 5 27 11 14 18 24 27 7 13 17 11 10 27 28 31 21 16 16
+@1831_577_119_F3
+T33111010021103320103213121313000102
++
+24 29 30 34 16 16 8 12 16 14 8 2 26 2 14 11 23 20 15 9 10 13 10 3 3 20 20 20 15 10 4 12 13 19 15
+@1831_577_133_F3
+T33213323012231300122223032223331322
++
+14 19 31 29 29 30 28 16 30 25 10 29 31 15 22 31 31 29 27 29 31 9 27 10 16 31 16 20 8 24 21 6 17 3 8
+@1831_577_255_F3
+T00332022110020300332022020202002232
++
+22 27 28 23 22 31 29 21 24 4 9 9 2 5 2 12 10 3 13 2 5 5 2 10 3 12 10 4 5 4 13 11 4 20 2
+@1831_577_281_F3
+T03032301231212301013112222111210000
++
+22 12 25 33 26 23 31 28 26 29 22 31 29 19 30 28 30 10 21 20 24 30 26 20 27 22 30 26 24 31 23 7 29 25 30
+@1831_577_288_F3
+T01031120221303100221230021013201130
++
+20 26 14 22 24 30 30 5 28 33 25 25 17 24 23 9 21 13 22 14 10 19 5 17 16 11 22 11 21 30 13 22 2 6 21
+@1831_577_322_F3
+T12003213220230103303201000130312202
++
+24 28 26 29 19 20 15 21 26 17 20 20 19 21 19 12 27 2 22 10 16 24 19 5 17 27 30 21 20 24 21 23 8 22 14
+@1831_577_362_F3
+T31203302330110131230331210121110220
++
+21 17 33 30 25 31 30 31 27 30 24 20 23 28 11 18 25 11 24 15 25 5 6 12 24 24 11 21 27 20 13 7 3 10 21
+@1831_577_382_F3
+T32312123033111120321303230201332100
++
+16 17 24 20 22 14 25 16 8 8 28 22 21 7 9 17 19 26 11 18 10 25 27 13 5 13 5 12 28 16 28 17 14 20 9
+@1831_577_464_F3
+T13020221011130013102221333131203302
++
+18 28 27 22 14 27 23 17 21 8 29 2 13 6 5 19 17 15 19 10 20 2 14 15 19 16 13 22 9 24 16 5 22 20 21
+@1831_577_488_F3
+T13200302330322110200323132101120301
++
+25 19 23 13 11 9 29 21 20 21 21 27 30 23 28 27 28 27 17 29 21 26 24 19 29 26 28 24 29 31 23 24 17 19 31
+@1831_577_511_F3
+T32232133031023313331312220133230333
++
+2 22 14 10 5 3 25 27 22 4 21 11 3 3 4 6 4 14 10 8 2 3 22 7 7 5 9 18 29 16 21 6 15 14 10
+@1831_577_545_F3
+T00112131333222303222210031322103233
++
+29 29 27 27 24 30 27 29 30 32 27 19 23 16 31 27 31 23 28 28 31 22 21 14 21 16 27 24 20 13 20 24 23 23 12
+@1831_577_559_F3
+T32321101303233120102011130022122002
++
+13 27 31 26 30 30 31 29 31 30 14 17 27 13 31 16 28 29 16 17 28 21 16 14 26 28 30 13 5 17 10 24 17 8 6
+@1831_577_562_F3
+T32331101301233110121000220031120031
++
+2 7 7 5 9 5 15 4 8 16 4 8 2 7 3 17 12 11 9 9 9 4 14 12 11 11 8 8 5 11 12 13 16 6 9
+@1831_577_637_F3
+T22113312122202103031023120301031110
++
+23 12 11 19 2 29 25 12 21 10 25 23 11 5 7 20 26 18 28 15 29 22 28 21 23 5 16 14 24 5 6 30 26 19 11
+@1831_577_641_F3
+T13031301101121223221212020032131113
++
+5 19 22 26 14 6 25 32 26 26 20 30 25 22 17 11 7 28 8 11 2 9 30 10 13 2 5 22 3 23 2 4 22 14 6
+@1831_577_692_F3
+T01122320200330103121202301211100220
++
+31 33 11 31 30 31 33 7 31 32 30 31 10 31 31 29 31 10 30 28 29 31 6 28 27 31 27 28 27 24 28 30 22 20 27
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/combine_phiX_out_1.fastqsolid
--- a/test-data/combine_phiX_out_1.fastqsolid Tue Mar 02 09:51:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,576 +0,0 @@
-@1831_573_1004_F3
-T00030133312212111300011021310132222
-+
-4 29 27 34 5 5 24 24 20 17 10 34 29 20 27 13 30 27 22 24 11 28 19 17 27 17 24 17 25 27 7 24 14 12 22
-@1831_573_1050_F3
-T03330322230322112131010221102122113
-+
-8 26 31 31 16 22 30 31 28 29 22 30 30 31 32 23 30 28 28 31 19 32 30 32 19 8 5 10 13 6 5 10 6 16 11
-@1831_573_1067_F3
-T00023032023103330112220321200200002
-+
-13 10 10 2 4 7 6 11 4 14 3 11 10 5 16 2 5 8 11 8 5 10 6 9 6 9 4 2 3 5 2 4 7 6 3
-@1831_573_1219_F3
-T11211130300300301021212330201121310
-+
-31 31 31 28 19 14 10 8 20 8 19 15 23 30 6 21 21 20 29 9 14 20 30 27 21 16 6 26 27 18 11 25 11 20 12
-@1831_573_1242_F3
-T02132003121011302100130302112221121
-+
-29 29 29 25 25 29 16 22 28 32 20 30 31 31 28 26 22 32 28 26 17 13 21 15 29 23 17 27 23 28 22 19 10 26 26
-@1831_573_1333_F3
-T00200312330110101013212313222303112
-+
-8 28 6 31 2 4 18 28 13 29 8 14 18 19 9 16 16 22 11 11 14 21 12 19 10 13 24 22 19 17 19 20 21 27 8
-@1831_573_1362_F3
-T21203131001102231121211101111321131
-+
-34 33 31 31 30 31 31 30 31 34 31 33 32 30 31 29 31 27 31 23 32 31 30 31 6 13 23 6 30 16 22 25 11 10 30
-@1831_573_1448_F3
-T23101211223113320132212331313312022
-+
-22 22 28 32 8 30 11 13 31 32 31 31 25 31 31 27 28 14 22 8 31 27 12 2 23 21 21 17 4 24 21 16 18 5 10
-@1831_573_1490_F3
-T31312310323301210002210123101021011
-+
-31 31 31 31 30 11 31 30 30 31 3 29 27 28 29 10 4 14 9 29 9 16 11 8 30 17 21 5 16 17 6 24 4 22 13
-@1831_573_1523_F3
-T10322001220012223202202222001230222
-+
-7 11 14 14 9 11 2 23 6 6 13 21 6 6 21 6 17 5 17 22 14 23 15 8 4 5 2 15 6 4 2 9 11 17 6
-@1831_573_1578_F3
-T21202302100010020121100311022120111
-+
-31 30 28 31 27 31 34 31 30 31 31 30 30 28 29 31 26 22 27 27 23 27 21 24 19 8 18 20 16 16 7 10 16 27 13
-@1831_573_1647_F3
-T10222233301013033120132223202022123
-+
-28 30 31 31 27 31 31 30 30 30 26 32 28 28 31 31 26 24 30 31 30 18 28 26 21 13 19 14 26 21 25 28 14 26 19
-@1831_573_1684_F3
-T13310013212312012302121010221231123
-+
-22 29 16 25 23 27 31 18 24 31 31 30 30 24 28 26 31 31 27 29 30 31 31 27 26 27 30 22 29 22 21 30 24 29 30
-@1831_573_1769_F3
-T33220123030232212032021032302233131
-+
-22 20 19 22 19 24 5 5 22 21 22 4 14 22 26 18 3 12 22 26 18 2 11 18 14 14 2 11 19 20 14 2 5 15 21
-@1831_573_1853_F3
-T11000012111222211310103212122102331
-+
-21 19 13 14 33 31 31 22 17 33 10 14 19 30 31 30 22 30 10 31 24 14 10 24 24 13 6 8 17 27 17 5 8 17 5
-@1831_573_1943_F3
-T20300123032210232001222122001132111
-+
-7 29 14 9 16 11 8 11 31 12 8 6 15 9 29 20 6 3 14 30 21 31 14 13 5 30 23 14 7 6 8 32 19 18 11
-@1831_573_1977_F3
-T22212302221310332321002303112011311
-+
-31 31 30 21 31 23 31 31 24 32 31 28 19 21 18 18 32 22 30 24 30 27 18 25 10 22 29 6 31 4 31 30 4 18 17
-@1831_574_109_F3
-T13122332123301331032220222133301033
-+
-15 22 21 20 16 2 19 23 16 22 29 31 21 20 27 17 25 23 19 22 16 21 28 22 23 23 27 16 24 24 20 13 22 30 21
-@1831_574_148_F3
-T01200113123030012202302312200010231
-+
-27 26 12 29 18 26 26 18 29 14 14 29 15 26 26 22 28 11 28 19 12 19 14 10 29 15 17 24 27 24 27 21 17 19 26
-@1831_574_185_F3
-T21123333211302300321312212102123121
-+
-31 27 19 26 4 4 31 22 29 2 9 29 24 22 4 21 26 10 23 3 2 27 15 22 4 16 18 22 17 3 4 27 20 19 2
-@1831_574_243_F3
-T30221011230013102201033131203302330
-+
-2 31 31 31 24 20 31 28 24 30 9 29 27 19 20 3 27 31 27 19 4 31 24 30 22 2 28 30 29 22 5 29 30 24 22
-@1831_574_257_F3
-T00301133110002100302003000000102301
-+
-4 29 29 33 29 8 31 30 29 33 31 33 30 31 16 4 9 4 11 2 10 15 15 13 6 7 10 5 20 5 4 2 3 18 5
-@1831_574_293_F3
-T23213210003000103010211331300320130
-+
-5 6 8 22 6 13 9 4 2 5 3 6 14 13 3 2 2 3 13 3 5 9 8 10 9 3 2 23 4 5 4 2 5 5 4
-@1831_574_389_F3
-T21032213032101122333230212301312020
-+
-8 8 3 29 14 29 23 8 25 17 31 25 17 16 18 26 26 13 16 8 31 18 4 21 19 4 10 8 27 22 8 10 3 24 17
-@1831_574_575_F3
-T33313322100212102033032123311211302
-+
-22 30 31 29 28 30 31 29 23 31 31 31 28 31 21 9 4 5 27 28 6 20 31 27 27 6 11 15 27 28 19 9 20 14 27
-@1831_574_592_F3
-T33103330110123102223122023103310330
-+
-22 18 12 20 8 16 24 11 11 27 31 29 19 15 21 22 27 17 13 12 23 21 19 18 19 21 26 24 27 16 14 26 17 16 17
-@1831_574_617_F3
-T20021031221222021210021322200223211
-+
-31 29 31 30 26 29 30 28 31 28 28 31 29 31 28 20 30 31 10 31 25 31 19 15 31 29 27 25 15 8 6 8 21 19 12
-@1831_574_725_F3
-T32010020322130330333010031120313210
-+
-24 6 29 30 20 17 10 20 28 26 19 3 21 26 27 23 13 16 27 19 22 9 24 10 30 22 7 10 20 26 12 8 13 8 19
-@1831_574_734_F3
-T31132301200020012302210322213222222
-+
-13 12 5 13 3 17 5 27 9 7 12 4 8 25 14 8 4 20 25 8 14 4 22 10 11 24 15 18 19 9 32 13 30 22 15
-@1831_574_824_F3
-T30212100033032123311211302122020013
-+
-26 31 31 31 26 26 8 11 10 31 27 12 27 22 26 27 5 23 24 30 30 5 17 24 30 27 3 17 25 32 27 8 26 23 30
-@1831_574_959_F3
-T11212130220131221111002020123311211
-+
-22 32 28 26 10 30 31 24 26 14 27 31 26 27 23 2 5 5 14 9 4 7 4 13 15 3 15 3 17 8 10 16 3 12 16
-@1831_574_1062_F3
-T30112230030300221001032033012211012
-+
-19 31 23 17 16 27 14 14 25 16 18 21 14 23 27 16 14 20 13 19 17 22 13 26 29 17 23 23 14 15 27 16 3 8 14
-@1831_574_1092_F3
-T02013221200031031212200000111130310
-+
-27 23 30 13 11 24 23 8 15 18 4 2 11 11 11 7 11 10 10 3 6 21 24 6 2 24 6 22 2 6 26 21 13 4 17
-@1831_574_1103_F3
-T20313113203302010303131123021310121
-+
-31 30 30 29 30 31 28 29 31 31 32 27 29 30 28 31 28 28 27 25 30 27 26 20 23 6 5 5 8 25 10 18 20 6 16
-@1831_574_1116_F3
-T21011310123202303021021112021231011
-+
-8 31 10 10 11 8 14 8 30 13 14 8 4 27 8 17 29 13 28 28 25 23 30 5 26 19 19 5 14 5 11 8 14 9 19
-@1831_574_1194_F3
-T23303101033322220312200222013013312
-+
-25 20 29 26 11 30 30 24 31 24 31 30 31 16 31 31 28 31 18 28 31 29 31 19 30 31 31 24 19 30 22 20 14 11 21
-@1831_574_1204_F3
-T21330132231321322010303023221203200
-+
-32 32 20 32 20 33 31 20 25 26 31 31 11 13 24 30 32 16 30 2 13 30 26 18 8 11 29 23 17 4 8 28 6 22 9
-@1831_574_1306_F3
-T10332133020311023221213100301001220
-+
-15 17 13 22 5 4 6 6 13 3 5 2 6 4 2 2 3 2 6 2 4 6 8 6 8 3 6 3 4 3 11 8 6 13 16
-@1831_574_1387_F3
-T12301331310032132101301303230121111
-+
-12 30 32 30 30 25 31 30 31 31 24 30 31 31 30 24 34 26 25 29 5 8 13 11 11 8 26 5 6 27 5 22 7 14 6
-@1831_574_1431_F3
-T12011023331022213001123111301312011
-+
-29 22 30 29 24 33 32 23 24 22 26 10 23 9 28 21 2 21 13 10 20 5 12 2 17 21 3 15 13 11 20 5 6 3 16
-@1831_574_1560_F3
-T32212313302203320020222113111011111
-+
-28 8 8 5 21 20 27 19 28 29 24 24 31 25 20 24 22 7 16 5 26 10 5 7 4 5 19 2 11 2 5 5 5 9 3
-@1831_574_1591_F3
-T23202101330322130221230222201123202
-+
-28 28 27 32 29 27 30 31 22 23 31 27 28 26 31 5 31 21 29 23 25 30 11 29 27 5 5 27 22 29 23 7 23 10 24
-@1831_574_1624_F3
-T20122200222132200313011102302210332
-+
-2 27 21 13 5 7 11 22 12 10 8 8 22 13 13 6 14 26 19 18 13 8 24 17 22 13 7 27 23 20 5 16 18 12 8
-@1831_574_1826_F3
-T13012312120112021233030302313201111
-+
-10 31 27 27 11 8 8 19 20 24 27 30 13 10 20 22 6 12 6 5 21 30 16 8 7 26 16 26 15 5 4 19 11 2 3
-@1831_574_1903_F3
-T30232100103132133321330310210101221
-+
-27 24 20 21 30 31 29 26 22 31 31 31 23 25 31 29 23 29 27 28 24 29 24 29 31 17 28 22 16 30 16 25 21 26 14
-@1831_574_1961_F3
-T02333101331223303300200011100032200
-+
-21 29 12 15 22 12 31 29 7 17 6 31 27 2 15 21 19 31 4 20 4 31 31 21 13 5 27 27 7 24 8 28 25 19 22
-@1831_575_54_F3
-T13331330322230200102132110132013200
-+
-29 28 31 31 21 23 27 17 26 27 23 26 30 31 27 29 10 24 29 22 11 11 21 24 22 17 5 20 22 25 19 5 24 27 23
-@1831_575_80_F3
-T33133322233322221003332230323312313
-+
-9 30 20 29 27 31 30 14 28 20 4 7 5 13 20 8 10 2 14 15 6 14 6 29 2 3 14 6 18 22 2 7 8 21 5
-@1831_575_192_F3
-T30013012111133003301010212123302011
-+
-15 25 23 27 11 24 7 13 28 14 8 2 4 23 3 11 19 6 27 11 25 8 18 14 13 6 13 20 27 11 29 12 26 22 6
-@1831_575_197_F3
-T33312113010133020301131330001310032
-+
-11 12 25 30 19 21 18 31 32 25 23 23 30 21 30 19 18 22 27 28 13 17 5 16 13 26 31 21 22 13 19 31 4 17 11
-@1831_575_223_F3
-T10121010002202131221210302100121020
-+
-31 30 29 30 23 30 31 25 30 26 29 10 3 6 4 5 11 10 2 3 13 12 12 2 4 3 16 6 5 2 12 22 3 5 6
-@1831_575_420_F3
-T31110103220000101310112112001020212
-+
-23 17 30 13 29 30 7 12 6 6 17 10 13 13 31 8 11 3 4 16 31 26 6 8 16 8 30 10 8 22 13 6 8 13 13
-@1831_575_434_F3
-T30312132120223101113223301211113311
-+
-27 31 31 29 27 31 33 31 29 28 31 31 30 29 29 27 31 30 26 8 31 30 26 21 13 30 28 19 11 6 6 26 14 18 8
-@1831_575_444_F3
-T33022120112320220100202132332113320
-+
-27 17 31 31 26 27 13 28 30 31 27 10 28 25 32 27 27 31 30 27 27 14 29 31 29 27 7 27 23 29 19 5 20 26 29
-@1831_575_459_F3
-T31330310210101223330110231120131100
-+
-30 31 31 34 31 30 32 31 31 32 31 30 30 32 31 31 6 21 31 31 33 6 28 26 34 31 6 19 27 28 24 11 31 16 13
-@1831_575_506_F3
-T31210200111210121332321310110132301
-+
-23 30 8 17 9 20 31 18 10 13 22 28 30 32 25 23 31 11 14 5 8 25 31 18 22 14 27 23 24 6 10 19 9 8 9
-@1831_575_569_F3
-T10210201321323001012232322323002203
-+
-14 6 24 12 11 31 17 24 10 19 22 24 4 5 29 24 2 5 15 23 28 29 22 2 24 29 11 21 24 14 10 6 9 18 8
-@1831_575_622_F3
-T01100031122111023002323113231210111
-+
-31 32 23 33 28 31 31 30 27 31 30 27 29 29 28 30 24 21 27 19 24 22 8 27 19 14 27 6 25 19 10 26 22 19 10
-@1831_575_644_F3
-T11332003221203131231202200030110130
-+
-27 27 23 29 13 29 5 11 10 8 23 13 16 15 6 25 20 7 14 12 21 17 5 9 13 28 14 4 7 13 27 5 5 16 23
-@1831_575_663_F3
-T32210013303112103322311101322021210
-+
-31 31 31 31 31 32 27 14 26 32 29 31 21 29 15 22 24 17 27 20 24 21 21 25 30 26 17 20 10 25 29 27 16 11 10
-@1831_575_681_F3
-T23131132033020103031013233200101021
-+
-13 22 17 30 13 8 17 20 26 24 21 12 16 19 6 9 13 15 18 6 2 19 2 10 10 3 8 14 23 10 4 14 7 7 5
-@1831_575_711_F3
-T03032331231101231020121210002332121
-+
-19 4 10 25 17 7 2 6 16 10 13 8 5 9 19 20 12 2 11 27 32 12 4 19 26 29 10 8 8 27 26 2 2 9 5
-@1831_575_730_F3
-T31010102200110302123032330331011111
-+
-11 4 23 27 4 12 6 8 20 11 9 16 5 28 2 8 7 16 9 16 8 12 29 22 3 13 11 19 6 19 6 5 6 9 5
-@1831_575_904_F3
-T20111213300020123200333321131121211
-+
-30 27 29 27 13 21 23 24 31 31 22 31 27 20 19 25 19 28 31 29 21 24 28 25 10 21 12 28 19 17 26 23 27 25 2
-@1831_575_938_F3
-T13103102220022130222233301013033120
-+
-26 25 31 31 25 30 31 26 28 23 26 29 28 26 26 25 28 27 24 18 27 19 13 26 27 21 25 17 27 24 26 19 8 23 22
-@1831_575_970_F3
-T23201311301023133303023011202220221
-+
-28 31 28 31 28 26 31 31 29 27 31 31 25 24 27 25 28 30 26 29 31 28 30 24 29 29 30 31 25 17 28 28 28 27 20
-@1831_575_991_F3
-T33312212031111111012212120321121210
-+
-31 29 29 26 22 30 30 30 14 19 27 25 25 25 11 2 5 9 4 6 3 12 12 20 12 2 7 22 8 5 5 11 12 8 4
-@1831_575_1138_F3
-T23320002011320012120333103233301321
-+
-27 28 15 26 4 16 24 18 21 10 30 24 21 30 11 30 20 27 25 17 29 31 21 31 27 25 26 19 29 13 22 26 9 25 16
-@1831_575_1157_F3
-T13121323330203331222022230133102321
-+
-31 33 31 33 29 30 32 30 32 31 30 24 6 30 26 30 5 23 30 31 31 21 26 27 31 28 10 27 25 24 24 10 24 21 20
-@1831_575_1180_F3
-T32003310122102323303101123331133110
-+
-14 27 33 29 20 30 6 25 14 22 23 30 26 16 26 20 20 25 24 24 22 31 31 29 24 19 28 22 27 16 23 21 12 29 22
-@1831_575_1283_F3
-T02232200301300220130032321323131333
-+
-4 34 31 32 20 19 29 27 30 32 22 23 31 27 30 17 29 25 2 29 28 30 31 17 29 23 15 25 6 30 21 24 13 6 22
-@1831_575_1302_F3
-T01201303312333123130200123201013021
-+
-5 16 17 29 14 2 17 6 5 12 17 5 4 6 22 10 3 4 9 2 3 14 16 7 5 5 16 17 14 3 11 17 11 11 9
-@1831_575_1310_F3
-T31332131312021303211310220101211133
-+
-21 27 27 29 21 21 18 30 24 24 31 7 31 22 28 16 16 31 25 31 31 14 22 30 30 27 31 27 26 29 6 18 12 22 26
-@1831_575_1321_F3
-T11001010233200122122022023000203212
-+
-15 26 33 31 30 31 29 28 32 31 27 32 30 29 31 29 30 21 29 31 20 29 6 19 31 24 30 8 22 31 22 30 14 23 24
-@1831_575_1373_F3
-T21213011223311001221321132013121220
-+
-32 31 31 31 29 31 26 28 24 27 31 30 30 22 31 29 31 25 31 26 31 26 16 22 30 21 18 15 14 22 28 19 11 17 27
-@1831_575_1419_F3
-T33222200303001021230212332001013020
-+
-29 14 14 18 12 29 5 12 13 12 29 4 16 16 14 31 5 14 5 22 25 27 11 12 16 28 11 10 17 27 21 6 4 5 27
-@1831_575_1436_F3
-T13210313021212303321202113301220331
-+
-9 17 31 28 26 18 24 9 18 27 9 19 27 25 29 20 17 29 29 24 6 22 25 27 28 6 15 28 29 16 6 16 18 21 27
-@1831_575_1442_F3
-T33132010022331132101132123132020222
-+
-23 29 20 23 27 30 22 29 10 16 33 21 12 14 24 27 27 25 20 30 29 32 25 16 31 30 20 18 24 13 31 19 14 16 29
-@1831_575_1454_F3
-T11131130011012021120222231313211113
-+
-17 19 28 30 23 28 21 20 23 24 28 15 25 32 28 25 30 29 21 27 26 31 14 11 19 10 12 21 10 14 6 13 11 7 11
-@1831_575_1500_F3
-T11010000223111301132313011130103021
-+
-17 30 31 31 30 32 31 30 23 27 21 27 25 24 23 20 28 24 24 24 24 24 28 28 33 18 27 20 27 27 11 22 30 29 24
-@1831_575_1535_F3
-T21312012030320112110211013300131121
-+
-31 33 28 31 27 31 31 33 30 25 32 31 31 28 29 31 30 21 23 31 28 30 31 20 30 22 26 25 21 27 27 26 29 20 27
-@1831_575_1724_F3
-T33123002323300220213232301000010010
-+
-24 27 33 13 10 31 8 11 17 9 13 4 8 8 8 19 4 17 31 26 22 2 4 7 4 10 3 23 8 8 23 20 4 5 20
-@1831_575_1829_F3
-T21033321320111321230233302313101021
-+
-17 17 7 9 6 4 13 18 3 10 22 8 31 5 4 3 6 18 9 10 9 2 14 2 14 9 10 15 13 28 5 2 8 10 15
-@1831_575_1898_F3
-T31330110303103131001110300102101330
-+
-31 33 29 31 31 5 16 14 8 8 6 19 15 8 4 2 23 14 13 4 2 23 3 7 7 2 26 19 6 3 6 21 18 11 11
-@1831_575_1964_F3
-T22010201103202213200201301300232123
-+
-16 29 18 24 8 31 17 27 17 14 31 10 24 30 17 28 5 8 29 29 31 9 21 17 28 20 5 17 27 19 17 13 6 30 10
-@1831_576_32_F3
-T13012100120333032211330300332022110
-+
-10 27 29 30 29 30 28 22 27 17 8 20 17 17 26 29 27 27 31 19 15 31 29 22 15 19 27 29 20 28 17 18 31 10 5
-@1831_576_74_F3
-T30103313210232220102021223012112100
-+
-23 28 31 31 30 31 29 7 30 30 27 33 20 30 31 31 31 24 27 31 29 27 10 29 27 26 31 6 26 29 21 24 21 16 30
-@1831_576_86_F3
-T10320000121033022010011030032211310
-+
-22 23 16 16 8 17 25 9 13 10 10 20 27 14 25 18 10 19 18 24 17 19 9 8 8 14 25 11 21 5 17 24 8 17 14
-@1831_576_89_F3
-T02132333203332020020220033002121120
-+
-17 8 21 24 10 11 6 13 19 28 12 11 29 14 29 7 9 3 2 8 18 15 18 15 9 6 7 11 4 8 17 2 2 3 11
-@1831_576_266_F3
-T30322223101312011300311121221333223
-+
-27 31 31 30 28 26 27 30 22 28 31 29 24 11 29 31 16 3 5 5 23 24 3 14 25 29 22 6 18 16 22 23 4 5 21
-@1831_576_327_F3
-T22112331301313021321001332120332130
-+
-27 31 30 31 21 31 31 26 27 31 30 29 27 31 29 28 28 18 31 25 28 28 27 18 31 31 29 20 18 27 24 29 27 21 28
-@1831_576_331_F3
-T32012133301311223023011232112333030
-+
-26 12 17 8 10 7 9 13 9 16 14 26 20 4 13 12 24 5 2 14 16 6 10 7 3 9 3 2 2 7 8 4 14 3 13
-@1831_576_387_F3
-T00101211032031120300200222001230022
-+
-14 23 8 13 3 20 2 16 2 9 4 13 3 2 2 13 9 2 3 4 2 2 12 4 11 10 11 16 2 5 4 13 4 8 8
-@1831_576_406_F3
-T00223133010210122221320212103132011
-+
-27 19 27 29 4 4 16 19 25 9 19 21 20 21 8 5 27 17 20 16 5 17 10 18 2 5 16 24 11 21 5 19 29 20 7
-@1831_576_449_F3
-T31312001121222231100020132132100220
-+
-7 10 6 5 6 13 11 11 3 14 10 13 8 3 3 23 5 4 2 10 30 5 11 2 8 12 5 2 2 2 22 11 10 2 9
-@1831_576_519_F3
-T03011321130130133213131202130321131
-+
-28 28 19 21 27 24 22 31 29 17 14 21 30 26 17 27 19 32 23 23 16 29 24 16 17 16 10 27 16 14 19 13 24 10 22
-@1831_576_603_F3
-T21003032313302312320131221001330311
-+
-31 31 19 21 28 31 34 13 30 30 27 32 22 24 31 31 26 12 27 31 31 29 17 24 33 30 29 20 20 27 33 22 20 24 23
-@1831_576_655_F3
-T02001023130302322122200313123123102
-+
-28 31 32 32 24 31 31 27 21 9 29 31 31 20 14 27 31 29 24 6 28 26 29 22 10 31 30 24 29 14 24 26 10 11 4
-@1831_576_677_F3
-T13330131023320301031013230210103022
-+
-21 17 24 15 5 14 9 15 2 5 6 5 11 13 17 6 2 5 9 3 5 7 6 2 12 4 7 3 9 2 4 3 8 2 4
-@1831_576_718_F3
-T31232113331022231333313223132231213
-+
-3 19 2 2 2 3 15 2 2 2 4 7 2 2 2 2 2 2 2 2 2 11 2 2 2 2 4 2 2 2 2 3 2 2 2
-@1831_576_722_F3
-T31230320322120231333030031100313200
-+
-7 9 11 12 11 2 2 13 8 9 5 7 9 16 4 9 7 4 7 12 17 2 10 8 12 2 13 5 12 2 4 4 3 6 8
-@1831_576_754_F3
-T30221231132103120112331303112133020
-+
-13 19 14 14 2 7 13 3 8 6 6 11 29 7 5 2 16 3 27 11 2 2 4 7 7 11 2 20 30 2 15 9 4 16 9
-@1831_576_815_F3
-T23022113203032010120310102321001031
-+
-27 18 29 31 30 24 29 31 30 33 28 29 28 26 29 32 30 30 30 28 29 25 17 20 28 19 13 17 20 30 21 27 20 22 13
-@1831_576_882_F3
-T13230020122320223230022031020110122
-+
-30 17 21 30 23 30 31 25 19 29 31 29 24 21 30 30 27 27 28 20 6 16 27 29 24 23 19 21 28 27 24 27 16 29 23
-@1831_576_898_F3
-T10230132312121033222231132231233213
-+
-28 31 31 34 17 30 34 29 30 27 29 31 23 23 21 33 30 26 30 13 30 30 23 22 28 33 27 23 27 16 20 30 30 28 13
-@1831_576_923_F3
-T21322010320202013210121223010123122
-+
-22 21 13 20 16 28 26 13 21 24 24 27 24 21 29 26 26 19 24 27 26 26 16 16 26 27 31 20 24 25 24 28 21 19 22
-@1831_576_930_F3
-T21322103230123110323102012021020013
-+
-17 2 9 15 13 17 5 13 25 7 7 2 6 16 19 6 2 2 12 8 2 4 3 3 17 4 2 3 14 16 5 2 4 14 2
-@1831_576_1019_F3
-T22032121213231032210312001103122312
-+
-17 27 3 29 3 11 16 11 5 10 10 5 31 11 13 8 6 10 14 10 2 24 6 21 24 14 21 6 17 7 10 12 6 24 12
-@1831_576_1068_F3
-T00020232013101330112220321203220211
-+
-25 29 29 27 28 19 30 26 31 22 28 30 30 24 30 26 24 29 20 31 24 30 25 23 31 25 28 20 6 26 22 26 6 2 19
-@1831_576_1131_F3
-T10233122200222132200313011102302210
-+
-16 15 19 31 2 31 14 31 11 19 29 24 30 17 10 30 16 20 22 16 31 6 11 29 28 26 7 22 20 24 26 9 24 17 27
-@1831_576_1168_F3
-T31013300131121323122002113301002010
-+
-29 31 34 34 21 31 31 17 30 24 28 29 22 30 26 22 21 27 26 19 21 22 31 26 24 11 15 4 17 21 6 6 11 19 3
-@1831_576_1207_F3
-T21001132013000122220301213221213010
-+
-4 3 29 17 11 7 5 30 19 30 7 11 31 25 27 5 11 31 29 30 3 5 25 23 32 4 4 28 15 13 4 11 20 24 22
-@1831_576_1289_F3
-T03021210023110200323310302013121203
-+
-31 24 27 29 16 33 31 31 26 22 31 31 21 21 18 28 28 17 23 11 20 6 25 23 27 27 11 13 28 17 29 29 13 20 15
-@1831_576_1329_F3
-T01100302102020113003022000120002100
-+
-27 29 5 15 11 23 22 15 14 32 31 31 14 20 13 26 28 26 25 6 5 31 18 6 5 3 3 4 11 10 2 7 3 5 17
-@1831_576_1367_F3
-T12231310311233110031222013332011023
-+
-30 30 31 31 27 29 31 31 28 31 27 31 27 28 31 29 31 30 30 24 25 30 27 28 29 28 27 23 26 20 24 31 22 23 22
-@1831_576_1416_F3
-T33021233100123120313103133211203221
-+
-10 6 26 30 13 13 16 13 27 31 6 13 28 10 21 13 20 30 22 27 15 12 30 22 26 7 4 28 29 20 21 13 24 23 31
-@1831_576_1461_F3
-T32022221221112233100210223002100100
-+
-2 16 5 22 19 2 7 2 7 5 2 2 3 2 11 6 2 2 2 4 2 4 4 2 9 2 5 4 4 2 2 4 4 4 6
-@1831_576_1605_F3
-T30232100103132133321330310210101221
-+
-21 27 31 34 31 31 29 16 26 31 25 26 27 27 31 31 24 31 30 30 30 24 27 18 30 20 12 17 16 28 19 23 22 22 11
-@1831_576_1664_F3
-T31212101001312110320301201002011120
-+
-31 31 30 29 30 31 28 32 25 31 31 29 31 28 6 28 27 29 28 8 13 29 28 24 9 23 8 7 22 2 14 10 10 26 8
-@1831_576_1671_F3
-T22313332300211322113223102231322313
-+
-31 31 30 31 20 29 31 31 23 5 23 30 17 20 2 5 8 5 20 5 5 8 16 20 5 5 11 5 19 4 5 11 5 21 4
-@1831_576_1729_F3
-T11233312313010012320101302101023030
-+
-31 30 31 30 27 30 27 31 29 32 30 14 28 28 30 29 30 22 29 30 31 23 27 30 31 29 24 24 26 29 27 10 15 28 29
-@1831_576_1880_F3
-T13032121323320213301001310130212003
-+
-15 20 16 20 14 22 24 17 11 25 11 22 14 4 14 15 20 11 4 3 8 25 10 2 23 4 17 7 16 22 20 19 8 8 18
-@1831_576_1982_F3
-T00032312310201201333221212000011030
-+
-11 31 31 30 31 11 32 29 27 31 24 31 28 30 31 24 33 28 23 27 21 31 31 21 31 17 27 32 30 29 13 22 27 10 31
-@1831_576_1987_F3
-T30022313313231221213220132001011320
-+
-8 2 2 7 8 7 2 5 2 2 8 4 8 14 12 2 4 3 16 16 2 4 18 29 6 2 2 5 3 11 2 3 3 6 10
-@1831_576_2014_F3
-T31123201010100321122111102113021003
-+
-31 31 31 24 11 33 17 24 12 20 29 6 30 11 10 30 22 24 10 14 32 6 26 6 17 31 6 20 5 14 24 11 21 5 16
-@1831_576_2028_F3
-T20131211210311112023201213120201100
-+
-20 27 29 24 29 20 6 17 7 5 22 15 22 13 23 2 5 5 18 24 11 15 4 22 14 2 7 2 11 9 4 5 20 9 10
-@1831_577_40_F3
-T11111212330120012020200031313303003
-+
-24 17 14 19 7 6 13 6 8 7 27 9 30 2 3 8 4 5 27 11 14 18 24 27 7 13 17 11 10 27 28 31 21 16 16
-@1831_577_119_F3
-T33111010021103320103213121313000102
-+
-24 29 30 34 16 16 8 12 16 14 8 2 26 2 14 11 23 20 15 9 10 13 10 3 3 20 20 20 15 10 4 12 13 19 15
-@1831_577_133_F3
-T33213323012231300122223032223331322
-+
-14 19 31 29 29 30 28 16 30 25 10 29 31 15 22 31 31 29 27 29 31 9 27 10 16 31 16 20 8 24 21 6 17 3 8
-@1831_577_255_F3
-T00332022110020300332022020202002232
-+
-22 27 28 23 22 31 29 21 24 4 9 9 2 5 2 12 10 3 13 2 5 5 2 10 3 12 10 4 5 4 13 11 4 20 2
-@1831_577_281_F3
-T03032301231212301013112222111210000
-+
-22 12 25 33 26 23 31 28 26 29 22 31 29 19 30 28 30 10 21 20 24 30 26 20 27 22 30 26 24 31 23 7 29 25 30
-@1831_577_288_F3
-T01031120221303100221230021013201130
-+
-20 26 14 22 24 30 30 5 28 33 25 25 17 24 23 9 21 13 22 14 10 19 5 17 16 11 22 11 21 30 13 22 2 6 21
-@1831_577_322_F3
-T12003213220230103303201000130312202
-+
-24 28 26 29 19 20 15 21 26 17 20 20 19 21 19 12 27 2 22 10 16 24 19 5 17 27 30 21 20 24 21 23 8 22 14
-@1831_577_362_F3
-T31203302330110131230331210121110220
-+
-21 17 33 30 25 31 30 31 27 30 24 20 23 28 11 18 25 11 24 15 25 5 6 12 24 24 11 21 27 20 13 7 3 10 21
-@1831_577_382_F3
-T32312123033111120321303230201332100
-+
-16 17 24 20 22 14 25 16 8 8 28 22 21 7 9 17 19 26 11 18 10 25 27 13 5 13 5 12 28 16 28 17 14 20 9
-@1831_577_464_F3
-T13020221011130013102221333131203302
-+
-18 28 27 22 14 27 23 17 21 8 29 2 13 6 5 19 17 15 19 10 20 2 14 15 19 16 13 22 9 24 16 5 22 20 21
-@1831_577_488_F3
-T13200302330322110200323132101120301
-+
-25 19 23 13 11 9 29 21 20 21 21 27 30 23 28 27 28 27 17 29 21 26 24 19 29 26 28 24 29 31 23 24 17 19 31
-@1831_577_511_F3
-T32232133031023313331312220133230333
-+
-2 22 14 10 5 3 25 27 22 4 21 11 3 3 4 6 4 14 10 8 2 3 22 7 7 5 9 18 29 16 21 6 15 14 10
-@1831_577_545_F3
-T00112131333222303222210031322103233
-+
-29 29 27 27 24 30 27 29 30 32 27 19 23 16 31 27 31 23 28 28 31 22 21 14 21 16 27 24 20 13 20 24 23 23 12
-@1831_577_559_F3
-T32321101303233120102011130022122002
-+
-13 27 31 26 30 30 31 29 31 30 14 17 27 13 31 16 28 29 16 17 28 21 16 14 26 28 30 13 5 17 10 24 17 8 6
-@1831_577_562_F3
-T32331101301233110121000220031120031
-+
-2 7 7 5 9 5 15 4 8 16 4 8 2 7 3 17 12 11 9 9 9 4 14 12 11 11 8 8 5 11 12 13 16 6 9
-@1831_577_637_F3
-T22113312122202103031023120301031110
-+
-23 12 11 19 2 29 25 12 21 10 25 23 11 5 7 20 26 18 28 15 29 22 28 21 23 5 16 14 24 5 6 30 26 19 11
-@1831_577_641_F3
-T13031301101121223221212020032131113
-+
-5 19 22 26 14 6 25 32 26 26 20 30 25 22 17 11 7 28 8 11 2 9 30 10 13 2 5 22 3 23 2 4 22 14 6
-@1831_577_692_F3
-T01122320200330103121202301211100220
-+
-31 33 11 31 30 31 33 7 31 32 30 31 10 31 31 29 31 10 30 28 29 31 6 28 27 31 27 28 27 24 28 30 22 20 27
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/combine_phiX_out_2.fastqcssanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/combine_phiX_out_2.fastqcssanger Tue Mar 02 10:47:23 2010 -0500
@@ -0,0 +1,576 @@
+@1831_573_1004_F3
+T00030133312212111300011021310132222
++
+%><C&&9952+C>5<.?<79,=42<292:<(9/-7
+@1831_573_1050_F3
+T03330322230322112131010221102122113
++
+);@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
+@1831_573_1067_F3
+T00023032023103330112220321200200002
++
+.++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
+@1831_573_1219_F3
+T11211130300300301021212330201121310
++
+@@@=4/+)5)408?'665>*/5?<61';<3,:,5-
+@1831_573_1242_F3
+T02132003121011302100130302112221121
++
+>>>::>17=A5?@@=;7A=;2.60>82<8=74+;;
+@1831_573_1333_F3
+T00200312330110101013212313222303112
++
+)='@#%3=.>)/34*117,,/6-4+.9742456<)
+@1831_573_1362_F3
+T21203131001102231121211101111321131
++
+CB@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
+@1831_573_1448_F3
+T23101211223113320132212331313312022
++
+77=A)?,.@A@@:@@<=/7)@<-#8662%9613&+
+@1831_573_1490_F3
+T31312310323301210002210123101021011
++
+@@@@?,@??@$><=>+%/*>*1,)?26&12'9%7.
+@1831_573_1523_F3
+T10322001220012223202202222001230222
++
+(,//*,#8''.6''6'2&27/80)%�'%#*,2'
+@1831_573_1578_F3
+T21202302100010020121100311022120111
++
+@?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
+@1831_573_1647_F3
+T10222233301013033120132223202022123
++
+=?@@<@@???;A==@@;9?@?3=;6.4/;6:=/;4
+@1831_573_1684_F3
+T13310013212312012302121010221231123
++
+7>1:8<@39@@??9=;@@<>?@@<;<?7>76?9>?
+@1831_573_1769_F3
+T33220123030232212032021032302233131
++
+754749&&767%/7;3$-7;3#,3//#,45/#&06
+@1831_573_1853_F3
+T11000012111222211310103212122102331
++
+64./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
+@1831_573_1943_F3
+T20300123032210232001222122001132111
++
+(>/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
+@1831_573_1977_F3
+T22212302221310332321002303112011311
++
+@@?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
+@1831_574_109_F3
+T13122332123301331032220222133301033
++
+07651#4817>@65<2:84716=788<1995.7?6
+@1831_574_148_F3
+T01200113123030012202302312200010231
++
+<;->3;;3>//>0;;7=,=4-4/+>029<9<624;
+@1831_574_185_F3
+T21123333211302300321312212102123121
++
+@<4;%%@7>#*>97%6;+8$#<07%1372$%<54#
+@1831_574_243_F3
+T30221011230013102201033131203302330
++
+#@@@95@=9?*><45$<@<4%@9?7#=?>7&>?97
+@1831_574_257_F3
+T00301133110002100302003000000102301
++
+%>>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
+@1831_574_293_F3
+T23213210003000103010211331300320130
++
+&')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
+@1831_574_389_F3
+T21032213032101122333230212301312020
++
+))$>/>8):2@:213;;.1)@3%64%+)<7)+$92
+@1831_574_575_F3
+T33313322100212102033032123311211302
++
+7?@>=?@>8@@@=@6*%&<='5@<<',0<=4*5/<
+@1831_574_592_F3
+T33103330110123102223122023103310330
++
+73-5)19,,<@>4067<2.-864346;9<1/;212
+@1831_574_617_F3
+T20021031221222021210021322200223211
++
+@>@?;>?=@==@>@=5?@+@:@40@><:0)')64-
+@1831_574_725_F3
+T32010020322130330333010031120313210
++
+9'>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
+@1831_574_734_F3
+T31132301200020012302210322213222222
++
+.-&.$2&<*(-%):/)%5:)/%7+,9034*A.?70
+@1831_574_824_F3
+T30212100033032123311211302122020013
++
+;@@@;;),+@<-<7;<&89??&29?<$2:A<);8?
+@1831_574_959_F3
+T11212130220131221111002020123311211
++
+7A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
+@1831_574_1062_F3
+T30112230030300221001032033012211012
++
+4@821<//:136/8<1/5.427.;>288/0<1$)/
+@1831_574_1092_F3
+T02013221200031031212200000111130310
++
+<8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
+@1831_574_1103_F3
+T20313113203302010303131123021310121
++
+@??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
+@1831_574_1116_F3
+T21011310123202303021021112021231011
++
+)(a)++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
+@1831_574_1194_F3
+T23303101033322220312200222013013312
++
+:5>;,??9@9@?@1@@=@3=@>@4?@@94?75/,6
+@1831_574_1204_F3
+T21330132231321322010303023221203200
++
+AA5A5B@5:;@@,.9?A1?#.?;3),>82%)='7*
+@1831_574_1306_F3
+T10332133020311023221213100301001220
++
+02.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
+@1831_574_1387_F3
+T12301331310032132101301303230121111
++
+-?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
+@1831_574_1431_F3
+T12011023331022213001123111301312011
++
+>7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
+@1831_574_1560_F3
+T32212313302203320020222113111011111
++
+=))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
+@1831_574_1591_F3
+T23202101330322130221230222201123202
++
+==<A><?@78@<=;@&@6>8:?,><&&<7>8(8+9
+@1831_574_1624_F3
+T20122200222132200313011102302210332
++
+#<6.&(,7-+))7..'/;43.)927.(<85&13-)
+@1831_574_1826_F3
+T13012312120112021233030302313201111
++
++@<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
+@1831_574_1903_F3
+T30232100103132133321330310210101221
++
+<956?@>;7@@@8:@>8><=9>9>@2=71?1:6;/
+@1831_574_1961_F3
+T02333101331223303300200011100032200
++
+6>-07-@>(2'@<#064@%5%@@6.&<<(9)=:47
+@1831_575_54_F3
+T13331330322230200102132110132013200
++
+>=@@68<2;<8;?@<>+9>7,,6972&57:4&9<8
+@1831_575_80_F3
+T33133322233322221003332230323312313
++
+*?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
+@1831_575_192_F3
+T30013012111133003301010212123302011
++
+0:8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
+@1831_575_197_F3
+T33312113010133020301131330001310032
++
+,-:?463@A:88?6?437<=.2&1.;@67.4@%2,
+@1831_575_223_F3
+T10121010002202131221210302100121020
++
+@?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
+@1831_575_420_F3
+T31110103220000101310112112001020212
++
+82?.>?(-''2+..@),$%1@;')1)?+)7.')..
+@1831_575_434_F3
+T30312132120223101113223301211113311
++
+<@@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
+@1831_575_444_F3
+T33022120112320220100202132332113320
++
+<2@@;<.=?@<+=:A<<@?<</>@><(<8>4&5;>
+@1831_575_459_F3
+T31330310210101223330110231120131100
++
+?@@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
+@1831_575_506_F3
+T31210200111210121332321310110132301
++
+8?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
+@1831_575_569_F3
+T10210201321323001012232322323002203
++
+/'9-,@29+479%&>9#&08=>7#9>,69/+'*3)
+@1831_575_622_F3
+T01100031122111023002323113231210111
++
+@A8B=@@?<@?<>>=?96<497)<4/<':4+;74+
+@1831_575_644_F3
+T11332003221203131231202200030110130
++
+<<8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
+@1831_575_663_F3
+T32210013303112103322311101322021210
++
+@@@@@A</;A>@6>0792<5966:?;25+:><1,+
+@1831_575_681_F3
+T23131132033020103031013233200101021
++
+.72?.)25;96-14'*.03'#4#++$)/8+%/((&
+@1831_575_711_F3
+T03032331231101231020121210002332121
++
+4%+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
+@1831_575_730_F3
+T31010102200110302123032330331011111
++
+,%8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
+@1831_575_904_F3
+T20111213300020123200333321131121211
++
+?<><.689@@7@<54:4=@>69=:+6-=42;8<:#
+@1831_575_938_F3
+T13103102220022130222233301013033120
++
+;:@@:?@;=8;>=;;:=<93<4.;<6:2<9;4)87
+@1831_575_970_F3
+T23201311301023133303023011202220221
++
+=@=@=;@@><@@:9<:=?;>@=?9>>?@:2===<5
+@1831_575_991_F3
+T33312212031111111012212120321121210
++
+@>>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
+@1831_575_1138_F3
+T23320002011320012120333103233301321
++
+<=0;%1936+?96?,?5<:2>@6@<:;4>.7;*:1
+@1831_575_1157_F3
+T13121323330203331222022230133102321
++
+@B@B>?A?A@?9'?;?&8?@@6;<@=+<:99+965
+@1831_575_1180_F3
+T32003310122102323303101123331133110
++
+/<B>5?':/78?;1;55:997@@>94=7<186->7
+@1831_575_1283_F3
+T02232200301300220130032321323131333
++
+%C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
+@1831_575_1302_F3
+T01201303312333123130200123201013021
++
+&12>/#2'&-2&%'7+$%*#$/1(&&12/$,2,,*
+@1831_575_1310_F3
+T31332131312021303211310220101211133
++
+6<<>663?99@(@7=11@:@@/7??<@<;>'3-7;
+@1831_575_1321_F3
+T11001010233200122122022023000203212
++
+0;B@?@>=A@<A?>@>?6>@5>'4@9?)7@7?/89
+@1831_575_1373_F3
+T21213011223311001221321132013121220
++
+A@@@>@;=9<@??7@>@:@;@;17?630/7=4,2<
+@1831_575_1419_F3
+T33222200303001021230212332001013020
++
+>//3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
+@1831_575_1436_F3
+T13210313021212303321202113301220331
++
+*2@=;39*3<*4<:>52>>9'7:<='0=>1'136<
+@1831_575_1442_F3
+T33132010022331132101132123132020222
++
+8>58<?7>+1B6-/9<<:5?>A:1@?539.@4/1>
+@1831_575_1454_F3
+T11131130011012021120222231313211113
++
+24=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
+@1831_575_1500_F3
+T11010000223111301132313011130103021
++
+2?@@?A@?8<6<:985=99999==B3<5<<,7?>9
+@1831_575_1535_F3
+T21312012030320112110211013300131121
++
+@B=@<@@B?:A@@=>@?68@=?@5?7;:6<<;>5<
+@1831_575_1724_F3
+T33123002323300220213232301000010010
++
+9<B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
+@1831_575_1829_F3
+T21033321320111321230233302313101021
++
+22(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
+@1831_575_1898_F3
+T31330110303103131001110300102101330
++
+@B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
+@1831_575_1964_F3
+T22010201103202213200201301300232123
++
+1>39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
+@1831_576_32_F3
+T13012100120333032211330300332022110
++
++<>?>?=7<2)522;><<@40@>704<>5=23@+&
+@1831_576_74_F3
+T30103313210232220102021223012112100
++
+8=@@?@>(??<B5?@@@9<@><+><;@';>6961?
+@1831_576_86_F3
+T10320000121033022010011030032211310
++
+7811)2:*.++5</:3+43924*))/:,6&29)2/
+@1831_576_89_F3
+T02132333203332020020220033002121120
++
+2)69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
+@1831_576_266_F3
+T30322223101312011300311121221333223
++
+<@@?=;<?7=@>9,>@1$&&89$/:>7'3178%&6
+@1831_576_327_F3
+T22112331301313021321001332120332130
++
+<@?@6@@;<@?><@>==3@:==<3@@>53<9><6=
+@1831_576_331_F3
+T32012133301311223023011232112333030
++
+;-2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
+@1831_576_387_F3
+T00101211032031120300200222001230022
++
+/8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
+@1831_576_406_F3
+T00223133010210122221320212103132011
++
+<4<>%%14:*4656)&<251&2+3#&19,6&4>5(
+@1831_576_449_F3
+T31312001121222231100020132132100220
++
+(+'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
+@1831_576_519_F3
+T03011321130130133213131202130321131
++
+==46<97@>2/6?;2<4A881>9121+<1/4.9+7
+@1831_576_603_F3
+T21003032313302312320131221001330311
++
+@@46=@C.??<A79@@;-<@@>29B?>55<B7598
+@1831_576_655_F3
+T02001023130302322122200313123123102
++
+=@AA9@@<6*>@@5/<@>9'=;>7+@?9>/9;+,%
+@1831_576_677_F3
+T13330131023320301031013230210103022
++
+6290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
+@1831_576_718_F3
+T31232113331022231333313223132231213
++
+$4###$0###%(#########,####%####$###
+@1831_576_722_F3
+T31230320322120231333030031100313200
++
+(*,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
+@1831_576_754_F3
+T30221231132103120112331303112133020
++
+.4//#(.$)'',>($<,##%((,#5?#0*%1*
+@1831_576_815_F3
+T23022113203032010120310102321001031
++
+<3>@?9>@?B=>=;>A???=>:25=4.25?6<57.
+@1831_576_882_F3
+T13230020122320223230022031020110122
++
+?26?8?@:4>@>96??<<=5'1<>9846=<9<1>8
+@1831_576_898_F3
+T10230132312121033222231132231233213
++
+=@@C2?C>?<>@886B?;?.??87=B<8<15??=.
+@1831_576_923_F3
+T21322010320202013210121223010123122
++
+76.51=;.699<96>;;49<;;11;<@59:9=647
+@1831_576_930_F3
+T21322103230123110323102012021020013
++
+2#*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
+@1831_576_1019_F3
+T22032121213231032210312001103122312
++
+2<$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
+@1831_576_1068_F3
+T00020232013101330112220321203220211
++
+:>><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
+@1831_576_1131_F3
+T10233122200222132200313011102302210
++
+104@#@/@,4>9?2+?1571@',>=;(759;*92<
+@1831_576_1168_F3
+T31013300131121323122002113301002010
++
+>@CC6@@2?9=>7?;76<;467@;9,0%26'',4$
+@1831_576_1207_F3
+T21001132013000122220301213221213010
++
+%$>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
+@1831_576_1289_F3
+T03021210023110200323310302013121203
++
+@9<>1B@@;7@@663==28,5':8<<,.=2>>.50
+@1831_576_1329_F3
+T01100302102020113003022000120002100
++
+<>&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
+@1831_576_1367_F3
+T12231310311233110031222013332011023
++
+??@@<>@@=@<@<=@>@??9:?<=>=<8;59@787
+@1831_576_1416_F3
+T33021233100123120313103133211203221
++
++';?..1.<@'.=+6.5?7<0-?7;(%=>56.98@
+@1831_576_1461_F3
+T32022221221112233100210223002100100
++
+#1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
+@1831_576_1605_F3
+T30232100103132133321330310210101221
++
+6<@C@@>1;@:;<<@@9@???9<3?5-21=4877,
+@1831_576_1664_F3
+T31212101001312110320301201002011120
++
+@@?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
+@1831_576_1671_F3
+T22313332300211322113223102231322313
++
+@@?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
+@1831_576_1729_F3
+T11233312313010012320101302101023030
++
+@?@?<?<@>A?/==?>?7>?@8<?@>99;><+0=>
+@1831_576_1880_F3
+T13032121323320213301001310130212003
++
+0515/792,:,7/%/05,%$):+#8%2(1754))3
+@1831_576_1982_F3
+T00032312310201201333221212000011030
++
+,@@?@,A><@9@=?@9B=8<6@@6@2<A?>.7<+@
+@1831_576_1987_F3
+T30022313313231221213220132001011320
++
+)##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
+@1831_576_2014_F3
+T31123201010100321122111102113021003
++
+@@@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
+@1831_576_2028_F3
+T20131211210311112023201213120201100
++
+5<>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
+@1831_577_40_F3
+T11111212330120012020200031313303003
++
+92/4('.')(<*?#$)%&<,/39<(.2,+<=@611
+@1831_577_119_F3
+T33111010021103320103213121313000102
++
+9>?C11)-1/)#;#/,850*+.+$$5550+%-.40
+@1831_577_133_F3
+T33213323012231300122223032223331322
++
+/4@>>?=1?:+>@07@@><>@*<+1@15)96'2$)
+@1831_577_255_F3
+T00332022110020300332022020202002232
++
+7<=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
+@1831_577_281_F3
+T03032301231212301013112222111210000
++
+7-:B;8@=;>7@>4?=?+659?;5<7?;9@8(>:?
+@1831_577_288_F3
+T01031120221303100221230021013201130
++
+5;/79??&=B::298*6.7/+4&21,7,6?.7#'6
+@1831_577_322_F3
+T12003213220230103303201000130312202
++
+9=;>4506;255464-<#7+194&2<?65968)7/
+@1831_577_362_F3
+T31203302330110131230331210121110220
++
+62B?:@?@<?958=,3:,90:&'-99,6<5.($+6
+@1831_577_382_F3
+T32312123033111120321303230201332100
++
+12957/:1))=76(*24;,3+:<.&.&-=1=2/5*
+@1831_577_464_F3
+T13020221011130013102221333131203302
++
+3=<7/<826)>#.'&4204+5#/041.7*91&756
+@1831_577_488_F3
+T13200302330322110200323132101120301
++
+:48.,*>6566<?8=<=<2>6;94>;=9>@8924@
+@1831_577_511_F3
+T32232133031023313331312220133230333
++
+#7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
+@1831_577_545_F3
+T00112131333222303222210031322103233
++
+>><<9?<>?A<481@<@8==@76/61<95.5988-
+@1831_577_559_F3
+T32321101303233120102011130022122002
++
+.<@;??@>@?/2<.@1=>12=61/;=?.&2+92)'
+@1831_577_562_F3
+T32331101301233110121000220031120031
++
+#((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
+@1831_577_637_F3
+T22113312122202103031023120301031110
++
+8-,4#>:-6+:8,&(5;3=0>7=68&1/9&'?;4,
+@1831_577_641_F3
+T13031301101121223221212020032131113
++
+&47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
+@1831_577_692_F3
+T01122320200330103121202301211100220
++
+@B,@?@B(@A?@+@@>@+?=>@'=<@<=<9=?75<
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/combine_phiX_out_2.fastqsolid
--- a/test-data/combine_phiX_out_2.fastqsolid Tue Mar 02 09:51:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,576 +0,0 @@
-@1831_573_1004_F3
-T00030133312212111300011021310132222
-+
-%><C&&9952+C>5<.?<79,=42<292:<(9/-7
-@1831_573_1050_F3
-T03330322230322112131010221102122113
-+
-);@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-@1831_573_1067_F3
-T00023032023103330112220321200200002
-+
-.++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-@1831_573_1219_F3
-T11211130300300301021212330201121310
-+
-@@@=4/+)5)408?'665>*/5?<61';<3,:,5-
-@1831_573_1242_F3
-T02132003121011302100130302112221121
-+
->>>::>17=A5?@@=;7A=;2.60>82<8=74+;;
-@1831_573_1333_F3
-T00200312330110101013212313222303112
-+
-)='@#%3=.>)/34*117,,/6-4+.9742456<)
-@1831_573_1362_F3
-T21203131001102231121211101111321131
-+
-CB@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-@1831_573_1448_F3
-T23101211223113320132212331313312022
-+
-77=A)?,.@A@@:@@<=/7)@<-#8662%9613&+
-@1831_573_1490_F3
-T31312310323301210002210123101021011
-+
-@@@@?,@??@$><=>+%/*>*1,)?26&12'9%7.
-@1831_573_1523_F3
-T10322001220012223202202222001230222
-+
-(,//*,#8''.6''6'2&27/80)%�'%#*,2'
-@1831_573_1578_F3
-T21202302100010020121100311022120111
-+
-@?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
-@1831_573_1647_F3
-T10222233301013033120132223202022123
-+
-=?@@<@@???;A==@@;9?@?3=;6.4/;6:=/;4
-@1831_573_1684_F3
-T13310013212312012302121010221231123
-+
-7>1:8<@39@@??9=;@@<>?@@<;<?7>76?9>?
-@1831_573_1769_F3
-T33220123030232212032021032302233131
-+
-754749&&767%/7;3$-7;3#,3//#,45/#&06
-@1831_573_1853_F3
-T11000012111222211310103212122102331
-+
-64./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
-@1831_573_1943_F3
-T20300123032210232001222122001132111
-+
-(>/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
-@1831_573_1977_F3
-T22212302221310332321002303112011311
-+
-@@?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
-@1831_574_109_F3
-T13122332123301331032220222133301033
-+
-07651#4817>@65<2:84716=788<1995.7?6
-@1831_574_148_F3
-T01200113123030012202302312200010231
-+
-<;->3;;3>//>0;;7=,=4-4/+>029<9<624;
-@1831_574_185_F3
-T21123333211302300321312212102123121
-+
-@<4;%%@7>#*>97%6;+8$#<07%1372$%<54#
-@1831_574_243_F3
-T30221011230013102201033131203302330
-+
-#@@@95@=9?*><45$<@<4%@9?7#=?>7&>?97
-@1831_574_257_F3
-T00301133110002100302003000000102301
-+
-%>>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
-@1831_574_293_F3
-T23213210003000103010211331300320130
-+
-&')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
-@1831_574_389_F3
-T21032213032101122333230212301312020
-+
-))$>/>8):2@:213;;.1)@3%64%+)<7)+$92
-@1831_574_575_F3
-T33313322100212102033032123311211302
-+
-7?@>=?@>8@@@=@6*%&<='5@<<',0<=4*5/<
-@1831_574_592_F3
-T33103330110123102223122023103310330
-+
-73-5)19,,<@>4067<2.-864346;9<1/;212
-@1831_574_617_F3
-T20021031221222021210021322200223211
-+
-@>@?;>?=@==@>@=5?@+@:@40@><:0)')64-
-@1831_574_725_F3
-T32010020322130330333010031120313210
-+
-9'>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
-@1831_574_734_F3
-T31132301200020012302210322213222222
-+
-.-&.$2&<*(-%):/)%5:)/%7+,9034*A.?70
-@1831_574_824_F3
-T30212100033032123311211302122020013
-+
-;@@@;;),+@<-<7;<&89??&29?<$2:A<);8?
-@1831_574_959_F3
-T11212130220131221111002020123311211
-+
-7A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
-@1831_574_1062_F3
-T30112230030300221001032033012211012
-+
-4@821<//:136/8<1/5.427.;>288/0<1$)/
-@1831_574_1092_F3
-T02013221200031031212200000111130310
-+
-<8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
-@1831_574_1103_F3
-T20313113203302010303131123021310121
-+
-@??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
-@1831_574_1116_F3
-T21011310123202303021021112021231011
-+
-)(a)++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
-@1831_574_1194_F3
-T23303101033322220312200222013013312
-+
-:5>;,??9@9@?@1@@=@3=@>@4?@@94?75/,6
-@1831_574_1204_F3
-T21330132231321322010303023221203200
-+
-AA5A5B@5:;@@,.9?A1?#.?;3),>82%)='7*
-@1831_574_1306_F3
-T10332133020311023221213100301001220
-+
-02.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
-@1831_574_1387_F3
-T12301331310032132101301303230121111
-+
--?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
-@1831_574_1431_F3
-T12011023331022213001123111301312011
-+
->7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
-@1831_574_1560_F3
-T32212313302203320020222113111011111
-+
-=))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
-@1831_574_1591_F3
-T23202101330322130221230222201123202
-+
-==<A><?@78@<=;@&@6>8:?,><&&<7>8(8+9
-@1831_574_1624_F3
-T20122200222132200313011102302210332
-+
-#<6.&(,7-+))7..'/;43.)927.(<85&13-)
-@1831_574_1826_F3
-T13012312120112021233030302313201111
-+
-+@<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
-@1831_574_1903_F3
-T30232100103132133321330310210101221
-+
-<956?@>;7@@@8:@>8><=9>9>@2=71?1:6;/
-@1831_574_1961_F3
-T02333101331223303300200011100032200
-+
-6>-07-@>(2'@<#064@%5%@@6.&<<(9)=:47
-@1831_575_54_F3
-T13331330322230200102132110132013200
-+
->=@@68<2;<8;?@<>+9>7,,6972&57:4&9<8
-@1831_575_80_F3
-T33133322233322221003332230323312313
-+
-*?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
-@1831_575_192_F3
-T30013012111133003301010212123302011
-+
-0:8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
-@1831_575_197_F3
-T33312113010133020301131330001310032
-+
-,-:?463@A:88?6?437<=.2&1.;@67.4@%2,
-@1831_575_223_F3
-T10121010002202131221210302100121020
-+
-@?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
-@1831_575_420_F3
-T31110103220000101310112112001020212
-+
-82?.>?(-''2+..@),$%1@;')1)?+)7.')..
-@1831_575_434_F3
-T30312132120223101113223301211113311
-+
-<@@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
-@1831_575_444_F3
-T33022120112320220100202132332113320
-+
-<2@@;<.=?@<+=:A<<@?<</>@><(<8>4&5;>
-@1831_575_459_F3
-T31330310210101223330110231120131100
-+
-?@@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
-@1831_575_506_F3
-T31210200111210121332321310110132301
-+
-8?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
-@1831_575_569_F3
-T10210201321323001012232322323002203
-+
-/'9-,@29+479%&>9#&08=>7#9>,69/+'*3)
-@1831_575_622_F3
-T01100031122111023002323113231210111
-+
-@A8B=@@?<@?<>>=?96<497)<4/<':4+;74+
-@1831_575_644_F3
-T11332003221203131231202200030110130
-+
-<<8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
-@1831_575_663_F3
-T32210013303112103322311101322021210
-+
-@@@@@A</;A>@6>0792<5966:?;25+:><1,+
-@1831_575_681_F3
-T23131132033020103031013233200101021
-+
-.72?.)25;96-14'*.03'#4#++$)/8+%/((&
-@1831_575_711_F3
-T03032331231101231020121210002332121
-+
-4%+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
-@1831_575_730_F3
-T31010102200110302123032330331011111
-+
-,%8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
-@1831_575_904_F3
-T20111213300020123200333321131121211
-+
-?<><.689@@7@<54:4=@>69=:+6-=42;8<:#
-@1831_575_938_F3
-T13103102220022130222233301013033120
-+
-;:@@:?@;=8;>=;;:=<93<4.;<6:2<9;4)87
-@1831_575_970_F3
-T23201311301023133303023011202220221
-+
-=@=@=;@@><@@:9<:=?;>@=?9>>?@:2===<5
-@1831_575_991_F3
-T33312212031111111012212120321121210
-+
-@>>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
-@1831_575_1138_F3
-T23320002011320012120333103233301321
-+
-<=0;%1936+?96?,?5<:2>@6@<:;4>.7;*:1
-@1831_575_1157_F3
-T13121323330203331222022230133102321
-+
-@B@B>?A?A@?9'?;?&8?@@6;<@=+<:99+965
-@1831_575_1180_F3
-T32003310122102323303101123331133110
-+
-/<B>5?':/78?;1;55:997@@>94=7<186->7
-@1831_575_1283_F3
-T02232200301300220130032321323131333
-+
-%C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
-@1831_575_1302_F3
-T01201303312333123130200123201013021
-+
-&12>/#2'&-2&%'7+$%*#$/1(&&12/$,2,,*
-@1831_575_1310_F3
-T31332131312021303211310220101211133
-+
-6<<>663?99@(@7=11@:@@/7??<@<;>'3-7;
-@1831_575_1321_F3
-T11001010233200122122022023000203212
-+
-0;B@?@>=A@<A?>@>?6>@5>'4@9?)7@7?/89
-@1831_575_1373_F3
-T21213011223311001221321132013121220
-+
-A@@@>@;=9<@??7@>@:@;@;17?630/7=4,2<
-@1831_575_1419_F3
-T33222200303001021230212332001013020
-+
->//3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
-@1831_575_1436_F3
-T13210313021212303321202113301220331
-+
-*2@=;39*3<*4<:>52>>9'7:<='0=>1'136<
-@1831_575_1442_F3
-T33132010022331132101132123132020222
-+
-8>58<?7>+1B6-/9<<:5?>A:1@?539.@4/1>
-@1831_575_1454_F3
-T11131130011012021120222231313211113
-+
-24=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
-@1831_575_1500_F3
-T11010000223111301132313011130103021
-+
-2?@@?A@?8<6<:985=99999==B3<5<<,7?>9
-@1831_575_1535_F3
-T21312012030320112110211013300131121
-+
-@B=@<@@B?:A@@=>@?68@=?@5?7;:6<<;>5<
-@1831_575_1724_F3
-T33123002323300220213232301000010010
-+
-9<B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
-@1831_575_1829_F3
-T21033321320111321230233302313101021
-+
-22(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
-@1831_575_1898_F3
-T31330110303103131001110300102101330
-+
-@B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
-@1831_575_1964_F3
-T22010201103202213200201301300232123
-+
-1>39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
-@1831_576_32_F3
-T13012100120333032211330300332022110
-+
-+<>?>?=7<2)522;><<@40@>704<>5=23@+&
-@1831_576_74_F3
-T30103313210232220102021223012112100
-+
-8=@@?@>(??<B5?@@@9<@><+><;@';>6961?
-@1831_576_86_F3
-T10320000121033022010011030032211310
-+
-7811)2:*.++5</:3+43924*))/:,6&29)2/
-@1831_576_89_F3
-T02132333203332020020220033002121120
-+
-2)69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
-@1831_576_266_F3
-T30322223101312011300311121221333223
-+
-<@@?=;<?7=@>9,>@1$&&89$/:>7'3178%&6
-@1831_576_327_F3
-T22112331301313021321001332120332130
-+
-<@?@6@@;<@?><@>==3@:==<3@@>53<9><6=
-@1831_576_331_F3
-T32012133301311223023011232112333030
-+
-;-2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
-@1831_576_387_F3
-T00101211032031120300200222001230022
-+
-/8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
-@1831_576_406_F3
-T00223133010210122221320212103132011
-+
-<4<>%%14:*4656)&<251&2+3#&19,6&4>5(
-@1831_576_449_F3
-T31312001121222231100020132132100220
-+
-(+'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
-@1831_576_519_F3
-T03011321130130133213131202130321131
-+
-==46<97@>2/6?;2<4A881>9121+<1/4.9+7
-@1831_576_603_F3
-T21003032313302312320131221001330311
-+
-@@46=@C.??<A79@@;-<@@>29B?>55<B7598
-@1831_576_655_F3
-T02001023130302322122200313123123102
-+
-=@AA9@@<6*>@@5/<@>9'=;>7+@?9>/9;+,%
-@1831_576_677_F3
-T13330131023320301031013230210103022
-+
-6290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
-@1831_576_718_F3
-T31232113331022231333313223132231213
-+
-$4###$0###%(#########,####%####$###
-@1831_576_722_F3
-T31230320322120231333030031100313200
-+
-(*,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
-@1831_576_754_F3
-T30221231132103120112331303112133020
-+
-.4//#(.$)'',>($<,##%((,#5?#0*%1*
-@1831_576_815_F3
-T23022113203032010120310102321001031
-+
-<3>@?9>@?B=>=;>A???=>:25=4.25?6<57.
-@1831_576_882_F3
-T13230020122320223230022031020110122
-+
-?26?8?@:4>@>96??<<=5'1<>9846=<9<1>8
-@1831_576_898_F3
-T10230132312121033222231132231233213
-+
-=@@C2?C>?<>@886B?;?.??87=B<8<15??=.
-@1831_576_923_F3
-T21322010320202013210121223010123122
-+
-76.51=;.699<96>;;49<;;11;<@59:9=647
-@1831_576_930_F3
-T21322103230123110323102012021020013
-+
-2#*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
-@1831_576_1019_F3
-T22032121213231032210312001103122312
-+
-2<$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
-@1831_576_1068_F3
-T00020232013101330112220321203220211
-+
-:>><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
-@1831_576_1131_F3
-T10233122200222132200313011102302210
-+
-104@#@/@,4>9?2+?1571@',>=;(759;*92<
-@1831_576_1168_F3
-T31013300131121323122002113301002010
-+
->@CC6@@2?9=>7?;76<;467@;9,0%26'',4$
-@1831_576_1207_F3
-T21001132013000122220301213221213010
-+
-%$>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
-@1831_576_1289_F3
-T03021210023110200323310302013121203
-+
-@9<>1B@@;7@@663==28,5':8<<,.=2>>.50
-@1831_576_1329_F3
-T01100302102020113003022000120002100
-+
-<>&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
-@1831_576_1367_F3
-T12231310311233110031222013332011023
-+
-??@@<>@@=@<@<=@>@??9:?<=>=<8;59@787
-@1831_576_1416_F3
-T33021233100123120313103133211203221
-+
-+';?..1.<@'.=+6.5?7<0-?7;(%=>56.98@
-@1831_576_1461_F3
-T32022221221112233100210223002100100
-+
-#1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
-@1831_576_1605_F3
-T30232100103132133321330310210101221
-+
-6<@C@@>1;@:;<<@@9@???9<3?5-21=4877,
-@1831_576_1664_F3
-T31212101001312110320301201002011120
-+
-@@?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
-@1831_576_1671_F3
-T22313332300211322113223102231322313
-+
-@@?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
-@1831_576_1729_F3
-T11233312313010012320101302101023030
-+
-@?@?<?<@>A?/==?>?7>?@8<?@>99;><+0=>
-@1831_576_1880_F3
-T13032121323320213301001310130212003
-+
-0515/792,:,7/%/05,%$):+#8%2(1754))3
-@1831_576_1982_F3
-T00032312310201201333221212000011030
-+
-,@@?@,A><@9@=?@9B=8<6@@6@2<A?>.7<+@
-@1831_576_1987_F3
-T30022313313231221213220132001011320
-+
-)##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
-@1831_576_2014_F3
-T31123201010100321122111102113021003
-+
-@@@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
-@1831_576_2028_F3
-T20131211210311112023201213120201100
-+
-5<>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
-@1831_577_40_F3
-T11111212330120012020200031313303003
-+
-92/4('.')(<*?#$)%&<,/39<(.2,+<=@611
-@1831_577_119_F3
-T33111010021103320103213121313000102
-+
-9>?C11)-1/)#;#/,850*+.+$$5550+%-.40
-@1831_577_133_F3
-T33213323012231300122223032223331322
-+
-/4@>>?=1?:+>@07@@><>@*<+1@15)96'2$)
-@1831_577_255_F3
-T00332022110020300332022020202002232
-+
-7<=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
-@1831_577_281_F3
-T03032301231212301013112222111210000
-+
-7-:B;8@=;>7@>4?=?+659?;5<7?;9@8(>:?
-@1831_577_288_F3
-T01031120221303100221230021013201130
-+
-5;/79??&=B::298*6.7/+4&21,7,6?.7#'6
-@1831_577_322_F3
-T12003213220230103303201000130312202
-+
-9=;>4506;255464-<#7+194&2<?65968)7/
-@1831_577_362_F3
-T31203302330110131230331210121110220
-+
-62B?:@?@<?958=,3:,90:&'-99,6<5.($+6
-@1831_577_382_F3
-T32312123033111120321303230201332100
-+
-12957/:1))=76(*24;,3+:<.&.&-=1=2/5*
-@1831_577_464_F3
-T13020221011130013102221333131203302
-+
-3=<7/<826)>#.'&4204+5#/041.7*91&756
-@1831_577_488_F3
-T13200302330322110200323132101120301
-+
-:48.,*>6566<?8=<=<2>6;94>;=9>@8924@
-@1831_577_511_F3
-T32232133031023313331312220133230333
-+
-#7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
-@1831_577_545_F3
-T00112131333222303222210031322103233
-+
->><<9?<>?A<481@<@8==@76/61<95.5988-
-@1831_577_559_F3
-T32321101303233120102011130022122002
-+
-.<@;??@>@?/2<.@1=>12=61/;=?.&2+92)'
-@1831_577_562_F3
-T32331101301233110121000220031120031
-+
-#((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
-@1831_577_637_F3
-T22113312122202103031023120301031110
-+
-8-,4#>:-6+:8,&(5;3=0>7=68&1/9&'?;4,
-@1831_577_641_F3
-T13031301101121223221212020032131113
-+
-&47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
-@1831_577_692_F3
-T01122320200330103121202301211100220
-+
-@B,@?@B(@A?@+@@>@+?=>@'=<@<=<9=?75<
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/fastq_combiner_no_qual_ascii_out_1.fastqcssanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fastq_combiner_no_qual_ascii_out_1.fastqcssanger Tue Mar 02 10:47:23 2010 -0500
@@ -0,0 +1,576 @@
+@1831_573_1004_F3
+T00030133312212111300011021310132222
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1050_F3
+T03330322230322112131010221102122113
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1067_F3
+T00023032023103330112220321200200002
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1219_F3
+T11211130300300301021212330201121310
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1242_F3
+T02132003121011302100130302112221121
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1333_F3
+T00200312330110101013212313222303112
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1362_F3
+T21203131001102231121211101111321131
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1448_F3
+T23101211223113320132212331313312022
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1490_F3
+T31312310323301210002210123101021011
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1523_F3
+T10322001220012223202202222001230222
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1578_F3
+T21202302100010020121100311022120111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1647_F3
+T10222233301013033120132223202022123
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1684_F3
+T13310013212312012302121010221231123
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1769_F3
+T33220123030232212032021032302233131
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1853_F3
+T11000012111222211310103212122102331
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1943_F3
+T20300123032210232001222122001132111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_573_1977_F3
+T22212302221310332321002303112011311
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_109_F3
+T13122332123301331032220222133301033
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_148_F3
+T01200113123030012202302312200010231
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_185_F3
+T21123333211302300321312212102123121
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_243_F3
+T30221011230013102201033131203302330
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_257_F3
+T00301133110002100302003000000102301
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_293_F3
+T23213210003000103010211331300320130
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_389_F3
+T21032213032101122333230212301312020
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_575_F3
+T33313322100212102033032123311211302
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_592_F3
+T33103330110123102223122023103310330
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_617_F3
+T20021031221222021210021322200223211
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_725_F3
+T32010020322130330333010031120313210
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_734_F3
+T31132301200020012302210322213222222
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_824_F3
+T30212100033032123311211302122020013
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_959_F3
+T11212130220131221111002020123311211
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1062_F3
+T30112230030300221001032033012211012
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1092_F3
+T02013221200031031212200000111130310
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1103_F3
+T20313113203302010303131123021310121
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1116_F3
+T21011310123202303021021112021231011
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1194_F3
+T23303101033322220312200222013013312
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1204_F3
+T21330132231321322010303023221203200
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1306_F3
+T10332133020311023221213100301001220
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1387_F3
+T12301331310032132101301303230121111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1431_F3
+T12011023331022213001123111301312011
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1560_F3
+T32212313302203320020222113111011111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1591_F3
+T23202101330322130221230222201123202
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1624_F3
+T20122200222132200313011102302210332
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1826_F3
+T13012312120112021233030302313201111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1903_F3
+T30232100103132133321330310210101221
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_574_1961_F3
+T02333101331223303300200011100032200
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_54_F3
+T13331330322230200102132110132013200
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_80_F3
+T33133322233322221003332230323312313
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_192_F3
+T30013012111133003301010212123302011
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_197_F3
+T33312113010133020301131330001310032
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_223_F3
+T10121010002202131221210302100121020
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_420_F3
+T31110103220000101310112112001020212
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_434_F3
+T30312132120223101113223301211113311
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_444_F3
+T33022120112320220100202132332113320
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_459_F3
+T31330310210101223330110231120131100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_506_F3
+T31210200111210121332321310110132301
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_569_F3
+T10210201321323001012232322323002203
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_622_F3
+T01100031122111023002323113231210111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_644_F3
+T11332003221203131231202200030110130
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_663_F3
+T32210013303112103322311101322021210
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_681_F3
+T23131132033020103031013233200101021
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_711_F3
+T03032331231101231020121210002332121
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_730_F3
+T31010102200110302123032330331011111
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_904_F3
+T20111213300020123200333321131121211
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_938_F3
+T13103102220022130222233301013033120
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_970_F3
+T23201311301023133303023011202220221
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_991_F3
+T33312212031111111012212120321121210
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1138_F3
+T23320002011320012120333103233301321
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1157_F3
+T13121323330203331222022230133102321
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1180_F3
+T32003310122102323303101123331133110
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1283_F3
+T02232200301300220130032321323131333
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1302_F3
+T01201303312333123130200123201013021
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1310_F3
+T31332131312021303211310220101211133
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1321_F3
+T11001010233200122122022023000203212
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1373_F3
+T21213011223311001221321132013121220
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1419_F3
+T33222200303001021230212332001013020
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1436_F3
+T13210313021212303321202113301220331
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1442_F3
+T33132010022331132101132123132020222
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1454_F3
+T11131130011012021120222231313211113
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1500_F3
+T11010000223111301132313011130103021
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1535_F3
+T21312012030320112110211013300131121
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1724_F3
+T33123002323300220213232301000010010
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1829_F3
+T21033321320111321230233302313101021
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1898_F3
+T31330110303103131001110300102101330
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_575_1964_F3
+T22010201103202213200201301300232123
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_32_F3
+T13012100120333032211330300332022110
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_74_F3
+T30103313210232220102021223012112100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_86_F3
+T10320000121033022010011030032211310
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_89_F3
+T02132333203332020020220033002121120
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_266_F3
+T30322223101312011300311121221333223
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_327_F3
+T22112331301313021321001332120332130
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_331_F3
+T32012133301311223023011232112333030
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_387_F3
+T00101211032031120300200222001230022
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_406_F3
+T00223133010210122221320212103132011
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_449_F3
+T31312001121222231100020132132100220
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_519_F3
+T03011321130130133213131202130321131
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_603_F3
+T21003032313302312320131221001330311
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_655_F3
+T02001023130302322122200313123123102
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_677_F3
+T13330131023320301031013230210103022
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_718_F3
+T31232113331022231333313223132231213
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_722_F3
+T31230320322120231333030031100313200
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_754_F3
+T30221231132103120112331303112133020
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_815_F3
+T23022113203032010120310102321001031
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_882_F3
+T13230020122320223230022031020110122
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_898_F3
+T10230132312121033222231132231233213
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_923_F3
+T21322010320202013210121223010123122
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_930_F3
+T21322103230123110323102012021020013
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1019_F3
+T22032121213231032210312001103122312
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1068_F3
+T00020232013101330112220321203220211
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1131_F3
+T10233122200222132200313011102302210
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1168_F3
+T31013300131121323122002113301002010
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1207_F3
+T21001132013000122220301213221213010
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1289_F3
+T03021210023110200323310302013121203
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1329_F3
+T01100302102020113003022000120002100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1367_F3
+T12231310311233110031222013332011023
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1416_F3
+T33021233100123120313103133211203221
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1461_F3
+T32022221221112233100210223002100100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1605_F3
+T30232100103132133321330310210101221
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1664_F3
+T31212101001312110320301201002011120
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1671_F3
+T22313332300211322113223102231322313
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1729_F3
+T11233312313010012320101302101023030
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1880_F3
+T13032121323320213301001310130212003
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1982_F3
+T00032312310201201333221212000011030
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_1987_F3
+T30022313313231221213220132001011320
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_2014_F3
+T31123201010100321122111102113021003
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_576_2028_F3
+T20131211210311112023201213120201100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_40_F3
+T11111212330120012020200031313303003
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_119_F3
+T33111010021103320103213121313000102
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_133_F3
+T33213323012231300122223032223331322
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_255_F3
+T00332022110020300332022020202002232
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_281_F3
+T03032301231212301013112222111210000
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_288_F3
+T01031120221303100221230021013201130
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_322_F3
+T12003213220230103303201000130312202
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_362_F3
+T31203302330110131230331210121110220
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_382_F3
+T32312123033111120321303230201332100
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_464_F3
+T13020221011130013102221333131203302
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_488_F3
+T13200302330322110200323132101120301
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_511_F3
+T32232133031023313331312220133230333
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_545_F3
+T00112131333222303222210031322103233
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_559_F3
+T32321101303233120102011130022122002
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_562_F3
+T32331101301233110121000220031120031
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_637_F3
+T22113312122202103031023120301031110
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_641_F3
+T13031301101121223221212020032131113
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+@1831_577_692_F3
+T01122320200330103121202301211100220
++
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff -r 19d8ba4269ba -r 8bd2ace6c92d test-data/fastq_combiner_no_qual_ascii_out_1.fastqsolid
--- a/test-data/fastq_combiner_no_qual_ascii_out_1.fastqsolid Tue Mar 02 09:51:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,576 +0,0 @@
-@1831_573_1004_F3
-T00030133312212111300011021310132222
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1050_F3
-T03330322230322112131010221102122113
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1067_F3
-T00023032023103330112220321200200002
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1219_F3
-T11211130300300301021212330201121310
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1242_F3
-T02132003121011302100130302112221121
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1333_F3
-T00200312330110101013212313222303112
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1362_F3
-T21203131001102231121211101111321131
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1448_F3
-T23101211223113320132212331313312022
-+
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-@1831_573_1490_F3
1
0
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/19d8ba4269ba
changeset: 3458:19d8ba4269ba
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Tue Mar 02 09:51:05 2010 -0500
description:
Fix bug that prevented tags with capital letters from being deleted.
diffstat:
lib/galaxy/model/__init__.py | 3 ---
lib/galaxy/tags/tag_handler.py | 10 +++++-----
2 files changed, 5 insertions(+), 8 deletions(-)
diffs (34 lines):
diff -r 144c01a8db6e -r 19d8ba4269ba lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py Tue Mar 02 00:38:57 2010 -0500
+++ b/lib/galaxy/model/__init__.py Tue Mar 02 09:51:05 2010 -0500
@@ -1537,9 +1537,6 @@
self.value = None
self.user_value = None
- def __str__ ( self ):
- return "%s(item_id=%s, item_tag=%s, user_tname=%s, value=%s, user_value=%s)" % (self.__class__.__name__, self.item_id, self.tag_id, self.user_tname, self.value. self.user_value )
-
class HistoryTagAssociation ( ItemTagAssociation ):
pass
diff -r 144c01a8db6e -r 19d8ba4269ba lib/galaxy/tags/tag_handler.py
--- a/lib/galaxy/tags/tag_handler.py Tue Mar 02 00:38:57 2010 -0500
+++ b/lib/galaxy/tags/tag_handler.py Tue Mar 02 09:51:05 2010 -0500
@@ -211,12 +211,12 @@
return tag
- def _get_item_tag_assoc(self, user, item, tag_name):
- """Return ItemTagAssociation object for an item and a tag string; returns None if there is
- no such tag."""
- scrubbed_tag_name = self._scrub_tag_name(tag_name)
+ def _get_item_tag_assoc( self, user, item, tag_name ):
+ """Return ItemTagAssociation object for a user, item, and tag string; returns None if there is
+ no such association."""
+ scrubbed_tag_name = self._scrub_tag_name( tag_name )
for item_tag_assoc in item.tags:
- if ( item_tag_assoc.user == user ) and ( item_tag_assoc.tag.name == scrubbed_tag_name ):
+ if ( item_tag_assoc.user == user ) and ( item_tag_assoc.user_tname == scrubbed_tag_name ):
return item_tag_assoc
return None
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/144c01a8db6e
changeset: 3457:144c01a8db6e
user: Nate Coraor <nate(a)bx.psu.edu>
date: Tue Mar 02 00:38:57 2010 -0500
description:
psycopg2 scramble fix
diffstat:
lib/galaxy/eggs/scramble.py | 2 +-
scripts/scramble/patches/psycopg2/setup.py | 252 ---------------------------
scripts/scramble/scripts/psycopg2-linux.py | 79 ++++++++
scripts/scramble/scripts/psycopg2-solaris.py | 81 ++++++++
scripts/scramble/scripts/psycopg2.py | 45 ++--
5 files changed, 184 insertions(+), 275 deletions(-)
diffs (515 lines):
diff -r 2f3b76827743 -r 144c01a8db6e lib/galaxy/eggs/scramble.py
--- a/lib/galaxy/eggs/scramble.py Thu Feb 11 00:17:04 2010 -0500
+++ b/lib/galaxy/eggs/scramble.py Tue Mar 02 00:38:57 2010 -0500
@@ -167,7 +167,7 @@
"%s-%s.py" % ( self.name, platform ),
"%s-%s.py" % ( self.name, '-'.join( platform.split( '-' )[:2] ) ),
"%s-%s.py" % ( self.name, '-'.join( platform.split( '-' )[1:] ) ),
- "%s-%s.py" % ( self.name, self.py ),
+ "%s-%s.py" % ( self.name, platform.split( '-' )[:2][-1] ),
"%s-%s.py" % ( self.name, platform.split( '-' )[0] ),
"%s.py" % self.name,
"generic.py" )
diff -r 2f3b76827743 -r 144c01a8db6e scripts/scramble/patches/psycopg2/setup.py
--- a/scripts/scramble/patches/psycopg2/setup.py Thu Feb 11 00:17:04 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,252 +0,0 @@
-# setup.py - distutils packaging
-#
-# Copyright (C) 2003-2004 Federico Di Gregorio <fog(a)debian.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any later
-# version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY
-# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-
-"""Python-PostgreSQL Database Adapter
-
-psycopg is a PostgreSQL database adapter for the Python programming
-language. This is version 2, a complete rewrite of the original code to
-provide new-style classes for connection and cursor objects and other sweet
-candies. Like the original, psycopg 2 was written with the aim of being
-very small and fast, and stable as a rock.
-
-psycopg is different from the other database adapter because it was
-designed for heavily multi-threaded applications that create and destroy
-lots of cursors and make a conspicuous number of concurrent INSERTs or
-UPDATEs. psycopg 2 also provide full asycronous operations for the really
-brave programmer.
-"""
-
-classifiers = """\
-Development Status :: 4 - Beta
-Intended Audience :: Developers
-License :: OSI Approved :: GNU General Public License (GPL)
-License :: OSI Approved :: Zope Public License
-Programming Language :: Python
-Programming Language :: C
-Programming Language :: SQL
-Topic :: Database
-Topic :: Database :: Front-Ends
-Topic :: Software Development
-Topic :: Software Development :: Libraries :: Python Modules
-Operating System :: Microsoft :: Windows
-Operating System :: Unix
-"""
-
-import os
-import os.path
-import sys
-import popen2
-import ConfigParser
-from glob import glob
-from distutils.core import setup, Extension
-from distutils.errors import DistutilsFileError
-from distutils.command.build_ext import build_ext
-from distutils.sysconfig import get_python_inc
-from distutils.ccompiler import get_default_compiler
-
-assert sys.version_info[:2] >= ( 2, 4 )
-
-PSYCOPG_VERSION = '2.0.6'
-version_flags = []
-
-PG_VERSION = '8.2.6'
-
-class psycopg_build_ext(build_ext):
- """Conditionally complement the setup.cfg options file.
-
- This class configures the include_dirs, libray_dirs, libraries
- options as required by the system. Most of the configuration happens
- in finalize_options() method.
-
- If you want to set up the build step for a peculiar platform, add a
- method finalize_PLAT(), where PLAT matches your sys.platform.
- """
- user_options = build_ext.user_options[:]
- user_options.extend([
- ('use-pydatetime', None,
- "Use Python datatime objects for date and time representation."),
- ('use-decimal', None,
- "Use Decimal type even on Python 2.3 if the module is provided."),
- ])
-
- boolean_options = build_ext.boolean_options[:]
- boolean_options.extend(('use-pydatetime', 'use-decimal', 'have-ssl'))
-
- def initialize_options(self):
- build_ext.initialize_options(self)
- self.use_pg_dll = 1
- self.pgdir = None
- self.mx_include_dir = None
-
- def get_compiler(self):
- """Return the name of the C compiler used to compile extensions.
-
- If a compiler was not explicitely set (on the command line, for
- example), fall back on the default compiler.
- """
- if self.compiler:
- # distutils doesn't keep the type of self.compiler uniform; we
- # compensate:
- if isinstance(self.compiler, str):
- name = self.compiler
- else:
- name = self.compiler.compiler_type
- else:
- name = get_default_compiler()
- return name
-
- def finalize_darwin(self):
- """Finalize build system configuration on darwin platform."""
- self.libraries.append('ssl')
- self.libraries.append('crypto')
-
- def finalize_options(self):
- """Complete the build system configuation."""
- build_ext.finalize_options(self)
-
- self.include_dirs.append(".")
- self.include_dirs.append("postgresql-8.2.6/src/interfaces/libpq")
- self.include_dirs.append("postgresql-8.2.6/src/include")
- self.include_dirs.append("postgresql-8.2.6/src/port")
- pgmajor, pgminor, pgpatch = PG_VERSION.split('.')
- define_macros.append(("PG_MAJOR_VERSION", pgmajor))
- define_macros.append(("PG_MINOR_VERSION", pgminor))
- define_macros.append(("PG_PATCH_VERSION", pgpatch))
-
- if hasattr(self, "finalize_" + sys.platform):
- getattr(self, "finalize_" + sys.platform)()
-
-# let's start with macro definitions (the ones not already in setup.cfg)
-define_macros = []
-include_dirs = []
-
-# python version
-define_macros.append(('PY_MAJOR_VERSION', str(sys.version_info[0])))
-define_macros.append(('PY_MINOR_VERSION', str(sys.version_info[1])))
-
-# some macros related to python versions and features
-if sys.version_info[0] >= 2 and sys.version_info[1] >= 3:
- define_macros.append(('HAVE_PYBOOL','1'))
-
-# gather information to build the extension module
-ext = [] ; data_files = []
-
-# sources
-
-sources = [
- 'psycopgmodule.c', 'pqpath.c', 'typecast.c',
- 'microprotocols.c', 'microprotocols_proto.c',
- 'connection_type.c', 'connection_int.c', 'cursor_type.c', 'cursor_int.c',
- 'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c',
- 'adapter_asis.c', 'adapter_list.c']
-
-parser = ConfigParser.ConfigParser()
-parser.read('setup.cfg')
-
-# Choose if to use Decimal type
-use_decimal = int(parser.get('build_ext', 'use_decimal'))
-if sys.version_info[0] >= 2 and (
- sys.version_info[1] >= 4 or (sys.version_info[1] == 3 and use_decimal)):
- define_macros.append(('HAVE_DECIMAL','1'))
- version_flags.append('dec')
-
-# Choose a datetime module
-have_pydatetime = False
-have_mxdatetime = False
-use_pydatetime = int(parser.get('build_ext', 'use_pydatetime'))
-
-# check for mx package
-if parser.has_option('build_ext', 'mx_include_dir'):
- mxincludedir = parser.get('build_ext', 'mx_include_dir')
-else:
- mxincludedir = os.path.join(get_python_inc(plat_specific=1), "mx")
-if os.path.exists(mxincludedir):
- include_dirs.append(mxincludedir)
- define_macros.append(('HAVE_MXDATETIME','1'))
- sources.append('adapter_mxdatetime.c')
- have_mxdatetime = True
- version_flags.append('mx')
-
-# check for python datetime package
-if os.path.exists(os.path.join(get_python_inc(plat_specific=1),"datetime.h")):
- define_macros.append(('HAVE_PYDATETIME','1'))
- sources.append('adapter_datetime.c')
- have_pydatetime = True
- version_flags.append('dt')
-
-# now decide which package will be the default for date/time typecasts
-if have_pydatetime and use_pydatetime \
- or have_pydatetime and not have_mxdatetime:
- define_macros.append(('PSYCOPG_DEFAULT_PYDATETIME','1'))
-elif have_mxdatetime:
- define_macros.append(('PSYCOPG_DEFAULT_MXDATETIME','1'))
-else:
- def e(msg):
- sys.stderr.write("error: " + msg + "\n")
- e("psycopg requires a datetime module:")
- e(" mx.DateTime module not found")
- e(" python datetime module not found")
- e("Note that psycopg needs the module headers and not just the module")
- e("itself. If you installed Python or mx.DateTime from a binary package")
- e("you probably need to install its companion -dev or -devel package.")
- sys.exit(1)
-
-# generate a nice version string to avoid confusion when users report bugs
-for have in parser.get('build_ext', 'define').split(','):
- if have == 'PSYCOPG_EXTENSIONS':
- version_flags.append('ext')
- elif have == 'HAVE_PQPROTOCOL3':
- version_flags.append('pq3')
-if version_flags:
- PSYCOPG_VERSION_EX = PSYCOPG_VERSION + " (%s)" % ' '.join(version_flags)
-else:
- PSYCOPG_VERSION_EX = PSYCOPG_VERSION
-
-define_macros.append(('PSYCOPG_VERSION', '"'+PSYCOPG_VERSION_EX+'"'))
-
-if parser.has_option('build_ext', 'have_ssl'):
- have_ssl = int(parser.get('build_ext', 'have_ssl'))
-else:
- have_ssl = 0
-
-# build the extension
-
-sources = map(lambda x: os.path.join('psycopg', x), sources)
-sources.append( 'postgresql-%s/src/port/pgstrcasecmp.c' % PG_VERSION )
-sources.append( 'postgresql-%s/src/backend/libpq/md5.c' % PG_VERSION )
-sources.extend( glob('postgresql-%s/src/interfaces/libpq/*.c' % PG_VERSION) )
-
-ext.append(Extension("psycopg2._psycopg", sources,
- define_macros=define_macros,
- include_dirs=include_dirs,
- undef_macros=[]))
-setup(name="psycopg2",
- version=PSYCOPG_VERSION,
- maintainer="Federico Di Gregorio",
- maintainer_email="fog(a)initd.org",
- author="Federico Di Gregorio",
- author_email="fog(a)initd.org",
- url="http://initd.org/tracker/psycopg",
- download_url = "http://initd.org/pub/software/psycopg2",
- license="GPL with exceptions or ZPL",
- platforms = ["any"],
- description=__doc__.split("\n")[0],
- long_description="\n".join(__doc__.split("\n")[2:]),
- classifiers=filter(None, classifiers.split("\n")),
- data_files=data_files,
- package_dir={'psycopg2':'lib'},
- packages=['psycopg2'],
- cmdclass={ 'build_ext': psycopg_build_ext },
- ext_modules=ext)
-
diff -r 2f3b76827743 -r 144c01a8db6e scripts/scramble/scripts/psycopg2-linux.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/scripts/psycopg2-linux.py Tue Mar 02 00:38:57 2010 -0500
@@ -0,0 +1,79 @@
+import os, sys, shutil
+from distutils.sysconfig import get_config_var
+
+def prep_postgres( prepped, args ):
+
+ pg_version = args['version']
+ pg_srcdir = os.path.join( os.getcwd(), "postgresql-%s" % pg_version )
+
+ # set up environment
+ os.environ['CC'] = get_config_var('CC')
+ os.environ['CFLAGS'] = get_config_var('CFLAGS')
+ os.environ['LDFLAGS'] = get_config_var('LDFLAGS')
+
+ if '-fPIC' not in os.environ['CFLAGS']:
+ os.environ['CFLAGS'] += ' -fPIC'
+
+ # run configure
+ run( "./configure --prefix=%s/postgres --disable-dependency-tracking --enable-static --disable-shared --without-readline --with-thread-safety" % os.getcwd(),
+ os.path.join( os.getcwd(), "postgresql-%s" % pg_version ),
+ "Configuring postgres (./configure)" )
+
+ # compile
+ run( "make", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; make)" )
+ run( "make", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; make)" )
+
+ # install
+ run( "make install", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; make install)" )
+ run( "make install", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; make install)" )
+ run( "make install", os.path.join( pg_srcdir, 'src', 'include' ), "Compiling pg_config (cd src/include; make install)" )
+
+ # create prepped archive
+ print "%s(): Creating prepped archive for future builds at:" % sys._getframe().f_code.co_name
+ print " ", prepped
+ compress( prepped,
+ 'postgres/bin',
+ 'postgres/include',
+ 'postgres/lib' )
+
+if __name__ == '__main__':
+
+ # change back to the build dir
+ if os.path.dirname( sys.argv[0] ) != "":
+ os.chdir( os.path.dirname( sys.argv[0] ) )
+
+ # find setuptools
+ sys.path.append( os.path.abspath( os.path.join( '..', '..', '..', 'lib' ) ) )
+ from scramble_lib import *
+
+ tag = get_tag()
+
+ pg_version = ( tag.split( "_" ) )[1]
+ pg_archive_base = os.path.join( archives, "postgresql-%s" % pg_version )
+ pg_archive = get_archive( pg_archive_base )
+ pg_archive_prepped = os.path.join( archives, "postgresql-%s-%s.tar.gz" % ( pg_version, platform_noucs ) )
+
+ # clean up any existing stuff (could happen if you run scramble.py by hand)
+ clean( [ 'postgresql-%s' % pg_version ] )
+
+ # unpack postgres
+ unpack_dep( pg_archive, pg_archive_prepped, prep_postgres, dict( version=pg_version ) )
+
+ # localize setup.cfg
+ if not os.path.exists( 'setup.cfg.orig' ):
+ shutil.copy( 'setup.cfg', 'setup.cfg.orig' )
+ f = open( 'setup.cfg', 'a' )
+ f.write( '\npg_config=postgres/bin/pg_config\n' )
+ f.write( '\nlibraries=crypt\n' )
+ f.close()
+
+ # tag
+ me = sys.argv[0]
+ sys.argv = [ me ]
+ if tag is not None:
+ sys.argv.append( "egg_info" )
+ sys.argv.append( "--tag-build=%s" %tag )
+ sys.argv.append( "bdist_egg" )
+
+ # go
+ execfile( "setup.py", globals(), locals() )
diff -r 2f3b76827743 -r 144c01a8db6e scripts/scramble/scripts/psycopg2-solaris.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/scripts/psycopg2-solaris.py Tue Mar 02 00:38:57 2010 -0500
@@ -0,0 +1,81 @@
+import os, sys, shutil
+from distutils.sysconfig import get_config_var
+
+def prep_postgres( prepped, args ):
+
+ pg_version = args['version']
+ pg_srcdir = os.path.join( os.getcwd(), "postgresql-%s" % pg_version )
+
+ # set up environment
+ os.environ['CC'] = get_config_var('CC')
+ os.environ['CFLAGS'] = get_config_var('CFLAGS')
+ os.environ['LDFLAGS'] = get_config_var('LDFLAGS')
+
+ cc = get_solaris_compiler()
+ if cc == 'cc':
+ os.environ['CFLAGS'] += ' -KPIC'
+ elif cc == 'gcc':
+ os.environ['CFLAGS'] += ' -fPIC -DPIC'
+
+ # run configure
+ run( "./configure --prefix=%s/postgres --disable-dependency-tracking --enable-static --disable-shared --without-readline --with-thread-safety" % os.getcwd(),
+ os.path.join( os.getcwd(), "postgresql-%s" % pg_version ),
+ "Configuring postgres (./configure)" )
+
+ # compile
+ run( "gmake", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; gmake)" )
+ run( "gmake", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; gmake)" )
+
+ # install
+ run( "gmake install", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; gmake install)" )
+ run( "gmake install", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; gmake install)" )
+ run( "gmake install", os.path.join( pg_srcdir, 'src', 'include' ), "Compiling pg_config (cd src/include; gmake install)" )
+
+ # create prepped archive
+ print "%s(): Creating prepped archive for future builds at:" % sys._getframe().f_code.co_name
+ print " ", prepped
+ compress( prepped,
+ 'postgres/bin',
+ 'postgres/include',
+ 'postgres/lib' )
+
+if __name__ == '__main__':
+
+ # change back to the build dir
+ if os.path.dirname( sys.argv[0] ) != "":
+ os.chdir( os.path.dirname( sys.argv[0] ) )
+
+ # find setuptools
+ sys.path.append( os.path.abspath( os.path.join( '..', '..', '..', 'lib' ) ) )
+ from scramble_lib import *
+
+ tag = get_tag()
+
+ pg_version = ( tag.split( "_" ) )[1]
+ pg_archive_base = os.path.join( archives, "postgresql-%s" % pg_version )
+ pg_archive = get_archive( pg_archive_base )
+ pg_archive_prepped = os.path.join( archives, "postgresql-%s-%s.tar.gz" % ( pg_version, platform_noucs ) )
+
+ # clean up any existing stuff (could happen if you run scramble.py by hand)
+ clean( [ 'postgresql-%s' % pg_version ] )
+
+ # unpack postgres
+ unpack_dep( pg_archive, pg_archive_prepped, prep_postgres, dict( version=pg_version ) )
+
+ # localize setup.cfg
+ if not os.path.exists( 'setup.cfg.orig' ):
+ shutil.copy( 'setup.cfg', 'setup.cfg.orig' )
+ f = open( 'setup.cfg', 'a' )
+ f.write( '\npg_config=postgres/bin/pg_config\n' )
+ f.close()
+
+ # tag
+ me = sys.argv[0]
+ sys.argv = [ me ]
+ if tag is not None:
+ sys.argv.append( "egg_info" )
+ sys.argv.append( "--tag-build=%s" %tag )
+ sys.argv.append( "bdist_egg" )
+
+ # go
+ execfile( "setup.py", globals(), locals() )
diff -r 2f3b76827743 -r 144c01a8db6e scripts/scramble/scripts/psycopg2.py
--- a/scripts/scramble/scripts/psycopg2.py Thu Feb 11 00:17:04 2010 -0500
+++ b/scripts/scramble/scripts/psycopg2.py Tue Mar 02 00:38:57 2010 -0500
@@ -1,43 +1,40 @@
-import os, sys, subprocess, tarfile, shutil, glob
+import os, sys, shutil
from distutils.sysconfig import get_config_var
def prep_postgres( prepped, args ):
pg_version = args['version']
- if pkg_resources.get_platform().startswith('solaris'):
- make = 'gmake'
- else:
- make = 'make'
+ pg_srcdir = os.path.join( os.getcwd(), "postgresql-%s" % pg_version )
# set up environment
os.environ['CC'] = get_config_var('CC')
os.environ['CFLAGS'] = get_config_var('CFLAGS')
os.environ['LDFLAGS'] = get_config_var('LDFLAGS')
- # run configure (to generate pg_config.h)
- run( "./configure --without-readline",
+ if '-fPIC' not in os.environ['CFLAGS']:
+ os.environ['CFLAGS'] += ' -fPIC'
+
+ # run configure
+ run( "./configure --prefix=%s/postgres --disable-dependency-tracking --enable-static --disable-shared --without-readline --with-thread-safety" % os.getcwd(),
os.path.join( os.getcwd(), "postgresql-%s" % pg_version ),
"Configuring postgres (./configure)" )
- # create src/port/pg_config_paths.h
- run( "%s pg_config_paths.h" % make,
- os.path.join( os.getcwd(), "postgresql-%s" % pg_version, "src", "port" ),
- "Creating postgresql-%s/src/port/pg_config_paths.h" % pg_version )
+ # compile
+ run( "make", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; make)" )
+ run( "make", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; make)" )
- # remove win32 crap in libpq dir
- for file in glob.glob( "postgresql-%s/src/interfaces/libpq/*win32*" % pg_version ):
- print "prep_postgres(): Removing %s" % file
- os.unlink( file )
+ # install
+ run( "make install", os.path.join( pg_srcdir, 'src', 'interfaces', 'libpq' ), "Compiling libpq (cd src/interfaces/libpq; make install)" )
+ run( "make install", os.path.join( pg_srcdir, 'src', 'bin', 'pg_config' ), "Compiling pg_config (cd src/bin/pg_config; make install)" )
+ run( "make install", os.path.join( pg_srcdir, 'src', 'include' ), "Compiling pg_config (cd src/include; make install)" )
# create prepped archive
print "%s(): Creating prepped archive for future builds at:" % sys._getframe().f_code.co_name
print " ", prepped
compress( prepped,
- "postgresql-%s/src/include" % pg_version,
- "postgresql-%s/src/port/pg_config_paths.h" % pg_version,
- "postgresql-%s/src/port/pgstrcasecmp.c" % pg_version,
- "postgresql-%s/src/backend/libpq/md5.c" % pg_version,
- "postgresql-%s/src/interfaces/libpq" % pg_version )
+ 'postgres/bin',
+ 'postgres/include',
+ 'postgres/lib' )
if __name__ == '__main__':
@@ -62,8 +59,12 @@
# unpack postgres
unpack_dep( pg_archive, pg_archive_prepped, prep_postgres, dict( version=pg_version ) )
- # get setup.py
- shutil.copy( os.path.join( patches, 'psycopg2', 'setup.py' ), 'setup.py' )
+ # localize setup.cfg
+ if not os.path.exists( 'setup.cfg.orig' ):
+ shutil.copy( 'setup.cfg', 'setup.cfg.orig' )
+ f = open( 'setup.cfg', 'a' )
+ f.write( '\npg_config=postgres/bin/pg_config\n' )
+ f.close()
# tag
me = sys.argv[0]
1
0
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/2f3b76827743
changeset: 3456:2f3b76827743
user: James Taylor <james(a)jamestaylor.org>
date: Thu Feb 11 00:17:04 2010 -0500
description:
[mq] workflow-invocation: Track workflow invocations in database, provide a view of the history grouped by workflow and job
diffstat:
lib/galaxy/model/__init__.py | 6 +
lib/galaxy/model/mapping.py | 68 +++++++---
lib/galaxy/model/migrate/versions/0041_workflow_invocation.py | 52 ++++++++
lib/galaxy/tools/__init__.py | 2 +-
lib/galaxy/tools/actions/__init__.py | 6 +-
lib/galaxy/tools/actions/metadata.py | 2 +-
lib/galaxy/tools/actions/upload.py | 2 +-
lib/galaxy/tools/actions/upload_common.py | 7 +-
lib/galaxy/web/controllers/history.py | 67 ++++++++++
lib/galaxy/web/controllers/workflow.py | 19 ++-
lib/galaxy/workflow/modules.py | 2 +-
scripts/manage_db.py | 1 +
templates/root/index.mako | 3 +
13 files changed, 204 insertions(+), 33 deletions(-)
diffs (426 lines):
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/model/__init__.py Thu Feb 11 00:17:04 2010 -0500
@@ -1217,6 +1217,12 @@
self.user = None
self.order_index = None
+class WorkflowInvocation( object ):
+ pass
+
+class WorkflowInvocationStep( object ):
+ pass
+
class MetadataFile( object ):
def __init__( self, dataset = None, name = None ):
if isinstance( dataset, HistoryDatasetAssociation ):
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/model/mapping.py
--- a/lib/galaxy/model/mapping.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/model/mapping.py Thu Feb 11 00:17:04 2010 -0500
@@ -558,6 +558,22 @@
Column( "input_name", TEXT)
)
+WorkflowInvocation.table = Table( "workflow_invocation", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, default=now, onupdate=now ),
+ Column( "workflow_id", Integer, ForeignKey( "workflow.id" ), index=True, nullable=False )
+ )
+
+WorkflowInvocationStep.table = Table( "workflow_invocation_step", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, default=now, onupdate=now ),
+ Column( "workflow_invocation_id", Integer, ForeignKey( "workflow_invocation.id" ), index=True, nullable=False ),
+ Column( "workflow_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True, nullable=False ),
+ Column( "job_id", Integer, ForeignKey( "job.id" ), index=True, nullable=False )
+ )
+
StoredWorkflowUserShareAssociation.table = Table( "stored_workflow_user_share_connection", metadata,
Column( "id", Integer, primary_key=True ),
Column( "stored_workflow_id", Integer, ForeignKey( "stored_workflow.id" ), index=True ),
@@ -1215,27 +1231,6 @@
HistoryDatasetAssociation.mapper.add_property( "creating_job_associations", relation( JobToOutputDatasetAssociation ) )
-assign_mapper( context, Workflow, Workflow.table,
- properties=dict( steps=relation( WorkflowStep, backref='workflow',
- order_by=asc(WorkflowStep.table.c.order_index),
- cascade="all, delete-orphan",
- lazy=False ),
- tags=relation(WorkflowTagAssociation, order_by=WorkflowTagAssociation.table.c.id, backref="workflows")
- ) )
-
-
-assign_mapper( context, WorkflowStep, WorkflowStep.table,
- properties=dict(
- tags=relation(WorkflowStepTagAssociation, order_by=WorkflowStepTagAssociation.table.c.id, backref="workflow_steps"),
- annotations=relation( WorkflowStepAnnotationAssociation, order_by=WorkflowStepAnnotationAssociation.table.c.id, backref="workflow_steps" ) )
- )
-
-assign_mapper( context, WorkflowStepConnection, WorkflowStepConnection.table,
- properties=dict( input_step=relation( WorkflowStep, backref="input_connections", cascade="all",
- primaryjoin=( WorkflowStepConnection.table.c.input_step_id == WorkflowStep.table.c.id ) ),
- output_step=relation( WorkflowStep, backref="output_connections", cascade="all",
- primaryjoin=( WorkflowStepConnection.table.c.output_step_id == WorkflowStep.table.c.id ) ) ) )
-
# vvvvvvvvvvvvvvvv Start cloud table mappings vvvvvvvvvvvvvvvv
assign_mapper( context, CloudImage, CloudImage.table )
@@ -1272,6 +1267,27 @@
) )
# ^^^^^^^^^^^^^^^ End cloud table mappings ^^^^^^^^^^^^^^^^^^
+assign_mapper( context, Workflow, Workflow.table,
+ properties=dict( steps=relation( WorkflowStep, backref='workflow',
+ order_by=asc(WorkflowStep.table.c.order_index),
+ cascade="all, delete-orphan",
+ lazy=False ),
+ tags=relation(WorkflowTagAssociation, order_by=WorkflowTagAssociation.table.c.id, backref="workflows")
+ ) )
+
+assign_mapper( context, WorkflowStep, WorkflowStep.table,
+ properties=dict(
+ tags=relation(WorkflowStepTagAssociation, order_by=WorkflowStepTagAssociation.table.c.id, backref="workflow_steps"),
+ annotations=relation( WorkflowStepAnnotationAssociation, order_by=WorkflowStepAnnotationAssociation.table.c.id, backref="workflow_steps" ) )
+ )
+
+assign_mapper( context, WorkflowStepConnection, WorkflowStepConnection.table,
+ properties=dict( input_step=relation( WorkflowStep, backref="input_connections", cascade="all",
+ primaryjoin=( WorkflowStepConnection.table.c.input_step_id == WorkflowStep.table.c.id ) ),
+ output_step=relation( WorkflowStep, backref="output_connections", cascade="all",
+ primaryjoin=( WorkflowStepConnection.table.c.output_step_id == WorkflowStep.table.c.id ) ) ) )
+
+
assign_mapper( context, StoredWorkflow, StoredWorkflow.table,
properties=dict( user=relation( User ),
workflows=relation( Workflow, backref='stored_workflow',
@@ -1297,6 +1313,16 @@
assign_mapper( context, StoredWorkflowMenuEntry, StoredWorkflowMenuEntry.table,
properties=dict( stored_workflow=relation( StoredWorkflow ) ) )
+assign_mapper( context, WorkflowInvocation, WorkflowInvocation.table,
+ properties=dict(
+ steps=relation( WorkflowInvocationStep, backref='workflow_invocation', lazy=False ),
+ workflow=relation( Workflow ) ) )
+
+assign_mapper( context, WorkflowInvocationStep, WorkflowInvocationStep.table,
+ properties=dict(
+ workflow_step = relation( WorkflowStep ),
+ job = relation( Job, backref=backref( 'workflow_invocation_step', uselist=False ) ) ) )
+
assign_mapper( context, MetadataFile, MetadataFile.table,
properties=dict( history_dataset=relation( HistoryDatasetAssociation ), library_dataset=relation( LibraryDatasetDatasetAssociation ) ) )
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/model/migrate/versions/0041_workflow_invocation.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/model/migrate/versions/0041_workflow_invocation.py Thu Feb 11 00:17:04 2010 -0500
@@ -0,0 +1,52 @@
+"""
+Migration script to create tables for tracking workflow invocations.
+"""
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+
+import logging
+logging.basicConfig( level=logging.DEBUG )
+log = logging.getLogger( __name__ )
+
+import datetime
+now = datetime.datetime.utcnow
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+
+WorkflowInvocation_table = Table( "workflow_invocation", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, default=now, onupdate=now ),
+ Column( "workflow_id", Integer, ForeignKey( "workflow.id" ), index=True, nullable=False )
+ )
+
+WorkflowInvocationStep_table = Table( "workflow_invocation_step", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, default=now, onupdate=now ),
+ Column( "workflow_invocation_id", Integer, ForeignKey( "workflow_invocation.id" ), index=True, nullable=False ),
+ Column( "workflow_step_id", Integer, ForeignKey( "workflow_step.id" ), index=True, nullable=False ),
+ Column( "job_id", Integer, ForeignKey( "job.id" ), index=True, nullable=False )
+ )
+
+tables = [ WorkflowInvocation_table, WorkflowInvocationStep_table ]
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+
+ for table in tables:
+ try:
+ table.create()
+ except:
+ log.warn( "Failed to create table '%s', ignoring (might result in wrong schema)" % table.name )
+
+def downgrade():
+ metadata.reflect()
+
+ for table in tables:
+ table.drop()
\ No newline at end of file
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/tools/__init__.py Thu Feb 11 00:17:04 2010 -0500
@@ -789,7 +789,7 @@
return "tool_form.mako", dict( errors=errors, tool_state=state, incoming=incoming, error_message=error_message )
# If we've completed the last page we can execute the tool
elif state.page == self.last_page:
- out_data = self.execute( trans, incoming=params )
+ _, out_data = self.execute( trans, incoming=params )
try:
assert isinstance( out_data, odict )
return 'tool_executed.mako', dict( out_data=out_data )
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/tools/actions/__init__.py Thu Feb 11 00:17:04 2010 -0500
@@ -17,7 +17,7 @@
The actions to be taken when a tool is run (after parameters have
been converted and validated).
"""
- def execute( self, tool, trans, incoming={} ):
+ def execute( self, tool, trans, incoming={}, set_output_hid=True ):
raise TypeError("Abstract method")
class DefaultToolAction( object ):
@@ -101,7 +101,7 @@
tool.visit_inputs( param_values, visitor )
return input_datasets
- def execute(self, tool, trans, incoming={}, set_output_hid=True ):
+ def execute(self, tool, trans, incoming={}, return_job=False, set_output_hid=True ):
def make_dict_copy( from_dict ):
"""
Makes a copy of input dictionary from_dict such that all values that are dictionaries
@@ -332,4 +332,4 @@
# Queue the job for execution
trans.app.job_queue.put( job.id, tool )
trans.log_event( "Added job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
- return out_data
+ return job, out_data
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/tools/actions/metadata.py
--- a/lib/galaxy/tools/actions/metadata.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/tools/actions/metadata.py Thu Feb 11 00:17:04 2010 -0500
@@ -60,4 +60,4 @@
# Queue the job for execution
trans.app.job_queue.put( job.id, tool )
trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
- return odict()
+ return job, odict()
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/tools/actions/upload.py
--- a/lib/galaxy/tools/actions/upload.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/tools/actions/upload.py Thu Feb 11 00:17:04 2010 -0500
@@ -23,4 +23,4 @@
json_file_path = upload_common.create_paramfile( trans, uploaded_datasets )
data_list = [ ud.data for ud in uploaded_datasets ]
- return upload_common.create_job( trans, incoming, tool, json_file_path, data_list )
+ return upload_common.create_job( trans, incoming, tool, json_file_path, data_list, return_job=True )
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/tools/actions/upload_common.py
--- a/lib/galaxy/tools/actions/upload_common.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/tools/actions/upload_common.py Thu Feb 11 00:17:04 2010 -0500
@@ -292,7 +292,7 @@
json_file.write( to_json_string( json ) + '\n' )
json_file.close()
return json_file_path
-def create_job( trans, params, tool, json_file_path, data_list, folder=None ):
+def create_job( trans, params, tool, json_file_path, data_list, folder=None, return_job=False ):
"""
Create the upload job.
"""
@@ -329,7 +329,10 @@
output = odict()
for i, v in enumerate( data_list ):
output[ 'output%i' % i ] = v
- return output
+ if return_job:
+ return job, output
+ else:
+ return output
def active_folders( trans, folder ):
# Stolen from galaxy.web.controllers.library_common (importing from which causes a circular issues).
# Much faster way of retrieving all active sub-folders within a given folder than the
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Thu Feb 11 00:17:04 2010 -0500
@@ -295,6 +295,7 @@
trans.set_history( new_history )
# No message
return None, None
+
@web.expose
@web.require_login( "work with shared histories" )
def list_shared( self, trans, **kwargs ):
@@ -329,6 +330,70 @@
status = 'done'
# Render the list view
return self.shared_list_grid( trans, status=status, message=message, **kwargs )
+
+ @web.expose
+ def display_structured( self, trans, id=None ):
+ """
+ Display a history as a nested structure showing the jobs and workflow
+ invocations that created each dataset (if any).
+ """
+ # Get history
+ if id is None:
+ history = trans.history
+ else:
+ id = trans.security.decode_id( id )
+ history = trans.sa_session.query( model.History ).get( id )
+ assert history
+ assert history.user and ( history.user == trans.user ) or ( history == trans.history )
+ # Resolve jobs and workflow invocations for the datasets in the history
+ # items is filled with items (hdas, jobs, or workflows) that go at the
+ # top level
+ items = []
+ # First go through and group hdas by job, if there is no job they get
+ # added directly to items
+ jobs = dict()
+ for hda in history.active_datasets:
+ # Follow "copied from ..." association until we get to the original
+ # instance of the dataset
+ original_hda = hda
+ while original_hda.copied_from_history_dataset_association:
+ original_hda = original_hda.copied_from_history_dataset_association
+ # Check if the job has a creating job, most should, datasets from
+ # before jobs were tracked, or from the upload tool before it
+ # created a job, may not
+ if not original_hda.creating_job_associations:
+ items.append( ( hda, None ) )
+ # Attach hda to correct job
+ # -- there should only be one creating_job_association, so this
+ # loop body should only be hit once
+ for assoc in original_hda.creating_job_associations:
+ job = assoc.job
+ if job in jobs:
+ jobs[ job ].append( ( hda, None ) )
+ else:
+ jobs[ job ] = [ ( hda, None ) ]
+ # Second, go through the jobs and connect to workflows
+ wf_invocations = dict()
+ for job, hdas in jobs.iteritems():
+ # Job is attached to a workflow step, follow it to the
+ # workflow_invocation and group
+ if job.workflow_invocation_step:
+ wf_invocation = job.workflow_invocation_step.workflow_invocation
+ if wf_invocation in wf_invocations:
+ wf_invocations[ wf_invocation ].append( ( job, hdas ) )
+ else:
+ wf_invocations[ wf_invocation ] = [ ( job, hdas ) ]
+ # Not attached to a workflow, add to items
+ else:
+ items.append( ( job, hdas ) )
+ # Finally, add workflow invocations to items, which should now
+ # contain all hdas with some level of grouping
+ items.extend( wf_invocations.items() )
+ # Sort items by age
+ items.sort( key=( lambda x: x[0].create_time ), reverse=True )
+ #
+ return trans.fill_template( "history/display_structured.mako", items=items )
+
@web.expose
def delete_current( self, trans ):
"""Delete just the active history -- this does not require a logged in user."""
@@ -343,6 +408,7 @@
# Regardless of whether it was previously deleted, we make a new history active
trans.new_history()
return trans.show_ok_message( "History deleted, a new history is active", refresh_frames=['history'] )
+
@web.expose
def rename_async( self, trans, id=None, new_name=None ):
history = self.get_history( trans, id )
@@ -493,6 +559,7 @@
Warning! If you import this history, you will lose your current
history. Click <a href="%s">here</a> to confirm.
""" % web.url_for( id=id, confirm=True ) )
+
@web.expose
def view( self, trans, id=None ):
"""View a history. If a history is importable, then it is viewable by any user."""
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/web/controllers/workflow.py Thu Feb 11 00:17:04 2010 -0500
@@ -865,8 +865,12 @@
errors[step.id] = state.inputs["__errors__"] = step_errors
if 'run_workflow' in kwargs and not errors:
# Run each step, connecting outputs to inputs
+ workflow_invocation = model.WorkflowInvocation()
+ workflow_invocation.workflow = workflow
outputs = odict()
for i, step in enumerate( workflow.steps ):
+ # Execute module
+ job = None
if step.type == 'tool' or step.type is None:
tool = trans.app.toolbox.tools_by_id[ step.tool_id ]
input_values = step.state.inputs
@@ -878,10 +882,19 @@
return outputs[ conn.output_step.id ][ conn.output_name ]
visit_input_values( tool.inputs, step.state.inputs, callback )
# Execute it
- outputs[ step.id ] = tool.execute( trans, step.state.inputs )
+ job, out_data = tool.execute( trans, step.state.inputs )
+ outputs[ step.id ] = out_data
else:
- outputs[ step.id ] = step.module.execute( trans, step.state )
-
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+ # Record invocation
+ workflow_invocation_step = model.WorkflowInvocationStep()
+ workflow_invocation_step.workflow_invocation = workflow_invocation
+ workflow_invocation_step.workflow_step = step
+ workflow_invocation_step.job = job
+ # All jobs ran sucessfully, so we can save now
+ trans.sa_session.add( workflow_invocation )
+ trans.sa_session.flush()
return trans.fill_template( "workflow/run_complete.mako",
workflow=stored,
outputs=outputs )
diff -r c48de7f12e58 -r 2f3b76827743 lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py Mon Mar 01 17:47:28 2010 -0500
+++ b/lib/galaxy/workflow/modules.py Thu Feb 11 00:17:04 2010 -0500
@@ -153,7 +153,7 @@
return errors
def execute( self, trans, state ):
- return dict( output=state.inputs['input'])
+ return None, dict( output=state.inputs['input'])
class ToolModule( WorkflowModule ):
diff -r c48de7f12e58 -r 2f3b76827743 scripts/manage_db.py
--- a/scripts/manage_db.py Mon Mar 01 17:47:28 2010 -0500
+++ b/scripts/manage_db.py Thu Feb 11 00:17:04 2010 -0500
@@ -12,6 +12,7 @@
from migrate.versioning.shell import main
from ConfigParser import SafeConfigParser
+
log = logging.getLogger( __name__ )
cp = SafeConfigParser()
diff -r c48de7f12e58 -r 2f3b76827743 templates/root/index.mako
--- a/templates/root/index.mako Mon Mar 01 17:47:28 2010 -0500
+++ b/templates/root/index.mako Thu Feb 11 00:17:04 2010 -0500
@@ -35,6 +35,9 @@
"Show Deleted Datasets": function() {
galaxy_history.location = "${h.url_for( controller='root', action='history', show_deleted=True)}";
},
+ "Show structure": function() {
+ galaxy_main.location = "${h.url_for( controller='history', action='display_structured' )}";
+ },
"Delete": function()
{
if ( confirm( "Really delete the current history?" ) )
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/c48de7f12e58
changeset: 3455:c48de7f12e58
user: Kanwei Li <kanwei(a)gmail.com>
date: Mon Mar 01 17:47:28 2010 -0500
description:
Fix uploads not working
diffstat:
lib/galaxy/jobs/__init__.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r 29bb8ebb3a59 -r c48de7f12e58 lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py Mon Mar 01 16:07:54 2010 -0500
+++ b/lib/galaxy/jobs/__init__.py Mon Mar 01 17:47:28 2010 -0500
@@ -155,7 +155,7 @@
run and dispatching if so.
"""
# HACK: Delay until after forking, we need a way to do post fork notification!!!
- time.sleep( 1000 )
+ time.sleep( 10 )
while self.running:
try:
self.__monitor_step()
1
0
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/29bb8ebb3a59
changeset: 3454:29bb8ebb3a59
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Mon Mar 01 16:07:54 2010 -0500
description:
Passwords are no longer changed ( sanitized ) as part of processing the request. Enhanced functional tests to cover the scenario where passwords include chars that break in sanitization.
diffstat:
lib/galaxy/web/controllers/requests_admin.py | 4 +-
lib/galaxy/web/controllers/user.py | 30 ++++++++++++++++-----------
test/base/twilltestcase.py | 5 +++-
test/functional/test_user_info.py | 7 ++++-
4 files changed, 29 insertions(+), 17 deletions(-)
diffs (118 lines):
diff -r 58ba6e72d803 -r 29bb8ebb3a59 lib/galaxy/web/controllers/requests_admin.py
--- a/lib/galaxy/web/controllers/requests_admin.py Mon Mar 01 16:00:26 2010 -0500
+++ b/lib/galaxy/web/controllers/requests_admin.py Mon Mar 01 16:07:54 2010 -0500
@@ -1703,7 +1703,7 @@
# data transfer info
rt.datatx_info = dict(host=util.restore_text( params.get( 'host', '' ) ),
username=util.restore_text( params.get( 'username', '' ) ),
- password=util.restore_text( params.get( 'password', '' ) ),
+ password=params.get( 'password', '' ),
data_dir=util.restore_text( params.get( 'data_dir', '' ) ))
trans.sa_session.add( rt )
trans.sa_session.flush()
@@ -1775,7 +1775,7 @@
# data transfer info
rt.datatx_info = dict(host=util.restore_text( params.get( 'host', '' ) ),
username=util.restore_text( params.get( 'username', '' ) ),
- password=util.restore_text( params.get( 'password', '' ) ))
+ password=params.get( 'password', '' ))
trans.sa_session.add( rt )
trans.sa_session.flush()
# set sample states
diff -r 58ba6e72d803 -r 29bb8ebb3a59 lib/galaxy/web/controllers/user.py
--- a/lib/galaxy/web/controllers/user.py Mon Mar 01 16:00:26 2010 -0500
+++ b/lib/galaxy/web/controllers/user.py Mon Mar 01 16:07:54 2010 -0500
@@ -167,12 +167,14 @@
@web.expose
def create( self, trans, **kwd ):
params = util.Params( kwd )
- email = util.restore_text( params.get('email', '') )
- username = util.restore_text( params.get('username', '') )
- password = util.restore_text( params.get('password', '') )
- confirm = util.restore_text( params.get('confirm', '') )
- subscribe = CheckboxField.is_checked( params.get('subscribe', '') )
- admin_view = params.get('admin_view', 'False')
+ email = util.restore_text( params.get( 'email', '' ) )
+ username = util.restore_text( params.get( 'username', '' ) )
+ # Do not sanitize passwords, so take from kwd
+ # instead of params ( which were sanitized )
+ password = kwd.get( 'password', '' )
+ confirm = kwd.get( 'confirm', '' )
+ subscribe = CheckboxField.is_checked( params.get( 'subscribe', '' ) )
+ admin_view = params.get( 'admin_view', 'False' )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
if trans.app.config.require_login:
@@ -413,11 +415,11 @@
login_info = { 'Email': TextField( 'email', 40,
util.restore_text( params.get('email', '') ) ),
'Public Username': TextField( 'username', 40,
- util.restore_text( params.get('username', '') ) ),
+ util.restore_text( params.get( 'username', '' ) ) ),
'Password': PasswordField( 'password', 40,
- util.restore_text( params.get('password', '') ) ),
+ params.get( 'password', '' ) ),
'Confirm': PasswordField( 'confirm', 40,
- util.restore_text( params.get('confirm', '') ) ),
+ params.get( 'confirm', '' ) ),
'Subscribe To Mailing List': CheckboxField( 'subscribe',
util.restore_text( params.get('subscribe', '') ) ) }
# user information
@@ -531,11 +533,15 @@
# Change password
#
elif params.get('change_password_button', None) == 'Save':
- password = util.restore_text( params.get('password', '') )
- confirm = util.restore_text( params.get('confirm', '') )
+ # Do not sanitize passwords, so get from kwd and not params
+ # ( which were sanitized ).
+ password = kwd.get( 'password', '' )
+ confirm = kwd.get( 'confirm', '' )
# when from the user perspective, validate the current password
if params.get('admin_view', 'False') == 'False':
- current = util.restore_text( params.get('current', '') )
+ # Do not sanitize passwords, so get from kwd and not params
+ # ( which were sanitized ).
+ current = kwd.get( 'current', '' )
if not trans.user.check_password( current ):
return trans.response.send_redirect( web.url_for( controller='user',
action='show_info',
diff -r 58ba6e72d803 -r 29bb8ebb3a59 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py Mon Mar 01 16:00:26 2010 -0500
+++ b/test/base/twilltestcase.py Mon Mar 01 16:07:54 2010 -0500
@@ -745,7 +745,10 @@
self.create( email=email, password=password )
except:
self.home()
- self.visit_page( "user/login?email=%s&password=%s" % ( email, password ) )
+ self.visit_url( "%s/user/login" % self.url )
+ tc.fv( '1', 'email', email )
+ tc.fv( '1', 'password', password )
+ tc.submit( 'Login' )
self.check_page_for_string( "Now logged in as %s" %email )
self.home()
def logout( self ):
diff -r 58ba6e72d803 -r 29bb8ebb3a59 test/functional/test_user_info.py
--- a/test/functional/test_user_info.py Mon Mar 01 16:00:26 2010 -0500
+++ b/test/functional/test_user_info.py Mon Mar 01 16:07:54 2010 -0500
@@ -20,7 +20,6 @@
return fdc.latest_form
return None
-
class TestUserInfo( TwillTestCase ):
def test_000_create_user_info_forms( self ):
"""Testing creating a new user info form and editing it"""
@@ -127,7 +126,11 @@
user = sa_session.query( galaxy.model.User ) \
.filter( and_( galaxy.model.User.table.c.email=='test11(a)bx.psu.edu' ) ).first()
self.edit_login_info( new_email='test11_new(a)bx.psu.edu', new_username='test11_new' )
- self.change_password('testuser', 'new_testuser')
+ self.change_password( 'testuser', 'testuser#' )
+ self.logout()
+ self.login( email='test11_new(a)bx.psu.edu', password='testuser#' )
+ self.edit_login_info( new_email='test11(a)bx.psu.edu', new_username='test11' )
+ self.change_password( 'testuser#', 'testuser' )
self.edit_user_info( ['Research', 'PSU'] )
def test_020_create_user_as_admin( self ):
''' Testing creating users as an admin '''
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/58ba6e72d803
changeset: 3453:58ba6e72d803
user: Nate Coraor <nate(a)bx.psu.edu>
date: Mon Mar 01 16:00:26 2010 -0500
description:
update GeneTrack egg
diffstat:
eggs.ini | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r 0cb68935eede -r 58ba6e72d803 eggs.ini
--- a/eggs.ini Mon Mar 01 15:41:30 2010 -0500
+++ b/eggs.ini Mon Mar 01 16:00:26 2010 -0500
@@ -60,7 +60,7 @@
pysqlite = _3.6.17_static
MySQL_python = _5.1.41_static
bx_python = _dev_3b9d30e47619
-GeneTrack = _dev_bf44f7054c30f19bd9f79106c1fd69849562b361
+GeneTrack = _dev_48da9e998f0caf01c5be731e926f4b0481f658f0
SQLAlchemy = _dev_r6498
pysam = _kanwei_90e03180969d
1
0
03 Mar '10
details: http://www.bx.psu.edu/hg/galaxy/rev/0cb68935eede
changeset: 3452:0cb68935eede
user: Nate Coraor <nate(a)bx.psu.edu>
date: Mon Mar 01 15:41:30 2010 -0500
description:
Egg support overhaul, introduces a number of fixes to the ABI recognition, better build scripts, a rewrite of the eggs library and eliminition of the need for python -ES
diffstat:
dist-eggs.ini | 79 +-
eggs.ini | 63 +-
lib/galaxy/__init__.py | 78 +-
lib/galaxy/eggs/__init__.py | 769 ++++++++--------------
lib/galaxy/eggs/dist.py | 86 ++
lib/galaxy/eggs/scramble.py | 234 ++++++
manage_db.sh | 2 +-
run.sh | 8 +-
run_functional_tests.sh | 10 +-
run_reports.sh | 3 +-
run_unit_tests.sh | 2 +-
scripts/check_eggs.py | 10 +-
scripts/check_python.py | 13 +-
scripts/dist-scramble.py | 22 +-
scripts/fetch_eggs.py | 56 +-
scripts/get_platforms.py | 6 +-
scripts/paster.py | 1 +
scripts/scramble.py | 44 +-
scripts/scramble/lib/get_platform.py | 18 -
scripts/scramble/lib/scramble_lib.py | 164 ++++
scripts/scramble/patches/Cheetah/SetupConfig.py | 103 +++
scripts/scramble/patches/GeneTrack/setup.py | 15 +
scripts/scramble/patches/MySQL_python/site.cfg | 18 +
scripts/scramble/patches/PasteScript/setup.py | 145 ++++
scripts/scramble/patches/psycopg2/setup.py | 252 +++++++
scripts/scramble/scripts/Cheetah.py | 62 -
scripts/scramble/scripts/DRMAA_python-macosx.py | 29 +-
scripts/scramble/scripts/DRMAA_python-solaris.py | 44 +-
scripts/scramble/scripts/DRMAA_python.py | 30 +-
scripts/scramble/scripts/GeneTrack.py | 58 -
scripts/scramble/scripts/MySQL_python-solaris.py | 81 ++
scripts/scramble/scripts/MySQL_python.py | 188 +---
scripts/scramble/scripts/PasteScript.py | 53 -
scripts/scramble/scripts/generic.py | 28 +-
scripts/scramble/scripts/pbs_python.py | 57 +-
scripts/scramble/scripts/psycopg2-cygwin.py | 39 -
scripts/scramble/scripts/psycopg2.py | 177 +---
scripts/scramble/scripts/pysam-solaris.py | 29 +
scripts/scramble/scripts/pysqlite.py | 43 +-
scripts/scramble/scripts/python_lzo.py | 129 ---
set_metadata.sh | 2 +-
setup.sh | 4 +-
setup_paths.sh | 46 -
43 files changed, 1817 insertions(+), 1483 deletions(-)
diffs (truncated from 3938 to 3000 lines):
diff -r a6c9862ece3d -r 0cb68935eede dist-eggs.ini
--- a/dist-eggs.ini Mon Mar 01 13:30:37 2010 -0500
+++ b/dist-eggs.ini Mon Mar 01 15:41:30 2010 -0500
@@ -1,9 +1,9 @@
;
; Config for building eggs for distribution (via a site such as
; eggs.g2.bx.psu.edu) Probably only useful to Galaxy developers at
-; Penn State. This file is used by dist-scramble.py
+; Penn State. This file is used by scripts/dist-scramble.py
;
-; More information: http://g2.trac.bx.psu.edu/wiki/GalaxyEggs
+; More information: http://bitbucket.org/galaxy/galaxy-central/wiki/Config/Eggs
;
[hosts]
@@ -22,16 +22,32 @@
py2.4-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.4
py2.5-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.5
py2.6-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.6
-py2.5-macosx-10.5-i386-ucs2 = lion.bx.psu.edu /usr/bin/python2.5
-py2.4-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc-ucs2/bin/python2.4
-py2.5-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc-ucs2/bin/python2.5
-py2.6-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc-ucs2/bin/python2.6
-py2.4-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.11-i86pc-ucs2/bin/python2.4
-py2.5-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.11-i86pc-ucs2/bin/python2.5
-py2.6-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.11-i86pc-ucs2/bin/python2.6
-py2.4-solaris-2.10-sun4u-ucs2 = v880.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-sun4u-ucs2/bin/python2.4
-py2.5-solaris-2.10-sun4u-ucs2 = v880.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-sun4u-ucs2/bin/python2.5
-py2.6-solaris-2.10-sun4u-ucs2 = v880.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-sun4u-ucs2/bin/python2.6
+py2.6-macosx-10.6-universal-ucs2 = lion.bx.psu.edu /usr/bin/python2.6
+py2.4-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.4
+py2.5-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.5
+py2.6-solaris-2.10-i86pc_32-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_32-ucs2/bin/python2.6
+py2.4-solaris-2.10-i86pc_64-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_64-ucs2/bin/python2.4
+py2.5-solaris-2.10-i86pc_64-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_64-ucs2/bin/python2.5
+py2.6-solaris-2.10-i86pc_64-ucs2 = thumper.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.10-i86pc_64-ucs2/bin/python2.6
+py2.4-solaris-2.8-sun4u_32-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.4
+py2.5-solaris-2.8-sun4u_32-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.5
+py2.6-solaris-2.8-sun4u_32-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.6
+py2.4-solaris-2.8-sun4u_64-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.4
+py2.5-solaris-2.8-sun4u_64-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.5
+py2.6-solaris-2.8-sun4u_64-ucs2 = troegs.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.6
+
+; pysam doesn't build on solaris < 10, so for it alone we need these hosts
+py2.4-solaris-2.10-sun4u_32-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.4
+py2.5-solaris-2.10-sun4u_32-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.5
+py2.6-solaris-2.10-sun4u_32-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_32-ucs2/bin/python2.6
+py2.4-solaris-2.10-sun4u_64-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.4
+py2.5-solaris-2.10-sun4u_64-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.5
+py2.6-solaris-2.10-sun4u_64-ucs2 = early.bx.psu.edu /afs/bx.psu.edu/project/pythons/solaris-2.8-sun4u_64-ucs2/bin/python2.6
+
+; these hosts are used to build eggs with no C extensions
+py2.4 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.4
+py2.5 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.5
+py2.6 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
[groups]
py2.4-linux-i686 = py2.4-linux-i686-ucs2 py2.4-linux-i686-ucs4
@@ -47,20 +63,37 @@
linux-x86_64 = py2.4-linux-x86_64 py2.5-linux-x86_64 py2.6-linux-x86_64
linux = linux-i686 linux-x86_64
py2.4-macosx = py2.4-macosx-10.3-fat-ucs2
-py2.5-macosx = py2.5-macosx-10.3-fat-ucs2 py2.5-macosx-10.5-i386-ucs2
-py2.6-macosx = py2.6-macosx-10.3-fat-ucs2
+py2.5-macosx = py2.5-macosx-10.3-fat-ucs2
+py2.6-macosx = py2.6-macosx-10.3-fat-ucs2 py2.6-macosx-10.6-universal-ucs2
macosx = py2.4-macosx py2.5-macosx py2.6-macosx
-py2.4-solaris = py2.4-solaris-2.10-i86pc-ucs2 py2.4-solaris-2.11-i86pc-ucs2 py2.4-solaris-2.10-sun4u-ucs2
-py2.5-solaris = py2.5-solaris-2.10-i86pc-ucs2 py2.5-solaris-2.11-i86pc-ucs2 py2.5-solaris-2.10-sun4u-ucs2
-py2.6-solaris = py2.6-solaris-2.10-i86pc-ucs2 py2.6-solaris-2.11-i86pc-ucs2 py2.6-solaris-2.10-sun4u-ucs2
-solaris = py2.4-solaris py2.5-solaris py2.6-solaris
+py2.4-solaris-i86pc = py2.4-solaris-2.10-i86pc_32-ucs2 py2.4-solaris-2.10-i86pc_64-ucs2
+py2.5-solaris-i86pc = py2.5-solaris-2.10-i86pc_32-ucs2 py2.5-solaris-2.10-i86pc_64-ucs2
+py2.6-solaris-i86pc = py2.6-solaris-2.10-i86pc_32-ucs2 py2.6-solaris-2.10-i86pc_64-ucs2
+py2.4-solaris-sun4u = py2.4-solaris-2.8-sun4u_32-ucs2 py2.4-solaris-2.8-sun4u_64-ucs2
+py2.5-solaris-sun4u = py2.5-solaris-2.8-sun4u_32-ucs2 py2.5-solaris-2.8-sun4u_64-ucs2
+py2.6-solaris-sun4u = py2.6-solaris-2.8-sun4u_32-ucs2 py2.6-solaris-2.8-sun4u_64-ucs2
+py2.4-solaris = py2.4-solaris-i86pc py2.4-solaris-sun4u
+py2.5-solaris = py2.5-solaris-i86pc py2.5-solaris-sun4u
+py2.6-solaris = py2.6-solaris-i86pc py2.6-solaris-sun4u
+solaris-i86pc = py2.4-solaris-i86pc py2.5-solaris-i86pc py2.6-solaris-i86pc
+solaris-sun4u = py2.4-solaris-sun4u py2.5-solaris-sun4u py2.6-solaris-sun4u
+solaris = solaris-i86pc solaris-sun4u
py2.4-all = py2.4-linux py2.4-macosx py2.4-solaris
py2.5-all = py2.5-linux py2.5-macosx py2.5-solaris
py2.6-all = py2.6-linux py2.6-macosx py2.6-solaris
-all = py2.4-all py2.5-all py2.6-all
-; default hosts for platform-inspecific eggs
-noplatform = py2.4-linux-i686-ucs4 py2.5-linux-i686-ucs4 py2.6-linux-i686-ucs4
+; group for building pysam on solaris 10 sparc
+solaris-2.10-sun4u = py2.4-solaris-2.10-sun4u_32-ucs2 py2.5-solaris-2.10-sun4u_32-ucs2 py2.6-solaris-2.10-sun4u_32-ucs2 py2.4-solaris-2.10-sun4u_64-ucs2 py2.5-solaris-2.10-sun4u_64-ucs2 py2.6-solaris-2.10-sun4u_64-ucs2
+
+; the 'all' key is used internally by the build system to specify which hosts
+; to build on when no hosts are specified on the dist-eggs.py command line.
+all = linux macosx solaris
+
+; the 'noplatform' key, likewise, is for which build hosts should be used when
+; building pure python (noplatform) eggs.
+noplatform = py2.4 py2.5 py2.6
+
+; don't build these eggs on these platforms:
[ignore]
-; Don't build these eggs on these platforms:
-GeneTrack = py2.4-noplatform
+GeneTrack = py2.4
+pysam = py2.4-solaris-2.8-sun4u_32-ucs2 py2.5-solaris-2.8-sun4u_32-ucs2 py2.6-solaris-2.8-sun4u_32-ucs2 py2.4-solaris-2.8-sun4u_64-ucs2 py2.5-solaris-2.8-sun4u_64-ucs2 py2.6-solaris-2.8-sun4u_64-ucs2
diff -r a6c9862ece3d -r 0cb68935eede eggs.ini
--- a/eggs.ini Mon Mar 01 13:30:37 2010 -0500
+++ b/eggs.ini Mon Mar 01 15:41:30 2010 -0500
@@ -3,11 +3,11 @@
;
; This file is version controlled and should not be edited by hand!
; For more information, see:
-; http://g2.trac.bx.psu.edu/wiki/GalaxyEggs
+; http://bitbucket.org/galaxy/galaxy-central/wiki/Config/Eggs
;
[general]
-repository = http://eggs.g2.bx.psu.edu
+repository = http://eggs.g2.bx.psu.edu/new
; these eggs must be scrambled for your local environment
no_auto = pbs_python DRMAA_python
@@ -15,13 +15,13 @@
bx_python = 0.5.0
Cheetah = 2.2.2
DRMAA_python = 0.2
-MySQL_python = 1.2.2
+MySQL_python = 1.2.3c1
pbs_python = 2.9.4
psycopg2 = 2.0.6
pycrypto = 2.0.1
pysam = 0.1.1
pysqlite = 2.5.6
-python_lzo = 1.08
+python_lzo = 1.08_2.03_static
threadframe = 0.2
guppy = 0.1.8
@@ -33,10 +33,9 @@
elementtree = 1.2.6_20050316
GeneTrack = 2.0.0_beta_1
lrucache = 0.2
-;lsprof - james
Mako = 0.2.5
nose = 0.11.1
-NoseHTML = 0.3
+NoseHTML = 0.3.1
Paste = 1.6
PasteDeploy = 1.3.3
PasteScript = 1.7.3
@@ -58,52 +57,16 @@
; extra version information
[tags]
psycopg2 = _8.2.6_static
-pysqlite = _static
-MySQL_python = _5.0.67_static
-python_lzo = _static
+pysqlite = _3.6.17_static
+MySQL_python = _5.1.41_static
bx_python = _dev_3b9d30e47619
GeneTrack = _dev_bf44f7054c30f19bd9f79106c1fd69849562b361
SQLAlchemy = _dev_r6498
-; nose = .dev_r7156749efc58
+pysam = _kanwei_90e03180969d
-; source location, necessary for scrambling
+; dependency source urls, necessary for scrambling. for an explanation, see
+; the wiki page above
[source]
-bx_python = http://bitbucket.org/james_taylor/bx-python/get/3b9d30e47619.bz2
-Cheetah = http://pypi.python.org/packages/source/C/Cheetah/Cheetah-2.2.2.tar.gz
-DRMAA_python = http://gridengine.sunsource.net/files/documents/7/36/DRMAA-python-0.2.tar.gz
-MySQL_python = http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/My… http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.67.tar.gz
-pbs_python = http://ftp.sara.nl/pub/outgoing/pbs_python-2.9.4.tar.gz
-pexpect = http://pypi.python.org/packages/source/p/pexpect/pexpect-2.4.tar.gz
-psycopg2 = http://initd.org/pub/software/psycopg/PSYCOPG-2-0/psycopg2-2.0.6.tar.gz ftp://ftp-archives.postgresql.org/pub/source/v8.2.6/postgresql-8.2.6.tar.bz2
-pycrypto = http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
-pysam = http://bitbucket.org/kanwei/kanwei-pysam/get/e3c601a062fd.gz
-pysqlite = http://pypi.python.org/packages/source/p/pysqlite/pysqlite-2.5.6.tar.gz
-python_lzo = http://www.oberhumer.com/opensource/lzo/download/LZO-v1/python-lzo-1.08.tar… http://www.oberhumer.com/opensource/lzo/download/LZO-v1/lzo-1.08.tar.gz
-threadframe = http://www.majid.info/python/threadframe/threadframe-0.2.tar.gz
-guppy = http://pypi.python.org/packages/source/g/guppy/guppy-0.1.8.tar.gz
-amqplib = http://py-amqplib.googlecode.com/files/amqplib-0.6.1.tgz
-Beaker = http://cheeseshop.python.org/packages/source/B/Beaker/Beaker-1.4.tar.gz
-decorator = http://pypi.python.org/packages/source/d/decorator/decorator-3.1.2.tar.gz
-docutils = http://downloads.sourceforge.net/docutils/docutils-0.4.tar.gz
-elementtree = http://effbot.org/downloads/elementtree-1.2.6-20050316.tar.gz
-GeneTrack = http://github.com/ialbert/genetrack-central/tarball/bf44f7054c30f19bd9f7910…
-lrucache = http://evan.prodromou.name/lrucache/lrucache-0.2.tar.gz
-Mako = http://www.makotemplates.org/downloads/Mako-0.2.5.tar.gz
-nose = http://pypi.python.org/packages/source/n/nose/nose-0.11.1.tar.gz
-NoseHTML = http://bitbucket.org/james_taylor/nosehtml/get/c46a54d569ae.bz2
-Paste = http://cheeseshop.python.org/packages/source/P/Paste/Paste-1.6.tar.gz
-PasteDeploy = http://cheeseshop.python.org/packages/source/P/PasteDeploy/PasteDeploy-1.3.…
-PasteScript = http://cheeseshop.python.org/packages/source/P/PasteScript/PasteScript-1.7.…
-Routes = http://pypi.python.org/packages/source/R/Routes/Routes-1.11.tar.gz
-simplejson = http://cheeseshop.python.org/packages/source/s/simplejson/simplejson-1.5.ta…
-SQLAlchemy = http://dist.g2.bx.psu.edu/SQLAlchemy-0.5.6_r6498.tar.bz2
-sqlalchemy_migrate = http://pypi.python.org/packages/source/s/sqlalchemy-migrate/sqlalchemy-migr…
-Tempita = http://pypi.python.org/packages/source/T/Tempita/Tempita-0.1.tar.gz
-twill = http://darcs.idyll.org/~t/projects/twill-0.9.tar.gz
-WebError = http://pypi.python.org/packages/source/W/WebError/WebError-0.8a.tar.gz
-WebHelpers = http://pypi.python.org/packages/source/W/WebHelpers/WebHelpers-0.2.tar.gz
-WebOb = http://pypi.python.org/packages/source/W/WebOb/WebOb-0.8.5.tar.gz
-wsgiref = http://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip
-Babel = http://ftp.edgewall.com/pub/babel/Babel-0.9.4.zip
-wchartype = http://ginstrom.com/code/wchartype-0.1.zip
-boto = http://boto.googlecode.com/files/boto-1.8d.tar.gz
+MySQL_python = mysql-5.1.41
+psycopg2 = postgresql-8.2.6
+pysqlite = sqlite-amalgamation-3_6_17
diff -r a6c9862ece3d -r 0cb68935eede lib/galaxy/__init__.py
--- a/lib/galaxy/__init__.py Mon Mar 01 13:30:37 2010 -0500
+++ b/lib/galaxy/__init__.py Mon Mar 01 15:41:30 2010 -0500
@@ -2,30 +2,62 @@
Galaxy root package -- this is a namespace package.
"""
-# Starting somewhere in 2.5.x, Python on Mac became broken - despite being fat,
-# the machine portion of the platform is not set to 'fat'.
-#
-# For more, see:
-#
-# http://bugs.python.org/setuptools/issue19
-#
-import os, sys
-from distutils.sysconfig import get_config_vars
+__import__( "pkg_resources" ).declare_namespace( __name__ )
-if sys.version_info[:2] == ( 2, 5 ) and \
+import os, sys, re
+from distutils.sysconfig import get_config_var, get_config_vars
+
+import pkg_resources
+
+# patch get_platform() for better ABI recognition
+def _get_build_platform():
+ plat = pkg_resources._get_build_platform()
+ if sys.version_info[:2] == ( 2, 5 ) and \
( ( os.uname()[-1] in ( 'i386', 'ppc' ) and sys.platform == 'darwin' and os.path.abspath( sys.prefix ).startswith( '/System' ) ) or \
( sys.platform == 'darwin' and get_config_vars().get('UNIVERSALSDK', '').strip() ) ):
- # Has to be before anything imports pkg_resources
- def _get_platform_monkeypatch():
- plat = distutils.util._get_platform()
- if plat.startswith( 'macosx-' ):
- plat = 'macosx-10.3-fat'
- return plat
- import distutils.util
- try:
- assert distutils.util._get_platform
- except:
- distutils.util._get_platform = distutils.util.get_platform
- distutils.util.get_platform = _get_platform_monkeypatch
+ plat = 'macosx-10.3-fat'
+ if sys.platform == "sunos5" and not (plat.endswith('_32') or plat.endswith('_64')):
+ if sys.maxint > 2**31:
+ plat += '_64'
+ else:
+ plat += '_32'
+ if not (plat.endswith('-ucs2') or plat.endswith('-ucs4')):
+ if sys.maxunicode > 2**16:
+ plat += '-ucs4'
+ else:
+ plat += '-ucs2'
+ return plat
+try:
+ assert pkg_resources._get_build_platform
+except:
+ pkg_resources._get_build_platform = pkg_resources.get_build_platform
+ pkg_resources.get_build_platform = _get_build_platform
+ pkg_resources.get_platform = _get_build_platform
-__import__( "pkg_resources" ).declare_namespace( __name__ )
+# patch compatible_platforms() to allow for Solaris binary compatibility
+solarisVersionString = re.compile(r"solaris-(\d)\.(\d+)-(.*)")
+def _compatible_platforms(provided,required):
+ # this is a bit kludgey since we need to know a bit about what happened in
+ # the original method
+ if provided is None or required is None or provided==required:
+ return True # easy case
+ reqMac = pkg_resources.macosVersionString.match(required)
+ if reqMac:
+ return pkg_resources._compatible_platforms(provided,required)
+ reqSol = solarisVersionString.match(required)
+ if reqSol:
+ provSol = solarisVersionString.match(provided)
+ if not provSol:
+ return False
+ if provSol.group(1) != reqSol.group(1) or \
+ provSol.group(3) != reqSol.group(3):
+ return False
+ if int(provSol.group(2)) > int(reqSol.group(2)):
+ return False
+ return True
+ return False
+try:
+ assert pkg_resources._compatible_platforms
+except:
+ pkg_resources._compatible_platforms = pkg_resources.compatible_platforms
+ pkg_resources.compatible_platforms = _compatible_platforms
diff -r a6c9862ece3d -r 0cb68935eede lib/galaxy/eggs/__init__.py
--- a/lib/galaxy/eggs/__init__.py Mon Mar 01 13:30:37 2010 -0500
+++ b/lib/galaxy/eggs/__init__.py Mon Mar 01 15:41:30 2010 -0500
@@ -2,17 +2,15 @@
Manage Galaxy eggs
"""
-import os, sys, shutil, tarfile, zipfile, zipimport, subprocess, ConfigParser, glob, urllib2, shutil
-from types import ModuleType
+import os, sys, glob, urllib, urllib2, ConfigParser, HTMLParser, zipimport, zipfile
import logging
log = logging.getLogger( __name__ )
import pkg_resources
-# we MUST have the top level galaxy dir for automatic egg fetching
-# within tools. i don't know of any way around this. -ndc
-galaxy_dir = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "..", ".." ) )
+galaxy_dir = os.path.abspath( os.path.join( os.path.dirname( __file__ ), '..', '..', '..' ) )
+py = 'py%s' % sys.version[:3]
class EggNotFetchable( Exception ):
def __init__( self, eggs ):
@@ -23,452 +21,287 @@
def __str__( self ):
return ' '.join( self.eggs )
-class PlatformNotSupported( Exception ):
- pass
-
-# TODO: we should really be using exceptions instead of returns for everything
-
# need the options to remain case sensitive
-class CSConfigParser( ConfigParser.SafeConfigParser ):
+class CaseSensitiveConfigParser( ConfigParser.SafeConfigParser ):
def optionxform( self, optionstr ):
return optionstr
+# so we can actually detect failures
+class URLRetriever( urllib.FancyURLopener ):
+ def http_error_default( *args ):
+ urllib.URLopener.http_error_default( *args )
+
class Egg( object ):
"""
- Contains information about locating, downloading and scrambling eggs.
+ Contains information about locating and downloading eggs.
"""
- archive_dir = os.path.join( galaxy_dir, "scripts", "scramble", "archives" )
- script_dir = os.path.join( galaxy_dir, "scripts", "scramble", "scripts" )
- build_dir = os.path.join( galaxy_dir, "scripts", "scramble", "build" )
- ez_setup = os.path.join( galaxy_dir, "scripts", "scramble", "lib", "ez_setup.py" )
- ez_setup_url = "http://peak.telecommunity.com/dist/ez_setup.py"
- def __init__( self ):
- self.name = None
- self.version = None
- self.tag = None
- self.sources = []
- self.platform = {}
- self.url = None
- self.have = False
- self.path = None
- self.doppelgangers = []
- self.buildpath = None
+ def __init__( self, name=None, version=None, tag=None, url=None, platform=None ):
+ self.name = name
+ self.version = version
+ self.tag = tag
+ self.url = url
+ self.platform = platform
+ self.distribution = None
self.dir = None
- self.build_host = None
- self.python = sys.executable
+ if self.name is not None and self.version is not None:
+ self.set_distribution()
def set_dir( self ):
- if self.build_host is not None:
- self.dir = os.path.join( galaxy_dir, "dist-eggs", self.platform['galaxy'] )
- else:
- self.dir = os.path.join( galaxy_dir, "eggs", self.platform['galaxy'] )
- def get_namever( self ):
- return( "%s-%s" %( self.name, self.version ) )
- def get_namevertag( self ):
- if self.tag is None:
- return( "%s-%s" %( self.name, self.version ) )
- else:
- return( "%s-%s%s" %( self.name, self.version, self.tag ) )
- def get_vertag( self ):
- if self.tag is None:
- return self.version
- else:
- return( "%s%s" %( self.version, self.tag ) )
- def get_filename( self ):
- if self.tag is None:
- return( "%s-%s-%s.egg" %( self.name, self.version, self.platform['peak'] ) )
- else:
- return( "%s-%s%s-%s.egg" %( self.name, self.version, self.tag, self.platform['peak'] ) )
- def find( self ):
- # TODO: should be able to set a search path in eggs.ini
+ self.dir = os.path.join( galaxy_dir, 'eggs' )
+ if not os.path.exists( self.dir ):
+ os.makedirs( self.dir )
+ def set_distribution( self ):
+ """
+ Stores a pkg_resources Distribution object for reference later
+ """
if self.dir is None:
self.set_dir()
- self.path = os.path.join( self.dir, self.get_filename() )
- self.doppelgangers = glob.glob( os.path.join( self.dir, "%s-*-%s.egg" % (self.name, self.platform['peak'] ) ) )
- if os.access( self.path, os.F_OK ):
- self.have = True
- self.doppelgangers.remove( self.path )
- def fetch( self ):
- if self.path is None:
- self.find()
- if not self.have:
- if not os.access( os.path.dirname( self.path ), os.F_OK ):
- os.makedirs( os.path.dirname( self.path ) )
+ tag = self.tag or ''
+ self.distribution = pkg_resources.Distribution.from_filename(
+ os.path.join( self.dir, '-'.join( ( self.name, self.version + tag, self.platform ) ) + '.egg' ) )
+ @property
+ def path( self ):
+ """
+ Return the path of the egg, if it exists, or None
+ """
+ if env[self.distribution.project_name]:
+ return env[self.distribution.project_name][0].location
+ return None
+ def fetch( self, requirement ):
+ """
+ fetch() serves as the install method to pkg_resources.working_set.resolve()
+ """
+ def find_alternative():
+ """
+ Some platforms (e.g. Solaris) support eggs compiled on older platforms
+ """
+ class LinkParser( HTMLParser.HTMLParser ):
+ """
+ Finds links in what should be an Apache-style directory index
+ """
+ def __init__( self ):
+ HTMLParser.HTMLParser.__init__( self )
+ self.links = []
+ def handle_starttag( self, tag, attrs ):
+ if tag == 'a' and 'href' in dict( attrs ):
+ self.links.append( dict( attrs )['href'] )
+ parser = LinkParser()
try:
- inf = urllib2.urlopen( self.url )
- otf = open( self.path, 'wb' )
- otf.write( inf.read() )
- inf.close()
- otf.close()
- log.debug( "Fetched %s" % self.url )
+ parser.feed( urllib2.urlopen( self.url + '/' ).read() )
except urllib2.HTTPError, e:
- raise EggNotFetchable( self.name )
- #if e.code == 404:
- # return False
- self.unpack_if_needed()
- for doppelganger in self.doppelgangers:
- remove_file_or_path( doppelganger )
- log.debug( "Removed conflicting egg: %s" % doppelganger )
- return True
+ if e.code == 404:
+ return None
+ parser.close()
+ for link in parser.links:
+ file = urllib.unquote( link ).rsplit( '/', 1 )[-1]
+ tmp_dist = pkg_resources.Distribution.from_filename( file )
+ if tmp_dist.platform is not None and \
+ self.distribution.project_name == tmp_dist.project_name and \
+ self.distribution.version == tmp_dist.version and \
+ pkg_resources.compatible_platforms( tmp_dist.platform, pkg_resources.get_platform() ):
+ return file
+ return None
+ if self.url is None:
+ return None
+ alternative = None
+ try:
+ url = self.url + '/' + self.distribution.egg_name() + '.egg'
+ URLRetriever().retrieve( url, self.distribution.location )
+ log.debug( "Fetched %s" % url )
+ except IOError, e:
+ if e[1] == 404 and self.distribution.platform != py:
+ alternative = find_alternative()
+ if alternative is None:
+ return None
+ else:
+ return None
+ if alternative is not None:
+ try:
+ url = '/'.join( ( self.url, alternative ) )
+ URLRetriever().retrieve( url, os.path.join( self.dir, alternative ) )
+ log.debug( "Fetched %s" % url )
+ except IOError, e:
+ return None
+ self.platform = alternative.split( '-', 2 )[-1].rsplit( '.egg', 1 )[0]
+ self.set_distribution()
+ self.unpack_if_needed()
+ self.remove_doppelgangers()
+ global env
+ env = get_env() # reset the global Environment object now that we've obtained a new egg
+ return self.distribution
def unpack_if_needed( self ):
- meta = pkg_resources.EggMetadata( zipimport.zipimporter( self.path ) )
+ meta = pkg_resources.EggMetadata( zipimport.zipimporter( self.distribution.location ) )
if meta.has_metadata( 'not-zip-safe' ):
- unpack_zipfile( self.path, self.path + "-tmp" )
- os.remove( self.path )
- os.rename( self.path + "-tmp", self.path )
- def scramble( self, dist=False ):
- if self.path is None:
- self.find()
- if os.access( self.path, os.F_OK ):
- log.warning( "scramble(): Egg already exists, remove to force rebuild:" )
- log.warning( " %s" % self.path )
- return True
- self.fetch_source()
- self.unpack_source()
- self.copy_build_script()
- if not os.access( Egg.ez_setup, os.F_OK ):
- if not os.access( os.path.dirname( Egg.ez_setup ), os.F_OK ):
- os.makedirs( os.path.dirname( Egg.ez_setup ) )
- inf = urllib2.urlopen( Egg.ez_setup_url )
- otf = open( Egg.ez_setup, 'wb' )
- otf.write( inf.read() )
- inf.close()
- otf.close()
- shutil.copyfile( Egg.ez_setup, os.path.join( self.buildpath, "ez_setup.py" ) )
- log.warning( "scramble(): Beginning build" )
- # subprocessed to sterilize the env
- if self.build_host is not None:
- cmd = "ssh %s 'cd %s; %s -ES %s'" % ( self.build_host, self.buildpath, self.python, "scramble.py" )
- else:
- cmd = "%s -ES %s" % ( self.python, "scramble.py" )
- log.debug( 'Executing: %s' % cmd )
- p = subprocess.Popen( args = cmd, shell = True, cwd = self.buildpath )
- r = p.wait()
- if r != 0:
- log.error( "scramble(): Egg build failed for %s" % self.get_namevertag() )
- return False
- new_egg = os.path.join( self.buildpath, "dist", os.path.basename( self.path ) )
- if not os.access( os.path.dirname( self.path ), os.F_OK ):
- os.makedirs( os.path.dirname( self.path ) )
- shutil.copyfile( new_egg, self.path )
- log.warning( "scramble(): Copied egg to:" )
- log.warning( " %s" % self.path )
- if not dist:
- self.unpack_if_needed()
- for doppelganger in self.doppelgangers:
+ unpack_zipfile( self.distribution.location, self.distribution.location + "-tmp" )
+ os.remove( self.distribution.location )
+ os.rename( self.distribution.location + "-tmp", self.distribution.location )
+ def remove_doppelgangers( self ):
+ doppelgangers = glob.glob( os.path.join( self.dir, "%s-*-%s.egg" % ( self.name, self.platform ) ) )
+ if self.distribution.location in doppelgangers:
+ doppelgangers.remove( self.distribution.location )
+ for doppelganger in doppelgangers:
remove_file_or_path( doppelganger )
- log.warning( "Removed conflicting egg: %s" % doppelganger )
- return True
- # scramble helper methods
- def get_archive_path( self, url ):
- return os.path.join( Egg.archive_dir, (url.rsplit( '/', 1 ))[1] )
- def get_tld( self, names ):
- tld = names[0].split( os.path.sep, 1 )[0]
- for name in names:
- try:
- assert tld == name.split( os.path.sep, 1 )[0]
- except:
- raise Exception( "get_tld(): Archive contains multiple top-level directories!" )
- return tld
- def fetch_source( self ):
- if not os.access( Egg.archive_dir, os.F_OK ):
- os.makedirs( Egg.archive_dir )
- for source_url in self.sources:
- source_path = self.get_archive_path( source_url )
- if os.access( source_path, os.F_OK ):
- log.warning( "fetch_source(): Using existing source, remove to download again:" )
- log.warning( " %s" % source_path )
- continue
- log.warning( "fetch_source(): Attempting to download" )
- log.warning( " %s" % source_url )
- inf = urllib2.urlopen( source_url )
- otf = open( source_path, 'wb' )
- otf.write( inf.read() )
- inf.close()
- otf.close()
- log.warning( "fetch_source(): Fetched %s" % source_url )
- def unpack_source( self ):
- unpack_dir = os.path.join( Egg.build_dir, self.platform['galaxy'] )
- if not os.access( unpack_dir, os.F_OK ):
- os.makedirs( unpack_dir )
- self.buildpath = os.path.join( unpack_dir, self.name )
- if os.access( self.buildpath, os.F_OK ):
- log.warning( "Removing old build directory at:" )
- log.warning( " %s" % self.buildpath )
- shutil.rmtree( self.buildpath )
- source_path = self.get_archive_path( self.sources[0] )
- if tarfile.is_tarfile( source_path ):
- self.unpack = self.unpack_tar
- elif zipfile.is_zipfile( source_path ):
- self.unpack = self.unpack_zip
- else:
- raise Exception( "unpack_source(): Unknown archive file type for %s" % source_path )
- self.unpack( source_path, unpack_dir )
- log.warning( "unpack_source(): Unpacked to:" )
- log.warning( " %s" % self.buildpath )
- def unpack_zip( self, source_path, unpack_path ):
- z = zipfile.ZipFile( source_path, "r" )
- tld = self.get_tld( z.namelist() )
- cur = os.getcwd()
- os.chdir( unpack_path )
- for fn in z.namelist():
- if "ez_setup" in fn:
- continue
- if not os.access( os.path.dirname( fn ), os.F_OK ):
- os.makedirs( os.path.dirname( fn ) )
- otf = open( fn, "wb" )
- otf.write( z.read( fn ) )
- otf.close()
- z.close()
- os.rename( tld, self.name )
- os.chdir( cur )
- def unpack_tar( self, source_path, unpack_path ):
- t = tarfile.open( source_path, "r" )
- members = filter( lambda x: "ez_setup" not in x.name and "pax_global_header" != x.name, t.getmembers() )
- tld = self.get_tld( [ x.name for x in members ] )
- cur = os.getcwd()
- os.chdir( unpack_path )
- for member in members:
- t.extract( member )
- t.close()
- os.rename( tld, self.name )
- os.chdir( cur )
- def copy_build_script( self ):
- peak_platform = get_platform( platform=True, peak=True )
- nopy_platform = ( peak_platform.split( "-", 1 ) )[1]
- just_os = ( nopy_platform.split( "-", 1 ) )[0]
- just_py = ( peak_platform.split( "-", 1 ) )[0]
- # will try:
- # bx_python-py2.4-solaris-2.11-i86pc.py
- # bx_python-py2.4-solaris.py
- # bx_python-solaris-2.11-i86pc.py
- # bx_python-solaris.py
- # bx_python-py2.4.py
- # bx_python.py
- # generic.py
- build_scripts = [
- os.path.join( Egg.script_dir, "%s-%s.py" % ( self.name, peak_platform ) ),
- os.path.join( Egg.script_dir, "%s-%s-%s.py" % ( self.name, just_py, just_os ) ),
- os.path.join( Egg.script_dir, "%s-%s.py" % ( self.name, nopy_platform ) ),
- os.path.join( Egg.script_dir, "%s-%s.py" % ( self.name, just_os ) ),
- os.path.join( Egg.script_dir, "%s-%s.py" % ( self.name, just_py ) ),
- os.path.join( Egg.script_dir, "%s.py" % self.name ),
- os.path.join( Egg.script_dir, "generic.py" )
- ]
- for build_script in build_scripts:
- try:
- f = open( build_script, "r" )
- f.close()
- log.warning( "scramble(): Using build script %s" % build_script )
- break
- except IOError:
- pass
- shutil.copyfile( build_script, os.path.join( self.buildpath, "scramble.py" ) )
- if self.tag is not None:
- tagfile = open( os.path.join( self.buildpath, ".galaxy_tag" ), "w" )
- print >>tagfile, self.tag
- tagfile.close()
+ log.debug( "Removed conflicting egg: %s" % doppelganger )
+ def resolve( self ):
+ try:
+ return pkg_resources.working_set.resolve( ( self.distribution.as_requirement(), ), env, self.fetch )
+ except pkg_resources.DistributionNotFound, e:
+ # If this statement is true, it means we do have the requested egg,
+ # just not one (or more) of its deps.
+ if e.args[0].project_name != self.distribution.project_name:
+ log.warning( "Warning: %s (a dependant egg of %s) cannot be fetched" % ( e.args[0].project_name, self.distribution.project_name ) )
+ return ( self.distribution, )
+ else:
+ raise EggNotFetchable( self )
+ except pkg_resources.VersionConflict, e:
+ # there's a conflicting egg on the path, remove it
+ dist = e.args[0]
+ # use the canonical path for comparisons
+ location = os.path.realpath( dist.location )
+ for entry in pkg_resources.working_set.entries:
+ if os.path.realpath( entry ) == location:
+ pkg_resources.working_set.entries.remove( entry )
+ break
+ else:
+ location = entry = None
+ del pkg_resources.working_set.by_key[dist.key]
+ if entry is not None:
+ pkg_resources.working_set.entry_keys[entry] = []
+ if entry in sys.path:
+ sys.path.remove(entry)
+ r = pkg_resources.working_set.resolve( ( self.distribution.as_requirement(), ), env, self.fetch )
+ if location is not None and not location.endswith( '.egg' ):
+ # re-add the path if it's a non-egg dir, in case more deps live there
+ pkg_resources.working_set.entries.append( location )
+ sys.path.append( location )
+ return r
+ def require( self ):
+ try:
+ dists = self.resolve()
+ for dist in dists:
+ pkg_resources.working_set.add( dist )
+ return dists
+ except:
+ raise
class Crate( object ):
"""
- Reads the eggs.ini file for use with checking, fetching and scrambling eggs.
+ Reads the eggs.ini file for use with checking and fetching.
"""
- config_file = os.path.join( galaxy_dir, "eggs.ini" )
+ config_file = os.path.join( galaxy_dir, 'eggs.ini' )
def __init__( self ):
self.eggs = {}
- self.config = CSConfigParser()
+ self.config = CaseSensitiveConfigParser()
self.repo = None
self.no_auto = []
- self.platform = { 'peak' : get_platform( platform=True, peak=True ), 'galaxy' : get_platform( platform=True, peak=False ) }
- self.noplatform = { 'peak' : get_platform( platform=False, peak=True ), 'galaxy' : get_platform( platform=False, peak=False ) }
+ self.galaxy_config = GalaxyConfig()
+ self.parse()
def parse( self ):
- if self.config.read( Crate.config_file ) == []:
- raise Exception( "unable to read egg config from %s" % Crate.config_file )
- try:
- self.repo = self.config.get( "general", "repository" )
- self.no_auto = self.config.get( "general", "no_auto" ).split()
- except ConfigParser.NoSectionError:
- raise Exception( "eggs.ini is missing required section [general]" )
- #except ConfigParser.NoOptionError:
- # raise Exception( "eggs.ini is missing required [general] option 'repository'" )
- try:
- platform_eggs = self.config.items( "eggs:platform" )
- noplatform_eggs = self.config.items( "eggs:noplatform" )
- except ConfigParser.NoSectionError, e:
- raise Exception( "eggs.ini is missing required section: %s" % e )
- self.parse_egg_section( platform_eggs, self.platform )
- self.parse_egg_section( noplatform_eggs, self.noplatform )
- def parse_egg_section( self, eggs, platform ):
+ self.config.read( Crate.config_file )
+ self.repo = self.config.get( 'general', 'repository' )
+ self.no_auto = self.config.get( 'general', 'no_auto' ).split()
+ self.parse_egg_section( self.config.items( 'eggs:platform' ), self.config.items( 'tags' ), True )
+ self.parse_egg_section( self.config.items( 'eggs:noplatform' ), self.config.items( 'tags' ) )
+ def parse_egg_section( self, eggs, tags, full_platform=False, egg_class=Egg ):
for name, version in eggs:
- egg = Egg()
+ tag = dict( tags ).get( name, '' )
+ url = '/'.join( ( self.repo, name ) )
+ if full_platform:
+ platform = '-'.join( ( py, pkg_resources.get_platform() ) )
+ else:
+ platform = py
+ egg = egg_class( name, version, tag, url, platform )
+ self.eggs[name] = egg
+ @property
+ def config_missing( self ):
+ """
+ Return true if any eggs are missing, conditional on options set in the
+ Galaxy config file.
+ """
+ for egg in self.config_eggs:
+ if not egg.path:
+ return True
+ return False
+ @property
+ def all_missing( self ):
+ """
+ Return true if any eggs in the eggs config file are missing.
+ """
+ for egg in self.all_eggs:
+ if not os.path.exists( egg.distribution.location ):
+ return True
+ return False
+ @property
+ def config_names( self ):
+ """
+ Return a list of names of all eggs in the crate that are needed based
+ on the options set in the Galaxy config file.
+ """
+ return [ egg.name for egg in self.config_eggs ]
+ @property
+ def all_names( self ):
+ """
+ Return a list of names of all eggs in the crate.
+ """
+ return [ egg.name for egg in self.all_eggs ]
+ @property
+ def config_eggs( self ):
+ """
+ Return a list of all eggs in the crate that are needed based on the
+ options set in the Galaxy config file.
+ """
+ return [ egg for egg in self.eggs.values() if self.galaxy_config.check_conditional( egg.name ) ]
+ @property
+ def all_eggs( self ):
+ """
+ Return a list of all eggs in the crate.
+ """
+ rval = []
+ for egg in self.eggs.values():
+ if egg.name not in self.galaxy_config.always_conditional:
+ rval.append( egg )
+ elif self.galaxy_config.check_conditional( egg.name ):
+ rval.append( egg )
+ return rval
+ def __getitem__( self, name ):
+ """
+ Return a specific egg.
+ """
+ name = name.replace( '-', '_' )
+ return self.eggs[name]
+ def resolve( self, all=False ):
+ """
+ Try to resolve (e.g. fetch) all eggs in the crate.
+ """
+ if all:
+ eggs = self.all_eggs
+ else:
+ eggs = self.config_eggs
+ eggs = filter( lambda x: x.name not in self.no_auto, eggs )
+ missing = []
+ for egg in eggs:
try:
- egg.tag = self.config.get( "tags", name )
+ egg.resolve()
except:
- egg.tag = None
- try:
- egg.sources = self.config.get( "source", name ).split()
- except:
- egg.sources = None
- egg.name = name
- egg.version = version
- egg.platform['galaxy'] = platform['galaxy']
- egg.platform['peak'] = platform['peak']
- egg.url = "%s/%s/%s" %( self.repo, platform['galaxy'], egg.get_filename() )
- self.eggs[name] = egg
- def find( self, ignore=None ):
- missing = []
- for egg in self.eggs.itervalues():
- if ignore is not None:
- if egg.name in ignore:
- continue
- egg.find()
- if not egg.have:
- missing.append( egg.name )
- if len( missing ):
- return False
- return True
- def fetch( self, ignore=[] ):
- """
- Fetch all eggs in the crate (ignoring any that you want to
- ignore). If your platform isn't available, it'll attempt to
- download all the noplatform eggs before failing.
- """
- skip_platform = False
- ignore.extend( self.no_auto )
- missing = []
- try:
- f = urllib2.urlopen( "%s/%s" % ( self.repo, self.platform['galaxy'] ) )
- f.close()
- except urllib2.HTTPError, e:
- if e.code == 404:
- skip_platform = True
- for egg in self.eggs.itervalues():
- if ignore is not None:
- if egg.name in ignore:
- continue
- if skip_platform and egg.platform['galaxy'] == self.platform['galaxy']:
- missing.append( egg.name )
- continue
- try:
- egg.fetch()
- except EggNotFetchable:
- missing.append( egg.name )
- if skip_platform:
- raise PlatformNotSupported( self.platform['galaxy'] )
+ missing.append( egg )
if missing:
raise EggNotFetchable( missing )
- return True
- def scramble( self, ignore=None ):
- # Crate-scrambling the no_auto eggs makes no sense
- ignore.extend( self.no_auto )
- for egg in self.eggs.itervalues():
- if ignore is not None:
- if egg.name in ignore:
- continue
- if not egg.scramble():
- return False
- return True
- def get_names( self ):
- return self.eggs.keys()
- def get( self, name ):
- if self.eggs.has_key( name ):
- return self.eggs[name]
- else:
- return None
- def get_for_require( self, name ):
- """
- return an egg based on a lowercase name comparo and with _ instead of -. used by require.
- """
- for key in self.eggs.keys():
- if key.lower() == name.lower().replace( '-', '_' ):
- return self.eggs[key]
-class DistCrate( Crate ):
- """
- A subclass of Crate that holds eggs with info on how to build them for distribution.
- """
- dist_config_file = os.path.join( galaxy_dir, "dist-eggs.ini" )
- def __init__( self, build_on="all" ):
- self.eggs = {}
- self.config = CSConfigParser()
- self.repo = None
- self.build_on = build_on
- self.platform = 'platform'
- self.noplatform = 'noplatform'
- def parse( self ):
- if self.config.read( DistCrate.dist_config_file ) == []:
- raise Exception( "unable to read dist egg config from %s" % DistCrate.dist_config_file )
- try:
- self.hosts = dict( self.config.items( "hosts" ) )
- self.groups = dict( self.config.items( "groups" ) )
- self.ignore = dict( self.config.items( "ignore" ) )
- except ConfigParser.NoSectionError, e:
- raise Exception( "eggs.ini is missing required section: %s" % e )
- self.platforms = self.get_platforms( self.build_on )
- self.noplatforms = self.get_platforms( 'noplatform' )
- Crate.parse( self )
- def get_platforms( self, wanted ):
- # find all the members of a group and process them
- if self.groups.has_key( wanted ):
- platforms = []
- for name in self.groups[wanted].split():
- for platform in self.get_platforms( name ):
- if platform not in platforms:
- platforms.append( platform )
- return platforms
- elif self.hosts.has_key( wanted ):
- return [ wanted ]
- else:
- raise Exception( "unknown platform: %s" % wanted )
- def parse_egg_section( self, eggs, type ):
- """
- Overrides the base class's method. Here we use the third arg
- to find out what type of egg we'll be building.
- """
- if type == "platform":
- platforms = self.platforms
- elif type == "noplatform":
- platforms = self.noplatforms
- for name, version in eggs:
- for platform in platforms:
- # can't use the regular methods here because we're not
- # actually ON the target platform
- if type == "platform":
- gplat = platform
- pplat = platform.rsplit('-', 1)[0]
- elif type == "noplatform":
- gplat = "%s-noplatform" % platform.split('-', 1)[0]
- pplat = platform.split('-', 1)[0]
- if name in self.ignore and gplat in self.ignore[name].split():
- continue
- egg = Egg()
- try:
- egg.tag = self.config.get( "tags", name )
- except:
- egg.tag = None
- try:
- egg.sources = self.config.get( "source", name ).split()
- except:
- egg.sources = None
- egg.name = name
- egg.version = version
- egg.platform['galaxy'] = gplat
- egg.platform['peak'] = pplat
- egg.url = "%s/%s/%s" %( self.repo, gplat, egg.get_filename() )
- egg.build_host, egg.python = self.hosts[platform].split()
- if not self.eggs.has_key( name ):
- self.eggs[name] = [ egg ]
- else:
- self.eggs[name].append( egg )
-
-class GalaxyConfig:
+class GalaxyConfig( object ):
config_file = os.path.join( galaxy_dir, "universe_wsgi.ini" )
- always_conditional = ( 'GeneTrack', )
+ always_conditional = ( 'GeneTrack', 'pysam' )
def __init__( self ):
self.config = ConfigParser.ConfigParser()
if self.config.read( GalaxyConfig.config_file ) == []:
raise Exception( "error: unable to read Galaxy config from %s" % GalaxyConfig.config_file )
- # TODO: conditionals should really be handled better than this
def check_conditional( self, egg_name ):
+ def check_pysam():
+ # can't build pysam on solaris < 10
+ plat = pkg_resources.get_platform().split( '-' )
+ if plat[0] == 'solaris':
+ minor = plat[1].split('.')[1]
+ if int( minor ) < 10:
+ return False
+ return True
if egg_name == "pysqlite":
# SQLite is different since it can be specified in two config vars and defaults to True
try:
@@ -484,102 +317,45 @@
"threadframe": lambda: self.config.get( "app:main", "use_heartbeat" ),
"guppy": lambda: self.config.get( "app:main", "use_memdump" ),
"GeneTrack": lambda: sys.version_info[:2] >= ( 2, 5 ),
+ "pysam": check_pysam()
}.get( egg_name, lambda: True )()
except:
return False
-def require( pkg ):
- # add the egg dirs to sys.path if they're not already there
- for platform in [ get_platform(), get_platform( platform=True ) ]:
- path = os.path.join( galaxy_dir, "eggs", platform )
- if path not in sys.path:
- new_path = [ path ]
- new_path.extend( sys.path )
- sys.path = new_path
- pkg_resources.working_set.add_entry(path)
- name = pkg_resources.Requirement.parse( pkg ).project_name
+def get_env():
+ env = pkg_resources.Environment( platform=pkg_resources.get_platform() )
+ for dist in pkg_resources.find_distributions( os.path.join( galaxy_dir, 'eggs' ), False ):
+ env.add( dist )
+ return env
+env = get_env()
+
+def require( req_str ):
c = Crate()
- c.parse()
- egg = c.get_for_require( name )
+ req = pkg_resources.Requirement.parse( req_str )
try:
- if egg is None:
- return pkg_resources.working_set.require( pkg )
- else:
- return pkg_resources.working_set.require( "%s==%s" % ( name, egg.get_vertag() ) )
- except pkg_resources.VersionConflict, e:
- # there's a conflicting egg on the pythonpath, remove it
- dist = e.args[0]
- working_set = pkg_resources.working_set
- # use the canonical path for comparisons
- location = os.path.realpath( dist.location )
- for entry in working_set.entries:
- if os.path.realpath( entry ) == location:
- working_set.entries.remove( entry )
- break
- else:
- location = None
- del working_set.by_key[dist.key]
- working_set.entry_keys[entry] = []
- try:
- sys.path.remove(entry)
- except ValueError:
- raise Exception( "Cannot remove entry: %s" % str(entry) )
- r = require( pkg )
- if location is not None and not location.endswith( '.egg' ):
- # re-add the path if it's a non-egg dir, in case more deps live there
- working_set.entries.append( location ) # re-add to the set if it's a dir.
- sys.path.append( location ) # re-add to the set if it's a dir.
- return r
- except pkg_resources.DistributionNotFound, e:
- # the initial require itself is the first dep, but it can have
- # multiple deps, which will be fetched by the require below.
- dep = pkg_resources.Requirement.parse( str( e ) ).project_name
- egg = c.get_for_require( dep )
- if egg is None:
- # we don't have it and we can't get it
- raise
- egg.find()
- if not egg.have:
- if not egg.fetch():
- raise EggNotFetchable( egg.name )
- return require( pkg )
+ return c[req.project_name].require()
+ except KeyError:
+ # not a galaxy-owned dependency
+ return pkg_resources.working_set.require( req_str )
+ except EggNotFetchable, e:
+ raise EggNotFetchable( str( [ egg.name for egg in e.eggs ] ) )
+pkg_resources.require = require
-# convenience stuff
-def get_ucs():
- if sys.maxunicode > 65535:
- return "ucs4"
- else:
- return "ucs2"
-
-def get_py():
- return "py%s" % sys.version[:3]
-
-def get_noplatform():
- return "%s-noplatform" % get_py()
-
-def get_platform( platform=False, peak=False ):
- if platform:
- if peak:
- return "%s-%s" % ( get_py(), pkg_resources.get_platform() )
- else:
- return "%s-%s-%s" % ( get_py(), pkg_resources.get_platform(), get_ucs() )
- else:
- if peak:
- return get_py()
- else:
- return "%s-noplatform" % get_py()
-
-def unpack_zipfile( filename, extract_dir):
+def unpack_zipfile( filename, extract_dir, ignores=[] ):
z = zipfile.ZipFile(filename)
try:
for info in z.infolist():
name = info.filename
+ perm = (info.external_attr >> 16L) & 0777
# don't extract absolute paths or ones with .. in them
if name.startswith('/') or '..' in name:
continue
target = os.path.join(extract_dir, *name.split('/'))
if not target:
continue
+ for ignore in ignores:
+ if ignore in name:
+ continue
if name.endswith('/'):
# directory
pkg_resources.ensure_directory(target)
@@ -593,6 +369,11 @@
finally:
f.close()
del data
+ try:
+ if not os.path.islink():
+ os.chmod(target, mode)
+ except:
+ pass
finally:
z.close()
@@ -601,5 +382,3 @@
shutil.rmtree( f )
else:
os.remove( f )
-
-pkg_resources.require = require
diff -r a6c9862ece3d -r 0cb68935eede lib/galaxy/eggs/dist.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/eggs/dist.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,86 @@
+"""
+Manage Galaxy eggs
+"""
+
+import os, sys, subprocess
+from scramble import ScrambleEgg, ScrambleCrate, ScrambleFailure, galaxy_dir, py
+from __init__ import Crate, CaseSensitiveConfigParser
+
+import logging
+log = logging.getLogger( __name__ )
+
+class DistScrambleEgg( ScrambleEgg ):
+ def set_dir( self ):
+ self.dir = os.path.join( galaxy_dir, 'dist-eggs', self.name )
+ if not os.path.exists( self.dir ):
+ os.makedirs( self.dir )
+ @property
+ def path( self ):
+ # don't look for compatible eggs, look for exact matches
+ if os.path.exists( self.distribution.location ):
+ return self.distribution.location
+ return None
+ def run_scramble_script( self ):
+ log.warning( "%s(): Beginning build" % sys._getframe().f_code.co_name )
+ # subprocessed to sterilize the env
+ cmd = "ssh %s 'cd %s; %s -ES %s'" % ( self.build_host, self.buildpath, self.python, 'scramble.py' )
+ log.debug( '%s(): Executing:' % sys._getframe().f_code.co_name )
+ log.debug( ' %s' % cmd )
+ p = subprocess.Popen( args = cmd, shell = True )
+ r = p.wait()
+ if r != 0:
+ raise ScrambleFailure( "%s(): Egg build failed for %s %s" % ( sys._getframe().f_code.co_name, self.name, self.version ) )
+ def unpack_if_needed( self ):
+ return # do not unpack dist eggs
+
+class DistScrambleCrate( ScrambleCrate ):
+ """
+ Holds eggs with info on how to build them for distribution.
+ """
+ dist_config_file = os.path.join( galaxy_dir, 'dist-eggs.ini' )
+ def __init__( self, build_on='all' ):
+ self.dist_config = CaseSensitiveConfigParser()
+ self.build_on = build_on
+ ScrambleCrate.__init__( self )
+ def parse( self ):
+ self.dist_config.read( DistScrambleCrate.dist_config_file )
+ self.hosts = dict( self.dist_config.items( 'hosts' ) )
+ self.groups = dict( self.dist_config.items( 'groups' ) )
+ self.ignore = dict( self.dist_config.items( 'ignore' ) )
+ self.platforms = self.get_platforms( self.build_on )
+ self.noplatforms = self.get_platforms( 'noplatform' )
+ Crate.parse( self )
+ def get_platforms( self, wanted ):
+ # find all the members of a group and process them
+ if self.groups.has_key( wanted ):
+ platforms = []
+ for name in self.groups[wanted].split():
+ for platform in self.get_platforms( name ):
+ if platform not in platforms:
+ platforms.append( platform )
+ return platforms
+ elif self.hosts.has_key( wanted ):
+ return [ wanted ]
+ else:
+ raise Exception( "unknown platform: %s" % wanted )
+ def parse_egg_section( self, eggs, tags, full_platform=False ):
+ for name, version in eggs:
+ self.eggs[name] = []
+ tag = dict( tags ).get( name, '' )
+ url = '/'.join( ( self.repo, name ) )
+ try:
+ sources = self.config.get( 'source', name ).split()
+ except:
+ sources = []
+ if full_platform:
+ platforms = self.platforms
+ else:
+ platforms = self.noplatforms
+ for platform in platforms:
+ if name in self.ignore and platform in self.ignore[name].split():
+ continue
+ egg = DistScrambleEgg( name, version, tag, url, platform )
+ host_info = self.hosts[platform].split()
+ egg.build_host, egg.python = host_info[:2]
+ egg.sources = sources
+ self.eggs[name].append( egg )
diff -r a6c9862ece3d -r 0cb68935eede lib/galaxy/eggs/scramble.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/eggs/scramble.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,234 @@
+"""
+Manage Galaxy eggs
+"""
+
+import os, sys, shutil, tempfile, subprocess, urlparse, urllib
+from __init__ import Egg, Crate, URLRetriever, galaxy_dir, py, unpack_zipfile
+from distutils.sysconfig import get_config_var
+
+import tarfile, zipfile, zlib
+arctypes = ( 'tar.gz', 'tgz', 'zip' )
+
+import logging
+log = logging.getLogger( __name__ )
+
+import pkg_resources
+
+class ScrambleFailure( Exception ):
+ def __init__( self, eggs, msg=None ):
+ if type( eggs ) in ( list, tuple ):
+ self.eggs = eggs
+ else:
+ self.eggs = [ eggs ]
+ self.msg = msg
+ def __str__( self ):
+ return self.msg or ' '.join( self.eggs )
+
+class ScrambleEgg( Egg ):
+ """
+ Contains information about scrambling eggs.
+ """
+ scramble_dir = os.path.join( galaxy_dir, 'scripts', 'scramble' )
+ archive_dir = os.path.join( scramble_dir, 'archives' )
+ script_dir = os.path.join( scramble_dir, 'scripts' )
+ build_dir = os.path.join( scramble_dir, 'build' )
+ ez_setup = os.path.join( scramble_dir, 'lib', 'ez_setup.py' )
+ ez_setup_url = 'http://peak.telecommunity.com/dist/ez_setup.py'
+ def __init__( self, *args, **kwargs ):
+ Egg.__init__( self, *args, **kwargs )
+ self.sources = []
+ self.buildpath = None
+ self.source_path = None
+ self.py = py
+ self.build_host = None
+ self.python = sys.executable
+ def scramble( self ):
+ if self.path:
+ log.warning( "%s(): Egg already exists, remove to force rebuild:" % sys._getframe().f_code.co_name )
+ log.warning( " %s" % self.path )
+ return
+ self.fetch_source()
+ self.unpack_source()
+ self.copy_build_script()
+ if not os.path.exists( ScrambleEgg.ez_setup ):
+ URLRetriever().retrieve( ScrambleEgg.ez_setup_url, ScrambleEgg.ez_setup )
+ shutil.copyfile( ScrambleEgg.ez_setup, os.path.join( self.buildpath, 'ez_setup.py' ) )
+ self.run_scramble_script()
+ new_egg = os.path.join( self.buildpath, 'dist', os.path.basename( self.distribution.location ) )
+ if not os.path.exists( new_egg ):
+ raise ScrambleFailure( self, "%s(): Egg build for %s did not appear to fail, but no egg found to copy from expected path:\n %s" % ( sys._getframe().f_code.co_name, self.name, egg_name ) )
+ shutil.copyfile( new_egg, self.distribution.location )
+ log.warning( "%s(): Copied egg to:" % sys._getframe().f_code.co_name )
+ log.warning( " %s" % self.distribution.location )
+ self.unpack_if_needed()
+ self.remove_doppelgangers()
+ # scramble helper methods
+ def get_tld( self, names ):
+ tld = names[0].split( os.path.sep, 1 )[0]
+ for name in names:
+ try:
+ assert tld == name.split( os.path.sep, 1 )[0]
+ except:
+ raise Exception( "%s(): Archive contains multiple top-level directories!" % sys._getframe().f_code.co_name )
+ return tld
+ def fetch_one( self, urls ):
+ """
+ Fetches the first available archive out of a list.
+ """
+ for url in urls:
+ file = os.path.join( ScrambleEgg.archive_dir, ( urllib.unquote( url ).rsplit( '/', 1 ) )[-1] )
+ if os.path.exists( file ):
+ log.warning( "%s(): Using existing source, remove to download again:" % sys._getframe().f_code.co_name )
+ log.warning( " %s" % file )
+ return file
+ # if we don't have one, get one
+ for url in urls:
+ file = os.path.join( ScrambleEgg.archive_dir, ( urllib.unquote( url ).rsplit( '/', 1 ) )[-1] )
+ try:
+ log.debug( "%s(): Trying to fetch:" % sys._getframe().f_code.co_name )
+ log.debug( " %s" % url )
+ URLRetriever().retrieve( url, file + '.download' )
+ shutil.move( file + '.download', file )
+ log.debug( "%s(): Fetched to:" % sys._getframe().f_code.co_name )
+ log.debug( " %s" % file )
+ return file
+ except IOError, e:
+ if e[1] != 404:
+ raise
+ else:
+ return None
+ def fetch_source( self ):
+ """
+ Get egg (and dependent) source
+ """
+ if not os.path.exists( ScrambleEgg.archive_dir ):
+ os.makedirs( ScrambleEgg.archive_dir )
+ urls = []
+ url_base = self.url + '/' + '-'.join( ( self.name, self.version ) )
+ urls.extend( map( lambda x: '.'.join( ( url_base, x ) ), arctypes ) )
+ if self.tag:
+ urls.extend( map( lambda x: '.'.join( ( url_base + self.tag, x ) ), arctypes ) )
+ self.source_path = self.fetch_one( urls )
+ if self.source_path is None:
+ raise Exception( "%s(): Couldn't find a suitable source archive for %s %s from %s" % ( sys._getframe().f_code.co_name, self.name, self.version, self.url ) )
+ for url in self.sources:
+ if not urlparse.urlparse( url )[0]:
+ url = self.url + '/' + url.lstrip( '/' )
+ urls = [ url ]
+ urls.extend( map( lambda x: '.'.join( ( url, x ) ), arctypes ) ) # allows leaving off the extension and we'll try to find one
+ file = self.fetch_one( urls )
+ if file is None:
+ raise Exception( "%s(): Couldn't fetch extra source for %s, check path in %s. URL(s) attempted output above." % ( sys._getframe().f_code.co_name, self.name, Crate.config_file, ) )
+ def unpack_source( self ):
+ unpack_dir = os.path.join( ScrambleEgg.build_dir, self.platform )
+ if not os.path.exists( unpack_dir ):
+ os.makedirs( unpack_dir )
+ self.buildpath = os.path.join( unpack_dir, self.name )
+ if os.path.exists( self.buildpath ):
+ log.warning( "%s(): Removing old build directory at:" % sys._getframe().f_code.co_name )
+ log.warning( " %s" % self.buildpath )
+ shutil.rmtree( self.buildpath )
+ if tarfile.is_tarfile( self.source_path ):
+ self.unpack_tar()
+ elif zipfile.is_zipfile( self.source_path ):
+ self.unpack_zip()
+ else:
+ raise Exception( "%s(): Unknown archive file type for %s" % ( sys._getframe().f_code.co_name, source_path ) )
+ log.warning( "%s(): Unpacked to:" % sys._getframe().f_code.co_name )
+ log.warning( " %s" % self.buildpath )
+ def unpack_zip( self ):
+ unpack_path = os.path.dirname( self.buildpath )
+ tld = self.get_tld( zipfile.ZipFile( self.source_path, 'r' ).namelist() )
+ unpack_zipfile( self.source_path, unpack_path, ( 'ez_setup', ) )
+ os.rename( os.path.join( unpack_path, tld ), self.buildpath )
+ def unpack_tar( self ):
+ unpack_path = os.path.dirname( self.buildpath )
+ t = tarfile.open( self.source_path, "r" )
+ members = filter( lambda x: "ez_setup" not in x.name and "pax_global_header" != x.name, t.getmembers() )
+ tld = self.get_tld( [ x.name for x in members ] )
+ cur = os.getcwd()
+ os.chdir( unpack_path )
+ for member in members:
+ t.extract( member )
+ t.close()
+ os.rename( tld, self.name )
+ os.chdir( cur )
+ def copy_build_script( self ):
+ # will try:
+ # bx_python-py2.4-solaris-2.11-i86pc.py
+ # bx_python-py2.4-solaris.py
+ # bx_python-solaris-2.11-i86pc.py
+ # bx_python-solaris.py
+ # bx_python-py2.4.py
+ # bx_python.py
+ # generic.py
+ platform = self.platform.replace( '-ucs2', '' ).replace( '-ucs4', '' ) # ucs is unimportant here
+ build_scripts = (
+ "%s-%s.py" % ( self.name, platform ),
+ "%s-%s.py" % ( self.name, '-'.join( platform.split( '-' )[:2] ) ),
+ "%s-%s.py" % ( self.name, '-'.join( platform.split( '-' )[1:] ) ),
+ "%s-%s.py" % ( self.name, self.py ),
+ "%s-%s.py" % ( self.name, platform.split( '-' )[0] ),
+ "%s.py" % self.name,
+ "generic.py" )
+ for build_script in build_scripts:
+ build_script = os.path.join( ScrambleEgg.script_dir, build_script )
+ if os.path.exists( build_script ):
+ log.warning( "%s(): Using build script %s" % ( sys._getframe().f_code.co_name, build_script ) )
+ break
+ shutil.copyfile( build_script, os.path.join( self.buildpath, "scramble.py" ) )
+ verfile = open( os.path.join( self.buildpath, ".galaxy_ver" ), "w" )
+ verfile.write( self.version + '\n' )
+ verfile.close()
+ if self.tag is not None:
+ tagfile = open( os.path.join( self.buildpath, ".galaxy_tag" ), "w" )
+ tagfile.write( self.tag + '\n' )
+ tagfile.close()
+ def run_scramble_script( self ):
+ log.warning( "%s(): Beginning build" % sys._getframe().f_code.co_name )
+ # subprocessed to sterilize the env
+ cmd = "%s -ES %s" % ( self.python, "scramble.py" )
+ log.debug( '%s(): Executing in %s:' % ( sys._getframe().f_code.co_name, self.buildpath ) )
+ log.debug( ' %s' % cmd )
+ p = subprocess.Popen( args = cmd, shell = True, cwd = self.buildpath )
+ r = p.wait()
+ if r != 0:
+ if sys.platform == 'sunos5' and get_config_var('CC').endswith('pycc') and not os.environ.get( 'PYCC_CC', None ):
+ log.error( "%s(): Your python interpreter was compiled with Sun's pycc" % sys._getframe().f_code.co_name )
+ log.error( " pseudo-compiler. You may need to set PYCC_CC and PYCC_CXX in your" )
+ log.error( " environment if your compiler is in a non-standard location." )
+ raise ScrambleFailure( self, "%s(): Egg build failed for %s %s" % ( sys._getframe().f_code.co_name, self.name, self.version ) )
+
+class ScrambleCrate( Crate ):
+ """
+ Reads the eggs.ini file for use with scrambling eggs.
+ """
+ def parse( self ):
+ Crate.parse( self )
+ # get dependency sources
+ for egg in self.eggs.values():
+ try:
+ egg.sources = self.config.get( "source", egg.name ).split()
+ except:
+ egg.sources = []
+ def parse_egg_section( self, *args, **kwargs ):
+ kwargs['egg_class'] = ScrambleEgg
+ Crate.parse_egg_section( self, *args, **kwargs )
+ def scramble( self, all=False ):
+ if all:
+ eggs = self.all_eggs
+ else:
+ eggs = self.config_eggs
+ eggs = filter( lambda x: x.name not in self.no_auto, eggs )
+ failed = []
+ for egg in eggs:
+ try:
+ egg.scramble()
+ except Exception, e:
+ failed.append( egg )
+ last_exc = e
+ if failed:
+ if len( failed ) == 1:
+ raise last_exc # only 1 failure out of the crate, be more informative
+ else:
+ raise ScrambleFailure( failed )
diff -r a6c9862ece3d -r 0cb68935eede manage_db.sh
--- a/manage_db.sh Mon Mar 01 13:30:37 2010 -0500
+++ b/manage_db.sh Mon Mar 01 15:41:30 2010 -0500
@@ -6,4 +6,4 @@
#######
cd `dirname $0`
-`python ./scripts/check_python.py` ./scripts/manage_db.py $@
+python ./scripts/manage_db.py $@
diff -r a6c9862ece3d -r 0cb68935eede run.sh
--- a/run.sh Mon Mar 01 13:30:37 2010 -0500
+++ b/run.sh Mon Mar 01 15:41:30 2010 -0500
@@ -2,18 +2,16 @@
cd `dirname $0`
-CLEAN_PYTHON=`python ./scripts/check_python.py`
-
# explicitly attempt to fetch eggs before running
FETCH_EGGS=1
for arg in "$@"; do
[ "$arg" = "--stop-daemon" ] && FETCH_EGGS=0; break
done
if [ $FETCH_EGGS -eq 1 ]; then
- $CLEAN_PYTHON ./scripts/check_eggs.py quiet
+ python ./scripts/check_eggs.py quiet
if [ $? -ne 0 ]; then
echo "Some eggs are out of date, attempting to fetch..."
- $CLEAN_PYTHON ./scripts/fetch_eggs.py
+ python ./scripts/fetch_eggs.py
if [ $? -eq 0 ]; then
echo "Fetch successful."
else
@@ -22,4 +20,4 @@
fi
fi
fi
-$CLEAN_PYTHON ./scripts/paster.py serve universe_wsgi.ini $@
+python ./scripts/paster.py serve universe_wsgi.ini $@
diff -r a6c9862ece3d -r 0cb68935eede run_functional_tests.sh
--- a/run_functional_tests.sh Mon Mar 01 13:30:37 2010 -0500
+++ b/run_functional_tests.sh Mon Mar 01 15:41:30 2010 -0500
@@ -4,10 +4,8 @@
rm -f run_functional_tests.log
-CLEAN_PYTHON=`python ./scripts/check_python.py`
-
if [ ! $1 ]; then
- $CLEAN_PYTHON ./scripts/functional_tests.py -v --with-nosehtml --html-report-file run_functional_tests.html --exclude="^get" functional
+ python ./scripts/functional_tests.py -v --with-nosehtml --html-report-file run_functional_tests.html --exclude="^get" functional
elif [ $1 = 'help' ]; then
echo "'run_functional_tests.sh' for testing all the tools in functional directory"
echo "'run_functional_tests.sh aaa' for testing one test case of 'aaa' ('aaa' is the file name with path)"
@@ -15,16 +13,16 @@
echo "'run_functional_tests.sh -sid ccc' for testing one section with sid 'ccc' ('ccc' is the string after 'section::')"
echo "'run_functional_tests.sh -list' for listing all the tool ids"
elif [ $1 = '-id' ]; then
- $CLEAN_PYTHON ./scripts/functional_tests.py -v functional.test_toolbox:TestForTool_$2 --with-nosehtml --html-report-file run_functional_tests.html
+ python ./scripts/functional_tests.py -v functional.test_toolbox:TestForTool_$2 --with-nosehtml --html-report-file run_functional_tests.html
elif [ $1 = '-sid' ]; then
- $CLEAN_PYTHON ./scripts/functional_tests.py --with-nosehtml --html-report-file run_functional_tests.html -v `python tool_list.py $2`
+ python ./scripts/functional_tests.py --with-nosehtml --html-report-file run_functional_tests.html -v `python tool_list.py $2`
elif [ $1 = '-list' ]; then
python tool_list.py
echo "==========================================================================================================================================="
echo "'run_functional_tests.sh -id bbb' for testing one tool with id 'bbb' ('bbb' is the tool id)"
echo "'run_functional_tests.sh -sid ccc' for testing one section with sid 'ccc' ('ccc' is the string after 'section::')"
else
- $CLEAN_PYTHON ./scripts/functional_tests.py -v --with-nosehtml --html-report-file run_functional_tests.html $1
+ python ./scripts/functional_tests.py -v --with-nosehtml --html-report-file run_functional_tests.html $1
fi
echo "'run_functional_tests.sh help' for help"
diff -r a6c9862ece3d -r 0cb68935eede run_reports.sh
--- a/run_reports.sh Mon Mar 01 13:30:37 2010 -0500
+++ b/run_reports.sh Mon Mar 01 15:41:30 2010 -0500
@@ -1,5 +1,4 @@
#!/bin/sh
cd `dirname $0`
-
-`python ./scripts/check_python.py` ./scripts/paster.py serve reports_wsgi.ini --pid-file=reports_webapp.pid --log-file=reports_webapp.log $@
+python ./scripts/paster.py serve reports_wsgi.ini --pid-file=reports_webapp.pid --log-file=reports_webapp.log $@
diff -r a6c9862ece3d -r 0cb68935eede run_unit_tests.sh
--- a/run_unit_tests.sh Mon Mar 01 13:30:37 2010 -0500
+++ b/run_unit_tests.sh Mon Mar 01 15:41:30 2010 -0500
@@ -2,6 +2,6 @@
## Excluding controllers due to the problematic genetrack dependency
-`python ./scripts/check_python.py` ./scripts/nosetests.py -v -w lib \
+python ./scripts/nosetests.py -v -w lib \
--with-nosehtml --html-report-file run_unit_tests.html \
--with-doctest --exclude=functional --exclude="^get" --exclude=controllers
diff -r a6c9862ece3d -r 0cb68935eede scripts/check_eggs.py
--- a/scripts/check_eggs.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/check_eggs.py Mon Mar 01 15:41:30 2010 -0500
@@ -17,16 +17,10 @@
except:
quiet = False
-from galaxy.eggs import *
+from galaxy.eggs import Crate
c = Crate()
-c.parse()
-galaxy_config = GalaxyConfig()
-ignore = []
-for name in c.get_names():
- if not galaxy_config.check_conditional( name ):
- ignore.append( name )
-if not c.find( ignore=ignore ):
+if c.config_missing:
if not quiet:
print "Some of your Galaxy eggs are out of date. Please update them"
print "by running:"
diff -r a6c9862ece3d -r 0cb68935eede scripts/check_python.py
--- a/scripts/check_python.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/check_python.py Mon Mar 01 15:41:30 2010 -0500
@@ -6,13 +6,6 @@
supported version is installed but is not your default, getgalaxy.org
contains instructions on how to force Galaxy to use a different version.""" % sys.version[:3]
-def check_virtualenv():
- try:
- assert sys.real_prefix
- return 'python -E'
- except:
- return 'python -ES'
-
def check_python():
try:
assert sys.version_info[:2] >= ( 2, 4 ) and sys.version_info[:2] <= ( 2, 6 )
@@ -21,9 +14,9 @@
raise
if __name__ == '__main__':
+ rval = 0
try:
check_python()
- print check_virtualenv()
- sys.exit( 0 )
except StandardError:
- sys.exit( 1 )
+ rval = 1
+ sys.exit( rval )
diff -r a6c9862ece3d -r 0cb68935eede scripts/dist-scramble.py
--- a/scripts/dist-scramble.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/dist-scramble.py Mon Mar 01 15:41:30 2010 -0500
@@ -11,28 +11,30 @@
root.setLevel( 10 )
root.addHandler( logging.StreamHandler( sys.stdout ) )
-lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "lib" ) )
+lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), '..', 'lib' ) )
sys.path.append( lib )
-from galaxy.eggs import DistCrate
+from galaxy.eggs.dist import DistScrambleCrate, ScrambleFailure
if len( sys.argv ) > 3 or len( sys.argv ) < 2:
print __doc__
sys.exit( 1 )
elif len( sys.argv ) == 3:
- c = DistCrate( sys.argv[2] )
+ c = DistScrambleCrate( sys.argv[2] )
else:
- c = DistCrate()
+ c = DistScrambleCrate()
-c.parse()
-egg_list = c.get( sys.argv[1] )
-if egg_list is None:
+try:
+ eggs = c[sys.argv[1]]
+except:
print "error: %s not in eggs.ini" % sys.argv[1]
sys.exit( 1 )
failed = []
-for egg in egg_list:
- if not egg.scramble( dist=True ):
- failed.append( egg.platform['galaxy'] )
+for egg in eggs:
+ try:
+ egg.scramble()
+ except ScrambleFailure:
+ failed.append( egg.platform )
if len( failed ):
print ""
print "Scramble failed to build eggs on the following platforms (more details"
diff -r a6c9862ece3d -r 0cb68935eede scripts/fetch_eggs.py
--- a/scripts/fetch_eggs.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/fetch_eggs.py Mon Mar 01 15:41:30 2010 -0500
@@ -18,39 +18,43 @@
lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "lib" ) )
sys.path.append( lib )
-from galaxy.eggs import *
+from galaxy.eggs import Crate, EggNotFetchable
+import pkg_resources
c = Crate()
-if len( sys.argv ) == 3:
- c.platform = { 'peak' : sys.argv[2].rsplit('-',1)[0], 'galaxy' : sys.argv[2] }
-c.parse()
try:
- galaxy_config = GalaxyConfig()
- names = []
+ c.platform = sys.argv[2]
+except:
+ pass
+try:
if len( sys.argv ) == 1:
- names = c.get_names()
+ c.resolve() # Only fetch eggs required by the config
elif sys.argv[1] == 'all':
- names = galaxy_config.always_conditional
+ c.resolve( all=True ) # Fetch everything
else:
# Fetch a specific egg
- egg = c.get( sys.argv[1] )
- if egg is None:
- print "error: %s not in eggs.ini" % sys.argv[1]
+ name = sys.argv[1]
+ try:
+ egg = c[name]
+ except:
+ print "error: %s not in eggs.ini" % name
sys.exit( 1 )
- egg.fetch()
- sys.exit( 0 )
- ignore = filter( lambda x: not galaxy_config.check_conditional( x ), list( names ) )
- c.fetch( ignore )
+ dist = egg.resolve()[0]
+ print "%s %s is installed at %s" % ( dist.project_name, dist.version, dist.location )
except EggNotFetchable, e:
- print "One or more of the python eggs necessary to run Galaxy couldn't be"
- print "downloaded automatically. You may want to try building them by"
- print "hand with:"
- for egg in e.eggs:
- print " python scripts/scramble.py %s" % egg
+ try:
+ assert sys.argv[1] != 'all'
+ egg = e.eggs[0]
+ print "%s %s couldn't be downloaded automatically. You can try" % ( egg.name, egg.version )
+ print "building it by hand with:"
+ print " python scripts/scramble.py %s"
+ except ( AssertionError, IndexError ):
+ print "One or more of the python eggs necessary to run Galaxy couldn't be"
+ print "downloaded automatically. You can try building them by hand (all"
+ print "at once) with:"
+ print " python scripts/scramble.py"
+ print "Or individually:"
+ for egg in e.eggs:
+ print " python scripts/scramble.py %s" % egg.name
sys.exit( 1 )
-except PlatformNotSupported, e:
- print "Your platform (%s) is not supported." % e
- print "Pre-built galaxy eggs are not available from the Galaxy developers for"
- print "your platform. You may be able to build them by hand with:"
- print " python scripts/scramble.py"
- sys.exit( 1 )
+sys.exit( 0 )
diff -r a6c9862ece3d -r 0cb68935eede scripts/get_platforms.py
--- a/scripts/get_platforms.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/get_platforms.py Mon Mar 01 15:41:30 2010 -0500
@@ -7,6 +7,6 @@
lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "lib" ) )
sys.path.append( lib )
-from galaxy.eggs import get_platform
-print get_platform()
-print get_platform( True )
+import galaxy
+import pkg_resources
+print pkg_resources.get_platform()
diff -r a6c9862ece3d -r 0cb68935eede scripts/paster.py
--- a/scripts/paster.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/paster.py Mon Mar 01 15:41:30 2010 -0500
@@ -28,6 +28,7 @@
pkg_resources.require( "Paste" )
pkg_resources.require( "PasteScript" )
+pkg_resources.require( "PasteDeploy" )
from paste.script import command
command.run()
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble.py
--- a/scripts/scramble.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/scramble.py Mon Mar 01 15:41:30 2010 -0500
@@ -14,23 +14,29 @@
lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "lib" ) )
sys.path.append( lib )
-from galaxy.eggs import Crate, GalaxyConfig
+from galaxy.eggs.scramble import ScrambleCrate, ScrambleFailure
-c = Crate()
-c.parse()
-galaxy_config = GalaxyConfig()
-names = []
-if len( sys.argv ) == 1:
- names = c.get_names()
-elif sys.argv[1] == 'all':
- names = galaxy_config.always_conditional
-else:
-# Scramble a specific egg
- egg = c.get( sys.argv[1] )
- if egg is None:
- print "error: %s not in eggs.ini" % sys.argv[1]
- sys.exit( 1 )
- egg.scramble()
- sys.exit( 0 )
-ignore = filter( lambda x: not galaxy_config.check_conditional( x ), list( names ) )
-c.scramble( ignore=ignore )
+c = ScrambleCrate()
+
+try:
+ if len( sys.argv ) == 1:
+ eggs = c.scramble()
+ elif sys.argv[1] == 'all':
+ c.scramble( all=True )
+ else:
+ # Scramble a specific egg
+ name = sys.argv[1]
+ try:
+ egg = c[name]
+ except:
+ print "error: %s not in eggs.ini" % name
+ sys.exit( 1 )
+ egg.scramble()
+ sys.exit( 0 )
+except ScrambleFailure, e:
+ if len( e.eggs ) == 1:
+ raise
+ else:
+ print 'Scrambling the following eggs failed:\n ',
+ print '\n '.join( [ egg.name for egg in e.eggs ] )
+ sys.exit( 1 )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/lib/get_platform.py
--- a/scripts/scramble/lib/get_platform.py Mon Mar 01 13:30:37 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-"""
-Monkeypatch get_platform since it's broken on OS X versions of Python 2.5
-"""
-import os, sys
-from distutils.sysconfig import get_config_vars
-if sys.platform == 'darwin' and get_config_vars().get('UNIVERSALSDK', '').strip():
- # Has to be before anything imports pkg_resources
- def _get_platform_monkeypatch():
- plat = distutils.util._get_platform()
- if plat.startswith( 'macosx-' ):
- plat = 'macosx-10.3-fat'
- return plat
- import distutils.util
- try:
- assert distutils.util._get_platform
- except:
- distutils.util._get_platform = distutils.util.get_platform
- distutils.util.get_platform = _get_platform_monkeypatch
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/lib/scramble_lib.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/lib/scramble_lib.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,164 @@
+"""
+Various utilities for scrambling.
+"""
+import os, sys, errno, re, distutils.util, glob, shutil, subprocess, tarfile, zipfile
+from distutils.sysconfig import get_config_var, get_config_vars
+
+try:
+ import zlib
+except:
+ raise Exception( 'Cannot import zlib, which must exist to build eggs. If your python interpreter is truly missing it, you will need to recompile or (on supported platforms) download a binary version from python.org.' )
+
+def get_tag():
+ try:
+ return open( '.galaxy_tag', 'r' ).read().strip()
+ except:
+ return None
+
+def get_ver():
+ try:
+ return open( '.galaxy_ver', 'r' ).read().strip()
+ except:
+ return None
+
+def clean( extra_dirs=[] ):
+ for dir in [ 'build', 'dist' ] + extra_dirs:
+ try:
+ shutil.rmtree( dir )
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+
+def apply_patches():
+ name = os.path.basename( os.getcwd() )
+ for file in glob.glob( os.path.join( patches, name, '*' ) ):
+ shutil.copy( file, os.path.basename( file ) )
+
+def get_archive( base ):
+ for arctype in ( 'tar.gz', 'tgz', 'zip' ):
+ archive = '.'.join( ( base, arctype ) )
+ if os.path.exists( archive ):
+ return archive
+ else:
+ raise Exception( "%s(): Couldn't find a suitable archive for %s in %s" % ( sys._getframe().f_code.co_name, os.path.basename( base ), archives ) )
+
+def compress( path, *files ):
+ tarcf( path, *files )
+
+def uncompress( path ):
+ if path.endswith( '.zip' ):
+ unzip( path )
+ else:
+ tarxf( path )
+
+def unzip( zipf ):
+ z = zipfile.ZipFile( zipf )
+ try:
+ for info in z.infolist():
+ name = info.filename
+ mode = (info.external_attr >> 16L) & 0777
+ # don't extract absolute paths or ones with .. in them
+ if name.startswith('/') or '..' in name:
+ continue
+ if not name:
+ continue
+ if name.endswith('/'):
+ # directory
+ pkg_resources.ensure_directory(name)
+ else:
+ # file
+ pkg_resources.ensure_directory(name)
+ data = z.read(info.filename)
+ f = open(name,'wb')
+ try:
+ f.write(data)
+ finally:
+ f.close()
+ del data
+ try:
+ if not os.path.islink( name ):
+ os.chmod(name,mode)
+ except:
+ pass
+ finally:
+ z.close()
+
+def tarxf( ball ):
+ t = tarfile.open( ball, 'r' )
+ for fn in t.getnames():
+ t.extract( fn )
+ t.close()
+
+def tarcf( ball, *files ):
+ if ball.endswith( '.gz' ):
+ t = tarfile.open( ball, 'w:gz' )
+ elif ball.endswith( '.bz2' ):
+ t = tarfile.open( ball, 'w:bz2' )
+ else:
+ t = tarfile.open( ball, 'w' )
+ for file in files:
+ t.add( file )
+ t.close()
+
+def run( cmd, d, txt ):
+ p = subprocess.Popen( args = cmd, shell = True, cwd = d )
+ r = p.wait()
+ if r != 0:
+ print '%s(): %s failed' % ( sys._getframe().f_code.co_name, txt )
+ sys.exit( 1 )
+
+def unpack_dep( source, prepped, builder, args={} ):
+ if prepped is not None and os.path.exists( prepped ):
+ print "%s(): Prepared dependency already exists at the following path, remove to force re-prep:" % sys._getframe().f_code.co_name
+ print " ", prepped
+ uncompress( prepped )
+ else:
+ print "%s(): Prepared dependency does not exist, preparing now from source:" % sys._getframe().f_code.co_name
+ print " ", source
+ uncompress( source )
+ builder( prepped, args )
+
+def get_solaris_compiler():
+ p = subprocess.Popen( '%s -V 2>&1' % get_config_var('CC'), shell = True, stdout = subprocess.PIPE )
+ out = p.stdout.read()
+ p.wait()
+ if 'Sun C' in out:
+ return 'cc'
+ else:
+ return 'gcc'
+
+# Monkeypatch pkg_resources for better ABI recognition
+def _get_platform():
+ plat = distutils.util._get_platform()
+ if sys.version_info[:2] == ( 2, 5 ) and \
+ ( ( os.uname()[-1] in ( 'i386', 'ppc' ) and sys.platform == 'darwin' and os.path.abspath( sys.prefix ).startswith( '/System' ) ) or \
+ ( sys.platform == 'darwin' and get_config_vars().get('UNIVERSALSDK', '').strip() ) ):
+ plat = 'macosx-10.3-fat'
+ if sys.platform == "sunos5" and not (plat.endswith('_32') or plat.endswith('_64')):
+ if sys.maxint > 2**31:
+ plat += '_64'
+ else:
+ plat += '_32'
+ if not (plat.endswith('-ucs2') or plat.endswith('-ucs4')):
+ if sys.maxunicode > 2**16:
+ plat += '-ucs4'
+ else:
+ plat += '-ucs2'
+ return plat
+try:
+ assert distutil.util._get_platform
+except:
+ distutils.util._get_platform = distutils.util.get_platform
+ distutils.util.get_platform = _get_platform
+
+# get setuptools
+from ez_setup import use_setuptools
+use_setuptools( download_delay=8, to_dir=os.path.dirname( __file__ ) )
+from setuptools import *
+import pkg_resources
+
+# some constants
+root = os.path.abspath( os.path.join( os.path.dirname( __file__ ), '..' ) )
+archives = os.path.abspath( os.path.join( root, 'archives' ) )
+patches = os.path.abspath( os.path.join( root, 'patches' ) )
+platform_noucs = pkg_resources.get_platform().rsplit( '-', 1 )[0]
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/patches/Cheetah/SetupConfig.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/patches/Cheetah/SetupConfig.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,103 @@
+#-------Main Package Settings-----------#
+import sys
+
+name = 'Cheetah'
+from cheetah.Version import Version as version
+maintainer = "R. Tyler Ballance"
+author = "Tavis Rudd"
+author_email = "cheetahtemplate-discuss(a)lists.sf.net"
+url = "http://www.cheetahtemplate.org/"
+packages = ['Cheetah',
+ 'Cheetah.Macros',
+ 'Cheetah.Templates',
+ 'Cheetah.Tests',
+ 'Cheetah.Tools',
+ 'Cheetah.Utils',
+ ]
+classifiers = [line.strip() for line in '''\
+ #Development Status :: 4 - Beta
+ Development Status :: 5 - Production/Stable
+ Intended Audience :: Developers
+ Intended Audience :: System Administrators
+ License :: OSI Approved :: MIT License
+ Operating System :: OS Independent
+ Programming Language :: Python
+ Topic :: Internet :: WWW/HTTP
+ Topic :: Internet :: WWW/HTTP :: Dynamic Content
+ Topic :: Internet :: WWW/HTTP :: Site Management
+ Topic :: Software Development :: Code Generators
+ Topic :: Software Development :: Libraries :: Python Modules
+ Topic :: Software Development :: User Interfaces
+ Topic :: Text Processing'''.splitlines() if not line.strip().startswith('#')]
+del line
+
+package_dir = {'Cheetah':'cheetah'}
+
+import os
+import os.path
+from distutils.core import Extension
+
+ext_modules=[
+ Extension("Cheetah._namemapper",
+ [os.path.join('cheetah', 'c', '_namemapper.c')]),
+ # Extension("Cheetah._verifytype",
+ # [os.path.join('cheetah', 'c', '_verifytype.c')]),
+ # Extension("Cheetah._filters",
+ # [os.path.join('cheetah', 'c', '_filters.c')]),
+ # Extension('Cheetah._template',
+ # [os.path.join('cheetah', 'c', '_template.c')]),
+ ]
+
+## Data Files and Scripts
+scripts = ['bin/cheetah-compile',
+ 'bin/cheetah',
+ ]
+
+data_files = ['recursive: cheetah *.tmpl *.txt LICENSE README TODO CHANGES',]
+
+if not os.getenv('CHEETAH_INSTALL_WITHOUT_SETUPTOOLS'):
+ try:
+ from setuptools import setup
+# install_requires = [
+# "Markdown >= 2.0.1",
+# ]
+ if sys.platform == 'win32':
+ # use 'entry_points' instead of 'scripts'
+ del scripts
+ entry_points = {
+ 'console_scripts': [
+ 'cheetah = Cheetah.CheetahWrapper:_cheetah',
+ 'cheetah-compile = Cheetah.CheetahWrapper:_cheetah_compile',
+ ]
+ }
+ except ImportError:
+ print 'Not using setuptools, so we cannot install the Markdown dependency'
+
+
+description = "Cheetah is a template engine and code generation tool."
+
+long_description = '''Cheetah is an open source template engine and code generation tool.
+
+It can be used standalone or combined with other tools and frameworks. Web
+development is its principle use, but Cheetah is very flexible and is also being
+used to generate C++ game code, Java, sql, form emails and even Python code.
+
+Documentation
+================================================================================
+For a high-level introduction to Cheetah please refer to the User\'s Guide
+at http://www.cheetahtemplate.org/learn.html
+
+Mailing list
+================================================================================
+cheetahtemplate-discuss(a)lists.sourceforge.net
+Subscribe at http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss
+
+Credits
+================================================================================
+http://www.cheetahtemplate.org/credits.html
+
+Recent Changes
+================================================================================
+See http://www.cheetahtemplate.org/CHANGES.txt for full details
+
+'''
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/patches/GeneTrack/setup.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/patches/GeneTrack/setup.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,15 @@
+from os import walk
+from os.path import join
+from setuptools import setup, find_packages
+
+def walk_files( top ):
+ for dir, dirs, files in walk( top ):
+ yield( dir, [ join( dir, f ) for f in files ] )
+
+setup(
+ name = "GeneTrack",
+ version = "2.0.0-beta-1",
+ packages = ['genetrack','genetrack.scripts'],
+ data_files = [ f for f in walk_files('tests') ],
+ zip_safe = False
+)
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/patches/MySQL_python/site.cfg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/patches/MySQL_python/site.cfg Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,18 @@
+[options]
+# embedded: link against the embedded server library
+# threadsafe: use the threadsafe client
+# static: link against a static library (probably required for embedded)
+
+embedded = False
+threadsafe = True
+static = True
+
+# The path to mysql_config.
+# Only use this if mysql_config is not on your PATH, or you have some weird
+# setup that requires it.
+mysql_config = mysql/bin/mysql_config
+
+# The Windows registry key for MySQL.
+# This has to be set for Windows builds to work.
+# Only change this if you have a different version.
+registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/patches/PasteScript/setup.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/patches/PasteScript/setup.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,145 @@
+import ez_setup
+ez_setup.use_setuptools()
+from setuptools import setup, find_packages
+import re, os
+
+version = '1.7.3'
+
+news = os.path.join(os.path.dirname(__file__), 'docs', 'news.txt')
+news = open(news).read()
+parts = re.split(r'([0-9\.]+)\s*\n\r?-+\n\r?', news)
+found_news = ''
+for i in range(len(parts)-1):
+ if parts[i] == version:
+ found_news = parts[i+i]
+ break
+if not found_news:
+ print 'Warning: no news for this version found'
+
+long_description="""\
+This is a pluggable command-line tool.
+
+It includes some built-in features;
+
+* Create file layouts for packages. For instance, ``paste create
+ --template=basic_package MyPackage`` will create a `setuptools
+ <http://peak.telecommunity.com/DevCenter/setuptools>`_-ready
+ file layout.
+
+* Serving up web applications, with configuration based on
+ `paste.deploy <http://pythonpaste.org/deploy/paste-deploy.html>`_.
+
+The latest version is available in a `Subversion repository
+<http://svn.pythonpaste.org/Paste/Script/trunk#egg=PasteScript-dev>`_.
+
+For the latest changes see the `news file
+<http://pythonpaste.org/script/news.html>`_.
+"""
+
+if found_news:
+ title = 'Changes in %s' % version
+ long_description += "\n%s\n%s\n" % (title, '-'*len(title))
+ long_description += found_news
+
+setup(
+ name="PasteScript",
+ version=version,
+ description="A pluggable command-line frontend, including commands to setup package file layouts",
+ long_description=long_description,
+ classifiers=[
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python",
+ "Topic :: Internet :: WWW/HTTP",
+ "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Framework :: Paste",
+ ],
+ keywords='web wsgi setuptools framework command-line setup',
+ author="Ian Bicking",
+ author_email="ianb(a)colorstudy.com",
+ url="http://pythonpaste.org/script/",
+ namespace_packages=['paste'],
+ license='MIT',
+ packages=find_packages(exclude='tests'),
+ package_data={
+ 'paste.script': ['paster-templates/basic_package/setup.*',
+ 'paster-templates/basic_package/tests/*.py',
+ # @@: docs/ doesn't have any files :(
+ 'paster-templates/basic_package/+package+/*.py'],
+ },
+ zip_safe=False,
+ scripts=['scripts/paster'],
+ extras_require={
+ 'Templating': [],
+ 'Cheetah': ['Cheetah'],
+ 'Config': ['PasteDeploy'],
+ 'WSGIUtils': ['WSGIUtils'],
+ 'Flup': ['Flup'],
+ # the Paste feature means the complete set of features;
+ # (other features are truly optional)
+ 'Paste': ['PasteDeploy', 'Cheetah'],
+ },
+ entry_points="""
+ [paste.global_paster_command]
+ help=paste.script.help:HelpCommand
+ create=paste.script.create_distro:CreateDistroCommand [Templating]
+ serve=paste.script.serve:ServeCommand [Config]
+ request=paste.script.request:RequestCommand [Config]
+ post=paste.script.request:RequestCommand [Config]
+ exe=paste.script.exe:ExeCommand
+ points=paste.script.entrypoints:EntryPointCommand
+ make-config=paste.script.appinstall:MakeConfigCommand
+ setup-app=paste.script.appinstall:SetupCommand
+
+ [paste.paster_command]
+ grep = paste.script.grep:GrepCommand
+
+ [paste.paster_create_template]
+ basic_package=paste.script.templates:BasicPackage
+
+ [paste.server_runner]
+ wsgiutils=paste.script.wsgiutils_server:run_server [WSGIUtils]
+ flup_ajp_thread=paste.script.flup_server:run_ajp_thread [Flup]
+ flup_ajp_fork=paste.script.flup_server:run_ajp_fork [Flup]
+ flup_fcgi_thread=paste.script.flup_server:run_fcgi_thread [Flup]
+ flup_fcgi_fork=paste.script.flup_server:run_fcgi_fork [Flup]
+ flup_scgi_thread=paste.script.flup_server:run_scgi_thread [Flup]
+ flup_scgi_fork=paste.script.flup_server:run_scgi_fork [Flup]
+ cgi=paste.script.cgi_server:paste_run_cgi
+ cherrypy=paste.script.cherrypy_server:cpwsgi_server
+ twisted=paste.script.twisted_web2_server:run_twisted
+
+ [paste.app_factory]
+ test=paste.script.testapp:make_test_application
+
+ [paste.entry_point_description]
+ paste.entry_point_description = paste.script.epdesc:MetaEntryPointDescription
+ paste.paster_create_template = paste.script.epdesc:CreateTemplateDescription
+ paste.paster_command = paste.script.epdesc:PasterCommandDescription
+ paste.global_paster_command = paste.script.epdesc:GlobalPasterCommandDescription
+ paste.app_install = paste.script.epdesc:AppInstallDescription
+
+ # These aren't part of Paste Script particularly, but
+ # we'll document them here
+ console_scripts = paste.script.epdesc:ConsoleScriptsDescription
+ # @@: Need non-console scripts...
+ distutils.commands = paste.script.epdesc:DistutilsCommandsDescription
+ distutils.setup_keywords = paste.script.epdesc:SetupKeywordsDescription
+ egg_info.writers = paste.script.epdesc:EggInfoWriters
+ # @@: Not sure what this does:
+ #setuptools.file_finders = paste.script.epdesc:SetuptoolsFileFinders
+
+ [console_scripts]
+ paster=paste.script.command:run
+
+ [distutils.setup_keywords]
+ paster_plugins = setuptools.dist:assert_string_list
+
+ [egg_info.writers]
+ paster_plugins.txt = setuptools.command.egg_info:write_arg
+ """,
+ install_requires=[
+ ],
+ )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/patches/psycopg2/setup.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/patches/psycopg2/setup.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,252 @@
+# setup.py - distutils packaging
+#
+# Copyright (C) 2003-2004 Federico Di Gregorio <fog(a)debian.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+
+"""Python-PostgreSQL Database Adapter
+
+psycopg is a PostgreSQL database adapter for the Python programming
+language. This is version 2, a complete rewrite of the original code to
+provide new-style classes for connection and cursor objects and other sweet
+candies. Like the original, psycopg 2 was written with the aim of being
+very small and fast, and stable as a rock.
+
+psycopg is different from the other database adapter because it was
+designed for heavily multi-threaded applications that create and destroy
+lots of cursors and make a conspicuous number of concurrent INSERTs or
+UPDATEs. psycopg 2 also provide full asycronous operations for the really
+brave programmer.
+"""
+
+classifiers = """\
+Development Status :: 4 - Beta
+Intended Audience :: Developers
+License :: OSI Approved :: GNU General Public License (GPL)
+License :: OSI Approved :: Zope Public License
+Programming Language :: Python
+Programming Language :: C
+Programming Language :: SQL
+Topic :: Database
+Topic :: Database :: Front-Ends
+Topic :: Software Development
+Topic :: Software Development :: Libraries :: Python Modules
+Operating System :: Microsoft :: Windows
+Operating System :: Unix
+"""
+
+import os
+import os.path
+import sys
+import popen2
+import ConfigParser
+from glob import glob
+from distutils.core import setup, Extension
+from distutils.errors import DistutilsFileError
+from distutils.command.build_ext import build_ext
+from distutils.sysconfig import get_python_inc
+from distutils.ccompiler import get_default_compiler
+
+assert sys.version_info[:2] >= ( 2, 4 )
+
+PSYCOPG_VERSION = '2.0.6'
+version_flags = []
+
+PG_VERSION = '8.2.6'
+
+class psycopg_build_ext(build_ext):
+ """Conditionally complement the setup.cfg options file.
+
+ This class configures the include_dirs, libray_dirs, libraries
+ options as required by the system. Most of the configuration happens
+ in finalize_options() method.
+
+ If you want to set up the build step for a peculiar platform, add a
+ method finalize_PLAT(), where PLAT matches your sys.platform.
+ """
+ user_options = build_ext.user_options[:]
+ user_options.extend([
+ ('use-pydatetime', None,
+ "Use Python datatime objects for date and time representation."),
+ ('use-decimal', None,
+ "Use Decimal type even on Python 2.3 if the module is provided."),
+ ])
+
+ boolean_options = build_ext.boolean_options[:]
+ boolean_options.extend(('use-pydatetime', 'use-decimal', 'have-ssl'))
+
+ def initialize_options(self):
+ build_ext.initialize_options(self)
+ self.use_pg_dll = 1
+ self.pgdir = None
+ self.mx_include_dir = None
+
+ def get_compiler(self):
+ """Return the name of the C compiler used to compile extensions.
+
+ If a compiler was not explicitely set (on the command line, for
+ example), fall back on the default compiler.
+ """
+ if self.compiler:
+ # distutils doesn't keep the type of self.compiler uniform; we
+ # compensate:
+ if isinstance(self.compiler, str):
+ name = self.compiler
+ else:
+ name = self.compiler.compiler_type
+ else:
+ name = get_default_compiler()
+ return name
+
+ def finalize_darwin(self):
+ """Finalize build system configuration on darwin platform."""
+ self.libraries.append('ssl')
+ self.libraries.append('crypto')
+
+ def finalize_options(self):
+ """Complete the build system configuation."""
+ build_ext.finalize_options(self)
+
+ self.include_dirs.append(".")
+ self.include_dirs.append("postgresql-8.2.6/src/interfaces/libpq")
+ self.include_dirs.append("postgresql-8.2.6/src/include")
+ self.include_dirs.append("postgresql-8.2.6/src/port")
+ pgmajor, pgminor, pgpatch = PG_VERSION.split('.')
+ define_macros.append(("PG_MAJOR_VERSION", pgmajor))
+ define_macros.append(("PG_MINOR_VERSION", pgminor))
+ define_macros.append(("PG_PATCH_VERSION", pgpatch))
+
+ if hasattr(self, "finalize_" + sys.platform):
+ getattr(self, "finalize_" + sys.platform)()
+
+# let's start with macro definitions (the ones not already in setup.cfg)
+define_macros = []
+include_dirs = []
+
+# python version
+define_macros.append(('PY_MAJOR_VERSION', str(sys.version_info[0])))
+define_macros.append(('PY_MINOR_VERSION', str(sys.version_info[1])))
+
+# some macros related to python versions and features
+if sys.version_info[0] >= 2 and sys.version_info[1] >= 3:
+ define_macros.append(('HAVE_PYBOOL','1'))
+
+# gather information to build the extension module
+ext = [] ; data_files = []
+
+# sources
+
+sources = [
+ 'psycopgmodule.c', 'pqpath.c', 'typecast.c',
+ 'microprotocols.c', 'microprotocols_proto.c',
+ 'connection_type.c', 'connection_int.c', 'cursor_type.c', 'cursor_int.c',
+ 'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c',
+ 'adapter_asis.c', 'adapter_list.c']
+
+parser = ConfigParser.ConfigParser()
+parser.read('setup.cfg')
+
+# Choose if to use Decimal type
+use_decimal = int(parser.get('build_ext', 'use_decimal'))
+if sys.version_info[0] >= 2 and (
+ sys.version_info[1] >= 4 or (sys.version_info[1] == 3 and use_decimal)):
+ define_macros.append(('HAVE_DECIMAL','1'))
+ version_flags.append('dec')
+
+# Choose a datetime module
+have_pydatetime = False
+have_mxdatetime = False
+use_pydatetime = int(parser.get('build_ext', 'use_pydatetime'))
+
+# check for mx package
+if parser.has_option('build_ext', 'mx_include_dir'):
+ mxincludedir = parser.get('build_ext', 'mx_include_dir')
+else:
+ mxincludedir = os.path.join(get_python_inc(plat_specific=1), "mx")
+if os.path.exists(mxincludedir):
+ include_dirs.append(mxincludedir)
+ define_macros.append(('HAVE_MXDATETIME','1'))
+ sources.append('adapter_mxdatetime.c')
+ have_mxdatetime = True
+ version_flags.append('mx')
+
+# check for python datetime package
+if os.path.exists(os.path.join(get_python_inc(plat_specific=1),"datetime.h")):
+ define_macros.append(('HAVE_PYDATETIME','1'))
+ sources.append('adapter_datetime.c')
+ have_pydatetime = True
+ version_flags.append('dt')
+
+# now decide which package will be the default for date/time typecasts
+if have_pydatetime and use_pydatetime \
+ or have_pydatetime and not have_mxdatetime:
+ define_macros.append(('PSYCOPG_DEFAULT_PYDATETIME','1'))
+elif have_mxdatetime:
+ define_macros.append(('PSYCOPG_DEFAULT_MXDATETIME','1'))
+else:
+ def e(msg):
+ sys.stderr.write("error: " + msg + "\n")
+ e("psycopg requires a datetime module:")
+ e(" mx.DateTime module not found")
+ e(" python datetime module not found")
+ e("Note that psycopg needs the module headers and not just the module")
+ e("itself. If you installed Python or mx.DateTime from a binary package")
+ e("you probably need to install its companion -dev or -devel package.")
+ sys.exit(1)
+
+# generate a nice version string to avoid confusion when users report bugs
+for have in parser.get('build_ext', 'define').split(','):
+ if have == 'PSYCOPG_EXTENSIONS':
+ version_flags.append('ext')
+ elif have == 'HAVE_PQPROTOCOL3':
+ version_flags.append('pq3')
+if version_flags:
+ PSYCOPG_VERSION_EX = PSYCOPG_VERSION + " (%s)" % ' '.join(version_flags)
+else:
+ PSYCOPG_VERSION_EX = PSYCOPG_VERSION
+
+define_macros.append(('PSYCOPG_VERSION', '"'+PSYCOPG_VERSION_EX+'"'))
+
+if parser.has_option('build_ext', 'have_ssl'):
+ have_ssl = int(parser.get('build_ext', 'have_ssl'))
+else:
+ have_ssl = 0
+
+# build the extension
+
+sources = map(lambda x: os.path.join('psycopg', x), sources)
+sources.append( 'postgresql-%s/src/port/pgstrcasecmp.c' % PG_VERSION )
+sources.append( 'postgresql-%s/src/backend/libpq/md5.c' % PG_VERSION )
+sources.extend( glob('postgresql-%s/src/interfaces/libpq/*.c' % PG_VERSION) )
+
+ext.append(Extension("psycopg2._psycopg", sources,
+ define_macros=define_macros,
+ include_dirs=include_dirs,
+ undef_macros=[]))
+setup(name="psycopg2",
+ version=PSYCOPG_VERSION,
+ maintainer="Federico Di Gregorio",
+ maintainer_email="fog(a)initd.org",
+ author="Federico Di Gregorio",
+ author_email="fog(a)initd.org",
+ url="http://initd.org/tracker/psycopg",
+ download_url = "http://initd.org/pub/software/psycopg2",
+ license="GPL with exceptions or ZPL",
+ platforms = ["any"],
+ description=__doc__.split("\n")[0],
+ long_description="\n".join(__doc__.split("\n")[2:]),
+ classifiers=filter(None, classifiers.split("\n")),
+ data_files=data_files,
+ package_dir={'psycopg2':'lib'},
+ packages=['psycopg2'],
+ cmdclass={ 'build_ext': psycopg_build_ext },
+ ext_modules=ext)
+
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/Cheetah.py
--- a/scripts/scramble/scripts/Cheetah.py Mon Mar 01 13:30:37 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-import os, sys, shutil
-
-# change back to the build dir
-if os.path.dirname( sys.argv[0] ) != "":
- os.chdir( os.path.dirname( sys.argv[0] ) )
-
-# find setuptools
-scramble_lib = os.path.join( "..", "..", "..", "lib" )
-sys.path.append( scramble_lib )
-import get_platform # fixes fat python 2.5
-from ez_setup import use_setuptools
-use_setuptools( download_delay=8, to_dir=scramble_lib )
-from setuptools import *
-
-# get the tag
-if os.access( ".galaxy_tag", os.F_OK ):
- tagfile = open( ".galaxy_tag", "r" )
- tag = tagfile.readline().strip()
-else:
- tag = None
-
-# in case you're running this by hand from a dirty module source dir
-for dir in [ "build", "dist" ]:
- if os.access( dir, os.F_OK ):
- print "scramble_it.py: removing dir:", dir
- shutil.rmtree( dir )
-
-# patch
-file = "SetupConfig.py"
-if not os.access( "%s.orig" %file, os.F_OK ):
- print "scramble.py(): Patching", file
- shutil.copyfile( file, "%s.orig" %file )
- i = open( "%s.orig" %file, "r" )
- o = open( file, "w" )
- comment = False
- for line in i.readlines():
- if line == " install_requires = [\n":
- comment = True
- print >>o, "#" + line,
- elif comment and line == " ]\n":
- comment = False
- print >>o, "#" + line,
- elif comment:
- print >>o, "#" + line,
- else:
- print >>o, line,
- i.close()
- o.close()
-
-# reset args for distutils
-me = sys.argv[0]
-sys.argv = [ me ]
-sys.argv.append( "egg_info" )
-if tag is not None:
- #sys.argv.append( "egg_info" )
- sys.argv.append( "--tag-build=%s" %tag )
-# svn revision (if any) is handled directly in tag-build
-sys.argv.append( "--no-svn-revision" )
-sys.argv.append( "bdist_egg" )
-
-# do it
-execfile( "setup.py", globals(), locals() )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/DRMAA_python-macosx.py
--- a/scripts/scramble/scripts/DRMAA_python-macosx.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/scramble/scripts/DRMAA_python-macosx.py Mon Mar 01 15:41:30 2010 -0500
@@ -1,8 +1,8 @@
import os, sys, shutil
if "SGE_ROOT" not in os.environ:
- print "scramble(): Please set SGE_ROOT to the path of your SGE installation"
- print "scramble(): before scrambling DRMAA_python"
+ print "main(): Please set SGE_ROOT to the path of your SGE installation"
+ print "main(): before scrambling DRMAA_python"
sys.exit(1)
# change back to the build dir
@@ -10,27 +10,15 @@
os.chdir( os.path.dirname( sys.argv[0] ) )
# find setuptools
-scramble_lib = os.path.join( "..", "..", "..", "lib" )
-sys.path.append( scramble_lib )
-import get_platform # fixes fat python 2.5
-try:
- from setuptools import *
- import pkg_resources
-except:
- from ez_setup import use_setuptools
- use_setuptools( download_delay=8, to_dir=scramble_lib )
- from setuptools import *
- import pkg_resources
+sys.path.append( os.path.join( '..', '..', '..', 'lib' ) )
+from scramble_lib import *
-# clean, in case you're running this by hand from a dirty module source dir
-for dir in [ "build", "dist", "gridengine" ]:
- if os.access( dir, os.F_OK ):
- print "scramble_it.py: removing dir:", dir
- shutil.rmtree( dir )
+tag = get_tag() # get the tag
+clean() # clean up any existing stuff (could happen if you run scramble.py by hand)
# patch
file = "setup.py"
-print "scramble(): Patching", file
+print "main(): Patching", file
if not os.access( "%s.orig" %file, os.F_OK ):
shutil.copyfile( file, "%s.orig" %file )
i = open( "%s.orig" %file, "r" )
@@ -44,7 +32,7 @@
i.close()
o.close()
-# go
+# build
me = sys.argv[0]
sys.argv = [ me ]
sys.argv.append( "build" )
@@ -55,6 +43,7 @@
libdrmaa = os.path.join(SGE6_ROOT, "lib", SGE6_ARCH, "libdrmaa.dylib.1.0" )
os.system( "install_name_tool -change libdrmaa.dylib.1.0 %s %s" % ( libdrmaa, so ) )
+# package
sys.argv = [ me ]
sys.argv.append( "bdist_egg" )
execfile( "setup.py", globals(), locals() )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/DRMAA_python-solaris.py
--- a/scripts/scramble/scripts/DRMAA_python-solaris.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/scramble/scripts/DRMAA_python-solaris.py Mon Mar 01 15:41:30 2010 -0500
@@ -1,8 +1,8 @@
import os, sys, shutil
if "SGE_ROOT" not in os.environ:
- print "scramble(): Please set SGE_ROOT to the path of your SGE installation"
- print "scramble(): before scrambling DRMAA_python"
+ print "main(): Please set SGE_ROOT to the path of your SGE installation"
+ print "main(): before scrambling DRMAA_python"
sys.exit(1)
# change back to the build dir
@@ -10,22 +10,11 @@
os.chdir( os.path.dirname( sys.argv[0] ) )
# find setuptools
-scramble_lib = os.path.join( "..", "..", "..", "lib" )
-sys.path.append( scramble_lib )
-try:
- from setuptools import *
- import pkg_resources
-except:
- from ez_setup import use_setuptools
- use_setuptools( download_delay=8, to_dir=scramble_lib )
- from setuptools import *
- import pkg_resources
+sys.path.append( os.path.join( '..', '..', '..', 'lib' ) )
+from scramble_lib import *
-# clean, in case you're running this by hand from a dirty module source dir
-for dir in [ "build", "dist", "gridengine" ]:
- if os.access( dir, os.F_OK ):
- print "scramble_it.py: removing dir:", dir
- shutil.rmtree( dir )
+tag = get_tag() # get the tag
+clean() # clean up any existing stuff (could happen if you run scramble.py by hand)
# if our python is 64 bit, use 64 bit sge...
if sys.maxint < ( 2048 * 1024 * 1024 ):
@@ -38,24 +27,13 @@
arch = "sparc64"
else:
arch = "amd64"
- if not "CFLAGS" in os.environ:
- os.environ["CFLAGS"] = ""
- os.environ["CFLAGS"] += " -m64"
# if we're using sun cc, drop the gcc -Wno-unused option
-import distutils.sysconfig
-cc = distutils.sysconfig.get_config_var('CC')
-if os.popen( cc + ' --version 2>&1' ).read().strip().split('\n')[0].startswith('gcc'):
- compiler = 'gcc'
-elif os.popen( cc + ' -V 2>&1' ).read().strip().split('\n')[0].startswith('cc: Sun C'):
- compiler = 'sun'
-else:
- print "scramble(): Unable to determine compiler"
- sys.exit(1)
+cc = get_solaris_compiler()
# patch
file = "setup.py"
-print "scramble(): Patching", file
+print "main(): Patching", file
if not os.access( "%s.orig" %file, os.F_OK ):
shutil.copyfile( file, "%s.orig" %file )
i = open( "%s.orig" %file, "r" )
@@ -68,14 +46,16 @@
elif line.startswith('link_args ='):
line = 'link_args = [ "-L%s" % os.path.join(SGE6_ROOT, "lib", SGE6_ARCH), "-Wl,-R%s" % os.path.join(SGE6_ROOT, "lib", SGE6_ARCH), "-ldrmaa" ]\n'
if line == " + [ '-Wno-unused' ]\n":
- if compiler == 'sun':
+ if cc == 'cc':
line = " #+ [ '-Wno-unused' ]\n"
print >>o, line,
i.close()
o.close()
-# go
+# reset args for distutils
me = sys.argv[0]
sys.argv = [ me ]
sys.argv.append( "bdist_egg" )
+
+# do it
execfile( "setup.py", globals(), locals() )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/DRMAA_python.py
--- a/scripts/scramble/scripts/DRMAA_python.py Mon Mar 01 13:30:37 2010 -0500
+++ b/scripts/scramble/scripts/DRMAA_python.py Mon Mar 01 15:41:30 2010 -0500
@@ -1,8 +1,8 @@
import os, sys, shutil
if "SGE_ROOT" not in os.environ:
- print "scramble(): Please set SGE_ROOT to the path of your SGE installation"
- print "scramble(): before scrambling DRMAA_python"
+ print "main(): Please set SGE_ROOT to the path of your SGE installation"
+ print "main(): before scrambling DRMAA_python"
sys.exit(1)
# change back to the build dir
@@ -10,27 +10,15 @@
os.chdir( os.path.dirname( sys.argv[0] ) )
# find setuptools
-scramble_lib = os.path.join( "..", "..", "..", "lib" )
-sys.path.append( scramble_lib )
-import get_platform # fixes fat python 2.5
-try:
- from setuptools import *
- import pkg_resources
-except:
- from ez_setup import use_setuptools
- use_setuptools( download_delay=8, to_dir=scramble_lib )
- from setuptools import *
- import pkg_resources
+sys.path.append( os.path.join( '..', '..', '..', 'lib' ) )
+from scramble_lib import *
-# clean, in case you're running this by hand from a dirty module source dir
-for dir in [ "build", "dist", "gridengine" ]:
- if os.access( dir, os.F_OK ):
- print "scramble_it.py: removing dir:", dir
- shutil.rmtree( dir )
+tag = get_tag() # get the tag
+clean() # clean up any existing stuff (could happen if you run scramble.py by hand)
# patch
file = "setup.py"
-print "scramble(): Patching", file
+print "main(): Patching", file
if not os.access( "%s.orig" %file, os.F_OK ):
shutil.copyfile( file, "%s.orig" %file )
i = open( "%s.orig" %file, "r" )
@@ -44,8 +32,10 @@
i.close()
o.close()
-# go
+# reset args for distutils
me = sys.argv[0]
sys.argv = [ me ]
sys.argv.append( "bdist_egg" )
+
+# do it
execfile( "setup.py", globals(), locals() )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/GeneTrack.py
--- a/scripts/scramble/scripts/GeneTrack.py Mon Mar 01 13:30:37 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-import os, sys, shutil
-
-# change back to the build dir
-if os.path.dirname( sys.argv[0] ) != "":
- os.chdir( os.path.dirname( sys.argv[0] ) )
-
-# find setuptools
-scramble_lib = os.path.join( "..", "..", "..", "lib" )
-sys.path.append( scramble_lib )
-from ez_setup import use_setuptools
-use_setuptools( download_delay=8, to_dir=scramble_lib )
-from setuptools import *
-
-# get the tag
-if os.access( ".galaxy_tag", os.F_OK ):
- tagfile = open( ".galaxy_tag", "r" )
- tag = tagfile.readline().strip()
-else:
- tag = None
-
-# in case you're running this by hand from a dirty module source dir
-for dir in [ "build", "dist" ]:
- if os.access( dir, os.F_OK ):
- print "scramble.py: removing dir:", dir
- shutil.rmtree( dir )
-
-# reset args for distutils
-me = sys.argv[0]
-sys.argv = [ me ]
-sys.argv.append( "egg_info" )
-if tag is not None:
- #sys.argv.append( "egg_info" )
- sys.argv.append( "--tag-build=%s" %tag )
-# svn revision (if any) is handled directly in tag-build
-sys.argv.append( "--no-svn-revision" )
-sys.argv.append( "bdist_egg" )
-
-if not os.access( 'setup.py', os.F_OK ):
- print "scramble.py: Creating setup.py for GeneTrack"
- setup_py = """from os import walk
-from os.path import join
-from setuptools import setup, find_packages
-def walk_files( top ):
- for dir, dirs, files in walk( top ):
- yield( dir, [ join( dir, f ) for f in files ] )
-setup(
- name = "GeneTrack",
- version = "2.0.0-beta-1",
- packages = ['genetrack','genetrack.scripts'],
- data_files = [ f for f in walk_files('tests') ],
- zip_safe = False
-)
-"""
- open( 'setup.py', 'w' ).write( setup_py )
-
-
-# do it
-execfile( "setup.py", globals(), locals() )
diff -r a6c9862ece3d -r 0cb68935eede scripts/scramble/scripts/MySQL_python-solaris.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/scramble/scripts/MySQL_python-solaris.py Mon Mar 01 15:41:30 2010 -0500
@@ -0,0 +1,81 @@
+import os, sys, shutil
+from distutils.sysconfig import get_config_var
+
+def prep_mysql( prepped, args ):
+
+ my_version = args['version']
+ my_srcdir = os.path.join( os.getcwd(), "mysql-%s" % my_version )
+
+ # set up environment
+ os.environ['CC'] = get_config_var('CC')
+ os.environ['CFLAGS'] = get_config_var('CFLAGS')
+ os.environ['LDFLAGS'] = get_config_var('LDFLAGS')
+
+ cc = get_solaris_compiler()
+ if cc == 'cc':
+ os.environ['CFLAGS'] += ' -KPIC'
+ elif cc == 'gcc':
+ os.environ['CFLAGS'] += ' -fPIC -DPIC'
+
+ # run configure
+ run( "./configure --prefix=%s/mysql --disable-dependency-tracking --enable-static --disable-shared --without-server --without-uca " %os.getcwd() + \
+ "--without-libwrap --without-ssl --without-docs --without-man --enable-thread-safe-client --with-named-curses-libs=''",
+ my_srcdir, "Configuring mysql (./configure)" )
+
+ # compile
+ run( "make", os.path.join( my_srcdir, 'include' ), "Preparing mysql includes (cd include; make)" )
+ run( "make link_sources", os.path.join( my_srcdir, 'libmysql' ), "Preparing libmysql (cd libmysql; make link_sources)" )
+ run( "make link_sources", os.path.join( my_srcdir, 'libmysql_r' ), "Preparing libmysql_r (cd libmysql_r; make link_sources)" )
+ run( "make", os.path.join( my_srcdir, 'libmysql_r' ), "Compiling libmysql_r (cd libmysql_r; make)" )
+ run( "make", os.path.join( my_srcdir, 'scripts' ), "Preparing scripts (cd scripts; make)" )
+
+ # install
+ run( "make install", os.path.join( my_srcdir, 'include' ), "Installing mysql includes (cd include; make install)" )
+ run( "make install", os.path.join( my_srcdir, 'libmysql_r' ), "Installing libmysql_r (cd libmysql_r; make install)" )
+ run( "make install", os.path.join( my_srcdir, 'scripts' ), "Installing mysql scripts (cd scripts; make install)" )
+ shutil.copy( os.path.join( my_srcdir, 'include', 'mysqld_error.h' ), os.path.join( 'mysql', 'include', 'mysql' ) )
+
+ # create prepped archive
+ print "%s(): Creating prepped archive for future builds at:" % sys._getframe().f_code.co_name
+ print " ", prepped
+ compress( prepped,
+ 'mysql/bin/mysql_config',
+ 'mysql/include',
+ 'mysql/lib' )
+
+if __name__ == '__main__':
+
+ # change back to the build dir
+ if os.path.dirname( sys.argv[0] ) != "":
+ os.chdir( os.path.dirname( sys.argv[0] ) )
+
+ # find setuptools
+ sys.path.append( os.path.abspath( os.path.join( '..', '..', '..', 'lib' ) ) )
+ from scramble_lib import *
+
+ tag = get_tag()
+
+ my_version = ( tag.split( '_' ) )[1]
+ my_archive_base = os.path.join( archives, 'mysql-%s' % my_version )
+ my_archive = get_archive( my_archive_base )
+ my_archive_prepped = os.path.join( archives, 'mysql-%s-%s.tar.gz' % ( my_version, platform_noucs ) )
+
+ # clean up any existing stuff (could happen if you run scramble.py by hand)
+ clean( [ 'mysql-%s' % my_version, 'mysql' ] )
+
+ # unpack mysql
+ unpack_dep( my_archive, my_archive_prepped, prep_mysql, dict( version=my_version ) )
+
+ # get site.cfg
+ shutil.copy( os.path.join( patches, 'MySQL_python', 'site.cfg' ), 'site.cfg' )
+
+ # tag
+ me = sys.argv[0]
+ sys.argv = [ me ]
+ if tag is not None:
+ sys.argv.append( "egg_info" )
+ sys.argv.append( "--tag-build=%s" %tag )
+ sys.argv.append( "bdist_egg" )
+
+ # go
+ execfile( "setup.py", globals(), locals() )
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/a6c9862ece3d
changeset: 3451:a6c9862ece3d
user: James Taylor <james(a)jamestaylor.org>
date: Mon Mar 01 13:30:37 2010 -0500
description:
UI tweaks
diffstat:
templates/display_base.mako | 9 ++++-----
templates/page/display.mako | 2 +-
templates/user/info.mako | 15 ++++++++++++---
3 files changed, 17 insertions(+), 9 deletions(-)
diffs (80 lines):
diff -r 71a525ae9426 -r a6c9862ece3d templates/display_base.mako
--- a/templates/display_base.mako Mon Mar 01 12:46:54 2010 -0500
+++ b/templates/display_base.mako Mon Mar 01 13:30:37 2010 -0500
@@ -190,14 +190,13 @@
<div class="unified-panel-body">
<div style="overflow: auto; height: 100%;">
<div style="padding: 10px;">
+
+ <div style="float: right;"><img src="http://www.gravatar.com/avatar/${h.md5(item.user.email)}?d=identicon"></div>
+
<h4>Author</h4>
<p>${item.user.username | h}</p>
-
- <div><img src="http://www.gravatar.com/avatar/${h.md5(item.user.email)}?d=identicon&s=150"></div>
-
-
-
+
## Page meta.
<h4>Related ${item_plural}</h4>
<p>
diff -r 71a525ae9426 -r a6c9862ece3d templates/page/display.mako
--- a/templates/page/display.mako Mon Mar 01 12:46:54 2010 -0500
+++ b/templates/page/display.mako Mon Mar 01 13:30:37 2010 -0500
@@ -20,7 +20,7 @@
if ( $.browser.mozilla ) {
$(this).find( "pre.peek" ).css( "overflow", "hidden" );
}
- $(this).slideUp( "fast" );
+ $(this).hide();
});
});
diff -r 71a525ae9426 -r a6c9862ece3d templates/user/info.mako
--- a/templates/user/info.mako Mon Mar 01 12:46:54 2010 -0500
+++ b/templates/user/info.mako Mon Mar 01 13:30:37 2010 -0500
@@ -56,6 +56,9 @@
<input type="submit" name="login_info_button" value="Save">
</div>
</form>
+</div>
+<p></p>
+<div class="toolForm">
<form name="change_password" id="change_password" action="${h.url_for( controller='user', action='edit_info', user_id=user.id, admin_view=admin_view )}" method="post" >
<div class="toolFormTitle">Change Password</div>
%if not admin_view:
@@ -76,7 +79,10 @@
<input type="submit" name="change_password_button" value="Save">
</div>
</form>
- %if user.values or user_info_forms:
+</div>
+%if user.values or user_info_forms:
+<p></p>
+<div class="toolForm">
<form name="user_info" id="user_info" action="${h.url_for( controller='user', action='edit_info', user_id=user.id, admin_view=admin_view )}" method="post" >
<div class="toolFormTitle">User information</div>
%if user_info_select:
@@ -104,7 +110,10 @@
<input type="submit" name="edit_user_info_button" value="Save">
</div>
</form>
- %endif
+</div>
+%endif
+<p></p>
+<div class="toolForm">
<form name="user_info" id="user_info" action="${h.url_for( controller='user', action='new_address', user_id=user.id, admin_view=admin_view )}" method="post" >
<div class="toolFormTitle">User Addresses</div>
<div class="toolFormBody">
@@ -160,7 +169,7 @@
</div>
</div>
</form>
-
+
1
0