[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Debian Python Policy [draft]



Quoting Neil Schemenauer <nas@python.ca>:

> Jim Penny wrote:
[...]
> The python is a small package to create a link from /usr/bin/python2.2
> to /usr/bin/python.  python-eggs is a dummy package for dependencies
> (similar to what is done for GCC).  When we upgrade Python to 2.2 we
> have:
> 
>             /-------------------------------------> python --->
> python-2.2
>     spam  --                                                   
>             \---> python-eggs ---> python-eggs-2.1 ----------->
> python-2.1
> 
> The dependencies are still broken.  We could have:
> 
>             /------------------------------------------------\
>     spam  --                                                  >
> python-2.1
>             \--------------------> python-eggs-2.1 ----------/  
> 
> That makes spam dependent on the version of Python installed.  Perhaps
> I'm missing some detail of Donovan's plan.

The trick is the wrapper packages python-eggs version dependancy tied to the 
python wrapper package (look familiar?). The python-eggs package is used to 
pull in the latest python-eggs version package for the latest python, so it is 
tied to a particular version of the python wrapper package.

             /----------------------> python (2.1) --------\ 
     spam  --                      /                        \ 
             \              (>=2.1,<2.2)                     > python-2.1
              \                  /                          /
               \--> python-eggs /--> python-2.1-eggs ------/
 
when we upgrade to python 2.2

             /---------------------> python (2.2)------------- python-2.2
     spam  --                                                 
             \              (>=2.1,<2.2)                      
              \                  /                           
               \--> python-eggs /---> python-eggs-2.1 -------- python-2.1
 
spam is broken because python-eggs is broken, but the dependancy system tells 
us it is broken because the python-eggs wrapper depends on a particular version 
of python that has been upgraded.

The thing to remember is spam depends on the latest python and python-eggs. 
When python has been upgraded and python-eggs has not, the latest python + eggs 
combo is broken. There is nothing we can do about this... python (2.2) needs 
python-2.2-eggs for python + eggs to work. So we upgrade python-eggs;

             /----------------------> python (2.2)---------\
     spam  --                      /                        \  
             \              (>=2.2,<2.3)                     > python-2.2
              \                  /                          /
               \--> python-eggs /---> python-2.2-eggs -----/

                                      python-2.1-eggs ------- python-2.1

Now everything is working again. We have upgraded python and python-eggs, and 
created python-2.2 and python-2.2-eggs. Note that at no stage did python-2.1 
and and python-2.1-eggs break, so any packages that depended directly on them 
(ie, tied to the particular 2.1 version packages) never broke. The latest 
version of python + eggs briefly broke as the packages were upgraded. 

This clearly shows the benefits and drawbacks of versioned vs unversioned 
dependancies. spam could have a versioned dependancy against python-2.1 and it 
would never break as python-2.2 was introduced (provided python-2.1 packages 
continued to exist), however, it would have to be upgraded every time python 
upgraded to use the latest python. By not depending on a particular version of 
python, it doesn't need to be upgraded to use the latest python, but requires 
that the latest python + eggs combo is not broken.

In my above diagrams the (>=2.1,<2.2) dependancy could be replaced with a 
python-api-2.1 provided by python (as suggested by Neil), but I think this 
actually introduces confusion rather than convenience. The problem is that it 
doesn't really represent a particular version of the api, just a particular 
version range of the "latest" python package.

Note that my proposal actually has a lot in common with Neil's. We are both 
using (>=2.1,<2.2) dependancies to ensure the latest python + modules breaks 
when not all of them are of the same version, though in his case he has 
introduced the confusing python-api as a shorthand for this. Perhaps 
using "python-base-2.1" or "python-latest-2.1" would be less confusing, but I 
still think the version range is clearer.

The only real difference is I'm proposing the latest packages be small wrappers 
around python-2.1 versioned packages. This means old versioned packages get 
created as you go, rather than after python upgrades, and they don't break as 
python upgrades. It also allows other packages to choose whether they depend on 
python, or python-2.1, even when python 2.1 is the latest version.

--
ABO: finger abo@minkirri.apana.org.au for more information.



Reply to: