Generating a list of all installed software (or something like that).

Ryan Schmidt ryandesign at macports.org
Fri Dec 5 13:31:32 PST 2008


On Dec 5, 2008, at 10:41, Neil wrote:

> On 5 Dec 2008, at 09:04, Tim Visher wrote:
>
>> On Fri, Dec 5, 2008 at 8:37 AM, Joshua Root wrote:
>>
>>> Mikael Gripenstedt wrote:
>>>
>>>> On Dec 5, 2008, at 13:16 , Tim Visher wrote:
>>>>
>>>>> I'd be interested in generating a complete list of all software  
>>>>> I have
>>>>> installed through MacPorts so that I don't have to back up my
>>>>> installation in case of a hard drive failure.  Basic use case  
>>>>> would be
>>>>> that if my disk fails, I just download MacPorts again, and then  
>>>>> run
>>>>> this script through it and after awhile I get my exact install  
>>>>> back
>>>>> the way I had it n-days before the crash.  Any way to do this?
>>>>>
>>>>> This has been inspired by APTonCD's ability to generate a list of
>>>>> everything you've installed through apt for various purposes,  
>>>>> if you
>>>>> want to know an analogue.
>>>>
>>>> port list installed
>>>>
>>>> Will give you a list of installed software. Is this what you were
>>>> looking for?
>>>
>>> You actually want 'port installed' rather than 'port list  
>>> installed',
>>> because 'port list' shows you the version in the index, which may  
>>> not be
>>> the same as what's installed.
>>
>> Wow do I feel sheepish.  I can't believe I couldn't think to do that
>> all by me'lonesome... :\
>
> (Almost) totally untested:
> $ port install | sed 's/(active)$//' | sed 's/^/install/' | grep -v  
> 'The following ports are currently installed:' > my_ports.txt

I'm sure you meant "port installed" as the first bit on that line.

> <trash your partition, reformat, reinstall>
> $ port -F my_ports.txt

Probably prefaced by "sudo".

> Break down of the first line:
> 1. Get list of ports.
> 2. Strip out "(active)"
> 3. Prefix each line with "install" (so port -F knows what action to  
> do with each port)
> 4. Remove the line at the top: 'The following ports are currently  
> installed:'

Using "sed 1d" to remove the header line is shorter and allows for  
the specific message to be changed either through localization or by  
a wording change in some future version of MacPorts.

> 5. Send to file.
>
> Caveats:
> 1. If you, like me, always want the most recent port installed, not  
> a specific one, then you can drop | sed 's/@[^+]*//'
>  | into the chain of seds in line 1, and that should filter out all  
> the version information (and still leave variants).
> 2. This list contains things that were installed as dependencies.   
> If dependencies have been eliminated since you installed stuff  
> last, they'll get installed again, even though this time they're  
> not needed.  MacPorts is currently working towards remedying that  
> situation.
>
> Personally, I just have a textfile with the ports and variants I  
> want in it.

Well, there are several big problems with this method.

First, MacPorts cannot install specific versions of ports, only the  
version specified in your portfiles. Any version number specified in  
your install command is totally ignored. Also you can only have one  
version of a port installed at a time. So if you had php5 @5.2.5_0,  
and then at some point you used "sudo port upgrade php5" which  
upgraded you to php5 @5.2.6_2 (and left php5 @5.2.5_0 around,  
deactivated), and now you wanted to trash your drive and reinstall  
those ports exactly, you can't, because MacPorts doesn't have a  
command to let you do that. You can only install the current version  
of php5, which as of yesterday is php5 @5.2.7_0. There are  
instructions for how to manually get back to an older version if  
that's really necessary:

http://trac.macports.org/wiki/howto/InstallingOlderPort

Second, if you just install ports in alphabetical order, you're  
likely to get the wrong variants of things installed, as later ports  
are installed automatically as dependencies of earlier ones. For  
example, I have the subversion port installed with the +mod_dav_svn  
and +tools variants. But subversion is a build dependency of ffmpeg.  
ffmpeg appears in the alphabetically-sorted list of ports before  
subversion. So as soon as you try to install ffmpeg (on Tiger or  
earlier, on which Apple doesn't provide the svn program), it will  
first install subversion -- with no variants selected. When you later  
come to subversion in your list of installed ports, it will be  
rebuilt with the +mod_dav_svn +tools variants but it won't be able to  
activate it because another version is already active. So what you  
really need to do is install the ports in dependency order, where the  
first ports to be installed are the ones that don't have any  
dependencies, then you install ports that depend on the ports you've  
already installed, and so on until all ports are installed. Basically  
you reinvent the entire MacPorts dependency engine.




More information about the macports-users mailing list