示例#1
0
def test_cwd_downturn():
    """change into directory"""
    # setup
    d1 = to_path('d1')
    mkdir(d1)

    # run test
    bef = cwd()
    with cd(d1):
        aft = cwd()
        delta = aft.relative_to(bef)
        assert str(delta) == 'd1'

    # cleanup
    rm(d1)
示例#2
0
def test_cwd_downturn():
    """change into directory"""
    # setup
    d1 = to_path("d1")
    mkdir(d1)

    # run test
    bef = cwd()
    with cd(d1):
        aft = cwd()
        delta = aft.relative_to(bef)
        assert str(delta) == "d1"

    # cleanup
    rm(d1)
示例#3
0
    def run(cls, command, args, settings, options):
        # read command line
        cmdline = docopt(cls.USAGE, argv=[command] + args)
        paths = cmdline['<path>']
        archive = cmdline['--archive']
        date = cmdline['--date']

        # add cwd to paths
        paths = [to_path(cwd(), p) for p in paths]

        # assure that paths correspond to src_dirs
        src_dirs = settings.src_dirs
        unknown_path = False
        # get the desired archive
        if date and not archive:
            archive = get_name_of_nearest_archive(settings, date)
        if not archive:
            archive = get_name_of_latest_archive(settings)
        output('Archive:', archive)

        # run borg
        borg = settings.run_borg(
            cmd='extract',
            args=[settings.destination(archive)] + paths,
            emborg_opts=options,
        )
        out = borg.stdout
        if out:
            output(out.rstrip())
示例#4
0
    def run_borg_raw(self, args):

        # prepare the command
        os.environ.update(self.publish_passcode())
        os.environ["BORG_DISPLAY_PASSPHRASE"] = "no"
        executable = self.value("borg_executable", BORG)
        remote_path = self.value("remote_path")
        remote_path = ["--remote-path", remote_path] if remote_path else []
        repository = str(self.repository)
        command = ([executable] + remote_path +
                   [a.replace('@repo', repository) for a in args])

        # run the command
        narrate("running:\n{}".format(
            indent(render_command(command, borg_options_arg_count))))
        with cd(self.working_dir):
            narrate("running in:", cwd())
            starts_at = arrow.now()
            log("starts at: {!s}".format(starts_at))
            borg = Run(command, modes="soeW", env=os.environ, log=False)
            ends_at = arrow.now()
            log("ends at: {!s}".format(ends_at))
            log("elapsed = {!s}".format(ends_at - starts_at))
        if borg.stdout:
            narrate("Borg stdout:")
            narrate(indent(borg.stdout))
        if borg.stderr:
            narrate("Borg stderr:")
            narrate(indent(borg.stderr))
        if borg.status:
            narrate("Borg exit status:", borg.status)

        return borg
示例#5
0
def initialize():
    with cd(tests_dir):
        rm("configs .config .local repositories configs.symlink".split())
        cp("CONFIGS", "configs")
        mkdir(".config repositories .local".split())
        ln("~/.local/bin", ".local/bin")
        ln("~/.local/lib", ".local/lib")
        ln("configs", "configs.symlink")
        os.environ["HOME"] = str(cwd())
示例#6
0
文件: test_cd.py 项目: vdo-lab/shlib
def test_cd_quoit():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = 'd1'
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = 'd1/f1'
    touch(d1f1)
    f1 = 'f1'
    rm(f1)

    # run test
    with cd(d1):
        assert to_path(f1).is_file()
        assert str(d1p) == str(cwd())
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#7
0
def test_cd_quoit():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = 'd1'
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = 'd1/f1'
    touch(d1f1)
    f1 = 'f1'
    rm(f1)

    # run test
    with cd(d1):
        assert to_path(f1).is_file()
        assert str(d1p) == str(cwd())
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#8
0
def test_cd_thinner():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = to_path("d1")
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = to_path("d1/f1")
    touch(d1f1)
    f1 = to_path("f1")
    rm(f1)

    # run test
    with cd(d1):
        assert to_path(f1).is_file()
        assert str(d1p) == str(cwd())
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#9
0
文件: test_cd.py 项目: vdo-lab/shlib
def test_cd_downturn():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = to_path('d1')
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = to_path('d1/f1')
    touch(d1f1)
    f1 = to_path('f1')
    rm(f1)

    # run test
    cd(d1)
    assert to_path(f1).is_file()
    assert str(d1p) == str(cwd())
    cd('..')
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#10
0
def test_cd_downturn():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = to_path('d1')
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = to_path('d1/f1')
    touch(d1f1)
    f1 = to_path('f1')
    rm(f1)

    # run test
    cd(d1)
    assert to_path(f1).is_file()
    assert str(d1p) == str(cwd())
    cd('..')
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#11
0
def test_cd_endorse():
    """change into directory"""
    # setup
    dot = cwd()
    d1 = "d1"
    mkdir(d1)
    d1p = to_path(d1).resolve()
    d1f1 = "d1/f1"
    touch(d1f1)
    f1 = "f1"
    rm(f1)

    # run test
    cd(d1)
    assert to_path(f1).is_file()
    assert str(d1p) == str(cwd())
    cd("..")
    assert str(dot) == str(cwd())

    # clean up
    rm(d1)
