def __init__(self, repo):
        """
        `put_binary` - path to binary file which uploads bundle to external
            storage and prints key to stdout
        `put_args` - format string with additional args to `put_binary`
                     {filename} replacement field can be used.
        `get_binary` - path to binary file which accepts filename and key
            (in that order), downloads bundle from store and saves it to file
        `get_args` - format string with additional args to `get_binary`.
                     {filename} and {handle} replacement field can be used.
        """
        ui = repo.ui

        # path to the binary which uploads a bundle to the external store
        # and prints the key to stdout.
        self.put_binary = ui.config("infinitepush", "put_binary")
        if not self.put_binary:
            raise error.Abort("put binary is not specified")
        # Additional args to ``put_binary``.  The '{filename}' replacement field
        # can be used to get the filename.
        self.put_args = ui.configlist("infinitepush", "put_args", [])

        # path to the binary which accepts a file and key (in that order) and
        # downloads the bundle form the store and saves it to the file.
        self.get_binary = ui.config("infinitepush", "get_binary")
        if not self.get_binary:
            raise error.Abort("get binary is not specified")
        # Additional args to ``get_binary``.  The '{filename}' and '{handle}'
        # replacement fields can be used to get the filename and key.
        self.get_args = ui.configlist("infinitepush", "get_args", [])