lib/transaction_files.c: update package archive compressions
This commit is contained in:
parent
f5e6d33c6e
commit
f45c6798c9
@ -126,21 +126,21 @@ addItem(const char *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
can_delete_directory(const char *path, size_t len, size_t max)
|
can_delete_directory(struct xbps_handle *xhp, const char *file, size_t len, size_t max)
|
||||||
{
|
{
|
||||||
char file[PATH_MAX] = ".";
|
|
||||||
struct item *item;
|
struct item *item;
|
||||||
size_t rmcount = 0, fcount = 0;
|
size_t rmcount = 0, fcount = 0;
|
||||||
DIR *dp;
|
DIR *dp;
|
||||||
|
|
||||||
xbps_strlcpy(file+1, path, sizeof (file)-1);
|
|
||||||
|
|
||||||
dp = opendir(file);
|
dp = opendir(file);
|
||||||
if (dp == NULL) {
|
if (dp == NULL) {
|
||||||
if (errno == ENOENT)
|
xbps_dbg_printf(xhp, "[files] "
|
||||||
|
"%s wtf: %s\n", file, strerror(errno));
|
||||||
|
if (errno == ENOENT) {
|
||||||
return true;
|
return true;
|
||||||
else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -150,7 +150,7 @@ can_delete_directory(const char *path, size_t len, size_t max)
|
|||||||
*/
|
*/
|
||||||
for (size_t i = 0; i < max; i++) {
|
for (size_t i = 0; i < max; i++) {
|
||||||
item = items[i];
|
item = items[i];
|
||||||
if (strncmp(item->file, path, len) == 0) {
|
if (strncmp(item->file, file, len) == 0) {
|
||||||
if (!item->deleted) {
|
if (!item->deleted) {
|
||||||
closedir(dp);
|
closedir(dp);
|
||||||
return false;
|
return false;
|
||||||
@ -169,6 +169,10 @@ can_delete_directory(const char *path, size_t len, size_t max)
|
|||||||
/* ignore '.' and '..' */
|
/* ignore '.' and '..' */
|
||||||
fcount -= 2;
|
fcount -= 2;
|
||||||
|
|
||||||
|
xbps_dbg_printf(xhp, "[files] "
|
||||||
|
"transaction deletes %lu out of %lu files in: %s\n",
|
||||||
|
rmcount, fcount, file);
|
||||||
|
|
||||||
return fcount <= rmcount;
|
return fcount <= rmcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,23 +237,26 @@ collect_obsoletes(struct xbps_handle *xhp)
|
|||||||
if (access(item->file, F_OK) == 0) {
|
if (access(item->file, F_OK) == 0) {
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, item->new.pkgver,
|
rv, item->new.pkgver,
|
||||||
"%s: [trans] file `%s': %s",
|
"%s: [files] file `%s': %s",
|
||||||
pkgname, item->file, strerror(EEXIST));
|
item->new.pkgver, item->file, strerror(EEXIST));
|
||||||
rv = EEXIST;
|
rv = EEXIST;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
} else if (item->old.type == TYPE_DIR && item->new.type != TYPE_DIR) {
|
} else if (item->old.type == TYPE_DIR &&
|
||||||
|
item->new.type != TYPE_DIR && item->new.type != 0) {
|
||||||
/*
|
/*
|
||||||
* Directory replaced by a file or symlink.
|
* Directory replaced by a file or symlink.
|
||||||
* We MUST be able to delete the directory.
|
* We MUST be able to delete the directory.
|
||||||
*/
|
*/
|
||||||
if (!can_delete_directory(item->file, item->len, i)) {
|
xbps_dbg_printf(xhp, "[files] "
|
||||||
|
"%s changed from directory to file\n", item->file);
|
||||||
|
if (!can_delete_directory(xhp, item->file, item->len, i)) {
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, item->old.pkgver,
|
rv, item->old.pkgver,
|
||||||
"%s: [trans] Directory `%s' can not be deleted",
|
"%s: [files] Directory `%s' can not be deleted",
|
||||||
item->old.pkgname, item->file);
|
item->old.pkgver, item->file);
|
||||||
return ENOTEMPTY;
|
return ENOTEMPTY;
|
||||||
}
|
}
|
||||||
} else if (item->new.type != item->old.type) {
|
} else if (item->new.type != item->old.type) {
|
||||||
@ -312,6 +319,9 @@ collect_obsoletes(struct xbps_handle *xhp)
|
|||||||
}
|
}
|
||||||
assert(pkgname);
|
assert(pkgname);
|
||||||
|
|
||||||
|
xbps_dbg_printf(xhp, "[obsoletes] "
|
||||||
|
"%s\n", item->file);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mark file as being deleted, this is used when
|
* Mark file as being deleted, this is used when
|
||||||
* checking if a directory can be deleted.
|
* checking if a directory can be deleted.
|
||||||
@ -373,7 +383,7 @@ collect_file(struct xbps_handle *xhp, const char *file, size_t size,
|
|||||||
* Multiple packages removing the same file.
|
* Multiple packages removing the same file.
|
||||||
* Shouldn't happen, but its not fatal.
|
* Shouldn't happen, but its not fatal.
|
||||||
*/
|
*/
|
||||||
xbps_dbg_printf(xhp, "%s: [trans] file `%s' already removed"
|
xbps_dbg_printf(xhp, "%s: [files] file `%s' already removed"
|
||||||
"by `%s'\n", pkgname, file, item->old.pkgname);
|
"by `%s'\n", pkgname, file, item->old.pkgname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -398,7 +408,7 @@ collect_file(struct xbps_handle *xhp, const char *file, size_t size,
|
|||||||
*/
|
*/
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, pkgver,
|
rv, pkgver,
|
||||||
"%s: [trans] file already installed by package `%s': %s",
|
"%s: [files] file already installed by package `%s': %s",
|
||||||
pkgver, item->new.pkgname, pkgname, file);
|
pkgver, item->new.pkgname, pkgname, file);
|
||||||
return EEXIST;
|
return EEXIST;
|
||||||
}
|
}
|
||||||
@ -429,10 +439,10 @@ add:
|
|||||||
*/
|
*/
|
||||||
if (strcmp(item->new.pkgname, item->old.pkgname) != 0) {
|
if (strcmp(item->new.pkgname, item->old.pkgname) != 0) {
|
||||||
if (remove) {
|
if (remove) {
|
||||||
xbps_dbg_printf(xhp, "%s: [trans] file `%s' moved to"
|
xbps_dbg_printf(xhp, "%s: [files] file `%s' moved to"
|
||||||
" package `%s'\n", pkgname, file, item->new.pkgname);
|
" package `%s'\n", pkgname, file, item->new.pkgname);
|
||||||
} else {
|
} else {
|
||||||
xbps_dbg_printf(xhp, "%s: [trans] file `%s' moved from"
|
xbps_dbg_printf(xhp, "%s: [files] file `%s' moved from"
|
||||||
" package `%s'\n", pkgname, file, item->new.pkgname);
|
" package `%s'\n", pkgname, file, item->new.pkgname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -544,9 +554,11 @@ add_from_archive(struct xbps_handle *xhp, xbps_dictionary_t pkg_repod,
|
|||||||
/*
|
/*
|
||||||
* Enable support for tar format and gzip/bzip2/lzma compression methods.
|
* Enable support for tar format and gzip/bzip2/lzma compression methods.
|
||||||
*/
|
*/
|
||||||
archive_read_support_compression_gzip(ar);
|
archive_read_support_filter_gzip(ar);
|
||||||
archive_read_support_compression_bzip2(ar);
|
archive_read_support_filter_bzip2(ar);
|
||||||
archive_read_support_compression_xz(ar);
|
archive_read_support_filter_xz(ar);
|
||||||
|
archive_read_support_filter_lz4(ar);
|
||||||
|
archive_read_support_filter_zstd(ar);
|
||||||
archive_read_support_format_tar(ar);
|
archive_read_support_format_tar(ar);
|
||||||
|
|
||||||
pkg_fd = open(bpkg, O_RDONLY|O_CLOEXEC);
|
pkg_fd = open(bpkg, O_RDONLY|O_CLOEXEC);
|
||||||
@ -554,7 +566,7 @@ add_from_archive(struct xbps_handle *xhp, xbps_dictionary_t pkg_repod,
|
|||||||
rv = errno;
|
rv = errno;
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, pkgver,
|
rv, pkgver,
|
||||||
"%s: [trans] failed to open binary package `%s': %s",
|
"%s: [files] failed to open binary package `%s': %s",
|
||||||
pkgver, bpkg, strerror(rv));
|
pkgver, bpkg, strerror(rv));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -562,7 +574,7 @@ add_from_archive(struct xbps_handle *xhp, xbps_dictionary_t pkg_repod,
|
|||||||
rv = errno;
|
rv = errno;
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, pkgver,
|
rv, pkgver,
|
||||||
"%s: [trans] failed to fstat binary package `%s': %s",
|
"%s: [files] failed to fstat binary package `%s': %s",
|
||||||
pkgver, bpkg, strerror(rv));
|
pkgver, bpkg, strerror(rv));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -570,7 +582,7 @@ add_from_archive(struct xbps_handle *xhp, xbps_dictionary_t pkg_repod,
|
|||||||
rv = archive_errno(ar);
|
rv = archive_errno(ar);
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL,
|
||||||
rv, pkgver,
|
rv, pkgver,
|
||||||
"%s: [trans] failed to read binary package `%s': %s",
|
"%s: [files] failed to read binary package `%s': %s",
|
||||||
pkgver, bpkg, strerror(rv));
|
pkgver, bpkg, strerror(rv));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -728,7 +740,7 @@ xbps_transaction_files(struct xbps_handle *xhp, xbps_object_iterator_t iter)
|
|||||||
if (chdir(xhp->rootdir) == -1) {
|
if (chdir(xhp->rootdir) == -1) {
|
||||||
rv = errno;
|
rv = errno;
|
||||||
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL, rv, xhp->rootdir,
|
xbps_set_cb_state(xhp, XBPS_STATE_FILES_FAIL, rv, xhp->rootdir,
|
||||||
"[trans] failed to chdir to rootdir `%s': %s",
|
"[files] failed to chdir to rootdir `%s': %s",
|
||||||
xhp->rootdir, strerror(errno));
|
xhp->rootdir, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user