示例#12
0
 def match(self, data, account, verbose=False):
     try:
         cwd = cwd()
         for directory in self.dirs:
             if cwd.samefile(to_path(directory)):
                 if verbose:
                     log('    %s: matches.' % self.get_name())
                 return self.script
     except Exception as err:
         raise Error(str(err), culprit=err.__class__.__name__)
     if verbose:
         log('    %s: no match.' % self.get_name())
示例#13
0
    def run(cls, command, args, settings, options):
        # read command line
        cmdline = docopt(cls.USAGE, argv=[command] + args)
        paths = cmdline["<path>"]
        archive = cmdline["--archive"]
        date = cmdline["--date"]
        borg_opts = []
        if cmdline["--list"]:
            borg_opts.append("--list")
        if not cmdline["--force"]:
            if cwd().samefile(settings.working_dir):
                raise Error(
                    "Running from the working directory risks",
                    "over writing the existing file or files. ",
                    "Use --force if this is desired.",
                    wrap=True,
                )

        # convert absolute paths to paths relative to the working directory
        paths = [to_path(p) for p in paths]
        try:
            paths = [
                p.relative_to(settings.working_dir) if p.is_absolute() else p
                for p in paths
            ]
        except ValueError as e:
            raise Error(e)

        # get the desired archive
        if date and not archive:
            archive = get_name_of_nearest_archive(settings, date)
        if not archive:
            archive = get_name_of_latest_archive(settings)
        output("Archive:", archive)

        # run borg
        borg = settings.run_borg(
            cmd="extract",
            borg_opts=borg_opts,
            args=[settings.destination(archive)] + paths,
            emborg_opts=options,
            show_borg_output=bool(borg_opts),
        )
        out = borg.stdout
        if out:
            output(out.rstrip())
示例#14
0
    def run_borg_raw(self, args):

        # run the run_before_borg commands
        self.run_user_commands('run_before_borg')

        # prepare the command
        self.publish_passcode()
        os.environ["BORG_DISPLAY_PASSPHRASE"] = "no"
        executable = self.value("borg_executable", BORG)
        remote_path = self.value("remote_path")
        remote_path = ["--remote-path", remote_path] if remote_path else []
        repository = str(self.repository)
        command = ([executable] + remote_path +
                   [a.replace('@repo', repository) for a in args])

        # run the command
        narrate("running:\n{}".format(
            indent(render_command(command, borg_options_arg_count))))
        with cd(self.working_dir):
            narrate("running in:", cwd())
            starts_at = arrow.now()
            log("starts at: {!s}".format(starts_at))
            try:
                borg = Run(command, modes="soeW1", env=os.environ, log=False)
            except Error as e:
                self.report_borg_error(e, executable)
            ends_at = arrow.now()
            log("ends at: {!s}".format(ends_at))
            log("elapsed = {!s}".format(ends_at - starts_at))
        if borg.status == 1:
            warn('Warning emitted by Borg, see logfile for details.')
        if borg.stdout:
            narrate("Borg stdout:")
            narrate(indent(borg.stdout))
        if borg.stderr:
            narrate("Borg stderr:")
            narrate(indent(borg.stderr))
        if borg.status:
            narrate("Borg exit status:", borg.status)

        return borg
