From 2bd973f645508f112d98fd47820ca668d77c92fa Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 15 Oct 2011 09:56:31 -0400 Subject: [PATCH] Make file deletion work, add test --- src/libhacktree/hacktree-repo.c | 33 +++++++++++++++++---------- tests/libtest.sh | 15 ++++++++++--- tests/t0006-removal.sh | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 15 deletions(-) create mode 100755 tests/t0006-removal.sh diff --git a/src/libhacktree/hacktree-repo.c b/src/libhacktree/hacktree-repo.c index 2469b35b..b0065579 100644 --- a/src/libhacktree/hacktree-repo.c +++ b/src/libhacktree/hacktree-repo.c @@ -899,7 +899,7 @@ walk_parsed_tree (HacktreeRepo *self, const char *filename, ParsedTreeData *tree, int *out_filename_index, /* out*/ - char **out_component, /* out, but do not free */ + char **out_component, /* out, must free */ ParsedTreeData **out_tree, /* out, but do not free */ GError **error) { @@ -907,8 +907,8 @@ walk_parsed_tree (HacktreeRepo *self, GPtrArray *components = NULL; ParsedTreeData *current_tree = tree; const char *component = NULL; - const char *file_sha1; - ParsedDirectoryData *dir; + const char *file_sha1 = NULL; + ParsedDirectoryData *dir = NULL; int i; int ret_filename_index = 0; @@ -921,7 +921,7 @@ walk_parsed_tree (HacktreeRepo *self, component = components->pdata[i]; file_sha1 = g_hash_table_lookup (current_tree->files, component); dir = g_hash_table_lookup (current_tree->directories, component); - + if (!(file_sha1 || dir)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, @@ -937,16 +937,18 @@ walk_parsed_tree (HacktreeRepo *self, filename); goto out; } - else if (!dir) - g_assert_not_reached (); - current_tree = dir->tree_data; - ret_filename_index++; + else + { + g_assert (dir != NULL); + current_tree = dir->tree_data; + ret_filename_index++; + } } ret = TRUE; - g_assert (!(file_sha1 && dir)); *out_filename_index = i; - *out_component = components->pdata[i-1]; + *out_component = components->pdata[components->len-1]; + components->pdata[components->len-1] = NULL; /* steal */ *out_tree = current_tree; out: g_ptr_array_free (components, TRUE); @@ -967,7 +969,7 @@ remove_files_from_tree (HacktreeRepo *self, { const char *filename = removed_files->pdata[i]; int filename_index; - const char *component; + char *component = NULL; ParsedTreeData *parent; const char *file_sha1; ParsedTreeData *dir; @@ -988,7 +990,14 @@ remove_files_from_tree (HacktreeRepo *self, else if (dir) g_hash_table_remove (parent->directories, component); else - g_assert_not_reached (); + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No such file or directory: %s", + filename); + g_free (component); + goto out; + } + g_free (component); } ret = TRUE; diff --git a/tests/libtest.sh b/tests/libtest.sh index 917eda1e..e88ac10c 100644 --- a/tests/libtest.sh +++ b/tests/libtest.sh @@ -33,7 +33,13 @@ die () { } assert_has_file () { - test -f $1 || (echo "Couldn't find $1"; exit 1) + test -f "$1" || (echo "Couldn't find '$1'"; exit 1) +} + +assert_not_has_file () { + if test -f "$1"; then + echo "File '$1' exists"; exit 1 + fi } setup_test_repository1 () { @@ -67,8 +73,11 @@ setup_test_repository2 () { mkdir baz/another/ echo x > baz/another/y - mkdir ../repo - ht_repo="--repo=../repo" + cd .. + mkdir repo + cd repo + ht_repo="--repo=`pwd`" + cd ../files export ht_repo hacktree init $ht_repo hacktree commit $ht_repo -s "Test Commit 1" -b "Commit body first" --add=firstfile diff --git a/tests/t0006-removal.sh b/tests/t0006-removal.sh new file mode 100755 index 00000000..2eada218 --- /dev/null +++ b/tests/t0006-removal.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# Copyright (C) 2011 Colin Walters +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Author: Colin Walters + +set -e + +. libtest.sh + +echo '1..4' + +setup_test_repository2 +hacktree checkout $ht_repo HEAD $test_tmpdir/checkout2-head +echo 'ok setup' +cd $test_tmpdir/checkout2-head +hacktree commit -s delete $ht_repo -r firstfile +echo 'ok rm firstfile' +assert_has_file firstfile # It should still exist in this checkout +cd $test_tmpdir +hacktree checkout $ht_repo HEAD $test_tmpdir/checkout3-head +echo 'ok checkout 3' +cd $test_tmpdir/checkout3-head +assert_not_has_file firstfile +assert_has_file baz/saucer +echo 'ok removal full'