# Новые утилиты для чистки distfil'ов !!!

## bobr[x3]

Вот, от нефиг делать набросал утилитки для чистки дистфайлов от ненужного мусора.

Писаны они на питоне, соответственно он требуется. Больше не надо ничего.

Пока что код выложить некуда, поэтому просто прикрепляю. Помогите потестить это дело. Предложения и пожелания приветствуются.

Пакет состоит из друх скриптов:

distfiles-gendigest.py:

Генерит дайджест для всех пакетов из дерева портежей.

```
usage: distfiles-gendigest.py [options]

options:

  -h, --help            show this help message and exit

  -dOUT, --digest=OUT   Generated digest file name

  -pDIRS, --portdirs=DIRS

                        Colon separated list of portage directories

  -s, --silent          Produce no output

  -v, --verbose         Produce more output

```

- OUT по умолчанию равен /var/db/distfiles/digest .

- DIRS по умолчанию равер /usr/portage:/usr/local/portage .

distfiles-clean.py:

Ищет (и удалает) ненужные или неправильные дистфайлы.

```
usage: distfiles-clean.py [options]

options:

  -h, --help            show this help message and exit

  -dIN, --digest=IN     Digest file name

  -pDIR, --distdir=DIR  Distfiles directory

  --delete              Remove files

  -s, --silent          Produce no output

  --size                Perform size checking

  --sum                 Perform ckecksum checking (slow)

  -v, --verbose         Produce more output

```

- IN по умолчанию равен /var/db/distfiles/digest .

- DIR по умолчанию равер /usr/portage/distfiles .

distfiles-gendigest.py:

```

#!/usr/bin/python

from glob import glob

from string import split

from sys import *

from optparse import OptionParser

parser = OptionParser()

parser.add_option("-d", "--digest",

                  action = "store", dest = "out_file_name",

                  default = "/var/db/distfiles/digest",

                  metavar = "OUT", help = "Generated digest file name")

parser.add_option("-p", "--portdirs",

                  action = "store", dest = "portage_dirs",

                  default = "/usr/portage:/usr/local/portage",

                  metavar = "DIRS", help = "Colon separated list of portage directories")

parser.add_option("-s", "--silent",

                  action = "store_true", dest = "silent",

                  default=False,

                  help = "Produce no output")

parser.add_option("-v", "--verbose",

                  action = "store_true", dest = "verbose",

                  default = False,

                  help = "Produce more output")

ops, args = parser.parse_args(argv[1:])

def get_columns():

    from commands import getoutput

    size = getoutput("stty size").split()

    columns = size[1]

    return int(columns)

red_bullet    = "\033[01;31m * \033[00m"

yellow_bullet = "\033[01;33m * \033[00m"

green_bullet  = "\033[01;32m * \033[00m"

good          = "\033[A\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;32m  ok  \033[01;34m]\033[00m\n"

warning       = "\033[A\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;33m  !!  \033[01;34m]\033[00m\n"

error         = "\033[A\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;31m  !!  \033[01;34m]\033[00m\n"

fine = True

distfile_names = []

distfile_sizes = []

distfile_sums = []

distfile_sum_algs = []

out_file = open(ops.out_file_name, "w")

if not ops.silent and not ops.verbose:

    stdout.write(green_bullet + "Generating distfiles digest (this may take few minutes)\n")

    stdout.flush()

for portage_dir in split(ops.portage_dirs, ':'):

    for package_dir in glob(portage_dir + "/*-*/*"):

        if ops.verbose and not ops.silent:

            fine = True

            stdout.write(green_bullet + "Processing package \033[01;01m")

            stdout.write(split(package_dir, "/")[-2] + '/')

            stdout.write(split(package_dir, "/")[-1] + "\033[00m\n")

        for digest_file_name in glob(package_dir + "/files/digest-*"):

            in_file = open(digest_file_name, 'r')

            for digest in in_file.readlines():

                distfile = digest.split()

                if len(distfile) != 4:

                    continue

                distfile_name = distfile[2]

                distfile_size = int(distfile[3])

                distfile_sum = distfile[1]

                distfile_sum_alg = distfile[0]

                for i in range(len(distfile_names)):

                    if distfile_name == distfile_names[i]:

                        if (distfile_size != distfile_sizes[i]) or (distfile_size != distfile_sizes[i]):

                            if not ops.silent:

                                fine = False

                                stdout.write(yellow_bullet + "File \033[01;01m" + distfile_name + "\033[00m ")

                                stdout.write("has \033[00;33mconflicting digests\033[00m\n")

                                stdout.write(warning)

                            continue

                        else:

                            break

                else:

                    distfile_names.append(distfile_name)

                    distfile_sizes.append(distfile_size)

                    distfile_sums.append(distfile_sum)

                    distfile_sum_algs.append(distfile_sum_alg)

                    out_file.write(distfile_sum_alg + " ")

                    out_file.write(distfile_sum + " ")

                    out_file.write(distfile_name + " ")

                    out_file.write(str(distfile_size) + "\n")

            in_file.close()

        if ops.verbose and not ops.silent and fine:

            stdout.write(good)

if not ops.silent and not ops.verbose and fine:

    stdout.write(good)

out_file.close()

```

