[Distutils] Hardlinks v copying

M.-A. Lemburg mal at egenix.com
Thu Aug 18 14:35:09 CEST 2005


Bo Nygaard Bai wrote:
> I was trying to use the distutils sdist target on an AFS mounted
> filesystem on Linux. It fails because it can't make hard links between
> directories on AFS (you can inside a directory). I have not been able
> to find any options to make it copy the files instead.
> 
> 1) Is there a way for me to force it to copy the files into the
>    temporary directory instead of using hard links?
> 
> 2) Given that it is very hard to predict whether a particular usage of
>    hard links is possible on any given OS/filesystem/mount combination.
>    It seems to me that the best strategy would be to try to make the
>    hard links, and if this fails, silently fall back to making a copy.

How do you test whether a hard link works ? I suppose
this would have to be made based on the path since you
have mixed setups where some parts of the file system
tree allow hard links where others don't.

I don't find hard links all that useful. Disk space
is cheap and they often cause problems (e.g. in our
case with symlinks in the source tree).

Here's a quick hack:

import os
delattr(os, link)

This is more elegant, but requires extra work:

class mx_sdist(sdist):

    """ Build a source distribution.

        This version does not use hard links when preparing the source
        archive - hard links don't match well with symlinks which we
        use in our source repositories.

    """
    def make_release_tree (self, base_dir, files):

        # Prepare release dir
        self.mkpath(base_dir)
        self.distribution.metadata.write_pkg_info(base_dir)
        if not files:
            log.warn('no files found in release !')
            return

        # Create dir structure
        log.info('preparing release tree in %s...' % base_dir)
        create_tree(base_dir, files, dry_run=self.dry_run)
        for file in files:
            if not os.path.isfile(file):
                log.warn('%s is not a regular file -- skipping' % file)
            else:
                dest = os.path.join(base_dir, file)
                self.copy_file(file, dest, link=None)

and then register this command class as replacement for
'sdist'.

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Aug 18 2005)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::


More information about the Distutils-SIG mailing list