From 55c90bc6ffa3ebe113b9f6e4b6f2172381f02a60 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 22 Sep 2010 14:40:38 +0000 Subject: main/apk-tools: remove all dirs on apk del fixes #406 --- main/apk-tools/0001-Fix-building-on-eglibc.patch | 64 ++++++++++++++ ...0001-db-optionally-remove-dirs-when-unref.patch | 97 ++++++++++++++++++++++ main/apk-tools/APKBUILD | 4 +- 3 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 main/apk-tools/0001-Fix-building-on-eglibc.patch create mode 100644 main/apk-tools/0001-db-optionally-remove-dirs-when-unref.patch (limited to 'main') diff --git a/main/apk-tools/0001-Fix-building-on-eglibc.patch b/main/apk-tools/0001-Fix-building-on-eglibc.patch new file mode 100644 index 000000000..12bb99a62 --- /dev/null +++ b/main/apk-tools/0001-Fix-building-on-eglibc.patch @@ -0,0 +1,64 @@ +From b4adf7645ff6c14e19682b9ef17e15756c5b0b14 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Mon, 30 Aug 2010 13:04:25 +0000 +Subject: [PATCH] Fix building on eglibc + +Seems like recent eglibc requires that you include sys/stat.h +--- + src/archive.c | 1 + + src/database.c | 1 + + src/io.c | 1 + + src/package.c | 1 + + 4 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/src/archive.c b/src/archive.c +index f60cb1b..3ac8a64 100644 +--- a/src/archive.c ++++ b/src/archive.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + +diff --git a/src/database.c b/src/database.c +index 5dcd9e0..925aa4a 100644 +--- a/src/database.c ++++ b/src/database.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #include "apk_defines.h" + #include "apk_package.h" +diff --git a/src/io.c b/src/io.c +index 2b0c892..5100d41 100644 +--- a/src/io.c ++++ b/src/io.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + +diff --git a/src/package.c b/src/package.c +index e73814a..8f15e7a 100644 +--- a/src/package.c ++++ b/src/package.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + #include + +-- +1.7.2.2 + diff --git a/main/apk-tools/0001-db-optionally-remove-dirs-when-unref.patch b/main/apk-tools/0001-db-optionally-remove-dirs-when-unref.patch new file mode 100644 index 000000000..e6497dda4 --- /dev/null +++ b/main/apk-tools/0001-db-optionally-remove-dirs-when-unref.patch @@ -0,0 +1,97 @@ +From 5c4583a9027de2a26d3bff8b443f7db7f0c37074 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Wed, 22 Sep 2010 14:16:18 +0000 +Subject: [PATCH] db: optionally remove dirs when unref + +We want remove dirs when they are unreferenced so we remove all dirs on +apk del, but we don't want remove dirs when closing database. So we make +removing dir optional when unreferencing it. + +This partially reverts commit c7ffc96a16c6963fe0a07be7ee75e8f1f7426882. + +fixes #406 +--- + src/database.c | 28 +++++++++++++++------------- + 1 files changed, 15 insertions(+), 13 deletions(-) + +diff --git a/src/database.c b/src/database.c +index 925aa4a..0054837 100644 +--- a/src/database.c ++++ b/src/database.c +@@ -30,6 +30,11 @@ + #include "apk_archive.h" + #include "apk_print.h" + ++enum { ++ APK_DISALLOW_RMDIR = 0, ++ APK_ALLOW_RMDIR = 1 ++}; ++ + int apk_verbosity = 1; + unsigned int apk_flags = 0; + +@@ -188,16 +193,19 @@ struct apk_name *apk_db_get_name(struct apk_database *db, apk_blob_t name) + return pn; + } + +-static void apk_db_dir_unref(struct apk_database *db, struct apk_db_dir *dir) ++static void apk_db_dir_unref(struct apk_database *db, struct apk_db_dir *dir, ++ int allow_rmdir) + { + dir->refs--; + if (dir->refs > 0) + return; + + db->installed.stats.dirs--; ++ if (allow_rmdir) ++ unlinkat(db->root_fd, dir->name, AT_REMOVEDIR); + + if (dir->parent != NULL) +- apk_db_dir_unref(db, dir->parent); ++ apk_db_dir_unref(db, dir->parent, allow_rmdir); + } + + static struct apk_db_dir *apk_db_dir_ref(struct apk_db_dir *dir) +@@ -307,16 +315,11 @@ static void apk_db_diri_mkdir(struct apk_database *db, struct apk_db_dir_instanc + } + } + +-static void apk_db_diri_rmdir(struct apk_database *db, struct apk_db_dir_instance *diri) +-{ +- if (diri->dir->refs == 1) +- unlinkat(db->root_fd, diri->dir->name, 1); +-} +- + static void apk_db_diri_free(struct apk_database *db, +- struct apk_db_dir_instance *diri) ++ struct apk_db_dir_instance *diri, ++ int allow_rmdir) + { +- apk_db_dir_unref(db, diri->dir); ++ apk_db_dir_unref(db, diri->dir, allow_rmdir); + free(diri); + } + +@@ -1265,7 +1268,7 @@ void apk_db_close(struct apk_database *db) + + list_for_each_entry(ipkg, &db->installed.packages, installed_pkgs_list) { + hlist_for_each_entry_safe(diri, dc, dn, &ipkg->owned_dirs, pkg_dirs_list) { +- apk_db_diri_free(db, diri); ++ apk_db_diri_free(db, diri, APK_DISALLOW_RMDIR); + } + } + +@@ -1884,9 +1887,8 @@ static void apk_db_purge_pkg(struct apk_database *db, + db->installed.stats.files--; + } + } +- apk_db_diri_rmdir(db, diri); + __hlist_del(dc, &ipkg->owned_dirs.first); +- apk_db_diri_free(db, diri); ++ apk_db_diri_free(db, diri, APK_ALLOW_RMDIR); + } + } + +-- +1.7.2.3 + diff --git a/main/apk-tools/APKBUILD b/main/apk-tools/APKBUILD index 3c9f6243c..e698b02e2 100644 --- a/main/apk-tools/APKBUILD +++ b/main/apk-tools/APKBUILD @@ -1,13 +1,14 @@ # Maintainer: Natanael Copa pkgname=apk-tools pkgver=2.0.5 -pkgrel=2 +pkgrel=3 pkgdesc="Alpine Package Keeper - package manager for alpine" subpackages="$pkgname-static" depends= makedepends="zlib-dev openssl-dev pkgconfig" source="http://git.alpinelinux.org/cgit/$pkgname/snapshot/$pkgname-$pkgver.tar.bz2 0001-Makefile-do-not-require-lua-pkgconfig-unless-you-int.patch + 0001-db-optionally-remove-dirs-when-unref.patch apk-tools-static.patch eglibc.patch " @@ -55,5 +56,6 @@ static() { md5sums="7f9234ab210557b064d7bd9b42833f0a apk-tools-2.0.5.tar.bz2 f63d483b724e8e9344ce8cb965d5ed22 0001-Makefile-do-not-require-lua-pkgconfig-unless-you-int.patch +c2ea3684c22740ef210a9b1a64ba4058 0001-db-optionally-remove-dirs-when-unref.patch 3c1f21719a6c4aba51333cf0d88c5600 apk-tools-static.patch a4de86c6c4df6d4d125ff82e607797d6 eglibc.patch" -- cgit v1.2.3