453b3600d1c053b5c458804ad0c51fa8de662456
[yum.git] / yum-3.2.27_el6-chroot.patch
1 Patch for yum-3.2.27-14.el6_0.1
2
3 diff --git a/cli.py b/cli.py
4 index cebbae3..cdb0129 100644
5 --- a/cli.py
6 +++ b/cli.py
7 @@ -1347,13 +1347,14 @@ class YumOptionParser(OptionParser):
8      def getRoot(self,opts):
9          # If the conf file is inside the  installroot - use that.
10          # otherwise look for it in the normal root
11 +        if opts.conffile==None:
12 +            opts.conffile = '/etc/yum/yum.conf'
13 +            if opts.installroot:
14 +                if os.access(opts.installroot+opts.conffile, os.R_OK):
15 +                    opts.conffile = opts.installroot+opts.conffile
16 +                elif os.access(opts.installroot+'/etc/yum.conf', os.R_OK):
17 +                    opts.conffile = opts.installroot+'/etc/yum.conf'
18          if opts.installroot:
19 -            if os.access(opts.installroot+'/'+opts.conffile, os.R_OK):
20 -                opts.conffile = opts.installroot+'/'+opts.conffile
21 -            elif opts.conffile == '/etc/yum/yum.conf':
22 -                # check if /installroot/etc/yum.conf exists.
23 -                if os.access(opts.installroot+'/etc/yum.conf', os.R_OK):
24 -                    opts.conffile = opts.installroot+'/etc/yum.conf'         
25              root=opts.installroot
26          else:
27              root = '/'
28 @@ -1394,7 +1395,6 @@ class YumOptionParser(OptionParser):
29                  action="store_true",
30                  help=_("run entirely from system cache, don't update cache"))
31          group.add_option("-c", "--config", dest="conffile",
32 -                default='/etc/yum/yum.conf',
33                  help=_("config file location"), metavar='[config file]')
34          group.add_option("-R", "--randomwait", dest="sleeptime", type='int',
35                  default=None,
36 diff --git a/yum/__init__.py b/yum/__init__.py
37 index 978815d..916c8d6 100644
38 --- a/yum/__init__.py
39 +++ b/yum/__init__.py
40 @@ -399,8 +399,7 @@ class YumBase(depsolve.Depsolve):
41              # this check makes sure that our dirs exist properly.
42              # if they aren't in the installroot then don't prepend the installroot path
43              # if we don't do this then anaconda likes to not  work.
44 -            if os.path.exists(self.conf.installroot+'/'+reposdir):
45 -                reposdir = self.conf.installroot + '/' + reposdir
46 +            reposdir = self.conf.getRootedPath(reposdir)
47  
48              if os.path.isdir(reposdir):
49                  for repofn in sorted(glob.glob('%s/*.repo' % reposdir)):
50 @@ -1379,9 +1378,7 @@ class YumBase(depsolve.Depsolve):
51          if self.conf.uid != 0:
52              return
53              
54 -        root = self.conf.installroot
55 -        lockfile = root + '/' + lockfile # lock in the chroot
56 -        lockfile = os.path.normpath(lockfile) # get rid of silly preceding extra /
57 +        lockfile = self.conf.lockfile
58          
59          mypid=str(os.getpid())    
60          while not self._lock(lockfile, mypid, 0644):
61 diff --git a/yum/config.py b/yum/config.py
62 index 975172a..603aacc 100644
63 --- a/yum/config.py
64 +++ b/yum/config.py
65 @@ -604,6 +604,26 @@ class StartupConf(BaseConfig):
66      syslog_facility = Option('LOG_DAEMON')
67      persistdir = Option('/var/lib/yum')
68      
69 +    def getRootedPath(self, path, enforce_default=False, defaults_to_host=False):
70 +        instroot = getattr(self, 'installroot', None)
71 +        if instroot==None:
72 +            return path
73 +
74 +        if   path.startswith('hostfs://'):   res = path[9:]
75 +        elif path.startswith('chrootfs://'): res = instroot + '/' + path[11:]
76 +        else:
77 +            tmp = instroot + '/' + path
78 +
79 +            if enforce_default:
80 +                if defaults_to_host:    res = path
81 +                else:                   res = tmp
82 +            else:
83 +                if os.path.exists(tmp): res = tmp
84 +                elif defaults_to_host:  res = path
85 +                else:                   res = tmp
86 +
87 +        return res
88 +
89  class YumConf(StartupConf):
90      '''
91      Configuration option definitions for yum.conf\'s [main] section.
92 @@ -617,6 +637,7 @@ class YumConf(StartupConf):
93  
94      keepcache = BoolOption(True)
95      logfile = Option('/var/log/yum.log')
96 +    lockfile = Option('/var/run/yum.pid')
97      reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d'])
98  
99      commands = ListOption()
100 @@ -832,7 +853,10 @@ def readStartupConfig(configfile, root):
101      # Stuff this here to avoid later re-parsing
102      startupconf._parser = parser
103      # setup the release ver here
104 -    startupconf.releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg)
105 +    try:
106 +        startupconf.releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg)
107 +    except:
108 +        startupconf.releasever = ""
109      uuidfile = '%s/%s/uuid' % (startupconf.installroot, startupconf.persistdir)
110      startupconf.uuid = get_uuid(uuidfile)
111  
112 @@ -864,7 +888,7 @@ def readMainConfig(startupconf):
113      # Apply the installroot to directory options
114      def _apply_installroot(yumconf, option):
115          path = getattr(yumconf, option)
116 -        ir_path = yumconf.installroot + path
117 +        ir_path = yumconf.getRootedPath(path)
118          ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and
119                                               # it annoys me
120          ir_path = varReplace(ir_path, yumvars)
121 @@ -888,7 +912,7 @@ def readMainConfig(startupconf):
122          yumvars[fsvar] = val
123  
124      # These can use the above FS yumvars
125 -    for option in ('cachedir', 'logfile', 'persistdir'):
126 +    for option in ('cachedir', 'logfile', 'persistdir', 'lockfile'):
127          _apply_installroot(yumconf, option)
128  
129      # Add in some extra attributes which aren't actually configuration values 
130 diff --git a/yum/history.py b/yum/history.py
131 index 32eed2c..64b6695 100644
132 --- a/yum/history.py
133 +++ b/yum/history.py
134 @@ -176,10 +176,7 @@ class YumHistory:
135          self._conn = None
136          
137          self.conf = yum.misc.GenericHolder()
138 -        if not os.path.normpath(db_path).startswith(root):
139 -            self.conf.db_path  = os.path.normpath(root + '/' + db_path)
140 -        else:
141 -            self.conf.db_path = os.path.normpath('/' + db_path)
142 +        self.conf.db_path  = db_path
143          self.conf.writable = False
144          self.conf.readable = True
145  
146 diff --git a/yum/rpmsack.py b/yum/rpmsack.py
147 index 878e8d4..1938f1a 100644
148 --- a/yum/rpmsack.py
149 +++ b/yum/rpmsack.py
150 @@ -151,13 +151,8 @@ class RPMDBPackageSack(PackageSackBase):
151          self._get_pro_cache = {}
152          self._get_req_cache  = {}
153          self._loaded_gpg_keys = False
154 -        if cachedir is None:
155 -            cachedir = persistdir + "/rpmdb-indexes"
156 -        self.setCacheDir(cachedir)
157 -        if not os.path.normpath(persistdir).startswith(self.root):
158 -            self._persistdir = root +  '/' + persistdir
159 -        else:
160 -            self._persistdir = persistdir
161 +        self._cachedir = persistdir + "/rpmdb-indexes"
162 +        self._persistdir = persistdir
163          self._have_cached_rpmdbv_data = None
164          self._cached_conflicts_data = None
165          # Store the result of what happens, if a transaction completes.
166 @@ -217,14 +212,6 @@ class RPMDBPackageSack(PackageSackBase):
167          self.transactionReset() # Should do nothing, but meh...
168          self._cached_rpmdb_mtime = None
169  
170 -    def setCacheDir(self, cachedir):
171 -        """ Sets the internal cachedir value for the rpmdb, to be the
172 -            "rpmdb-indexes" directory in the persisent yum storage. """
173 -        if not os.path.normpath(cachedir).startswith(self.root):
174 -            self._cachedir = self.root + '/' + cachedir
175 -        else:
176 -            self._cachedir = '/' + cachedir
177 -
178      def readOnlyTS(self):
179          if not self.ts:
180              self.ts =  initReadOnlyTransaction(root=self.root)
181 @@ -861,7 +848,7 @@ class RPMDBPackageSack(PackageSackBase):
182          # http://lists.rpm.org/pipermail/rpm-maint/2007-November/001719.html
183          # ...if anything gets implemented, we should change.
184          rpmdbvfname = self._cachedir + "/version"
185 -        rpmdbfname  = self.root + "/var/lib/rpm/Packages"
186 +        rpmdbfname  = self.root + rpm.expandMacro("%_dbpath/Packages")
187  
188          if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname):
189              # See if rpmdb has "changed" ...
190 @@ -881,7 +868,7 @@ class RPMDBPackageSack(PackageSackBase):
191          if self._cached_rpmdb_mtime is None:
192              return # We haven't loaded any packages!!!
193  
194 -        rpmdbfname  = self.root + "/var/lib/rpm/Packages"
195 +        rpmdbfname  = self.root + rpm.expandMacro("%_dbpath/Packages")
196          if not os.path.exists(rpmdbfname):
197              return # haha
198  
199 @@ -1104,7 +1091,7 @@ class RPMDBPackageSack(PackageSackBase):
200          self._name2pkg.setdefault(po.name, []).append(po)
201          self._tup2pkg[po.pkgtup] = po
202          if self.__cache_rpmdb__ and self._cached_rpmdb_mtime is None:
203 -            rpmdbfname  = self.root + "/var/lib/rpm/Packages"
204 +            rpmdbfname  = self.root + rpm.expandMacro("%_dbpath/Packages")
205              self._cached_rpmdb_mtime = os.path.getmtime(rpmdbfname)
206  
207          return po
208 diff --git a/yum/rpmtrans.py b/yum/rpmtrans.py
209 index 0340153..a544b9c 100644
210 --- a/yum/rpmtrans.py
211 +++ b/yum/rpmtrans.py
212 @@ -243,7 +243,10 @@ class RPMTransaction:
213      def _scriptout(self, data):
214          msgs = self._scriptOutput()
215          self.display.scriptout(data, msgs)
216 -        self.base.history.log_scriptlet_output(data, msgs)
217 +        try:
218 +            self.base.history.log_scriptlet_output(data, msgs)
219 +        except:
220 +            self.display.errorlog('could not log scriptlet output')
221  
222      def __del__(self):
223          self._shutdownOutputLogging()