[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