Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Jan 2000 03:40:45 -0800 (PST)
From:      asami@cs.berkeley.edu (Satoshi Asami)
To:        ports@freebsd.org
Subject:   multi-level categories
Message-ID:  <200001031140.DAA11819@silvia.hip.berkeley.edu>

next in thread | raw e-mail | index | archive | help
Folks,

Well, a new year is upon us so I thought we'd start thinking about
some of the frequently requested items.  One of them is more than one
level of categorization.

Here's a patch you can try.  It adds a subdirectory to games
("games/jokes") where you can put stuff like xoj.  Change the
CATEGORIES line to "games/jokes" and off you go.

I'm not sure if stuff like pkg_add's fuzzy package name matching can
handle this, but that's a different issue.

===
Index: /usr/ports/Mk/bsd.port.mk
===================================================================
RCS file: /usr/cvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.324
diff -u -r1.324 bsd.port.mk
--- bsd.port.mk	1999/11/11 02:36:15	1.324
+++ bsd.port.mk	2000/01/03 11:10:05
@@ -1080,7 +1080,7 @@
 .else
 VALID_CATEGORIES+=	afterstep archivers astro audio benchmarks biology \
 	cad chinese comms converters databases deskutils devel \
-	editors elisp emulators ftp games german gnome graphics \
+	editors elisp emulators ftp games games/jokes german gnome graphics \
 	irc japanese java kde korean lang \
 	mail math mbone misc net news \
 	offix palm perl5 plan9 print python russian \
@@ -1699,7 +1699,7 @@
 				exit 1; \
 			fi; \
 		fi; \
-		${LN} -s ../${PKGREPOSITORYSUBDIR}/${PKGNAME}${PKG_SUFX} ${PACKAGES}/$$cat; \
+		${LN} -sf `${ECHO} $$cat | ${SED} -e 'sa[^/]*a..ag'`/${PKGREPOSITORYSUBDIR}/${PKGNAME}${PKG_SUFX} ${PACKAGES}/$$cat; \
 	done
 .if !defined(NO_LATEST_LINK)
 	@if [ ! -d ${PKGLATESTREPOSITORY} ]; then \
@@ -2524,6 +2524,7 @@
 			-e '/%%COMMENT%%/d' \
 			-e 's%%BUILD_DEPENDS%%'"`${MAKE} ${__softMAKEFLAGS} pretty-print-build-depends-list`"'' \
 			-e 's%%RUN_DEPENDS%%'"`${MAKE} ${__softMAKEFLAGS} pretty-print-run-depends-list`"'' \
+			-e 's%%TOP%%'"`${ECHO} ${CATEGORIES} | ${SED} -e 'sa .*aa' -e 'sa[^/]*a..ag'`"'/..' \
 		>> $@
 
 # The following two targets require an up-to-date INDEX in ${PORTSDIR}
Index: /usr/ports/Mk/bsd.port.subdir.mk
===================================================================
RCS file: /usr/cvs/ports/Mk/bsd.port.subdir.mk,v
retrieving revision 1.33
diff -u -r1.33 bsd.port.subdir.mk
--- bsd.port.subdir.mk	1999/08/25 04:40:22	1.33
+++ bsd.port.subdir.mk	2000/01/03 10:55:56
@@ -194,6 +194,9 @@
 
 HTMLIFY=	sed -e 's/&/\&amp;/g' -e 's/>/\&gt;/g' -e 's/</\&lt;/g'
 
+package-name:
+	@echo ${.CURDIR} | sed -e 's^.*/^^'
+
 README.html:
 	@echo "===>  Creating README.html"
 	@> $@.tmp
Index: /usr/ports/Templates/README.category
===================================================================
RCS file: /usr/cvs/ports/Templates/README.category,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 README.category
--- README.category	1996/04/01 11:16:00	1.1.1.1
+++ README.category	2000/01/03 10:52:31
@@ -16,6 +16,6 @@
 </pre>
 
 <p><hr><p>
-<a href="../README.html"> Go to top of ports tree</a>
+<a href="../README.html"> Go to parent directory</a>
 </body>
 </html>
Index: /usr/ports/Templates/README.port
===================================================================
RCS file: /usr/cvs/ports/Templates/README.port,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 README.port
--- README.port	1996/04/01 11:16:00	1.1.1.1
+++ README.port	2000/01/03 10:58:56
@@ -14,7 +14,7 @@
 <p>Please read the file "<a href="pkg/DESCR">pkg/DESCR</a>" for a
 longer description.
 
-<p>Go to the <a href="../../README.html">top of the ports tree</a> for
+<p>Go to the <a href="%%TOP%%/README.html">top of the ports tree</a> for
 a summary on how to use the ports collection.
 
 <p>
@@ -25,6 +25,6 @@
 <p><hr><p>
 <a href="../README.html"> Go up one level</a>
 |
-<a href="../../README.html"> Go to top of ports tree</a>
+<a href="%%TOP%%/README.html"> Go to top of ports tree</a>
 </body>
 </html>
===

The latest link and README.html stuff is really pretty ugly but
basically what it does is try to find a relative path from here to the
top level.  Take the first item in CATEGORIES (which should always
match the full subdirectory path) and change each component of the
path to "..".  (This will fail miserably if you put "CATEGORIES=elisp
japanese/editors" in japanese/editors/mule/Makefile.  But you're not
supposed to do that.)

For the category README.html, the only funky thing is that the entry
could be another category.  I "fixed" this by adding a pseudo
package-name target in bsd.port.subdir.mk to print out the last
component of the pathname ("/a/my_ports/games/jokes" -> "jokes") but
it brings up another interesting question.  Namely: How to distinguish
between categories and individual ports.

Right now, all the directories directly under /usr/ports is considered
categories and you'll get all ports one level under that.  That will
no longer be the case, as you'll get

> ls -sF /usr/ports/games
 :
 1 jetpack/              1 xdemineur/            1 xtron/
 1 jokes/                1 xdigger/              1 xtruco/
 1 jzip/                 1 xdino/                1 xvier/
 :

Note that the "jokes" entry looks exactly like the normal ports.  This
is Not Nice.

One solution is to make all subdirectories of a category the same
type, i.e., either all subcategories or all ports.  In this case,
/usr/ports/games will only contain "jokes", "roguelike", "shooting"
and such, and everything under "jokes" will be individual ports
(unless we further want to divide it up, of course).  "shooting" could
have things like "space/xasteroids" "scifi/xbat".  That way users will
probably be able to tell what they're looking at (although they might
be slightly surprised if they blindly type "cd
/usr/ports/editors/emacs; make install" ;).

The problem with this approach is that we'll have to move a lot of
stuff every time we decide to split up a category, since we can't just
create a new subcategory and only move stuff that fits into there --
everything has to moved to "some" subdirectory.  This will cause a lot
of "misc" directories in the ports tree, and also make ongoing
category maintenance a very painful (I think).

Another solution is to add another rule on naming of categories and
individual port names.  For instance, if we decide to make all
categories start with uppercase and all ports with lowercase, the user
will see "Jokes" and "Shooting" right at the beginning of the
directory listing (assuming they aren't using some brain-damaged
software which can only sort case-insensitively).  This will be much
easier on the normal transition as we can move things piecemeal,
except that everything will have to be moved mechanically to the
uppercase categories as the first pass.

Anyway, just thinking out loud.  Comments?

-PW


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200001031140.DAA11819>