On Fri, 24 Sep 2004, Brian Dessent wrote: > Igor Pechtchanski wrote: > > > It'll work for simple programs, but not for packages where preremove > > scripts erase files that are needed to run some programs from that > > package. One example (not necessarily a perfect one) that comes to mind > > right away is the base-files package, where the preremove script will > > currently erase /etc/profile (so any script executing "bash -l" will not > > get the expected results). I'm sure there are better examples... > > > > FWIW, this is probably somewhat similar to the issue of circular > > dependencies of postinstall scripts -- there is no good general solution > > if we assume monolithic scripts. > > Wouldn't the "proper" way to do this be to build the dependency tree > then remove packages in depth-first order, running each preremove before > removing each package list? > > Example: > > Dependency tree: > > A > / \ > B C > \ > D > > So lets say you want to remove and then upgrade new versions of A, B, C, > and D. > > You first get the depth-first order: D, C, B, A.
<PEDANTIC> Properly speaking, the depth-first order will be B, D, C, A... </PEDANTIC> > Then you run: preremove(D), remove-files(D), preremove(C), > remove-files(C), preremove(B), remove-files(B), preremove(A), > remove-files(A) Unfortunately, this won't work when you have circular dependencies (e.g., cygwin <-> fileutils). Furthermore, preremove dependencies can't always be determined from package dependencies (see cygwin-apps archives if interested). I think Max's solution is probably the least complex short-term one (i.e., run all preremove scripts in batch *before* removing any files, and hope for the best). > To install you do the same thing, except you'd do breadth-first and > you'd do postinstall(X) after each install-files(X). (I know this is > not the current method, where all postinstalls are run in a batch at the > end.) FWIW, it shouldn't matter whether the postinstall scripts are run after each package's files are installed or at the end, as long as they're run in dependency order. This *is* the way it's supposed to happen in the current method, but there's a bug in the script running code somewhere, and scripts don't get run when packages are traversed, so they're picked up and run afterwards. Say it with me: <http://cygwin.com/acronyms/#PTC>... 0:) Igor -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_ [EMAIL PROTECTED] ZZZzz /,`.-'`' -. ;-;;,_ [EMAIL PROTECTED] |,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski, Ph.D. '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! "Happiness lies in being privileged to work hard for long hours in doing whatever you think is worth doing." -- Dr. Jubal Harshaw -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/