2

Engineer Engelbert, a fierce OpenSuSE 11-sp4 user, is in possession of two RPM packages with the same contents:

rpm -qlp ~/onemy_ls_0.0.1_x86_64.rpm | tee a
/.osc/_apiurl
/.osc/_files
/.osc/_meta
/.osc/_osclib_version
/.osc/_package
/.osc/_project
/my_ls/my_ls.sh

rpm -qlp ~/my_ls_0.0.1_x86_64.rpm | tee b
/.osc/_apiurl
/.osc/_files
/.osc/_meta
/.osc/_osclib_version
/.osc/_package
/.osc/_project
/my_ls/my_ls.sh

diff a b | wc
  0       0       0

Engineer Engelbert has realized that he can install both packages with no warning from RPM:

rpm -e my_ls-0.0.1-1 ; rpm -i ~/my_ls_0.0.1_x86_64.rpm
rpm -e onemy_ls-0.0.1-1 ; rpm -i  ~/onemy_ls_0.0.1_x86_64.rpm

Engineer Engelbert is self-assured about his choices. He knows that's probably a good design choice from rpm developers. So, he checked the man page, certain that there would be an option for not allowing rpm packages to overwrite files in the system. But all the install options he found were:

install-options
    [--aid] [--allfiles] [--badreloc] [--excludepath OLDPATH]
    [--excludedocs] [--force] [-h,--hash]
    [--ignoresize] [--ignorearch] [--ignoreos]
    [--includedocs] [--justdb] [--nodeps]
    [--nodigest] [--nosignature] [--nosuggest]
    [--noorder] [--noscripts] [--notriggers]
    [--oldpackage] [--percent] [--prefix NEWPATH]
    [--relocate OLDPATH=NEWPATH]
    [--repackage] [--replacefiles] [--replacepkgs]
    [--test]

He hesitated and found strange that there is --replacefiles, but not --keepfiles. That suggested him that keep would be the default behavior. So, he created an script:

 rpm -e onemy_ls-0.0.1-1
 rpm -e my_ls-0.0.1-1
 rm -rf /my_ls/
 rpm -i   ~/my_ls_0.0.1_x86_64.rpm
 ls -lh /my_ls -d
 sleep 120
 rpm -i   ~/onemy_ls_0.0.1_x86_64.rpm
 ls -lh /my_ls -d  

That showed that the files were actually overwritten:

 drwxr-xr-x 2 root root 4.0K Aug 16 17:07 /my_ls
 drwxr-xr-x 2 root root 4.0K Aug 16 17:09 /my_ls

After a research, Engineer Engelbert couldn't still find the answer.Now he is in the middle of a flamewar about packaging systems, and, as asked by somebody, he needs your help:

How to make rpm not to overwrite files when installing new packages?

Note - Engineer Engelbert knows that he should create better rpm packages with conflicts management, you don't need to explain him that. He is mostly worried about being sure that his packages won't conflict with other proprietary unpublished packages racing for the same paths in the system.

Note - using fpm, you can regenerate Engineer Engelbert's RPMs:

mkdir -p first_pkg/my_ls/
echo ls > first_pkg/my_ls/my_ls.sh 
fpm -s dir -t rpm -n onemy_ls -v 0.0.1 -C first_pkg/ -p onemy_ls_VERSION_ARCH.rpm
fpm -s dir -t rpm -n my_ls -v 0.0.1 -C first_pkg/ -p my_ls_VERSION_ARCH.rpm
ribamar
  • 1,435
  • 1
  • 16
  • 26
  • --conflicts is a useful option – Vorsprung Aug 16 '16 at 15:22
  • Nope. Adding `--conflicts` to the script (as in `rm -rf /my_ls/ ; rpm -e onemy_ls-0.0.1-1 ; rpm -e my_ls-0.0.1-1 ; rpm --conflicts -i ~/my_ls_0.0.1_x86_64.rpm ; ls -lh /my_ls -d ; sleep 120 ; rpm -i --conflicts ~/onemy_ls_0.0.1_x86_64.rpm ; ls -lh /my_ls -d ` ) will overwrite the files still with no warning. He tried that. – ribamar Aug 16 '16 at 15:27

1 Answers1

0

Yes: rpm will overwrite all files contained in a *.rpm that are not marked with %config and there is no option to disable that behavior.

Jeff Johnson
  • 2,310
  • 13
  • 23