b85388dd91
Consider a package called "test": Name: test Version: 1 Release: alt1 Summary: test License: GPL Group: Development/Other Requires: /usr/bin/latex Requires: tetex-latex %description %files The problem with this "test" package is that it cannot be installed. Since recently, Sisyphus has two packages which provide /usr/bin/latex: tetex-latex and texlive-latex-base. These two packages conflict with each other. When /usr/bin/latex dependency is processed, apt chooses to install texlive-latex-base. And after a short while, apt also has to choose tetex-latex. Since there are also other packages involved (e.g. tetex-core and texlive-base), ProblemResolver fails to fix the conflict. The following packages have unmet dependencies: test: Depends: tetex-latex E: Broken packages To avoid the problem (to to a large extent), apt should process non-ambiguous dependencies first. That would be tetex-latex. After tetex-latex is selected for install, ambigous dependency on /usr/bin/latex will be automatically satisfied. This change implements recursive wavefront algorithm that helps to disambiguate dependencies gradually. The recursive function MarkInstallRec() has "Restricted" flag, by which it avoids to mark ambiguous dependencies, and instead returns "MarkAgain" set of packages. Moreover, Restricted flag is automatically re-enabled on recursive invocations (in other words, ambiguous dependencies can be resolved only on the current wavefront). MarkAgain packages must be marked again. There are two possibilities. Either marking again does nothing, because previously marked unambiguous dependencies now satisfy ambiguous dependencies (that's where I'm trying to get to). And otherwise, the package has to be marekd without Restricted flag, to force ambiguous selection (which cannot be completely avoided). Here is the piece of code that does full recursive mark. std::set<PkgIterator> MA; std::set<PkgIterator>::iterator I; MarkInstallRec(Pkg, true, MA, 0, DebugA); while (1) { std::set<PkgIterator> MAA; for (I = MA.begin(); I != MA.end(); ++I) MarkInstallRec(*I, true, MAA, 0, DebugB); for (I = MA.begin(); I != MA.end(); ++I) MarkInstallRec(*I, false, MAA, 0, DebugC); if (MA == MAA) break; MA = MAA; } First, I mark the package with Restricted=true, and see if something needs to be marked again because of ambiguous dependencies. The loop then says: before we can go with Restricted=false and grab some ambiguous dependencies, we need to mark all non-ambigous dependencies first. The loop ends when no new packages can be marked (which is usually when MA gets empty). With '-o Debug::pkgMarkInstall=1' option, it is now possible to show how apt deals with the "test" package. MI2a: mark test MI2a: target /usr/bin/latex AMB MI2a: target tetex-latex MI2a: mark tetex-latex MI2a: target tetex-core MI2a: mark tetex-core MI2a: target dialog MI2a: mark dialog MI2a: target /etc/cron.daily MI2a: mark crontabs MI2a: target vixie-cron MI2a: mark vixie-cron MI2a: target crontab-control MI2a: mark crontab-control MI2a: target libsetproctitle.so.0()(64bit) MI2a: mark setproctitle MI2a: target /etc/tex-fonts.d MI2a: mark tex-common MI2a: target /usr/sbin/stmpclean MI2a: mark stmpclean MI2a: target ed MI2a: mark ed MI2a: target libpng12.so.0(PNG_12)(64bit) MI2a: mark libpng12 MI2a: target libstdc++.so.6(CXXABI_1.3)(64bit) AMB MI2a: target libstdc++.so.6(GLIBCXX_3.4)(64bit) AMB MI2a: target texinfo MI2a: mark texinfo MI2b: mark tetex-core MI2b: target libstdc++.so.6(CXXABI_1.3)(64bit) AMB MI2b: target libstdc++.so.6(GLIBCXX_3.4)(64bit) AMB MI2c: mark tetex-core MI2c: target libstdc++.so.6(CXXABI_1.3)(64bit) MI2c: mark libstdc++4.3 |
||
---|---|---|
.gear/tags | ||
apt | ||
.gear-rules | ||
apt-0.5.4cnc9-alt-getsrc-debug.patch | ||
apt-0.5.4cnc9-alt-pkgorderlist-score.patch | ||
apt-0.5.5cnc4.1-alt-PrioComp.patch | ||
apt-0.5.5cnc5-alt-rsync.patch | ||
apt-0.5.15cnc5-alt-debsystem.patch | ||
apt-0.5.15cnc5-alt-distro.patch | ||
apt-0.5.15cnc5-alt-execrpm-cmd.patch | ||
apt-0.5.15cnc5-alt-getsrc.patch | ||
apt-0.5.15cnc5-alt-gettext.patch | ||
apt-0.5.15cnc5-alt-gpg-homedir.patch | ||
apt-0.5.15cnc5-alt-libtool.patch | ||
apt-0.5.15cnc5-alt-md5hash-debug.patch | ||
apt-0.5.15cnc5-alt-packagemanager-CheckRConflicts.patch | ||
apt-0.5.15cnc5-alt-rpm-build.patch | ||
apt-0.5.15cnc6-alt-apt-get-TryToInstall.patch | ||
apt-0.5.15cnc6-alt-apt-pipe.patch | ||
apt-0.5.15cnc6-alt-apt-shell-dl.patch | ||
apt-0.5.15cnc6-alt-apt-shell.patch | ||
apt-0.5.15cnc6-alt-dash-cmd.patch | ||
apt-0.5.15cnc6-alt-defaults.patch | ||
apt-0.5.15cnc6-alt-lsgroup.patch | ||
apt-0.5.15cnc6-alt-parseargs.patch | ||
apt-0.5.15cnc6-alt-pkgcachegen.patch | ||
apt-0.5.15cnc6-alt-PrintLocalFile.patch | ||
apt-0.5.15cnc6-alt-quiet-update.patch | ||
apt-0.5.15cnc6-alt-rpm-fancypercent.patch | ||
apt-0.5.15cnc6-alt-rpm-order.patch | ||
apt-0.5.15cnc6-alt-umount.patch | ||
apt-0.5.15cnc6-alt-vendor.patch | ||
apt-0.5.15cnc6-alt-virtual-scores.patch | ||
apt-0.5.15cnc6-apt-utils-locale.patch | ||
apt-0.5.15lorg2-alt-apt-get-simple-output.patch | ||
apt-0.5.15lorg2-alt-apt-get-TryToInstall-PrvPkgCandVer.patch | ||
apt-0.5.15lorg2-alt-apt-shell-list_completion.patch | ||
apt-0.5.15lorg2-alt-apt-shell-quit_by_eof.patch | ||
apt-0.5.15lorg2-alt-apt-shell-resetconfig.patch | ||
apt-0.5.15lorg2-alt-buildlib.patch | ||
apt-0.5.15lorg2-alt-exit-status.patch | ||
apt-0.5.15lorg2-alt-fixes.patch | ||
apt-0.5.15lorg2-alt-gcc4.3.patch | ||
apt-0.5.15lorg2-alt-genpkglist-no-fileflags.patch | ||
apt-0.5.15lorg2-alt-genpkglist-reqfiles.patch | ||
apt-0.5.15lorg2-alt-i18n-apt-shell-typo.patch | ||
apt-0.5.15lorg2-alt-lua51.patch | ||
apt-0.5.15lorg2-alt-manifest.patch | ||
apt-0.5.15lorg2-alt-pkgCache-PrvIterator.patch | ||
apt-0.5.15lorg2-alt-pkgInitConfig-cpu.patch | ||
apt-0.5.15lorg2-alt-readline.patch | ||
apt-0.5.15lorg2-alt-realloc.patch | ||
apt-0.5.15lorg2-alt-rpmdbopen.patch | ||
apt-0.5.15lorg2-alt-rpmSystem-DistroVer.patch | ||
apt-0.5.15lorg2-alt-src-apt-shell-wrong_message_fix.patch | ||
apt-0.5.15lorg2-alt-versionmatch-TryToChangeVer.patch | ||
apt-0.5.15lorg2-lorg-cache-limit.patch | ||
apt-0.5.15lorg2-lorg-pkgcachegen-selfprov.patch | ||
apt.be.po | ||
apt.conf | ||
apt.ru.po | ||
apt.spec | ||
ChangeLog-rpm.old | ||
genbasedir | ||
README.rsync |
Пакет apt-rsync предоставляет метод 'rsync' для APT. Это значит, что apt-get сможет выкачивать пакеты по протоколу rsync. Поддерживается работа через HTTP-proxy. Для работы метода 'rsync' необходимо, чтобы был установлен пакет rsync, скомпилированный с патчем для поддержки опции "--apt-support". В ALT Linux Sisyphus поддерживается начиная с rsync-2.5.5-alt3. Чтобы использовать метод 'rsync', необходимо добавить в /etc/apt/sources.list строчки вида: rpm [alt] rsync://rsync.altlinux.ru/ALTLinux/Sisyphus i586 classic rpm-src [alt] rsync://rsync.altlinux.ru/ALTLinux/Sisyphus i586 classic Для конфигурирования можно использовать следующие параметры (в /etc/apt/apt.conf или из командной строки): Debug::rsync = "true|false" Разрешает вывод отладочной информации. По умолчанию: false Acquire::rsync::program Указывает путь к программе rsync. По умолчанию: /usr/bin/rsync Acquire::rsync::Timeout Передаёт параметр "--timeout" с указанным значением программе rsync. По умолчанию: не передаёт этот параметр для rsync. Acquire::rsync::proxy Acquire::rsync::proxy::hostname Указывает, что необходимо использовать HTTP-proxy. Для этого будет установлена переменная окружения RSYNC_PROXY при вызове программы rsync. При использовании репозитариев на разных хостах возможно задание proxy для всех хостов и для каждого в отдельности. Значение для конкретного хоста перекрывает глобальное значение. Можно использовать специальное значение "none" для указания, что необходимо использовать прямое соединение. Формат: hostname:port или "none" Пример: Acquire::rsync::proxy="192.168.1.1:3128" Acquire::rsync::proxy::mirror.localdomain="none" Будет использоваться http-proxy "192.168.1.1:3128" для всех хостов, кроме mirror.localdomain, для которого будет использоваться прямое соединение. Acquire::rsync::options:: Позволяет задавать любые дополнительные опции при вызове программы rsync. Примеры: Acquire::rsync::options:: "-z"; Acquire::rsync::options { "-z"; "--some-other-option"; }; Первый вариант можно использовать, если все необходимые опции можно указать одной строкой. При наличии нескольких раздельных опций необходимо использовать второй вариант.