[Gelistirici] Çakışan paketlerin kaldırılma sırası
Serdar Dalgıç
dalgic.srdr at gmail.com
22 Mayıs 2009 Cum 02:58:05 EEST
2009/5/21 Onur Küçük <onur at pardus.org.tr>
>
> On Thu, 21 May 2009 23:17:54 +0300
> Fatih Aşıcı <fatih at pardus.org.tr> wrote:
>
> > Pisi'nin çakışan paketleri tüm güncellemeleri indirdikten sonra
> > kaldırması daha doğru olmaz mıydı?
>
> +1
>
aslında system.base'de conflict olmayan paketler için pisi zaten öyle
yapıyor, buradaki problem *e2fsprogs* paketinin *system.base* olmasından
kaynaklanıyor.
*http://svn.pardus.org.tr/uludag/trunk/pisi/pisi/operations/upgrade.py*
upgrade işlemi burada gerçekleşiyor. upgrade edilecek paketlerin bodos bir
listesi çıkarıldıktan sonra (*satır 109*)
* install edilmiş ama replace olmuş paketler *
ve*
* system.base'den upgrade edilecek paketler
de listeye dahil ediliyor. (*satır 118,120*) . 120. satırda çağrılan *
upgrade_base(A)* fonksiyonunun içinde de, şurada
*G_f, install_order = operations.install.plan_install_pkg_names(extra_installs,
ignore_package_conflicts)*
(*satır 245*) system.base'den paketleri upgrade ederken system.base
upgradelerinden gelebilecek dependencyler gibi extradan paketler için bir
kurulum planı çıkarıyor.
*http://svn.pardus.org.tr/uludag/trunk/pisi/pisi/operations/install.py*
bu plan çıkarılırken (*install.py içinde satır 213*) system.base içinde
conflict olmuş paketler (burdaki örnekte *e2fsprogs* mesela) (*satır 248*)deki
*operations.remove.remove_conflicting_packages(conflicts)* fonksiyonu ile
kaldırılıyor.
problem bu anladığım kadarıyla.
emerge.py:144, upgrade.py:245 ve install.py:56 'da da*
def plan_install_pkg_names(A, ignore_package_conflicts = False):
*
çağrılıyor. çağrılma şekilleri de şöyle:
*emerge.py:144 G_f2, order_inst =
pisi.operations.install.plan_install_pkg_names(install_list)*
upgrade.py:245 G_f, install_order =
operations.install.plan_install_pkg_names(extra_installs,
ignore_package_conflicts)
*install.py:56 G_f, order = plan_install_pkg_names(A)*
burdan da şunu diyebiliriz, emerge ve install işlemlerinde
*--ignore-package-conflicts
*denildiğinde zaten buraya uğramıyor ve package-conflicts'i kaldırmıyor. (bu
cümlede açıkladığım davranış doğru. kafa karıştırmıyyim burada :) )
*çözüm önerileri*
* *operations.install.plan_install_pkg_names() *içinden *
remove_conflicting_packages()* fonksiyonunun olduğu blok (*
install.py:245-248*) kaldırılsın. Bu durumda:
*upgrade.py:*
upgrade.py için sorun yok gibi gözüküyor, çünkü conflict olan paketler plan
çıkartılırken sistemden kaldırılmasa bile *upgrade.py:163 *içinde
kaldırılıyorlar.
Bu düzeltme uygulanırsa, conflict paketler *order*ın içinde oluyor ve
order'ın tamamı packagedb'yle karşılaştırılıp conflict'lerin bir listesi
oluşturuluyor ve sonra da kaldırılıyorlar. (bkz: conflict kontrolü***)
burda dikkat edilmesi gereken sanıyorum * if not
ctx.get_option('ignore_package_conflicts'):* kısmı.
*ignore_package_conflicts *olduğunda normal ve ignore edilmesi istenilen
conflictlerin dışında system.base'deki *conflictler *de ignore edilmiş
oluyor. *nerden gelirse gelsin "conflict'leri ignore ederiz"* diyorsanız
sorun yok =)
*emerge.py:
**emerge.py:39*'da zaten
#A |= upgrade_base(A)
comment out edilmiş. Burdan anladığım kadarıyla da herhangi bir/birkaç paket
emerge edilirken system.base'in bağımlılıklarına bakılmıyor, install
edilecek ve build edilecek paketlerin order'ları ayrı, onları karıştırmamak
için..
*upgrade.py*'deki gibi conflict kontrolü*** kurulacak paketler listesi
üzerinde (*order_inst*) yapılabilir.
*install.py:
*burada da install edilecek paket/paketler kurulmadan önce system.base'den
upgrade edilmesi gereken herhangi bir paket var mı diye kontrol ediliyor;
bir başka deyişle bir *upgrade_base()* fonksiyon çağrısı var. yani ilk başta
bahsettiğim, asıl sorunun kaynağı olan fonksiyon.*
upgrade.py*'deki gibi burada da paketleri indirdikten sonra kuruluma
başlamadan önce conflict olup olmadığını kontrol edersek*** sorun çözülür
gibi geliyor bana.
*** conflict kontrolü, conflict kontrolü dediğim şey de şu:
if not ctx.get_option('ignore_package_conflicts'):
conflicts = operations.helper.check_conflicts(order, packagedb)
if conflicts:
operations.remove.remove_conflicting_packages(conflicts)
--------------------
biraz fazla kompozisyon tadında oldu sanırım, kusura bakmayın =) Yorumlar,
Öneriler?
--
- Serdar Dalgic
-------------- sonraki bölüm --------------
Bir HTML eklentisi temizlendi...
URL: <http://liste.pardus.org.tr/gelistirici/attachments/20090522/4bca4e5b/attachment-0002.htm>
Gelistirici mesaj listesiyle ilgili
daha fazla bilgi