distfiles-clean.py

```

#!/usr/bin/python

from glob import glob

from optparse import OptionParser

from os import listdir

from os import remove

from os import stat

from string import split

from sys import *

from time import sleep

parser = OptionParser()

parser.add_option("-d", "--digest",

                  action = "store", dest = "in_file_name",

                  default = "/var/db/distfiles/digest",

                  metavar = "IN", help = "Digest file name")

parser.add_option("-p", "--distdir",

                  action = "store", dest = "distfiles_dir",

                  default = "/usr/portage/distfiles",

                  metavar = "DIR", help = "Distfiles directory")

parser.add_option("", "--delete",

                  action = "store_true", dest = "delete",

                  default = False,

                  help = "Remove files")

parser.add_option("-s", "--silent",

                  action = "store_true", dest = "silent",

                  default=False,

                  help = "Produce no output")

parser.add_option("", "--size",

                  action = "store_true", dest = "checksize",

                  default=False,

                  help = "Perform size checking")

parser.add_option("", "--sum",

                  action = "store_true", dest = "checksum",

                  default=False,

                  help = "Perform ckecksum checking (slow)")

parser.add_option("-v", "--verbose",

                  action = "store_true", dest = "verbose",

                  default = False,

                  help = "Produce more output")

ops, args = parser.parse_args(argv[1:])

def get_columns():

    from commands import getoutput

    size = getoutput("stty size").split()

    columns = size[1]

    return int(columns)

red_bullet    = "\033[01;31m * \033[00m"

yellow_bullet = "\033[01;33m * \033[00m"

green_bullet  = "\033[01;32m * \033[00m"

good          = "\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;32m  ok  \033[01;34m]\033[00m\n"

error         = "\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;31m  !!  \033[01;34m]\033[00m\n"

warning       = "\033[" + str(get_columns()-7) + "G\033[01;34m[\033[01;33m  !!  \033[01;34m]\033[00m\n"

distfile_names = []

distfile_sizes = []

distfile_sums = []

distfile_sum_algs = []

distfile_delete_names = []

distfiles_delete_size = 0

if not ops.silent:

    stdout.write(green_bullet + "Reading distfiles digest")

in_file = open(ops.in_file_name, 'r')

for line in in_file.readlines():

    line = line.split()

    if len(line) == 0:

        break

    distfile_names.append(line[2])

    if ops.checksize:

        distfile_sizes.append(int(line[3]))

    if ops.checksum:

        distfile_sums.append(line[1])

        distfile_sum_algs.append(line[0])

in_file.close()

if not ops.silent:

    stdout.write(good)

    stdout.write(green_bullet + "Looking for extra files\n")

for distfile_name in listdir(ops.distfiles_dir):

    if distfile_name in (".locks", "cvs-src"):

        continue

    distfile_size = stat(ops.distfiles_dir + "/" + distfile_name).st_size

    distfile_unknown = True

    distfile_wrong_size = ops.checksize

    distfile_wrong_sum = ops.checksum

    if ops.verbose and not ops.silent:

        stdout.write(yellow_bullet + "File\033[01;01m " + distfile_name + "\033[00m ")

    for i in range(len(distfile_names)):

        if distfile_name == distfile_names[i]:

            distfile_unknown = False

            if distfile_wrong_size:

                distfile_size = stat(ops.distfiles_dir + "/" + distfile_name).st_size

                if distfile_size == distfile_sizes[i]:

                    distfile_wrong_size = False

                else:

                    continue

            if distfile_wrong_sum:

                if distfile_sum_algs[i] == "MD5":

                    import md5

                    distfile_sum = md5.new()

                    distfile = open(ops.distfiles_dir + "/" + distfile_name, 'r')

                    for line in distfile.readlines():

                        distfile_sum.update(line)

                    distfile.close()

                    if distfile_sum.hexdigest() == distfile_sums[i]:

                        distfile_wrong_sum = False

                    else:

                        continue

                else:

                    exit(1)

            break

        else:

            continue

    distfile_delete = distfile_unknown or distfile_wrong_size or distfile_wrong_sum

    if distfile_delete:

        distfile_delete_names.append(distfile_name)

        distfiles_delete_size += distfile_size

        if not ops.silent:

            if not ops.verbose:

                stdout.write(yellow_bullet + "File\033[01;01m " + distfile_name + "\033[00m ")

            if distfile_unknown:

                stdout.write("is \033[00;33munknown\033[00m ")

            if distfile_wrong_size:

                stdout.write("has \033[00;31mwrong size\033[00m ")

            if distfile_wrong_sum:

                stdout.write("has \033[00;31mwrong ckecksum\033[00m ")

            stdout.write(warning)

    else:

        if ops.verbose:

            stdout.write("\033[00;32mmatches\033[00m ")

            stdout.write(good)

if not ops.silent:

    if len(distfile_delete_names)  == 0:

        stdout.write(yellow_bullet + "No files to be deleted\n")

    else:

        stdout.write(yellow_bullet + "Total size of files to be deleted: \033[01;34m")

        stdout.write(str(distfiles_delete_size / 1024**2) + " Mb\033[00m in \033[01;34m")

        stdout.write(str(len(distfile_delete_names)) + "\033[00m files\n")

if ops.delete:

    if not ops.silent:

        stdout.write(green_bullet + "preparing to remove distfiles")

        stdout.write("\n")

        stdout.write("\033[01;31m*** WARNING ***\033[00m : ")

        stdout.write("IMPOTRANT FILES CAN BE REMOVED DURING DISTFILES CLEANUP\n")

        stdout.write("\033[01;31m*** WARNING ***\033[00m : ")

        stdout.write("DUE TO WRONG DIGESTS IN PORTAGE TREE\n")

        stdout.write("\n")

        stdout.write(">>> Waiting 10 seconds before starting...\n")

        stdout.write(">>> (Control-C) to abort...\n")

        stdout.write(">>> Removing distfiles in ")

        stdout.flush()

        for i in range(10, 0, -1):

            stdout.write("\033[01;31m" + str(i) + "\033[00m ")

            stdout.flush()

            sleep(1)

        stdout.write("\n\n")

    for distfile_delete_name in distfile_delete_names:

        try:

            if ops.verbose and not ops.silent:

                stdout.write(green_bullet + "Removing file\033[01;01m " + distfile_delete_name)

            remove(ops.distfiles_dir + "/" + distfile_delete_name)

            if ops.verbose and not ops.silent:

                stdout.write(good)

        except:

            if not ops.silent:

                if not ops.verbose:

                    stdout.write(green_bullet + "Removing file \033[01;01m " + distfile_delete_name)

                stdout.write(error)    

```

