# deltup - экономия трафика при скачивании distfiles

## chernousov

Есть такая штука - deltup. Сам пользую её около месяца и чрезвычайно доволен  :Wink: .

В общем, всячески рекомендую.

Подробности здесь: https://forums.gentoo.org/viewtopic.php?t=215262.

----------

## ZmiyGorinich

А можешь расказать как эту штуку ставить и настраивать?

----------

## icedank

Тама всё написано  :Smile: 

----------

## chernousov

icedank как всегда в своём репертуре...

Ок, разжую попунктно.

1. Стать рутом:

```
su -
```

2. Открыть /etc/make.conf и убедиться в наличии строки:

```
PORTDIR_OVERLAY="/usr/local/portage"
```

Если нет такой строки - добавить.

3. Создать соответствующую директорию для deltup'а и зайти туда:

```
mkdir -p /usr/local/portage/app-portage/deltup

cd /usr/local/portage/app-portage/deltup
```

4. Скачать туда ебилд:

```
wget http://linux01.gwdg.de/~nlissne/deltup-0.4.0.ebuild
```

5. Создать для него дайджест:

```
ebuild deltup-0.4.0.ebuild digest
```

6. Скачать в соответсвующее место getdelta.sh и дать ему (ей?  :Wink: ) права на выполнение:

```
cd /usr/local/bin

wget http://linux01.gwdg.de/~nlissne/getdelta.sh

chmod 755 getdelta.sh
```

7. Создать если не существует, или дописать в существующий специальный файлик информацию о том, что этот пакет у нас по жизни помеченый как ~x86:

```
mkdir -p /etc/portage

echo "app-portage/deltup ~x86" >> /etc/portage/package.keywords
```

8. Ну всё, пора емержить:

```
emerge deltup
```

9. Скажем портежам, что мы будем использовать getdelta.sh для скачивания наших дистфайлов. Для этого убедимся в том, что в /etc/make.conf есть такая строка:

```
FETCHCOMMAND="/usr/local/bin/getdelta.sh \${URI}"
```

Успехов!Last edited by chernousov on Mon Oct 04, 2004 3:04 am; edited 1 time in total

----------

## ZmiyGorinich

Спасибо... сейчас попробую  :Smile: 

----------

## LinuxMan

Не работает на GCC3.4! Как пофиксить?

----------

## icedank

 *Quote:*   

> 
> 
> Не работает на GCC3.4! Как пофиксить?
> 
> 

 

1. Сделать патч

2. Ждать новой версии (я пару недель назад мылил автору и он сказал что возобновляет работу над deltup)

 *Quote:*   

> 
> 
> icedank как всегда в своём репертуре... 
> 
> 

 

Но там же действительно написано всё то что ты написал!!!

----------

## ABVGD

 *LinuxMan wrote:*   

> Не работает на GCC3.4! Как пофиксить?

 

Кладем патч deltup-0.4.0-gcc34.patch в ${PORDIR_OVERLAY}/app-portage/deltup/files. Сам патч:

```
--- deltup-0.4.0/file.h 2003-07-20 07:33:05.000000000 +0400                                                                                                           

+++ deltup-modified-0.4.0/file.h        2004-09-26 23:12:00.100396288 +0400                                                                                           

@@ -129,7 +129,7 @@                                                                                                                                                   

     while (!list.empty() && num >= list.first->obj->num) {                                                                                                           

       unsigned numbuf = list.first->obj->num;                                                                                                                        

       memcpy(data, list.first->obj->buf, numbuf);                                                                                                                    

-      (char*)data+=numbuf;                                                                                                                                           

+      data=(char*)data+numbuf;                                                                                                                                       

               num-=numbuf;                                                                                                                                           

           numread+=numbuf;                                                                                                                                           

       delete (char*)list.first->obj->start;                                                                                                                          

@@ -139,7 +139,7 @@                                                                                                                                                   

     if (!list.empty()) {                                                                                                                                             

       memcpy(data, list.first->obj->buf, num);                                                                                                                       

       list.first->obj->num-=num;                                                                                                                                     

-      (char*)list.first->obj->buf+=num;                                                                                                                              

+      list.first->obj->buf=(char*)list.first->obj->buf+num;                                                                                                          

       numread+=num;                                                                                                                                                  

     } else {                                                                                                                                                         

       numread+=f.read(data, num);
```

