--- pyode-1.2.0.orig/debian/TODO +++ pyode-1.2.0/debian/TODO @@ -0,0 +1 @@ +make proper rebuild of ode_*.c files with appropriate version of pyrex --- pyode-1.2.0.orig/debian/changelog +++ pyode-1.2.0/debian/changelog @@ -0,0 +1,81 @@ +pyode (1.2.0-4+cvs20090320.2) unstable; urgency=medium + + * Non-maintainer upload + * Bump debhelper compat level. Closes: #817638 + + -- Christoph Biedl Sun, 18 Dec 2016 14:41:01 +0100 + +pyode (1.2.0-4+cvs20090320.1) unstable; urgency=low + + * Non-maintainer upload. + * Convert to dh_python2. (Closes: #616976) + + -- Andrea Colangelo Fri, 28 Jun 2013 17:19:04 +0200 + +pyode (1.2.0-4+cvs20090320) unstable; urgency=low + + * Build-depends on libode-dev instead of libode0-dev (closes: + #520457). Thanks Adeodato Simo. + * Added Vcs fields. + * Added installation of upstream's changelog. + * python-pyrex Build-Depend. + * Incorporated upstream changes since 1.2.0: + - Apply linear/angular damping patch from Tristam MacDonald. + - Rename __new__ to __cinit__ for new Pyrex version. + - Compiling against new ODE -- requires dInitODE(). + - Document last change. + - Include whatever necessary flags/libs are needed for ODE. + - Rename type to space_type for pyrex. + - Changelog entry describing previous commit. + - * tutorial3.py: change glScale to glScalef to be compatible with + python-opengl version 3.0 and up. Thanks to Nathanial Troutman for + finding the bug and suggesting a fix. + - Reapply weakref patch after finding bug in tutorial3.py. + - * heightfielddata.pyx: Save a reference to the data tuple, because + otherwise it gets garbage collected and causes problems. Thanks to Dan + Miller for finding the bug and figuring it out. + - Revert weakref patch; it breaks the tutorials. + - Bug fix from Dan Miller. + - Applied the heightfield patch + - Applied a couiple of patches posted by Ethan Glasser-Camp (GeomRay + doc strings, angle methods on UniversalJoint, GeomObject.__delattr__, + weak refs, triangle count) + + -- Yaroslav Halchenko Fri, 20 Mar 2009 11:07:26 -0400 + +pyode (1.2.0-3) unstable; urgency=low + + * Rebuild with up-to-date pycentral (closes: #490522) + * Standards version boost to 3.8.0: + - Homepage is in header field now + - Section python instead of science + - Library depends without debian revision + + -- Yaroslav Halchenko Sat, 12 Jul 2008 22:27:10 -0400 + +pyode (1.2.0-2) unstable; urgency=low + + * Since ode>=0.8.dfsg-1 builds with-trimesh=gimpact, patch + patches/01_ode_notrimesh.dpatch is disabled + * Rebuilt against most recent (lib)ode (Closes: #431941) + + -- Yaroslav Halchenko Sun, 22 Jul 2007 13:07:06 -0400 + +pyode (1.2.0-1) experimental; urgency=low + + * New upstream release (Closes: #410945) (Thanks Ethan Glasser-Camp for a + buzz) + * debian/patches/01_{debian_ode_config.dpatch,ode_pyrex_0.9.4.dpatch} no + longer applied + * Explicit depends on libode0c2 (>=0.7-1) via debian/shlibs.local + * Since libode 0.7 shipped within Debian is without trimesh support, trimesh + support disabled for building pyode (patches/01_ode_notrimesh.dpatch) + + -- Yaroslav Halchenko Thu, 22 Feb 2007 13:52:01 -0500 + +pyode (1.1.0-1) unstable; urgency=low + + * Initial release Closes: #329013 + + -- Yaroslav Halchenko Sat, 13 Jun 2006 16:32:54 -0400 + --- pyode-1.2.0.orig/debian/compat +++ pyode-1.2.0/debian/compat @@ -0,0 +1 @@ +10 --- pyode-1.2.0.orig/debian/control +++ pyode-1.2.0/debian/control @@ -0,0 +1,34 @@ +Source: pyode +Section: python +Priority: optional +Maintainer: ExpPsy Maintainers +Uploaders: Yaroslav Halchenko , Michael Hanke +Build-Depends: debhelper (>= 10~), python-all-dev (>= 2.6.6-3~), libode-dev (>=0.7), dpatch, python-pyrex +Standards-Version: 3.8.0 +Homepage: http://pyode.sourceforge.net/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-exppsy/pyode/trunk/ +Vcs-svn: svn://svn.debian.org/pkg-exppsy/pyode/trunk/ + + +Package: python-pyode +Architecture: any +Depends: ${python:Depends}, ${shlibs:Depends} +Conflicts: python2.3-pyode, python2.4-pyode +Replaces: python2.3-pyode, python2.4-pyode +Provides: ${python:Provides} +Description: Python bindings for The Open Dynamics Engine + PyODE is a set of open-source Python bindings for The Open Dynamics + Engine, an open-source physics engine. PyODE also includes an XODE + parser. + . + This package provides PyODE for supported versions of Python. + +Package: python-pyode-doc +Architecture: all +Section: doc +Description: Python bindings for The Open Dynamics Engine + PyODE is a set of open-source Python bindings for The Open Dynamics + Engine, an open-source physics engine. PyODE also includes an XODE + parser. + . + This package provides examples for PyODE. --- pyode-1.2.0.orig/debian/control.in +++ pyode-1.2.0/debian/control.in @@ -0,0 +1,27 @@ +#define RUNWITH sed -e "/#include \"description.in\"/r debian/description.in" -e "/#.*/d" +Source: pyode +Section: science +Priority: optional +Maintainer: ExpPsy Maintainers +Uploaders: Yaroslav Halchenko , Michael Hanke +Build-Depends: debhelper (>= 5.0.37.1), python-all-dev (>= 2.3.5-10), python-central (>=0.4.17), libode0-dev, dpatch +XS-Python-Version: all +Standards-Version: 3.7.2 + +Package: python-pyode +Architecture: any +Depends: ${python:Depends}, ${shlibs:Depends} +Conflicts: python2.3-pyode, python2.4-pyode +Replaces: python2.3-pyode, python2.4-pyode +Provides: ${python:Provides} +XB-Python-Version: ${python:Versions} +#include "description.in" + . + This package provides PyODE for supported versions of Python. + +Package: python-pyode-doc +Architecture: all +Section: doc +#include "description.in" + . + This package provides examples for PyODE. --- pyode-1.2.0.orig/debian/copyright +++ pyode-1.2.0/debian/copyright @@ -0,0 +1,72 @@ +This package was debianized by Yaroslav Halchenko on +Sat, 13 May 2006 16:32:54 -0400. + +It was downloaded from http://pyode.sourceforge.net/ + +Copyright Holders: + Copyright (C) 2004 PyODE developers (see file AUTHORS) + +AUTHORS: + Timothy Stranex + Matthias Baas + Brett Hartshorn + Bernie Roehl + +Licenses: packaged software and documentation can be distributed under +LGPL or BSD-style licenses. + +LGPL: + + This package is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the LGPL license can be found in +/usr/share/common-licenses/LGPL file. + +BSD-style: + +This is the BSD-style license for the Python Open Dynamics Engine Wrapper +------------------------------------------------------------------------- + +Python Open Dynamics Engine Wrapper +Copyright (c) 2004, PyODE developers (see file AUTHORS) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +Neither the names of ODE's copyright owner nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --- pyode-1.2.0.orig/debian/description.in +++ pyode-1.2.0/debian/description.in @@ -0,0 +1,6 @@ +Description: open-source Python bindings for The Open Dynamics Engine + PyODE is a set of open-source Python bindings for The Open Dynamics + Engine, an open-source physics engine. PyODE also includes an XODE + parser. + . + Homepage: http://pyode.sourceforge.net/ --- pyode-1.2.0.orig/debian/patches/00_upstream_1.2.0-now.dpatch +++ pyode-1.2.0/debian/patches/00_upstream_1.2.0-now.dpatch @@ -0,0 +1,940 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 00_upstream_1.2.0-now.dpatch by Yaroslav Halchenko +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Upstream changes since 1.2.0 till 20090320 + +@DPATCH@ +diff -urNad pyode-1.2.0~/ChangeLog pyode-1.2.0/ChangeLog +--- pyode-1.2.0~/ChangeLog 2006-11-28 11:33:29.000000000 -0500 ++++ pyode-1.2.0/ChangeLog 2009-03-20 12:06:16.000000000 -0400 +@@ -1,8 +1,56 @@ +-2006-11-28 Matthias Baas ++2009-02-19 Ethan Glasser-Camp ++ ++ * declarations.pyx, world.pyp: expose linear/angular damping ++ controls. Patch by Tristam MacDonald. ++ ++2008-12-23 Ethan Glasser-Camp ++ ++ * setup.py: Compiling against new ODE. Needs to use ode-config to ++ get CFLAGS and LIBS (for example, to tell if we're compiling with ++ -DdDOUBLE). ++ * ode.pyx, declarations.pyx: Compiling against new ODE requires ++ dInitODE to initialize colliders. ++ * Renamed __new__ to __cinit__ for the new version of Pyrex. ++ ++2008-12-21 Ethan Glasser-Camp ++ ++ * space.pyx: Rebuilding with new Pyrex gives an error with parameter ++ "type". Renamed to "space_type" in Space factory method. ++ ++2007-07-09 Ethan Glasser-Camp ++ ++ * tutorial3.py: change glScale to glScalef to be compatible with ++ python-opengl version 3.0 and up. Thanks to Nathanial Troutman for ++ finding the bug and suggesting a fix. ++ ++2007-06-16 Ethan Glasser-Camp ++ ++ * ode.pyx: reapplied weakref patch after finding the bug ++ * tutorial3.py: fix bug where geoms were not stored, causing them ++ to be deleted as per the weakref patch :) ++ ++2007-06-14 Ethan Glasser-Camp ++ ++ * heightfielddata.pyx: bug fix from Dan Miller ++ * Reverted weakref patch -- it causes some kind of strange ++ bug. I'll look into it later. ++ * heightfielddata.pyx: Save a reference to the data tuple, because ++ otherwise it gets garbage collected and causes problems. Thanks ++ to Dan Miller for finding the bug and figuring it out. ++ ++2007-06-05 Matthias Baas ++ ++ * Applied a couple of patches posted by Ethan Glasser-Camp to the ++ mailing list (doc strings for GeomRay, __delattr__ on ++ GeomObject, UniversalJoint angle updates, storing ++ Geoms with weak references, triangle count) ++ * Added the heightfield patch as well ++ ++2006-11-28 Matthias Baas + + * setup.py: Modified the setup script to upgrade to ODE 0.7. + +-2006-11-10 Matthias Baas ++2006-11-10 Matthias Baas + + * joints.pyx, geoms.pyx: Applied some more patches by + Ethan Glasser-Camp (switched from the ccylinder functions to +@@ -11,7 +59,7 @@ + available and is an alias for GeomCapsule. Added support for + GeomCylinder (the uncapped one)). + +-2006-11-09 Matthias Baas ++2006-11-09 Matthias Baas + + * joints.pyx: Applied a patch from the mailing list that adds support + for the LMotor (thanks to Ethan Glasser-Camp). +@@ -21,26 +69,26 @@ + These changes requires a more recent version of ODE than 0.5 + (I've switched to v0.7 now). + +-2006-08-15 Matthias Baas ++2006-08-15 Matthias Baas + + * joints.pyx: The JointGroup.__dealloc__() method now notifies + the contained joints about the destruction of the ODE joints + (i.e. _destroyed() is called). + +-2006-05-30 Matthias Baas ++2006-05-30 Matthias Baas + + * mass.pyx: Applied Chris Bainbridge's patch that adds the + Mass.setBoxTotal() method, and while I was at it I added + the other set*Total() methods, too. + +-2006-04-13 Matthias Baas ++2006-04-13 Matthias Baas + + * space.pyx, joints.pyx: Fixed some doc strings that generated + epydoc warnings. + * ode.pyx: Added the collide2() function (and fixed some more doc + strings). + +-2006-01-17 Matthias Baas ++2006-01-17 Matthias Baas + + * geomobject.pyx: Added the getQuaternion()/setQuaternion() methods + +@@ -52,17 +100,17 @@ + * tests/test_xode.py: Fixed some instances of testing floats for + equality. + +-2005-09-20 Matthias Baas ++2005-09-20 Matthias Baas + + * ode.pyx: Added the ParamX3 parameter names and the ParamGroup definition + +-2005-06-24 Matthias Baas ++2005-06-24 Matthias Baas + + * Modified the base joint class so that its possible to store + arbitrary attributes (as is the case with regular Python classes). + This was suggested in "bug" 1121141. + +-2005-06-06 Matthias Baas ++2005-06-06 Matthias Baas + + * Creating a Body now requires a World object. Empty Bodies are not + allowed anymore. The ode.environment object now simply holds None +@@ -70,12 +118,12 @@ + the attach() method. + * Added an iterator to iterate over the geoms inside a Space. + +-2005-05-05 Matthias Baas ++2005-05-05 Matthias Baas + + * src\joints.pyx (Joints): Added methods to set joint forces/torques directly (section 7.6 + in the ODE manual). + +-2005-03-03 Matthias Baas ++2005-03-03 Matthias Baas + + * src\geomobject.pyx (setCollideBits, setCategoryBits): Bits can now also be passed as int. + Updated doc about collide and category bits (which are actually long instead of int). +diff -urNad pyode-1.2.0~/examples/tutorial3.py pyode-1.2.0/examples/tutorial3.py +--- pyode-1.2.0~/examples/tutorial3.py 2005-12-16 12:06:48.000000000 -0500 ++++ pyode-1.2.0/examples/tutorial3.py 2009-03-20 12:06:16.000000000 -0400 +@@ -70,7 +70,7 @@ + glMultMatrixd(rot) + if body.shape=="box": + sx,sy,sz = body.boxsize +- glScale(sx, sy, sz) ++ glScalef(sx, sy, sz) + glutSolidCube(1) + glPopMatrix() + +@@ -93,21 +93,22 @@ + geom = ode.GeomBox(space, lengths=body.boxsize) + geom.setBody(body) + +- return body ++ return body, geom + + # drop_object + def drop_object(): + """Drop an object into the scene.""" + +- global bodies, counter, objcount ++ global bodies, geom, counter, objcount + +- body = create_box(world, space, 1000, 1.0,0.2,0.2) ++ body, geom = create_box(world, space, 1000, 1.0,0.2,0.2) + body.setPosition( (random.gauss(0,0.1),3.0,random.gauss(0,0.1)) ) + theta = random.uniform(0,2*pi) + ct = cos (theta) + st = sin (theta) + body.setRotation([ct, 0., -st, 0., 1., 0., st, 0., ct]) + bodies.append(body) ++ geoms.append(geom) + counter=0 + objcount+=1 + +@@ -197,6 +198,9 @@ + # A list with ODE bodies + bodies = [] + ++# The geoms for each of the bodies ++geoms = [] ++ + # A joint group for the contact joints that are generated whenever + # two bodies collide + contactgroup = ode.JointGroup() +diff -urNad pyode-1.2.0~/setup.py pyode-1.2.0/setup.py +--- pyode-1.2.0~/setup.py 2007-01-11 11:37:39.000000000 -0500 ++++ pyode-1.2.0/setup.py 2009-03-20 12:06:16.000000000 -0400 +@@ -7,6 +7,10 @@ + import shutil, os, os.path, sys, glob + from stat import * + ++def system(cmd): ++ f = os.popen(cmd) ++ return f.read() ++ + # Include directories + INC_DIRS = [] + # Library directories +@@ -15,8 +19,10 @@ + LIBS = [] + # Additional compiler arguments + CC_ARGS = [] ++CC_ARGS.extend(system("ode-config --cflags").split()) + # Additional linker arguments + LINK_ARGS = [] ++LINK_ARGS.extend(system("ode-config --libs").split()) + + # If your version of ODE was compiled with OPCODE (trimesh support) enabled, + # this should be set to True. +@@ -46,7 +52,6 @@ + + LIBS += ["ode", "stdc++"] + +- + ###################################################################### + ###################################################################### + ###################################################################### +diff -urNad pyode-1.2.0~/src/body.pyx pyode-1.2.0/src/body.pyx +--- pyode-1.2.0~/src/body.pyx 2005-06-06 09:09:30.000000000 -0400 ++++ pyode-1.2.0/src/body.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -43,7 +43,7 @@ + # (set via __getattr__ and __setattr__) + cdef object userattribs + +- def __new__(self, World world not None): ++ def __cinit__(self, World world not None): + self.bid = dBodyCreate(world.wid) + + def __init__(self, World world not None): +diff -urNad pyode-1.2.0~/src/contact.pyx pyode-1.2.0/src/contact.pyx +--- pyode-1.2.0~/src/contact.pyx 2004-11-15 15:16:03.000000000 -0500 ++++ pyode-1.2.0/src/contact.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -38,7 +38,7 @@ + + cdef dContact _contact + +- def __new__(self): ++ def __cinit__(self): + self._contact.surface.mode = ContactBounce + self._contact.surface.mu = dInfinity + +diff -urNad pyode-1.2.0~/src/declarations.pyx pyode-1.2.0/src/declarations.pyx +--- pyode-1.2.0~/src/declarations.pyx 2006-11-10 05:53:40.000000000 -0500 ++++ pyode-1.2.0/src/declarations.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -49,6 +49,8 @@ + int _dummy + cdef struct dxTriMeshData: + int _dummy ++ cdef struct dxHeightfieldData: ++ int _dummy + + # Types + ctypedef dxWorld* dWorldID +@@ -58,6 +60,7 @@ + ctypedef dxJoint* dJointID + ctypedef dxJointGroup* dJointGroupID + ctypedef dxTriMeshData* dTriMeshDataID ++ ctypedef dxHeightfieldData* dHeightfieldDataID + ctypedef dReal dVector3[4] + ctypedef dReal dVector4[4] + ctypedef dReal dMatrix3[4*3] +@@ -81,6 +84,7 @@ + dVector3 t2 + + ctypedef void dNearCallback(void* data, dGeomID o1, dGeomID o2) ++ ctypedef dReal dHeightfieldGetHeight( void* p_user_data, int x, int z ) + + ctypedef struct dSurfaceParameters: + int mode +@@ -111,6 +115,7 @@ + void dWorldDestroy (dWorldID) + + void dCloseODE() ++ void dInitODE() + + void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z) + void dWorldGetGravity (dWorldID, dVector3 gravity) +@@ -136,6 +141,10 @@ + int dWorldGetAutoDisableSteps (dWorldID) + void dWorldSetAutoDisableTime (dWorldID, dReal time) + dReal dWorldGetAutoDisableTime (dWorldID) ++ dReal dWorldGetLinearDamping (dWorldID) ++ void dWorldSetLinearDamping (dWorldID, dReal scale) ++ dReal dWorldGetAngularDamping (dWorldID) ++ void dWorldSetAngularDamping (dWorldID, dReal scale) + void dWorldImpulseToForce (dWorldID, dReal stepsize, + dReal ix, dReal iy, dReal iz, dVector3 force) + +@@ -281,6 +290,10 @@ + void dJointGetUniversalAxis1 (dJointID, dVector3 result) + void dJointGetUniversalAxis2 (dJointID, dVector3 result) + dReal dJointGetUniversalParam (dJointID, int parameter) ++ dReal dJointGetUniversalAngle1 (dJointID) ++ dReal dJointGetUniversalAngle2 (dJointID) ++ dReal dJointGetUniversalAngle1Rate (dJointID) ++ dReal dJointGetUniversalAngle2Rate (dJointID) + int dJointGetAMotorNumAxes (dJointID) + void dJointGetAMotorAxis (dJointID, int anum, dVector3 result) + int dJointGetAMotorAxisRel (dJointID, int anum) +@@ -446,8 +459,24 @@ + void dGeomTriMeshGetTriangle (dGeomID g, int Index, dVector3 *v0, + dVector3 *v1, dVector3 *v2) + ++ int dGeomTriMeshGetTriangleCount (dGeomID g) ++ + void dGeomTriMeshGetPoint (dGeomID g, int Index, dReal u, dReal v, + dVector3 Out) + + void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable) + int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass) ++ ++ # Heightfield ++ dHeightfieldDataID dGeomHeightfieldDataCreate() ++ void dGeomHeightfieldDataDestroy(dHeightfieldDataID g) ++ void dGeomHeightfieldDataBuildCallback(dHeightfieldDataID d, ++ void* pUserData, ++ dHeightfieldGetHeight* pCallback, ++ dReal width, dReal depth, ++ int widthSamples, int depthSamples, ++ dReal scale, dReal offset, ++ dReal thickness, int bWrap) ++ dGeomID dCreateHeightfield (dSpaceID space, dHeightfieldDataID data, ++ int bPlaceable) ++ +diff -urNad pyode-1.2.0~/src/geomobject.pyx pyode-1.2.0/src/geomobject.pyx +--- pyode-1.2.0~/src/geomobject.pyx 2006-01-17 04:07:54.000000000 -0500 ++++ pyode-1.2.0/src/geomobject.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -52,7 +52,9 @@ + # A dictionary with user defined attributes + cdef object attribs + +- def __new__(self, *a, **kw): ++ cdef object __weakref__ ++ ++ def __cinit__(self, *a, **kw): + self.gid = NULL + self.space = None + self.body = None +@@ -75,6 +77,12 @@ + def __setattr__(self, name, val): + self.attribs[name]=val + ++ def __delattr__(self, name): ++ if name in self.attribs: ++ del self.attribs[name] ++ else: ++ raise AttributeError, "geom has no attribute '%s'."%name ++ + def _id(self): + """_id() -> int + +diff -urNad pyode-1.2.0~/src/geoms.pyx pyode-1.2.0/src/geoms.pyx +--- pyode-1.2.0~/src/geoms.pyx 2006-11-10 05:53:40.000000000 -0500 ++++ pyode-1.2.0/src/geoms.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -30,7 +30,7 @@ + GeomSphere(space=None, radius=1.0) + """ + +- def __new__(self, space=None, radius=1.0): ++ def __cinit__(self, space=None, radius=1.0): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -99,7 +99,7 @@ + GeomBox(space=None, lengths=(1.0, 1.0, 1.0)) + """ + +- def __new__(self, space=None, lengths=(1.0, 1.0, 1.0)): ++ def __cinit__(self, space=None, lengths=(1.0, 1.0, 1.0)): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -163,7 +163,7 @@ + + """ + +- def __new__(self, space=None, normal=(0,0,1), dist=0): ++ def __cinit__(self, space=None, normal=(0,0,1), dist=0): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -223,7 +223,7 @@ + The length parameter does not include the caps. + """ + +- def __new__(self, space=None, radius=0.5, length=1.0): ++ def __cinit__(self, space=None, radius=0.5, length=1.0): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -285,7 +285,7 @@ + GeomCylinder(space=None, radius=0.5, length=1.0) + """ + +- def __new__(self, space=None, radius=0.5, length=1.0): ++ def __cinit__(self, space=None, radius=0.5, length=1.0): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -337,7 +337,7 @@ + + """ + +- def __new__(self, space=None, rlen=1.0): ++ def __cinit__(self, space=None, rlen=1.0): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -362,15 +362,40 @@ + return id + + def setLength(self, rlen): ++ '''setLength(rlen) ++ ++ Set length of the ray. ++ ++ @param rlen: length of the ray ++ @type rlen: float''' + dGeomRaySetLength(self.gid, rlen) + + def getLength(self): ++ '''getLength() -> length ++ ++ Get the length of the ray. ++ ++ @returns: length of the ray (float)''' + return dGeomRayGetLength(self.gid) + + def set(self, p, u): ++ '''set(p, u) ++ ++ Set the position and rotation of a ray. ++ ++ @param p: position ++ @type p: 3-sequence of floats ++ @param u: rotation ++ @type u: 3-sequence of floats''' + dGeomRaySet(self.gid, p[0],p[1],p[2], u[0],u[1],u[2]) + + def get(self): ++ '''get() -> ((p[0], p[1], p[2]), (u[0], u[1], u[2])) ++ ++ Return the position and rotation as a pair of ++ tuples. ++ ++ @returns: position and rotation''' + cdef dVector3 start + cdef dVector3 dir + dGeomRayGet(self.gid, start, dir) +@@ -392,7 +417,7 @@ + + cdef object geom + +- def __new__(self, space=None): ++ def __cinit__(self, space=None): + cdef SpaceBase sp + cdef dSpaceID sid + +diff -urNad pyode-1.2.0~/src/heightfield.pyx pyode-1.2.0/src/heightfield.pyx +--- pyode-1.2.0~/src/heightfield.pyx 1969-12-31 19:00:00.000000000 -0500 ++++ pyode-1.2.0/src/heightfield.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -0,0 +1,59 @@ ++###################################################################### ++# Python Open Dynamics Engine Wrapper ++# Copyright (C) 2004 PyODE developers (see file AUTHORS) ++# All rights reserved. ++# ++# This library is free software; you can redistribute it and/or ++# modify it under the terms of EITHER: ++# (1) The GNU Lesser General Public License as published by the Free ++# Software Foundation; either version 2.1 of the License, or (at ++# your option) any later version. The text of the GNU Lesser ++# General Public License is included with this library in the ++# file LICENSE. ++# (2) The BSD-style license that is included with this library in ++# the file LICENSE-BSD. ++# ++# This library is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files ++# LICENSE and LICENSE-BSD for more details. ++###################################################################### ++ ++cdef class GeomHeightfield(GeomObject): ++ """Heightfield object. ++ ++ To construct the heightfield geom, you need a HeightfieldData object that ++ stores the heightfield data. This object has to be passed as the first ++ argument to the constructor. ++ ++ Constructor:: ++ GeomHeightfield(data, space=None) ++ """ ++ cdef HeightfieldData data ++ ++ def __cinit__(self, HeightfieldData data not None, ++ placeable=True, space=None): ++ cdef SpaceBase sp ++ cdef dSpaceID sid ++ ++ self.data = data ++ ++ sid=NULL ++ if space!=None: ++ sp = space ++ sid = sp.sid ++ self.gid = dCreateHeightfield(sid, data.hfdid, placeable) ++ ++ _geom_c2py_lut[self.gid] = self ++ ++ def __init__(self, HeightfieldData data not None, space=None): ++ self.space = space ++ self.body = None ++ ++ def placeable(self): ++ return True ++ ++ def _id(self): ++ cdef long id ++ id = self.gid ++ return id +diff -urNad pyode-1.2.0~/src/heightfielddata.pyx pyode-1.2.0/src/heightfielddata.pyx +--- pyode-1.2.0~/src/heightfielddata.pyx 1969-12-31 19:00:00.000000000 -0500 ++++ pyode-1.2.0/src/heightfielddata.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -0,0 +1,54 @@ ++###################################################################### ++# Python Open Dynamics Engine Wrapper ++# Copyright (C) 2004 PyODE developers (see file AUTHORS) ++# All rights reserved. ++# ++# This library is free software; you can redistribute it and/or ++# modify it under the terms of EITHER: ++# (1) The GNU Lesser General Public License as published by the Free ++# Software Foundation; either version 2.1 of the License, or (at ++# your option) any later version. The text of the GNU Lesser ++# General Public License is included with this library in the ++# file LICENSE. ++# (2) The BSD-style license that is included with this library in ++# the file LICENSE-BSD. ++# ++# This library is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files ++# LICENSE and LICENSE-BSD for more details. ++###################################################################### ++ ++cdef class HeightfieldData: ++ """This class is used to store heightfield data. ++ """ ++ cdef dHeightfieldDataID hfdid ++ # This attribute stores the tuple which gets passed to the height ++ # callback. If we don't keep a reference, the tuple gets garbage ++ # collected. ++ cdef object calltup ++ ++ def __cinit__(self): ++ self.hfdid = dGeomHeightfieldDataCreate() ++ ++ def __dealloc__(self): ++ if self.hfdid!=NULL: ++ dGeomHeightfieldDataDestroy(self.hfdid) ++ ++ def build_callback(self, userdata, callback, width, depth, wsamp, dsamp, ++ scale, offset, thickness, bwrap): ++ cdef object tup ++ cdef void* data ++ tup = (callback, userdata) ++ self.calltup = tup ++ data = tup ++ dGeomHeightfieldDataBuildCallback(self.hfdid, ++ data, get_height, width, depth, ++ wsamp, dsamp, scale, offset, ++ thickness, bwrap) ++ ++cdef dReal get_height(void *data, int x, int z): ++ cdef object tup ++ tup = data ++ callback, arg = tup ++ return callback(arg, x, z) +diff -urNad pyode-1.2.0~/src/joints.pyx pyode-1.2.0/src/joints.pyx +--- pyode-1.2.0~/src/joints.pyx 2006-11-10 05:43:23.000000000 -0500 ++++ pyode-1.2.0/src/joints.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -47,7 +47,7 @@ + # A list of Python joints that were added to the group + cdef object jointlist + +- def __new__(self): ++ def __cinit__(self): + self.gid = dJointGroupCreate(0) + + def __init__(self): +@@ -108,7 +108,7 @@ + # (set via __getattr__ and __setattr__) + cdef object userattribs + +- def __new__(self, *a, **kw): ++ def __cinit__(self, *a, **kw): + self.jid = NULL + self.world = None + self.feedback = NULL +@@ -263,7 +263,7 @@ + BallJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -335,7 +335,7 @@ + HingeJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -489,7 +489,7 @@ + SlideJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -575,7 +575,7 @@ + UniversalJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -684,13 +684,25 @@ + """ + dJointAddUniversalTorques(self.jid, torque1, torque2) + ++ def getAngle1(self): ++ return dJointGetUniversalAngle1(self.jid) ++ ++ def getAngle2(self): ++ return dJointGetUniversalAngle2(self.jid) ++ ++ def getAngle1Rate(self): ++ return dJointGetUniversalAngle1Rate(self.jid) ++ ++ def getAngle2Rate(self): ++ return dJointGetUniversalAngle2Rate(self.jid) ++ + # setParam + def setParam(self, param, value): + dJointSetUniversalParam(self.jid, param, value) + + # getParam + def getParam(self, param): +- return dJointGetUniversalParam(self.jid, param) ++ return dJointGetUniversalParam(self.jid, param) + + + # Hinge2Joint +@@ -702,7 +714,7 @@ + Hinge2Joint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -858,7 +870,7 @@ + FixedJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -893,7 +905,7 @@ + ContactJoint(world, jointgroup, contact) + """ + +- def __new__(self, World world not None, jointgroup, Contact contact): ++ def __cinit__(self, World world not None, jointgroup, Contact contact): + cdef JointGroup jg + cdef dJointGroupID jgid + jgid=NULL +@@ -916,7 +928,7 @@ + AMotor(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -1089,7 +1101,7 @@ + LMotor(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +@@ -1178,7 +1190,7 @@ + Plane2DJoint(world, jointgroup=None) + """ + +- def __new__(self, World world not None, jointgroup=None): ++ def __cinit__(self, World world not None, jointgroup=None): + cdef JointGroup jg + cdef dJointGroupID jgid + +diff -urNad pyode-1.2.0~/src/mass.pyx pyode-1.2.0/src/mass.pyx +--- pyode-1.2.0~/src/mass.pyx 2006-05-30 10:23:44.000000000 -0400 ++++ pyode-1.2.0/src/mass.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -40,7 +40,7 @@ + """ + cdef dMass _mass + +- def __new__(self): ++ def __cinit__(self): + dMassSetZero(&self._mass) + + def setZero(self): +diff -urNad pyode-1.2.0~/src/ode.pyx pyode-1.2.0/src/ode.pyx +--- pyode-1.2.0~/src/ode.pyx 2006-11-10 05:53:40.000000000 -0500 ++++ pyode-1.2.0/src/ode.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -151,7 +151,10 @@ + ###################################################################### + + # Lookup table for geom objects: C ptr -> Python object +-_geom_c2py_lut = {} ++ ++## This causes some kind of weird bug! Need to fix this. ++import weakref ++_geom_c2py_lut = weakref.WeakValueDictionary() + + # Mass + include "mass.pyx" +@@ -182,6 +185,8 @@ + # (trimesh_dummy.pyx) if trimesh support is not available/desired. + include "_trimesh_switch.pyx" + ++include "heightfielddata.pyx" ++include "heightfield.pyx" + + def collide(geom1, geom2): + """collide(geom1, geom2) -> contacts +@@ -286,7 +291,15 @@ + """ + dCloseODE() + ++def InitODE(): ++ '''InitODE() ++ ++ Initialize some ODE internals. This will be called for you when you ++ "import ode", but you should call this again if you CloseODE().''' ++ dInitODE() ++ + ###################################################################### + + #environment = Body(None) + environment = None ++InitODE() +diff -urNad pyode-1.2.0~/src/space.pyx pyode-1.2.0/src/space.pyx +--- pyode-1.2.0~/src/space.pyx 2006-04-13 09:09:58.000000000 -0400 ++++ pyode-1.2.0/src/space.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -66,7 +66,7 @@ + # is the geom object (Python wrapper). This is used in collide_callback() + # cdef object geom_dict + +- def __new__(self, *a, **kw): ++ def __cinit__(self, *a, **kw): + pass + + def __init__(self, *a, **kw): +@@ -230,7 +230,7 @@ + problems with the collision system. + """ + +- def __new__(self, space=None): ++ def __cinit__(self, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + +@@ -263,7 +263,7 @@ + can be quickly paired with the objects around it. + """ + +- def __new__(self, space=None): ++ def __cinit__(self, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + +@@ -322,7 +322,7 @@ + Currently getGeom() is not implemented for the quadtree space. + """ + +- def __new__(self, center, extents, depth, space=None): ++ def __cinit__(self, center, extents, depth, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + cdef dVector3 c +@@ -351,22 +351,22 @@ + pass + + +-def Space(type=0): ++def Space(space_type=0): + """Space factory function. + + Depending on the type argument this function either returns a +- SimpleSpace (type=0) or a HashSpace (type=1). ++ SimpleSpace (space_type=0) or a HashSpace (space_type=1). + + This function is provided to remain compatible with previous + versions of PyODE where there was only one Space class. + +- >>> space = Space(type=0) # Create a SimpleSpace +- >>> space = Space(type=1) # Create a HashSpace ++ >>> space = Space(space_type=0) # Create a SimpleSpace ++ >>> space = Space(space_type=1) # Create a HashSpace + """ +- if type==0: ++ if space_type==0: + return SimpleSpace() +- elif type==1: ++ elif space_type==1: + return HashSpace() + else: +- raise ValueError, "Unknown space type (%d)"%type +- ++ raise ValueError, "Unknown space type (%d)"%space_type ++ +diff -urNad pyode-1.2.0~/src/trimesh.pyx pyode-1.2.0/src/trimesh.pyx +--- pyode-1.2.0~/src/trimesh.pyx 2004-11-15 15:16:03.000000000 -0500 ++++ pyode-1.2.0/src/trimesh.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -38,7 +38,7 @@ + # Keep a reference to the data + cdef TriMeshData data + +- def __new__(self, TriMeshData data not None, space=None): ++ def __cinit__(self, TriMeshData data not None, space=None): + cdef SpaceBase sp + cdef dSpaceID sid + +@@ -91,4 +91,10 @@ + dGeomTriMeshGetTriangle(self.gid, idx, vp0, vp1, vp2) + return ((v0[0],v0[1],v0[2]), (v1[0],v1[1],v1[2]), (v2[0],v2[1],v2[2])) + ++ def getTriangleCount(self): ++ """getTriangleCount() -> n ++ ++ Returns the number of triangles in the TriMesh.""" ++ ++ return dGeomTriMeshGetTriangleCount(self.gid) + +diff -urNad pyode-1.2.0~/src/trimeshdata.pyx pyode-1.2.0/src/trimeshdata.pyx +--- pyode-1.2.0~/src/trimeshdata.pyx 2004-11-15 15:16:04.000000000 -0500 ++++ pyode-1.2.0/src/trimeshdata.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -27,7 +27,7 @@ + cdef dReal* vertex_buffer + cdef int* face_buffer + +- def __new__(self): ++ def __cinit__(self): + self.tmdid = dGeomTriMeshDataCreate() + self.vertex_buffer = NULL + self.face_buffer = NULL +diff -urNad pyode-1.2.0~/src/world.pyx pyode-1.2.0/src/world.pyx +--- pyode-1.2.0~/src/world.pyx 2004-11-15 15:16:04.000000000 -0500 ++++ pyode-1.2.0/src/world.pyx 2009-03-20 12:06:16.000000000 -0400 +@@ -33,7 +33,7 @@ + + cdef dWorldID wid + +- def __new__(self): ++ def __cinit__(self): + self.wid = dWorldCreate() + + def __dealloc__(self): +@@ -323,6 +323,44 @@ + """ + return dWorldGetAutoDisableTime(self.wid) + ++ # setLinearDamping ++ def setLinearDamping(self, scale): ++ """setLinearDamping(scale) ++ ++ Set the world's linear damping scale. ++ @param scale The linear damping scale that is to be applied to bodies. ++ Default is 0 (no damping). Should be in the interval [0, 1]. ++ @type scale: float ++ """ ++ dWorldSetLinearDamping(self.wid, scale) ++ ++ # getLinearDamping ++ def getLinearDamping(self): ++ """getLinearDamping() -> float ++ ++ Get the world's linear damping scale. ++ """ ++ return dWorldGetLinearDamping(self.wid) ++ ++ # setAngularDamping ++ def setAngularDamping(self, scale): ++ """setAngularDamping(scale) ++ ++ Set the world's angular damping scale. ++ @param scale The angular damping scale that is to be applied to bodies. ++ Default is 0 (no damping). Should be in the interval [0, 1]. ++ @type scale: float ++ """ ++ dWorldSetAngularDamping(self.wid, scale) ++ ++ # getAngularDamping ++ def getAngularDamping(self): ++ """getAngularDamping() -> float ++ ++ Get the world's angular damping scale. ++ """ ++ return dWorldGetAngularDamping(self.wid) ++ + # impulseToForce + def impulseToForce(self, stepsize, impulse): + """impulseToForce(stepsize, impulse) -> 3-tuple --- pyode-1.2.0.orig/debian/patches/00list +++ pyode-1.2.0/debian/patches/00list @@ -0,0 +1 @@ +00_upstream_1.2.0-now.dpatch --- pyode-1.2.0.orig/debian/patches/01_ode_notrimesh.dpatch +++ pyode-1.2.0/debian/patches/01_ode_notrimesh.dpatch @@ -0,0 +1,19 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 01_ode_notrimesh.dpatch by Yaroslav Halchenko +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +@DPATCH@ +diff -urNad pyode-1.2.0.obsolete.0.0752626925977928~/setup.py pyode-1.2.0.obsolete.0.0752626925977928/setup.py +--- pyode-1.2.0.obsolete.0.0752626925977928~/setup.py 2007-01-11 11:37:39.000000000 -0500 ++++ pyode-1.2.0.obsolete.0.0752626925977928/setup.py 2007-02-15 11:02:08.000000000 -0500 +@@ -20,7 +20,7 @@ + + # If your version of ODE was compiled with OPCODE (trimesh support) enabled, + # this should be set to True. +-TRIMESH_ENABLE = True ++TRIMESH_ENABLE = False + + ###################################################################### + # Windows specific settings --- pyode-1.2.0.orig/debian/python-pyode-doc.examples +++ pyode-1.2.0/debian/python-pyode-doc.examples @@ -0,0 +1,2 @@ +examples/* + --- pyode-1.2.0.orig/debian/rules +++ pyode-1.2.0/debian/rules @@ -0,0 +1,122 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# +# This file was originally written by Joey Hess and Craig Small. +# build-arch and build-indep targets by Bill Allombert 2001 +# Changes for python-pyepl and for python-pyode by Yaroslav Halchenko + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +# no parallel execution -- required for dpatch +.NOTPARALLEL: + +PYVERS := $(shell pyversions -vs) +PYVER := $(shell pyversions -vd) + +PYNAME=pyode +BASE=$(CURDIR)/debian +PYPACKAGE=python-$(PYNAME) +BASE=$(CURDIR)/debian + +CFLAGS = -Wall -g +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +include /usr/share/dpatch/dpatch.make + +#Architecture +build: debian/control patch build-arch build-indep + +debian/control: debian/control.in + sed -e "/#include \"description.in\"/r debian/description.in" -e "/#.*/d" $^ >| $@ + +#Architecture +build: debian/control patch build-arch build-indep +build-arch: build-arch-stamp +build-arch-stamp: $(PYVERS:%=build-arch-python%) + touch $@ + +build-arch-python%: + python$* setup.py build_ext + touch $@ + +build-indep: build-indep-stamp +build-indep-stamp: +# $(MAKE) -C code/documentation/ + touch build-indep-stamp + +clean: clean-patched unpatch +clean-patched: debian/control + dh_testdir + dh_testroot + rm -f build-arch-stamp build-arch-python* build-indep-stamp + rm -rf build + dh_clean + +pre-install: + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + +install: build pre-install install-indep install-arch + +install-indep: + dh_testdir + dh_testroot + dh_clean -k -i + dh_installdirs -i + + # Add here commands to install the indep part of the package into + # debian/-doc. + # might be deployed later + #INSTALLDOC# + + dh_install -i + +install-python%: + python$* setup.py install --root $(BASE)/$(PYPACKAGE) --no-compile + python$* setup.py clean + +install-arch: pre-install $(PYVERS:%=install-python%) + dh_install -s + +binary-common: + dh_testdir + dh_testroot + dh_installchangelogs ChangeLog + dh_installdocs AUTHORS README + dh_installexamples + dh_link + + dh_strip + dh_compress -X.py + dh_fixperms + + dh_python2 + + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture independant packages using the common target. +binary-indep: build-indep install-indep + $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common + +# Build architecture dependant packages using the common target. +binary-arch: build-arch install-arch + $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common + +binary: binary-arch binary-indep +.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch --- pyode-1.2.0.orig/debian/shlibs.local +++ pyode-1.2.0/debian/shlibs.local @@ -0,0 +1 @@ +libode 0 libode0c2 (>= 0.7-1) --- pyode-1.2.0.orig/debian/watch +++ pyode-1.2.0/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://sf.net/pyode/ PyODE-([\d\.]*)\.tar.gz debian svn-upgrade