Repository Search Order
Dan Lists
lists.dan at gmail.com
Sat Sep 13 04:09:44 UTC 2014
Looks like the list scrubbed the attachment. Here is the patch.
--- libpkg/pkg_config.c.orig 2014-09-12 20:02:24.292995291 -0500
+++ libpkg/pkg_config.c 2014-09-12 21:08:07.945030287 -0500
@@ -592,6 +592,13 @@
ucl_object_unref(obj);
}
+int cmp(const void *a, const void *b)
+{
+ const char **ia = (const char **)a;
+ const char **ib = (const char **)b;
+ return strcmp(*ia, *ib);
+}
+
static void
load_repo_files(const char *repodir)
{
@@ -600,6 +607,8 @@
char *p;
size_t n;
char path[MAXPATHLEN];
+ char *repos[1024];
+ int r=0;
if ((d = opendir(repodir)) == NULL)
return;
@@ -610,14 +619,26 @@
continue;
p = &ent->d_name[n - 5];
if (strcmp(p, ".conf") == 0) {
- snprintf(path, sizeof(path), "%s%s%s",
+ repos[r]=malloc(n+1);
+ snprintf(repos[r], n+1, ent->d_name);
+ r++;
+ }
+ }
+ closedir(d);
+
+ if( r == 0 )
+ return;
+
+ qsort(repos, r, sizeof(char *), cmp);
+
+ for( int i=0 ; i < r ; i++ ){
+ snprintf(path, sizeof(path), "%s%s%s",
repodir,
repodir[strlen(repodir) - 1] == '/' ? "" : "/",
- ent->d_name);
+ repos[i]);
load_repo_file(path);
+ free(repos[i]);
}
- }
- closedir(d);
}
static void
On Fri, Sep 12, 2014 at 9:14 PM, Dan Lists <lists.dan at gmail.com> wrote:
> Attached is a proof of concept patch that handles the sorting. For
> production, the repos array would need bounds checking, and the 1024 should
> be a define.
>
>
>
> On Fri, Sep 12, 2014 at 8:02 PM, Dan Lists <lists.dan at gmail.com> wrote:
>
>> man pkg.conf states:
>>
>> Repositories are prioritized in the order they are found on the
>> REPOS_DIR
>> search path, with individual repository configuration files in the
>> same
>> directory processed in alphabetical order. Earlier files take prece-
>> dence, meaning that packages will be downloaded from them
>> preferentially
>> where the same package is available from several repositories.
>>
>> This is not true, but I would like it to be.
>>
>> # ls /usr/local/etc/pkg/repos/
>> 00_Local.conf 80_zzz.conf 90_fff.conf 99_mmm.conf FreeBSD.conf
>>
>> So the order should be local, zzz, fff, mmm.
>>
>> Repositories:
>> mmm: {
>> url : "http://some.dom/freebsd:8:x86:64/mmm",
>> enabled : yes
>> }
>> fff: {
>> url : "http://some.dom/freebsd:8:x86:64/fff",
>> enabled : yes
>> }
>> local: {
>> url : "file:///usr/ports/packages",
>> enabled : yes
>> }
>> zzz: {
>> url : "http://some.dom/freebsd:8:x86:64/zzz",
>> enabled : yes
>> }
>>
>> The order has no relation to alphabetical order at all. Interestingly,
>> if I use find (unsorted), it matches the repository order!
>>
>> # find /usr/local/etc/pkg/repos
>> /usr/local/etc/pkg/repos
>> /usr/local/etc/pkg/repos/FreeBSD.conf
>> /usr/local/etc/pkg/repos/99_mmm.conf
>> /usr/local/etc/pkg/repos/90_fff.conf
>> /usr/local/etc/pkg/repos/00_Local.conf
>> /usr/local/etc/pkg/repos/80_zzz.conf
>>
>> I quick look at the source shows that load_repo_files is just reading the
>> files in the order they are in the directory table:
>>
>> while ((ent = readdir(d))) {
>> ...
>> }
>>
>> Can we get the repo config files sorted like the docs say?
>>
>
>
More information about the freebsd-questions
mailing list