deltup-0.4.0.ebuild теперь выглядит так:

```
# Copyright 1999-2004 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2                                                                                                              

# $Header: $

                                                                                                                                                                      

inherit eutils                                                                                                                                                        

                                                                                                                                                                      

S=${WORKDIR}/${P}                                                                                                                                                     

DESCRIPTION="Patch system for Gentoo sources.  Retains MD5 codes"                                                                                                     

HOMEPAGE="http://deltup.sourceforge.net"                                                                                                                              

SRC_URI="mirror://sourceforge/${PN}/${P}.tar.gz"                                                                                                                      

                                                                                                                                                                      

SLOT="0"                                                                                                                                                              

LICENSE="GPL-2"                                                                                                                                                       

KEYWORDS="~x86 ~ppc ~sparc"                                                                                                                                           

                                                                                                                                                                      

DEPEND=">=dev-util/xdelta-1.1.3                                                                                                                                       

        >=app-arch/bzip2-1.0.0"                                                                                                                                       

                                                                                                                                                                      

pkg_setup() {                                                                                                                                                         

        echo                                                                                                                                                          

        einfo ""                                                                                                                                                      

        einfo "Please note that deltup will be removed from portage "                                                                                                 

        einfo "in the near future.  Development on deltup has stopped, although "                                                                                     

        einfo "patches are being generated in the interim until another distfile "                                                                                    

        einfo "patching system is ready for testing."                                                                                                                 

        einfo ""                                                                                                                                                      

        einfo "further info will be available at "                                                                                                                    

        einfo "http://www.gentoo.org/proj/en/glep/glep-0009.html"                                                                                                     

        einfo ""                                                                                                                                                      

        echo -ne "\a" ; sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null                                                                                                 

        echo -ne "\a" ; sleep 1                                                                                                                                       

        echo -ne "\a" ; sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null                                                                                                 

        echo -ne "\a" ; sleep 1                                                                                                                                       

        sleep 3                                                                                                                                                       

}                                                                                                                                                                     

                                                                                                                                                                      

src_unpack () {                                                                                                                                                       

        unpack ${A}                                                                                                                                                   

        cd ${S}                                                                                                                                                                              

        GCC_MAJOR_VER=$(gcc-config -c | awk -F- '{print $NF}' | cut -d"." -f1)                                                                                                               

        GCC_MINOR_VER=$(gcc-config -c | awk -F- '{print $NF}' | cut -d"." -f2)

        if [[ "$GCC_MAJOR_VER" -eq "3" && "$GCC_MINOR_VER" -ge "4" ]]; then                                                                                                        

            epatch ${FILESDIR}/${P}-gcc34.patch                                                                                                                                    

        fi

}                                                                                                                                                                     

                                                                                                                                                                      

src_install () {                                                                                                                                                      

        make DESTDIR=${D} install || die                                                                                                                              

        dodoc README ChangeLog GENTOO                                                                                                                                 

        doman deltup.1                                                                                                                                                

}
```

Edited: Добавил проверку версии gcc. ebuild накладывает патч только для gcc-3.>=4.Last edited by ABVGD on Mon Sep 27, 2004 6:00 am; edited 2 times in total

----------

## chiko

Кто-нибудь считал реальную экономию входящего трафика? В среднем, в процентах...

----------

## chernousov

На http://linux01.gwdg.de/~nlissne/ пишут следующее: *Quote:*   

