fab-user
[Top][All Lists]
Advanced

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

Re: [Fab-user] rsync_project


From: Christian Vest Hansen
Subject: Re: [Fab-user] rsync_project
Date: Fri, 3 Apr 2009 19:50:09 +0200

Good idea. But as you may have guessed, I'm not fond of long lines :)

On Fri, Apr 3, 2009 at 5:21 AM, Paul Baumgart <address@hidden> wrote:
> Hi Christian,
>
> Thanks, your version looks a lot cleaner.
>
> I would like to add one thing, because I think it makes the exclude
> parameter much more useful:
>
> @operation
> def rsync_project(remotepath, exclude=False, delete=False, extra_opts='',
> **kwargs):
>    """
>    Uploads the current project directory using rsync.
>    By using rsync, only changes since last upload are actually sent over
>    the wire, rather than the whole directory like using upload_project.
>
>    Requires the rsync command-line utility to be available both on the local
>    and the remote machine.
>
>    Parameters are:
>        remotepath:         the path on the remote machine to which to rsync
> the
>                            current project
>        exclude (optional): values passed to rsync's --exclude option.
>                            If the parameter is iterable, each of its
> elements
>                            is passed to a separate --exclude argument. If
> the
>                            parameter is a string, that string is the value
>                            passed to the single --exclude argument.
>                            See the rsync manpage for details on using the
>                            --exclude option.
>        delete (optional):  True or False, whether to delete remote files
> that
>                            don't exist locally.
>        extra_opts (optional): Additional command-line options to set for
> rsync.
>
>    The rsync command is built from the options as follows:
>        rsync [--delete] [--exclude exclude] -pthrvz [extra_opts] \\
>            <project dir> <fab_user>@<host>:<remotepath>
>    """
>    username = ENV.get('fab_user')
>
>    if isinstance(exclude, basestring):
>        exclude = [exclude]
>
>    options_map = {
>        "delete" : '--delete' if delete else '',
>        "exclude" : exclude and ' '.join(['--exclude "%s"' % opt.replace('"',
> '\\\\"') for opt in exclude]) or '',
>        "extra" : extra_opts
>    }
>    options = "%(delete)s %(exclude)s -pthrvz %(extra)s" % options_map
>    cwd = '../' + os.getcwd().split(os.sep)[-1]
>    userhost = "$(fab_user)@$(fab_host)"
>    rpath = _lazy_format(remotepath, ENV)
>
>    cmd = "rsync %s %s %s:%s" % (options, cwd, userhost, rpath)
>    local_per_host(cmd, **kwargs)
>
> So, instead of taking just a string, it can take either a string or a list,
> and multiple --exclude options are generated from a list. A string parameter
> is treated just as it is currently.
>
> Paul
>
> On Thu, Apr 2, 2009 at 12:38 PM, Christian Vest Hansen
> <address@hidden> wrote:
>> Ok. I implemented this change, but I modified it a little bit.
>>
>> On Thu, Apr 2, 2009 at 9:17 PM, Christian Vest Hansen
>> <address@hidden> wrote:
>>> On Sun, Mar 22, 2009 at 12:51 AM, Paul Baumgart <address@hidden> wrote:
>>>> A different topic this time:
>>>>
>>>> The current upload_project() function is a neat feature, but I have
>>>> two issues with it:
>>>>
>>>> 1) It doesn't allow me to exclude certain files/directories (like
>>>> .git* for example)
>>>> 2) It uploads the entire project every time, which can be irritating
>>>> if the change is small but the project is large.
>>>>
>>>> So, I made this function, which uses rsync to only upload the
>>>> differences between the local and remote copies.
>>>>
>>>> I would like to get feedback on it, primarily as to whether this would
>>>> be useful in the mainline Fabric code, and if not, if there is any way
>>>> to make it be useful.
>>>>
>>>> @operation
>>>> @connects
>>>> def rsync_project(host, client, env, remotepath, exclude=False,
>>>> delete=False, extra_opts='', **kwargs):
>>>>    """
>>>>    Uploads the current project directory using rsync, so only changes
>>>> are
>>>>    uploaded rather than the whole directory like using upload_project.
>>>>
>>>>    Requires the rsync command-line utility to be available both on the
>>>> local
>>>>    and the remote machine.
>>>>
>>>>    Parameters are:
>>>>        remotepath:         the path on the remote machine to which to
>>>> rsync the
>>>>                            current project
>>>>        exclude (optional): the string passed to rsync's --exclude
>>>> option.
>>>>                            See the rsync manpage for details.
>>>>        delete (optional):  True or False, whether to delete remote files
>>>> that
>>>>                            don't exist locally.
>>>>        extra_opts (optional): Additional command-line options to set for
>>>> rsync.
>>>>
>>>>    The rsync command is built from the options as follows:
>>>>        rsync [--delete] [--exclude exclude] -pthrvz [extra_opts]
>>>> <project dir> <fab_user>@<host>:<remotepath>
>>>>    """
>>>>
>>>>    remotepath = _lazy_format(remotepath, env)
>>>>
>>>>    username = ENV.get('fab_user')
>>>>    username = username + '@' if username else username
>>>>
>>>>    cwd_name = '../' + os.getcwd().split(os.sep)[-1]
>>>
>>> This line right here. Why do you go through all this trouble to build
>>> a relative CWD?
>>
>> Elementary, dear Watson. To get a prettier output when the assembled
>> command is printed to the console.
>>
>>>
>>>
>>>>
>>>>    delete_opt = '--delete' if delete else ''
>>>>
>>>>    exclude_opt = '--exclude' if exclude else ''
>>>>    exclude = '"' + exclude.strip('"') + '"' if exclude else ''
>>>>
>>>>    return local('rsync %(delete_opt)s %(exclude_opt)s %(exclude)s
>>>> -pthrvz %(extra_opts)s %(cwd_name)s
>>>> %(username)s%(host)s:%(remotepath)s'
>>>>        % locals(), **kwargs) == 0
>>>>
>>>>
>>>> Note that it requires adding a line to the bottom of local():
>>>>
>>>> return retcode
>>>>
>>>> Regards,
>>>> Paul
>>>>
>>>>
>>>> _______________________________________________
>>>> Fab-user mailing list
>>>> address@hidden
>>>> http://lists.nongnu.org/mailman/listinfo/fab-user
>>>>
>>>
>>>
>>>
>>> --
>>> Venlig hilsen / Kind regards,
>>> Christian Vest Hansen.
>>>
>>
>>
>>
>> --
>> Venlig hilsen / Kind regards,
>> Christian Vest Hansen.
>>
>
>



-- 
Venlig hilsen / Kind regards,
Christian Vest Hansen.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]