----------

## dish

Тестил на домашнем роутере. (2.6.11-gentoo-r3)

distfiles-gendigest.py ругается на 

```
* Generating distfiles digest (this may take few minutes)

 * File lmgrd.Z has conflicting digests                                 [  !!  ]

 * File lmutil.Z has conflicting digests                                [  !!  ]

 * File enduser.pdf has conflicting digests                             [  !!  ]

 * File sunbird-i686-linux-gtk2+xft.tar.gz has conflicting digests      [  !!  ]

 * File docbkx412.zip has conflicting digests                           [  !!  ]

 * File mssqlserver.tar has conflicting digests                         [  !!  ]

 * File p4d has conflicting digests                                     [  !!  ]

 * File p4web has conflicting digests                                   [  !!  ]

 * File p4ftpd has conflicting digests                                  [  !!  ]

 * File p4d.1 has conflicting digests                                   [  !!  ]

 * File p4d has conflicting digests                                     [  !!  ]

 * File p4web has conflicting digests                                   [  !!  ]

 * File p4ftpd has conflicting digests                                  [  !!  ]

 * File p4d.1 has conflicting digests                                   [  !!  ]

 * File p4 has conflicting digests                                      [  !!  ]

 * File p4 has conflicting digests                                      [  !!  ]

 * File p4 has conflicting digests                                      [  !!  ]

 * File p4p has conflicting digests                                     [  !!  ]

 * File p4p has conflicting digests                                     [  !!  ]

 * File p4p has conflicting digests                                     [  !!  ]

 * File p4d has conflicting digests                                     [  !!  ]

 * File p4web has conflicting digests                                   [  !!  ]

 * File p4ftpd has conflicting digests                                  [  !!  ]

 * File p4d.1 has conflicting digests                                   [  !!  ]

 * File qmail-maildir++.patch has conflicting digests                   [  !!  ]

 * File nxserver-1.3.0-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.0-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.0-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File nxserver-1.3.2-25.i386.rpm has conflicting digests              [  !!  ]

 * File GMT_share.tar.bz2 has conflicting digests                       [  !!  ]

 * File GMT_full.tar.bz2 has conflicting digests                        [  !!  ]

 * File GMT_high.tar.bz2 has conflicting digests                        [  !!  ]

 * File triangle.tar.bz2 has conflicting digests                        [  !!  ]

 * File PurpleGalaxy.tar.gz has conflicting digests                     [  !!  ]

 * File visor.tar.gz has conflicting digests                            [  !!  ]

 * File PurpleGalaxy.tar.gz has conflicting digests                     [  !!  ]

 * File visor.tar.gz has conflicting digests                            [  !!  ]

 * File PurpleGalaxy.tar.gz has conflicting digests                     [  !!  ]

 * File visor.tar.gz has conflicting digests                            [  !!  ]

 * File PurpleGalaxy.tar.gz has conflicting digests                     [  !!  ]

 * File visor.tar.gz has conflicting digests    
```