> How much traffic can be saved using the dynamic deltup server?
> 
> This depends on how much a source-archive changed between versions – some updates save a lot (for example updating firefox from version 0.9.1 to version 0.9.3 saves 98.77% of traffic - that means you would have to download 408 kB instead of >32MB) others are less efficient (for example updating wxGTK from version 2.4.2 to version 2.5.1 saves 57% only – but that still means you save more than 3MB of download, downloading 2.6 MB instead of 6MB) – Typically we save about 70-80% of traffic. Have a look at our cache-status-page which shows the current cache-content and some stats about filesizes and efficiency:
> 
> http://linux01.gwdg.de/~nlissne/deltup-status.atime.html (warning: this page is large)

 

----------

## Balancer

 *chernousov wrote:*   

> 
> 
> 2. Открыть /etc/make.conf и убедиться в наличии строки:
> 
> ```
> ...

 

/usr/local/portage или /usr/portage? Это общая директория портежей или для своих нужд?

У меня при каждом ebuild выдаётся 

```

Checking if a Thirdparty-Mirror is used ...

/usr/local/bin/getdelta.sh: eval: line 1: syntax error near unexpected token `)'

/usr/local/bin/getdelta.sh: eval: line 1: `echo )'

basename: too few arguments

Try `basename --help' for more information.

No third-party mirror.

```

Вот и думаю, где грабли...  :Smile: 

----------

## chernousov

 *Balancer wrote:*   

> /usr/local/portage или /usr/portage? Это общая директория портежей или для своих нужд?

 

Именно local - для "своих" нужд.

 *Balancer wrote:*   

> У меня при каждом ebuild выдаётся 
> 
> ```
> 
> Checking if a Thirdparty-Mirror is used ...
> ...

 

Ммм... интересно.. попробую разобраться. По идее он из ебилда вытаскивает mirror:// и складывает их в /tmp/getdelta.tmp. Потом парсит этот файлик. Вот тут-то и затык.. Разберусь на досуге...

----------

## Balancer

Именно 0.5.3

Я только вчера всё поставил.

В общем, после всех emerge sync и переноса оверлея в /usr/local/ такая ругань пропала (м.б. и ещё чего-то делал, в т.ч. точно несколько системных либ перекомпилял - я систему с майского компакта ставил, несколько устаревшая уже), но те несколько пакетов, что уже ставил (вот, сейчас alsa-headers качается)  все ставятся выкачиваясь целиком. Либо эта система у меня не работает, либо слишком старые версии в моём distfiles  :Smile: 

----------

## chernousov

Досуга ждать пришлось не долго  :Wink: 

Вот патчик сбацал:

```
283,284c283,284

< grep "mirror://" $EBUILD | awk -F"mirror://" '{ print $2 }' | tr -d \" >/tmp/getdelta.tmp

< if [ -s /tmp/getdelta.tmp ]

---

>

> if [ ${EBUILD} <> "" ]

286,297c286,301

<       for mirrorline in $(cat /tmp/getdelta.tmp)

<       do

<               mline=$(eval echo $mirrorline)

<               mfile=$(basename ${mline})

<               if [ "${mfile}" = "${NEW_FILE}" ]

<               then

<                       mirror=$(cut -d/ -f1 <<< $mline)

<                       path=$(cut -d/ -f2- <<< $mline)

<                       let len=$(wc -c <<< $NEW_FILE)+1

<                       path=/$(echo $path | rev | cut -c ${len}- | rev)

<               fi

<       done

---

>       grep "mirror://" $EBUILD | awk -F"mirror://" '{ print $2 }' | tr -d \" >/tmp/getdelta.tmp

>       if [ -s /tmp/getdelta.tmp ]

>       then

>               for mirrorline in $(cat /tmp/getdelta.tmp)

>               do

>                       mline=$(eval echo $mirrorline)

>                       mfile=$(basename ${mline})

>                       if [ "${mfile}" = "${NEW_FILE}" ]

>                       then

>                               mirror=$(cut -d/ -f1 <<< $mline)

>                               path=$(cut -d/ -f2- <<< $mline)

>                               let len=$(wc -c <<< $NEW_FILE)+1

