Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I have a number of mesa packages that I had upgraded to a PPA version, before purging the PPA so I could upgrade my system. The differences in the versions are minor (they are technically the same, just one set of libraries were from git and the others are the final versions).

If I try to downgrade via Synaptic, apt-get, or aptitude, I get thrown into dependency hell.

Is there a way to downgrade the packages manually (perhaps one by one) and mark their dependant packages as immovable (if that makes sense) until I am done?

P.S. this question: How to Downgrade a Package via apt-get? is a bit different and doesn't help this situation.

share|improve this question
    
Why don't you ppa-purge first? –  landroni Feb 4 at 7:38
    
You may reinstall the package.For example if you use synaptic, when you select the xyz package, all dependencies will be selected by default.But you may always deselect all dependencies and just install main package.Later you may install all dependencies.But again, this works only if you are ready to reinstall. –  Registered User Feb 5 at 11:04
    
@landroni if I purge, it will remove the packages I don't want to remove. –  RolandiXor Feb 5 at 19:43
add comment

2 Answers 2

up vote 3 down vote accepted
+200

I never played with this before, but I would suggest that you hold (or lock) the version of the dependencies that cause you trouble. This way apt has a more limited number of possible solutions, and perhaps doesn't get confused when you attempt to downgrade the other packages.


If nothing else works, you could take the manual approach suggested in this answer: How to Downgrade a Package via apt-get?. Basically, download the necessary .deb packages manually, then install them one by one using the lower-level dpkg and one of its forceful arguments: --ignore-depends, --force-depends, --force-depends-version, or even --force-all.

In the same spirit as the above, you have the --force-downgrade argument:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

But this assumes that you've read man dpkg, and that you understand what you do:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

See Error: version number does not start with digit and How to install an older version of Java and How to install a older version of package like liquid 2.2.2? for examples of:

sudo dpkg --force-downgrade -i your_mesa_package.deb

And see How can I install a package without installing some dependencies? for an example (along with the appropriate warning) of:

sudo dpkg --force-all -i your_mesa_package.deb

Yet another approach would be to create a dummy .deb package using the equivs package (and perhaps a slightly different name). Then installing the dummy package should allow you to remove the "true" package while keeping the relevant deps, and then install the older version. I'm not sure how exactly this would work, but check this relevant thread for details: How to remove a deb without removing its dependencies.

share|improve this answer
add comment

You could first use apt-mark to mark all the target package's dependencies (and maybe the recommended/suggested ones too) installed in the system as manual installs. After doing that, install the preceding versions of the software with apt-get mentioning the version explicitly.

  • To list the dependency, recommended and suggested packages for the target-package:

    apt-cache show <target-package-name>
    
  • Marking packages as manually installed:

    sudo apt-mark manual <package-name(s)>
    

    (use this for all dependencies, recommends and suggested.)

  • Remove the target-package:

    sudo apt-get remove <target-package-name>
    
  • To see a list of package versions that you may downgrade/upgrade to, use:

    apt-cache policy <target-package-name>
    
  • Install the target version of the required package:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    or

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. If the list of dependencies/recommended/suggested packages i.e. those which are to be marked with apt-mark is large, save the intended list of the packaged output by apt-cache show <target-package-name> to any file say /path/to/foo and use the apt-mark in a combo like this:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
share|improve this answer
    
This method may work, but instead of marking over 100 packages, I just went with the other answer. –  RolandiXor Feb 6 at 14:41
    
@RolandiXor, you could use apt-cache policy <target-package-name> for having a list of package versions that you may downgrade/upgrade to.. –  rusty Feb 6 at 14:42
    
..please refer the edit made to the post; if larger number of files are to be marked you could use the command combo included... –  rusty Feb 6 at 15:08
    
I don't think you're understanding me. Anyway, I got it fixed now and I've given out the bounty (can't switch it). –  RolandiXor Feb 6 at 15:44
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.