1) The changes to sync.c look big but there are mostly caused by
the indentation. Fix a bug where download_size == 0 because the packages and
deltas are already in the cache, but we still need to build the deltas list
and apply the deltas to create the final package.
2) Fix the gzip / md5sum issue by switching to xdelta3, disabling external
recompression and using gzip -n in pacman, and disable bsdtar compression
and using gzip -n in makepkg.
*UseDelta*::
Download delta files instead of complete packages if possible. Requires
- the xdelta program to be installed.
+ the xdelta3 program to be installed.
*TotalDownload*::
When downloading, display the amount downloaded, download rate, ETA,
diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c
index ff77501..337eb66 100644
--- a/lib/libalpm/delta.c
+++ b/lib/libalpm/delta.c
@@ -232,13 +232,13 @@ off_t _alpm_shortest_delta_path(alpm_list_t *deltas,
return(bestsize);
}
fname = alpm_pkg_get_filename(spkg);
ASSERT(fname != NULL, RET_ERR(PM_ERR_PKG_INVALID_NAME, -1));
- if(spkg->download_size != 0) {
- alpm_list_t *delta_path = spkg->delta_path;
- if(delta_path) {
- alpm_list_t *dlts = NULL;
-
- for(dlts = delta_path; dlts; dlts = dlts->next) {
- pmdelta_t *d = dlts->data;
-
- if(d->download_size != 0) {
- /* add the delta filename to the download list if
- * it's not in the cache */
- files = alpm_list_add(files, strdup(d->delta));
- }
-
- /* keep a list of the delta files for md5sums */
- deltas = alpm_list_add(deltas, d);
+ alpm_list_t *delta_path = spkg->delta_path;
+ if(delta_path) {
+ /* using deltas */
+ alpm_list_t *dlts = NULL;
+
+ for(dlts = delta_path; dlts; dlts = dlts->next) {
+ pmdelta_t *d = dlts->data;
+
+ if(d->download_size != 0) {
+ /* add the delta filename to the download list if needed */
+ files = alpm_list_add(files, strdup(d->delta));
}
- } else {
- /* not using deltas, so add the file to the download list */
+ /* keep a list of all the delta files for md5sums */
+ deltas = alpm_list_add(deltas, d);
+ }
+
+ } else {
+ /* not using deltas */
+ if(spkg->download_size != 0) {
+ /* add the filename to the download list if needed */
files = alpm_list_add(files, strdup(fname));
}
}
+
}
}
- /* Use the deltas to generate the packages */
- EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
- ret = apply_deltas(trans);
- EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
+ /* Use the deltas to generate the packages */
+ EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
+ ret = apply_deltas(trans);
+ EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
- }
if(ret) {
pm_errno = PM_ERR_DLT_PATCHFAILED;
goto error;
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 52e80d1..9e0f249 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -975,7 +975,7 @@ create_package() {
# the null string rather than itself
shopt -s nullglob
- if ! bsdtar -c${TAR_OPT}f "$pkg_file" $comp_files *; then
+ if ! bsdtar -c${TAR_OPT}f - $comp_files * | gzip -n > "$pkg_file"; then
error "$(gettext "Failed to create package file.")"
exit 1 # TODO: error code
fi
@@ -985,8 +985,8 @@ create_package() {
create_xdelta() {
if [ "$(check_buildenv xdelta)" != "y" ]; then
return
- elif [ ! "$(type -p xdelta)" ]; then
- error "$(gettext "Cannot find the xdelta binary! Is xdelta installed?")"
+ elif [ ! "$(type -p xdelta3)" ]; then
+ error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")"
return
fi
@@ -1020,25 +1020,9 @@ create_xdelta() {
local delta_file="$PKGDEST/$pkgname-${latest_version}_to_$pkgver-$pkgrel-$CARCH.delta"
local ret=0
- # xdelta will decompress base_file & pkg_file into TMP_DIR (or /tmp if
- # TMP_DIR is unset) then perform the delta on the resulting tars
- xdelta delta "$base_file" "$pkg_file" "$delta_file" || ret=$?
-
- if [ $ret -eq 0 -o $ret -eq 1 ]; then
- # Generate the final gz using xdelta for compression. xdelta will be our
- # common denominator compression utility between the packager and the
- # users. makepkg and pacman must use the same compression algorithm or
- # the delta generated package may not match, producing md5 checksum
- # errors.
- msg2 "$(gettext "Recreating package tarball from delta to match md5 signatures")"
- msg2 "$(gettext "NOTE: the delta should ONLY be distributed with this tarball")"
- ret=0
- xdelta patch "$delta_file" "$base_file" "$pkg_file" || ret=$?
- if [ $ret -ne 0 ]; then
- error "$(gettext "Could not generate the package from the delta.")"
- exit 1
- fi
- else
+ xdelta3 -s "$base_file" "$pkg_file" "$delta_file" || ret=$?
+
+ if [ $ret -ne 0 ]; then
warning "$(gettext "Delta was not able to be created.")"
fi
else
--
1.6.1.3
_______________________________________________
pacman-dev mailing list
pacman-dev@archlinux.org
http://www.archlinux.org/mailman/listinfo/pacman-dev
02-28-2009, 08:28 PM
Dan McGee
Fix several issues with xdelta
On Wed, Feb 25, 2009 at 12:43 PM, Xavier Chantry <shiningxc@gmail.com> wrote:
> 1) The changes to sync.c look big but there are mostly caused by
> the indentation. Fix a bug where download_size == 0 because the packages and
> deltas are already in the cache, but we still need to build the deltas list
> and apply the deltas to create the final package.
>
> 2) Fix the gzip / md5sum issue by switching to xdelta3, disabling external
> recompression and using gzip -n in pacman, and disable bsdtar compression
> and using gzip -n in makepkg.
>
> Signed-off-by: Xavier Chantry <shiningxc@gmail.com>
> ---
> *doc/pacman.conf.5.txt | * *2 +-
> *lib/libalpm/delta.c * | * *4 +-
> *lib/libalpm/sync.c * *| * 98 +++++++++++++++++++++++--------------------------
> *scripts/makepkg.sh.in | * 28 +++-----------
> *4 files changed, 55 insertions(+), 77 deletions(-)
>
> diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
> index fa21294..2f1fe3d 100644
> --- a/doc/pacman.conf.5.txt
> +++ b/doc/pacman.conf.5.txt
> @@ -144,7 +144,7 @@ Options
>
> **UseDelta*::
> * * * *Download delta files instead of complete packages if possible. *Requires
> - * * * the xdelta program to be installed.
> + * * * the xdelta3 program to be installed.
>
> **TotalDownload*::
> * * * *When downloading, display the amount downloaded, download rate, ETA,
> diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c
> index ff77501..337eb66 100644
> --- a/lib/libalpm/delta.c
> +++ b/lib/libalpm/delta.c
> @@ -232,13 +232,13 @@ off_t _alpm_shortest_delta_path(alpm_list_t *deltas,
> * * * * * * * *return(bestsize);
> * * * *}
>
> - * * * _alpm_log(PM_LOG_DEBUG, "started delta shortest-path search
");
> + * * * _alpm_log(PM_LOG_DEBUG, "started delta shortest-path search for '%s'
", to);
>
> * * * *vertices = delta_graph_init(deltas);
>
> * * * *bestsize = delta_vert(vertices, to, to_md5, &bestpath);
>
> - * * * _alpm_log(PM_LOG_DEBUG, "delta shortest-path search complete
");
> + * * * _alpm_log(PM_LOG_DEBUG, "delta shortest-path search complete : '%lld'
", (long long)bestsize);
I'd rather do this the way we did it elsewhere, and use the %j
operator (see be_files.c):
... "%jd", (intmax_t)bestsize);
I'm fine with having separate tar commands for each compression type-
instead of doing the switch statement to figure out TAR_OPT, just do
it for the entire tar command.
> * * * * * * * *error "$(gettext "Failed to create package file.")"
> * * * * * * * *exit 1 # TODO: error code
> * * * *fi
> @@ -985,8 +985,8 @@ create_package() {
> *create_xdelta() {
> * * * *if [ "$(check_buildenv xdelta)" != "y" ]; then
> * * * * * * * *return
> - * * * elif [ ! "$(type -p xdelta)" ]; then
> - * * * * * * * error "$(gettext "Cannot find the xdelta binary! Is xdelta installed?")"
> + * * * elif [ ! "$(type -p xdelta3)" ]; then
> + * * * * * * * error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")"
> * * * * * * * *return
> * * * *fi
>
> @@ -1020,25 +1020,9 @@ create_xdelta() {
> * * * * * * * *local delta_file="$PKGDEST/$pkgname-${latest_version}_to_$pkgver-$pkgrel-$CARCH.delta"
> * * * * * * * *local ret=0
>
> - * * * * * * * # xdelta will decompress base_file & pkg_file into TMP_DIR (or /tmp if
> - * * * * * * * # TMP_DIR is unset) then perform the delta on the resulting tars
> - * * * * * * * xdelta delta "$base_file" "$pkg_file" "$delta_file" || ret=$?
> -
> - * * * * * * * if [ $ret -eq 0 -o $ret -eq 1 ]; then
> - * * * * * * * * * * * # Generate the final gz using xdelta for compression. xdelta will be our
> - * * * * * * * * * * * # common denominator compression utility between the packager and the
> - * * * * * * * * * * * # users. makepkg and pacman must use the same compression algorithm or
> - * * * * * * * * * * * # the delta generated package may not match, producing md5 checksum
> - * * * * * * * * * * * # errors.
> - * * * * * * * * * * * msg2 "$(gettext "Recreating package tarball from delta to match md5 signatures")"
> - * * * * * * * * * * * msg2 "$(gettext "NOTE: the delta should ONLY be distributed with this tarball")"
> - * * * * * * * * * * * ret=0
> - * * * * * * * * * * * xdelta patch "$delta_file" "$base_file" "$pkg_file" || ret=$?
> - * * * * * * * * * * * if [ $ret -ne 0 ]; then
> - * * * * * * * * * * * * * * * error "$(gettext "Could not generate the package from the delta.")"
> - * * * * * * * * * * * * * * * exit 1
> - * * * * * * * * * * * fi
> - * * * * * * * else
> + * * * * * * * xdelta3 -s "$base_file" "$pkg_file" "$delta_file" || ret=$?
> +
> + * * * * * * * if [ $ret -ne 0 ]; then
> * * * * * * * * * * * *warning "$(gettext "Delta was not able to be created.")"
> * * * * * * * *fi
> * * * *else
> --
> 1.6.1.3
_______________________________________________
pacman-dev mailing list
pacman-dev@archlinux.org
http://www.archlinux.org/mailman/listinfo/pacman-dev
02-28-2009, 11:48 PM
Xavier Chantry
Fix several issues with xdelta
1) The changes to sync.c look big but there are mostly caused by
the indentation. Fix a bug where download_size == 0 because the packages and
deltas are already in the cache, but we still need to build the deltas list
and apply the deltas to create the final package.
2) Fix the gzip / md5sum issue by switching to xdelta3, disabling external
recompression and using gzip -n in pacman, and disable bsdtar compression
and using gzip -n in makepkg.
*UseDelta*::
Download delta files instead of complete packages if possible. Requires
- the xdelta program to be installed.
+ the xdelta3 program to be installed.
*TotalDownload*::
When downloading, display the amount downloaded, download rate, ETA,
diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c
index 9e4bcb4..de5dd60 100644
--- a/lib/libalpm/delta.c
+++ b/lib/libalpm/delta.c
@@ -21,6 +21,7 @@
fname = alpm_pkg_get_filename(spkg);
ASSERT(fname != NULL, RET_ERR(PM_ERR_PKG_INVALID_NAME, -1));
- if(spkg->download_size != 0) {
- alpm_list_t *delta_path = spkg->delta_path;
- if(delta_path) {
- alpm_list_t *dlts = NULL;
-
- for(dlts = delta_path; dlts; dlts = dlts->next) {
- pmdelta_t *d = dlts->data;
-
- if(d->download_size != 0) {
- /* add the delta filename to the download list if
- * it's not in the cache */
- files = alpm_list_add(files, strdup(d->delta));
- }
-
- /* keep a list of the delta files for md5sums */
- deltas = alpm_list_add(deltas, d);
+ alpm_list_t *delta_path = spkg->delta_path;
+ if(delta_path) {
+ /* using deltas */
+ alpm_list_t *dlts = NULL;
+
+ for(dlts = delta_path; dlts; dlts = dlts->next) {
+ pmdelta_t *d = dlts->data;
+
+ if(d->download_size != 0) {
+ /* add the delta filename to the download list if needed */
+ files = alpm_list_add(files, strdup(d->delta));
}
- } else {
- /* not using deltas, so add the file to the download list */
+ /* keep a list of all the delta files for md5sums */
+ deltas = alpm_list_add(deltas, d);
+ }
+
+ } else {
+ /* not using deltas */
+ if(spkg->download_size != 0) {
+ /* add the filename to the download list if needed */
files = alpm_list_add(files, strdup(fname));
}
}
+
}
}
- /* Use the deltas to generate the packages */
- EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
- ret = apply_deltas(trans);
- EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
+ /* Use the deltas to generate the packages */
+ EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
+ ret = apply_deltas(trans);
+ EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
- }
if(ret) {
pm_errno = PM_ERR_DLT_PATCHFAILED;
goto error;
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index d2cf52e..fc072b6 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -961,25 +961,29 @@ create_package() {
# tar it up
msg2 "$(gettext "Compressing package...")"
- local TAR_OPT
case "$PKGEXT" in
- *tar.gz) TAR_OPT="z" ;;
- *tar.bz2) TAR_OPT="j" ;;
+ *tar.gz) EXT=${PKGEXT%.gz} ;;
+ *tar.bz2) EXT=${PKGEXT%.bz2} ;;
*) warning "$(gettext "'%s' is not a valid archive extension.")"
- "$PKGEXT" ;;
+ "$PKGEXT" ; EXT=$PKGEXT ;;
esac
-
- local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
+ local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${CARCH}${EXT}"
# when fileglobbing, we want * in an empty directory to expand to
# the null string rather than itself
shopt -s nullglob
- if ! bsdtar -c${TAR_OPT}f "$pkg_file" $comp_files *; then
+ if ! bsdtar -cf - $comp_files * > "$pkg_file"; then
error "$(gettext "Failed to create package file.")"
exit 1 # TODO: error code
fi
shopt -u nullglob
+
+ case "$PKGEXT" in
+ *tar.gz) gzip -f -n "$pkg_file" ;;
+ *tar.bz2) bzip2 -f "$pkg_file" ;;
+ esac
+
}
create_srcpackage() {
--
1.6.1.3
_______________________________________________
pacman-dev mailing list
pacman-dev@archlinux.org
http://www.archlinux.org/mailman/listinfo/pacman-dev