>                               path=/$(echo $path | rev | cut -c ${len}- | rev)

>                       fi

>               done

>       fi

```

Засунь это в какой-нить файлик типа getdelta.sh.patch и выполни:

```
patch /usr/local/bin/getdelta.sh getdelta.sh.patch
```

----------

## LinuxMan

Патч от ABVGD не работает через некоректность записи. От 100% работоющие файлы:

deltup-0.4.0.ebuild

```

# Copyright 1999-2004 Gentoo Technologies, Inc.

# Distributed under the terms of the GNU General Public License v2

# $Header: /home/cvsroot/gentoo-x86/app-portage/deltup/deltup-0.4.0.ebuild,v 1.5 2004/02/21 10:56:55 ferringb Exp $

S=${WORKDIR}/${P}

DESCRIPTION="Patch system for Gentoo sources.  Retains MD5 codes"

HOMEPAGE="http://deltup.sourceforge.net"

SRC_URI="mirror://sourceforge/${PN}/${P}.tar.gz"

SLOT="0"

LICENSE="GPL-2"

KEYWORDS="~x86 ~ppc ~sparc"

DEPEND=">=dev-util/xdelta-1.1.3

   >=app-arch/bzip2-1.0.0"

pkg_setup() {

   echo

   einfo ""

   einfo "Please note that deltup will be removed from portage "

   einfo "in the near future.  Development on deltup has stopped, although "

   einfo "patches are being generated in the interim until another distfile "

   einfo "patching system is ready for testing."

   einfo ""

   einfo "further info will be available at "

   einfo "http://www.gentoo.org/proj/en/glep/glep-0009.html"

   einfo ""

   echo -ne "\a" ; sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null

   echo -ne "\a" ; sleep 1

   echo -ne "\a" ; sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null

   echo -ne "\a" ; sleep 1

   sleep 3

}

src_unpack () {

   unpack ${A}

   cd ${S}

   GCC_MAJOR_VER=$(gcc-config -c | awk -F- '{print $NF}' | cut -d"." -f1)

   GCC_MINOR_VER=$(gcc-config -c | awk -F- '{print $NF}' | cut -d"." -f2)

   if [[ "$GCC_MAJOR_VER" -eq "3" && "$GCC_MINOR_VER" -ge "4" ]]; then

      epatch ${FILESDIR}/${P}-gcc34.patch

   fi

}

src_install () {

   make DESTDIR=${D} install || die

   dodoc README ChangeLog GENTOO

   doman deltup.1

}

```

deltup-0.4.0-gcc34.patch

```

--- deltup-0.4.0/file.h   2003-07-20 06:33:05.000000000 +0300

+++ deltup-0.4.0-mod/file.h   2004-09-28 18:37:42.000000000 +0300

