ports/106483: [PATCH]: embed distfile information in +CONTENTS

Wesley Shields wxs at atarininja.org
Fri Dec 8 17:00:27 UTC 2006


>Number:         106483
>Category:       ports
>Synopsis:       [PATCH]: embed distfile information in +CONTENTS
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Dec 08 17:00:21 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Wesley Shields
>Release:        FreeBSD 6.1-RELEASE-p10 amd64
>Organization:
>Environment:
System: FreeBSD syn.csh.rit.edu 6.1-RELEASE-p10 FreeBSD 6.1-RELEASE-p10 #5: Sat Sep 30 21:50:55 EDT 2006 root at syn.csh.rit.edu:/usr/obj/usr/src/sys/SMP amd64

>Description:
It appears that some tools, specifically portmaster and maybe others,
would benefit from being able to know the files used to create a
package.  Currently the closest they can get to that is looking for
@comment ORIGIN:foo/bar and digging through the port (make -V probably)
to get that.

My proposed way of doing this is adding an @comment DISTFILE: line in
+CONTENTS such as:

@comment DISTFILE:jlj_2.12.tar.gz:SIZE=32480:SHA256=da3e1626338c5337e28bb4bc8da0b64d7a8ab441a52aa2364037e9eea152bc27:MD5=55724c4d6d26211f34803ef856075234

I chose to overload the @comment structure because any other way would
require a change to pkg_create which just seems like a bad idea for such
a minor change.

I've also attached a second patch which is the necessary bits to
pkg_info(1) to be able to parse and display the distfile information.

The full discussion is at:

http://lists.freebsd.org/pipermail/freebsd-ports/2006-December/037302.html

The bsd.port.mk patch is Doug Barton's rework of my original attempt.
Many thanks to him and Ade for their help.

>How-To-Repeat:
N/A

>Fix:
Index: bsd.port.mk
===================================================================
RCS file: /usr/local/ncvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.544
diff -u -r1.544 bsd.port.mk
--- bsd.port.mk	30 Sep 2006 19:25:45 -0000	1.544
+++ bsd.port.mk	8 Dec 2006 06:11:25 -0000
@@ -5395,11 +5395,20 @@
 # files exist.
 
 .if !target(generate-plist)
+.if defined(DIST_SUBDIR)
+PDS=	${DIST_SUBDIR}/
+.endif
 generate-plist:
 	@${ECHO_MSG} "===>   Generating temporary packing list"
 	@${MKDIR} `${DIRNAME} ${TMPPLIST}`
 	@if [ ! -f ${DESCR} ]; then ${ECHO_CMD} "** Missing pkg-descr for ${PKGNAME}."; exit 1; fi
 	@>${TMPPLIST}
+	@for file in ${ALLFILES}; do \
+		distsize=`${GREP} "^SIZE (${PDS}$${file})" ${MD5_FILE} | ${CUT} -f4 -d' '`; \
+		distsha256=`${GREP} "^SHA256 (${PDS}$${file})" ${MD5_FILE} | ${CUT} -f4 -d' '`; \
+		distmd5=`${GREP} "^MD5 (${PDS}$${file})" ${MD5_FILE} | ${CUT} -f4 -d' '`; \
+		${ECHO_CMD} "@comment DISTFILE:${PDS}$${file}:SIZE=$${distsize}:SHA256=$${distsha256}:MD5=$${distmd5}" >> ${TMPPLIST}; \
+	done
 	@for file in ${PLIST_FILES}; do \
 		${ECHO_CMD} $${file} | ${SED} ${PLIST_SUB:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} >> ${TMPPLIST}; \
 	done

And the patch for pkg_info...

Index: info/info.h
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/info/info.h,v
retrieving revision 1.29
diff -u -r1.29 info.h
--- info/info.h	9 Jan 2006 18:27:21 -0000	1.29
+++ info/info.h	7 Dec 2006 18:23:42 -0000
@@ -52,6 +52,7 @@
 #define SHOW_PTREV	0x10000
 #define SHOW_DEPEND	0x20000
 #define SHOW_PKGNAME	0x40000