Практически все из этого нормально стоит и работает.

Части этого хозяйства конечно нет портежах (pdf-файл и mssqlserver, например), но у меня для них есть ebuild (лежит в PORTDIR_OVERLAY). И чем провинилась тема PurpleGalaxy?

Роутер также выполняет функцию gentoo-mirror, поэтому запускать второй файл я боюсь... Неохота заново дисты выкачивать, т.к. скорость не более 200 кбит/сек... Насколько я понял, второй файл сотрет все эти конфликтные дисты?

----------

## dish

Пожелания:

добавь в первый скрипт "mkdir /var/db/distfiles"

Ну и можно проверку на то, есть он (каталог) или нет.

При первом запуске удобнее сразу скриптом создавать.

----------

## bobr[x3]

С пожеланиями согласен, реализую.

Ругается (а точнее warning'и делает) он на то, что один и тот же дистфайл (имя файла) указан в двух и более дайджестах но с разной контрольной суммой и/или размером файла. Это происходит, если версия файла не отражена в имени (как в p4d) или отражена неправильно. На самом деле он сохраняет все дайджесты, так что файл, контрольная сумма или размер которого софпадут хотя бы с одним дайджестом удален не будет.

Вопрос на засыпку: Где бы разместить эту чудные утилиты? А то ведь распространять программы copy-past'ом большой глюк. Своего сайта у меня щас нету, а с sourceforg'ем связываться ломает.

----------

## dish

Насчет разместить... Попробую договориться с gentoo.ru.

Если напишешь ebuild для тулзы -- вообще молоток.

А из личных пожеланий -- классная идея! Продолжай в том же духе!

----------

## dish

Судя по твоему ответу, можно считать, что у меня на роутере тулза работает правильно.

Попробую завтра на нескольких рабочих станциях запустить.

----------

## bobr[x3]

Вообще-то эти тулзы только первыя часть работы над пакетом distfiles-utils. Пакет этот будет предназначен для распространения сборников distfil'ов (а может и скомпиленых пакетов) на сменных носителях (CD, DVD, HDD). Будут в нем утилиты не только для чистки дистфайлов, но и для составления этих самых сборников, а также для получения дистфайлов с этих носителей (типа "вставте Gentoo Distfiles 2005.0.1 диск 1") во время emerge'а. Это здорово должно помочь тем, у кого нет жирного канала, но есть друзья друзей с таким жирным каналом.

----------

## ManJak

 *bobr[x3] wrote:*   

> Вообще-то эти тулзы только первыя часть работы над пакетом distfiles-utils. Пакет этот будет предназначен для распространения сборников distfil'ов (а может и скомпиленых пакетов) на сменных носителях (CD, DVD, HDD). Будут в нем утилиты не только для чистки дистфайлов, но и для составления этих самых сборников, а также для получения дистфайлов с этих носителей (типа "вставте Gentoo Distfiles 2005.0.1 диск 1") во время emerge'а. Это здорово должно помочь тем, у кого нет жирного канала, но есть друзья друзей с таким жирным каналом.

 

Респект, только трабла одна есть, репозиторий-то меняется каждый божий день, а то и несколько раз неа дню  :Sad: 

Это-ж надо следить неустанно и исошки делать, а там вроде просьба была, что не чаще раза в день  :Confused: 

Плюс, есть случаи глюков при обновлении, когда приходится ждать их исправлений и синкаться вновь.

Похоже, что проект не легкий, но Удачи, ибо будет ОЧЕНЬ полезен многим.

----------

## kon

2 bobr[x3]

Кинь мне на почту assi at assi dot ru и я выложу с адресом типа www.assi.ru/bobr

----------

## bobr[x3]

2 kon: Ага, вечерком закину.

2 ManJak: Не каждый день, а каждый месяц-два.

----------

## bobr[x3]

Товарищи господа, если вы считаете проект distfiles-utils действительно полезным для многих, то я заведу его на sourceforg'e и прошу всех заинтересованных лиц принять в нем посильное участие.

----------

## mobILL

 *bobr[x3] wrote:*   

> Товарищи господа, если вы считаете проект distfiles-utils действительно полезным для многих, то я заведу его на sourceforg'e и прошу всех заинтересованных лиц принять в нем посильное участие.

 

Полезен однозначно, особенно для тех у кого нету инета и он берёт дистр у друзей. У меня уж накопилось около 30 гигов и больше половины нафиг не нужно.

----------

## dish

Однозначно полезен!

Как заведешь -- кидай ссылку  :Smile: 

----------

## dish

Дальнейшее тестирование:

Запустил все на том же сервере distfiles-clean.py

```
 * Reading distfiles digest                                             [  ok  ]

 * Looking for extra files

 * File capi4linux-2004.4.5-0.i586.rpm is unknown                       [  !!  ]

 * File genpatches-2.6-11.03-base.tar.bz2 is unknown                    [  !!  ]

 * File genpatches-2.6-11.03-extras.tar.bz2 is unknown                  [  !!  ]

 * File linux-2.6.11.2.tar.bz2 is unknown                               [  !!  ]

 * File usb.ids-20030906.gz is unknown                                  [  !!  ]

 * File gnuconfig-20050223.tar.bz2 is unknown                           [  !!  ]

 * File genpatches-2.6-11.09-extras.tar.bz2 is unknown                  [  !!  ]

 * File genpatches-2.6-11.09-base.tar.bz2 is unknown                    [  !!  ]

 * File DB_File-1.807.tar.gz is unknown                                 [  !!  ]

 * File MPlayer-1.0pre5try2.tar.bz2 is unknown                          [  !!  ]

 * File X11R6.8.0-src1.tar.gz is unknown                                [  !!  ]

 * File X11R6.8.0-src2.tar.gz is unknown                                [  !!  ]

 * File X11R6.8.0-src3.tar.gz is unknown                                [  !!  ]

 * File X11R6.8.0-src4.tar.gz is unknown                                [  !!  ]

 * File X11R6.8.0-src5.tar.gz is unknown                                [  !!  ]

 * File acpi4asus-0.27.tar.bz2 is unknown                               [  !!  ]

 * File all-20050115.tar.bz2 is unknown                                 [  !!  ]

 * File alsa-driver-1.0.6a.tar.bz2 is unknown                           [  !!  ]

 * File alsa-driver-1.0.8rc1.tar.bz2 is unknown                         [  !!  ]

 * File alsa-lib-1.0.6.tar.bz2 is unknown                               [  !!  ]

 * File arson-0.9.8beta2.tar.bz2 is unknown                             [  !!  ]

 * File arts-1.3.1.tar.bz2 is unknown                                   [  !!  ]

 * File bin86-0.16.13.tar.gz is unknown                                 [  !!  ]

 * File binutils-2.15-uclibc-patches-1.0.tar.bz2 is unknown             [  !!  ]

 * File binutils-2.15.90.0.1-patches-1.3.tar.bz2 is unknown             [  !!  ]

 * File binutils-2.15.92.0.2-patches-1.2.tar.bz2 is unknown             [  !!  ]

 * File clamav-0.82.tar.gz is unknown                                   [  !!  ]

 * File coreutils-5.2.1-patches-0.9.tar.bz2 is unknown                  [  !!  ]

 * File enigmail-0.89.6.tar.gz is unknown                               [  !!  ]

 * File ffmpeg-0.4.7.tar.gz is unknown                                  [  !!  ]

 * File file-4.10.tar.gz is unknown                                     [  !!  ]

 * File gail-1.8.0.tar.bz2 is unknown                                   [  !!  ]

 * File gdb-6.0.tar.bz2 is unknown                                      [  !!  ]

 * File genpatches-2.6-11.04-base.tar.bz2 is unknown                    [  !!  ]

 * File genpatches-2.6-11.04-extras.tar.bz2 is unknown                  [  !!  ]

 * File genpatches-2.6-11.05-base.tar.bz2 is unknown                    [  !!  ]

 * File genpatches-2.6-11.05-extras.tar.bz2 is unknown                  [  !!  ]

 * File genpatches-2.6-7.46-base.tar.bz2 is unknown                     [  !!  ]

 * File glext.h-20040830.bz2 is unknown                                 [  !!  ]

 * File glib-2.4.7.tar.bz2 is unknown                                   [  !!  ]

 * File gnome-panel-2.8.0.1.tar.bz2 is unknown                          [  !!  ]

 * File gtkhtml-3.2.3.tar.bz2 is unknown                                [  !!  ]

 * File gzip_1.3.5.orig.tar.gz is unknown                               [  !!  ]

 * File hardened-patches-2.6-10.3.tar.bz2 is unknown                    [  !!  ]

 * File ipw2200-0.18.tgz is unknown                                     [  !!  ]

 * File ipw2200-1.0.1.tgz is unknown                                    [  !!  ]

 * File ipw2200-1.0.2.tgz is unknown                                    [  !!  ]

 * File ipw2200-fw-2.1.tgz is unknown                                   [  !!  ]

 * File k3b-0.11.18.tar.bz2 is unknown                                  [  !!  ]

 * File klamav-0.09.4.tar.bz2 is unknown                                [  !!  ]

 * File libgnomecups-0.1.8.tar.bz2 is unknown                           [  !!  ]

 * File libpng-1.2.7.tar.bz2 is unknown                                 [  !!  ]

 * File libtool-1.5.10.tar.gz is unknown                                [  !!  ]

 * File libtool-1.5.2.tar.gz is unknown                                 [  !!  ]

 * File libwnck-2.8.0.1.tar.bz2 is unknown                              [  !!  ]

 * File libxml2-2.6.15.tar.bz2 is unknown                               [  !!  ]

 * File man-pages-1.70.tar.bz2 is unknown                               [  !!  ]

 * File mozilla-launcher-1.22.bz2 is unknown                            [  !!  ]

 * File mozilla-launcher-1.23.bz2 is unknown                            [  !!  ]

 * File mozilla-source-1.7.6.tar.bz2 is unknown                         [  !!  ]

 * File mplayer-1.0_pre5-alsa-gui.patch.tar.bz2 is unknown              [  !!  ]

 * File nasm-0.98.38.tar.bz2 is unknown                                 [  !!  ]

 * File portage-2.0.51-r15.tar.bz2 is unknown                           [  !!  ]

 * File portage-2.0.51-r3.tar.bz2 is unknown                            [  !!  ]

 * File putty-0.56.tar.gz is unknown                                    [  !!  ]

 * File slocate-2.7-uclibc-sl_fts.patch is unknown                      [  !!  ]

 * File squid-2.5.STABLE9-patches-20050326.tar.gz is unknown            [  !!  ]

 * File taglib-1.2.tar.gz is unknown                                    [  !!  ]

 * File tiff-3.7.0.tar.gz is unknown                                    [  !!  ]

 * File urw-fonts-1.0.7pre40-src.tar.bz2 is unknown                     [  !!  ]

 * File vmware-any-any-update89.tar.gz is unknown                       [  !!  ]

 * File wine-20040716-fake_windows.tar.bz2 is unknown                   [  !!  ]

 * File wine-20040716-misc.tar.bz2 is unknown                           [  !!  ]

 * File xmms-1.2.10-gentoo-patches-1.0.tar.bz2 is unknown               [  !!  ]

 * File xmms-mad-0.7.tar.gz is unknown                                  [  !!  ]

 * File xorg-x11-6.8.0-files-0.4.tar.bz2 is unknown                     [  !!  ]

 * File xorg-x11-6.8.0-files-0.7.tar.bz2 is unknown                     [  !!  ]

 * File xorg-x11-6.8.0-patches-0.2.11.3.tar.bz2 is unknown              [  !!  ]

 * File xorg-x11-6.8.0-patches-0.2.2.1.tar.bz2 is unknown               [  !!  ]

 * File xterm-196.tgz is unknown                                        [  !!  ]

 * File xterm-201.tgz is unknown                                        [  !!  ]

 * File XWine-0.3.2_en.tar.gz is unknown                                [  !!  ]

 * File avidemux-2.0.38_rc2-r1-patches.tar.bz2 is unknown               [  !!  ]

 * File avidemux-2.0.38rc2b.tar.gz is unknown                           [  !!  ]

 * File matplotlib-0.64.tar.gz is unknown                               [  !!  ]

 * File patch-2.6.12-rc1.bz2 is unknown                                 [  !!  ]

 * File patch-2.6.12-rc2-nitro1.bz2 is unknown                          [  !!  ]

 * File software-suspend-2.1.8.7-for-2.6.12-rc1.tar.bz2 is unknown      [  !!  ]

 * File fbsplash-0.9.2-2.6.12-rc1.patch is unknown                      [  !!  ]

 * File civ2rus.zip is unknown 

 * Total size of files to be deleted: 233 Mb in 90 files

```

Из "левых" файлов закинул в дисты civ2rus.zip. Предварительно запускал distfiles-gendigest.py. 

Судя по размеру, скрипт удалит только "левый" файл, т.е. все пройдет, как задумано. Вопрос: почему ругается на остальные?

----------

## dish

Запустил тулзы на своем буке. distfiles-gendigest.py ругалась очень много, т.к. на харде гига 3-4 дистов.

distfiles-clean.py выдал:

```
 * Reading distfiles digest                                             [  ok  ]

 * Looking for extra files

 * File matplotlib-0.64.tar.gz is unknown                               [  !!  ]

 * Total size of files to be deleted: 1 Mb in 1 files

```

distfiles-gendigest.py | grep matplotlib не выдает ничего.

----------

