On 11/05/13 12:21, Andrew Gregory wrote:
> Signed-off-by: Andrew Gregory <[email protected]>
> ---
> 
> Note the newly modified test at the bottom.
> 
>  lib/libalpm/add.c               | 56 
> +++++++++++++----------------------------
>  test/pacman/tests/upgrade045.py |  2 +-
>  2 files changed, 18 insertions(+), 40 deletions(-)
> 
> diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
> index 3ef81e3..49f36ce 100644
> --- a/lib/libalpm/add.c
> +++ b/lib/libalpm/add.c
> @@ -197,30 +197,25 @@ static int extract_single_file(alpm_handle_t *handle, 
> struct archive *archive,
>        * to get 'right'. Here are the possibilities, with the filesystem
>        * on the left and the package on the top:
>        * (F=file, N=node, S=symlink, D=dir)
> -      *               |  F/N  |  S  |  D
> -      *  non-existent |   1   |  2  |  3
> -      *  F/N          |   4   |  5  |  6
> -      *  S            |   7   |  8  |  9
> -      *  D            |   10  |  11 |  12
> +      *               |  F/N  |   D
> +      *  non-existent |   1   |   2
> +      *  F/N          |   3   |   4
> +      *  D            |   5   |   6
>        *
> -      *  1,2,3- extract, no magic necessary. lstat (_alpm_lstat) will fail 
> here.
> -      *  4,5,6,7,8- conflict checks should have caught this. either overwrite
> +      *  1,2- extract, no magic necessary. lstat (_alpm_lstat) will fail 
> here.
> +      *  3,4- conflict checks should have caught this. either overwrite
>        *      or backup the file.
> -      *  9- follow the symlink, hopefully it is a directory, check it.
> -      *  10- file replacing directory- don't allow it.
> -      *  11- don't extract symlink- a dir exists here. we don't want links to
> -      *      links, etc.
> -      *  12- skip extraction, dir already exists.
> +      *  5- file replacing directory- don't allow it.
> +      *  6- skip extraction, dir already exists.
>        */
>  
> -     /* do both a lstat and a stat, so we can see what symlinks point to */
> -     struct stat lsbuf, sbuf;
> -     if(_alpm_lstat(filename, &lsbuf) != 0 || stat(filename, &sbuf) != 0) {
> -             /* cases 1,2,3: couldn't stat an existing file, skip all backup 
> checks */
> +     struct stat lsbuf;
> +     if(_alpm_lstat(filename, &lsbuf) != 0) {
> +             /* cases 1,2: file doesn't exist, skip all backup checks */
>       } else {
>               if(S_ISDIR(lsbuf.st_mode)) {
>                       if(S_ISDIR(entrymode)) {
> -                             /* case 12: existing dir, ignore it */
> +                             /* case 6: existing dir, ignore it */
>                               if(lsbuf.st_mode != entrymode) {
>                                       /* if filesystem perms are different 
> than pkg perms, warn user */
>                                       mode_t mask = 07777;
> @@ -237,33 +232,18 @@ static int extract_single_file(alpm_handle_t *handle, 
> struct archive *archive,
>                               archive_read_data_skip(archive);
>                               return 0;
>                       } else {
> -                             /* case 10/11: trying to overwrite dir with 
> file/symlink, don't allow it */
> +                             /* case 5: trying to overwrite dir with file, 
> don't allow it */
>                               _alpm_log(handle, ALPM_LOG_ERROR, _("extract: 
> not overwriting dir with file %s\n"),
>                                               filename);
>                               archive_read_data_skip(archive);
>                               return 1;
>                       }
> -             } else if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(entrymode)) {
> -                     /* case 9: existing symlink, dir in package */
> -                     if(S_ISDIR(sbuf.st_mode)) {
> -                             /* the symlink on FS is to a directory, so 
> we'll use it */
> -                             _alpm_log(handle, ALPM_LOG_DEBUG, "extract: 
> skipping symlink overwrite of %s\n",
> -                                             filename);
> -                             archive_read_data_skip(archive);
> -                             return 0;
> -                     } else {
> -                             /* this is BAD. symlink was not to a directory 
> */
> -                             _alpm_log(handle, ALPM_LOG_ERROR, _("extract: 
> symlink %s does not point to dir\n"),
> -                                             filename);
> -                             archive_read_data_skip(archive);
> -                             return 1;
> -                     }
> -             } else if(S_ISREG(lsbuf.st_mode) && S_ISDIR(entrymode)) {
> -                     /* case 6: trying to overwrite file with dir */
> +             } else if(S_ISDIR(entrymode)) {
> +                     /* case 4: trying to overwrite file with dir */
>                       _alpm_log(handle, ALPM_LOG_DEBUG, "extract: overwriting 
> file with dir %s\n",
>                                       filename);
> -             } else if(S_ISREG(entrymode)) {
> -                     /* case 4,7: */
> +             } else {
> +                     /* case 3: */
>                       /* if file is in NoUpgrade, don't touch it */
>                       if(alpm_list_find(handle->noupgrade, entryname, 
> _alpm_fnmatch)) {
>                               notouch = 1;
> @@ -288,8 +268,6 @@ static int extract_single_file(alpm_handle_t *handle, 
> struct archive *archive,
>                               }
>                       }
>               }
> -             /* else if(S_ISLNK(entrymode)) */
> -             /* case 5,8: don't need to do anything special */
>       }
>  
>       /* we need access to the original entryname later after calls to
> diff --git a/test/pacman/tests/upgrade045.py b/test/pacman/tests/upgrade045.py
> index 3b7f476..e165ba3 100644
> --- a/test/pacman/tests/upgrade045.py
> +++ b/test/pacman/tests/upgrade045.py
> @@ -14,4 +14,4 @@
>  
>  self.addrule("PACMAN_RETCODE=0")
>  self.addrule("PKG_VERSION=foo|1.0-2")
> -self.addrule("FILE_EXIST=etc/foo.cfg")
> +self.addrule("LINK_EXIST=etc/foo.cfg")
> 

Looks good.  For that pactest, add a FILE_EXISTS=/etc/foo.cfg.pacnew too.

Also, in that pactest:

p1.files = ["etc/foo.cfg*"]

what is the "*" for there?



Reply via email to