Date: Thu, 12 Aug 2010 00:22:22 GMT From: Ivan Voras <ivoras@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 182286 for review Message-ID: <201008120022.o7C0MMCq062265@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@182286?ac=10 Change 182286 by ivoras@ursaminor on 2010/08/12 00:21:19 Introduce and use pkg_repo_url in PKGPATCHINDEX Affected files ... .. //depot/projects/soc2010/pkg_patch/src/patch/Makefile#33 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#23 edit .. //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#23 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#32 edit .. //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#32 edit .. //depot/projects/soc2010/pkg_patch/src/patch/main.c#33 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#31 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#31 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#16 edit .. //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#15 edit .. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#4 edit .. //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#31 edit .. //depot/projects/soc2010/pkg_patch/src/patch/support.c#30 edit .. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#11 edit .. //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#11 edit Differences ... ==== //depot/projects/soc2010/pkg_patch/src/patch/Makefile#33 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.c#23 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/applypatch.h#23 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.c#32 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/hashjob.h#32 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/main.c#33 (text+ko) ==== @@ -42,6 +42,7 @@ enum PP_OP patch_op = PP_NONE; char *my_tmp = NULL; int flag_bsdiff = 0; +char *pkg_repo_url = NULL; static void usage_short(void); @@ -53,9 +54,11 @@ static void usage_short() { printf("usage:\n"); - printf("\t%s -c [-b] package_file_1 package_file_2 patch_file\n", argv[0]); + printf("\t%s -c [-b] package_file_1 package_file_2 patch_file\n", + argv[0]); printf("\t%s -a patch_file\n", argv[0]); - printf("\t%s -m [-b] package_dir_1 package_dir_2 patch_dir\n", argv[0]); + printf("\t%s -m [-b] [-r url_repo] package_dir_1 package_dir_2 " + "patch_dir\n", argv[0]); printf("\t%s -u [url]\n", argv[0]); } @@ -64,7 +67,7 @@ proc_args() { int ch; - while ((ch = getopt(argc, argv, "abcfhmuv")) != -1) { + while ((ch = getopt(argc, argv, "abcfhmp:uv")) != -1) { switch (ch) { case 'a': patch_op = PP_APPLY; @@ -85,6 +88,9 @@ case 'm': patch_op = PP_MKPATCHDIR; break; + case 'r': + pkg_repo_url = strdup(optarg); + break; case 'v': Verbose++; break; ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.c#31 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatch.h#31 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.c#16 (text+ko) ==== @@ -64,6 +64,10 @@ if (access(dpatch, W_OK) != 0) err(1, "Access error writing directory: %s", dpatch); + if (pkg_repo_url == NULL) + warnx("Package repository URL not specified for this " + "patchset. Read the manual for details."); + snprintf(flog, PATH_MAX, "%s/%s", dpatch, PKGPATCHINDEX_FNAME); fpl = fopen(flog, "a+"); if (fpl == NULL) @@ -83,6 +87,8 @@ fprintf(fpl, "# Created by mkpatchdir at %s\n", time_ctime(-1)); fprintf(fpl, "@version %d.%d\n", PKGPATCH_VERSION_MAJOR, PKGPATCH_VERSION_MINOR); + if (pkg_repo_url != NULL) + fprintf(fpl, "@pkgrepo %s\n", pkg_repo_url); SLIST_FOREACH(pl, &pkglist, linkage) { char pname[PATH_MAX]; ==== //depot/projects/soc2010/pkg_patch/src/patch/mkpatchdir.h#15 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.1#4 (text+ko) ==== @@ -15,7 +15,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 9, 2010 +.Dd August 9, 2010 .Dt PKG_PATCH 1 .Os .Sh NAME @@ -71,27 +71,27 @@ .It Fl u Compare the current system state with the package patch repository and update any packages found to need updating. +.It Fl h +Show usage help message. .Sh TECHNICAL DETAILS The .Nm utility operates on binary package files and on the live system, including the package database in .Pa /var/db/pkg . -All modes of operation require +All documented modes of operation require .Nm to be run as the superuser. Currently, .Nm -does not invoke any scripts specified in the package files. +does not invoke any scripts or commands specified in the package files. .Sh SEE ALSO .Xr pkg_add 1 , .Xr pkg_create 1 , .Xr pkg_delete 1 , .Xr pkg_info 1 , .Xr pkg_version 1 , -.Xr mktemp 3 , -.Xr sysconf 3 , -.Xr mtree 8 +.Xr bsdiff 1 .Sh AUTHORS .An Ivan Voras Aq ivoras@freebsd.org .Sh BUGS ==== //depot/projects/soc2010/pkg_patch/src/patch/pkg_patch.h#31 (text+ko) ==== @@ -130,6 +130,7 @@ extern enum PP_OP patch_op; extern char *my_tmp; extern int flag_bsdiff; +extern char *pkg_repo_url; #endif ==== //depot/projects/soc2010/pkg_patch/src/patch/support.c#30 (text+ko) ==== ==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.c#11 (text+ko) ==== @@ -48,21 +48,29 @@ TAILQ_ENTRY(patchrec) linkage; }; +struct patch_index { + int ver_major; + int ver_minor; + char *pkg_repo_url; + struct patchrec_list prlist; +}; + static int -read_pkgpatchindex_file(struct patchrec_list *prlist, char *fname) +read_pkgpatchindex_file(struct patch_index *pindex, char *fname) { char line[4*PKGNAME_MAX]; char *cmd, *param; FILE *f; char *p; + struct patchrec_list *prlist; + prlist = &pindex->prlist; + f = fopen(fname, "r"); if (f == NULL) return (-1); while (fgets(line, sizeof(line), f) != NULL) { - int vmajor, vminor; - p = strchr(line, '#'); if (p != NULL) *p = '\0'; @@ -79,20 +87,16 @@ *p = '\0'; param = p + 1; if (strcmp(cmd, "version") == 0) { + int vmajor, vminor; + if (sscanf(param, "%d.%d", &vmajor, &vminor) != 2) { warnx("Cannot parse version: %s", param); break; } - if (vmajor != PKGPATCH_VERSION_MAJOR) { - warnx("Major version mismatch: got %d expected %d", - vmajor, PKGPATCH_VERSION_MAJOR); - break; - } - if (vminor > PKGPATCH_VERSION_MINOR) { - warnx("Minor version cannot be handled: %d", - vminor); - break; - } + pindex->ver_major = vmajor; + pindex->ver_minor = vminor; + } else if (strcmp(cmd, "pkgrepo") == 0) { + pindex->pkg_repo_url = strdup(param); } else if (strcmp(cmd, "havepatch") == 0) { char src[PKGNAME_MAX], tgt[PKGNAME_MAX], patch[PATH_MAX], tstamp[PKGNAME_MAX]; @@ -157,16 +161,30 @@ } +static int +pkg_add(struct patch_index *pindex, char *pkg_name) +{ + char url[PATH_MAX]; + + snprintf(url, sizeof(url), "%s/%s.%s", pindex->pkg_repo_url, + pkg_name, PKG_FORMAT_EXT); + if (Verbose > 1) + printf("Trying to install %s.\n", url); + return vsystem("%s %s", _PATH_PKG_ADD, url); +} + + void perform_updateweb(const char *in_url) { char url_base[PATH_MAX], url_index[PATH_MAX], index_fname[PATH_MAX]; char local_index[PATH_MAX]; - struct patchrec_list prlist; + struct patch_index pindex; struct patchrec *pr; char **instpkg; int er, i, pcount = 0, scount; + memset(&pindex, 0, sizeof(pindex)); if (in_url == NULL) in_url = PKGPATCH_SITE_URL; @@ -207,11 +225,20 @@ if (Verbose > 2) printf("Decompressed index to: %s\n", local_index); } - TAILQ_INIT(&prlist); - if (read_pkgpatchindex_file(&prlist, local_index) != 0) + TAILQ_INIT(&pindex.prlist); + if (read_pkgpatchindex_file(&pindex, local_index) != 0) err(1, "Cannot read pkgpatchindex: %s", local_index); + if (pindex.ver_major != PKGPATCH_VERSION_MAJOR) + errx(1, "Major version mismatch: got %d expected %d", + pindex.ver_major, PKGPATCH_VERSION_MAJOR); + if (pindex.ver_minor > PKGPATCH_VERSION_MINOR) + errx(1, "Minor version cannot be handled: %d", + pindex.ver_minor); + if (pindex.pkg_repo_url == NULL) + warnx("Target package repo URL is not present in patch repo " + "metadata."); if (Verbose > 2) - TAILQ_FOREACH(pr, &prlist, linkage) + TAILQ_FOREACH(pr, &pindex.prlist, linkage) printf("Available: %s to %s via %s\n", pr->source, pr->target, pr->patch_name); @@ -221,7 +248,7 @@ for (i = 0; instpkg[i] != NULL; i++) { if (Verbose > 2) printf("Installed: %s\n", instpkg[i]); - TAILQ_FOREACH(pr, &prlist, linkage) + TAILQ_FOREACH(pr, &pindex.prlist, linkage) if (strncmp(instpkg[i], pr->source, PKGNAME_MAX) == 0) { pr->match = TRUE; pcount++; @@ -236,7 +263,7 @@ /* Show this information even if we're in non-verbose mode, it's * important! */ printf("Patch candidates:\n"); - TAILQ_FOREACH(pr, &prlist, linkage) { + TAILQ_FOREACH(pr, &pindex.prlist, linkage) { if (pr->match) printf("%s\t", pr->source); } @@ -249,7 +276,7 @@ /* Ok now, fetch the patches */ if (Verbose) printf("Downloading: "); - TAILQ_FOREACH(pr, &prlist, linkage) { + TAILQ_FOREACH(pr, &pindex.prlist, linkage) { char local_file[PATH_MAX], remote_file[PATH_MAX]; if (pr->match) { @@ -271,7 +298,7 @@ printf(".\n"); /* Read the package patches' plists */ - TAILQ_FOREACH(pr, &prlist, linkage) { + TAILQ_FOREACH(pr, &pindex.prlist, linkage) { char local_file[PATH_MAX]; if (!pr->match) @@ -299,7 +326,7 @@ scount = 0; /* Sort the package patches by dependancies */ - TAILQ_FOREACH(pr, &prlist, linkage) { + TAILQ_FOREACH(pr, &pindex.prlist, linkage) { struct patchrec *pr2 = NULL; int foundit = FALSE; @@ -322,7 +349,7 @@ pl = pl->next; continue; } - TAILQ_FOREACH(pr2, &prlist, linkage) { + TAILQ_FOREACH(pr2, &pindex.prlist, linkage) { if (strncmp(pl->name, pr2->target, PKGNAME_MAX) == 0) { ndeps_found++; @@ -331,16 +358,19 @@ } } if (!foundit) { - printf("Cannot resolve dependancy " + printf("Dependancy cannot be satisfied " "%s -> %s\n", pr->target, pl->name); + if (pkg_add(&pindex, pl->name) != 0) + err(1, "Cannot install %s\n", + pl->name); pl = pl->next; continue; } /* Reshuffle the found (depended-on) package to * the front. */ assert(pr2 != NULL); - TAILQ_REMOVE(&prlist, pr2, linkage); - TAILQ_INSERT_HEAD(&prlist, pr2, linkage); + TAILQ_REMOVE(&pindex.prlist, pr2, linkage); + TAILQ_INSERT_HEAD(&pindex.prlist, pr2, linkage); scount++; pl = pl->next; } @@ -351,7 +381,7 @@ } /* Ok, apply the gathered patches now */ - TAILQ_FOREACH(pr, &prlist, linkage) { + TAILQ_FOREACH(pr, &pindex.prlist, linkage) { char local_file[PATH_MAX]; if (!pr->match) ==== //depot/projects/soc2010/pkg_patch/src/patch/updateweb.h#11 (text+ko) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008120022.o7C0MMCq062265>