DEPSOLVE.txt
author Dan Winship <danw@gnome.org>
Tue Mar 11 11:43:54 2008 -0400 (2008-03-11)
changeset 160 00f19df51272
parent 157 57e8182f59bc
child 161 7762db2848bf
permissions -rw-r--r--
update to match DEPSOLVE.txt

unfortunately not quite right; it can't figure out that "git-core" updates
to "git"
danw@157
     1
We start with two razor_sets, system and upstream, and a list of
danw@157
     2
requested installations and removals.
danw@157
     3
danw@157
     4
    FIXME: what about multiple upstream repos? Having to deal with
danw@157
     5
    arbitrary numbers of razor_sets is possible, but will probably be
danw@157
     6
    messy... It might be easier to either store all upstream repo data
danw@157
     7
    in a single .repo file, or else merge all upstream .repo files
danw@157
     8
    together into a single razor_set at startup. (Or some combination
danw@157
     9
    of those.)
danw@157
    10
danw@157
    11
We create a bit array of the packages in each set, indicating which
danw@157
    12
ones are installed; the system bitarray starts out all 1s, and the
danw@157
    13
upstream bitarray all 0s. Each bit is only allowed to change state
danw@157
    14
once during the transaction; an installed package can be removed, or
danw@157
    15
an uninstalled package installed, but trying to reinstall a removed
danw@157
    16
package, or uninstall a newly-installed package is an error. This
danw@157
    17
means the packages break down into four categories:
danw@157
    18
danw@157
    19
    - installed       (1 bit in the system bit array)
danw@157
    20
    - to-be-removed   (0 bit in the system bit array)
danw@157
    21
    - to-be-installed (1 bit in the upstream bit array)
danw@157
    22
    - installable     (0 bit in the upstream bit array)
danw@157
    23
danw@157
    24
danw@158
    25
Depsolver:
danw@157
    26
danw@158
    27
    - Create new razor_transaction_packages ("rtp"s) for each
danw@158
    28
      requested install or remove.
danw@157
    29
danw@158
    30
    - while there are new rtps:
danw@157
    31
danw@158
    32
	- qsort the new rtps
danw@157
    33
danw@158
    34
	- Walk the system package list, upstream package list, and new
danw@158
    35
          rtps in parallel. For each new INSTALL/FORCED_UPDATE rtp,
danw@158
    36
          set the "new_package" field and the appropriate bit in the
danw@158
    37
          upstream bit array. (For any not-found packages, set an
danw@158
    38
          UNAVAILABLE error.) For each new rtp of any type (INSTALL,
danw@158
    39
          REMOVE, FORCED_UPDATE, OBSOLETED), if there's a matching
danw@158
    40
          system package, set the "old_package" field and clear the
danw@158
    41
          appropriate bit in the system bit array.
danw@157
    42
danw@158
    43
	- Walk the system and upstream property lists in parallel,
danw@158
    44
          and:
danw@157
    45
danw@158
    46
	    - For each to-be-installed non-file REQUIRES:
danw@157
    47
danw@158
    48
		- See if there's an installed or to-be-installed
danw@158
    49
		  package that PROVIDES that property.
danw@157
    50
danw@158
    51
		- If not, see if there's an installable package that
danw@158
    52
		  PROVIDES that property, and create a new INSTALL rtp
danw@158
    53
		  for it if so.
danw@157
    54
danw@158
    55
		- If not, see if there's a to-be-removed package that
danw@158
    56
		  PROVIDES that property. (If we find such a package,
danw@158
    57
		  we have a CONTRADICTION error.)
danw@157
    58
danw@158
    59
		- If none of the above, then we have an UNSATISFIABLE
danw@158
    60
                  error
danw@157
    61
danw@158
    62
	    - For each to-be-installed file REQUIRES:
danw@157
    63
danw@158
    64
		- (We create fake file PROVIDES to match file REQUIRES
danw@158
    65
                  when importing/merging razor sets, so if there is
danw@158
    66
                  already another installed package that REQUIRES this
danw@158
    67
                  file, there will be a PROVIDES listed for it as well.)
danw@157
    68
danw@158
    69
		- See if there's an installed package that PROVIDES
danw@158
    70
                  that file.
danw@157
    71
danw@158
    72
		- If not, do a binary search of the system file tree
danw@158
    73
                  looking to see if some installed package provides
danw@158
    74
                  that file but does not have a PROVIDES for it.
danw@157
    75
danw@158
    76
		- If not, see if there's an installable package that
danw@158
    77
		  PROVIDES that property, and create a new INSTALL rtp
danw@158
    78
		  for it if so.
danw@157
    79
