PERFORCE change 166231 for review
David Forsythe
dforsyth at FreeBSD.org
Sat Jul 18 16:17:53 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166231
Change 166231 by dforsyth at squirrel on 2009/07/18 16:17:42
Sort packages on add, but don't sort plist elements on add (it breaks
the parse). Parse needs to be rewritten to deal with plist variables
correctly.
Affected files ...
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#37 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_conflict.c#5 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_conflict.h#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db.c#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_depend.c#4 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_depend.h#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.c#10 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.h#9 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#28 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#24 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#15 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#13 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#11 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#24 edit
Differences ...
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#37 (text+ko) ====
@@ -7,8 +7,6 @@
#include "pkg_file.h"
#include "pkg_conflict.h"
#include "pkg_plist.h"
-#include "pkg_db_hierdb.h"
-#include "pkg_db.h"
#include "pkg_private.h"
#include "pkg.h"
@@ -306,8 +304,12 @@
return (PKG_OK);
}
-/* Maybe I should do these list retrievals in a fashion similar to
- * scandir? */
+int
+pkg_clone(struct pkg *psrc, struct pkg *pdest)
+{
+ /* Write this. */
+ return 0;
+}
/* Retrieve a list of file in this package. Return a list of strings
* terminated by NULL. */
@@ -466,9 +468,14 @@
if (p == NULL)
arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
-
+ /*
+ if (p->pl != NULL)
+ return (OK);
+ p->pl = pkg_plist_new();
+ if (p->pl == NULL)
+ return (PKG_NOT_OK | PKG_MEMORY_ERR);
+ */
if (pkg_plist_parsed(p->pl)) {
- /* For now, just jump ship if the package already has a plist. */
return (OK);
}
@@ -476,3 +483,15 @@
status = pkg_plist_parse_contents_from_text(p->pl, p->contents);
return (status);
}
+
+int
+pkgcmp(const void *a, const void *b)
+{
+ const struct pkg *pa;
+ const struct pkg *pb;
+
+ pa = a;
+ pb = b;
+
+ return (strsort(pa->ident, pb->ident));
+}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_conflict.c#5 (text+ko) ====
@@ -52,3 +52,15 @@
return pc->name;
}
+
+int
+pkg_conflictcmp(const void *a, const void *b)
+{
+ const struct pkg_conflict *pca;
+ const struct pkg_conflict *pcb;
+
+ pca = a;
+ pcb = b;
+
+ return (strsort(pca->name, pcb->name));
+}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_conflict.h#3 (text+ko) ====
@@ -3,7 +3,7 @@
struct pkg_conflict {
char *name;
- int version;
+ char *version;
};
struct pkg_conflict *pkg_conflict_new(void);
@@ -14,4 +14,6 @@
const char *pkg_conflict_name(struct pkg_conflict *pc);
+int pkg_conflictcmp(const void *a, const void *b);
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_db.c#6 (text+ko) ====
@@ -92,6 +92,7 @@
{
int i;
struct pkg *p;
+ struct pkg key;
if (db == NULL)
arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_CLIENT);
@@ -99,14 +100,16 @@
arg_rage_quit(__func__, "Not a valid identifier.",
RAGE_AT_CLIENT);
- /*p = (struct pkg *)bsearch(ident, db->pkg_list, db->pkg_count - 1,
- sizeof(struct pkg), pkg_cmp);*/
+ /*
+ p = bsearch(&key, db->pkg_entries, db->pkg_count,
+ sizeof(struct pkg *), pkgcmp);
+ */
p = NULL;
for (i = 0; i < db->pkg_count; ++i)
if (strcmp(db->pkg_entries[i]->ident, ident) == 0)
p = db->pkg_entries[i];
-
+
db->pkg_db_db_read_pkg_from_db(db, p);
return (p);
@@ -150,9 +153,9 @@
db->pkg_count++;
db->pkg_entries[db->pkg_count] = NULL;
db->pkg_list[db->pkg_count] = NULL;
-
- /* Add a qsort here. We're getting the packages in order now because
- * we arent doing anything, but eventually, well need to sort on add. */
+
+ qsort(db->pkg_entries, db->pkg_count, sizeof(struct pkg *), pkgcmp);
+ qsort(db->pkg_list, db->pkg_count, sizeof(struct pkg *), strsort);
return (DB_OK);
}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_depend.c#4 (text+ko) ====
@@ -74,3 +74,17 @@
return (pd->origin);
}
+
+int
+pkg_dependcmp(const void *a, const void *b)
+{
+ const struct pkg_depend *pda;
+ const struct pkg_depend *pdb;
+
+ pda = a;
+ pdb = b;
+
+ printf("%s vs %s\n", pda->name, pdb->name);
+
+ return (strsort(pda->name, pdb->name));
+}
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_depend.h#3 (text+ko) ====
@@ -7,7 +7,7 @@
char *name;
char *origin;
- int version;
+ char *version;
};
struct pkg_depend *pkg_depend_new(void);
@@ -22,4 +22,6 @@
const char *pkg_depend_origin(struct pkg_depend *pd);
+int pkg_dependcmp(const void *a, const void *b);
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.c#10 (text+ko) ====
@@ -173,3 +173,16 @@
pf->mode = mode;
return (OK);
}
+
+int
+pkg_filecmp(const void *a, const void *b)
+{
+ const struct pkg_file *pfa;
+ const struct pkg_file *pfb;
+
+ pfa = a;
+ pfb = b;
+
+ return (strsort(pfa->path, pfb->path));
+}
+
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.h#9 (text+ko) ====
@@ -30,4 +30,6 @@
int pkg_file_set_owner(struct pkg_file *pf, const char *owner);
int pkg_file_set_path(struct pkg_file *pf, const char *path);
+int pkg_filecmp(const void *a, const void *b);
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#28 (text+ko) ====
@@ -20,6 +20,9 @@
struct parse_state {
enum plist_elem last_elem;
+ struct pkg_conflict *last_conflict;
+ struct pkg_depend *last_depend;
+ struct pkg_file *last_file;
char *cwd;
char *owner;
char *group;
@@ -480,7 +483,10 @@
pl->pkg_file_count++;
pl->pkg_file_entries[pl->pkg_file_count] = NULL;
pl->pkg_file_list[pl->pkg_file_count] = NULL;
- /* sort. */
+
+ /* Having the sort in here (or in any of other element adders) breaks
+ * the parse.
+ */
return (OK);
}
@@ -537,7 +543,7 @@
pl->pkg_depend_count++;
pl->pkg_depend_entries[pl->pkg_depend_count] = NULL;
pl->pkg_depend_list[pl->pkg_depend_count] = NULL;
-
+
return (OK);
}
@@ -618,6 +624,15 @@
}
int
+pkg_plist_add_install(struct pkg_plist *pl, const char *cmd)
+{
+ if (pl == NULL)
+ arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+ if (cmd == NULL)
+ arg_rage_quit(__func__, "Not a valid install command.",
+ RAGE_AT_LIBPKG);
+
+int
pkg_plist_set_name(struct pkg_plist *pl, const char *name)
{
if (pl == NULL)
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#24 (text+ko) ====
@@ -92,6 +92,12 @@
int pkg_conflict_count;
char **pkg_conflict_list;
struct pkg_conflict **pkg_conflict_entries;
+
+ int pkg_install_count;
+ char **pkg_install_list;
+
+ int pkg_deinstall_count;
+ char **pkg_deinstall_list;
short parsed;
};
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#15 (text+ko) ====
@@ -25,4 +25,6 @@
int pkg_parse_plist(struct pkg *p);
+int pkgcmp(const void *a, const void *b);
+
#endif
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#13 (text+ko) ====
@@ -9,16 +9,11 @@
#include "pkg_private.h"
#include "pkg.h"
+
int
-pkg_cmp(const void *a, const void *b)
+strsort(const void *a, const void *b)
{
- const struct pkg *pa;
- const struct pkg *pb;
-
- pa = a;
- pb = b;
-
- return (strcmp(pa->ident, pb->ident));
+ return (strcmp(*(char **)a, *(char **)b));
}
int
==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#11 (text+ko) ====
@@ -5,7 +5,7 @@
int subdir_sel(struct dirent *ent);
-int pkg_cmp(const void *a, const void *b);
+int strsort(const void *a, const void *b);
char *path_strdup(const char *name);
==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#24 (text+ko) ====
@@ -1,23 +1,61 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <getopt.h>
#include "pkg.h"
#include "pkg_info.h"
+/* DEBUG */
+short opt_debug_dump = 0; /* M */
+
short opt_all = 0;
short opt_glob = 0;
+short opt_no_glob = 0;
+short opt_keep_package = 0;
short opt_show_all_info = 0;
+short opt_show_checksum = 0;
+short opt_show_comment = 0;
+short opt_show_display = 0;
+short opt_show_deinstall = 0;
+short opt_show_depends = 0;
+short opt_show_description = 0;
+short opt_show_files = 0;
+short opt_show_format_revision = 0;
short opt_show_index = 0;
-short opt_show_comment = 0;
-char *info_targets;
+short opt_show_install = 0;
+short opt_show_mtree = 0;
+short opt_show_origin = 0;
+short opt_show_pkg_name = 0;
+short opt_show_plist = 0;
+short opt_show_prefix = 0;
+short opt_show_require = 0;
+short opt_show_required_by = 0;
+short opt_show_size = 0;
+short opt_match_origin = 0;
+short opt_use_block = 0;
+char *info_origin;
/* TODO: Write common error handling functions for pkg_tools. */
-static char opts[] = "abcdDe:EfgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
+static char opts[] = "MabcdDe:EfgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
static struct option lopts[] = {
- { "all", no_argument, NULL, 'a'},
- {NULL, 0, NULL, 0},
+ { "debugdump", no_argument, NULL, 'M' },
+ { "all", no_argument, NULL, 'a' },
+ { "blocksize", no_argument, NULL, 'b' },
+ { "exists", required_argument, NULL, 'X' },
+ { "extended", no_argument, NULL, 'e' },
+ { "help", no_argument, NULL, 'h' },
+ { "keep", no_argument, NULL, 'K' },
+ { "no-glob", no_argument, NULL, 'G' },
+ { "origin", required_argument, NULL, 'O' },
+ { "quiet", no_argument, NULL, 'q' },
+ { "regex", no_argument, NULL, 'x' },
+ { "template", required_argument, NULL, 't' },
+ { "verbose", no_argument, NULL, 'v' },
+ { "version", no_argument, NULL, 'P' },
+ { "which", required_argument, NULL, 'W' },
+ { NULL, 0, NULL, 0 },
};
/* Mock pkg_info for testing, */
@@ -79,8 +117,97 @@
return;
}
while ((a = getopt_long(argc, argv, opts, lopts, NULL)) != -1) {
- /* ... */
- opt_show_all_info = 1;
+ switch (a) {
+ case ('a'):
+ opt_all = 1;
+ break;
+ case ('v'):
+ opt_show_comment = 1;
+ opt_show_description = 1;
+ opt_show_plist = 1;
+ opt_show_install = 1;
+ opt_show_deinstall = 1;
+ opt_show_require = 1;
+ opt_show_display = 1;
+ opt_show_mtree = 1;
+ break;
+ case ('E'):
+ opt_show_pkg_name = 1;
+ break;
+ case ('I'):
+ opt_show_index = 1;
+ break;
+ case ('p'):
+ opt_show_prefix = 1;
+ break;
+ case ('c'):
+ opt_show_comment = 1;
+ break;
+ case ('d'):
+ opt_show_description = 1;
+ break;
+ case ('D'):
+ opt_show_display = 1;
+ break;
+ case ('f'):
+ opt_show_plist = 1;
+ break;
+ case ('g'):
+ opt_show_checksum = 1;
+ break;
+ case ('G'):
+ opt_no_glob = 1;
+ break;
+ case ('i'):
+ opt_show_install = 1;
+ break;
+ case ('j'):
+ opt_show_require = 1;
+ break;
+ case ('k'):
+ opt_show_deinstall = 1;
+ break;
+ case ('K'):
+ opt_keep_package = 1;
+ break;
+ case ('r'):
+ opt_show_depends = 1;
+ break;
+ case ('R'):
+ opt_show_required_by = 1;
+ break;
+ case ('L'):
+ opt_show_files = 1;
+ break;
+ case ('m'):
+ opt_show_mtree = 1;
+ break;
+ case ('s'):
+ opt_show_size = 1;
+ break;
+ case ('o'):
+ opt_show_origin = 1;
+ break;
+ case ('O'):
+ opt_match_origin = 1;
+ info_origin = strdup(optarg);
+ if (info_origin == NULL) {
+ printf("mem\n");
+ exit(1);
+ }
+ break;
+ case ('V'):
+ opt_show_format_revision = 1;
+ break;
+ case ('M'):
+ opt_debug_dump = 1;
+ break;
+ /* lazy. */
+ case ('h'):
+ default:
+ usage(0);
+ break;
+ }
}
}
@@ -113,7 +240,7 @@
/* Just print the basic PKGNAME COMMENT scheme right now. Other
* information isn't collected by the library yet. */
- if (!opt_show_all_info) {
+ if (!opt_debug_dump) {
/* Use pkg_ident because old pkg_info goes by directory name. */
ident = pkg_ident(p);
comment = pkg_comment(p);
More information about the p4-projects
mailing list