[hacktree] Make file deletion work, add test



commit 2bd973f645508f112d98fd47820ca668d77c92fa
Author: Colin Walters <walters verbum org>
Date:   Sat Oct 15 09:56:31 2011 -0400

    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(-)
---
diff --git a/src/libhacktree/hacktree-repo.c b/src/libhacktree/hacktree-repo.c
index 2469b35..b006557 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 917eda1..e88ac10 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 0000000..2eada21
--- /dev/null
+++ b/tests/t0006-removal.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 Colin Walters <walters verbum org>
+#
+# 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 <walters verbum org>
+
+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'



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