danw@158
    80
		- (If we actually work with multiple upstream
danw@158
    81
                  razor_sets, then we will need to search the upstream
danw@158
    82
                  file trees at this point, because it's possible that
danw@158
    83
                  a package in one upstream repo would require a file
danw@158
    84
                  in another upstream repo. But if we merge the
danw@158
    85
                  multiple upstream repos into a single razor_set at
danw@158
    86
                  some point, then we would not need to do that,
danw@158
    87
                  because it would be guaranteed that we would have
danw@158
    88
                  already created a fake PROVIDES if any package
danw@158
    89
                  provides the file.)
danw@157
    90
danw@158
    91
		- If no installed or installable package provides the
danw@158
    92
		  file, see if there's a to-be-removed package that
danw@158
    93
		  provides the file. (If we find such a package, we
danw@158
    94
		  have a CONTRADICTION error.)
danw@157
    95
danw@158
    96
		- If none of the above, then we have an UNSATISFIABLE
danw@158
    97
                  error
danw@157
    98
danw@158
    99
	    - For each to-be-installed PROVIDES:
danw@157
   100
danw@158
   101
		- Check if the new PROVIDES conflicts with an
danw@158
   102
		  installed CONFLICTS. If so, create a new
danw@158
   103
		  FORCED_UPDATE rtp for the installed package, so we
danw@158
   104
		  can try to upgrade it to a non-conflicting version.
danw@158
   105
		  (If we can't, we'll have an OLD_CONFLICT error.)
danw@157
   106
danw@158
   107
		- Check if the new PROVIDES conflicts with an
danw@158
   108
                  installed OBSOLETES *and* the PROVIDES property
danw@158
   109
                  corresponds to the name of its package. (That is,
danw@158
   110
                  OBSOLETES are only matched against package names,
danw@158
   111
                  not arbitrary provided properties.) If so, we have
danw@158
   112
                  an ALREADY_OBSOLETE error.
danw@157
   113
danw@158
   114
		- Check if the new PROVIDES conflicts with a
danw@158
   115
		  to-be-installed CONFLICTS. If so, we have a
danw@158
   116
		  CONTRADICTION error.
danw@157
   117
danw@158
   118
	    - For each to-be-installed CONFLICTS:
danw@157
   119
danw@158
   120
		- Basically the reverse of the previous case: check if
danw@158
   121
		  the new CONFLICTS conflicts with an installed
danw@158
   122
		  PROVIDES. If so, create a new FORCED_UPDATE rtp for
danw@158
   123
		  the installed package, so we can try to upgrade it
danw@158
   124
		  to a non-conflicting version. (If we can't, we'll
danw@158
   125
		  have an NEW_CONFLICT error.)
danw@157
   126
danw@158
   127
		- Check if the new CONFLICTS conflicts with a
danw@158
   128
		  to-be-installed PROVIDES. If so, we have a
danw@158
   129
		  CONTRADICTION error.
danw@157
   130
danw@158
   131
	    - For each to-be-installed OBSOLETES:
danw@157
   132
danw@158
   133
		- Check if there's an installed package that PROVIDES
danw@158
   134
		  that property. If so, create an OBSOLETED rtp for
danw@158
   135
		  the installed package.
danw@157
   136
danw@158
   137
		- If not, check if there's a to-be-installed package
danw@158
   138
		  that PROVIDES that property. If so, we have a
danw@158
   139
		  CONTRADICTION error.
danw@157
   140
danw@158
   141
	    - For each to-be-removed PROVIDES:
danw@157
   142
danw@158
   143
		- If there's also an identical to-be-installed
danw@158
   144
		  PROVIDES, we're ok and can skip this
danw@157
   145
danw@158
   146
		- Otherwise, for each installed REQUIRES of this
danw@158
   147
                  property:
danw@157
   148
danw@158
   149
		    - Look for some other installed or to-be-installed
danw@158
   150
		      property that satisfies the REQUIRES.
danw@157
   151
danw@158
   152
		    - If there isn't one, then for each installed
danw@158
   153
		      package in this REQUIRES's package list:
danw@157
   154
danw@158
   155
			- If the PROVIDES was lost because the old
danw@158
   156
			  package was REMOVEd (not FORCED_UPDATE or
danw@158
   157
			  OBSOLETED), then create a new REMOVE rtp for
danw@158
   158
			  this package.
danw@157
   159
danw@158
   160
			- Otherwise, create a new FORCED_UPDATE rtp
danw@158
   161
                          for this package.
danw@157
   162
danw@158
   163
		- (We don't need to look at to-be-installed REQUIRES
danw@158
   164
		  of this property, because if there are any, they
danw@158
   165
		  will cause a CONTRADICTION error when we try to
danw@158
   166
		  re-satisfy them the next time through.)