From c0be9a2dd38fa73e2b0f0958361fd3a1234d3f01 Mon Sep 17 00:00:00 2001 From: Richard Ipsum Date: Tue, 10 Dec 2013 17:46:57 +0000 Subject: Modify lorry backup behaviour and rename tests --- lorry | 51 ++++++++++++------- tests/git-backup-on-error-multiple-backups.script | 52 +++++++++++++++++++ tests/git-backup-on-error-multiple-backups.setup | 47 +++++++++++++++++ tests/git-backup-on-error-multiple-backups.stderr | 0 tests/git-backup-on-error-multiple-backups.stdout | 62 +++++++++++++++++++++++ tests/git-backup-on-error.script | 52 ------------------- tests/git-backup-on-error.setup | 47 ----------------- tests/git-backup-on-error.stderr | 0 tests/git-backup-on-error.stdout | 62 ----------------------- 9 files changed, 195 insertions(+), 178 deletions(-) create mode 100755 tests/git-backup-on-error-multiple-backups.script create mode 100755 tests/git-backup-on-error-multiple-backups.setup create mode 100644 tests/git-backup-on-error-multiple-backups.stderr create mode 100644 tests/git-backup-on-error-multiple-backups.stdout delete mode 100755 tests/git-backup-on-error.script delete mode 100755 tests/git-backup-on-error.setup delete mode 100644 tests/git-backup-on-error.stderr delete mode 100644 tests/git-backup-on-error.stdout diff --git a/lorry b/lorry index a48daf7..b941f4f 100755 --- a/lorry +++ b/lorry @@ -89,6 +89,9 @@ class Lorry(cliapp.Application): self.settings.string(['tarball-dest'], 'put created tarballs in TARBALLS', metavar='TARBALLS') + self.settings.boolean(['keep-multiple-backups'], + 'keep multiple (time-stamped) backups (disabled by default)', + default=False) def process_args(self, args): status = 0 @@ -189,7 +192,31 @@ class Lorry(cliapp.Application): if not os.path.exists(dirname): os.mkdir(dirname) gitdir = os.path.join(dirname, 'git') - backupdir = self.backup_gitdir(name, dirname, gitdir) + + time = datetime.now().strftime('%F-%T') + + pre_update_name = 'git-pre-update' + pre_update_backup_suffix = (pre_update_name + '-' + time + if self.settings['keep-multiple-backups'] else pre_update_name) + + pre_update_backup_dir = os.path.join(dirname, pre_update_backup_suffix) + + post_fail_name = 'git-post-fail' + post_fail_backup_suffix = (post_fail_name + '-' + time + if self.settings['keep-multiple-backups'] else post_fail_name) + + post_fail_backup_dir = os.path.join(dirname, post_fail_backup_suffix) + + if not self.settings['keep-multiple-backups']: + # remove previous backups if they exist + if os.path.exists(pre_update_backup_dir): + shutil.rmtree(pre_update_backup_dir) + + if os.path.exists(post_fail_backup_dir): + shutil.rmtree(post_fail_backup_dir) + + backupdir = self.backup_gitdir(name, gitdir, pre_update_backup_dir) + try: self.needs_aggressive = False table[vcstype](name, dirname, gitdir, spec) @@ -206,8 +233,8 @@ class Lorry(cliapp.Application): self.make_tarball(name, gitdir) except: if backupdir is not None: - faildir = self.save_failgit(name, dirname, gitdir) - self.restore_backup(name, dirname, gitdir, backupdir) + faildir = self.backup_gitdir(name, gitdir, post_fail_backup_dir) + self.restore_backup(name, backupdir, gitdir) self.output.write('Mirror of %s failed, state before mirror ' 'is saved at %s and state after mirror is ' 'saved at %s\n' % (name, backupdir, faildir)) @@ -226,7 +253,7 @@ class Lorry(cliapp.Application): self.progress('.. removing %s git repository backup' % name) shutil.rmtree(backupdir) - def restore_backup(self, name, dirname, gitdir, backupdir): + def restore_backup(self, name, backupdir, gitdir): self.progress('.. restoring %s good git repository' % name) dotgit = os.path.join(gitdir, '.git') if not os.path.exists(dotgit): @@ -234,23 +261,13 @@ class Lorry(cliapp.Application): shutil.rmtree(dotgit) self.copy_gitdir(backupdir, dotgit) - def save_failgit(self, name, dirname, gitdir): - self.progress('.. saving failed %s mirror git repository' % name) + def backup_gitdir(self, name, gitdir, backupdir): dotgit = os.path.join(gitdir, '.git') if not os.path.exists(dotgit): dotgit = gitdir - time = datetime.now().strftime('%F-%T') - backupdir = os.path.join(dirname, "git-post-fail-%s" % time) - return self.copy_gitdir(dotgit, backupdir) - def backup_gitdir(self, name, dirname, gitdir): - dotgit = os.path.join(gitdir, '.git') - if not os.path.exists(dotgit): - dotgit = gitdir - time = datetime.now().strftime('%F-%T') - backupdir = os.path.join(dirname, "git-pre-update-%s" % time) - self.progress('.. backing up %s git repository to %s' % - (name, backupdir)) + self.progress('.. backing up %s git repository to %s' % (name, backupdir)) + return self.copy_gitdir(dotgit, backupdir) def copy_gitdir(self, source, dest): diff --git a/tests/git-backup-on-error-multiple-backups.script b/tests/git-backup-on-error-multiple-backups.script new file mode 100755 index 0000000..8bda5ad --- /dev/null +++ b/tests/git-backup-on-error-multiple-backups.script @@ -0,0 +1,52 @@ +#!/bin/bash +# +# Tests when a git mirror fails that it keeps the backups around +# +# Copyright (C) 2012 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +set -e +set -o pipefail + + +logfile="$DATADIR/git-backup-test-repo.log" +workdir="$DATADIR/work-dir" +repo="$DATADIR/git-backup-test-repo" + +normalize() { + DATETIMESPEC='[0-9]*-[0-9]*-[0-9]*-[0-9]*:[0-9]*:[0-9]*' + sed -r -e "s|git-pre-update-$DATETIMESPEC|git-pre-update-DATETIME|g" \ + -e "s|git-post-fail-$DATETIMESPEC|git-post-fail-DATETIME|g" \ + -e "s/pack-[0-9a-z]+\.(idx|pack)$/pack-file/" \ + -e '/hooks\/.*\.sample/d' \ + -e "s|$DATADIR|DATADIR|g" "$@" +} + +# mirror some history +"${SRCDIR}/test-lorry" --pull-only --log="$logfile" --working-area="$workdir" --bundle=never \ + "$DATADIR/git-backup-test-repo.lorry" | normalize + +# make upstream disappear to cause errors +rm -rf "$repo" +if "${SRCDIR}/test-lorry" --pull-only --log="$logfile" --working-area="$workdir" \ + "$DATADIR/git-backup-test-repo.lorry" --bundle=never 2>/dev/null \ + --keep-multiple-backups | normalize +then + echo Previous lorry command should have failed >&2 + exit 1 +else + find "$workdir/git-backup-test-repo" | LC_ALL=C sort | normalize +fi diff --git a/tests/git-backup-on-error-multiple-backups.setup b/tests/git-backup-on-error-multiple-backups.setup new file mode 100755 index 0000000..03a8dad --- /dev/null +++ b/tests/git-backup-on-error-multiple-backups.setup @@ -0,0 +1,47 @@ +#!/bin/sh +# +# Creates a git repository with a single file and a single commit. +# +# Copyright (C) 2012 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +set -e + +# create the repository +repo="$DATADIR/git-backup-test-repo" +mkdir "$repo" +cd "$repo" +git init --quiet + +# add the test file +echo "first line" > test.txt +git add test.txt + +# make a commit +git commit --quiet -m "first commit" + +# create the .lorry file for the repository +cat < $DATADIR/git-backup-test-repo.lorry +{ + "git-backup-test-repo": { + "type": "git", + "url": "file://$repo" + } +} +EOF + +# create the working directory +test -d "$DATADIR/work-dir" || mkdir "$DATADIR/work-dir" diff --git a/tests/git-backup-on-error-multiple-backups.stderr b/tests/git-backup-on-error-multiple-backups.stderr new file mode 100644 index 0000000..e69de29 diff --git a/tests/git-backup-on-error-multiple-backups.stdout b/tests/git-backup-on-error-multiple-backups.stdout new file mode 100644 index 0000000..d918599 --- /dev/null +++ b/tests/git-backup-on-error-multiple-backups.stdout @@ -0,0 +1,62 @@ +Mirror of git-backup-test-repo failed, state before mirror is saved at DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME and state after mirror is saved at DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME +DATADIR/work-dir/git-backup-test-repo +DATADIR/work-dir/git-backup-test-repo/git +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/FETCH_HEAD +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/HEAD +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/branches +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/config +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/description +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/hooks +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info/exclude +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info/refs +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/info +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/info/packs +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/packed-refs +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs/heads +DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs/tags +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/FETCH_HEAD +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/HEAD +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/branches +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/config +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/description +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/hooks +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info/exclude +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info/refs +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/info +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/info/packs +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/packed-refs +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs/heads +DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs/tags +DATADIR/work-dir/git-backup-test-repo/git/FETCH_HEAD +DATADIR/work-dir/git-backup-test-repo/git/HEAD +DATADIR/work-dir/git-backup-test-repo/git/branches +DATADIR/work-dir/git-backup-test-repo/git/config +DATADIR/work-dir/git-backup-test-repo/git/description +DATADIR/work-dir/git-backup-test-repo/git/hooks +DATADIR/work-dir/git-backup-test-repo/git/info +DATADIR/work-dir/git-backup-test-repo/git/info/exclude +DATADIR/work-dir/git-backup-test-repo/git/info/refs +DATADIR/work-dir/git-backup-test-repo/git/objects +DATADIR/work-dir/git-backup-test-repo/git/objects/info +DATADIR/work-dir/git-backup-test-repo/git/objects/info/packs +DATADIR/work-dir/git-backup-test-repo/git/objects/pack +DATADIR/work-dir/git-backup-test-repo/git/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git/objects/pack/pack-file +DATADIR/work-dir/git-backup-test-repo/git/packed-refs +DATADIR/work-dir/git-backup-test-repo/git/refs +DATADIR/work-dir/git-backup-test-repo/git/refs/heads +DATADIR/work-dir/git-backup-test-repo/git/refs/tags diff --git a/tests/git-backup-on-error.script b/tests/git-backup-on-error.script deleted file mode 100755 index 544a392..0000000 --- a/tests/git-backup-on-error.script +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# -# Tests when a git mirror fails that it keeps the backups around -# -# Copyright (C) 2012 Codethink Limited -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - -set -e -set -o pipefail - - -logfile="$DATADIR/git-backup-test-repo.log" -workdir="$DATADIR/work-dir" -repo="$DATADIR/git-backup-test-repo" - -normalize() { - DATETIMESPEC='[0-9]*-[0-9]*-[0-9]*-[0-9]*:[0-9]*:[0-9]*' - sed -r -e "s|git-pre-update-$DATETIMESPEC|git-pre-update-DATETIME|g" \ - -e "s|git-post-fail-$DATETIMESPEC|git-post-fail-DATETIME|g" \ - -e "s/pack-[0-9a-z]+\.(idx|pack)$/pack-file/" \ - -e '/hooks\/.*\.sample/d' \ - -e "s|$DATADIR|DATADIR|g" "$@" -} - -# mirror some history -"${SRCDIR}/test-lorry" --pull-only --log="$logfile" --working-area="$workdir" --bundle=never \ - "$DATADIR/git-backup-test-repo.lorry" | normalize - -# make upstream disappear to cause errors -rm -rf "$repo" -if "${SRCDIR}/test-lorry" --pull-only --log="$logfile" --working-area="$workdir" \ - "$DATADIR/git-backup-test-repo.lorry" --bundle=never 2>/dev/null | \ - normalize -then - echo Previous lorry command should have failed >&2 - exit 1 -else - find "$workdir/git-backup-test-repo" | LC_ALL=C sort | normalize -fi diff --git a/tests/git-backup-on-error.setup b/tests/git-backup-on-error.setup deleted file mode 100755 index 03a8dad..0000000 --- a/tests/git-backup-on-error.setup +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# Creates a git repository with a single file and a single commit. -# -# Copyright (C) 2012 Codethink Limited -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - -set -e - -# create the repository -repo="$DATADIR/git-backup-test-repo" -mkdir "$repo" -cd "$repo" -git init --quiet - -# add the test file -echo "first line" > test.txt -git add test.txt - -# make a commit -git commit --quiet -m "first commit" - -# create the .lorry file for the repository -cat < $DATADIR/git-backup-test-repo.lorry -{ - "git-backup-test-repo": { - "type": "git", - "url": "file://$repo" - } -} -EOF - -# create the working directory -test -d "$DATADIR/work-dir" || mkdir "$DATADIR/work-dir" diff --git a/tests/git-backup-on-error.stderr b/tests/git-backup-on-error.stderr deleted file mode 100644 index e69de29..0000000 diff --git a/tests/git-backup-on-error.stdout b/tests/git-backup-on-error.stdout deleted file mode 100644 index d918599..0000000 --- a/tests/git-backup-on-error.stdout +++ /dev/null @@ -1,62 +0,0 @@ -Mirror of git-backup-test-repo failed, state before mirror is saved at DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME and state after mirror is saved at DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME -DATADIR/work-dir/git-backup-test-repo -DATADIR/work-dir/git-backup-test-repo/git -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/FETCH_HEAD -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/HEAD -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/branches -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/config -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/description -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/hooks -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info/exclude -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/info/refs -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/info -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/info/packs -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/packed-refs -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs/heads -DATADIR/work-dir/git-backup-test-repo/git-post-fail-DATETIME/refs/tags -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/FETCH_HEAD -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/HEAD -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/branches -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/config -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/description -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/hooks -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info/exclude -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/info/refs -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/info -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/info/packs -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/packed-refs -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs/heads -DATADIR/work-dir/git-backup-test-repo/git-pre-update-DATETIME/refs/tags -DATADIR/work-dir/git-backup-test-repo/git/FETCH_HEAD -DATADIR/work-dir/git-backup-test-repo/git/HEAD -DATADIR/work-dir/git-backup-test-repo/git/branches -DATADIR/work-dir/git-backup-test-repo/git/config -DATADIR/work-dir/git-backup-test-repo/git/description -DATADIR/work-dir/git-backup-test-repo/git/hooks -DATADIR/work-dir/git-backup-test-repo/git/info -DATADIR/work-dir/git-backup-test-repo/git/info/exclude -DATADIR/work-dir/git-backup-test-repo/git/info/refs -DATADIR/work-dir/git-backup-test-repo/git/objects -DATADIR/work-dir/git-backup-test-repo/git/objects/info -DATADIR/work-dir/git-backup-test-repo/git/objects/info/packs -DATADIR/work-dir/git-backup-test-repo/git/objects/pack -DATADIR/work-dir/git-backup-test-repo/git/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git/objects/pack/pack-file -DATADIR/work-dir/git-backup-test-repo/git/packed-refs -DATADIR/work-dir/git-backup-test-repo/git/refs -DATADIR/work-dir/git-backup-test-repo/git/refs/heads -DATADIR/work-dir/git-backup-test-repo/git/refs/tags -- cgit v1.2.1