+#define SHOW_DISTFILE	0x80000
 
 struct which_entry {
     TAILQ_ENTRY(which_entry) next;
Index: info/main.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/info/main.c,v
retrieving revision 1.50
diff -u -r1.50 main.c
--- info/main.c	12 Jun 2006 22:39:31 -0000	1.50
+++ info/main.c	7 Dec 2006 18:23:42 -0000
@@ -26,7 +26,7 @@
 #include "info.h"
 #include <err.h>
 
-static char Options[] = "abcdDe:EfgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
+static char Options[] = "abcdDe:EfFgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
 
 int	Flags		= 0;
 match_t	MatchType	= MATCH_GLOB;
@@ -103,6 +103,10 @@
 	    Flags |= SHOW_PLIST;
 	    break;
 
+	case 'F':
+	    Flags |= SHOW_DISTFILE;
+	    break;
+
 	case 'g':
 	    Flags |= SHOW_CKSUM;
 	    break;
@@ -266,7 +270,7 @@
 usage()
 {
     fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
-	"usage: pkg_info [-bcdDEfgGiIjkKLmopPqQrRsvVxX] [-e package] [-l prefix]",
+	"usage: pkg_info [-bcdDEfFgGiIjkKLmopPqQrRsvVxX] [-e package] [-l prefix]",
 	"                [-t template] -a | pkg-name ...",
 	"       pkg_info [-qQ] -W filename",
 	"       pkg_info [-qQ] -O origin",
Index: info/perform.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/info/perform.c,v
retrieving revision 1.54
diff -u -r1.54 perform.c
--- info/perform.c	9 Jan 2006 18:27:21 -0000	1.54
+++ info/perform.c	7 Dec 2006 18:23:42 -0000
@@ -213,6 +213,8 @@
 	    show_file("mtree file:\n", MTREE_FNAME);
 	if (Flags & SHOW_PREFIX)
 	    show_plist("Prefix(s):\n", &plist, PLIST_CWD, FALSE);
+	if ((Flags & SHOW_DISTFILE) && plist.distinfo == TRUE)
+	    show_plist("Distfile(s):\n", &plist, PLIST_DISTFILE, FALSE);
 	if (Flags & SHOW_FILES)
 	    show_files("Files:\n", &plist);
 	if ((Flags & SHOW_SIZE) && installed)
Index: info/pkg_info.1
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/info/pkg_info.1,v
retrieving revision 1.57
diff -u -r1.57 pkg_info.1
--- info/pkg_info.1	29 Sep 2006 17:57:03 -0000	1.57
+++ info/pkg_info.1	7 Dec 2006 18:23:42 -0000
@@ -25,7 +25,7 @@
 .Nd a utility for displaying information on software packages
 .Sh SYNOPSIS
 .Nm
-.Op Fl bcdDEfgGiIjkKLmopPqQrRsvVxX
+.Op Fl bcdDEfFgGiIjkKLmopPqQrRsvVxX
 .Op Fl e Ar package
 .Op Fl l Ar prefix
 .Op Fl t Ar template
@@ -94,6 +94,8 @@
 Show the install-message file for each package.
 .It Fl f
 Show the packing list instructions for each package.
+.It Fl F
+Show the distfile information (relative to $PORTSDIR) for each package.  This option is silently ignored when no distfile information is found.
 .It Fl g
 Show files that do not match the recorded checksum.
 .It Fl i
Index: info/show.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/info/show.c,v
retrieving revision 1.40
diff -u -r1.40 show.c
--- info/show.c	7 Jan 2006 22:10:58 -0000	1.40
+++ info/show.c	7 Dec 2006 18:23:42 -0000
@@ -87,6 +87,9 @@
     PackingList p;
     Boolean ign = FALSE;
     char *prefix = NULL;
+    char **ap, *distinfo[DISTINFO_ELEMENTS];
+    int i;
+
 
     if (!Quiet)
 	printf("%s%s", InfoPrefix, title);
@@ -178,6 +181,24 @@
 	    printf(Quiet ? "@conflicts %s\n" : "Conflicts: %s\n", p->name);
 	    break;
 
+	case PLIST_DISTFILE:
+	    if (Quiet)
+		printf("@comment DISTFILE:%s\n", p->name);
+	    else {
+		for (ap = distinfo; (*ap = strsep(&p->name, ":")) != NULL;)
+		    if (**ap != '\0')
+			if (++ap >= &distinfo[DISTINFO_ELEMENTS])
+			    break;
+
+		printf("\tDistfile:\n");
+		for (i = 0; i <= (DISTINFO_ELEMENTS - 1); i++) {
+		    if (distinfo[i] == NULL)
+			break;
+		    printf("\t\t%s\n", distinfo[i]);
+		}
+	    }
+	    break;
+
 	case PLIST_MTREE:
 	    printf(Quiet ? "@mtree %s\n" : "\tPackage mtree file: %s\n", p->name);
 	    break;
Index: lib/lib.h
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/lib.h,v
retrieving revision 1.59
diff -u -r1.59 lib.h
--- lib/lib.h	12 Jun 2006 22:39:32 -0000	1.59
+++ lib/lib.h	7 Dec 2006 18:23:42 -0000
@@ -105,13 +105,16 @@
 #define PLIST_FMT_VER_MAJOR	1
 #define PLIST_FMT_VER_MINOR	1
 
+/* Number of elements embedded in an @comment DISTFILE: line */
+#define DISTINFO_ELEMENTS 4 /* name:size:SHA256:MD5 */
+
 enum _plist_t {
     PLIST_FILE, PLIST_CWD, PLIST_CMD, PLIST_CHMOD,
     PLIST_CHOWN, PLIST_CHGRP, PLIST_COMMENT, PLIST_IGNORE,
     PLIST_NAME, PLIST_UNEXEC, PLIST_SRC, PLIST_DISPLAY,
     PLIST_PKGDEP, PLIST_CONFLICTS, PLIST_MTREE, PLIST_DIR_RM,
     PLIST_IGNORE_INST, PLIST_OPTION, PLIST_ORIGIN, PLIST_DEPORIGIN,
-    PLIST_NOINST
+    PLIST_NOINST, PLIST_DISTFILE
 };
 typedef enum _plist_t plist_t;
 
@@ -135,6 +138,7 @@
     struct _plist *head, *tail;
     const char *name;
     const char *origin;
+    Boolean distinfo;
     int fmtver_maj, fmtver_mnr;
 };
 typedef struct _pack Package;
Index: lib/plist.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pkg_install/lib/plist.c,v
retrieving revision 1.51
diff -u -r1.51 plist.c
--- lib/plist.c	7 Jan 2006 22:10:58 -0000	1.51
+++ lib/plist.c	7 Dec 2006 18:23:42 -0000
@@ -231,6 +231,9 @@
 	} else if (!strncmp(*arg, "DEPORIGIN:", 10)) {
 	    *arg += 10;
 	    return PLIST_DEPORIGIN;
+	} else if (!strncmp(*arg, "DISTFILE:", 9)) {
+	    *arg += 9;
+	    return PLIST_DISTFILE;
 	}
 	return PLIST_COMMENT;
     } else if (!strcmp(cmd, "ignore"))
@@ -302,6 +305,9 @@
 		exit(2);
 	    }
 	}
+	if (cmd == PLIST_DISTFILE && cp)
+		pkg->distinfo = TRUE;
+
 bottom:
 	add_plist(pkg, cmd, cp);
     }
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list