Colin Walters <walters verbum org> writes:
> If I read the code correctly then OSTree won't generate a static delta for libQt5Core.so.5.6.1 -> libQt5Core.so.5.7.0 update. What is a definition of a "basename" here?
> With Shell "basename libQt5Core.so.5.6.1" -> "libQt5Core.so.5.6.1"
>
> Yeah, we do need to fix this. It's
https://bugzilla.gnome.org/show_bug.cgi?id=764009
would be helpful for now to add another pass, when not matching basename is
found, that will consider something more fuzzy (e.g. compare the basenames up to the
first '.')?
I made a quick experiment with the patch below.
Regards,
Giuseppe
diff --git a/src/libostree/ostree-repo-static-delta-compilation-analysis.c b/src/libostree/ostree-repo-static-delta-compilation-analysis.c
index ae5b8de..27b1380 100644
--- a/src/libostree/ostree-repo-static-delta-compilation-analysis.c
+++ b/src/libostree/ostree-repo-static-delta-compilation-analysis.c
@@ -189,7 +189,8 @@ build_content_sizenames_filtered (OstreeRepo *repo,
static gboolean
string_array_nonempty_intersection (GPtrArray *a,
- GPtrArray *b)
+ GPtrArray *b,
+ gboolean fuzzy)
{
guint i;
for (i = 0; i < a->len; i++)
@@ -199,8 +200,17 @@ string_array_nonempty_intersection (GPtrArray *a,
for (j = 0; j < b->len; j++)
{
const char *b_str = b->pdata[j];
- if (strcmp (a_str, b_str) == 0)
- return TRUE;
+ const char *dot = strchr (a_str, '.');
+ if (dot && fuzzy)
+ {
+ if (strncmp (a_str, b_str, dot - a_str) == 0)
+ return TRUE;
+ }
+ else
+ {
+ if (strcmp (a_str, b_str) == 0)
+ return TRUE;
+ }
}
}
return FALSE;
@@ -258,6 +268,8 @@ _ostree_delta_compute_similar_objects (OstreeRepo *repo,
upper = from_sizes->len;
for (i = 0; i < to_sizes->len; i++)
{
+ int fuzzy;
+ gboolean found = FALSE;
OstreeDeltaContentSizeNames *to_sizenames = to_sizes->pdata[i];
const guint64 min_threshold = to_sizenames->size *
(1.0-similarity_percent_threshold/100.0);
@@ -268,31 +280,41 @@ _ostree_delta_compute_similar_objects (OstreeRepo *repo,
if (to_sizenames->size == 0)
continue;
- for (j = lower; j < upper; j++)
+ for (fuzzy = 0; fuzzy < 2 && !found; fuzzy++)
{
- OstreeDeltaContentSizeNames *from_sizenames = from_sizes->pdata[j];
-
- /* Don't build candidates for the empty object */
- if (from_sizenames->size == 0)
- continue;
-
- if (from_sizenames->size < min_threshold)
+ for (j = lower; j < upper; j++)
{
- lower++;
- continue;
+ OstreeDeltaContentSizeNames *from_sizenames = from_sizes->pdata[j];
+
+ /* Don't build candidates for the empty object */
+ if (from_sizenames->size == 0)
+ {
+ continue;
+ }
+
+ if (from_sizenames->size < min_threshold)
+ {
+ lower++;
+ continue;
+ }
+
+ if (from_sizenames->size > max_threshold)
+ break;
+
+ if (!string_array_nonempty_intersection (from_sizenames->basenames,
+ to_sizenames->basenames,
+ fuzzy == 1))
+ {
+ continue;
+ }
+
+ /* Only one candidate right now */
+ g_hash_table_insert (ret_modified_regfile_content,
+ g_strdup (to_sizenames->checksum),
+ g_strdup (from_sizenames->checksum));
+ found = TRUE;
+ break;
}
-
- if (from_sizenames->size > max_threshold)
- break;
-
- if (!string_array_nonempty_intersection (from_sizenames->basenames, to_sizenames->basenames))
- continue;
-
- /* Only one candidate right now */
- g_hash_table_insert (ret_modified_regfile_content,
- g_strdup (to_sizenames->checksum),
- g_strdup (from_sizenames->checksum));
- break;
}
}
_______________________________________________
ostree-list mailing list
ostree-list gnome org
https://mail.gnome.org/mailman/listinfo/ostree-list