示例#15
0
    def run_borg(
        self,
        cmd,
        args=(),
        borg_opts=None,
        emborg_opts=(),
        strip_prefix=False,
        show_borg_output=False,
        use_working_dir=False,
    ):
        # prepare the command
        os.environ.update(self.publish_passcode())
        os.environ["BORG_DISPLAY_PASSPHRASE"] = "no"
        if self.ssh_command:
            os.environ["BORG_RSH"] = self.ssh_command
        executable = self.value("borg_executable", BORG)
        borg_opts = self.borg_options(cmd, borg_opts, emborg_opts,
                                      strip_prefix)
        command = [executable] + cmd.split() + borg_opts + args
        environ = {
            k: v
            for k, v in os.environ.items() if k.startswith("BORG_")
        }
        if "BORG_PASSPHRASE" in environ:
            environ["BORG_PASSPHRASE"] = "<redacted>"
        narrate("Borg-related environment variables:", render(environ))

        # check if ssh agent is present
        if self.needs_ssh_agent:
            if "SSH_AUTH_SOCK" not in os.environ:
                warn(
                    "SSH_AUTH_SOCK environment variable not found.",
                    "Is ssh-agent running?",
                )

        # run the command
        narrate("running:\n{}".format(
            indent(render_command(command, borg_options_arg_count))))
        with cd(self.working_dir if use_working_dir else "."):
            narrate("running in:", cwd())
            starts_at = arrow.now()
            log("starts at: {!s}".format(starts_at))
            narrating = (show_borg_output or "--verbose" in borg_opts
                         or "verbose" in emborg_opts or "narrate"
                         in emborg_opts) and "--json" not in command
            if narrating:
                modes = "soeW"
                display("\nRunning Borg {} command ...".format(cmd))
            else:
                modes = "sOEW"
            try:
                borg = Run(command,
                           modes=modes,
                           stdin="",
                           env=os.environ,
                           log=False)
            except Error as e:
                e.reraise(culprit=f"borg {cmd}")
            ends_at = arrow.now()
            log("ends at: {!s}".format(ends_at))
            log("elapsed = {!s}".format(ends_at - starts_at))
        if borg.stdout:
            narrate("Borg stdout:")
            narrate(indent(borg.stdout))
        if borg.stderr:
            narrate("Borg stderr:")
            narrate(indent(borg.stderr))
        if borg.status:
            narrate("Borg exit status:", borg.status)
        return borg
示例#16
0
    def run_borg(
        self,
        cmd,
        args=(),
        borg_opts=None,
        emborg_opts=(),
        strip_prefix=False,
        show_borg_output=False,
        use_working_dir=False,
    ):

        # run the run_before_borg commands
        self.run_user_commands('run_before_borg')

        # prepare the command
        self.publish_passcode()
        if "BORG_PASSPHRASE" in os.environ:
            os.environ["BORG_DISPLAY_PASSPHRASE"] = "no"
        if self.ssh_command:
            os.environ["BORG_RSH"] = self.ssh_command
        environ = {
            k: v
            for k, v in os.environ.items() if k.startswith("BORG_")
        }
        if "BORG_PASSPHRASE" in environ:
            environ["BORG_PASSPHRASE"] = "<redacted>"
        executable = self.value("borg_executable", BORG)
        borg_opts = self.borg_options(cmd, borg_opts, emborg_opts,
                                      strip_prefix)
        command = [executable] + cmd.split() + borg_opts + args
        narrate("Borg-related environment variables:", render(environ))

        # check if ssh agent is present
        if self.needs_ssh_agent:
            if "SSH_AUTH_SOCK" not in os.environ:
                warn(
                    "SSH_AUTH_SOCK environment variable not found.",
                    "Is ssh-agent running?",
                )

        # run the command
        narrate("running:\n{}".format(
            indent(render_command(command, borg_options_arg_count))))
        with cd(self.working_dir if use_working_dir else "."):
            narrate("running in:", cwd())
            if "--json" in command or "--json-lines" in command:
                narrating = False
            else:
                narrating = (show_borg_output or "--verbose" in borg_opts
                             or "--progress" in borg_opts
                             or "verbose" in emborg_opts
                             or "narrate" in emborg_opts)
            if narrating:
                modes = "soeW1"
                display("\nRunning Borg {} command ...".format(cmd))
            else:
                modes = "sOEW1"
            starts_at = arrow.now()
            log("starts at: {!s}".format(starts_at))
            try:
                borg = Run(command,
                           modes=modes,
                           stdin="",
                           env=os.environ,
                           log=False)
            except Error as e:
                self.report_borg_error(e, cmd)
            finally:
                # remove passcode env variables created by emborg
                if self.borg_passcode_env_var_set_by_emborg:
                    narrate(
                        f"Unsetting {self.borg_passcode_env_var_set_by_emborg}."
                    )
                    del os.environ[self.borg_passcode_env_var_set_by_emborg]
            ends_at = arrow.now()
            log("ends at: {!s}".format(ends_at))
            log("elapsed = {!s}".format(ends_at - starts_at))
        if borg.status:
            narrate("Borg exit status:", borg.status)
        if borg.status == 1 and borg.stderr:
            warnings = borg.stderr.partition(72 * '-')[0]
            warn('Warning emitted by Borg:', codicil=warnings)
        if borg.stdout:
            narrate("Borg stdout:")
            narrate(indent(borg.stdout))
        if borg.stderr:
            narrate("Borg stderr:")
            narrate(indent(borg.stderr))

        return borg