@@ -129,7 +129,7 @@

     while (!list.empty() && num >= list.first->obj->num) {

       unsigned numbuf = list.first->obj->num;

       memcpy(data, list.first->obj->buf, numbuf);

-      (char*)data+=numbuf;

+      data=(char*)data+numbuf;

               num-=numbuf;

           numread+=numbuf;

       delete (char*)list.first->obj->start;

@@ -139,7 +139,7 @@

     if (!list.empty()) {

       memcpy(data, list.first->obj->buf, num);

       list.first->obj->num-=num;

-      (char*)list.first->obj->buf+=num;

+      list.first->obj->buf=(char*)list.first->obj->buf+num;

       numread+=num;

     } else {

       numread+=f.read(data, num);

```

----------

## ABVGD

Ух уж эти copy-paste. Спасибо за поправку. Желательно в ebuild первой строкой добавить "inherit eutils". Без нее функция "epatch" может не сработать.

----------

## LinuxMan

 *ABVGD wrote:*   

> Ух уж эти copy-paste. Спасибо за поправку. Желательно в ebuild первой строкой добавить "inherit eutils". Без нее функция "epatch" может не сработать.

 

Точно! Спасибо за попраку  :Very Happy: 

----------

## ZmiyGorinich

Сегодня при обновлении получил вот это:

```
A new version of getdelta.sh is available (0.6)

 

getdelta-0.6

 

please update.

 

The new version drop mirror-detection on client-side and the

query-format changed - therefor you *have to* update to keep it working.

 

There is an ebuild and a gensync-source available.

 

check http://linux01.gwdg.de/~nlissne/ for details

```

На сайте есть ebuild.... но вот как эго поставить чего то не догоняю...

----------

## plisk

угу, вчера тож в непонятках был. после недолгого подбора урла таки слил новый getdelta.sh 

http://linux01.gwdg.de/~nlissne/getdelta-0.6.tar.bz2

----------

## chernousov

 *RI-VVM wrote:*   

> На сайте есть ebuild.... но вот как эго поставить чего то не догоняю...

 

```
su -

cd /usr/portage/distfiles/

wget http://linux01.gwdg.de/~nlissne/getdelta-0.6.tar.bz2

mkdir /usr/local/portage/app-portage/getdelta

cd /usr/local/portage/app-portage/getdelta/

wget http://linux01.gwdg.de/~nlissne/getdelta-0.6.ebuild

ebuild getdelta-0.6.ebuild digest

emerge getdelta

rm /usr/local/bin/getdelta.sh #удалим старый
```

Не забыть поправить в /etc/make.conf путь к getdelta.sh (поменять /usr/local/bin/getdelta.sh на /usr/bin/getdelta.sh)!

----------

## ZmiyGorinich

Спасибо... я так и думал что на сайте чего-то не хватает  :Smile: 

----------

## ShadowK

Да, кстати, сразу поставить с ходу 0.6 не вышло, так как он зависить по RDEPEND от deltup. Так что пришлось ставить сначала 0.4 а потом 0.6.

Хотя, мне не понятно, почему бы в getdelta-0.6.ebuild нельзя было сразу добавить

```

DEPEND=">=dev-util/xdelta-1.1.3

                  >=app-arch/bzip2-1.0.0"

```

вместо

```

RDEPEND="app-portage/deltup"

```

может я чего-то не понимаю?

----------

## chernousov

 *ShadowK wrote:*   

> Да, кстати, сразу поставить с ходу 0.6 не вышло, так как он зависить по RDEPEND от deltup. Так что пришлось ставить сначала 0.4 а потом 0.6.
> 
> Хотя, мне не понятно, почему бы в getdelta-0.6.ebuild нельзя было сразу добавить
> 
> ```
> ...

 Хотя бы потому что xdelta и bzip2 - это ещё не deltup.

----------

## ShadowK

Ну хорошо, я понимаю, но все-таки, если кто-то просто ставит getdelta-0.6 то он и знать не будет, что такое deltup если не прочитает этот топик ... ну да ладно, черт с ним, главное что работает :)

----------

## Apexman

BTW, на sourceforge лежит deltup-0.4.2, ebuild имеется

http://sourceforge.net/project/showfiles.php?group_id=77305&package_id=78210

----------

## kon

http://linux01.gwdg.de/~nlissne/getdelta-0.6.1.ebuild

----------

## ABVGD

Сегодня после продолжительных попыток успешно сгенерировась дельта между linux-2.6.8.tar.bz2 и linux-2.6.9.tar.bz2 объемом около 3Мб. Приятный результат.

----------

## chernousov

2004/10/22 getdelta-0.6.2 released:

```
# version 0.6.2   2004/10/22

#               - changed QUERY_URL to get the last URL instead the first

#                 since that's the original server (not a mirror)
```

 Только ссылка на родном сайте почему-то ведёт на 0.6.1. В общем, краткий инструктаж:

```
su -

cd /usr/local/portage/app-portage/getdelta

wget http://linux01.gwdg.de/~nlissne/getdelta-0.6.2.ebuild

ebuild getdelta-0.6.2.ebuild digest

ACCEPT_KEYWORDS="~x86" emerge getdelta
```

----------

