On 01/10/14 17:05, Andrew Gregory wrote: > We need to know if a file needs to be backed up for all extracted files. >
Ack. > Signed-off-by: Andrew Gregory <[email protected]> > --- > lib/libalpm/add.c | 53 ++++++++++++++--------------------------------------- > 1 file changed, 14 insertions(+), 39 deletions(-) > > diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c > index bbf2a51..ca029b2 100644 > --- a/lib/libalpm/add.c > +++ b/lib/libalpm/add.c > @@ -147,16 +147,15 @@ static int try_rename(alpm_handle_t *handle, const char > *src, const char *dest) > static int extract_single_file(alpm_handle_t *handle, struct archive > *archive, > struct archive_entry *entry, alpm_pkg_t *newpkg, alpm_pkg_t > *oldpkg) > { > - const char *entryname; > - mode_t entrymode; > + const char *entryname = archive_entry_pathname(entry); > + mode_t entrymode = archive_entry_mode(entry); > + alpm_backup_t *backup = _alpm_needbackup(entryname, newpkg); > char filename[PATH_MAX]; /* the actual file we're extracting */ > int needbackup = 0, notouch = 0; > const char *hash_orig = NULL; > char *entryname_orig = NULL; > int errors = 0; > - > - entryname = archive_entry_pathname(entry); > - entrymode = archive_entry_mode(entry); > + struct stat lsbuf; > > if(strcmp(entryname, ".INSTALL") == 0) { > /* the install script goes inside the db */ OK > @@ -216,7 +215,6 @@ static int extract_single_file(alpm_handle_t *handle, > struct archive *archive, > * 6- skip extraction, dir already exists. > */ > > - struct stat lsbuf; > if(llstat(filename, &lsbuf) != 0) { > /* cases 1,2: file doesn't exist, skip all backup checks */ > } else { OK > @@ -269,21 +267,13 @@ static int extract_single_file(alpm_handle_t *handle, > struct archive *archive, > if(_alpm_fnmatch_patterns(handle->noupgrade, entryname) > == 0) { > notouch = 1; > } else { > - alpm_backup_t *backup; > - /* go to the backup array and see if our > conflict is there */ > - /* check newpkg first, so that adding backup > files is retroactive */ > - backup = _alpm_needbackup(entryname, newpkg); > - if(backup) { > + alpm_backup_t *oldbackup; > + if(oldpkg && (oldbackup = > _alpm_needbackup(entryname, oldpkg))) { > + hash_orig = oldbackup->hash; > + needbackup = 1; > + } else if(backup) { > + /* allow adding backup files > retroactively */ > needbackup = 1; > - } > - > - /* check oldpkg for a backup entry, store the > hash if available */ > - if(oldpkg) { > - backup = _alpm_needbackup(entryname, > oldpkg); > - if(backup) { > - hash_orig = backup->hash; > - needbackup = 1; > - } > } > } > } OK > @@ -312,16 +302,9 @@ static int extract_single_file(alpm_handle_t *handle, > struct archive *archive, > hash_pkg = alpm_compute_md5sum(checkfile); > > /* update the md5 hash in newpkg's backup (it will be the new > original) */ > - alpm_list_t *i; > - for(i = alpm_pkg_get_backup(newpkg); i; i = i->next) { > - alpm_backup_t *backup = i->data; > - char *newhash; > - if(!backup->name || strcmp(backup->name, > entryname_orig) != 0) { > - continue; > - } > - STRDUP(newhash, hash_pkg, RET_ERR(handle, > ALPM_ERR_MEMORY, -1)); > + if(backup) { > FREE(backup->hash); > - backup->hash = newhash; > + STRDUP(backup->hash, hash_pkg, RET_ERR(handle, > ALPM_ERR_MEMORY, -1)); > } > > _alpm_log(handle, ALPM_LOG_DEBUG, "checking hashes for %s\n", > entryname_orig); OK > @@ -468,17 +451,9 @@ needbackup_cleanup: > } > > /* calculate an hash if this is in newpkg's backup */ > - alpm_list_t *i; > - for(i = alpm_pkg_get_backup(newpkg); i; i = i->next) { > - alpm_backup_t *backup = i->data; > - char *newhash; > - if(!backup->name || strcmp(backup->name, > entryname_orig) != 0) { > - continue; > - } > - _alpm_log(handle, ALPM_LOG_DEBUG, "appending backup > entry for %s\n", entryname_orig); > - newhash = alpm_compute_md5sum(filename); > + if(backup) { > FREE(backup->hash); > - backup->hash = newhash; > + backup->hash = alpm_compute_md5sum(filename); > } > } > free(entryname_orig); > OK.
