Commit Graph

150 Commits

Author SHA1 Message Date
pmatilai
3cbcc90c9d - clean up install/remove processing in rpmpm::Go()
- unmunge the multilib package names when removing
- always refer to packages with their architecture when removing, needed
  for multilib
(cherry picked from commit 0463f8ddbabf216dab9cb83fcb8f4a525d9298e5)
2009-03-26 13:38:04 +03:00
Alexey Tourbin
a583517439 0.5.15lorg2-alt24
- depcache.cc (MarkInstall): mark unambiguous dependencies first
2009-03-24 10:21:39 +03:00
Alexey Tourbin
b85388dd91 depcache.cc (MarkInstall): mark unambiguous dependencies first
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
2009-03-23 16:09:25 +03:00
Alexey Tourbin
3417b3b657 pkgcache.cc (AllTargets): return unique list
Each rpm package also provides its name.  So, since it makes sense
to check if AllTargets has only one target version (which means
unambiguous dependency), the list sould be made unique.
2009-03-23 09:33:44 +03:00
Alexey Tourbin
b609c9f7e6 apt-%version-%release.patch 2009-03-23 08:52:06 +03:00
Stanislav Ievlev
a04c3dc823 0.5.15lorg2-alt23
- open rpm database with O_CREAT flag
2009-01-19 17:38:14 +03:00
Stanislav Ievlev
96870b68f4 - add patch: open rpm database with O_CREAT flag (we need it to use apt in system installer) 2009-01-19 17:33:03 +03:00
Slava Semushin
e7409ecffb 0.5.15lorg2-alt22.2
- apt-shell: print newline symbol during quit by Ctrl+D
  (Based on feedback for bug #18343 from Ivan A. Melnikov aka iv@)
2009-01-10 00:00:08 +06:00
Slava Semushin
403aa68686 quit_by_eof.patch: print newline before exit.
Be more accurate during exit by Ctrl+D.
Thanks to Ivan A. Melnikov <iv@altlinux> for feedback.
2009-01-09 23:52:48 +06:00
Slava Semushin
644f9d78d8 0.5.15lorg2-alt22.1
- apt-shell: show up "list" command by completion (#5953)
- apt-shell: quit from shell by Ctrl+D (#6264, #18343)
- apt-shell: describe -G and -g options in "help list" output (#18256)
2009-01-02 00:50:47 +06:00
Slava Semushin
13e93a217a apt-shell: describe -G and -g options in "help list" output (#18256)
FIXME: apt.be.po should be updated similar to apt.ru.po file.
2009-01-02 00:50:37 +06:00
52275b373d Rename apt-shell patches according to the policy 2008-12-30 20:45:12 +00:00
Slava Semushin
7956d444db apt-shell: quit from shell by Ctrl+D (#18343) 2008-12-31 02:11:46 +06:00
Slava Semushin
1c7245aad0 apt-shell: show up "list" command by completion (#5953)
And also added it to help output.
2008-12-31 02:02:29 +06:00
ecfa3c0fb8 0.5.15lorg2-alt22
- Fixed build with g++-4.3.x (Stanislav Ievlev).
2008-12-12 15:31:20 +00:00
bbdf66fff5 Additional fix required to build apt with g++-4.3.x on i586 2008-12-12 15:31:02 +00:00
Stanislav Ievlev
d20fc76a4d - fix build with gcc-4.3 2008-12-12 16:43:56 +03:00
dcb817f3ff Merge branch 'master' of git.alt:/people/avm/packages/apt 2008-11-27 22:42:25 +00:00
Alex V. Myltsev
d6ac8fcdfa 0.5.15lorg2-alt21
- fix by led@: change type of Package.ID to int (fixes #16900)
- fixes by raorn@:
 - apt-get.cc: protect VerTag (fixes #16311)
 - apt-get.cc: fix memory corruption (fixes #14929)
 - fileutl.cc: change semantics of flExtension() (fixes #15909)
2008-09-01 22:41:45 +04:00
Alexey I. Froloff
65a82cc0f2 Fix a memory corruption (altbug #14929). 2008-08-29 22:14:08 +04:00
Alex V. Myltsev
f2922999ae Change flExtension() to return the empty string if there is no extension.
This should fix #15909, thanks to raorn for investigating.
2008-08-29 22:14:00 +04:00
Alex V. Myltsev
c2a7ba45e0 Protect VerTag by pointing it to OrigS, not to S (closes #16311). 2008-08-29 22:13:52 +04:00
Alex V. Myltsev
418a824fd6 Change type of pkgCache::Package.ID to 'unsigned int'.
'unsigned short' breaks when there are more than 65535 packages.
2008-08-29 22:13:44 +04:00
06b3e692bd apt.spec: s/repositaries/repositories/ (ALT#14775) 2008-05-11 22:49:08 +00:00
Alexey Tourbin
92b2ba1c36 0.5.15lorg2-alt20
- genpkglist.cc: RPMTAG_FILEFLAGS should not be copied into header list
- lorg-cache-limit.patch: increase cache size limit
- removed old triggers, updated dependencies
2008-05-11 19:12:59 +04:00
Alexey Tourbin
b3abb08b99 spec (apt-utils): removed comment 2008-05-11 19:11:26 +04:00
Alexey Tourbin
1351d4a75c spec: removed URL part in Source0 2008-05-11 19:10:49 +04:00
Alexey Tourbin
ecbb921870 spec: removed *apt-0.5* obsoletes 2008-05-11 19:09:13 +04:00
Alexey Tourbin
f8e8cd00c6 spec: dropped very old triggers (Master 2.4 has apt-0.5.15cnc6-alt6) 2008-05-11 19:07:20 +04:00
Alexey Tourbin
d5ff215628 lorg-cache-limit.patch: increase cache size limit 2008-05-11 18:58:35 +04:00
Alexey Tourbin
ab496886f6 genpkglist.cc: RPMTAG_FILEFLAGS should not be copied into header list
(Or, at least, RPMTAG_FILEFLAGS should be copiled consistently with
RPMTAG_BASENAMES, RPMTAG_DIRNAMES, and RPMTAG_DIRINDEXES.)
2008-05-11 17:40:09 +04:00
Alexey Tourbin
6ba7ec5518 0.5.15lorg2-alt19
- lorg-pkgcachegen-selfprov.patch: allow self-referencing provides,
  so that e.g. ocaml-runtime#3.10.2-alt2 can provide ocaml-runtime = 3.10
2008-03-30 06:08:07 +04:00
Alexey Tourbin
c8750effef spec: buildreq (bzlib-devel and zlib-devel were missing) 2008-03-30 05:01:46 +04:00
Alexey Tourbin
818a9d5ff8 lorg-pkgcachegen-selfprov.patch: allow self-referencing provides
E.g. ocaml-runtime#3.10.2-alt1 can provide ocaml-runtime = 3.10.
2008-03-30 01:30:43 +03:00
Alex V. Myltsev
b8a9615897 0.5.15lorg2-alt18
- algorithms.cc: better package name comparison
  (now automake_1.10 > automake_1.9)
2007-12-17 17:58:41 +03:00
Alex V. Myltsev
94df084ec5 Better pkgname comparison: now automake_1.10 > automake_1.9.
Before this patch, strcmp(3) would be used to select
the best package. This was sometimes counter-intuitive
(for example, APT would choose autoconf_2.5 over
autoconf_2.13).

[NB: fixing this can break some packages that rely
on the historic sort order; e.g. postgresql74
may be preferred to postgresql8.2.]

We considered using rpmvercmp() for package name
comparison, but chose to write a specially-crafted
function that's mostly compatible with strcmp(3),
except for numeric fragments in the names.

As a matter of fact, strtoull usage is suboptimal here.
It may overflow the returned long long, leading to an
incorrect comparison. Fixing the code to avoid strtoull
is, however, left as an exercise to the diligent
maintenance programmer (and you are insane anyway
if you need package names that trigger the overflow).
2007-12-17 17:58:41 +03:00
Alex V. Myltsev
745b1d9053 Completely silent genbasedir by default
(I failed to convert one 'echo' to 'Verbose' last time).
2007-12-17 17:58:40 +03:00
Alexey Tourbin
71740d9f91 0.5.15lorg2-alt17
- genpkglist.cc: rewrite copyStrippedFileList() to avoid inplace
  dirnames edit bug
2007-12-03 10:49:31 +03:00
Alexey Tourbin
e00c2bc5a3 genpkglist.cc: rewrite copyStrippedFileList() to avoid inplace dirnames edit bug
There was an assumption that DIRINDEXES are always sorted ascending,
which actually does not hold.  This means we CANNOT use inplace
replacement in "dirnames" array, so as to append "later dirs" on top
of "older dirs".

The bug can actually be more subtle.  It is very well possible that
I simply cannot understand that previous "inplace optimization" logic.
But I think that it sucks anyway.  I choose to rewrite this piece of code
for the sake of clarity and correctness.  I hope that the correctness of
the code now should be a bit more obvious, even for a casual reader.
2007-11-30 19:19:42 +03:00
Alexey Tourbin
42f65df4d9 0.5.15lorg2-alt16
- genpkglist: removed very bad piece of code which could break
  my fine-grained file list stripping algorithm
- genbasedir: made silent by default, added --verbose and --silent
  options (Alex V. Myltsev)
2007-11-23 14:43:15 +03:00
Alexey Tourbin
27122041c0 genpkglist.cc: removed very bad piece of code which could break my fine-grained file list stripping algorithm 2007-11-23 13:52:00 +03:00
846591e31e genbasedir: Strip "function" keyword 2007-11-12 15:39:24 +00:00
Alex V. Myltsev
f6a47d1cb1 Add the --silent option. 2007-11-09 19:05:29 +03:00
Alex V. Myltsev
959a7fbbaa Make genbasedir silent by default. Add the --verbose option. 2007-11-09 19:05:22 +03:00
bed9545e2a 0.5.15lorg2-alt15
- apt-get: Fixed manifest file support (Stanislav Ievlev).
2007-10-30 12:02:46 +00:00
Stanislav Ievlev
d848f3e8ff - fix manifest patch (initialize memory with zero values) 2007-10-30 14:54:58 +03:00
Alexey Tourbin
67ca1fb77f 0.5.15lorg2-alt14
- genpkglist: don't strip paths that are owned by 2 or more packages,
  to deal with cross-arch semi-unmets like /usr/share/wallpapers
- apt-get: added support of manifest file (Stanislav Ievlev)
2007-10-24 18:36:51 +04:00
Stanislav Ievlev
c8560f7ff1 - add support of manifest file 2007-10-22 16:29:28 +04:00
Alexey Tourbin
bb7eaffe62 genpkglist: don't strip paths that are owned by 2 or more packages
Another attempt to deal with semi-unmet dependencies.  This should fix
most of the cross-arch semi-unmets generated via conetnts_index_all.

Consider a few noarch packages which own /usr/share/foo.  Now if i586
package somehow refers /usr/share/foo, contents_index_all search will
produce as-is reference, which is going to be cross-arch semi-unmet.

Note that if /usr/share/foo is owned by only one package,
contents_index_all search will produce explicit package name.

This is why genpkglist should not strip paths that are owned
by 2 or more packages.
2007-10-08 22:57:09 +04:00
Alexey Tourbin
341bcecf1e 0.5.15lorg2-alt13
- Updated file list stripping algorithm in genpkglist (apt-utils);
  now it keeps files which can resolve file-level dependencies.
2007-08-11 23:36:16 +04:00