[pacman-dev] [PATCH 1/7] extract_single_file: consolidate needbackup checks

Andrew Gregory andrew.gregory.8 at gmail.com
Wed Oct 1 07:05:53 UTC 2014


We need to know if a file needs to be backed up for all extracted files.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 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 */
@@ -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 {
@@ -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;
-					}
 				}
 			}
 		}
@@ -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);
@@ -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);
-- 
2.1.1


More information about the pacman-dev mailing list