[Distutils] Package versioning

David Ascher da@ski.org
Wed, 21 Apr 1999 14:32:23 -0700 (Pacific Daylight Time)


On Wed, 21 Apr 1999, Greg Ward wrote:

> On 19 April 1999, Timothy Docker said:

> > Assuming it does, then how will this be achieved? I am presently
> > managing this with a messy arrangement of symlinks. 
> 
> That's about the only thing I can think of.  

Symlinks aren't portable.  

I use a package which imports a subpackage based on code performed in the
toplevel __init__.py file.  

So, for example, my Snow directory (in my sys.path):

Snow/
  __init__.py
  mknewversion.py
  Snow_1999_3_14
  Snow_1999_3_16
  ...

The code in __init__.py is a bit ugly but looks something like:

import sys, os, imp, string
_dir = __path__[0]
_listdir = os.listdir(_dir)
_thisdir = os.path.basename(_dir)
_instdirs = filter(lambda x: x[:len(_thisdir)+1] == _thisdir+'_', _listd

def datesort(f1, f2):
    parts1 = string.split(f1, '_')
    parts1[1:] = map(int, parts1[1:])
    parts2 = string.split(f2, '_')
    parts2[1:] = map(int, parts2[1:])
    return cmp(parts1, parts2)

_instdirs.sort(datesort)
_latest = _instdirs[-1]
_file, _pathname, _description = imp.find_module(_latest, __path__)
_module = imp.load_module(_latest, _file, _pathname, _description)
globals().update(_module.__dict__)

This is similar to Pmw's scheme.

mknewversion.py is a similar-looking script which makes copies of the
current version, comes up with the directory name based on the date and
existing versions, and does some platform-specific things (add symbolic
links for the programmer's sake, not the user's).

It's not ideal, but it's portable and customizable.

--david