Preserve files on disk while installing a binary package.
While installing packages, if any file that is going to be unpacked exists on disk don't remove it. Always preserve them to avoid missing files on currently installed package if there are file conflicts.
This commit is contained in:
parent
7999d393e2
commit
979c585652
@ -144,38 +144,6 @@ remove_metafile(const char *file, const char *pkgname, const char *version)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
remove_file_wrong_hash(prop_dictionary_t d, const char *file)
|
||||
{
|
||||
struct stat st;
|
||||
const char *hash;
|
||||
int rv = 0;
|
||||
|
||||
if (stat(file, &st) == -1) {
|
||||
if (errno == ENOENT)
|
||||
return 0;
|
||||
return errno;
|
||||
}
|
||||
if (!S_ISREG(st.st_mode))
|
||||
return 0;
|
||||
|
||||
/* Only check for regular files, not symlinks, dirs or conffiles. */
|
||||
hash = xbps_file_hash_from_dictionary(d, "files", file);
|
||||
if (hash) {
|
||||
rv = xbps_file_hash_check(file, hash);
|
||||
if (rv == ERANGE) {
|
||||
(void)unlink(file);
|
||||
xbps_warn_printf("Removed `%s' entry with "
|
||||
"unmatched hash.\n", file);
|
||||
rv = 0;
|
||||
} else if (rv == ENOENT) {
|
||||
/* simply ignore */
|
||||
rv = 0;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute the unpack progress function callback if set and its
|
||||
* private data is also set. It's so sad that
|
||||
@ -409,21 +377,6 @@ unpack_archive(prop_dictionary_t pkg_repod,
|
||||
continue;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Check if current entry already exists on disk and
|
||||
* if the sha256 hash doesn't match, remove the file.
|
||||
* Only do this if we are _installing_ a package.
|
||||
*/
|
||||
if (!update) {
|
||||
rv = remove_file_wrong_hash(filesd, entry_pname);
|
||||
if (rv != 0) {
|
||||
xbps_dbg_printf("remove_file_wrong_hash "
|
||||
"failed for `%s': %s\n", entry_pname,
|
||||
strerror(rv));
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract entry from archive.
|
||||
*/
|
||||
@ -435,10 +388,8 @@ unpack_archive(prop_dictionary_t pkg_repod,
|
||||
pkgname, version, strerror(rv));
|
||||
goto out;
|
||||
} else {
|
||||
if (xhp->flags & XBPS_FLAG_VERBOSE)
|
||||
xbps_warn_printf("ignoring existing "
|
||||
"entry: %s\n", entry_pname);
|
||||
|
||||
xbps_warn_printf("ignoring existing "
|
||||
"entry: %s\n", entry_pname);
|
||||
RUN_PROGRESS_CB();
|
||||
continue;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user